diff options
author | Anders Carlsson <andersca@mac.com> | 2010-04-21 19:52:01 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-04-21 19:52:01 +0000 |
commit | 711f34adb886cce8ba86c7b1b6513a1eaaf63bb5 (patch) | |
tree | 2924029db55c4ce8e5e78220e02c7aca80c3c434 /lib/Sema/SemaDeclCXX.cpp | |
parent | 46c54fb8ec45765a475b7b709b9aee7f94c490c2 (diff) |
Keep tack of whether a base in an InitializedEntity is an inherited virtual base or not. Use this in CheckConstructorAccess.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102020 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index ca23727c5b..d52e9dd394 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1384,7 +1384,7 @@ Sema::BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, // Initialize the base. InitializedEntity BaseEntity = - InitializedEntity::InitializeBase(Context, BaseSpec); + InitializedEntity::InitializeBase(Context, BaseSpec, VirtualBaseSpec); InitializationKind Kind = InitializationKind::CreateDirect(BaseLoc, LParenLoc, RParenLoc); @@ -1435,9 +1435,11 @@ Sema::BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, static CXXBaseOrMemberInitializer * BuildImplicitBaseInitializer(Sema &SemaRef, const CXXConstructorDecl *Constructor, - CXXBaseSpecifier *BaseSpec) { + CXXBaseSpecifier *BaseSpec, + bool IsInheritedVirtualBase) { InitializedEntity InitEntity - = InitializedEntity::InitializeBase(SemaRef.Context, BaseSpec); + = InitializedEntity::InitializeBase(SemaRef.Context, BaseSpec, + IsInheritedVirtualBase); InitializationKind InitKind = InitializationKind::CreateDefault(Constructor->getLocation()); @@ -1502,6 +1504,14 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor, AllBaseFields[Member->getMember()] = Member; } + // Keep track of the direct virtual bases. + llvm::SmallPtrSet<CXXBaseSpecifier *, 16> DirectVBases; + for (CXXRecordDecl::base_class_iterator I = ClassDecl->bases_begin(), + E = ClassDecl->bases_end(); I != E; ++I) { + if (I->isVirtual()) + DirectVBases.insert(I); + } + // Push virtual bases before others. for (CXXRecordDecl::base_class_iterator VBase = ClassDecl->vbases_begin(), E = ClassDecl->vbases_end(); VBase != E; ++VBase) { @@ -1510,8 +1520,10 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor, = AllBaseFields.lookup(VBase->getType()->getAs<RecordType>())) { AllToInit.push_back(Value); } else if (!AnyErrors) { + bool IsInheritedVirtualBase = !DirectVBases.count(VBase); CXXBaseOrMemberInitializer *CXXBaseInit = - BuildImplicitBaseInitializer(*this, Constructor, VBase); + BuildImplicitBaseInitializer(*this, Constructor, VBase, + IsInheritedVirtualBase); if (!CXXBaseInit) { HadError = true; @@ -1533,8 +1545,9 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor, AllToInit.push_back(Value); } else if (!AnyErrors) { CXXBaseOrMemberInitializer *CXXBaseInit = - BuildImplicitBaseInitializer(*this, Constructor, Base); - + BuildImplicitBaseInitializer(*this, Constructor, Base, + /*IsInheritedVirtualBase=*/false); + if (!CXXBaseInit) { HadError = true; continue; |