aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp0x
diff options
context:
space:
mode:
authorSimon Martin <simon@nasilyan.com>2024-08-07 12:45:12 +0200
committerSimon Martin <simon@nasilyan.com>2024-08-07 12:48:16 +0200
commita1999cbc816ecd382c7af4ca44153379de49dcaf (patch)
tree6ee3b8a65ce634a937a5d7c101c909113ed1d142 /gcc/testsuite/g++.dg/cpp0x
parent2083389a18d36684a88d9e2653bacc87ad894b50 (diff)
downloadgcc-a1999cbc816ecd382c7af4ca44153379de49dcaf.zip
gcc-a1999cbc816ecd382c7af4ca44153379de49dcaf.tar.gz
gcc-a1999cbc816ecd382c7af4ca44153379de49dcaf.tar.bz2
c++: Fix ICE on valid involving variadic constructor [PR111592]
We currently ICE upon the following valid code, due to the fix made through commit 9efe5fbde1e8 === cut here === struct ignore { ignore(...) {} }; template<class... Args> void InternalCompilerError(Args... args) { ignore{ ignore(args) ... }; } int main() { InternalCompilerError(0, 0); } === cut here === Change 9efe5fbde1e8 avoids infinite recursion in build_over_call by returning error_mark_node if one invokes ignore::ignore(...) with an argument of type ignore, because otherwise we end up calling convert_arg_to_ellipsis for that argument, and recurse into build_over_call with the exact same parameters. This patch tightens the condition to only return error_mark_node if there's one and only one parameter to the call being processed - otherwise we won't infinitely recurse. Successfully tested on x86_64-pc-linux-gnu. PR c++/111592 gcc/cp/ChangeLog: * call.cc (build_over_call): Only error out if there's a single parameter of type A in a call to A::A(...). gcc/testsuite/ChangeLog: * g++.dg/cpp0x/variadic186.C: New test.
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x')
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic186.C11
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic186.C b/gcc/testsuite/g++.dg/cpp0x/variadic186.C
new file mode 100644
index 0000000..4a25a1a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic186.C
@@ -0,0 +1,11 @@
+// PR c++/111592
+// { dg-do compile { target c++11 } }
+
+struct ignore { ignore(...) {} };
+
+template<class... Args>
+void InternalCompilerError(Args... args)
+{ ignore{ ignore(args) ... }; }
+
+int main()
+{ InternalCompilerError(0, 0); }