https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107579
Martin Liška <marxin at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
Last reconfirmed| |2022-11-21
CC| |marxin at gcc dot gnu.org
--- Comment #5 from Martin Liška <marxin at gcc dot gnu.org> ---
Reduced test-case:
template <typename _Tp, _Tp> struct integral_constant {};
template <typename _Tp, _Tp> struct integer_sequence {};
template <typename _Tp, _Tp _Num>
using make_integer_sequence = integer_sequence<_Tp, __integer_pack(_Num)...>;
template <long... _Idx>
using index_sequence = integer_sequence<unsigned long, _Idx...>;
template <long N>
using make_index_sequence = make_integer_sequence<unsigned long, N>;
namespace sequence_tuple {
struct tuple {};
template <int> auto get(tuple t) { return t; }
} // namespace sequence_tuple
template <long Index> using size_t_ = integral_constant<unsigned long, Index>;
template <class T> auto tie_as_tuple(T, size_t_<1>) {
sequence_tuple::tuple __trans_tmp_1;
return __trans_tmp_1;
}
template <class, unsigned long N>
constexpr auto detect_fields_count_dispatch(size_t_<N>) {
return 1;
}
template <class> constexpr long fields_count() {
long result = detect_fields_count_dispatch<int>(size_t_<0>{});
return result;
}
template <class T> auto tie_as_tuple(T val) { return tie_as_tuple(val, {}); }
void get();
template <class T, class F> void for_each_field(T value, F func) {
constexpr long fields_count_val = fields_count<T>();
auto t = tie_as_tuple(value);
[&]<unsigned long... I>(index_sequence<I...>) { (func(get<I>(t)), ...); }
(make_index_sequence<fields_count_val>{});
}
void index_in_struct(auto s, auto... member) {
for_each_field(s, [&](auto) {
if constexpr (requires { (... * member); })
(... * member);
});
}
void z() { index_in_struct(int{}, z); }