diff --git a/src/corelib/global/qfloat16.cpp b/src/corelib/global/qfloat16.cpp index b8e7cbe928f..376d6440e0a 100644 --- a/src/corelib/global/qfloat16.cpp +++ b/src/corelib/global/qfloat16.cpp @@ -363,6 +363,20 @@ Q_CORE_EXPORT void qFloatFromFloat16(float *out, const qfloat16 *in, qsizetype l out[i] = float(in[i]); } +/*! + \fn size_t qfloat16::qHash(qfloat16 key, size_t seed) + \since 6.5.4 + \relates qfloat16 + + Returns the hash value for the \a key, using \a seed to seed the + calculation. + + \note In Qt versions before 6.5, this operation was provided by the + qHash(float) overload. In Qt versions 6.5.0 to 6.5.3, this functionality + was broken in various ways. In Qt versions 6.5.4 and 6.6 onwards, this + overload restores the Qt 6.4 behavior. +*/ + #ifndef QT_NO_DATASTREAM /*! \fn qfloat16::operator<<(QDataStream &ds, qfloat16 f) diff --git a/src/corelib/global/qfloat16.h b/src/corelib/global/qfloat16.h index 76ea990c33b..15dab5e7139 100644 --- a/src/corelib/global/qfloat16.h +++ b/src/corelib/global/qfloat16.h @@ -6,8 +6,10 @@ #define QFLOAT16_H #include +#include #include #include + #include #include @@ -144,6 +146,9 @@ private: friend inline qfloat16 operator*(qfloat16 a, qfloat16 b) noexcept { return qfloat16(static_cast(a) * static_cast(b)); } friend inline qfloat16 operator/(qfloat16 a, qfloat16 b) noexcept { return qfloat16(static_cast(a) / static_cast(b)); } + friend size_t qHash(qfloat16 key, size_t seed = 0) noexcept + { return qHash(float(key), seed); } // 6.4 algorithm, so keep using it; ### Qt 7: fix QTBUG-116077 + #define QF16_MAKE_ARITH_OP_FP(FP, OP) \ friend inline FP operator OP(qfloat16 lhs, FP rhs) noexcept { return static_cast(lhs) OP rhs; } \ friend inline FP operator OP(FP lhs, qfloat16 rhs) noexcept { return lhs OP static_cast(rhs); } diff --git a/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp b/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp index 69e401ae66f..8618a03d142 100644 --- a/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp +++ b/tests/auto/corelib/tools/qhashfunctions/tst_qhashfunctions.cpp @@ -107,16 +107,10 @@ void tst_QHashFunctions::consistent() // floats { const/*expr broken: QTBUG-116079*/ qfloat16 f16 = -42.f; -#if !QFLOAT16_IS_NATIVE // QTBUG-116064 const auto h16 = qHash(f16, seed); -#endif const auto h32 = qHash(float(f16), seed); const auto h64 = qHash(double(f16), seed); -#if !QFLOAT16_IS_NATIVE // QTBUG-116064 - if (seed != 0) - QEXPECT_FAIL("", "QTBUG-116076", Continue); QCOMPARE(h16, h32); -#endif QEXPECT_FAIL("", "QTBUG-116077", Continue); QCOMPARE(h32, h64); }