https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119746

            Bug ID: 119746
           Summary: -Wstrict-aliasing warning on calling pointer to member
                    function
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bungeman at chromium dot org
  Target Milestone: ---

Godbolt link: https://godbolt.org/z/GxGzzn1Ye

Compiling the following with -Wstrict-aliasing -O2 (or -O3) with GCC 15.0.1
(and back to 8.5)


template <typename T, auto Foo> void DoFoo(T* obj) {
    (obj->*Foo)();
}

struct Base {
    void foo() const {}
    int fRefCnt; /* removing or changing to `char` removes warning */
};

struct Derived : public Base{};

int main() {
    Derived derived;
    DoFoo<Derived, &Derived::foo>(&derived); /* warns */
    //((&derived)->*(&Derived::foo))(); /* does not warn */
    //((&derived)->*(&Base::foo))(); /* does not warn */
};


produces


<source>: In instantiation of 'void DoFoo(T*) [with T = Derived; auto Foo =
&Base::foo]':
<source>:14:43:   required from here
<source>:2:16: warning: dereferencing type-punned pointer will break
strict-aliasing rules [-Wstrict-aliasing]
     (obj->*Foo)();
     ~~~~~~~~~~~^~
Compiler returned: 0


This is surprising since there aren't any casts here so it isn't clear why any
pointer here would be considered punned.
  • [Bug c++/119746] New: -Wstrict-a... bungeman at chromium dot org via Gcc-bugs

Reply via email to