aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qqmlirbuilder.cpp
diff options
context:
space:
mode:
authorMichael Brasser <mbrasser@ford.com>2017-08-17 18:24:39 -0500
committerSimon Hausmann <simon.hausmann@qt.io>2017-08-18 18:03:34 +0000
commitcf1dcc857a5b9fdc55f21508c812bb4110cf93b7 (patch)
tree81ad9ad112de838786e2450fe72fc97bf23b9674 /src/qml/compiler/qqmlirbuilder.cpp
parentad63e8491bdf6e85af1a72a44ef643321e6ceec0 (diff)
Support explicit enum value declaration in QML
Allow declarations such as: enum MyEnum { Value1 = 1, Value2 } Not all features of C++ enums are supported. Specifically, we don't yet allow: * Negative numbers (Value1 = -1) * Assignment of other values (Value2 = Value1) Change-Id: I4776f8d86bd0c8688c7dd8b7d4ccb2f72fdfe721 Task-number: QTBUG-14861 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/compiler/qqmlirbuilder.cpp')
-rw-r--r--src/qml/compiler/qqmlirbuilder.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp
index b58920d812..a26c80e093 100644
--- a/src/qml/compiler/qqmlirbuilder.cpp
+++ b/src/qml/compiler/qqmlirbuilder.cpp
@@ -45,6 +45,7 @@
#include <private/qqmljslexer_p.h>
#include <QCoreApplication>
#include <QCryptographicHash>
+#include <cmath>
#ifndef V4_BOOTSTRAP
#include <private/qqmlglobal_p.h>
@@ -740,16 +741,20 @@ bool IRBuilder::visit(QQmlJS::AST::UiEnumDeclaration *node)
enumeration->enumValues = New<PoolList<EnumValue>>();
QQmlJS::AST::UiEnumMemberList *e = node->members;
- int i = -1;
while (e) {
EnumValue *enumValue = New<EnumValue>();
QString member = e->member.toString();
enumValue->nameIndex = registerString(member);
- enumValue->value = ++i;
-
if (member.at(0).isLower())
COMPILE_EXCEPTION(e->memberToken, tr("Enum names must begin with an upper case letter"));
+ double part;
+ if (std::modf(e->value, &part) != 0.0)
+ COMPILE_EXCEPTION(e->valueToken, tr("Enum value must be an integer"));
+ if (e->value > std::numeric_limits<qint32>::max() || e->value < std::numeric_limits<qint32>::min())
+ COMPILE_EXCEPTION(e->valueToken, tr("Enum value out of range"));
+ enumValue->value = e->value;
+
enumValue->location.line = e->memberToken.startLine;
enumValue->location.column = e->memberToken.startColumn;
enumeration->enumValues->append(enumValue);