https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84808
Bug ID: 84808
Summary: [8 Regression] ICE with constexpr and array
Product: gcc
Version: 8.0.1
Status: UNCONFIRMED
Keywords: ice-on-valid-code
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: reichelt at gcc dot gnu.org
Target Milestone: ---
The following valid code snippet triggers an ICE on trunk:
=================================
struct A
{
int i;
constexpr A() : i() {}
};
struct B
{
A a[8];
};
constexpr int foo(int n)
{
B b;
++b.a[n+2].i;
++b.a[n].i;
return 0;
}
constexpr int i = foo(2);
=================================
bug.cc:20:22: in 'constexpr' expansion of 'foo(2)'
bug.cc:20:24: internal compiler error: Segmentation fault
constexpr int i = foo(2);
^
0xeb9a7f crash_signal
../../gcc/gcc/toplev.c:325
0x84e8e3 find_constructor
../../gcc/gcc/cp/constexpr.c:1255
0x116183b walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*),
void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*, tree_node*
(*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*,
hash_set<tree_node*, default_hash_traits<tree_node*> >*))
../../gcc/gcc/tree.c:11400
0x84ee9e unshare_constructor
../../gcc/gcc/cp/constexpr.c:1268
0x853c1d find_array_ctor_elt
../../gcc/gcc/cp/constexpr.c:2257
0x859cef cxx_eval_store_expression
../../gcc/gcc/cp/constexpr.c:3633
0x8571df cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:4262
0x856986 cxx_eval_increment_expression
../../gcc/gcc/cp/constexpr.c:3789
0x856986 cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:4670
0x85777f cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:4566
0x8562a7 cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:4310
0x8562a7 cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:4310
0x856ed1 cxx_eval_statement_list
../../gcc/gcc/cp/constexpr.c:3912
0x856ed1 cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:4657
0x85623d cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:4661
0x855472 cxx_eval_call_expression
../../gcc/gcc/cp/constexpr.c:1700
0x85625b cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:4184
0x85b8e7 cxx_eval_outermost_constant_expr
../../gcc/gcc/cp/constexpr.c:4833
0x85e596 maybe_constant_value(tree_node*, tree_node*)
../../gcc/gcc/cp/constexpr.c:5051
0x9f2729 store_init_value(tree_node*, tree_node*, vec<tree_node*, va_gc,
vl_embed>**, int)
../../gcc/gcc/cp/typeck2.c:825
Please submit a full bug report, [etc.]
The regression was introduced between 2018-02-07 and 2018-02-15.
The bug depends on the size of the array B::a and the value passed into foo.
Due to this fragile behavior, it might be that the bug was latent before.