[gcc r9-8333] c++: Fix mismatch in template argument deduction [PR90505]
Marek Polacek
mpolacek@gcc.gnu.org
Wed Mar 4 23:52:00 GMT 2020
https://gcc.gnu.org/g:581825efc30ce79d86dfb0ebf378913fdec44adf
commit r9-8333-g581825efc30ce79d86dfb0ebf378913fdec44adf
Author: Marek Polacek <polacek@redhat.com>
Date: Wed Mar 4 18:49:37 2020 -0500
c++: Fix mismatch in template argument deduction [PR90505]
2020-03-03 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:
---
gcc/cp/ChangeLog | 7 +++++++
gcc/cp/pt.c | 5 +++++
gcc/testsuite/g++.dg/template/deduce4.C | 17 +++++++++++++++++
gcc/testsuite/g++.dg/template/deduce5.C | 17 +++++++++++++++++
gcc/testsuite/g++.dg/template/deduce6.C | 17 +++++++++++++++++
gcc/testsuite/g++.dg/template/deduce7.C | 10 ++++++++++
6 files changed, 73 insertions(+)
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 80fb96e..cb5211e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,4 +1,11 @@
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.
+
+2020-03-04 Jason Merrill <jason@redhat.com>
PR c++/90432
* init.c (perform_member_init): Don't do aggregate initialization of
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index f233e78..2de9036 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 0000000..e2c165d
--- /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 0000000..9d382bf
--- /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 0000000..8fee612
--- /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 0000000..fbc28e5
--- /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-cvs
mailing list