r256979 - Fix half of PR26048. We don't yet diagnose the case where the anonymous union member is declared first and the tag name is declared second.

Adrian Prantl via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 6 14:04:48 PST 2016


> On Jan 6, 2016, at 1:54 PM, Richard Smith via cfe-commits <cfe-commits at lists.llvm.org> wrote:
> 
> Author: rsmith
> Date: Wed Jan  6 15:54:29 2016
> New Revision: 256979
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=256979&view=rev
> Log:
> Fix half of PR26048. We don't yet diagnose the case where the anonymous union member is declared first and the tag name is declared second.
> 

Thanks!

-- adrian

> Added:
>    cfe/trunk/test/CXX/class/class.union/class.union.anon/
>    cfe/trunk/test/CXX/class/class.union/class.union.anon/p1.cpp
>    cfe/trunk/test/CXX/class/class.union/class.union.anon/p4.cpp
>      - copied unchanged from r256599, cfe/trunk/test/CXX/class/class.union/p8.cpp
> Removed:
>    cfe/trunk/test/CXX/class/class.union/p8.cpp
> Modified:
>    cfe/trunk/lib/Sema/SemaDecl.cpp
>    cfe/trunk/test/CXX/class/class.mem/p13.cpp
>    cfe/trunk/test/SemaCXX/anonymous-union.cpp
> 
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=256979&r1=256978&r2=256979&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Jan  6 15:54:29 2016
> @@ -3962,9 +3962,6 @@ static bool CheckAnonMemberRedeclaration
>                  Sema::ForRedeclaration);
>   if (!SemaRef.LookupName(R, S)) return false;
> 
> -  if (R.getAsSingle<TagDecl>())
> -    return false;
> -
>   // Pick a representative declaration.
>   NamedDecl *PrevDecl = R.getRepresentativeDecl()->getUnderlyingDecl();
>   assert(PrevDecl && "Expected a non-null Decl");
> @@ -4675,11 +4672,13 @@ bool Sema::DiagnoseClassNameShadow(DeclC
>                                    DeclarationNameInfo NameInfo) {
>   DeclarationName Name = NameInfo.getName();
> 
> -  if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(DC)) 
> -    if (Record->getIdentifier() && Record->getDeclName() == Name) {
> -      Diag(NameInfo.getLoc(), diag::err_member_name_of_class) << Name;
> -      return true;
> -    }
> +  CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(DC);
> +  while (Record && Record->isAnonymousStructOrUnion())
> +    Record = dyn_cast<CXXRecordDecl>(Record->getParent());
> +  if (Record && Record->getIdentifier() && Record->getDeclName() == Name) {
> +    Diag(NameInfo.getLoc(), diag::err_member_name_of_class) << Name;
> +    return true;
> +  }
> 
>   return false;
> }
> 
> Modified: cfe/trunk/test/CXX/class/class.mem/p13.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class/class.mem/p13.cpp?rev=256979&r1=256978&r2=256979&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/class/class.mem/p13.cpp (original)
> +++ cfe/trunk/test/CXX/class/class.mem/p13.cpp Wed Jan  6 15:54:29 2016
> @@ -58,12 +58,12 @@ struct X3a {
> };
> 
> // - every member of every anonymous union that is a member of class T.
> -struct X4 {
> +struct X4 { // expected-note{{previous}}
>   union {
>     int X;
>     union {
>       float Y;
> -      unsigned X4; // expected-error{{member 'X4' has the same name as its class}}
> +      unsigned X4; // expected-error{{redeclares 'X4'}}
>     };
>   };
> };
> 
> Added: cfe/trunk/test/CXX/class/class.union/class.union.anon/p1.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class/class.union/class.union.anon/p1.cpp?rev=256979&view=auto
> ==============================================================================
> --- cfe/trunk/test/CXX/class/class.union/class.union.anon/p1.cpp (added)
> +++ cfe/trunk/test/CXX/class/class.union/class.union.anon/p1.cpp Wed Jan  6 15:54:29 2016
> @@ -0,0 +1,26 @@
> +// RUN: %clang_cc1 -verify %s
> +
> +struct X {
> +  int a; // expected-note {{previous}}
> +  void b(); // expected-note {{previous}}
> +  struct c; // expected-note {{previous}}
> +  typedef int d; // expected-note {{previous}}
> +
> +  union {
> +    int a; // expected-error {{member of anonymous union redeclares}}
> +    int b; // expected-error {{member of anonymous union redeclares}}
> +    int c; // expected-error {{member of anonymous union redeclares}}
> +    int d; // expected-error {{member of anonymous union redeclares}}
> +    int e; // expected-note {{previous}}
> +    int f; // expected-note {{previous}}
> +    int g;
> +    int h; // expected-note {{previous}}
> +  };
> +
> +  int e; // expected-error {{duplicate member}}
> +  void f(); // expected-error {{redefinition}}
> +  // FIXME: This is ill-formed, even though one name is a tag and the other is
> +  // an anonymous union member. Reject this.
> +  struct g;
> +  typedef int h; // expected-error {{redefinition}}
> +};
> 
> Removed: cfe/trunk/test/CXX/class/class.union/p8.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class/class.union/p8.cpp?rev=256978&view=auto
> ==============================================================================
> --- cfe/trunk/test/CXX/class/class.union/p8.cpp (original)
> +++ cfe/trunk/test/CXX/class/class.union/p8.cpp (removed)
> @@ -1,10 +0,0 @@
> -// RUN: %clang_cc1 -std=c++11 -verify %s
> -
> -union U {
> -  int x = 0; // expected-note {{previous initialization is here}}
> -  union {};
> -  union {
> -    int z;
> -    int y = 1; // expected-error {{initializing multiple members of union}}
> -  };
> -};
> 
> Modified: cfe/trunk/test/SemaCXX/anonymous-union.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/anonymous-union.cpp?rev=256979&r1=256978&r2=256979&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/anonymous-union.cpp (original)
> +++ cfe/trunk/test/SemaCXX/anonymous-union.cpp Wed Jan  6 15:54:29 2016
> @@ -62,11 +62,11 @@ void test_unqual_references(X x, const X
> 
> struct Redecl {
>   int x; // expected-note{{previous declaration is here}}
> -  class y { };
> +  class y { }; // expected-note{{previous declaration is here}}
> 
>   union {
>     int x; // expected-error{{member of anonymous union redeclares 'x'}}
> -    float y;
> +    float y; // expected-error{{member of anonymous union redeclares 'y'}}
>     double z; // expected-note{{previous declaration is here}}
>     double zz; // expected-note{{previous definition is here}}
>   };
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list