]> granicus.if.org Git - clang/commitdiff
Clarify the diagnostic for -Wnested-anon-types.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 31 Jan 2013 03:11:12 +0000 (03:11 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 31 Jan 2013 03:11:12 +0000 (03:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174032 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/SemaCXX/anonymous-union.cpp
test/SemaCXX/constant-expression-cxx11.cpp

index e398da955b53add069ea38a907c3633a143e5a00..aa6bcd6aa33219326e5d66854f5a65afa16d9e80 100644 (file)
@@ -5351,8 +5351,8 @@ def ext_anonymous_record_with_type : Extension<
   "types declared in an anonymous %select{struct|union}0 are a Microsoft "
   "extension">, InGroup<Microsoft>;
 def ext_anonymous_record_with_anonymous_type : Extension<
-  "nested anonymous types are an extension">,
-  InGroup<DiagGroup<"nested-anon-types">>;
+  "anonymous types declared in an anonymous %select{struct|union}0 "
+  "are an extension">, InGroup<DiagGroup<"nested-anon-types">>;
 def err_anonymous_record_with_function : Error<
   "functions cannot be declared in an anonymous %select{struct|union}0">;
 def err_anonymous_record_with_static : Error<
index 24dffc0299dae90cae941794803489364dc51960..80543fd532b0013f94465ffd1348e795b5fce9e3 100644 (file)
@@ -3242,7 +3242,8 @@ Decl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS,
           // This is a popular extension, provided by Plan9, MSVC and GCC, but
           // not part of standard C++.
           Diag(MemRecord->getLocation(),
-               diag::ext_anonymous_record_with_anonymous_type);
+               diag::ext_anonymous_record_with_anonymous_type)
+            << (int)Record->isUnion();
         }
       } else if (isa<AccessSpecDecl>(*Mem)) {
         // Any access specifier is fine.
index e77f52514733435f04973e5325b53b771094b1fb..93b5b0abbaf83df4e7cb2ab4784b6f7d53379674 100644 (file)
@@ -9,7 +9,7 @@ struct X {
     int i;
     float f;
     
-    union { // expected-warning{{nested anonymous types are an extension}}
+    union { // expected-warning{{anonymous types declared in an anonymous union are an extension}}
       float f2;
       mutable double d;
     };
@@ -101,7 +101,7 @@ void g() {
 struct BadMembers {
   union {
     struct X { }; // expected-error {{types cannot be declared in an anonymous union}}
-    struct { int x; int y; } y; // expected-warning{{nested anonymous types are an extension}}
+    struct { int x; int y; } y; // expected-warning{{anonymous types declared in an anonymous union are an extension}}
     
     void f(); // expected-error{{functions cannot be declared in an anonymous union}}
   private: int x1; // expected-error{{anonymous union cannot contain a private data member}}
@@ -128,7 +128,7 @@ namespace test4 {
     struct { // expected-warning{{anonymous structs are a GNU extension}}
       int s0; // expected-note {{declared private here}}
       double s1; // expected-note {{declared private here}}
-      union { // expected-warning{{nested anonymous type}}
+      union { // expected-warning{{anonymous types declared in an anonymous struct are an extension}}
         int su0; // expected-note {{declared private here}}
         double su1; // expected-note {{declared private here}}
       };
@@ -136,7 +136,7 @@ namespace test4 {
     union {
       int u0; // expected-note {{declared private here}}
       double u1; // expected-note {{declared private here}}
-      struct { // expected-warning{{anonymous structs are a GNU extension}} expected-warning{{nested anonymous type}}
+      struct { // expected-warning{{anonymous structs are a GNU extension}} expected-warning{{anonymous types declared in an anonymous union are an extension}}
         int us0; // expected-note {{declared private here}}
         double us1; // expected-note {{declared private here}}
       };
@@ -187,7 +187,7 @@ namespace PR8326 {
   
   private:
     const union { // expected-warning{{anonymous union cannot be 'const'}}
-      struct { // expected-warning{{anonymous structs are a GNU extension}} expected-warning{{nested anonymous type}}
+      struct { // expected-warning{{anonymous structs are a GNU extension}} expected-warning{{declared in an anonymous union}}
         T x;
         T y;
       };
index 8bb448cab030893e0cd3aade56596b8aa88a7df5..30aa7d7b0b3a7a1a246b0bb8239e496ed4c5a870 100644 (file)
@@ -1153,8 +1153,8 @@ namespace ConvertedConstantExpr {
 namespace IndirectField {
   struct S {
     struct { // expected-warning {{GNU extension}}
-      union { // expected-warning {{nested anonymous types are an extension}}
-        struct { // expected-warning {{GNU extension}} expected-warning {{nested anonymous types are an extension}}
+      union { // expected-warning {{declared in an anonymous struct}}
+        struct { // expected-warning {{GNU extension}} expected-warning {{declared in an anonymous union}}
           int a;
           int b;
         };