Diagnose when base classes and members to be intialized
with constructors don't have a matching constructor.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76913 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp
index 0f22301..7b5a290 100644
--- a/lib/AST/DeclCXX.cpp
+++ b/lib/AST/DeclCXX.cpp
@@ -564,9 +564,11 @@
 
 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 @@
       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 @@
       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 @@
       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,