https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126483
--- Comment #2 from Patrick Palka <ppalka at gcc dot gnu.org> ---
union data_type {
int m_data[8];
int m_double_first_limb;
constexpr data_type(long) : m_data{} {}
constexpr data_type() : m_double_first_limb() {
if (__builtin_is_constant_evaluated()) {
data_type t(8);
*this = t;
}
}
};
struct number {
data_type m_wrapper;
constexpr number(int) {}
constexpr int *limbs() { return m_wrapper.m_data; }
constexpr void operator+=(number) { 0 > *limbs(); }
};
constexpr auto vt = [] {
number x = 0;
x += x;
return x;
}();
constexpr bool f() {
number unused = vt;
number tmp = 0;
return *tmp.limbs() == 0;
}
static_assert(f());