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.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 6 13:54:29 PST 2016
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.
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}}
};
More information about the cfe-commits
mailing list