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); }

Reply via email to