]> granicus.if.org Git - clang/commitdiff
Complain about the application of a transparent_union attribute to a
authorDouglas Gregor <dgregor@apple.com>
Wed, 30 Jun 2010 17:24:13 +0000 (17:24 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 30 Jun 2010 17:24:13 +0000 (17:24 +0000)
union whose first field has integral vector type. Also, clean up this
diagnostic a bit. Thanks to Eli for spotting this change in semantics
last week.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107296 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclAttr.cpp
test/Sema/transparent-union.c

index 752e4da7e7038c92dfacb6bea5cf7c8019d2b901..fae25196fefeb9f9a086602bf867c4f246ecb2f7 100644 (file)
@@ -965,8 +965,8 @@ def warn_transparent_union_attribute_not_definition : Warning<
   "transparent_union attribute can only be applied to a union definition; "
   "attribute ignored">;
 def warn_transparent_union_attribute_floating : Warning<
-  "first field of a transparent union cannot have floating point or vector "
-  "type; transparent_union attribute ignored">;
+  "first field of a transparent union cannot have %select{floating point|"
+  "vector}0 type %1; transparent_union attribute ignored">;
 def warn_transparent_union_attribute_zero_fields : Warning<
   "transparent union definition must contain at least one field; "
   "transparent_union attribute ignored">;
index 0f53fb92ef6458ee5927dbfa80bf30e8b87f1320..db128185f217080e03964149671ed4cbcc917aa8 100644 (file)
@@ -1410,9 +1410,10 @@ static void HandleTransparentUnionAttr(Decl *d, const AttributeList &Attr,
 
   FieldDecl *FirstField = *Field;
   QualType FirstType = FirstField->getType();
-  if (FirstType->hasFloatingRepresentation()) {
+  if (FirstType->hasFloatingRepresentation() || FirstType->isVectorType()) {
     S.Diag(FirstField->getLocation(),
-           diag::warn_transparent_union_attribute_floating);
+           diag::warn_transparent_union_attribute_floating)
+      << FirstType->isVectorType() << FirstType;
     return;
   }
 
index cdfc8506d1b5d5b50dc4bdac803d494f8c7c48b6..27d5c2403b43c808b7f8e2af0cc91df575126ad9 100644 (file)
@@ -38,3 +38,10 @@ typedef union {
 } TU3 __attribute__((transparent_union));
 
 typedef union { } TU4 __attribute__((transparent_union)); // expected-warning{{field}} 
+
+typedef int int4 __attribute__((ext_vector_type(4)));
+typedef union {
+  int4 vec; // expected-warning{{first field of a transparent union cannot have vector type 'int4'; transparent_union attribute ignored}}
+} TU5 __attribute__((transparent_union));
+
+