[PR87012] canonicalize ref type for tmpl arg
authorAlexandre Oliva <aoliva@redhat.com>
Wed, 19 Dec 2018 06:51:30 +0000 (06:51 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Wed, 19 Dec 2018 06:51:30 +0000 (06:51 +0000)
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.

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.

From-SVN: r267251

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

index 0246806c9a7c112e30097f7662240cb886721023..433793f186f66ba5bb36b356dc76d3ea2d9f6556 100644 (file)
@@ -1,5 +1,9 @@
 2018-12-19  Alexandre Oliva <aoliva@redhat.com>
 
+       PR c++/87012
+       * pt.c (convert_template_argument): Canonicalize type after
+       tsubst/deduce.
+
        PR c++/88146
        * method.c (do_build_copy_constructor): Guard cvquals init and
        loop over fields to run for non-inherited ctors only.
index 79eef12112fb7e704d23ea59f2eef3d84a5803b1..e99de71ea9e25114660f8d0303d1ca3a1d73becf 100644 (file)
@@ -8019,6 +8019,9 @@ convert_template_argument (tree parm,
       if (invalid_nontype_parm_type_p (t, complain))
        return error_mark_node;
 
+      if (t != TREE_TYPE (parm))
+       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
index a0d8c9981bc7a50c30bd39b888b5fb7a21dce1fc..52f20c1a8887494ac6eae2f5de08fc0638231b0a 100644 (file)
@@ -1,5 +1,8 @@
 2018-12-19  Alexandre Oliva <aoliva@redhat.com>
 
+       PR c++/87012
+       * g++.dg/cpp0x/pr87012.C: New.
+
        PR c++/88146
        * g++.dg/cpp0x/inh-ctor32.C: New.
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr87012.C b/gcc/testsuite/g++.dg/cpp0x/pr87012.C
new file mode 100644 (file)
index 0000000..fd3eea4
--- /dev/null
@@ -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> { };