diff options
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 20 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/constructor-template.cpp | 25 |
2 files changed, 43 insertions, 2 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) == diff --git a/clang/test/CodeGenCXX/constructor-template.cpp b/clang/test/CodeGenCXX/constructor-template.cpp index 10577e97661..43abda435b0 100644 --- a/clang/test/CodeGenCXX/constructor-template.cpp +++ b/clang/test/CodeGenCXX/constructor-template.cpp @@ -1,4 +1,8 @@ -// RUN: clang-cc %s -emit-llvm -o - +// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s && +// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s && +// RUN: clang-cc -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s && +// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s && +// RUN: true // PR4826 struct A { @@ -13,6 +17,25 @@ struct B { A nodes; }; + +// PR4853 +template <typename T> class List { +public: + List(){ } // List<BinomialNode<int>*>::List() remains undefined. +}; + +template<typename T> class BinomialNode { +public: + BinomialNode(T value) {} + List<BinomialNode<T>*> nodes; +}; + int main() { B<int> *n = new B<int>(4); + BinomialNode<int> *node = new BinomialNode<int>(1); } + +// CHECK-LP64: __ZN4ListIP12BinomialNodeIiEEC1Ev: + +// CHECK-LP32:__ZN4ListIP12BinomialNodeIiEEC1Ev: + |