[llvm-branch-commits] [cfe-branch] r118574 - in /cfe/branches/Apple/whitney: lib/Sema/SemaTemplateInstantiateDecl.cpp test/SemaTemplate/class-template-decl.cpp

Daniel Dunbar daniel at zuster.org
Tue Nov 9 09:32:39 PST 2010


Author: ddunbar
Date: Tue Nov  9 11:32:39 2010
New Revision: 118574

URL: http://llvm.org/viewvc/llvm-project?rev=118574&view=rev
Log:
Merge r118454:
--
Author: Nick Lewycky <nicholas at mxc.ca>
Date:   Mon Nov 8 23:29:42 2010 +0000

    Don't lose track of previous-declarations when instantiating a class template.
    Fixes PR8001.

Modified:
    cfe/branches/Apple/whitney/lib/Sema/SemaTemplateInstantiateDecl.cpp
    cfe/branches/Apple/whitney/test/SemaTemplate/class-template-decl.cpp

Modified: cfe/branches/Apple/whitney/lib/Sema/SemaTemplateInstantiateDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/whitney/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=118574&r1=118573&r2=118574&view=diff
==============================================================================
--- cfe/branches/Apple/whitney/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
+++ cfe/branches/Apple/whitney/lib/Sema/SemaTemplateInstantiateDecl.cpp Tue Nov  9 11:32:39 2010
@@ -722,6 +722,15 @@
   CXXRecordDecl *PrevDecl = 0;
   ClassTemplateDecl *PrevClassTemplate = 0;
 
+  if (!isFriend && Pattern->getPreviousDeclaration()) {
+    DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName());
+    if (Found.first != Found.second) {
+      PrevClassTemplate = dyn_cast<ClassTemplateDecl>(*Found.first);
+      if (PrevClassTemplate)
+        PrevDecl = PrevClassTemplate->getTemplatedDecl();
+    }
+  }
+
   // If this isn't a friend, then it's a member template, in which
   // case we just want to build the instantiation in the
   // specialization.  If it is a friend, we want to build it in
@@ -836,7 +845,8 @@
     // friend target decl?
   } else {
     Inst->setAccess(D->getAccess());
-    Inst->setInstantiatedFromMemberTemplate(D);
+    if (!PrevClassTemplate)
+      Inst->setInstantiatedFromMemberTemplate(D);
   }
   
   // Trigger creation of the type for the instantiation.

Modified: cfe/branches/Apple/whitney/test/SemaTemplate/class-template-decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/whitney/test/SemaTemplate/class-template-decl.cpp?rev=118574&r1=118573&r2=118574&view=diff
==============================================================================
--- cfe/branches/Apple/whitney/test/SemaTemplate/class-template-decl.cpp (original)
+++ cfe/branches/Apple/whitney/test/SemaTemplate/class-template-decl.cpp Tue Nov  9 11:32:39 2010
@@ -56,3 +56,21 @@
 }
 
 template<typename T> class M::C3 { }; // expected-error{{out-of-line definition of 'C3' does not match any declaration in namespace 'M'}}
+
+namespace PR8001 {
+  template<typename T1>
+  struct Foo {
+    template<typename T2> class Bar;
+    typedef Bar<T1> Baz;
+
+   template<typename T2>
+   struct Bar {
+     Bar() {}
+   };
+  };
+
+  void pr8001() {
+    Foo<int>::Baz x;
+    Foo<int>::Bar<int> y(x);
+  }
+}





More information about the llvm-branch-commits mailing list