Referenced instatiated default constructors 
must be defined. Fixed pr4853.

llvm-svn: 80846
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index f80a0b8..a0b6e2c 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -1003,7 +1003,25 @@
   
   if (Constructor->isDependentContext())
     return;
-  
+  // Mark all constructors used in initialization of class's members 
+  // as referenced. 
+  // FIXME. We can do this while building the initializer list. But
+  // MarkDeclarationReferenced is not accessible in ASTContext.
+  for (CXXConstructorDecl::init_const_iterator B = Constructor->init_begin(),
+       E = Constructor->init_end();
+       B != E; ++B) {
+    CXXBaseOrMemberInitializer *Member = (*B);
+    if (!Member->isMemberInitializer())
+      continue;
+    FieldDecl *Field = Member->getMember();
+    QualType FT = Context.getBaseElementType(Field->getType());
+    if (const RecordType* RT = FT->getAs<RecordType>()) {
+      CXXConstructorDecl *Ctor =
+        cast<CXXRecordDecl>(RT->getDecl())->getDefaultConstructor(Context);
+      if (Ctor && !FT->isDependentType())
+        MarkDeclarationReferenced(Ctor->getLocation(), Ctor);
+    }
+  }
   if (Diags.getDiagnosticLevel(diag::warn_base_initialized) == 
       Diagnostic::Ignored &&
       Diags.getDiagnosticLevel(diag::warn_field_initialized) ==