On Tue, Dec 10, 2013 at 12:50 PM, David Blaikie <[email protected]> wrote:
> On Tue, Dec 10, 2013 at 12:25 AM, Richard Smith > <[email protected]> wrote: > > Author: rsmith > > Date: Tue Dec 10 02:25:00 2013 > > New Revision: 196892 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=196892&view=rev > > Log: > > Implement DR1460: fix handling of default initializers in unions; don't > allow > > more than one such initializer in a union, make mem-initializers override > > default initializers for other union members, handle anonymous unions > with > > anonymous struct members better. Fix a couple of semi-related bugs > exposed by > > the tests for same. > > > > Added: > > cfe/trunk/test/CXX/class/class.union/p8.cpp > > cfe/trunk/test/CXX/drs/dr14xx.cpp > > Modified: > > cfe/trunk/include/clang/AST/DeclCXX.h > > cfe/trunk/lib/AST/ASTImporter.cpp > > cfe/trunk/lib/AST/DeclCXX.cpp > > cfe/trunk/lib/Sema/SemaDecl.cpp > > cfe/trunk/lib/Sema/SemaDeclCXX.cpp > > cfe/trunk/lib/Sema/SemaExpr.cpp > > cfe/trunk/lib/Serialization/ASTReaderDecl.cpp > > cfe/trunk/lib/Serialization/ASTWriter.cpp > > cfe/trunk/test/CXX/special/class.init/class.base.init/p8-0x.cpp > > cfe/trunk/test/CodeGenCXX/member-init-anon-union.cpp > > > > Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=196892&r1=196891&r2=196892&view=diff > > > ============================================================================== > > --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) > > +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Tue Dec 10 02:25:00 2013 > > @@ -3320,6 +3331,7 @@ struct BaseAndFieldInfo { > > ImplicitInitializerKind IIK; > > llvm::DenseMap<const void *, CXXCtorInitializer*> AllBaseFields; > > SmallVector<CXXCtorInitializer*, 8> AllToInit; > > + llvm::DenseMap<TagDecl*, FieldDecl*> ActiveUnionMember; > > > > BaseAndFieldInfo(Sema &S, CXXConstructorDecl *Ctor, bool > ErrorsInInits) > > : S(S), Ctor(Ctor), AnyErrorsInInits(ErrorsInInits) { > > @@ -3357,20 +3369,50 @@ struct BaseAndFieldInfo { > > > > return false; > > } > > -}; > > -} > > > > -/// \brief Determine whether the given indirect field declaration is > somewhere > > -/// within an anonymous union. > > -static bool isWithinAnonymousUnion(IndirectFieldDecl *F) { > > - for (IndirectFieldDecl::chain_iterator C = F->chain_begin(), > > - CEnd = F->chain_end(); > > - C != CEnd; ++C) > > - if (CXXRecordDecl *Record = > dyn_cast<CXXRecordDecl>((*C)->getDeclContext())) > > - if (Record->isUnion()) > > + bool isInactiveUnionMember(FieldDecl *Field) { > > + RecordDecl *Record = Field->getParent(); > > + if (!Record->isUnion()) > > + return false; > > + > > + FieldDecl *Active = > ActiveUnionMember.lookup(Record->getCanonicalDecl()); > > + if (Active) > > Collapse the initialization into the conditional here? Sounds good, r196959.
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
