summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-06-30 21:52:59 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-06-30 21:52:59 +0000
commitcae5482f6c219d2be7d001c1a2d201fbd56d5cf7 (patch)
tree935ea800a926c1fb994332fd4033f5ca5e29047d /clang/lib/Sema/SemaDeclCXX.cpp
parente415f52997f107cf342219cb50bb6d2362510824 (diff)
downloadbcm5719-llvm-cae5482f6c219d2be7d001c1a2d201fbd56d5cf7.tar.gz
bcm5719-llvm-cae5482f6c219d2be7d001c1a2d201fbd56d5cf7.zip
Diagnose multiple initialization of anonymous union
fields in the ctor-initializer list. llvm-svn: 74554
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 546c783a623..8c3a0bf1584 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -782,7 +782,14 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl,
for (unsigned i = 0; i < NumMemInits; i++) {
CXXBaseOrMemberInitializer *Member =
static_cast<CXXBaseOrMemberInitializer*>(MemInits[i]);
- CXXBaseOrMemberInitializer *&PrevMember = Members[Member->getBaseOrMember()];
+ void *KeyToMember = Member->getBaseOrMember();
+ // For fields injected into the class via declaration of an anonymous union,
+ // use its anonymous union class declaration as the unique key.
+ if (FieldDecl *Field = Member->getMember())
+ if (Field->getDeclContext()->isRecord() &&
+ cast<RecordDecl>(Field->getDeclContext())->isAnonymousStructOrUnion())
+ KeyToMember = static_cast<void *>(Field->getDeclContext());
+ CXXBaseOrMemberInitializer *&PrevMember = Members[KeyToMember];
if (!PrevMember) {
PrevMember = Member;
continue;
OpenPOWER on IntegriCloud