aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-03-23 14:23:25 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-03-23 14:23:25 -0400
commit842562b4e1bdd7a7f98e6dcf352b86f96a4e0426 (patch)
treeacd2d177b2db09a1c2d9d0b8defc89fec542064e
parentde2b3f5ca93a5627988f274e5e325d023e01f2a1 (diff)
downloadgcc-842562b4e1bdd7a7f98e6dcf352b86f96a4e0426.zip
gcc-842562b4e1bdd7a7f98e6dcf352b86f96a4e0426.tar.gz
gcc-842562b4e1bdd7a7f98e6dcf352b86f96a4e0426.tar.bz2
PR c++/80150 - ICE with overloaded variadic deduction.
* pt.c (try_one_overload): Remove asserts. From-SVN: r246422
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/pt.c7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic-unify-3.C20
3 files changed, 27 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 22b7dfa..73a25f3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2017-03-23 Jason Merrill <jason@redhat.com>
+ PR c++/80150 - ICE with overloaded variadic deduction.
+ * pt.c (try_one_overload): Remove asserts.
+
PR c++/77563 - missing ambiguous conversion error.
* call.c (convert_like_real): Use LOOKUP_IMPLICIT.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index a4bf890..5259dad 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -19694,9 +19694,10 @@ try_one_overload (tree tparms,
is equivalent to the corresponding explicitly specified argument.
We may have deduced more arguments than were explicitly specified,
and that's OK. */
- gcc_assert (ARGUMENT_PACK_INCOMPLETE_P (oldelt));
- gcc_assert (ARGUMENT_PACK_ARGS (oldelt)
- == ARGUMENT_PACK_EXPLICIT_ARGS (oldelt));
+
+ /* We used to assert ARGUMENT_PACK_INCOMPLETE_P (oldelt) here, but
+ that's wrong if we deduce the same argument pack from multiple
+ function arguments: it's only incomplete the first time. */
tree explicit_pack = ARGUMENT_PACK_ARGS (oldelt);
tree deduced_pack = ARGUMENT_PACK_ARGS (elt);
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-unify-3.C b/gcc/testsuite/g++.dg/cpp0x/variadic-unify-3.C
new file mode 100644
index 0000000..45f4d63
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic-unify-3.C
@@ -0,0 +1,20 @@
+// PR c++/80150
+// { dg-do compile { target c++11 } }
+
+template <typename R, typename... Args>
+bool compare_functions(R(*funcA)(Args...), R(*funcB)(Args...), Args... args) {
+ return false;
+}
+
+int foo(int x) {
+ return x;
+}
+
+float foo(float x) {
+ return x;
+}
+
+int main() {
+ int a = 10;
+ compare_functions<int>(foo, foo, a);
+}