[cfe-commits] r173643 - Add a -pedantic warning: an anonymous union within an anonymous union is not

Richard Smith richard-llvm at metafoo.co.uk
Sun Jan 27 16:54:05 PST 2013


Author: rsmith
Date: Sun Jan 27 18:54:05 2013
New Revision: 173643

URL: http://llvm.org/viewvc/llvm-project?rev=173643&view=rev
Log:
Add a -pedantic warning: an anonymous union within an anonymous union is not
permitted in standard C++, despite being silently accepted by many (all?) major
C++ implementations.

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

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=173643&r1=173642&r2=173643&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sun Jan 27 18:54:05 2013
@@ -5344,6 +5344,9 @@ def err_anonymous_record_with_type : Err
 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">>;
 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<

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=173643&r1=173642&r2=173643&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Sun Jan 27 18:54:05 2013
@@ -3198,6 +3198,12 @@ Decl *Sema::BuildAnonymousStructOrUnion(
               << (int)Record->isUnion();
             Invalid = true;
           }
+        } else {
+          // This is an anonymous type definition within another anonymous type.
+          // 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);
         }
       } else if (isa<AccessSpecDecl>(*Mem)) {
         // Any access specifier is fine.

Modified: cfe/trunk/test/SemaCXX/anonymous-union.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/anonymous-union.cpp?rev=173643&r1=173642&r2=173643&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/anonymous-union.cpp (original)
+++ cfe/trunk/test/SemaCXX/anonymous-union.cpp Sun Jan 27 18:54:05 2013
@@ -9,7 +9,7 @@ struct X {
     int i;
     float f;
     
-    union {
+    union { // expected-warning{{nested anonymous types 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;
+    struct { int x; int y; } y; // expected-warning{{nested anonymous types 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 {
+      union { // expected-warning{{nested anonymous type}}
         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}}
+      struct { // expected-warning{{anonymous structs are a GNU extension}} expected-warning{{nested anonymous type}}
         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}}
+      struct { // expected-warning{{anonymous structs are a GNU extension}} expected-warning{{nested anonymous type}}
         T x;
         T y;
       };

Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp?rev=173643&r1=173642&r2=173643&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp (original)
+++ cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp Sun Jan 27 18:54:05 2013
@@ -1153,8 +1153,8 @@ namespace ConvertedConstantExpr {
 namespace IndirectField {
   struct S {
     struct { // expected-warning {{GNU extension}}
-      union {
-        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}}
           int a;
           int b;
         };





More information about the cfe-commits mailing list