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.
We might special-case INDIRECT_REFs, but I suppose we're better off canonicalizing the desired type for the address before converting to it. Regstrapped on i686- and x86_64-linux-gnu. Ok to install? for gcc/cp/ChangeLog PR c++/87012 * pt.c (canonicalize_type_argument): Declare earlier. (convert_nontype_argument): Call it on addr expr. for gcc/testsuite/ChangeLog PR c++/87012 * g++.dg/cpp0x/pr87012.C: New. --- gcc/cp/pt.c | 4 ++++ gcc/testsuite/g++.dg/cpp0x/pr87012.C | 11 +++++++++++ 2 files changed, 15 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/pr87012.C diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b58ec06a09e5..83d0a74b209f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -227,6 +227,8 @@ static tree make_argument_pack (tree); static void register_parameter_specializations (tree, tree); static tree enclosing_instantiation_of (tree tctx); +static tree canonicalize_type_argument (tree arg, tsubst_flags_t complain); + /* Make the current scope suitable for access checking when we are processing T. T can be FUNCTION_DECL for instantiated function template, VAR_DECL for static member variable, or TYPE_DECL for @@ -7016,6 +7018,8 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) return NULL_TREE; } + type = canonicalize_type_argument (type, complain); + if (!same_type_p (type, TREE_TYPE (expr))) expr = build_nop (type, expr); } 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