diff options
Diffstat (limited to 'tests/auto/qml/qmlcppcodegen')
-rw-r--r-- | tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/auto/qml/qmlcppcodegen/data/conversionInDeadCode.qml | 32 | ||||
-rw-r--r-- | tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp | 20 |
3 files changed, 53 insertions, 0 deletions
diff --git a/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt b/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt index 0a33eece52..fd0b43312e 100644 --- a/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt +++ b/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt @@ -90,6 +90,7 @@ set(qml_files construct.qml contextParam.qml conversionDecrement.qml + conversionInDeadCode.qml conversions.qml conversions2.qml convertToOriginalReadAcumulatorForUnaryOperators.qml diff --git a/tests/auto/qml/qmlcppcodegen/data/conversionInDeadCode.qml b/tests/auto/qml/qmlcppcodegen/data/conversionInDeadCode.qml new file mode 100644 index 0000000000..b2e7b40c00 --- /dev/null +++ b/tests/auto/qml/qmlcppcodegen/data/conversionInDeadCode.qml @@ -0,0 +1,32 @@ +pragma Strict +import QtQml + +QtObject { + // This does not look like dead code, but each access to 'result' generates a + // DeadTemoralZoneCheck instruction that we ignore when compiling to C++ + // after checking statically that 'result' is alive throughout the function. + // Therefore, this function is a torture test for the dead code elimination. + function calc(a: int, b: int) : int { + let result = a; + if (b < 0) { + if (b < -1) + result -= b; + if (b < -2) + result /= b; + } else { + if (b > 1) + result *= b; + if (b > 2) + result += b; + } + return result; + } + + property int a: calc(10, -3); + property int b: calc(10, -2); + property int c: calc(10, -1); + property int d: calc(10, 0); + property int e: calc(10, 1); + property int f: calc(10, 2); + property int g: calc(10, 3); +} diff --git a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp index 4854108b86..9b1987ef13 100644 --- a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp +++ b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp @@ -66,6 +66,7 @@ private slots: void construct(); void contextParam(); void conversionDecrement(); + void conversionInDeadCode(); void conversions(); void convertToOriginalReadAcumulatorForUnaryOperators(); void cppValueTypeList(); @@ -1104,6 +1105,25 @@ void tst_QmlCppCodegen::conversionDecrement() QCOMPARE(o->property("currentPageIndex").toInt(), 3); } +void tst_QmlCppCodegen::conversionInDeadCode() +{ + QQmlEngine engine; + QQmlComponent c(&engine, QUrl(u"qrc:/qt/qml/TestTypes/conversionInDeadCode.qml"_s)); + + QVERIFY2(c.isReady(), qPrintable(c.errorString())); + + QScopedPointer<QObject> o(c.create()); + QVERIFY(!o.isNull()); + + QCOMPARE(o->property("a").toInt(), -4); + QCOMPARE(o->property("b").toInt(), 12); + QCOMPARE(o->property("c").toInt(), 10); + QCOMPARE(o->property("d").toInt(), 10); + QCOMPARE(o->property("e").toInt(), 10); + QCOMPARE(o->property("f").toInt(), 20); + QCOMPARE(o->property("g").toInt(), 33); +} + void tst_QmlCppCodegen::conversions() { QQmlEngine engine; |