diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index e5bb6966130..beac877a1f2 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1275,28 +1275,6 @@ namespace QtPrivate { template constexpr bool IsUnsignedEnum = !std::is_signed_v>; - template - struct QMetaTypeTypeFlags - { - enum { Flags = (QTypeInfo::isRelocatable ? QMetaType::RelocatableType : 0) - | ((!std::is_default_constructible_v || !QTypeInfo::isValueInitializationBitwiseZero) ? QMetaType::NeedsConstruction : 0) - | (!std::is_trivially_destructible_v ? QMetaType::NeedsDestruction : 0) - | (!std::is_trivially_copy_constructible_v ? QMetaType::NeedsCopyConstruction : 0) - | (!std::is_trivially_move_constructible_v ? QMetaType::NeedsMoveConstruction : 0) - | (IsPointerToTypeDerivedFromQObject::Value ? QMetaType::PointerToQObject : 0) - | (IsSharedPointerToTypeDerivedFromQObject::Value ? QMetaType::SharedPointerToQObject : 0) - | (IsWeakPointerToTypeDerivedFromQObject::Value ? QMetaType::WeakPointerToQObject : 0) - | (IsTrackingPointerToTypeDerivedFromQObject::Value ? QMetaType::TrackingPointerToQObject : 0) - | (IsEnumOrFlags::value ? QMetaType::IsEnumeration : 0) - | (IsGadgetHelper::IsGadgetOrDerivedFrom ? QMetaType::IsGadget : 0) - | (IsPointerToGadgetHelper::IsGadgetOrDerivedFrom ? QMetaType::PointerToGadget : 0) - | (std::is_pointer_v ? QMetaType::IsPointer : 0) - | (IsUnsignedEnum ? QMetaType::IsUnsignedEnumeration : 0) - | (IsQmlListType ? QMetaType::IsQmlList : 0) - | (std::is_const_v> ? QMetaType::IsConst : 0) - }; - }; - template struct MetaTypeDefinedHelper { @@ -2427,7 +2405,44 @@ class QMetaTypeForType { public: static constexpr decltype(typenameHelper()) name = typenameHelper(); - static constexpr unsigned Flags = QMetaTypeTypeFlags::Flags; + + static constexpr unsigned flags() + { + uint flags = 0; + if constexpr (QTypeInfo::isRelocatable) + flags |= QMetaType::RelocatableType; + if constexpr (!std::is_default_constructible_v || !QTypeInfo::isValueInitializationBitwiseZero) + flags |= QMetaType::NeedsConstruction; + if constexpr (!std::is_trivially_destructible_v) + flags |= QMetaType::NeedsDestruction; + if constexpr (!std::is_trivially_copy_constructible_v) + flags |= QMetaType::NeedsCopyConstruction; + if constexpr (!std::is_trivially_move_constructible_v) + flags |= QMetaType::NeedsMoveConstruction; + if constexpr (IsPointerToTypeDerivedFromQObject::Value) + flags |= QMetaType::PointerToQObject; + if constexpr (IsSharedPointerToTypeDerivedFromQObject::Value) + flags |= QMetaType::SharedPointerToQObject; + if constexpr (IsWeakPointerToTypeDerivedFromQObject::Value) + flags |= QMetaType::WeakPointerToQObject; + if constexpr (IsTrackingPointerToTypeDerivedFromQObject::Value) + flags |= QMetaType::TrackingPointerToQObject; + if constexpr (IsEnumOrFlags::value) + flags |= QMetaType::IsEnumeration; + if constexpr (IsGadgetHelper::IsGadgetOrDerivedFrom) + flags |= QMetaType::IsGadget; + if constexpr (IsPointerToGadgetHelper::IsGadgetOrDerivedFrom) + flags |= QMetaType::PointerToGadget; + if constexpr (std::is_pointer_v) + flags |= QMetaType::IsPointer; + if constexpr (IsUnsignedEnum) + flags |= QMetaType::IsUnsignedEnumeration; + if constexpr (IsQmlListType) + flags |= QMetaType::IsQmlList; + if constexpr (std::is_const_v>) + flags |= QMetaType::IsConst; + return flags; + } static constexpr QMetaTypeInterface::DefaultCtrFn getDefaultCtr() { @@ -2502,7 +2517,7 @@ struct QMetaTypeInterfaceWrapper /*.revision=*/ QMetaTypeInterface::CurrentRevision, /*.alignment=*/ alignof(T), /*.size=*/ sizeof(T), - /*.flags=*/ QMetaTypeForType::Flags, + /*.flags=*/ QMetaTypeForType::flags(), /*.typeId=*/ BuiltinMetaType::value, /*.metaObjectFn=*/ MetaObjectForType::metaObjectFunction, /*.name=*/ QMetaTypeForType::getName(), diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index a510a0a680c..a36f5c6fc80 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -5874,7 +5874,7 @@ void tst_QVariant::equalsWithoutMetaObject() /*.revision=*/ 0, /*.alignment=*/ alignof(T), /*.size=*/ sizeof(T), - /*.flags=*/ QtPrivate::QMetaTypeTypeFlags::Flags, + /*.flags=*/ QtPrivate::QMetaTypeForType::flags(), /*.typeId=*/ 0, /*.metaObject=*/ nullptr, // on purpose. /*.name=*/ "NoMetaObject*",