aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/qml/v4/qdeclarativev4compiler.cpp4
-rw-r--r--tests/auto/declarative/qdeclarativev4/data/conditionalExpr.qml6
-rw-r--r--tests/auto/declarative/qdeclarativev4/tst_qdeclarativev4.cpp18
3 files changed, 26 insertions, 2 deletions
diff --git a/src/declarative/qml/v4/qdeclarativev4compiler.cpp b/src/declarative/qml/v4/qdeclarativev4compiler.cpp
index a7eecce0c9..e67a3821d7 100644
--- a/src/declarative/qml/v4/qdeclarativev4compiler.cpp
+++ b/src/declarative/qml/v4/qdeclarativev4compiler.cpp
@@ -404,15 +404,15 @@ void QDeclarativeV4CompilerPrivate::visitUnop(IR::Unop *e)
break;
case IR::OpIfTrue:
+ convertToBool(e->expr, src);
if (src != currentReg) {
i.move_reg_reg(currentReg, src);
gen(i);
- } else {
- // nothing to do
}
break;
case IR::OpNot:
+ convertToBool(e->expr, src);
i.unary_not(currentReg, src);
gen(i);
break;
diff --git a/tests/auto/declarative/qdeclarativev4/data/conditionalExpr.qml b/tests/auto/declarative/qdeclarativev4/data/conditionalExpr.qml
new file mode 100644
index 0000000000..b74a95a94b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativev4/data/conditionalExpr.qml
@@ -0,0 +1,6 @@
+import Qt.v4 1.0
+
+Result {
+ property int n: 2
+ result: !n ? 100 : 0
+}
diff --git a/tests/auto/declarative/qdeclarativev4/tst_qdeclarativev4.cpp b/tests/auto/declarative/qdeclarativev4/tst_qdeclarativev4.cpp
index 0f8c5bcf66..fb34696ef5 100644
--- a/tests/auto/declarative/qdeclarativev4/tst_qdeclarativev4.cpp
+++ b/tests/auto/declarative/qdeclarativev4/tst_qdeclarativev4.cpp
@@ -72,6 +72,7 @@ private slots:
void unnecessaryReeval();
void logicalOr();
+ void conditionalExpr();
void qtscript();
void qtscript_data();
void nestedObjectAccess();
@@ -121,6 +122,7 @@ void tst_qdeclarativev4::qtscript_data()
QTest::newRow("qreal -> int rounding") << "qrealToIntRounding.qml";
QTest::newRow("exception on fetch") << "fetchException.qml";
QTest::newRow("logical or") << "logicalOr.qml";
+ QTest::newRow("conditional expressions") << "conditionalExpr.qml";
QTest::newRow("double bool jump") << "doubleBoolJump.qml";
QTest::newRow("unary minus") << "unaryMinus.qml";
QTest::newRow("null qobject") << "nullQObject.qml";
@@ -188,6 +190,22 @@ void tst_qdeclarativev4::logicalOr()
}
}
+void tst_qdeclarativev4::conditionalExpr()
+{
+ {
+ QDeclarativeComponent component(&engine, TEST_FILE("conditionalExpr.qml"));
+
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+
+ ResultObject *ro = qobject_cast<ResultObject *>(o);
+ QVERIFY(ro != 0);
+
+ QCOMPARE(ro->result(), 0);
+ delete o;
+ }
+}
+
// This would previously use the metaObject of the root element to result the nested access.
// That is, the index for accessing "result" would have been RootObject::result, instead of
// NestedObject::result.