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.

Reply via email to