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++`.