diff --git a/src/corelib/compat/removed_api.cpp b/src/corelib/compat/removed_api.cpp index c5ec16a2467..bee1b27f7c1 100644 --- a/src/corelib/compat/removed_api.cpp +++ b/src/corelib/compat/removed_api.cpp @@ -984,6 +984,13 @@ QDataStream &QDataStream::operator<<(bool i) return (*this << qint8(i)); } +#include "qdebug.h" + +Q_CORE_EXPORT void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, int value) +{ + qt_QMetaEnum_flagDebugOperator(debug, sizeofT, uint(value)); +} + #include "qdir.h" // inlined API bool QDir::operator==(const QDir &dir) const diff --git a/src/corelib/io/qdebug.cpp b/src/corelib/io/qdebug.cpp index 42515be1187..d5bdfadba92 100644 --- a/src/corelib/io/qdebug.cpp +++ b/src/corelib/io/qdebug.cpp @@ -1323,13 +1323,13 @@ QDebugStateSaver::~QDebugStateSaver() \internal Specialization of the primary template in qdebug.h to out-of-line - the common case of QFlags::Int being int. + the common case of QFlags::Int being 32-bit. Just call the generic version so the two don't get out of sync. */ -void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, int value) +void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, uint value) { - qt_QMetaEnum_flagDebugOperator(debug, sizeofT, value); + qt_QMetaEnum_flagDebugOperator(debug, sizeofT, value); } #ifndef QT_NO_QOBJECT diff --git a/src/corelib/io/qdebug.h b/src/corelib/io/qdebug.h index f941bf40cb0..d311b74c1c0 100644 --- a/src/corelib/io/qdebug.h +++ b/src/corelib/io/qdebug.h @@ -523,11 +523,13 @@ inline QDebug operator<<(QDebug debug, const QTaggedPointer &ptr) return debug; } -Q_CORE_EXPORT void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, int value); +Q_CORE_EXPORT void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, uint value); template void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, Int value) { + static_assert(std::is_unsigned_v, + "Cast value to an unsigned type before calling this function"); const QDebugStateSaver saver(debug); debug.resetFormat(); debug.nospace() << "QFlags(" << Qt::hex << Qt::showbase; @@ -591,7 +593,8 @@ template inline QDebug qt_QMetaEnum_flagDebugOperator_helper(QDebug debug, const QFlags &flags) #endif { - qt_QMetaEnum_flagDebugOperator(debug, sizeof(T), typename QFlags::Int(flags)); + using UInt = typename QIntegerForSizeof::Unsigned; + qt_QMetaEnum_flagDebugOperator(debug, sizeof(T), UInt(flags.toInt())); return debug; } diff --git a/tests/auto/corelib/io/qdebug/tst_qdebug.cpp b/tests/auto/corelib/io/qdebug/tst_qdebug.cpp index 8bc2985a46d..d5078922ef0 100644 --- a/tests/auto/corelib/io/qdebug/tst_qdebug.cpp +++ b/tests/auto/corelib/io/qdebug/tst_qdebug.cpp @@ -1085,7 +1085,8 @@ void tst_QDebug::qDebugQByteArrayView() const enum TestEnum { Flag1 = 0x1, - Flag2 = 0x10 + Flag2 = 0x10, + SignFlag = INT_MIN, }; Q_DECLARE_FLAGS(TestFlags, TestEnum) @@ -1094,7 +1095,7 @@ void tst_QDebug::qDebugQFlags() const { QString file, function; int line = 0; - QFlags flags(Flag1 | Flag2); + QFlags flags(Flag1 | Flag2 | SignFlag); MessageHandlerSetter mhs(myMessageHandler); { qDebug() << flags; } @@ -1102,7 +1103,7 @@ void tst_QDebug::qDebugQFlags() const file = __FILE__; line = __LINE__ - 2; function = Q_FUNC_INFO; #endif QCOMPARE(s_msgType, QtDebugMsg); - QCOMPARE(s_msg, QString::fromLatin1("QFlags(0x1|0x10)")); + QCOMPARE(s_msg, QString::fromLatin1("QFlags(0x1|0x10|0x80000000)")); QCOMPARE(QString::fromLatin1(s_file), file); QCOMPARE(s_line, line); QCOMPARE(QString::fromLatin1(s_function), function);