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

Reply via email to