qfloat16: make native std::numeric_limits<qfloat16> constexpr

In C++23 with std::float16_t present (QFLOAT16_IS_NATIVE), the
_limit_xxxx() methods in qfloat16 need to set the native type, not rely
on the union trick because that isn't allowed in constexpr mode.

                    in ‘constexpr’ expansion of ‘operator<=>(Max, std::numeric_limits<double>::max())’
qfloat16.h:209:5:   in ‘constexpr’ expansion of ‘compareThreeWay((* & lhs), ((double)rhs))’
qfloat16.h:209:5:   in ‘constexpr’ expansion of ‘(& lhs)->qfloat16::operator NativeType()’
    error: accessing ‘qfloat16::<unnamed union>::nf’ member instead of initialized ‘qfloat16::<unnamed union>::b16’ member in constant expression

Pick-to: 6.7
Change-Id: I01ec3c774d9943adb903fffd17b8b6ceed6ef9e2
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
bb10
Thiago Macieira 2024-03-01 10:17:38 -08:00
parent 89fc58127d
commit 48cd686757
1 changed files with 7 additions and 1 deletions

View File

@ -118,7 +118,13 @@ private:
NativeType nf;
#endif
};
constexpr inline explicit qfloat16(Wrap nibble) noexcept : b16(nibble.b16) {}
constexpr inline explicit qfloat16(Wrap nibble) noexcept :
#if QFLOAT16_IS_NATIVE && defined(__cpp_lib_bit_cast)
nf(std::bit_cast<NativeType>(nibble.b16))
#else
b16(nibble.b16)
#endif
{}
Q_CORE_EXPORT static const quint32 mantissatable[];
Q_CORE_EXPORT static const quint32 exponenttable[];