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.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index 0f2230116cc..7b5a29028c4 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -564,9 +564,11 @@ CXXDestructorDecl::computeBaseOrMembersToDestroy(ASTContext &C) {
void
CXXConstructorDecl::setBaseOrMemberInitializers(
- ASTContext &C,
- CXXBaseOrMemberInitializer **Initializers,
- unsigned NumInitializers) {
+ ASTContext &C,
+ CXXBaseOrMemberInitializer **Initializers,
+ unsigned NumInitializers,
+ llvm::SmallVectorImpl<CXXBaseSpecifier *>& Bases,
+ llvm::SmallVectorImpl<FieldDecl *>&Fields) {
// We need to build the initializer AST according to order of construction
// and not what user specified in the Initializers list.
CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(getDeclContext());
@@ -594,7 +596,9 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
CXXRecordDecl *VBaseDecl =
cast<CXXRecordDecl>(VBase->getType()->getAsRecordType()->getDecl());
assert(VBaseDecl && "setBaseOrMemberInitializers - VBaseDecl null");
- // FIXME. Issue error if default ctor is missing.
+ if (!VBaseDecl->getDefaultConstructor(C) &&
+ !VBase->getType()->isDependentType())
+ Bases.push_back(VBase);
CXXBaseOrMemberInitializer *Member =
new (C) CXXBaseOrMemberInitializer(VBase->getType(), 0, 0,
VBaseDecl->getDefaultConstructor(C),
@@ -617,7 +621,9 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
CXXRecordDecl *BaseDecl =
cast<CXXRecordDecl>(Base->getType()->getAsRecordType()->getDecl());
assert(BaseDecl && "setBaseOrMemberInitializers - BaseDecl null");
- // FIXME. Issue error if default ctor is missing.
+ if (!BaseDecl->getDefaultConstructor(C) &&
+ !Base->getType()->isDependentType())
+ Bases.push_back(Base);
CXXBaseOrMemberInitializer *Member =
new (C) CXXBaseOrMemberInitializer(Base->getType(), 0, 0,
BaseDecl->getDefaultConstructor(C),
@@ -643,7 +649,8 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
if (CXXRecordDecl *FieldClassDecl =
dyn_cast<CXXRecordDecl>(FieldType->getAsRecordType()->getDecl()))
Ctor = FieldClassDecl->getDefaultConstructor(C);
- // FIXME. Issue error if default ctor is missing.
+ if (!Ctor && !FieldType->isDependentType())
+ Fields.push_back(*Field);
CXXBaseOrMemberInitializer *Member =
new (C) CXXBaseOrMemberInitializer((*Field), 0, 0,
Ctor,
OpenPOWER on IntegriCloud