diff options
author | Jason Merrill <jason@redhat.com> | 2020-11-20 16:50:20 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2020-11-24 14:57:56 -0500 |
commit | 92a30040c8d3ea4899979ec41a7e8e6a625c438d (patch) | |
tree | c4f91105a4b1b013955ef68e18f7a57c72dce78e /gcc | |
parent | ce2d9549f2b2bcb70a1a6f8f4e776e1ed427546b (diff) | |
download | gcc-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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/typeck2.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/initlist-template3.C | 13 |
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()}; +} |