c++: ICE with int{} in template. [PR97899]
authorJason Merrill <jason@redhat.com>
Fri, 20 Nov 2020 21:50:20 +0000 (16:50 -0500)
committerJason Merrill <jason@redhat.com>
Tue, 24 Nov 2020 19:57:56 +0000 (14:57 -0500)
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.

gcc/cp/typeck2.c
gcc/testsuite/g++.dg/cpp0x/initlist-template3.C [new file with mode: 0644]

index 412869946a5393b895be148d3da164ddc243e4c2..721987e850273a2752bfba3206068efa69bd126c 100644 (file)
@@ -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 (file)
index 0000000..b65a847
--- /dev/null
@@ -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()};
+}