Disallow non-language characters in comments for ES version 100.
authorJohn Kessenich <cepheus@frii.com>
Tue, 3 Dec 2013 20:09:57 +0000 (20:09 +0000)
committerJohn Kessenich <cepheus@frii.com>
Tue, 3 Dec 2013 20:09:57 +0000 (20:09 +0000)
git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24301 e7fa87d3-cd2b-0410-9028-fcbf551c1848

Test/100Limits.vert
Test/100scope.vert
Test/baseResults/lineContinuation100.vert.out
Test/lineContinuation.vert
Test/lineContinuation100.vert
glslang/MachineIndependent/ParseHelper.cpp
glslang/MachineIndependent/ParseHelper.h
glslang/MachineIndependent/preprocessor/PpContext.cpp
glslang/MachineIndependent/preprocessor/PpContext.h
glslang/MachineIndependent/preprocessor/PpScanner.cpp

index d23b7e8..f046219 100644 (file)
@@ -36,7 +36,7 @@ void main()
     for (  int a = 0;       a <= 20;      a++)  { if (ga==0) a = 4; } // ERROR\r
     for (float a = 0.0;   a <= 20.0; a += 2.0);\r
     for (float a = 0.0;   a != 20.0; a -= 2.0)  { if (ga==0) ga = 4; }\r
-    for (float a = 0.0;   a == 20.0;      a--) for (float a = 0.0;   a == 20.0;      a--);  // two different 'a's, everything okay\r
+    for (float a = 0.0;   a == 20.0;      a--) for (float a = 0.0;   a == 20.0;      a--);  // two different a, everything okay\r
     for (float a = 0.0;   a <= 20.0; a += 2.0);\r
     for (float a = 0.0;   a <= 20.0; a += 2.0);\r
     for (float a = 0.0;   a > 2.0 * 20.0; a += v3.y);\r
index 7e9f82b..a13b1a0 100644 (file)
@@ -18,8 +18,8 @@ float b(int a);      // ERROR: redefinition
 \r
 float f;             // ERROR: redefinition\r
 float tan;           // okay, built-in is in an outer scope\r
-float sin(float x);  // ERROR: can't redefine built-in functions\r
-float cos(float x)   // ERROR: can't redefine built-in functions\r
+float sin(float x);  // ERROR: cant redefine built-in functions\r
+float cos(float x)   // ERROR: cant redefine built-in functions\r
 {\r
        return 1.0;\r
 }\r
@@ -54,7 +54,7 @@ void main()
         int z = z; // ERROR: z not previously defined.\r
     }\r
     {\r
-        int x = x; // x is initialized to '1'\r
+        int x = x; // x is initialized to 1\r
     }\r
 \r
     struct S \r
@@ -62,7 +62,7 @@ void main()
         int x; \r
     };\r
     {\r
-        S S = S(0); // 'S' is only visible as a struct and constructor \r
-        S.x;        // 'S' is now visible as a variable\r
+        S S = S(0); // S is only visible as a struct and constructor \r
+        S.x;        // S is now visible as a variable\r
     }\r
 }\r
index 9e20998..354f314 100644 (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 \r
 ERROR: 0:18: '#error' : e3  \r
 ERROR: 0:24: 'line continuation' : not supported for this version or the enabled extensions \r
-ERROR: 9 compilation errors.  No code generated.\r
+ERROR: 0:28: 'line continuation' : not supported for this version or the enabled extensions \r
+ERROR: 0:29: 'non-language character ($) in comment' : not supported for this version or the enabled extensions \r
+ERROR: 0:29: 'non-language character (") in comment' : not supported for this version or the enabled extensions \r
+ERROR: 0:29: 'non-language character (') in comment' : not supported for this version or the enabled extensions \r
+ERROR: 0:31: 'non-language character (@) in comment' : not supported for this version or the enabled extensions \r
+ERROR: 0:32: 'non-language character (@) in comment' : not supported for this version or the enabled extensions \r
+ERROR: 0:32: 'non-language character (@) in comment' : not supported for this version or the enabled extensions \r
+ERROR: 0:33: 'non-language character (@) in comment' : not supported for this version or the enabled extensions \r
+ERROR: 17 compilation errors.  No code generated.\r
 \r
 \r
 ERROR: node is still EOpNull!\r
index 1115027..7909bf2 100644 (file)
@@ -24,3 +24,7 @@ vec4 foo2(vec4 a)
   vec4 b = a;       \
   return b;                   
 }
+
+// aoeuntheo unatehutna \ antaehnathe 
+// anteonuth $ natohe " '
+// anteonuth     natohe
index ec1d862..7485547 100644 (file)
@@ -6,7 +6,7 @@ ains no errors other than the #error which are there to see if line numbering fo
 #error e1\r
 \r
 float f\\r
-oo;  // same as 'float foo;'\r
+oo;  // same as float foo;\r
 \r
 #error e2\r
 \r
@@ -24,3 +24,10 @@ vec4 foo2(vec4 a)
   vec4 b = a;       \\r
   return b;                   \r
 }\r
+\r
+// aoeuntheo unatehutna \ antaehnathe \r
+// anteonuth $ natohe " '\r
+// anteonuth     natohe\r
+/*@*/\r
+/* *@/*/\r
+//@\r
index a7af49f..34c1b44 100644 (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;
index 69044b1..d4c8632 100644 (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>&);
index ae7817b..500797b 100644 (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()
index cf9ac8a..82059d1 100644 (file)
@@ -209,6 +209,8 @@ protected:
     InputSrc *currentInput;
     bool errorOnVersion;
 
+    bool languageCharacters[256];
+
     //
     // from Pp.cpp
     //
index a61f82e..a537052 100644 (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';