pt.c (tsubst_decl): SET_DECL_IMPLICIT_INSTANTIATION before register_specialization.
authorJason Merrill <jason@redhat.com>
Wed, 20 May 2015 21:32:52 +0000 (17:32 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 20 May 2015 21:32:52 +0000 (17:32 -0400)
* pt.c (tsubst_decl) [VAR_DECL]: SET_DECL_IMPLICIT_INSTANTIATION
before register_specialization.

From-SVN: r223461

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1y/var-templ27.C [new file with mode: 0644]

index 320023a5ad81a86e8592e16051f218b53f3f7272..b4c60b651cc499f76ba2339a114b9adf9ed2bf61 100644 (file)
@@ -1,5 +1,8 @@
 2015-05-20  Jason Merrill  <jason@redhat.com>
 
+       * pt.c (tsubst_decl) [VAR_DECL]: SET_DECL_IMPLICIT_INSTANTIATION
+       before register_specialization.
+
        * decl.c (grok_op_properties): Don't complain about size_t
        placement delete here.
        * call.c (second_parm_is_size_t): Split out from...
index 60f395893aea8cbdde454b3160d1ba08e6944ec1..7555114ca6f18c3007f59d773d18be29a0826490 100644 (file)
@@ -11407,9 +11407,9 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
               processing here.  */
            DECL_EXTERNAL (r) = 1;
 
-           register_specialization (r, gen_tmpl, argvec, false, hash);
            DECL_TEMPLATE_INFO (r) = build_template_info (tmpl, argvec);
            SET_DECL_IMPLICIT_INSTANTIATION (r);
+           register_specialization (r, gen_tmpl, argvec, false, hash);
          }
        else if (!cp_unevaluated_operand)
          register_local_specialization (r, t);
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ27.C b/gcc/testsuite/g++.dg/cpp1y/var-templ27.C
new file mode 100644 (file)
index 0000000..da06b01
--- /dev/null
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++14 } }
+
+namespace A
+{
+  template <class T> int I = 0;
+  template <class T> int I<T*> = 42;
+}
+
+int i = A::I<void*>;