mirror of git://gcc.gnu.org/git/gcc.git
re PR c++/58856 (spurious 'wrong number of template arguments' error for template alias)
PR c++/58856 * pt.c (num_innermost_template_parms): New. (get_underlying_template): Use it. From-SVN: r206406
This commit is contained in:
parent
5a5e7deb5f
commit
1b7ac92269
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
11
gcc/cp/pt.c
11
gcc/cp/pt.c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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...>;
|
||||
Loading…
Reference in New Issue