From 9353f1afab8d1c2b1811c6acd807675128eaabc5 Mon Sep 17 00:00:00 2001
From: John Kessenich <cepheus@frii.com>
Date: Sun, 23 Jul 2017 11:49:42 -0600
Subject: [PATCH] GLSL: Add version-number checking.

---
 Test/435.vert                             |  2 ++
 Test/baseResults/435.vert.out             | 25 ++++++++++++++
 glslang/MachineIndependent/ShaderLang.cpp | 41 +++++++++++++++++++++--
 gtests/AST.FromFile.cpp                   |  1 +
 4 files changed, 66 insertions(+), 3 deletions(-)
 create mode 100644 Test/435.vert
 create mode 100755 Test/baseResults/435.vert.out

diff --git a/Test/435.vert b/Test/435.vert
new file mode 100644
index 000000000..bf27ce967
--- /dev/null
+++ b/Test/435.vert
@@ -0,0 +1,2 @@
+#version 435
+void main() {}
\ No newline at end of file
diff --git a/Test/baseResults/435.vert.out b/Test/baseResults/435.vert.out
new file mode 100755
index 000000000..188a0a43c
--- /dev/null
+++ b/Test/baseResults/435.vert.out
@@ -0,0 +1,25 @@
+435.vert
+ERROR: version not supported
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 450
+ERROR: node is still EOpNull!
+0:2  Function Definition: main( ( global void)
+0:2    Function Parameters: 
+0:?   Linker Objects
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 450
+ERROR: node is still EOpNull!
+0:2  Function Definition: main( ( global void)
+0:2    Function Parameters: 
+0:?   Linker Objects
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index 93f1568fc..2f1a7ccc7 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -1,7 +1,7 @@
 //
 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
 // Copyright (C) 2013-2016 LunarG, Inc.
-// Copyright (C) 2015-2016 Google, Inc.
+// Copyright (C) 2015-2017 Google, Inc.
 //
 // All rights reserved.
 //
@@ -138,7 +138,8 @@ int MapVersionToIndex(int version)
     case 440: index = 12; break;
     case 310: index = 13; break;
     case 450: index = 14; break;
-    default:              break;
+    case 500: index =  0; break; // HLSL
+    default:  assert(0);  break;
     }
 
     assert(index < VersionCount);
@@ -447,7 +448,7 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo
         return correct;
     }
 
-    // Get a good version...
+    // Get a version...
     if (version == 0) {
         version = defaultVersion;
         // infoSink.info.message(EPrefixWarning, "#version: statement missing; use #version on first line of shader");
@@ -493,6 +494,40 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo
         }
     }
 
+    // Fix version...
+    switch (version) {
+    // ES versions
+    case 100: break;
+    case 300: break;
+    case 310: break;
+
+    // desktop versions
+    case 110: break;
+    case 120: break;
+    case 130: break;
+    case 140: break;
+    case 150: break;
+    case 330: break;
+    case 400: break;
+    case 410: break;
+    case 420: break;
+    case 430: break;
+    case 440: break;
+    case 450: break;
+
+    // unknown version
+    default:
+        correct = false;
+        infoSink.info.message(EPrefixError, "version not supported");
+        if (profile == EEsProfile)
+            version = 310;
+        else {
+            version = 450;
+            profile = ECoreProfile;
+        }
+        break;
+    }
+
     // Correct for stage type...
     switch (stage) {
     case EShLangGeometry:
diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp
index d8a5ef94c..594545f2c 100644
--- a/gtests/AST.FromFile.cpp
+++ b/gtests/AST.FromFile.cpp
@@ -136,6 +136,7 @@ INSTANTIATE_TEST_CASE_P(
         "430.vert",
         "430.comp",
         "430AofA.frag",
+        "435.vert",
         "440.vert",
         "440.frag",
         "450.vert",
-- 
GitLab