https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104512
Bug ID: 104512 Summary: [c++20] consteval constructor does not need to initialize all data members Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: fchelnokov at gmail dot com Target Milestone: --- In the next program struct B has immediate consteval default constructor, which does not initialize i field. Then this constructor is used to make a temporary and its i field remains untouched: ``` struct B { bool b = true; int i; consteval B() {} }; static_assert( B{}.b ); ``` Clang and MSVC are fine with it. But GCC complains: error: 'B{true}' is not a constant expression 7 | static_assert( B{}.b ); | ^ error: 'B()' is not a constant expression because it refers to an incompletely initialized variable Demo: https://gcc.godbolt.org/z/x4n6ezrhT The requirement that "every non-variant non-static data member must be initialized" in constexpr/consteval constructor is removed since c++20. Related discussion: https://stackoverflow.com/a/71085832/7325599