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 | cf1b9c790ad9c944131e7150ef13e2d421f79e88 (patch) | |
tree | 3d1a02dadc73b3f78c167c96f7fd4263a947e826 /lib | |
parent | 2dd078ae50ff7be1fb25ebeedde45e9ab691a4f0 (diff) |
Referenced instatiated default constructors
must be defined. Fixed pr4853.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80846 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index f80a0b88e5..a0b6e2c2f8 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/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) == |