CPP: Handle the "u" and "U" suffixes for uint literals, and correctly handle underflow/overflow of integer literals.
git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@21033 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
parent
7d58d655c2
commit
ae722a6230
1 changed files with 25 additions and 16 deletions
|
|
@ -346,7 +346,8 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp)
|
||||||
char symbol_name[MAX_SYMBOL_NAME_LEN + 1];
|
char symbol_name[MAX_SYMBOL_NAME_LEN + 1];
|
||||||
char string_val[MAX_STRING_LEN + 1];
|
char string_val[MAX_STRING_LEN + 1];
|
||||||
int AlreadyComplained;
|
int AlreadyComplained;
|
||||||
int len, ch, ii, ival = 0;
|
int len, ch, ii;
|
||||||
|
unsigned ival = 0;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
yylvalpp->sc_int = 0;
|
yylvalpp->sc_int = 0;
|
||||||
|
|
@ -431,9 +432,12 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp)
|
||||||
} else {
|
} else {
|
||||||
CPPErrorToInfoLog("ERROR___ERROR_IN_HEX_CONSTANT");
|
CPPErrorToInfoLog("ERROR___ERROR_IN_HEX_CONSTANT");
|
||||||
}
|
}
|
||||||
yylvalpp->symbol_name[len] = '\0';
|
if (ch == 'u' || ch == 'U')
|
||||||
|
yylvalpp->symbol_name[len++] = ch;
|
||||||
|
else
|
||||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||||
yylvalpp->sc_int = ival;
|
yylvalpp->symbol_name[len] = '\0';
|
||||||
|
yylvalpp->sc_int = (int)ival;
|
||||||
return CPP_INTCONSTANT;
|
return CPP_INTCONSTANT;
|
||||||
} else if (ch >= '0' && ch <= '7') { // octal integer constants
|
} else if (ch >= '0' && ch <= '7') { // octal integer constants
|
||||||
AlreadyComplained = 0;
|
AlreadyComplained = 0;
|
||||||
|
|
@ -454,7 +458,7 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp)
|
||||||
return lFloatConst(yylvalpp->symbol_name, len, ch, yylvalpp);
|
return lFloatConst(yylvalpp->symbol_name, len, ch, yylvalpp);
|
||||||
yylvalpp->symbol_name[len] = '\0';
|
yylvalpp->symbol_name[len] = '\0';
|
||||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||||
yylvalpp->sc_int = ival;
|
yylvalpp->sc_int = (int)ival;
|
||||||
return CPP_INTCONSTANT;
|
return CPP_INTCONSTANT;
|
||||||
} else {
|
} else {
|
||||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||||
|
|
@ -475,22 +479,27 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp)
|
||||||
if (ch == '.' || ch == 'e' || ch == 'f' || ch == 'h' || ch == 'x'|| ch == 'E' || ch == 'F' || ch == 'l' || ch == 'L') {
|
if (ch == '.' || ch == 'e' || ch == 'f' || ch == 'h' || ch == 'x'|| ch == 'E' || ch == 'F' || ch == 'l' || ch == 'L') {
|
||||||
return lFloatConst(yylvalpp->symbol_name, len, ch, yylvalpp);
|
return lFloatConst(yylvalpp->symbol_name, len, ch, yylvalpp);
|
||||||
} else {
|
} else {
|
||||||
yylvalpp->symbol_name[len] = '\0';
|
// Finish handling signed and unsigned integers
|
||||||
|
int numericLen = len;
|
||||||
|
if (ch == 'u' || ch == 'U')
|
||||||
|
yylvalpp->symbol_name[len++] = ch;
|
||||||
|
else
|
||||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||||
|
|
||||||
|
yylvalpp->symbol_name[len] = '\0';
|
||||||
ival = 0;
|
ival = 0;
|
||||||
AlreadyComplained = 0;
|
AlreadyComplained = 0;
|
||||||
for (ii = 0; ii < len; ii++) {
|
for (ii = 0; ii < numericLen; ii++) {
|
||||||
ch = yylvalpp->symbol_name[ii] - '0';
|
ch = yylvalpp->symbol_name[ii] - '0';
|
||||||
if ((ival > 214748364) || (ival == 214748364 && ch >= 8)) {
|
if ((ival > 429496729) || (ival == 429496729 && ch >= 6)) {
|
||||||
if (! AlreadyComplained)
|
if (! AlreadyComplained)
|
||||||
CPPErrorToInfoLog("ERROR___INTEGER_CONST_OVERFLOW");
|
CPPErrorToInfoLog("ERROR___INTEGER_CONST_OVERFLOW");
|
||||||
AlreadyComplained = 1;
|
AlreadyComplained = 1;
|
||||||
}
|
}
|
||||||
ival = ival * 10 + ch;
|
ival = ival * 10 + ch;
|
||||||
}
|
}
|
||||||
yylvalpp->sc_int = ival;
|
yylvalpp->sc_int = (int)ival;
|
||||||
if(ival==0)
|
|
||||||
strcpy(yylvalpp->symbol_name,"0");
|
|
||||||
return CPP_INTCONSTANT;
|
return CPP_INTCONSTANT;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue