Fix asymmetry in QVariant::cmp when A converts to B but not the opposite
This would result in (a == b) != (b == a). The == operation should be commutative as much as possible. Now, there's still an asymmetry in that b is forced to a type and the conversion may fail. QVariant should have an idea of what conversions are "promotion" and which ones are "demotion" (subject to loss of data and/or can fail), so it can do the promotion first Task-number: QTBUG-42254 Change-Id: I9fa4496bbbf0f8719ff8456cc24247290beac608 Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
This commit is contained in:
parent
8153386397
commit
849604e2f9
@ -3161,8 +3161,15 @@ bool QVariant::cmp(const QVariant &v) const
|
||||
else
|
||||
return toLongLong() == v.toLongLong();
|
||||
}
|
||||
if (!v2.canConvert(v1.d.type) || !v2.convert(v1.d.type))
|
||||
return false;
|
||||
if (v2.canConvert(v1.d.type)) {
|
||||
if (!v2.convert(v1.d.type))
|
||||
return false;
|
||||
} else {
|
||||
// try the opposite conversion, it might work
|
||||
qSwap(v1, v2);
|
||||
if (!v2.convert(v1.d.type))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (v1.d.type >= QMetaType::User) {
|
||||
int result;
|
||||
|
@ -43,7 +43,7 @@
|
||||
#include <qlocale.h>
|
||||
#include <qdebug.h>
|
||||
#include <qjsondocument.h>
|
||||
|
||||
#include <quuid.h>
|
||||
|
||||
#include <limits.h>
|
||||
#include <float.h>
|
||||
@ -1436,6 +1436,13 @@ void tst_QVariant::operator_eq_eq_data()
|
||||
QTest::newRow("invalidConversionR") << QVariant(0) << QVariant(QString("bubu")) << false;
|
||||
// ### many other combinations missing
|
||||
|
||||
{
|
||||
// QUuid can convert to QString, but not the opposite
|
||||
QUuid uuid(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
|
||||
QTest::newRow("uuidstring") << QVariant(uuid) << QVariant(uuid.toString()) << true;
|
||||
QTest::newRow("stringuuid") << QVariant(uuid.toString()) << QVariant(uuid) << true;
|
||||
}
|
||||
|
||||
{
|
||||
QMap<QString, QVariant> map1;
|
||||
map1.insert( "X", 1 );
|
||||
|
Loading…
x
Reference in New Issue
Block a user