diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-02 23:02:57 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-02 23:02:57 +0000 |
commit | 3117e2b9d46751e91e8019cb2b16d2207ccccc29 (patch) | |
tree | 9a20fea64a7930bcda6bed69418582c73c614eae /clang/lib | |
parent | b7bfe794129f3b6f990c576dedee0452c6955ac5 (diff) | |
download | bcm5719-llvm-3117e2b9d46751e91e8019cb2b16d2207ccccc29.tar.gz bcm5719-llvm-3117e2b9d46751e91e8019cb2b16d2207ccccc29.zip |
Referenced instatiated default constructors
must be defined. Fixed pr4853.
llvm-svn: 80846
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 20 |
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) == |