SPV: Fix #1783: Don't do bounds checking for spec-const-expression size

It's okay for symbolic spec-consts, but without constant folding,
not okay when the array size is an expression.
This commit is contained in:
John Kessenich 2019-07-03 09:28:28 -06:00
parent 4b4b41a634
commit 96524f9168
5 changed files with 29 additions and 2 deletions

View File

@ -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

View File

@ -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];
}

View File

@ -1,3 +1,3 @@
// This header is generated by the make-revision script.
#define GLSLANG_PATCH_LEVEL 3276
#define GLSLANG_PATCH_LEVEL 3294

View File

@ -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;
}

View File

@ -545,6 +545,7 @@ INSTANTIATE_TEST_CASE_P(
"vulkan.vert",
"vulkan.comp",
"samplerlessTextureFunctions.frag",
"spv.specConstArrayCheck.vert",
})),
FileNameAsCustomTestSuffix
);