]> granicus.if.org Git - clang/commitdiff
Don't try to check the initialization of fields with dependent
authorDouglas Gregor <dgregor@apple.com>
Wed, 4 Nov 2009 17:16:11 +0000 (17:16 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 4 Nov 2009 17:16:11 +0000 (17:16 +0000)
types. Fixes PR5352.

Fariborz, please review.

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

lib/Sema/SemaDeclCXX.cpp
test/SemaTemplate/instantiate-deeply.cpp

index 3314ee26cb1437662fe327737dbd9312cf4fec7b..d1f9ad960fd6a27efdff040262d561963330817d 100644 (file)
@@ -1293,11 +1293,16 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
       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 @@ Sema::BuildBaseOrMemberInitializers(ASTContext &C,
 
   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) {
index 27e430be5cbee0795970e6c9f74742754a30ff74..7f15bf1200f12afad7716b14aec3d29a2799c33e 100644 (file)
@@ -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 @@ template<typename a> struct A {
 };
 
 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>;