From 92a30040c8d3ea4899979ec41a7e8e6a625c438d Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 20 Nov 2020 16:50:20 -0500 Subject: [PATCH] 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. --- gcc/cp/typeck2.c | 1 + gcc/testsuite/g++.dg/cpp0x/initlist-template3.C | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist-template3.C diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 412869946a5..721987e8502 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -806,6 +806,7 @@ store_init_value (tree decl, tree init, vec** 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 00000000000..b65a8473a09 --- /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 +int fn() +{ + return 1; +} + +template +void bar() { + const int i = int{fn()}; +} -- 2.30.2