Disallow non-language characters in comments for ES version 100.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24301 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
John Kessenich 2013-12-03 20:09:57 +00:00
parent 1abc4045ce
commit 4e734dd68b
10 changed files with 103 additions and 12 deletions

View File

@ -36,7 +36,7 @@ void main()
for ( int a = 0; a <= 20; a++) { if (ga==0) a = 4; } // ERROR
for (float a = 0.0; a <= 20.0; a += 2.0);
for (float a = 0.0; a != 20.0; a -= 2.0) { if (ga==0) ga = 4; }
for (float a = 0.0; a == 20.0; a--) for (float a = 0.0; a == 20.0; a--); // two different 'a's, everything okay
for (float a = 0.0; a == 20.0; a--) for (float a = 0.0; a == 20.0; a--); // two different a, everything okay
for (float a = 0.0; a <= 20.0; a += 2.0);
for (float a = 0.0; a <= 20.0; a += 2.0);
for (float a = 0.0; a > 2.0 * 20.0; a += v3.y);

View File

@ -18,8 +18,8 @@ float b(int a); // ERROR: redefinition
float f; // ERROR: redefinition
float tan; // okay, built-in is in an outer scope
float sin(float x); // ERROR: can't redefine built-in functions
float cos(float x) // ERROR: can't redefine built-in functions
float sin(float x); // ERROR: cant redefine built-in functions
float cos(float x) // ERROR: cant redefine built-in functions
{
return 1.0;
}
@ -54,7 +54,7 @@ void main()
int z = z; // ERROR: z not previously defined.
}
{
int x = x; // x is initialized to '1'
int x = x; // x is initialized to 1
}
struct S
@ -62,7 +62,7 @@ void main()
int x;
};
{
S S = S(0); // 'S' is only visible as a struct and constructor
S.x; // 'S' is now visible as a variable
S S = S(0); // S is only visible as a struct and constructor
S.x; // S is now visible as a variable
}
}

View File

@ -8,7 +8,15 @@ ERROR: 0:14: 'line continuation' : not supported for this version or the enabled
ERROR: 0:15: 'line continuation' : not supported for this version or the enabled extensions
ERROR: 0:18: '#error' : e3
ERROR: 0:24: 'line continuation' : not supported for this version or the enabled extensions
ERROR: 9 compilation errors. No code generated.
ERROR: 0:28: 'line continuation' : not supported for this version or the enabled extensions
ERROR: 0:29: 'non-language character ($) in comment' : not supported for this version or the enabled extensions
ERROR: 0:29: 'non-language character (") in comment' : not supported for this version or the enabled extensions
ERROR: 0:29: 'non-language character (') in comment' : not supported for this version or the enabled extensions
ERROR: 0:31: 'non-language character (@) in comment' : not supported for this version or the enabled extensions
ERROR: 0:32: 'non-language character (@) in comment' : not supported for this version or the enabled extensions
ERROR: 0:32: 'non-language character (@) in comment' : not supported for this version or the enabled extensions
ERROR: 0:33: 'non-language character (@) in comment' : not supported for this version or the enabled extensions
ERROR: 17 compilation errors. No code generated.
ERROR: node is still EOpNull!

View File

@ -24,3 +24,7 @@ vec4 foo2(vec4 a)
vec4 b = a; \
return b;
}
// aoeuntheo unatehutna \ antaehnathe
// anteonuth $ natohe " '
// anteonuth natohe

View File

@ -6,7 +6,7 @@ ains no errors other than the #error which are there to see if line numbering fo
#error e1
float f\
oo; // same as 'float foo;'
oo; // same as float foo;
#error e2
@ -24,3 +24,10 @@ vec4 foo2(vec4 a)
vec4 b = a; \
return b;
}
// aoeuntheo unatehutna \ antaehnathe
// anteonuth $ natohe " '
// anteonuth natohe
/*@*/
/* *@/*/
//@

View File

@ -1396,6 +1396,10 @@ void TParseContext::reservedPpErrorCheck(TSourceLoc loc, const char* identifier,
//
void TParseContext::lineContinuationCheck(TSourceLoc loc)
{
if ((profile == EEsProfile && version >= 300) ||
(profile != EEsProfile && version >= 420))
return;
const char* message = "line continuation";
if (messages & EShMsgRelaxedErrors) {
warn(loc, "not allowed in this version", message, "");
@ -1406,6 +1410,28 @@ void TParseContext::lineContinuationCheck(TSourceLoc loc)
}
}
//
// See if this version/profile allows use the given character in a comment.
//
void TParseContext::commentCharacterCheck(TSourceLoc loc, int ch)
{
if ((profile == EEsProfile && version >= 300) ||
(profile != EEsProfile))
return;
TString message("non-language character (");
if (ch > 32 && ch <= 126)
message.push_back(ch);
message.append(") in comment");
if (messages & EShMsgRelaxedErrors) {
warn(loc, "not allowed in this version", message.c_str(), "");
} else {
requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, message.c_str());
profileRequires(loc, EEsProfile, 300, 0, message.c_str());
profileRequires(loc, ECoreProfile | ECompatibilityProfile, 420, 0, message.c_str());
}
}
bool TParseContext::builtInName(const TString& identifier)
{
return identifier.compare(0, 3, "gl_") == 0;

View File

@ -77,6 +77,7 @@ public:
bool reservedErrorCheck(TSourceLoc, const TString&);
void reservedPpErrorCheck(TSourceLoc, const char* name, const char* op);
void lineContinuationCheck(TSourceLoc);
void commentCharacterCheck(TSourceLoc, int ch);
bool builtInName(const TString&);
void handlePragma(TSourceLoc, const TVector<TString>&);

View File

@ -93,6 +93,46 @@ TPpContext::TPpContext(TParseContext& pc) :
for (elsetracker = 0; elsetracker < maxIfNesting; elsetracker++)
elseSeen[elsetracker] = false;
elsetracker = 0;
for (int c = 0; c < 256; ++c)
languageCharacters[c] = false;
for (int c = 'a'; c <= 'z'; ++c)
languageCharacters[c] = true;
for (int c = 'A'; c <= 'Z'; ++c)
languageCharacters[c] = true;
languageCharacters['_'] = true;
for (int c = '0'; c <= '9'; ++c)
languageCharacters[c] = true;
languageCharacters['.'] = true;
languageCharacters['+'] = true;
languageCharacters['-'] = true;
languageCharacters['/'] = true;
languageCharacters['*'] = true;
languageCharacters['%'] = true;
languageCharacters['<'] = true;
languageCharacters['>'] = true;
languageCharacters['['] = true;
languageCharacters[']'] = true;
languageCharacters['('] = true;
languageCharacters[')'] = true;
languageCharacters['{'] = true;
languageCharacters['}'] = true;
languageCharacters['^'] = true;
languageCharacters['|'] = true;
languageCharacters['&'] = true;
languageCharacters['~'] = true;
languageCharacters['='] = true;
languageCharacters['!'] = true;
languageCharacters[':'] = true;
languageCharacters[';'] = true;
languageCharacters[','] = true;
languageCharacters['?'] = true;
languageCharacters['#'] = true;
// white space
languageCharacters[' '] = true;
for (int c = 9; c <= 13; ++c)
languageCharacters[c] = true;
}
TPpContext::~TPpContext()

View File

@ -209,6 +209,8 @@ protected:
InputSrc *currentInput;
bool errorOnVersion;
bool languageCharacters[256];
//
// from Pp.cpp
//

View File

@ -647,7 +647,8 @@ int TPpContext::sourceScan(TPpContext* pp, InputSrc*, TPpToken* ppToken)
else
ch = nextch;
}
}
} else if (ch > 0 && ! pp->languageCharacters[ch])
pp->parseContext.commentCharacterCheck(ppToken->loc, ch);
} while (ch != '\n' && ch != EOF);
if (ch == EOF)
return EOF;
@ -659,11 +660,12 @@ int TPpContext::sourceScan(TPpContext* pp, InputSrc*, TPpToken* ppToken)
while (ch != '*') {
if (ch == '\n')
nlcount++;
if (ch == EOF) {
else if (ch == EOF) {
pp->parseContext.error(ppToken->loc, "EOF in comment", "comment", "");
return EOF;
}
} else if (! pp->languageCharacters[ch])
pp->parseContext.commentCharacterCheck(ppToken->loc, ch);
ch = pp->currentInput->getch(pp, pp->currentInput, ppToken);
}
ch = pp->currentInput->getch(pp, pp->currentInput, ppToken);
@ -671,7 +673,8 @@ int TPpContext::sourceScan(TPpContext* pp, InputSrc*, TPpToken* ppToken)
pp->parseContext.error(ppToken->loc, "EOF in comment", "comment", "");
return EOF;
}
} else if (! pp->languageCharacters[ch])
pp->parseContext.commentCharacterCheck(ppToken->loc, ch);
} while (ch != '/');
if (nlcount)
return '\n';