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.

Reply via email to