diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2009-08-11 18:49:54 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-08-11 18:49:54 +0000 |
| commit | b2197042b8bbed9287957d4c21dbe8f53deb6007 (patch) | |
| tree | 726798c8e88e730689893b5a735fabc6a32e6399 /clang/lib/CodeGen/CGCXX.cpp | |
| parent | d362857f4c93e35d1729d9c31e73dbc9ab500096 (diff) | |
| download | bcm5719-llvm-b2197042b8bbed9287957d4c21dbe8f53deb6007.tar.gz bcm5719-llvm-b2197042b8bbed9287957d4c21dbe8f53deb6007.zip | |
ir-gen support for anonymous union data member
copying in copy constructors and used in
default constructor's initializer list.
llvm-svn: 78700
Diffstat (limited to 'clang/lib/CodeGen/CGCXX.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGCXX.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp index aff85fa5d44..e9ebf230d6b 100644 --- a/clang/lib/CodeGen/CGCXX.cpp +++ b/clang/lib/CodeGen/CGCXX.cpp @@ -874,8 +874,7 @@ void CodeGenFunction::SynthesizeCXXCopyConstructor(const CXXConstructorDecl *CD, // FIXME. How about copying arrays! assert(!getContext().getAsArrayType(FieldType) && "FIXME. Copying arrays NYI"); - assert(!Field->isAnonymousStructOrUnion() && - "FIXME. anonymous data member NYI in copy constructor synthesis"); + if (const RecordType *FieldClassType = FieldType->getAs<RecordType>()) { CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(FieldClassType->getDecl()); @@ -924,23 +923,25 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) { QualType FieldType = getContext().getCanonicalType((Field)->getType()); assert(!getContext().getAsArrayType(FieldType) && "FIXME. Field arrays initialization unsupported"); - DeclContext *Ctx = Field->getDeclContext(); - RecordDecl *Record = cast<RecordDecl>(Ctx); - assert(!Record->isAnonymousStructOrUnion() && - "FIXME. anonymous union initializer NYI in default constructor"); - (void)Record; LoadOfThis = LoadCXXThis(); LValue LHS = EmitLValueForField(LoadOfThis, Field, false, 0); if (FieldType->getAs<RecordType>()) { - + if (!Field->isAnonymousStructOrUnion()) { assert(Member->getConstructor() && "EmitCtorPrologue - no constructor to initialize member"); EmitCXXConstructorCall(Member->getConstructor(), Ctor_Complete, LHS.getAddress(), Member->const_arg_begin(), Member->const_arg_end()); - continue; + continue; + } + else { + // Initializing an anonymous union data member. + FieldDecl *anonMember = Member->getAnonUnionMember(); + LHS = EmitLValueForField(LHS.getAddress(), anonMember, false, 0); + FieldType = anonMember->getType(); + } } assert(Member->getNumArgs() == 1 && "Initializer count must be 1 only"); |

