aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/pt.c13
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ25.C8
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ26.C19
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 957dc1d..04576e5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2015-05-18 Jason Merrill <jason@redhat.com>
+ * pt.c (tsubst_decl) [VAR_DECL]: Call coerce_innermost_template_parms.
+ (determine_specialization): Call coerce_template_parms.
+
DR 1391
* pt.c (type_unification_real): Check convertibility here.
(unify_one_argument): Not here.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 2cd36c9..2166f5f 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -1919,7 +1919,13 @@ determine_specialization (tree template_id,
++header_count;
if (variable_template_p (fns))
- templates = tree_cons (explicit_targs, fns, templates);
+ {
+ tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (fns));
+ targs = coerce_template_parms (parms, explicit_targs, fns,
+ tf_warning_or_error,
+ /*req_all*/true, /*use_defarg*/true);
+ templates = tree_cons (targs, fns, templates);
+ }
else for (; fns; fns = OVL_NEXT (fns))
{
tree fn = OVL_CURRENT (fns);
@@ -11265,6 +11271,11 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
tmpl = DECL_TI_TEMPLATE (t);
gen_tmpl = most_general_template (tmpl);
argvec = tsubst (DECL_TI_ARGS (t), args, complain, in_decl);
+ if (argvec != error_mark_node)
+ argvec = (coerce_innermost_template_parms
+ (DECL_TEMPLATE_PARMS (gen_tmpl),
+ argvec, t, complain,
+ /*all*/true, /*defarg*/true));
if (argvec == error_mark_node)
RETURN (error_mark_node);
hash = hash_tmpl_and_args (gen_tmpl, argvec);
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ25.C b/gcc/testsuite/g++.dg/cpp1y/var-templ25.C
new file mode 100644
index 0000000..8253eac
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ25.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++14 } }
+
+using fl = float;
+
+template<class T> const int V = 0;
+template<> const int V<fl> = 42;
+
+static_assert(V<float> == 42, "");
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ26.C b/gcc/testsuite/g++.dg/cpp1y/var-templ26.C
new file mode 100644
index 0000000..9ac0777
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ26.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++14 } }
+
+template <class T> const int V = 0;
+template <> const int V<char> = 42;
+
+template <class T>
+struct A
+{
+ using N = T;
+};
+
+#define SA(X) static_assert((X),#X)
+template <class T>
+struct B
+{
+ SA(V<typename A<T>::N> == 42);
+};
+
+B<char> b;