https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119969
Bug ID: 119969
Summary: incorrectly omitted initialization at -O2
Product: gcc
Version: 15.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: bbi5291 at gmail dot com
Target Milestone: ---
Apologies, I do not know how to write a better title.
The following code is miscompiled by GCC 12/13/14/15 at -O2 (but not -O1 or
-O3):
---
struct S {};
using PMF = void (S::*)();
using Block = PMF[16];
using BlockPtr = Block*;
struct IteratorImp {
Block** d_blockPtr_p;
PMF* d_value_p;
void operator++();
PMF& operator*() const { return *d_value_p; }
};
void IteratorImp::operator++() {
int offset = 1 + (d_value_p - **d_blockPtr_p);
d_blockPtr_p += offset / 16;
d_value_p = **d_blockPtr_p + (offset % 16);
}
struct iterator {
IteratorImp d_imp;
};
struct D {
Block* d_blockPtrs[1];
Block d_block;
PMF* d_start_p;
};
D mX;
void privateInit(int numElements) {
mX.d_blockPtrs[0] = &mX.d_block;
mX.d_start_p = mX.d_block + (numElements + 7);
}
int main() {
privateInit(0);
iterator cbgn = {{mX.d_blockPtrs, mX.d_block + 7}};
auto clast = cbgn;
++clast.d_imp;
if (&*cbgn.d_imp == &*clast.d_imp) return 1;
}
---
Godbolt link: https://godbolt.org/z/dE5WjeE11
Starting from GCC 12, the instruction
mov QWORD PTR [rsp+8], OFFSET FLAT:mX+120
appears to be omitted from the assembly, resulting in some nonsense value when
`d_value_p` is read by `operator++`.