summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/DeclCXX.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-08-10 23:56:17 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-08-10 23:56:17 +0000
commit296584b2a9a563c9315ccf989f60fe8b8b582156 (patch)
treeed193017f89c3098db32732125657993f6adbdc4 /clang/lib/AST/DeclCXX.cpp
parent475f8a4fa27a280f6320b72824988f9807e5a2fe (diff)
downloadbcm5719-llvm-296584b2a9a563c9315ccf989f60fe8b8b582156.tar.gz
bcm5719-llvm-296584b2a9a563c9315ccf989f60fe8b8b582156.zip
Support for anonymous union in ctor's initializer and
bunch of FIXMEs for their is-gen. llvm-svn: 78623
Diffstat (limited to 'clang/lib/AST/DeclCXX.cpp')
-rw-r--r--clang/lib/AST/DeclCXX.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index e07eae7b20a..a068c238353 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -583,7 +583,7 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
if (Member->isBaseInitializer())
AllBaseFields[Member->getBaseClass()->getAs<RecordType>()] = Member;
else
- AllBaseFields[Member->getMember()] = Member;
+ AllBaseFields[Member->getMember()] = Member;
}
// Push virtual bases before others.
@@ -635,7 +635,23 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
// non-static data members.
for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
E = ClassDecl->field_end(); Field != E; ++Field) {
- if (CXXBaseOrMemberInitializer *Value = AllBaseFields.lookup(*Field)) {
+ if ((*Field)->isAnonymousStructOrUnion()) {
+ if (const RecordType *FieldClassType =
+ Field->getType()->getAs<RecordType>()) {
+ CXXRecordDecl *FieldClassDecl
+ = cast<CXXRecordDecl>(FieldClassType->getDecl());
+ for(RecordDecl::field_iterator FA = FieldClassDecl->field_begin(),
+ EA = FieldClassDecl->field_end(); FA != EA; FA++) {
+ if (CXXBaseOrMemberInitializer *Value = AllBaseFields.lookup(*FA)) {
+ AllToInit.push_back(Value);
+ break;
+ }
+ }
+ }
+ continue;
+ }
+ if (CXXBaseOrMemberInitializer *Value =
+ AllBaseFields.lookup(*Field)) {
AllToInit.push_back(Value);
continue;
}
OpenPOWER on IntegriCloud