diff options
| author | Anders Carlsson <andersca@mac.com> | 2010-03-30 16:19:37 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2010-03-30 16:19:37 +0000 |
| commit | 83ac312965e90d832447037ac5c3b4e6c9ec5926 (patch) | |
| tree | 12477e2ec5b75db40cb1116e507d9b3e07523635 /clang/lib | |
| parent | a942dcd92ba5ff8b3bbfd172b9fd396b23a9ea5e (diff) | |
| download | bcm5719-llvm-83ac312965e90d832447037ac5c3b4e6c9ec5926.tar.gz bcm5719-llvm-83ac312965e90d832447037ac5c3b4e6c9ec5926.zip | |
Fix a bug where we would incorrectly report an error about initializing two fields in an anonymous struct.
llvm-svn: 99891
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 3509cb5e864..6a2a037e9e9 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1691,11 +1691,12 @@ static void *GetKeyForMember(CXXBaseOrMemberInitializer *Member, // in AnonUnionMember field. if (MemberMaybeAnon && Field->isAnonymousStructOrUnion()) Field = Member->getAnonUnionMember(); - if (Field->getDeclContext()->isRecord()) { - RecordDecl *RD = cast<RecordDecl>(Field->getDeclContext()); - if (RD->isAnonymousStructOrUnion()) - return static_cast<void *>(RD); - } + + // If the field is a member of an anonymous union, we use record decl of the + // union as the key. + RecordDecl *RD = Field->getParent(); + if (RD->isAnonymousStructOrUnion() && RD->isUnion()) + return static_cast<void *>(RD); return static_cast<void *>(Field); } @@ -1719,7 +1720,7 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl, } if (!Constructor->isDependentContext()) { - llvm::DenseMap<void*, CXXBaseOrMemberInitializer *>Members; + llvm::DenseMap<void*, CXXBaseOrMemberInitializer *> Members; bool err = false; for (unsigned i = 0; i < NumMemInits; i++) { CXXBaseOrMemberInitializer *Member = @@ -1754,7 +1755,7 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl, SetBaseOrMemberInitializers(Constructor, reinterpret_cast<CXXBaseOrMemberInitializer **>(MemInits), - NumMemInits, false, AnyErrors); + NumMemInits, /*IsImplicitConstructor=*/false, AnyErrors); if (Constructor->isDependentContext()) return; @@ -1929,11 +1930,11 @@ void Sema::ActOnDefaultCtorInitializers(DeclPtrTy CDtorDecl) { if (!CDtorDecl) return; - AdjustDeclIfTemplate(CDtorDecl); - if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(CDtorDecl.getAs<Decl>())) - SetBaseOrMemberInitializers(Constructor, 0, 0, false, false); + SetBaseOrMemberInitializers(Constructor, 0, 0, + /*IsImplicitConstructor=*/false, + /*AnyErrors=*/false); } bool Sema::RequireNonAbstractType(SourceLocation Loc, QualType T, @@ -3781,7 +3782,9 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, DeclContext *PreviousContext = CurContext; CurContext = Constructor; - if (SetBaseOrMemberInitializers(Constructor, 0, 0, true, false)) { + if (SetBaseOrMemberInitializers(Constructor, 0, 0, + /*IsImplicitConstructor=*/true, + /*AnyErrors=*/false)) { Diag(CurrentLocation, diag::note_member_synthesized_at) << CXXDefaultConstructor << Context.getTagDeclType(ClassDecl); Constructor->setInvalidDecl(); |

