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

NAKAMURA Takumi geek4civic at gmail.com
Sun Jan 27 19:23:03 PST 2013


Richard, it brought many warnings on the tree.
http://bb.pgr.jp/builders/clang-3stage-x86_64-linux/builds/846

What could we do? Fix extensions, or ... ?

...Takumi

2013/1/28 Richard Smith <richard-llvm at metafoo.co.uk>:
> 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;
>          };
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list