[cfe-commits] r86031 - in /cfe/trunk: lib/Sema/SemaDeclCXX.cpp test/SemaTemplate/instantiate-deeply.cpp

Douglas Gregor dgregor at apple.com
Wed Nov 4 09:16:12 PST 2009


Author: dgregor
Date: Wed Nov  4 11:16:11 2009
New Revision: 86031

URL: http://llvm.org/viewvc/llvm-project?rev=86031&view=rev
Log:
Don't try to check the initialization of fields with dependent
types. Fixes PR5352.

Fariborz, please review.

Modified:
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/test/SemaTemplate/instantiate-deeply.cpp

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=86031&r1=86030&r2=86031&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Nov  4 11:16:11 2009
@@ -1293,11 +1293,16 @@
       continue;
     }
 
+    if ((*Field)->getType()->isDependentType()) {
+      Fields.push_back(*Field);
+      continue;
+    }
+    
     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()) {
+      if (!Ctor) {
         Fields.push_back(*Field);
         continue;
       }
@@ -1357,12 +1362,16 @@
 
   SetBaseOrMemberInitializers(Constructor,
                               Initializers, NumInitializers, Bases, Members);
-  for (unsigned int i = 0; i < Bases.size(); i++)
-    Diag(Bases[i]->getSourceRange().getBegin(),
-         diag::err_missing_default_constructor) << 0 << Bases[i]->getType();
-  for (unsigned int i = 0; i < Members.size(); i++)
-    Diag(Members[i]->getLocation(), diag::err_missing_default_constructor)
-          << 1 << Members[i]->getType();
+  for (unsigned int i = 0; i < Bases.size(); i++) {
+    if (!Bases[i]->getType()->isDependentType())
+      Diag(Bases[i]->getSourceRange().getBegin(),
+           diag::err_missing_default_constructor) << 0 << Bases[i]->getType();
+  }
+  for (unsigned int i = 0; i < Members.size(); i++) {
+    if (!Members[i]->getType()->isDependentType())
+      Diag(Members[i]->getLocation(), diag::err_missing_default_constructor)
+        << 1 << Members[i]->getType();
+  }
 }
 
 static void *GetKeyForTopLevelField(FieldDecl *Field) {

Modified: cfe/trunk/test/SemaTemplate/instantiate-deeply.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-deeply.cpp?rev=86031&r1=86030&r2=86031&view=diff

==============================================================================
--- cfe/trunk/test/SemaTemplate/instantiate-deeply.cpp (original)
+++ cfe/trunk/test/SemaTemplate/instantiate-deeply.cpp Wed Nov  4 11:16:11 2009
@@ -1,5 +1,4 @@
 // RUN: clang-cc -fsyntax-only -Wall -verify %s
-
 template<typename a> struct A {
   template <typename b> struct B {
     template <typename c> struct C {
@@ -20,3 +19,18 @@
 };
 
 A<int>::B<int>::C<int>::D<int>::E<int> global;
+
+// PR5352
+template <typename T>
+class Foo {
+public:
+  Foo() {}
+  
+  struct Bar {
+    T value;
+  };
+  
+  Bar u;
+};
+
+template class Foo<int>;





More information about the cfe-commits mailing list