diff --git a/Test/300BuiltIns.frag b/Test/300BuiltIns.frag
index 07cb7186af33197150d555fefe134f12ea92c7ba..89233e2651e6b60fc82eb45a70554f00c4df8391 100644
--- a/Test/300BuiltIns.frag
+++ b/Test/300BuiltIns.frag
@@ -3,7 +3,7 @@
 int imax, imin;
 uint umax, umin;
 
-vec3 x, y;
+vec3 x, y;    // ERROR, needs default precision
 bvec3 bv;
 
 uint uy;
@@ -67,5 +67,10 @@ void main()
     vec2 v18 = unpackHalf2x16(uy);
 
     // not present
-    noise2(v18);
+    noise2(v18);  // ERROR, not present
+
+    float t__;  // ERROR, no __ until revision 310
+
+      // ERROR, no __ until revision 310
+    #define __D
 }
diff --git a/Test/310.comp b/Test/310.comp
index ebea3e4cfe1020df030bddec379ed193b56eee64..4c2cfd71f7922d72eeb3504dace9630b6f238c36 100644
--- a/Test/310.comp
+++ b/Test/310.comp
@@ -231,3 +231,8 @@ in inb {     // ERROR
 out outb {     // ERROR
     int a;
 } outbi;
+
+float t__;  // ERROR, no __ until revision 310
+
+    // ERROR, no __ until revision 310
+#define __D
diff --git a/Test/baseResults/300BuiltIns.frag.out b/Test/baseResults/300BuiltIns.frag.out
index 63dd0e19ee5349fcc48f90fb2825b99a81db9c35..a61515c1abae0f67c76446a553425b68f8933b49 100644
--- a/Test/baseResults/300BuiltIns.frag.out
+++ b/Test/baseResults/300BuiltIns.frag.out
@@ -1,7 +1,9 @@
 300BuiltIns.frag
 ERROR: 0:6: 'float' : type requires declaration of default precision qualifier 
 ERROR: 0:70: 'noise2' : no matching overloaded function found 
-ERROR: 2 compilation errors.  No code generated.
+ERROR: 0:72: 't__' : identifiers containing consecutive underscores ("__") are reserved, and an error if version <= 300 
+ERROR: 0:75: '#define' : names containing consecutive underscores are reserved, and an error if version <= 300: __D
+ERROR: 4 compilation errors.  No code generated.
 
 
 Shader version: 300
diff --git a/Test/baseResults/310.comp.out b/Test/baseResults/310.comp.out
index 70f09163ded8674f284f26aaa517fbb08216cc1e..75db91c18f61b9b020b8c2ab43257f6ebdbe28d4 100644
--- a/Test/baseResults/310.comp.out
+++ b/Test/baseResults/310.comp.out
@@ -74,6 +74,8 @@ ERROR: 0:221: 'assign' : can't read from writeonly object:  wo
 ERROR: 0:222: '~' : can't read from writeonly object:  wo
 ERROR: 0:227: 'input block' : not supported in this stage: compute
 ERROR: 0:231: 'output block' : not supported in this stage: compute
+WARNING: 0:235: 't__' : identifiers containing consecutive underscores ("__") are reserved 
+WARNING: 0:238: '#define' : names containing consecutive underscores are reserved: __D
 ERROR: 74 compilation errors.  No code generated.
 
 
@@ -483,6 +485,7 @@ ERROR: node is still EOpNull!
 0:?     'multio' (layout(column_major shared ) buffer block{layout(column_major shared ) readonly buffer highp int value, layout(column_major shared ) writeonly buffer implicitly-sized array of highp float values})
 0:?     'inbi' (in block{in highp int a})
 0:?     'outbi' (out block{out highp int a})
+0:?     't__' (global highp float)
 
 
 Linked compute stage:
@@ -894,4 +897,5 @@ ERROR: node is still EOpNull!
 0:?     'multio' (layout(column_major shared ) buffer block{layout(column_major shared ) readonly buffer highp int value, layout(column_major shared ) writeonly buffer implicitly-sized array of highp float values})
 0:?     'inbi' (in block{in highp int a})
 0:?     'outbi' (out block{out highp int a})
+0:?     't__' (global highp float)
 
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 28d87922df37e18c0fe3bee725e7e08bfa58fccc..0965daa580ce26f6f0716e53f1368f5d9b0d742a 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -1788,11 +1788,17 @@ void TParseContext::reservedErrorCheck(TSourceLoc loc, const TString& identifier
         if (builtInName(identifier))
             error(loc, "identifiers starting with \"gl_\" are reserved", identifier.c_str(), "");
 
+        // "__" are not supposed to be an error.  ES 310 (and desktop) added the clarification:
         // "In addition, all identifiers containing two consecutive underscores (__) are
         // reserved; using such a name does not itself result in an error, but may result
         // in undefined behavior."
-        if (identifier.find("__") != TString::npos)
-            warn(loc, "identifiers containing consecutive underscores (\"__\") are reserved", identifier.c_str(), "");
+        // however, before that, ES tests required an error.
+        if (identifier.find("__") != TString::npos) {
+            if (profile == EEsProfile && version <= 300)
+                error(loc, "identifiers containing consecutive underscores (\"__\") are reserved, and an error if version <= 300", identifier.c_str(), "");
+            else
+                warn(loc, "identifiers containing consecutive underscores (\"__\") are reserved", identifier.c_str(), "");
+        }
     }
 }
 
@@ -1801,11 +1807,13 @@ void TParseContext::reservedErrorCheck(TSourceLoc loc, const TString& identifier
 //
 void TParseContext::reservedPpErrorCheck(TSourceLoc loc, const char* identifier, const char* op)
 {
+    // "__" are not supposed to be an error.  ES 310 (and desktop) added the clarification:
     // "All macro names containing two consecutive underscores ( __ ) are reserved;
     // defining such a name does not itself result in an error, but may result in
     // undefined behavior.  All macro names prefixed with "GL_" ("GL" followed by a
     // single underscore) are also reserved, and defining such a name results in a
     // compile-time error."
+    // however, before that, ES tests required an error.
     if (strncmp(identifier, "GL_", 3) == 0)
         error(loc, "names beginning with \"GL_\" can't be (un)defined:", op,  identifier);
     else if (strstr(identifier, "__") != 0) {
@@ -1814,8 +1822,12 @@ void TParseContext::reservedPpErrorCheck(TSourceLoc loc, const char* identifier,
              strcmp(identifier, "__FILE__") == 0 ||
              strcmp(identifier, "__VERSION__") == 0))
             error(loc, "predefined names can't be (un)defined:", op,  identifier);
-        else
-            warn(loc, "names containing consecutive underscores are reserved:", op, identifier);
+        else {
+            if (profile == EEsProfile && version <= 300)
+                error(loc, "names containing consecutive underscores are reserved, and an error if version <= 300:", op, identifier);
+            else
+                warn(loc, "names containing consecutive underscores are reserved:", op, identifier);
+        }
     }
 }