[PATCH] c++: Backport PR90505 fix to 9
Jason Merrill
jason@redhat.com
Wed Mar 4 22:23:00 GMT 2020
On 3/4/20 4:02 PM, Marek Polacek wrote:
> While backporting our 90505 fix to 9 I noticed a bunch of concepts regressions.
> Fortunately I think the following variant of the fix is safe and still fixes
> the deduction issue. In 9, we want to reject 'auto' when tf_partial before
> returning cp_build_qualified_type_real for TEMPLATE_TYPE_PARM and similar.
> And then to fix 90505, return early before reducing the template level.
>
> The difference is caused by the huge concepts merge, so it's tough to figure
> out what specific change caused it.
>
> Bootstrapped/regtested on x86_64-linux, ok for 9?
OK.
> 2020-03-04 Jason Merrill <jason@redhat.com>
> Marek Polacek <polacek@redhat.com>
>
> PR c++/90505 - mismatch in template argument deduction.
> * pt.c (tsubst): Don't reduce the template level of template
> parameters when tf_partial.
>
> * g++.dg/template/deduce4.C: New test.
> * g++.dg/template/deduce5.C: New test.
> * g++.dg/template/deduce6.C: New test.
> * g++.dg/template/deduce7.C: New test.
>
> diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
> index f233e78cc45..2de9036b647 100644
> --- a/gcc/cp/pt.c
> +++ b/gcc/cp/pt.c
> @@ -14630,6 +14630,11 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
> about the template parameter in question. */
> return t;
>
> + /* Like with 'auto', don't reduce the level of template parameters
> + to avoid mismatches when deducing their types. */
> + if (complain & tf_partial)
> + return t;
> +
> /* If we get here, we must have been looking at a parm for a
> more deeply nested template. Make a new version of this
> template parameter, but with a lower level. */
> diff --git a/gcc/testsuite/g++.dg/template/deduce4.C b/gcc/testsuite/g++.dg/template/deduce4.C
> new file mode 100644
> index 00000000000..e2c165dc788
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/template/deduce4.C
> @@ -0,0 +1,17 @@
> +// PR c++/90505 - mismatch in template argument deduction.
> +// { dg-do compile }
> +
> +template <typename T>
> +struct S {
> + template <typename U, typename V>
> + static void foo(V) { }
> +
> + void bar () { foo<int>(10); }
> +};
> +
> +void
> +test ()
> +{
> + S<int> s;
> + s.bar ();
> +}
> diff --git a/gcc/testsuite/g++.dg/template/deduce5.C b/gcc/testsuite/g++.dg/template/deduce5.C
> new file mode 100644
> index 00000000000..9d382bfe03a
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/template/deduce5.C
> @@ -0,0 +1,17 @@
> +// PR c++/90505 - mismatch in template argument deduction.
> +// { dg-do compile { target c++11 } }
> +
> +template <typename T>
> +struct S {
> + template <typename U, typename V = void>
> + static void foo(U) { }
> +
> + void bar () { foo<int>(10); }
> +};
> +
> +void
> +test ()
> +{
> + S<int> s;
> + s.bar ();
> +}
> diff --git a/gcc/testsuite/g++.dg/template/deduce6.C b/gcc/testsuite/g++.dg/template/deduce6.C
> new file mode 100644
> index 00000000000..8fee6124f5a
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/template/deduce6.C
> @@ -0,0 +1,17 @@
> +// PR c++/90505 - mismatch in template argument deduction.
> +// { dg-do compile { target c++11 } }
> +
> +template <typename T>
> +struct S {
> + template <typename U = int, typename V>
> + static void foo(V) { }
> +
> + void bar () { foo<>(10); }
> +};
> +
> +void
> +test ()
> +{
> + S<int> s;
> + s.bar ();
> +}
> diff --git a/gcc/testsuite/g++.dg/template/deduce7.C b/gcc/testsuite/g++.dg/template/deduce7.C
> new file mode 100644
> index 00000000000..fbc28e5150d
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/template/deduce7.C
> @@ -0,0 +1,10 @@
> +// PR c++/90505 - mismatch in template argument deduction.
> +// { dg-do compile { target c++11 } }
> +
> +template <typename> class a {
> + using b = int;
> + using c = int;
> + b d;
> + void e() { g<c>(d); }
> + template <typename... f> static void g(f...);
> +};
>
More information about the Gcc-patches
mailing list