https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83136
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |rejects-valid Status|UNCONFIRMED |NEW Last reconfirmed| |2017-11-24 Ever confirmed|0 |1 --- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- Reduced: namespace std { using size_t = decltype(sizeof(0)); template<size_t N, size_t A> struct aligned_storage { struct type { alignas(A) char _data[N]; }; }; template<size_t N, size_t A> using aligned_storage_t = typename aligned_storage<N, A>::type; } template<typename T, std::size_t N> struct Storage { std::aligned_storage_t<sizeof(T), alignof(T)> data[N]; }; template<typename T> struct PoolObj { static void* operator new(std::size_t) { return &T::pool.data[0]; } static void operator delete(void*, std::size_t) { } }; template<typename T> struct Bar : PoolObj<Bar<T>> { static Storage<Bar<T>, 10> pool; }; template<typename T> Storage<Bar<T>, 10> Bar<T>::pool {}; int main() { Bar<int>* b = new Bar<int>(); delete b; } Clang and EDG accept it.