https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108993
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever confirmed|0 |1 Last reconfirmed| |2023-04-21 --- Comment #9 from Jonathan Wakely <redi at gcc dot gnu.org> --- Confirmed. using size_t = decltype(sizeof(0)); extern "C" void* memset(void*, int, size_t); extern "C" int printf(const char*, ...); void* operator new(size_t, void* p) { return p; } struct Base { Base() {} // user-provided constructor int x; }; struct Derived : public Base { Derived() = default; // default constructor satisfying (2) of // https://en.cppreference.com/w/cpp/language/value_initialization private: int y; }; int main () { char b_mem[sizeof(Derived)]; memset(b_mem, 0x55, sizeof(Derived)); printf("b_mem[0]: %d\n", int(b_mem[0])); Derived* b = new(b_mem) Derived{}; printf("b->x (should be 0): %d\n", b->x); b->~Derived(); } With any optimization level except -O0 this prints: b_mem[0]: 85 b->x (should be 0): 1431655765