From cf26c939d7b895705fdfcb32b5e1fe1cb6ed69fe Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 11 Dec 2023 11:04:47 +0100 Subject: [PATCH] Fix return value of qbswap(qint128) Should be qint128, not quint128. [ChangeLog][QtCore][QtEndian] Fixed return type of qbswap(qint128) (was: quint128). No tests for this exist, so no wonder it fell through. Added them. Amends befda1accab417ce5f55cb11816e6ded51af55e3. Change-Id: Ibf87724b1d500081caca46af1c598975964e04c0 Reviewed-by: Ivan Solovev (cherry picked from commit 7a829eaf51853e0852db28b8b8223e1a62a3db0c) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit 377066e40799fe64cd823d1d69aea7cd539d04b4) --- src/corelib/global/qendian.h | 2 +- .../corelib/global/qtendian/tst_qtendian.cpp | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h index 60c4a7b1742..8c3b5e43743 100644 --- a/src/corelib/global/qendian.h +++ b/src/corelib/global/qendian.h @@ -116,7 +116,7 @@ inline constexpr quint128 qbswap(quint128 source) return result; } -inline constexpr quint128 qbswap(qint128 source) +inline constexpr qint128 qbswap(qint128 source) { return qint128(qbswap(quint128(source))); } diff --git a/tests/auto/corelib/global/qtendian/tst_qtendian.cpp b/tests/auto/corelib/global/qtendian/tst_qtendian.cpp index 885e693c8d9..441256abc1b 100644 --- a/tests/auto/corelib/global/qtendian/tst_qtendian.cpp +++ b/tests/auto/corelib/global/qtendian/tst_qtendian.cpp @@ -7,6 +7,12 @@ #include #include +#if QT_SUPPORTS_INT128 +#define ONLY_INT128(...) __VA_ARGS__ +#else +#define ONLY_INT128(...) +#endif + class tst_QtEndian: public QObject { Q_OBJECT @@ -41,6 +47,9 @@ private slots: struct TestData { + ONLY_INT128( + quint128 data128; + ) quint64 data64; quint32 data32; quint16 data16; @@ -57,6 +66,9 @@ template <> quint8 getData(const TestData &d) { return d.data8; } template <> quint16 getData(const TestData &d) { return d.data16; } template <> quint32 getData(const TestData &d) { return d.data32; } template <> quint64 getData(const TestData &d) { return d.data64; } +ONLY_INT128( +template <> quint128 getData(const TestData &d) { return d.data128; } +) template <> float getData(const TestData &d) { return d.dataFloat; } union RawTestData @@ -74,6 +86,9 @@ Float int2Float(typename QIntegerForSizeof::Unsigned i) } static const TestData inNativeEndian = { + ONLY_INT128( + Q_UINT128_C(0x0123'4567'89ab'cdef'18ba'df00'd1da'cafe), + ) Q_UINT64_C(0x0123456789abcdef), 0x00c0ffee, 0xcafe, @@ -83,6 +98,9 @@ static const TestData inNativeEndian = { '\0' }; static const RawTestData inBigEndian = { + ONLY_INT128( + "\x01\x23\x45\x67\x89\xab\xcd\xef\x18\xba\xdf\x00\xd1\xda\xca\xfe" + ) "\x01\x23\x45\x67\x89\xab\xcd\xef" "\x00\xc0\xff\xee" "\xca\xfe" @@ -91,6 +109,9 @@ static const RawTestData inBigEndian = { "\x01\x23\x45\x67\x89\xab\xcd\xef" }; static const RawTestData inLittleEndian = { + ONLY_INT128( + "\xfe\xca\xda\xd1\x00\xdf\xba\x18\xef\xcd\xab\x89\x67\x45\x23\x01" + ) "\xef\xcd\xab\x89\x67\x45\x23\x01" "\xee\xff\xc0\x00" "\xfe\xca" @@ -102,12 +123,18 @@ static const RawTestData inLittleEndian = { #define EXPAND_ENDIAN_TEST(endian) \ do { \ /* Unsigned tests */ \ + ONLY_INT128( \ + ENDIAN_TEST(endian, quint, 128); \ + ) \ ENDIAN_TEST(endian, quint, 64); \ ENDIAN_TEST(endian, quint, 32); \ ENDIAN_TEST(endian, quint, 16); \ ENDIAN_TEST(endian, quint, 8); \ \ /* Signed tests */ \ + ONLY_INT128( \ + ENDIAN_TEST(endian, qint, 128); \ + ) \ ENDIAN_TEST(endian, qint, 64); \ ENDIAN_TEST(endian, qint, 32); \ ENDIAN_TEST(endian, qint, 16); \ @@ -117,6 +144,8 @@ static const RawTestData inLittleEndian = { #define ENDIAN_TEST(endian, type, size) \ do { \ + static_assert(std::is_same_v())), \ + type ## size>); \ QCOMPARE(qFrom ## endian ## Endian( \ (type ## size)(in ## endian ## Endian.data.data ## size)), \ (type ## size)(inNativeEndian.data ## size)); \