aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qqmlirbuilder.cpp
diff options
context:
space:
mode:
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);