From 78a3c915a1d70cf236588cc3c88f4db0566494a4 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 2 Jun 2020 08:32:35 +0200 Subject: [PATCH] HLSL: Add better diagnostic when using in/out qualifiers in global scope (#2258) --- Test/baseResults/hlsl.inoutquals.negative.frag.out | 43 ++++++++++++++++++++++ Test/hlsl.inoutquals.negative.frag | 7 ++++ gtests/Hlsl.FromFile.cpp | 1 + hlsl/hlslGrammar.cpp | 10 +++++ 4 files changed, 61 insertions(+) create mode 100644 Test/baseResults/hlsl.inoutquals.negative.frag.out create mode 100644 Test/hlsl.inoutquals.negative.frag diff --git a/Test/baseResults/hlsl.inoutquals.negative.frag.out b/Test/baseResults/hlsl.inoutquals.negative.frag.out new file mode 100644 index 0000000..933e6a6 --- /dev/null +++ b/Test/baseResults/hlsl.inoutquals.negative.frag.out @@ -0,0 +1,43 @@ +hlsl.inoutquals.negative.frag +ERROR: 0:1: 'invalid1' : in/out qualifiers are only valid on parameters +ERROR: 0:2: 'invalid2' : in/out qualifiers are only valid on parameters +ERROR: 0:3: 'invalid3' : in/out qualifiers are only valid on parameters +ERROR: 0:4: 'invalid4' : in/out qualifiers are only valid on parameters +ERROR: 4 compilation errors. No code generated. + + +Shader version: 500 +gl_FragCoord origin is upper left +ERROR: node is still EOpNull! +0:6 Function Definition: @main( ( temp void) +0:6 Function Parameters: +0:6 Function Definition: main( ( temp void) +0:6 Function Parameters: +0:? Sequence +0:6 Function Call: @main( ( temp void) +0:? Linker Objects +0:? 'invalid1' ( in float) +0:? 'invalid2' ( inout float) +0:? 'invalid3' ( inout float) +0:? 'invalid4' ( out float) + + +Linked fragment stage: + + +Shader version: 500 +gl_FragCoord origin is upper left +ERROR: node is still EOpNull! +0:6 Function Definition: @main( ( temp void) +0:6 Function Parameters: +0:6 Function Definition: main( ( temp void) +0:6 Function Parameters: +0:? Sequence +0:6 Function Call: @main( ( temp void) +0:? Linker Objects +0:? 'invalid1' ( in float) +0:? 'invalid2' ( inout float) +0:? 'invalid3' ( inout float) +0:? 'invalid4' ( out float) + +SPIR-V is not generated for failed compile or link diff --git a/Test/hlsl.inoutquals.negative.frag b/Test/hlsl.inoutquals.negative.frag new file mode 100644 index 0000000..380dc2c --- /dev/null +++ b/Test/hlsl.inoutquals.negative.frag @@ -0,0 +1,7 @@ +in float invalid1; +in out float invalid2; +inout float invalid3; +out float invalid4; + +void main() { +} diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp index 4601bd1..c5e6d9f 100755 --- a/gtests/Hlsl.FromFile.cpp +++ b/gtests/Hlsl.FromFile.cpp @@ -239,6 +239,7 @@ INSTANTIATE_TEST_CASE_P( {"hlsl.implicitBool.frag", "main"}, {"hlsl.inf.vert", "main"}, {"hlsl.inoutquals.frag", "main"}, + {"hlsl.inoutquals.negative.frag", "main"}, {"hlsl.init.frag", "ShaderFunction"}, {"hlsl.init2.frag", "main"}, {"hlsl.isfinite.frag", "main"}, diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index e633767..5bfc53f 100644 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -382,6 +382,16 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& nodeList) if (forbidDeclarators) return true; + // Check if there are invalid in/out qualifiers + switch (declaredType.getQualifier().storage) { + case EvqIn: + case EvqOut: + case EvqInOut: + parseContext.error(token.loc, "in/out qualifiers are only valid on parameters", token.string->c_str(), ""); + default: + break; + } + // declarator_list // : declarator // : identifier -- 2.7.4