Fix #2191: Error check for indexing reference containing unsize array.
authorJohn Kessenich <cepheus@frii.com>
Fri, 1 May 2020 14:19:59 +0000 (08:19 -0600)
committerJohn Kessenich <cepheus@frii.com>
Fri, 1 May 2020 14:19:59 +0000 (08:19 -0600)
Test/baseResults/spv.bufferhandle_Error.frag.out
Test/spv.bufferhandle_Error.frag
glslang/MachineIndependent/ParseHelper.cpp

index a1ee9a4..345bfa5 100644 (file)
@@ -14,12 +14,15 @@ ERROR: 0:14: 'buffer_reference' : can only be used with buffer
 ERROR: 0:14: 'buffer_reference' : can only be used with buffer 
 ERROR: 0:30: 'length' :  array must be declared with a size before using this method
 ERROR: 0:31: 'length' :  array must be declared with a size before using this method
-ERROR: 0:35: '=' :  cannot convert from 'layout( column_major std430) buffer reference' to ' temp reference'
-ERROR: 0:40: 'assign' :  cannot convert from 'layout( column_major std430) buffer reference' to 'layout( column_major std430) buffer reference'
+ERROR: 0:32: 'buffer reference indexing' : required extension not requested: GL_EXT_buffer_reference2
+ERROR: 0:32: '' : cannot index reference to buffer containing an unsized array 
+ERROR: 0:32: '' : cannot index buffer reference 
+ERROR: 0:36: '=' :  cannot convert from 'layout( column_major std430) buffer reference' to ' temp reference'
 ERROR: 0:41: 'assign' :  cannot convert from 'layout( column_major std430) buffer reference' to 'layout( column_major std430) buffer reference'
 ERROR: 0:42: 'assign' :  cannot convert from 'layout( column_major std430) buffer reference' to 'layout( column_major std430) buffer reference'
-ERROR: 0:45: '' :  syntax error, unexpected LEFT_BRACE, expecting COMMA or SEMICOLON
-ERROR: 20 compilation errors.  No code generated.
+ERROR: 0:43: 'assign' :  cannot convert from 'layout( column_major std430) buffer reference' to 'layout( column_major std430) buffer reference'
+ERROR: 0:46: '' :  syntax error, unexpected LEFT_BRACE, expecting COMMA or SEMICOLON
+ERROR: 23 compilation errors.  No code generated.
 
 
 SPIR-V is not generated for failed compile or link
index 98cbac8..034e054 100644 (file)
@@ -29,6 +29,7 @@ void f()
     bufType6 b;\r
     b.x.length();\r
     b4.b6.x.length();\r
+    b[2];               // ERROR, can't index due to unsized array\r
 }\r
 \r
 void main() {\r
index ea89e43..117c164 100644 (file)
@@ -428,8 +428,18 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn
 #ifndef GLSLANG_WEB
     if (base->isReference() && ! base->isArray()) {
         requireExtensions(loc, 1, &E_GL_EXT_buffer_reference2, "buffer reference indexing");
-        result = intermediate.addBinaryMath(EOpAdd, base, index, loc);
-        result->setType(base->getType());
+        if (base->getType().getReferentType()->containsUnsizedArray()) {
+            error(loc, "cannot index reference to buffer containing an unsized array", "", "");
+            result = nullptr;
+        } else {
+            result = intermediate.addBinaryMath(EOpAdd, base, index, loc);
+            if (result != nullptr)
+                result->setType(base->getType());
+        }
+        if (result == nullptr) {
+            error(loc, "cannot index buffer reference", "", "");
+            result = intermediate.addConstantUnion(0.0, EbtFloat, loc);
+        }
         return result;
     }
     if (base->getAsSymbolNode() && isIoResizeArray(base->getType()))