https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118302
Bug ID: 118302 Summary: Invalid 'static_cast' from derived type to private based type is not rejected during in-class initialization of static const member of template class 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: --- GCC generates no error for the invalid 'static_cast' statement in the following test: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct Base {}; struct Derived : private Base {}; template <typename T> struct A { static const int N = sizeof(static_cast<Base>(Derived())); }; int main(){ A<int> aa; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As a comparison, clang rejects it with: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <source>:6:53: error: cannot cast 'Derived' to its private base class 'Base' 6 | static const int N = sizeof(static_cast<Base>(Derived())); | ^ <source>:3:18: note: declared private here 3 | struct Derived : private Base {}; | ^~~~~~~~~~~~ <source>:6:53: error: cannot cast 'Derived' to its private base class 'Base' 6 | static const int N = sizeof(static_cast<Base>(Derived())); | ^ <source>:10:16: note: in instantiation of template class 'A<int>' requested here 10 | A<int> aa; | ^ <source>:3:18: note: declared private here 3 | struct Derived : private Base {}; | ^~~~~~~~~~~~ 2 errors generated. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MSVC with: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <source>(6): error C2243: 'type cast': conversion from 'Derived *' to 'Base &&' exists, but is inaccessible <source>(6): note: the template instantiation context (the oldest one first) is <source>(10): note: see reference to class template instantiation 'A<int>' being compiled Compiler returned: 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note that the code can be correctly rejected if 'A' is not a template class. https://godbolt.org/z/6hdMsod6P