summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index f80a0b88e59..a0b6e2c2f82 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -1003,7 +1003,25 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl,
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) ==
OpenPOWER on IntegriCloud