summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-09-01 06:22:14 +0000
committerAnders Carlsson <andersca@mac.com>2009-09-01 06:22:14 +0000
commitbcec05c9fda9cfcc2fa11837ea8aae075db41668 (patch)
tree14916ea7c26870cddc98cd1457167d41bb0d31d5 /clang/lib/Sema/SemaDeclCXX.cpp
parent62215c4fb594ca671ca9b16e206789ebeed9b68a (diff)
downloadbcm5719-llvm-bcec05c9fda9cfcc2fa11837ea8aae075db41668.tar.gz
bcm5719-llvm-bcec05c9fda9cfcc2fa11837ea8aae075db41668.zip
Don't assume that a base is always a RecordType, it can also be a TemplateSpecializationType. Also, make sure to get the instantiated union member.
llvm-svn: 80662
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 4acde29b7b5..f22a3e88b72 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -912,11 +912,21 @@ static void *GetKeyForTopLevelField(FieldDecl *Field) {
return static_cast<void *>(Field);
}
+static void *GetKeyForBase(QualType BaseType) {
+ if (const RecordType *RT = BaseType->getAs<RecordType>())
+ return (void *)RT;
+
+ assert(0 && "Unexpected base type!");
+ return 0;
+}
+
static void *GetKeyForMember(CXXBaseOrMemberInitializer *Member,
- bool MemberMaybeAnon=false) {
+ bool MemberMaybeAnon = false) {
// 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 (Member->isMemberInitializer()) {
+ FieldDecl *Field = Member->getMember();
+
// After BuildBaseOrMemberInitializers call, Field is the anonymous union
// data member of the class. Data member used in the initializer list is
// in AnonUnionMember field.
@@ -929,7 +939,8 @@ static void *GetKeyForMember(CXXBaseOrMemberInitializer *Member,
}
return static_cast<void *>(Field);
}
- return static_cast<RecordType *>(Member->getBaseClass());
+
+ return GetKeyForBase(QualType(Member->getBaseClass(), 0));
}
void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl,
@@ -1003,7 +1014,7 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl,
for (CXXRecordDecl::base_class_iterator VBase =
ClassDecl->vbases_begin(),
E = ClassDecl->vbases_end(); VBase != E; ++VBase)
- AllBaseOrMembers.push_back(VBase->getType()->getAs<RecordType>());
+ AllBaseOrMembers.push_back(GetKeyForBase(VBase->getType()));
for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),
E = ClassDecl->bases_end(); Base != E; ++Base) {
@@ -1011,7 +1022,7 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl,
// first.
if (Base->isVirtual())
continue;
- AllBaseOrMembers.push_back(Base->getType()->getAs<RecordType>());
+ AllBaseOrMembers.push_back(GetKeyForBase(Base->getType()));
}
for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
OpenPOWER on IntegriCloud