From 7c9129bcb79dcb349988a9da39a490c4615126a6 Mon Sep 17 00:00:00 2001
From: John Kessenich <cepheus@frii.com>
Date: Wed, 24 May 2017 23:10:28 -0600
Subject: [PATCH] SPV: Fix #904: Correctly check for built-in block
 redeclations for location check.

---
 Test/spv.noLocation.vert                   | 16 +++++++++++-----
 glslang/MachineIndependent/ParseHelper.cpp |  4 +++-
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/Test/spv.noLocation.vert b/Test/spv.noLocation.vert
index dd495b7a7..43998525e 100644
--- a/Test/spv.noLocation.vert
+++ b/Test/spv.noLocation.vert
@@ -1,11 +1,11 @@
 #version 450
 
 layout(location = 1) in vec4 in1;
-in vec4 in2;
+in vec4 in2;                        // ERROR
 layout(location = 3) in vec4 in3;
 
 layout(location = 1) out vec4 out1;
-out vec4 out2;
+out vec4 out2;                      // ERROR
 layout(location = 3) out vec4 out3;
 
 layout(location = 10) out inb1 { 
@@ -16,18 +16,24 @@ out inb2 {
     layout(location = 12) vec4 a;
     layout(location = 13) vec4 b;
 } inbi2;
-out inb3 {
+out inb3 {                          // ERROR
     vec4 a;
     vec4 b;
 } inbi3;
 
 layout(location = 14) out struct S1 { vec4 a; } s1;
-out struct S2 { vec4 a; } s2;
+out struct S2 { vec4 a; } s2;       // ERROR
 
 struct SS { int a; };
 out layout(location = 15) SS ss1;
-out SS ss2;
+out SS ss2;                         // ERROR
+
+out gl_PerVertex {
+    vec4 gl_Position;
+    float gl_ClipDistance[2];
+};
 
 void main()
 {
+    gl_ClipDistance[0] = 1.0;
 }
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index ebe5b5070..af6eef8aa 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -4343,7 +4343,9 @@ void TParseContext::layoutObjectCheck(const TSourceLoc& loc, const TSymbol& symb
         switch (qualifier.storage) {
         case EvqVaryingIn:
         case EvqVaryingOut:
-            if (type.getBasicType() != EbtBlock || !(*type.getStruct())[0].type->getQualifier().hasLocation())
+            if (type.getBasicType() != EbtBlock || 
+                (!(*type.getStruct())[0].type->getQualifier().hasLocation() && 
+                  (*type.getStruct())[0].type->getQualifier().builtIn == EbvNone))
                 error(loc, "SPIR-V requires location for user input/output", "location", "");
             break;
         default:
-- 
GitLab