diff --git a/Test/baseResults/spv.specConstArrayCheck.vert.out b/Test/baseResults/spv.specConstArrayCheck.vert.out new file mode 100755 index 00000000..d9b0779f --- /dev/null +++ b/Test/baseResults/spv.specConstArrayCheck.vert.out @@ -0,0 +1,6 @@ +spv.specConstArrayCheck.vert +ERROR: 0:13: '[' : array index out of range '6' +ERROR: 1 compilation errors. No code generated. + + +SPIR-V is not generated for failed compile or link diff --git a/Test/spv.specConstArrayCheck.vert b/Test/spv.specConstArrayCheck.vert new file mode 100755 index 00000000..9f0dc0b0 --- /dev/null +++ b/Test/spv.specConstArrayCheck.vert @@ -0,0 +1,14 @@ +#version 450 + +layout(constant_id = 0) const uint a = 1; +layout(constant_id = 1) const uint b = 2; +layout(location = 0) out uint o; + +void main() { + uint arr1[a+a]; + uint arr2[b]; + o = arr1[1]; + o = arr2[1]; + o = arr1[6]; + o = arr2[6]; +} diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index a22ceb4b..95ce7600 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -1,3 +1,3 @@ // This header is generated by the make-revision script. -#define GLSLANG_PATCH_LEVEL 3276 +#define GLSLANG_PATCH_LEVEL 3294 diff --git a/glslang/MachineIndependent/ParseContextBase.cpp b/glslang/MachineIndependent/ParseContextBase.cpp index c9ddaead..e0de1a4a 100644 --- a/glslang/MachineIndependent/ParseContextBase.cpp +++ b/glslang/MachineIndependent/ParseContextBase.cpp @@ -254,11 +254,17 @@ void TParseContextBase::trackLinkage(TSymbol& symbol) // Give an error if not. void TParseContextBase::checkIndex(const TSourceLoc& loc, const TType& type, int& index) { + const auto sizeIsSpecializationExpression = [&type]() { + return type.containsSpecializationSize() && + type.getArraySizes()->getOuterNode() != nullptr && + type.getArraySizes()->getOuterNode()->getAsSymbolNode() == nullptr; }; + if (index < 0) { error(loc, "", "[", "index out of range '%d'", index); index = 0; } else if (type.isArray()) { - if (type.isSizedArray() && index >= type.getOuterArraySize()) { + if (type.isSizedArray() && !sizeIsSpecializationExpression() && + index >= type.getOuterArraySize()) { error(loc, "", "[", "array index out of range '%d'", index); index = type.getOuterArraySize() - 1; } diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index c7b7a892..167adaa0 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -545,6 +545,7 @@ INSTANTIATE_TEST_CASE_P( "vulkan.vert", "vulkan.comp", "samplerlessTextureFunctions.frag", + "spv.specConstArrayCheck.vert", })), FileNameAsCustomTestSuffix );