https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106212

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2022-07-06
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to fiesh from comment #1)
> Oh and this appears to be a regression introduced in GCC 12.

Seems to be a library change in GCC 12 which triggers a pre-existing compiler
bug. This fails with all versions of GCC -std=c++20 but compiles with clang
-std=c++20 and EDG --c++20


namespace std
{
  using size_t = decltype(sizeof(0));

  template<typename _Tp, size_t _Nm>
    struct array
    {
      _Tp _M_elems[_Nm];

      constexpr const _Tp*
      data() const noexcept
      { return _M_elems; }
    };

    template<typename _Tp>
    constexpr
    bool
    __check_singular(_Tp* const& __ptr)
    { return __ptr == 0; }

  template<typename _Tp, size_t _Nm>
    constexpr
    bool
    operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    {
      if (__check_singular(__one.data()))
        throw 1;
      return &__one == &__two;
    }
}

struct P {
  constexpr P(int i) : e{i} {}
  bool operator==(P const &) const = default;
  std::array<int, 1> e;
};
constexpr auto operator-(P lhs, P) { return lhs; }
constexpr P p{1}, q{0};
static_assert(p - q != 0);

Reply via email to