diff options
Diffstat (limited to 'src/qml/compiler/qqmlirbuilder.cpp')
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 11 |
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); |