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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2019-05-08
     Ever confirmed|0                           |1

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #0)
> Also, hash<UP>::operator() should not be unconditionally noexcept, because
> (if it is enabled) hash<UP::pointer>::operator() might throw
> ([util.smartptr.hash] p1).

Here's a testcase for that part, which should exit normally but calls
std::terminate():

#include <memory>

struct D {
  struct pointer { };
  void operator()(pointer) const noexcept { }
};

bool operator==(D::pointer, std::nullptr_t) { return false; }
bool operator!=(D::pointer, std::nullptr_t) { return true; }

namespace std {
  template<> struct hash<D::pointer> {
    size_t operator()(D::pointer) const { throw 1; }
  };
}

int main()
{
  using UP = std::unique_ptr<int, D>;
  UP p;
  std::hash<UP> h;
  try {
    h(p);
  } catch (int) {
  }
}

Reply via email to