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

Reply via email to