summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2024-03-01 10:17:38 -0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-03 17:55:33 +0000
commit922370814a0c8f258153c560ba7797f481531eee (patch)
treedc42f7755c376e734c29e69c2e764dd9643338a6
parentcc21debd36869b26b3deeb711b0814c883147bde (diff)
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 Change-Id: I01ec3c774d9943adb903fffd17b8b6ceed6ef9e2 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> (cherry picked from commit 48cd6867578ef372bbacb16081414b506cdb5b38) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/corelib/global/qfloat16.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/corelib/global/qfloat16.h b/src/corelib/global/qfloat16.h
index 80b2543dc1..a9527544d7 100644
--- a/src/corelib/global/qfloat16.h
+++ b/src/corelib/global/qfloat16.h
@@ -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[];