https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94992
--- Comment #3 from Rafael Avila de Espindola <rafael at espindo dot la> --- For completeness, this is a reduction of a std::swap(x,x). The placement new was originally in the move assignment operator. I was able to reproduce this with gcc 9 by moving a few functions out of line. As far as I can tell, the relevant standard line is from basic.life: The lifetime of an object \placeholder{o} of type \tcode{T} ends when: ... \item the storage which the object occupies is released, or is reused by an object that is not nested within \placeholder{o}\iref{intro.object}.