https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90858
--- Comment #1 from m.cencora at gmail dot com ---
Here is another repoducer, that does not use std::variant:
#include <type_traits>
#include <utility>
#include <cstddef>
struct Base
{
int a;
template <typename F>
static constexpr auto for_all_data_members(F&& func)
{
return func(&Base::a);
}
};
struct MyStruct
{
int a;
int b;
Base c;
template <typename F>
static constexpr auto for_all_data_members(F&& func)
{
return func(
&MyStruct::a
, &MyStruct::b
#ifndef FIX_COMPILATION
, &MyStruct::c
#endif
);
}
};
constexpr void serialize(int val)
{}
template <typename Class>
struct SerializeAll
{
const Class & object;
template <typename ...Args>
constexpr void operator()(Args ...args)
{
(serialize(object.*args), ...);
}
};
template <typename T>
constexpr void serialize(const T& obj)
{
return T::for_all_data_members(SerializeAll<T>{obj});
}
constexpr bool test(const MyStruct& v)
{
serialize(v);
return true;
}
static_assert(test(MyStruct{}), "");