https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114817
--- Comment #3 from Arthur O'Dwyer <arthur.j.odwyer at gmail dot com> --- https://github.com/boostorg/container/issues/153 , from 2020, is another similar issue. There, boost::container::vector had assumed that if __has_trivial_copy(T) and is_copy_constructible_v<T>, then T could be relocated via memcpy; but in fact __has_trivial_copy(T) is also true for move-only types. So it was possible to create a type such that (__has_trivial_copy(T) && __is_constructible(T, T&)) and yet not __is_trivially_constructible(T, T&). // https://godbolt.org/z/x5Wda1M6E struct T { template<class U> T(U&&); T(T&&); ~T(); }; static_assert(__has_trivial_copy(T) && __is_constructible(T, T&)); // ...and yet... static_assert(not __is_trivially_constructible(T, T&));