On Dec 5, 2018, Jason Merrill <ja...@redhat.com> wrote: > I would expect that this same issue would come up with other types; I > think we want to fix this sooner, when we are figuring out what type > we want to convert the argument to.
You mean like this? [PR87012] canonicalize ref type for tmpl arg When binding an object to a template parameter of reference type, we take the address of the object and dereference that address. The type of the address may still carry (template) typedefs, but verify_unstripped_args_1 rejects such typedefs other than in the top level of template arguments. Canonicalizing the type we want to convert to right after any substitutions or deductions avoids that issue. Regstrapped on x86_64- and i686-linux-gnu. Ok to install? for gcc/cp/ChangeLog PR c++/87012 * pt.c (convert_template_argument): Canonicalize type after tsubst/deduce. for gcc/testsuite/ChangeLog PR c++/87012 * g++.dg/cpp0x/pr87012.C: New. --- gcc/cp/pt.c | 2 ++ gcc/testsuite/g++.dg/cpp0x/pr87012.C | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/pr87012.C diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 72ae7173d92c..0d388c67459a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8018,6 +8018,8 @@ convert_template_argument (tree parm, if (invalid_nontype_parm_type_p (t, complain)) return error_mark_node; + t = canonicalize_type_argument (t, complain); + if (!type_dependent_expression_p (orig_arg) && !uses_template_parms (t)) /* We used to call digest_init here. However, digest_init diff --git a/gcc/testsuite/g++.dg/cpp0x/pr87012.C b/gcc/testsuite/g++.dg/cpp0x/pr87012.C new file mode 100644 index 000000000000..fd3eea47c390 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr87012.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } + +template<class T> +using ref = T&; + +int x; + +template<template<class> class T, T<int>> +struct X { }; + +struct Y : X<ref, x> { }; -- Alexandre Oliva, freedom fighter https://FSFLA.org/blogs/lxo Be the change, be Free! FSF Latin America board member GNU Toolchain Engineer Free Software Evangelist Hay que enGNUrecerse, pero sin perder la terGNUra jamás-GNUChe