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

            Bug ID: 127749
           Summary: ICE from usage of std::meta::identifier_of in `if
                    constexpr` in lambda-expression
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: irvsrc at gmail dot com
  Target Milestone: ---

The following code produces internal compiler error with GCC (trunk), and
incorrect branch selection with GCC (16.1) and (16.2).

```
#include <meta>

struct ty {
    int mem = 0;
};

template<std::meta::info member>
auto constexpr inline fn = [](auto...) {
    static_assert(std::meta::identifier_of(member) == "mem");
    if constexpr (std::meta::identifier_of(member) == "mem")
        throw 0;
};

auto main() -> int {
    fn<^^ty::mem>();
}
```

Compile with -std=c++26 -freflection

```
<source>: In instantiation of 'constexpr const auto fn<^^int ty::mem>':
<source>:15:5:   required from here
   15 |     fn<^^ty::mem>();
      |     ^~~~~~~~~~~~~
<source>:10:43: internal compiler error: in cxx_eval_constant_expression, at
cp/constexpr.cc:10621
   10 |     if constexpr (std::meta::identifier_of(member) == "mem")
      |                   ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
0x2c786f8 diagnostics::context::diagnostic_impl(rich_location*,
diagnostics::metadata const*, diagnostics::option_id, char const*,
__va_list_tag (*) [1], diagnostics::kind)
        ???:0
0x2c6d33b internal_error(char const*, ...)
        ???:0
0xb832c4 fancy_abort(char const*, int, char const*)
        ???:0
0xbf1e61 cxx_eval_constant_expression(constexpr_ctx const*, tree_node*,
value_cat, bool*, bool*, tree_node**)
        ???:0
0xbf4828 cxx_eval_constant_expression(constexpr_ctx const*, tree_node*,
value_cat, bool*, bool*, tree_node**)
        ???:0
0xbf1e61 cxx_eval_constant_expression(constexpr_ctx const*, tree_node*,
value_cat, bool*, bool*, tree_node**)
        ???:0
0xbf4828 cxx_eval_constant_expression(constexpr_ctx const*, tree_node*,
value_cat, bool*, bool*, tree_node**)
        ???:0
0xbf1e61 cxx_eval_constant_expression(constexpr_ctx const*, tree_node*,
value_cat, bool*, bool*, tree_node**)
        ???:0
0xc050a3 cxx_constant_value(tree_node*, tree_node*, int)
        ???:0
0xe9841c finish_if_stmt_cond(tree_node*, tree_node*)
        ???:0
0xe0662f tsubst_lambda_expr(tree_node*, tree_node*, int, tree_node*)
        ???:0
0xe41a2d instantiate_decl(tree_node*, bool, bool)
        ???:0
0xca6163 maybe_instantiate_decl(tree_node*)
        ???:0
0xca8157 mark_used(tree_node*, int)
        ???:0
0xe93014 finish_id_expression(tree_node*, tree_node*, tree_node*, cp_id_kind*,
bool, bool, bool*, bool, bool, bool, bool, char const**, unsigned long)
        ???:0
0xddc653 c_parse_file()
        ???:0
0xf70339 c_common_parse_file()
        ???:0
```

Reply via email to