https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119045

            Bug ID: 119045
           Summary: ICE when using _Complex accessors, in
                    cxx_eval_store_expression, at cp/constexpr.cc:6418
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dangelog at gmail dot com
  Target Milestone: ---

Hello,

The following reduced testcase: https://gcc.godbolt.org/z/1n1sdYvqe

constexpr bool test()
{
    __complex__ float f{1, 2};
    float &r = __real__ f;
    r = 42;
    return true;
}

static_assert(test());

causes an ICE on GCC trunk:

// test3.cc:9:19:   in ‘constexpr’ expansion of ‘test()’
// test3.cc:5:7: internal compiler error: in cxx_eval_store_expression, at
cp/constexpr.cc:6418
//     5 |     r = 42;
//       |     ~~^~~~
// 0x28aab0f internal_error(char const*, ...)
//      ../../gcc.git/gcc/diagnostic-global-context.cc:517
// 0xabc087 fancy_abort(char const*, int, char const*)
//      ../../gcc.git/gcc/diagnostic.cc:1722
// 0x7c94b5 cxx_eval_store_expression
//      ../../gcc.git/gcc/cp/constexpr.cc:6418
// 0xb1636f cxx_eval_constant_expression
//      ../../gcc.git/gcc/cp/constexpr.cc:7962
// 0xb165ad cxx_eval_constant_expression
//      ../../gcc.git/gcc/cp/constexpr.cc:8369
// 0xb164e1 cxx_eval_constant_expression
//      ../../gcc.git/gcc/cp/constexpr.cc:8020
// 0xb16ace cxx_eval_constant_expression
//      ../../gcc.git/gcc/cp/constexpr.cc:8036
// 0xb176d7 cxx_eval_statement_list
//      ../../gcc.git/gcc/cp/constexpr.cc:7119
// 0xb176d7 cxx_eval_constant_expression
//      ../../gcc.git/gcc/cp/constexpr.cc:8615
// 0xb16cd7 cxx_eval_constant_expression
//      ../../gcc.git/gcc/cp/constexpr.cc:8624
// 0xb14c57 cxx_eval_call_expression
//      ../../gcc.git/gcc/cp/constexpr.cc:3312
// 0xb1696e cxx_eval_constant_expression
//      ../../gcc.git/gcc/cp/constexpr.cc:7809
// 0xb236c2 cxx_eval_outermost_constant_expr
//      ../../gcc.git/gcc/cp/constexpr.cc:9104
// 0xb28ab3 maybe_constant_value(tree_node*, tree_node*, mce_value)
//      ../../gcc.git/gcc/cp/constexpr.cc:9407
// 0xd53b00 finish_static_assert(tree_node*, tree_node*, unsigned long, bool,
bool)
//      ../../gcc.git/gcc/cp/semantics.cc:12438
// 0xccc5e7 cp_parser_declaration
//      ../../gcc.git/gcc/cp/parser.cc:16180
// 0xccda5b cp_parser_toplevel_declaration
//      ../../gcc.git/gcc/cp/parser.cc:16201
// 0xccda5b cp_parser_translation_unit
//      ../../gcc.git/gcc/cp/parser.cc:5469
// 0xccda5b c_parse_file()
//      ../../gcc.git/gcc/cp/parser.cc:53949
// 0xe28481 c_common_parse_file()
//      ../../gcc.git/gcc/c-family/c-opts.cc:1379




In a non-constexpr context the code otherwise works fine. Something seems to go
wrong with the reference binding (removing it fixes the problem).

Reply via email to