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