[cfe-commits] r80846 - in /cfe/trunk: lib/Sema/SemaDeclCXX.cpp test/CodeGenCXX/constructor-template.cpp
Fariborz Jahanian
fjahanian at apple.com
Wed Sep 2 16:02:57 PDT 2009
Author: fjahanian
Date: Wed Sep 2 18:02:57 2009
New Revision: 80846
URL: http://llvm.org/viewvc/llvm-project?rev=80846&view=rev
Log:
Referenced instatiated default constructors
must be defined. Fixed pr4853.
Modified:
cfe/trunk/lib/Sema/SemaDeclCXX.cpp
cfe/trunk/test/CodeGenCXX/constructor-template.cpp
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=80846&r1=80845&r2=80846&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Sep 2 18:02:57 2009
@@ -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) ==
Modified: cfe/trunk/test/CodeGenCXX/constructor-template.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/constructor-template.cpp?rev=80846&r1=80845&r2=80846&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/constructor-template.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/constructor-template.cpp Wed Sep 2 18:02:57 2009
@@ -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 @@
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:
+
More information about the cfe-commits
mailing list