QVariant: fix comparisons between strings and integer 0

250ca8d5f8bb3771695ae8eccb8d9b469003d840 changed the qConvertToNumber
to have a std::optional return instead of a boolean out-argument.

In doing so a code path that was supposed to report a failure (string
could not be converted to an integer) accidentally starting reporting
success (and converting the string to 0).

The problem is that the `ok` check from QString::toLongLong was
accidentally dropped in the refactoring; previously the function set
`ok` to false and returned 0, now the function just returns 0.

Instead, amend that return to return nullopt (because the conversion has
failed).

Change-Id: Iaedef5463f3ec500a97bd4c9bbddf977f66df61a
Fixes: QTBUG-111867
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
(cherry picked from commit a25644aecf056b9b021189de5384519b6f06c1e6)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Giuseppe D'Angelo 2023-03-10 15:32:04 +01:00 committed by Qt Cherry-pick Bot
parent f4b1a9b8bd
commit 7d86115a17
2 changed files with 28 additions and 1 deletions

View File

@ -125,7 +125,7 @@ static std::optional<qlonglong> qConvertToNumber(const QVariant::Private *d, boo
if (s == "true"_L1 || s == "1"_L1)
return 1;
}
return 0;
return std::nullopt;
}
case QMetaType::QChar:
return d->get<QChar>().unicode();

View File

@ -1568,6 +1568,10 @@ void tst_QVariant::operator_eq_eq_data()
QVariant mIntString(QByteArray("-42"));
QVariant mIntQString(QString("-42"));
QVariant mIntZero(0);
QVariant mIntStringZero(QByteArray("0"));
QVariant mIntQStringZero(QString("0"));
QVariant mUInt(42u);
QVariant mUIntString(QByteArray("42"));
QVariant mUIntQString(QString("42"));
@ -1608,6 +1612,9 @@ void tst_QVariant::operator_eq_eq_data()
QVariant mBoolString(QByteArray("false"));
QVariant mBoolQString(QString("false"));
QVariant mTextString(QByteArray("foobar"));
QVariant mTextQString(QString("foobar"));
QTest::newRow( "double_int" ) << QVariant(42.0) << QVariant(42) << true;
QTest::newRow( "float_int" ) << QVariant(42.f) << QVariant(42) << true;
QTest::newRow( "mInt_mIntString" ) << mInt << mIntString << false;
@ -1615,6 +1622,21 @@ void tst_QVariant::operator_eq_eq_data()
QTest::newRow( "mInt_mIntQString" ) << mInt << mIntQString << true;
QTest::newRow( "mIntQString_mInt" ) << mIntQString << mInt << true;
QTest::newRow( "mIntZero_mIntStringZero" ) << mIntZero << mIntStringZero << false;
QTest::newRow( "mIntStringZero_mIntZero" ) << mIntStringZero << mIntZero << false;
QTest::newRow( "mIntZero_mIntQStringZero" ) << mIntZero << mIntQStringZero << true;
QTest::newRow( "mIntQStringZero_mIntZero" ) << mIntQStringZero << mIntZero << true;
QTest::newRow( "mInt_mTextString" ) << mInt << mTextString << false;
QTest::newRow( "mTextString_mInt" ) << mTextString << mInt << false;
QTest::newRow( "mInt_mTextQString" ) << mInt << mTextQString << false;
QTest::newRow( "mTextQString_mInt" ) << mTextQString << mInt << false;
QTest::newRow( "mIntZero_mTextString" ) << mIntZero << mTextString << false;
QTest::newRow( "mTextString_mIntZero" ) << mTextString << mIntZero << false;
QTest::newRow( "mIntZero_mTextQString" ) << mIntZero << mTextQString << false;
QTest::newRow( "mTextQString_mIntZero" ) << mTextQString << mIntZero << false;
QTest::newRow( "mUInt_mUIntString" ) << mUInt << mUIntString << false;
QTest::newRow( "mUIntString_mUInt" ) << mUIntString << mUInt << false;
QTest::newRow( "mUInt_mUIntQString" ) << mUInt << mUIntQString << true;
@ -1625,6 +1647,11 @@ void tst_QVariant::operator_eq_eq_data()
QTest::newRow( "mDouble_mDoubleQString" ) << mDouble << mDoubleQString << true;
QTest::newRow( "mDoubleQString_mDouble" ) << mDoubleQString << mDouble << true;
QTest::newRow( "mDouble_mTextString" ) << mDouble << mTextString << false;
QTest::newRow( "mTextString_mDouble" ) << mTextString << mDouble << false;
QTest::newRow( "mDouble_mTextQString" ) << mDouble << mTextQString << false;
QTest::newRow( "mTextQString_mDouble" ) << mTextQString << mDouble << false;
QTest::newRow( "mFloat_mFloatString" ) << mFloat << mFloatString << false;
QTest::newRow( "mFloatString_mFloat" ) << mFloatString << mFloat << false;
QTest::newRow( "mFloat_mFloatQString" ) << mFloat << mFloatQString << true;