https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94671
Bug ID: 94671 Summary: Wrong behavior with operator new overloading when using O2 for optimization Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: b...@odd-e.com Target Milestone: --- This bug is a similar bug as an earlier reported in clang: https://bugs.llvm.org/show_bug.cgi?id=15541 When having the overloaded new operator defined in other cpp or in a lib, g++ with O2 optimizes a new operation without assignment (or assignment to local or static), and it will not call the overloaded new at all. The following code will reproduce the problem. --------------- test.cpp: --------------- #include <iostream> #define CHECK(expect, actual) std::cout << "EXPECT:" << expect << "\tACTUAL:"<<actual << std::endl extern bool newCalled; void testNewWithoutAssignment() { newCalled = false; new char; CHECK(1, newCalled); } static char* somechar; void testNewWithAssignmentToStatic() { newCalled = false; somechar = new char; CHECK(1, newCalled); } char *p; void testNewWithAssignment() { newCalled = false; p = new char; CHECK(1, newCalled); } int main() { testNewWithoutAssignment(); testNewWithAssignmentToStatic(); testNewWithAssignment(); return 0; } --------------- new.cpp: --------------- #include <exception> #include <new> #include <cstdlib> extern bool newCalled; bool newCalled = false; void* operator new (size_t size) throw (std::bad_alloc) { newCalled = true; return malloc(size); } ----------- I know this is an optimization (it doesn't happen with -O0)... but it does break the C++ standard.