]> granicus.if.org Git - clang/commitdiff
Correctly instantiate templates with non-type template arguments that
authorJohn McCall <rjmccall@apple.com>
Thu, 19 Aug 2010 23:06:02 +0000 (23:06 +0000)
committerJohn McCall <rjmccall@apple.com>
Thu, 19 Aug 2010 23:06:02 +0000 (23:06 +0000)
are local externs.  Fixes <rdar://problem/8302138>.

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

lib/Sema/SemaTemplateInstantiateDecl.cpp
test/SemaTemplate/temp_arg_nontype.cpp

index 6fc95634ab7d61cb3f8b9937e90cdb6ebf08197d..cfae30c0adf789ba8d68fb353502f549c85e75de 100644 (file)
@@ -2559,7 +2559,7 @@ NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D,
   DeclContext *ParentDC = D->getDeclContext();
   if (isa<ParmVarDecl>(D) || isa<NonTypeTemplateParmDecl>(D) ||
       isa<TemplateTypeParmDecl>(D) || isa<TemplateTemplateParmDecl>(D) ||
-      ParentDC->isFunctionOrMethod()) {
+      (ParentDC->isFunctionOrMethod() && ParentDC->isDependentContext())) {
     // D is a local of some kind. Look into the map of local
     // declarations to their instantiations.
     return cast<NamedDecl>(CurrentInstantiationScope->getInstantiationOf(D));
index d351eb458838dc3e425323b3ac82c24a35426f83..6f515916e45fc59ee8987629415dee39c34efdcf 100644 (file)
@@ -203,3 +203,43 @@ namespace PR6964 {
   struct as_nview<Sequence, I0>  // expected-note{{while checking a default template argument used here}}
   { };
 }
+
+// rdar://problem/8302138
+namespace test8 {
+  template <int* ip> struct A {
+    int* p;
+    A() : p(ip) {}
+  };
+
+  void test0() {
+    extern int i00;
+    A<&i00> a00;
+  }
+
+  extern int i01;
+  void test1() {
+    A<&i01> a01;
+  }
+
+
+  struct C {
+    int x;
+    char y;
+    double z;
+  };
+  
+  template <C* cp> struct B {
+    C* p;
+    B() : p(cp) {}
+  };
+
+  void test2() {
+    extern C c02;
+    B<&c02> b02;
+  }
+
+  extern C c03;
+  void test3() {
+    B<&c03> b03;
+  }
+}