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
```