* pt.c (check_explicit_specialization): Check the namespace after
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Nov 2015 20:37:46 +0000 (20:37 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Nov 2015 20:37:46 +0000 (20:37 +0000)
we choose a template.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230271 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/template/explicit-instantiation4.C [new file with mode: 0644]

index d1bf121..9a02de2 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-12  Jason Merrill  <jason@redhat.com>
+
+       * pt.c (check_explicit_specialization): Check the namespace after
+       we choose a template.
+
 2015-11-11  Jason Merrill  <jason@redhat.com>
 
        * decl.c (duplicate_decls): When combining typedefs, remove the
index 62659ec..2e3d48b 100644 (file)
@@ -2800,14 +2800,6 @@ check_explicit_specialization (tree declarator,
                  error ("%qD is not a template function", dname);
                  fns = error_mark_node;
                }
-             else
-               {
-                 tree fn = OVL_CURRENT (fns);
-                 if (!is_associated_namespace (CP_DECL_CONTEXT (decl),
-                                               CP_DECL_CONTEXT (fn)))
-                   error ("%qD is not declared in %qD",
-                          decl, current_namespace);
-               }
            }
 
          declarator = lookup_template_function (fns, NULL_TREE);
@@ -2941,6 +2933,14 @@ check_explicit_specialization (tree declarator,
        return error_mark_node;
       else
        {
+         if (!ctype && !was_template_id
+             && (specialization || member_specialization
+                 || explicit_instantiation)
+             && !is_associated_namespace (CP_DECL_CONTEXT (decl),
+                                          CP_DECL_CONTEXT (tmpl)))
+           error ("%qD is not declared in %qD",
+                  tmpl, current_namespace);
+
          tree gen_tmpl = most_general_template (tmpl);
 
          if (explicit_instantiation)
diff --git a/gcc/testsuite/g++.dg/template/explicit-instantiation4.C b/gcc/testsuite/g++.dg/template/explicit-instantiation4.C
new file mode 100644 (file)
index 0000000..72417b4
--- /dev/null
@@ -0,0 +1,7 @@
+void f();
+
+namespace A {
+  template <class T> void f(T) { }
+  using ::f;
+  template void f(int);
+}