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

Reply via email to