From: Marek Polacek Date: Wed, 4 Mar 2020 23:49:37 +0000 (-0500) Subject: c++: Fix mismatch in template argument deduction [PR90505] X-Git-Tag: releases/gcc-9.3.0~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=581825efc30ce79d86dfb0ebf378913fdec44adf;p=thirdparty%2Fgcc.git c++: Fix mismatch in template argument deduction [PR90505] 2020-03-03 Jason Merrill Marek Polacek 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/ChangeLog b/gcc/cp/ChangeLog index 80fb96ea9d3c..cb5211e5789a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2020-03-04 Jason Merrill + Marek Polacek + + PR c++/90505 - mismatch in template argument deduction. + * pt.c (tsubst): Don't reduce the template level of template + parameters when tf_partial. + 2020-03-04 Jason Merrill PR c++/90432 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f233e78cc451..2de9036b6471 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 000000000000..e2c165dc788a --- /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 +struct S { + template + static void foo(V) { } + + void bar () { foo(10); } +}; + +void +test () +{ + S 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 000000000000..9d382bfe03a5 --- /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 +struct S { + template + static void foo(U) { } + + void bar () { foo(10); } +}; + +void +test () +{ + S 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 000000000000..8fee6124f5a3 --- /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 +struct S { + template + static void foo(V) { } + + void bar () { foo<>(10); } +}; + +void +test () +{ + S 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 000000000000..fbc28e5150d0 --- /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 class a { + using b = int; + using c = int; + b d; + void e() { g(d); } + template static void g(f...); +};