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