>From page 22 (28 of PDF) of GLSL 1.30 spec: It is an error to provide a literal integer whose magnitude is too large to store in a variable of matching signed or unsigned type.
Unsigned integers have exactly 32 bits of precision. Signed integers use 32 bits, including a sign bit, in two's complement form. --- Others read this as "0xffffffff" being a valid literal integer of -1, like in C, right? src/glsl/glsl_lexer.ll | 38 ++++++++++++++++++++++++++++++-------- 1 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/glsl/glsl_lexer.ll b/src/glsl/glsl_lexer.ll index cfd8926..b01dcde 100644 --- a/src/glsl/glsl_lexer.ll +++ b/src/glsl/glsl_lexer.ll @@ -22,6 +22,7 @@ * DEALINGS IN THE SOFTWARE. */ #include <ctype.h> +#include <limits.h> #include "strtod.h" #include "ast.h" #include "glsl_parser_extras.h" @@ -43,8 +44,6 @@ static int classify_identifier(struct _mesa_glsl_parse_state *, const char *); #define YY_USER_INIT yylineno = 0; yycolumn = 0; -#define IS_UINT (yytext[yyleng - 1] == 'u' || yytext[yyleng - 1] == 'U') - /* A macro for handling reserved words and keywords across language versions. * * Certain words start out as identifiers, become reserved words in @@ -81,6 +80,32 @@ static int classify_identifier(struct _mesa_glsl_parse_state *, const char *); * ...means the word is a legal keyword in GLSL ES 1.00. */ #define ES yyextra->es_shader + +#define LITERAL_INTEGER(base) \ +do { \ + bool is_uint = (yytext[yyleng - 1] == 'u' || \ + yytext[yyleng - 1] == 'U'); \ + const char *digits = yytext; \ + \ + if (base == 16) \ + digits += 2; \ + long long value = strtoll(digits, NULL, base); \ + \ + yylval->n = (int)value; \ + \ + if (value > UINT_MAX) { \ + /* Note that signed 0xffffffff is valid, not out of range! */ \ + if (yyextra->language_version >= 130) { \ + _mesa_glsl_error(yylloc, yyextra, \ + "Literal value `%s' out of range", yytext); \ + } else { \ + _mesa_glsl_warning(yylloc, yyextra, \ + "Literal value `%s' out of range", yytext); \ + } \ + } \ + return is_uint ? UINTCONSTANT : INTCONSTANT; \ +} while (0) + %} %option bison-bridge bison-locations reentrant noyywrap @@ -292,16 +317,13 @@ layout { -= return SUB_ASSIGN; [1-9][0-9]*[uU]? { - yylval->n = strtol(yytext, NULL, 10); - return IS_UINT ? UINTCONSTANT : INTCONSTANT; + LITERAL_INTEGER(10); } 0[xX][0-9a-fA-F]+[uU]? { - yylval->n = strtol(yytext + 2, NULL, 16); - return IS_UINT ? UINTCONSTANT : INTCONSTANT; + LITERAL_INTEGER(16); } 0[0-7]*[uU]? { - yylval->n = strtol(yytext, NULL, 8); - return IS_UINT ? UINTCONSTANT : INTCONSTANT; + LITERAL_INTEGER(8); } [0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]? { -- 1.7.6.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev