https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121068
--- Comment #17 from Jason Merrill <jason at gcc dot gnu.org> --- OK, the issue is that we currently don't represent trivial initialization at all, so the initial placement new has no effect. Then the trivial destructors are represented by clobbers, but constant evaluation doesn't currently do anything with them (before my WIP patch). Then the individual construction starts with a clobber that the evaluator ignores. Then the constructor starts to initialize the individual member, but that's not directly initializing the union member, so it gets rejected. As in the WIP patch I think the solution is to represent trivial initialization by clobbering the object instead of doing nothing.