https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111773
Bug ID: 111773
Summary: Inconsistent optimization of replaced operator new()
Product: gcc
Version: 13.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: vlad at solidsands dot nl
Target Milestone: ---
#include <new>
#include <cstdint>
#include <cstdio>
int a[10];
void* operator new(std::size_t) {
return a;
}
int main() {
int* p = static_cast<int*>(::operator new(sizeof(int)));
std::ptrdiff_t x = a - p;
printf("%ld %d", x, x == 0);
return 0;
}
Here, GCC with -O1 optimizes 'x' to 0 and 'x == 0' to false at the same time.
Compiler explorer link: https://godbolt.org/z/4Y3eeY56r
---
Also, possibly related:
#include <new>
void* operator new(std::size_t sz)
{
throw std::bad_alloc{};
}
int main()
{
int* p1 = static_cast<int*>(::operator new(sizeof(int)));
return 10;
}
Here, again with -O1, terminate is not called, and the program returned
successfully. However, the program returned 0 instead of 10.
Compiler explorer link: https://godbolt.org/z/9oczTzP7s