summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/DeclCXX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/AST/DeclCXX.cpp')
-rw-r--r--clang/lib/AST/DeclCXX.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index eb66c17bf80..0f2230116cc 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -380,6 +380,7 @@ QualType CXXMethodDecl::getThisType(ASTContext &C) const {
CXXBaseOrMemberInitializer::
CXXBaseOrMemberInitializer(QualType BaseType, Expr **Args, unsigned NumArgs,
+ CXXConstructorDecl *C,
SourceLocation L)
: Args(0), NumArgs(0), IdLoc(L) {
BaseOrMember = reinterpret_cast<uintptr_t>(BaseType.getTypePtr());
@@ -392,10 +393,12 @@ CXXBaseOrMemberInitializer(QualType BaseType, Expr **Args, unsigned NumArgs,
for (unsigned Idx = 0; Idx < NumArgs; ++Idx)
this->Args[Idx] = Args[Idx];
}
+ CtorToCall = C;
}
CXXBaseOrMemberInitializer::
CXXBaseOrMemberInitializer(FieldDecl *Member, Expr **Args, unsigned NumArgs,
+ CXXConstructorDecl *C,
SourceLocation L)
: Args(0), NumArgs(0), IdLoc(L) {
BaseOrMember = reinterpret_cast<uintptr_t>(Member);
@@ -407,6 +410,7 @@ CXXBaseOrMemberInitializer(FieldDecl *Member, Expr **Args, unsigned NumArgs,
for (unsigned Idx = 0; Idx < NumArgs; ++Idx)
this->Args[Idx] = Args[Idx];
}
+ CtorToCall = C;
}
CXXBaseOrMemberInitializer::~CXXBaseOrMemberInitializer() {
@@ -587,9 +591,14 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
if (AllBaseFields[Key])
AllToInit.push_back(AllBaseFields[Key]);
else {
+ CXXRecordDecl *VBaseDecl =
+ cast<CXXRecordDecl>(VBase->getType()->getAsRecordType()->getDecl());
+ assert(VBaseDecl && "setBaseOrMemberInitializers - VBaseDecl null");
+ // FIXME. Issue error if default ctor is missing.
CXXBaseOrMemberInitializer *Member =
- new (C) CXXBaseOrMemberInitializer(VBase->getType(), 0, 0,
- SourceLocation());
+ new (C) CXXBaseOrMemberInitializer(VBase->getType(), 0, 0,
+ VBaseDecl->getDefaultConstructor(C),
+ SourceLocation());
AllToInit.push_back(Member);
}
}
@@ -605,8 +614,13 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
if (AllBaseFields[Key])
AllToInit.push_back(AllBaseFields[Key]);
else {
+ CXXRecordDecl *BaseDecl =
+ cast<CXXRecordDecl>(Base->getType()->getAsRecordType()->getDecl());
+ assert(BaseDecl && "setBaseOrMemberInitializers - BaseDecl null");
+ // FIXME. Issue error if default ctor is missing.
CXXBaseOrMemberInitializer *Member =
new (C) CXXBaseOrMemberInitializer(Base->getType(), 0, 0,
+ BaseDecl->getDefaultConstructor(C),
SourceLocation());
AllToInit.push_back(Member);
}
@@ -625,8 +639,15 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
FieldType = AT->getElementType();
if (FieldType->getAsRecordType()) {
+ CXXConstructorDecl *Ctor = 0;
+ if (CXXRecordDecl *FieldClassDecl =
+ dyn_cast<CXXRecordDecl>(FieldType->getAsRecordType()->getDecl()))
+ Ctor = FieldClassDecl->getDefaultConstructor(C);
+ // FIXME. Issue error if default ctor is missing.
CXXBaseOrMemberInitializer *Member =
- new (C) CXXBaseOrMemberInitializer((*Field), 0, 0, SourceLocation());
+ new (C) CXXBaseOrMemberInitializer((*Field), 0, 0,
+ Ctor,
+ SourceLocation());
AllToInit.push_back(Member);
}
}
OpenPOWER on IntegriCloud