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