From a32424b46cd3ef6fd8d644354e3cec434d5ab951 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 15 Nov 2016 17:15:56 +0100 Subject: [PATCH] AreArgumentsNarrowedBase: Correct logic for narrowing connect() casts The prior test deemed there to be narrowing if source and destination integral-or-enum types didn't have the same signedness; but all values of an unsigned source type can be represented in a larger signed destination type, so there is no narrowing in this case. Updated QObject test-case to match. Change-Id: I517a5997adcad70e185d7469a8d26788e463cb75 Reviewed-by: Giuseppe D'Angelo --- src/corelib/kernel/qobjectdefs_impl.h | 10 ++++- .../corelib/kernel/qobject/tst_qobject.cpp | 40 +++++++++---------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/corelib/kernel/qobjectdefs_impl.h b/src/corelib/kernel/qobjectdefs_impl.h index e94e713e1fb..79c9c8303e6 100644 --- a/src/corelib/kernel/qobjectdefs_impl.h +++ b/src/corelib/kernel/qobjectdefs_impl.h @@ -229,8 +229,14 @@ namespace QtPrivate { (std::is_floating_point::value && std::is_integral::value) || (std::is_floating_point::value && std::is_floating_point::value && sizeof(From) > sizeof(To)) || ((std::is_integral::value || std::is_enum::value) && std::is_floating_point::value) || - (std::is_integral::value && std::is_integral::value && (sizeof(From) > sizeof(To) || std::is_signed::value != std::is_signed::value)) || - (std::is_enum::value && std::is_integral::value && (sizeof(From) > sizeof(To) || IsEnumUnderlyingTypeSigned::value != std::is_signed::value)) + (std::is_integral::value && std::is_integral::value + && (sizeof(From) > sizeof(To) + || (std::is_signed::value ? !std::is_signed::value + : (std::is_signed::value && sizeof(From) == sizeof(To))))) || + (std::is_enum::value && std::is_integral::value + && (sizeof(From) > sizeof(To) + || (IsEnumUnderlyingTypeSigned::value ? !std::is_signed::value + : (std::is_signed::value && sizeof(From) == sizeof(To))))) > { }; diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index 0f7f75fb2e2..91810cdcd84 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -6969,10 +6969,10 @@ void tst_QObject::checkArgumentsForNarrowing() QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); @@ -6980,23 +6980,23 @@ void tst_QObject::checkArgumentsForNarrowing() QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QCOMPARE((QtPrivate::AreArgumentsNarrowedBase::value), sizeof(int) >= sizeof(long)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QCOMPARE((QtPrivate::AreArgumentsNarrowedBase::value), sizeof(long) >= sizeof(long long)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); @@ -7206,28 +7206,28 @@ void tst_QObject::checkArgumentsForNarrowing() QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QCOMPARE((QtPrivate::AreArgumentsNarrowedBase::value), sizeof(ScopedEnumBackedByUInt) >= sizeof(long)); + QVERIFY((!QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); - QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); + QCOMPARE((QtPrivate::AreArgumentsNarrowedBase::value), sizeof(ScopedEnumBackedByULong) >= sizeof(long long)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value)); QVERIFY((QtPrivate::AreArgumentsNarrowedBase::value));