From b3f9e0a33407fff168d7eb6dc3c785000863e3ae Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Fri, 2 Feb 2018 12:39:47 -0700 Subject: [PATCH] GLSL: Fix #1229: merge array sizes in parameter declarations. --- Test/310AofA.vert | 6 ++++++ Test/baseResults/310AofA.vert.out | 19 +++++++++++++++++++ glslang/MachineIndependent/ParseHelper.cpp | 2 +- glslang/MachineIndependent/glslang.y | 4 ++-- glslang/MachineIndependent/glslang_tab.cpp | 4 ++-- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Test/310AofA.vert b/Test/310AofA.vert index a196388d..fba29772 100644 --- a/Test/310AofA.vert +++ b/Test/310AofA.vert @@ -113,3 +113,9 @@ out float outArray[2][3]; // ERROR uniform ubaa { int a; } ubaaname[2][3]; // ERROR + +vec3 func(in mat3[2] x[3]) +{ + mat3 a0 = x[2][1]; + return a0[2]; +} diff --git a/Test/baseResults/310AofA.vert.out b/Test/baseResults/310AofA.vert.out index 70b5968c..fdb5796a 100644 --- a/Test/baseResults/310AofA.vert.out +++ b/Test/baseResults/310AofA.vert.out @@ -317,6 +317,25 @@ ERROR: node is still EOpNull! 0:99 0 (const int) 0:99 Constant: 0:99 1 (const int) +0:117 Function Definition: func(mf33[3][2]; ( global highp 3-component vector of float) +0:117 Function Parameters: +0:117 'x' ( in 3-element array of 2-element array of highp 3X3 matrix of float) +0:119 Sequence +0:119 Sequence +0:119 move second child to first child ( temp highp 3X3 matrix of float) +0:119 'a0' ( temp highp 3X3 matrix of float) +0:119 direct index ( temp highp 3X3 matrix of float) +0:119 direct index ( temp 2-element array of highp 3X3 matrix of float) +0:119 'x' ( in 3-element array of 2-element array of highp 3X3 matrix of float) +0:119 Constant: +0:119 2 (const int) +0:119 Constant: +0:119 1 (const int) +0:120 Branch: Return with expression +0:120 direct index ( temp highp 3-component vector of float) +0:120 'a0' ( temp highp 3X3 matrix of float) +0:120 Constant: +0:120 2 (const int) 0:? Linker Objects 0:? 'name' (layout( column_major shared) buffer 3-element array of block{layout( column_major shared) buffer implicitly-sized array of highp float u, layout( column_major shared) buffer implicitly-sized array of highp 4-component vector of float v}) 0:? 'uname' (layout( column_major shared) uniform 3-element array of block{layout( column_major shared) uniform highp float u, layout( column_major shared) uniform implicitly-sized array of highp 4-component vector of float v}) diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index dd7b215c..eddbb2be 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -3103,7 +3103,7 @@ void TParseContext::arrayDimCheck(const TSourceLoc& loc, const TType* type, cons // void TParseContext::arrayDimMerge(TType& type, const TArraySizes* sizes) { - if (sizes) + if (sizes != nullptr) type.addArrayOuterSizes(*sizes); } diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y index 02969ba0..85be8f4f 100644 --- a/glslang/MachineIndependent/glslang.y +++ b/glslang/MachineIndependent/glslang.y @@ -902,9 +902,9 @@ parameter_declarator parseContext.arraySizeRequiredCheck($3.loc, *$3.arraySizes); parseContext.reservedErrorCheck($2.loc, *$2.string); - $1.arraySizes = $3.arraySizes; - TParameter param = { $2.string, new TType($1)}; + parseContext.arrayDimMerge(*param.type, $3.arraySizes); + $$.loc = $2.loc; $$.param = param; } diff --git a/glslang/MachineIndependent/glslang_tab.cpp b/glslang/MachineIndependent/glslang_tab.cpp index d7ab6491..6e372d5d 100644 --- a/glslang/MachineIndependent/glslang_tab.cpp +++ b/glslang/MachineIndependent/glslang_tab.cpp @@ -4433,9 +4433,9 @@ yyreduce: parseContext.arraySizeRequiredCheck((yyvsp[0].interm).loc, *(yyvsp[0].interm).arraySizes); parseContext.reservedErrorCheck((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string); - (yyvsp[-2].interm.type).arraySizes = (yyvsp[0].interm).arraySizes; - TParameter param = { (yyvsp[-1].lex).string, new TType((yyvsp[-2].interm.type))}; + parseContext.arrayDimMerge(*param.type, (yyvsp[0].interm).arraySizes); + (yyval.interm).loc = (yyvsp[-1].lex).loc; (yyval.interm).param = param; }