https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120053
Bug ID: 120053 Summary: __is_trivially_constructible() requiring default member initializer unnecessarily Product: gcc Version: 16.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: thiago at kde dot org Target Milestone: --- Testcase: #include <type_traits> template <bool ShouldWarn> struct QThreadStorageTraits { }; template <class T> struct QThreadStorage { using Trait = QThreadStorageTraits<std::is_trivially_default_constructible_v<T>>; }; struct QQuick3DProfilerSceneGraphData { struct Timings { unsigned nesting = 0; }; template<unsigned size> struct TimingData { Timings timings[size]; }; QThreadStorage<TimingData<1>> eventTimings; }; With GCC 14, 15 and trunk (in Godbolt), this produces: type_traits:3584:7: error: default member initializer for 'QQuick3DProfilerSceneGraphData::Timings::nesting' required before the end of its enclosing class 3584 | = __is_trivially_constructible(_Tp); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This doesn't make sense. It looks like an internal state bug. Godbolt run: https://gcc.godbolt.org/z/6nf7sGMP7 Fortunately, this identified a type that ought to have been trivial and wasn't.