]> granicus.if.org Git - clang/commitdiff
Referenced instatiated default constructors
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 2 Sep 2009 23:02:57 +0000 (23:02 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 2 Sep 2009 23:02:57 +0000 (23:02 +0000)
must be defined. Fixed pr4853.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80846 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/CodeGenCXX/constructor-template.cpp

index f80a0b88e5902ec2fdc577679f25cd4a54b7fd33..a0b6e2c2f82d404db84b27d31a1cd9f996b1689f 100644 (file)
@@ -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) == 
index 10577e9766109df936e366d1bfe9fb9063446816..43abda435b0263849058108dae6a9fdfb8cb62de 100644 (file)
@@ -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:
+