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.
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);
--- /dev/null
+// 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);
+}