https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105644
Bug ID: 105644 Summary: ICE in a fold expression with a requires expression: in iterative_hash_template_arg, at cp/pt.cc:1805 Product: gcc Version: 12.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: namniav at gmail dot com Target Milestone: --- https://godbolt.org/z/8qehadhbT ============ #include <concepts> #include <type_traits> #include <utility> #include <tuple> template<class T> concept tuple_like = [] <std::size_t...I> (std::index_sequence<I...>) { return ((requires(T t) { { get<I>(t) } -> std::convertible_to<std::tuple_element_t<I, T>&>; }) && ...); } (std::make_index_sequence<std::tuple_size_v<T>>{}); static_assert(tuple_like<std::tuple<int>>); ============ Both 12.1 and current trunk version on godbolt.org crashed. There's no issue if `std::tuple_element_t<I, T>&` is replaced with `int&`. Compiler output: <source>: In instantiation of '<lambda(std::index_sequence<I ...>)> [with long unsigned int ...I = {0}; std::index_sequence<I ...> = std::integer_sequence<long unsigned int, 0>]': <source>:13:7: required from here <source>:11:23: internal compiler error: in iterative_hash_template_arg, at cp/pt.cc:1805 11 | { get<I>(t) } -> std::convertible_to<std::tuple_element_t<I, T>&>; | ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0x2204919 internal_error(char const*, ...) ???:0 0x744dd3 fancy_abort(char const*, int, char const*) ???:0 0x99a843 iterative_hash_template_arg(tree_node*, unsigned int) ???:0 0x7da898 sat_hasher::hash(sat_entry*) ???:0 0x7d52c7 satisfaction_cache::satisfaction_cache(tree_node*, tree_node*, sat_info) ???:0 0x7d9c2a constraints_satisfied_p(tree_node*, tree_node*) ???:0 0x9b3ffe do_auto_deduction(tree_node*, tree_node*, tree_node*, int, auto_deduction_context, tree_node*, int) ???:0 0x7d7ce2 tsubst_requires_expr(tree_node*, tree_node*, int, tree_node*) ???:0 0x9dd888 tsubst_pack_expansion(tree_node*, tree_node*, int, tree_node*) ???:0 0x9c8517 instantiate_decl(tree_node*, bool, bool) ???:0 0x864c7e maybe_instantiate_decl(tree_node*) ???:0 0x866758 mark_used(tree_node*, int) ???:0 0x77a52b build_op_call(tree_node*, vec<tree_node*, va_gc, vl_embed>**, int) ???:0 0xa31a87 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool, bool, int) ???:0 0x7d9c88 evaluate_concept_check(tree_node*) ???:0 0x7c50ec maybe_constant_value(tree_node*, tree_node*, bool) ???:0 0xa3dafd finish_static_assert(tree_node*, tree_node*, unsigned int, bool, bool) ???:0 0x98c15d c_parse_file() ???:0 0xb20141 c_common_parse_file() ???:0 ```