https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118346
Bug ID: 118346 Summary: Access to member inherited from virtual base class forbidden in GCC with temporary null pointer instance Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: wangbopku15 at gmail dot com Target Milestone: --- The following code does not compile in GCC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct A { int i; }; struct C : virtual public A { }; int main (){ auto res = ((C*)0)->i; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The diagnostic is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <source>: In function 'int main()': <source>:5:25: error: invalid access to non-static data member 'A::i' in virtual base of NULL object 5 | auto res = ((C*)0)->i; | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Actually, I'm not sure whether this should be valid, but the following code appears to work in GCC: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct A { int i; }; struct C : virtual public A { }; int main (){ auto res = ((C*)0)->A::i; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ https://godbolt.org/z/rY9Yh6jrG Also note that if the instance here is not a temporary variable, it works: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct A { int i; }; struct C : virtual public A { }; int main (){ auto no_temporary = (C*)0; auto res = no_temporary->i; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ https://godbolt.org/z/Mj4ffoahE MSVC, EDG, and Clang always accept it: https://godbolt.org/z/aq6ojdPz7