https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72792
Bug ID: 72792 Summary: allocator_traits is too strict about rebinding Product: gcc Version: 6.1.1 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- #include <memory> template<typename T, int = 0> struct Alloc { using value_type = T; T* allocate(std::size_t n) { throw std::bad_alloc(); } void deallocate(T*, std::size_t n) { } }; std::allocator_traits<Alloc<int>>::pointer p; /home/jwakely/gcc/7/include/c++/7.0.0/bits/alloc_traits.h: In instantiation of ‘struct std::allocator_traits<Alloc<int> >’: alloc.cc:11:34: required from here /home/jwakely/gcc/7/include/c++/7.0.0/bits/alloc_traits.h:187:7: error: static assertion failed: allocator defines rebind or is like Alloc<T, Args> static_assert(!is_same<rebind_alloc<value_type>, __undefined>::value, ^~~~~~~~~~~~~ The standard says that the instantiation of allocator_traits<Alloc<T, int>>::rebind_alloc should be ill-formed, but the assertion fires even when it isn't instantiated.