aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-11-20 16:50:20 -0500
committerJason Merrill <jason@redhat.com>2020-11-24 14:57:56 -0500
commit92a30040c8d3ea4899979ec41a7e8e6a625c438d (patch)
treec4f91105a4b1b013955ef68e18f7a57c72dce78e
parentce2d9549f2b2bcb70a1a6f8f4e776e1ed427546b (diff)
downloadgcc-92a30040c8d3ea4899979ec41a7e8e6a625c438d.zip
gcc-92a30040c8d3ea4899979ec41a7e8e6a625c438d.tar.gz
gcc-92a30040c8d3ea4899979ec41a7e8e6a625c438d.tar.bz2
c++: ICE with int{} in template. [PR97899]
split_nonconstant_init_1 was confused by a CONSTRUCTOR with non-aggregate type, which (with COMPOUND_LITERAL_P set) we use in a template to represent a braced functional cast. It seems to me that there's no good reason to do split_nonconstant_init at all in a template. gcc/cp/ChangeLog: PR c++/97899 * typeck2.c (store_init_value): Don't split_nonconstant_init in a template. gcc/testsuite/ChangeLog: PR c++/97899 * g++.dg/cpp0x/initlist-template3.C: New test.
-rw-r--r--gcc/cp/typeck2.c1
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist-template3.C13
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 4128699..721987e 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -806,6 +806,7 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
the bits that are constant, and then return an expression that
will perform the dynamic initialization. */
if (value != error_mark_node
+ && !processing_template_decl
&& (TREE_SIDE_EFFECTS (value)
|| vla_type_p (type)
|| ! reduced_constant_expression_p (value)))
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-template3.C b/gcc/testsuite/g++.dg/cpp0x/initlist-template3.C
new file mode 100644
index 0000000..b65a847
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/initlist-template3.C
@@ -0,0 +1,13 @@
+// PR c++/97899
+// { dg-do compile { target c++11 } }
+
+template <typename T = int>
+int fn()
+{
+ return 1;
+}
+
+template <typename T>
+void bar() {
+ const int i = int{fn()};
+}