re PR c++/58856 (spurious 'wrong number of template arguments' error for template...
authorJason Merrill <jason@redhat.com>
Tue, 7 Jan 2014 21:28:33 +0000 (16:28 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 7 Jan 2014 21:28:33 +0000 (16:28 -0500)
PR c++/58856
* pt.c (num_innermost_template_parms): New.
(get_underlying_template): Use it.

From-SVN: r206406

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/alias-decl-39.C [new file with mode: 0644]

index cdb376d..bf2a593 100644 (file)
@@ -1,5 +1,9 @@
 2014-01-07  Jason Merrill  <jason@redhat.com>
 
+       PR c++/58856
+       * pt.c (num_innermost_template_parms): New.
+       (get_underlying_template): Use it.
+
        PR c++/58965
        * mangle.c (write_guarded_var_name): Handle null DECL_NAME.
 
index 98d7365..2e7cf60 100644 (file)
@@ -5149,6 +5149,15 @@ alias_template_specialization_p (const_tree t)
          && DECL_ALIAS_TEMPLATE_P (TYPE_TI_TEMPLATE (t)));
 }
 
+/* Return the number of innermost template parameters in TMPL.  */
+
+static int
+num_innermost_template_parms (tree tmpl)
+{
+  tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl));
+  return TREE_VEC_LENGTH (parms);
+}
+
 /* Return either TMPL or another template that it is equivalent to under DR
    1286: An alias that just changes the name of a template is equivalent to
    the other template.  */
@@ -5164,6 +5173,8 @@ get_underlying_template (tree tmpl)
        {
          tree sub = TYPE_TI_TEMPLATE (result);
          if (PRIMARY_TEMPLATE_P (sub)
+             && (num_innermost_template_parms (tmpl)
+                 == num_innermost_template_parms (sub))
              && same_type_p (result, TREE_TYPE (sub)))
            {
              /* The alias type is equivalent to the pattern of the
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-39.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-39.C
new file mode 100644 (file)
index 0000000..9fe5538
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/58856
+// { dg-require-effective-target c++11 }
+
+template <typename T>
+struct U1 {};
+
+template <typename T1, typename... Ts>
+using U2 = U1<T1>;
+
+template <typename T1, typename... Ts>
+using U3 = U2<T1, Ts...>;