diff --git a/Test/130.frag b/Test/130.frag index fd81bbfd219fd13d80c236cb2e62baa03f7c4fad..a5903928042dfd632221e70ed98b548893e68c4d 100644 --- a/Test/130.frag +++ b/Test/130.frag @@ -117,6 +117,9 @@ void bar235() c = textureGrad(Isca, i, vec3(0.1), vec3(0.2)); } +int \ + x; // ERROR until 420pack is turned on + #extension GL_ARB_shading_language_420pack : enable const int ai[3] = { 10, 23, 32 }; @@ -125,11 +128,19 @@ uniform layout(binding=0) sampler2D bounds; void bar23444() { - mat4x3 m43; + mat4x3 m43; \ float a1 = m43[3].y; - int a2 = m43.length(); // ERROR until shading_language_420pack is fully implemented + vec3 v3; + int a2 = m43.length(); + a2 += m43[1].length(); + a2 += v3.length(); const float b = 2 * a1; - a.x = gl_MinProgramTexelOffset + gl_MaxProgramTexelOffset; // ERROR until shading_language_420pack is fully implemented + a.x = gl_MinProgramTexelOffset + gl_MaxProgramTexelOffset; + bool boolb; + boolb.length(); // ERROR + m43[3][1].length(); // ERROR + v3.length; // ERROR + v3.length(b); // ERROR } in float gl_FogFragCoord; diff --git a/Test/420.vert b/Test/420.vert index 6343a005deb767707339725bd958b2e1ced15de8..9acc8021ac21669f2fda04b6e72d6f9ed6d5452a 100644 --- a/Test/420.vert +++ b/Test/420.vert @@ -83,4 +83,16 @@ out gl_PerVertex { }; patch in vec4 patchIn; // ERROR -patch out vec4 patchOut; // ERROR \ No newline at end of file +patch out vec4 patchOut; // ERROR + +void bar23444() +{ + mat4x3 m43; \ + float a1 = m43[3].y; + vec3 v3; + int a2 = m43.length(); + a2 += m43[1].length(); + a2 += v3.length(); + const float b = 2 * a1; + int a = gl_MinProgramTexelOffset + gl_MaxProgramTexelOffset; +} diff --git a/Test/baseResults/120.vert.out b/Test/baseResults/120.vert.out index 301f0775ae9c71d54197d35b5aebaa384ce13989..1111c073d515bb4e2804c4086f942e1f84fa44ce 100644 --- a/Test/baseResults/120.vert.out +++ b/Test/baseResults/120.vert.out @@ -11,9 +11,9 @@ ERROR: 0:21: 'assign' : l-value required (can't modify a const) ERROR: 0:28: 'length' : array must be declared with a size before using this method ERROR: 0:31: 'length' : incomplete method syntax ERROR: 0:32: 'length' : method does not accept any arguments -ERROR: 0:33: 'flizbit' : only the length method is supported for array +ERROR: 0:33: 'flizbit' : does not apply to this type: 7-element array of float ERROR: 0:33: '=' : cannot convert from '7-element array of float' to 'int' -ERROR: 0:34: 'flizbit' : only the length method is supported for array +ERROR: 0:34: 'flizbit' : does not apply to this type: 7-element array of float ERROR: 0:34: 'f' : can't use function syntax on variable ERROR: 0:34: 'a4' : redefinition ERROR: 0:35: 'arrays of arrays' : not supported with this profile: none @@ -123,7 +123,7 @@ ERROR: node is still EOpNull! 0:32 move second child to first child (int) 0:32 'a3' (int) 0:32 Constant: -0:32 12 (const int) +0:32 1 (const int) 0:43 move second child to first child (float) 0:43 'gl_PointSize' (invariant gl_PointSize float) 0:43 Constant: @@ -442,7 +442,7 @@ ERROR: node is still EOpNull! 0:32 move second child to first child (int) 0:32 'a3' (int) 0:32 Constant: -0:32 12 (const int) +0:32 1 (const int) 0:43 move second child to first child (float) 0:43 'gl_PointSize' (invariant gl_PointSize float) 0:43 Constant: diff --git a/Test/baseResults/130.frag.out b/Test/baseResults/130.frag.out index 8ab00fd94af76c619a4b0ea4a174809fccde3392..31900941d67fb9d8c354c160b9a498c56288681f 100644 --- a/Test/baseResults/130.frag.out +++ b/Test/baseResults/130.frag.out @@ -13,17 +13,22 @@ ERROR: 0:81: 'textureGatherOffset(...)' : not supported for this version or the ERROR: 0:84: 'textureGatherOffset(...)' : not supported for this version or the enabled extensions ERROR: 0:85: 'textureGatherOffset(...)' : not supported for this version or the enabled extensions WARNING: 0:88: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5 -WARNING: 0:120: '#extension' : extension is only partially supported: GL_ARB_shading_language_420pack -ERROR: 0:123: 'uniform block' : not supported for this version or the enabled extensions -ERROR: 0:130: '.' : field selection not allowed on matrix -ERROR: 0:130: 'm43' : can't use function syntax on variable -ERROR: 0:130: '=' : cannot convert from 'const float' to 'int' -ERROR: 0:132: 'gl_MinProgramTexelOffset' : undeclared identifier -ERROR: 0:132: 'gl_MaxProgramTexelOffset' : undeclared identifier -ERROR: 0:135: 'gl_FogFragCoord' : identifiers starting with "gl_" are reserved -ERROR: 0:140: 'int' : must be qualified as flat in -ERROR: 0:140: 'redeclaration' : cannot change the type of gl_FogFragCoord -ERROR: 21 compilation errors. No code generated. +ERROR: 0:120: 'line continuation' : not supported for this version or the enabled extensions +WARNING: 0:123: '#extension' : extension is only partially supported: GL_ARB_shading_language_420pack +ERROR: 0:126: 'uniform block' : not supported for this version or the enabled extensions +ERROR: 0:138: 'gl_MinProgramTexelOffset' : undeclared identifier +ERROR: 0:138: 'gl_MaxProgramTexelOffset' : undeclared identifier +ERROR: 0:140: 'length' : does not operate on this type: bool +ERROR: 0:140: 'boolb' : can't use function syntax on variable +ERROR: 0:141: 'length' : does not operate on this type: float +ERROR: 0:141: '' : function call, method, or subroutine call expected +ERROR: 0:141: '' : no matching overloaded function found +ERROR: 0:142: 'length' : incomplete method syntax +ERROR: 0:143: 'length' : method does not accept any arguments +ERROR: 0:146: 'gl_FogFragCoord' : identifiers starting with "gl_" are reserved +ERROR: 0:151: 'int' : must be qualified as flat in +ERROR: 0:151: 'redeclaration' : cannot change the type of gl_FogFragCoord +ERROR: 26 compilation errors. No code generated. Shader version: 130 @@ -300,34 +305,53 @@ ERROR: node is still EOpNull! 0:117 0.200000 0:117 0.200000 0:117 0.200000 -0:126 Function Definition: bar23444( (void) -0:126 Function Parameters: +0:129 Function Definition: bar23444( (void) +0:129 Function Parameters: 0:? Sequence -0:129 Sequence -0:129 move second child to first child (float) -0:129 'a1' (float) -0:129 direct index (float) -0:129 direct index (3-component vector of float) -0:129 'm43' (4X3 matrix of float) -0:129 Constant: -0:129 3 (const int) -0:129 Constant: -0:129 1 (const int) -0:131 Sequence -0:131 move second child to first child (float) -0:131 'b' (const (read only) float) -0:131 component-wise multiply (float) -0:131 Constant: -0:131 2.000000 -0:131 'a1' (float) -0:132 move second child to first child (float) -0:132 direct index (float) -0:132 'a' (3-component vector of float) -0:132 Constant: -0:132 0 (const int) -0:132 add (float) -0:132 'gl_MinProgramTexelOffset' (float) -0:132 'gl_MaxProgramTexelOffset' (float) +0:132 Sequence +0:132 move second child to first child (float) +0:132 'a1' (float) +0:132 direct index (float) +0:132 direct index (3-component vector of float) +0:132 'm43' (4X3 matrix of float) +0:132 Constant: +0:132 3 (const int) +0:132 Constant: +0:132 1 (const int) +0:134 Sequence +0:134 move second child to first child (int) +0:134 'a2' (int) +0:134 Constant: +0:134 4 (const int) +0:135 add second child into first child (int) +0:135 'a2' (int) +0:135 Constant: +0:135 3 (const int) +0:136 add second child into first child (int) +0:136 'a2' (int) +0:136 Constant: +0:136 3 (const int) +0:137 Sequence +0:137 move second child to first child (float) +0:137 'b' (const (read only) float) +0:137 component-wise multiply (float) +0:137 Constant: +0:137 2.000000 +0:137 'a1' (float) +0:138 move second child to first child (float) +0:138 direct index (float) +0:138 'a' (3-component vector of float) +0:138 Constant: +0:138 0 (const int) +0:138 add (float) +0:138 'gl_MinProgramTexelOffset' (float) +0:138 'gl_MaxProgramTexelOffset' (float) +0:140 Constant: +0:140 0.000000 +0:141 Constant: +0:141 0.000000 +0:143 Constant: +0:143 1 (const int) 0:? Linker Objects 0:? 'a' (3-component vector of float) 0:? 'b' (float) @@ -349,6 +373,7 @@ ERROR: node is still EOpNull! 0:? 'Isca' (uniform isamplerCubeArray) 0:? 'Usca' (uniform usamplerCubeArray) 0:? 'Scas' (uniform samplerCubeArrayShadow) +0:? 'x' (int) 0:? 'ai' (const 3-element array of int) 0:? 10 (const int) 0:? 23 (const int) @@ -635,34 +660,53 @@ ERROR: node is still EOpNull! 0:117 0.200000 0:117 0.200000 0:117 0.200000 -0:126 Function Definition: bar23444( (void) -0:126 Function Parameters: +0:129 Function Definition: bar23444( (void) +0:129 Function Parameters: 0:? Sequence -0:129 Sequence -0:129 move second child to first child (float) -0:129 'a1' (float) -0:129 direct index (float) -0:129 direct index (3-component vector of float) -0:129 'm43' (4X3 matrix of float) -0:129 Constant: -0:129 3 (const int) -0:129 Constant: -0:129 1 (const int) -0:131 Sequence -0:131 move second child to first child (float) -0:131 'b' (const (read only) float) -0:131 component-wise multiply (float) -0:131 Constant: -0:131 2.000000 -0:131 'a1' (float) -0:132 move second child to first child (float) -0:132 direct index (float) -0:132 'a' (3-component vector of float) -0:132 Constant: -0:132 0 (const int) -0:132 add (float) -0:132 'gl_MinProgramTexelOffset' (float) -0:132 'gl_MaxProgramTexelOffset' (float) +0:132 Sequence +0:132 move second child to first child (float) +0:132 'a1' (float) +0:132 direct index (float) +0:132 direct index (3-component vector of float) +0:132 'm43' (4X3 matrix of float) +0:132 Constant: +0:132 3 (const int) +0:132 Constant: +0:132 1 (const int) +0:134 Sequence +0:134 move second child to first child (int) +0:134 'a2' (int) +0:134 Constant: +0:134 4 (const int) +0:135 add second child into first child (int) +0:135 'a2' (int) +0:135 Constant: +0:135 3 (const int) +0:136 add second child into first child (int) +0:136 'a2' (int) +0:136 Constant: +0:136 3 (const int) +0:137 Sequence +0:137 move second child to first child (float) +0:137 'b' (const (read only) float) +0:137 component-wise multiply (float) +0:137 Constant: +0:137 2.000000 +0:137 'a1' (float) +0:138 move second child to first child (float) +0:138 direct index (float) +0:138 'a' (3-component vector of float) +0:138 Constant: +0:138 0 (const int) +0:138 add (float) +0:138 'gl_MinProgramTexelOffset' (float) +0:138 'gl_MaxProgramTexelOffset' (float) +0:140 Constant: +0:140 0.000000 +0:141 Constant: +0:141 0.000000 +0:143 Constant: +0:143 1 (const int) 0:? Linker Objects 0:? 'a' (3-component vector of float) 0:? 'b' (float) @@ -684,6 +728,7 @@ ERROR: node is still EOpNull! 0:? 'Isca' (uniform isamplerCubeArray) 0:? 'Usca' (uniform usamplerCubeArray) 0:? 'Scas' (uniform samplerCubeArrayShadow) +0:? 'x' (int) 0:? 'ai' (const 3-element array of int) 0:? 10 (const int) 0:? 23 (const int) diff --git a/Test/baseResults/150.tesc.out b/Test/baseResults/150.tesc.out index 003179ec7b173f41f0f2546fb989b0f85ecec639..e9b54974c45259659437ee1ad3579f4f90269107 100644 --- a/Test/baseResults/150.tesc.out +++ b/Test/baseResults/150.tesc.out @@ -533,7 +533,7 @@ Warning, version 400 is not yet complete; most version-specific features are pre ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size of gl_out ERROR: 0:11: 'vertices' : inconsistent output number of vertices for array size of a ERROR: 0:12: 'vertices' : inconsistent output number of vertices for array size of outb -ERROR: 0:26: 'gl_PointSize' : no such field in structure +ERROR: 0:26: 'gl_PointSize' : no such field in structure ERROR: 0:26: 'assign' : cannot convert from 'float' to 'block{out 4-component vector of float gl_Position}' ERROR: 0:29: 'out' : type must be an array: outf ERROR: 6 compilation errors. No code generated. diff --git a/Test/baseResults/410.geom.out b/Test/baseResults/410.geom.out index 0e7c7cccabcf120d1ceeb9456176c4fbc3789f87..e3ca9161c3b88a430c8c410b604ede2e1b3d2b7b 100644 --- a/Test/baseResults/410.geom.out +++ b/Test/baseResults/410.geom.out @@ -3,7 +3,7 @@ Warning, version 410 is not yet complete; most version-specific features are pre ERROR: 0:8: 'myIn' : cannot redeclare a built-in block with a user name ERROR: 0:12: 'gl_myIn' : no declaration found for redeclaration ERROR: 0:20: 'gl_PerVertex' : can only redeclare a built-in block once, and before any use -ERROR: 0:32: 'gl_Position' : no such field in structure +ERROR: 0:32: 'gl_Position' : no such field in structure ERROR: 0:32: '=' : cannot convert from 'block{in float gl_PointSize}' to '4-component vector of float' ERROR: 0:33: 'gl_Position' : member of nameless block was not redeclared ERROR: 0:33: 'assign' : cannot convert from 'const 4-component vector of float' to 'layout(stream=0 ) gl_Position void' diff --git a/Test/baseResults/420.tesc.out b/Test/baseResults/420.tesc.out index 2ceeb407d54d39296a053f993e5912bdda677e5f..c7754a6ec5bcee714386619e60cb1e9305bd740f 100644 --- a/Test/baseResults/420.tesc.out +++ b/Test/baseResults/420.tesc.out @@ -3,7 +3,7 @@ Warning, version 400 is not yet complete; most version-specific features are pre ERROR: 0:7: 'vertices' : inconsistent output number of vertices for array size of gl_out ERROR: 0:11: 'vertices' : inconsistent output number of vertices for array size of a ERROR: 0:12: 'vertices' : inconsistent output number of vertices for array size of outb -ERROR: 0:26: 'gl_PointSize' : no such field in structure +ERROR: 0:26: 'gl_PointSize' : no such field in structure ERROR: 0:26: 'assign' : cannot convert from 'float' to 'block{out 4-component vector of float gl_Position}' ERROR: 0:29: 'out' : type must be an array: outf ERROR: 6 compilation errors. No code generated. diff --git a/Test/baseResults/420.vert.out b/Test/baseResults/420.vert.out index 93a649cd003b2b1659ce45e6317e8f8312346b1f..b065ffc3a5b5d504c9f68aa11f14c4d4dc6edb21 100644 --- a/Test/baseResults/420.vert.out +++ b/Test/baseResults/420.vert.out @@ -31,7 +31,10 @@ ERROR: 0:76: 'binding' : sampler binding not less than gl_MaxCombinedTextureImag ERROR: 0:85: 'patch' : not supported in this stage: vertex ERROR: 0:85: '' : vertex input cannot be further qualified ERROR: 0:86: 'patch' : not supported in this stage: vertex -ERROR: 30 compilation errors. No code generated. +ERROR: 0:97: 'gl_MinProgramTexelOffset' : undeclared identifier +ERROR: 0:97: 'gl_MaxProgramTexelOffset' : undeclared identifier +ERROR: 0:97: '=' : cannot convert from 'float' to 'int' +ERROR: 33 compilation errors. No code generated. Shader version: 420 @@ -105,6 +108,39 @@ ERROR: node is still EOpNull! 0:61 'f' (float) 0:62 'f' (float) 0:63 'f' (float) +0:88 Function Definition: bar23444( (void) +0:88 Function Parameters: +0:? Sequence +0:91 Sequence +0:91 move second child to first child (float) +0:91 'a1' (float) +0:91 direct index (float) +0:91 direct index (3-component vector of float) +0:91 'm43' (4X3 matrix of float) +0:91 Constant: +0:91 3 (const int) +0:91 Constant: +0:91 1 (const int) +0:93 Sequence +0:93 move second child to first child (int) +0:93 'a2' (int) +0:93 Constant: +0:93 4 (const int) +0:94 add second child into first child (int) +0:94 'a2' (int) +0:94 Constant: +0:94 3 (const int) +0:95 add second child into first child (int) +0:95 'a2' (int) +0:95 Constant: +0:95 3 (const int) +0:96 Sequence +0:96 move second child to first child (float) +0:96 'b' (const (read only) float) +0:96 component-wise multiply (float) +0:96 Constant: +0:96 2.000000 +0:96 'a1' (float) 0:? Linker Objects 0:? 'v2' (smooth out 2-component vector of float) 0:? 'bad' (in 10-element array of 4-component vector of float) @@ -215,6 +251,39 @@ ERROR: node is still EOpNull! 0:61 'f' (float) 0:62 'f' (float) 0:63 'f' (float) +0:88 Function Definition: bar23444( (void) +0:88 Function Parameters: +0:? Sequence +0:91 Sequence +0:91 move second child to first child (float) +0:91 'a1' (float) +0:91 direct index (float) +0:91 direct index (3-component vector of float) +0:91 'm43' (4X3 matrix of float) +0:91 Constant: +0:91 3 (const int) +0:91 Constant: +0:91 1 (const int) +0:93 Sequence +0:93 move second child to first child (int) +0:93 'a2' (int) +0:93 Constant: +0:93 4 (const int) +0:94 add second child into first child (int) +0:94 'a2' (int) +0:94 Constant: +0:94 3 (const int) +0:95 add second child into first child (int) +0:95 'a2' (int) +0:95 Constant: +0:95 3 (const int) +0:96 Sequence +0:96 move second child to first child (float) +0:96 'b' (const (read only) float) +0:96 component-wise multiply (float) +0:96 Constant: +0:96 2.000000 +0:96 'a1' (float) 0:? Linker Objects 0:? 'v2' (smooth out 2-component vector of float) 0:? 'bad' (in 10-element array of 4-component vector of float) diff --git a/Test/baseResults/matrixError.vert.out b/Test/baseResults/matrixError.vert.out index 1b0e8e39313591df9cf2cc5a0f1cb99f3a47ab59..d60f156cf0ba4c69f3162bccf2c8708e244035aa 100644 --- a/Test/baseResults/matrixError.vert.out +++ b/Test/baseResults/matrixError.vert.out @@ -3,7 +3,7 @@ ERROR: 0:10: 'constructor' : too many arguments ERROR: 0:7: 'const' : non-matching or non-convertible constant type for const initializer ERROR: 0:17: 'assign' : cannot convert from '2-component vector of float' to '3-component vector of float' ERROR: 0:18: 'assign' : cannot convert from '2-component vector of float' to '3-component vector of float' -ERROR: 0:19: '.' : field selection not allowed on matrix +ERROR: 0:19: 'xy' : does not apply to this type: 2X3 matrix of float ERROR: 0:21: '[' : matrix index out of range '2' ERROR: 0:21: '[' : vector index out of range '4' ERROR: 7 compilation errors. No code generated. diff --git a/Test/baseResults/specExamples.frag.out b/Test/baseResults/specExamples.frag.out index 88b86498fbc6da7a0f2429a0ece18cd35931f057..3d1ef00786bbc31e84e2038d87b1c8e471ad5393 100644 --- a/Test/baseResults/specExamples.frag.out +++ b/Test/baseResults/specExamples.frag.out @@ -27,21 +27,18 @@ ERROR: 0:150: '=' : cannot convert from 'const float' to '3-element array of 4- ERROR: 0:152: 'constructor' : cannot convert parameter 1 from 'const 2-element array of 4-component vector of float' to '4-component vector of float' ERROR: 0:172: 'x' : undeclared identifier ERROR: 0:172: '[]' : scalar integer expression required -ERROR: 0:172: 'length' : illegal vector field selection -ERROR: 0:172: '' : function call, method, or subroutine call expected -ERROR: 0:172: '' : no matching overloaded function found ERROR: 0:175: 'x' : undeclared identifier ERROR: 0:175: '[]' : scalar integer expression required ERROR: 0:175: 'b' : left of '[' is not of type array, matrix, or vector ERROR: 0:175: 'a' : vector field selection out of range -ERROR: 0:175: 'length' : illegal vector field selection +ERROR: 0:175: 'length' : does not operate on this type: const float ERROR: 0:175: '' : function call, method, or subroutine call expected ERROR: 0:175: '' : no matching overloaded function found ERROR: 0:178: '[]' : scalar integer expression required ERROR: 0:178: 's' : undeclared identifier ERROR: 0:178: 's' : left of '[' is not of type array, matrix, or vector ERROR: 0:178: 'a' : vector field selection out of range -ERROR: 0:178: 'length' : illegal vector field selection +ERROR: 0:178: 'length' : does not operate on this type: const float ERROR: 0:178: '' : function call, method, or subroutine call expected ERROR: 0:178: '' : no matching overloaded function found ERROR: 0:198: 'e' : redefinition @@ -49,7 +46,7 @@ ERROR: 0:226: 'in' : not allowed in nested scope ERROR: 0:227: 'in' : not allowed in nested scope ERROR: 0:228: 'in' : not allowed in nested scope ERROR: 0:232: 'out' : not allowed in nested scope -ERROR: 49 compilation errors. No code generated. +ERROR: 46 compilation errors. No code generated. Shader version: 430 @@ -196,7 +193,7 @@ ERROR: node is still EOpNull! 0:171 Constant: 0:171 3 (const int) 0:172 Constant: -0:172 0.000000 +0:172 4 (const int) 0:175 Constant: 0:175 0.000000 0:178 Constant: @@ -448,7 +445,7 @@ ERROR: node is still EOpNull! 0:171 Constant: 0:171 3 (const int) 0:172 Constant: -0:172 0.000000 +0:172 4 (const int) 0:175 Constant: 0:175 0.000000 0:178 Constant: diff --git a/Todo.txt b/Todo.txt index a516949bf1cc6719b37d7d5d8b815ea5e243eaea..db4d4a3b7077286dd99067f28336f8bd5cb42c81 100644 --- a/Todo.txt +++ b/Todo.txt @@ -172,7 +172,7 @@ Shader Functionality to Implement/Finish - qualifiers can act independently on the opaque shader variable and the backing image, so extra qualifiers can be used to separately qualify these + Variables declared in if and else statements are scoped only to the end of those statements, especially for non-compound statements Note, this is not backward compatible, it may depend on #version. - - Allow implicit conversions of return values to the declared type of the function. + + Allow implicit conversions of return values to the declared type of the function. + The const keyword can be used to declare variables within a function body with initializer expressions that are not constant expressions. + Qualifiers on variable declarations no longer have to follow a strict order. The layout qualifier can be used multiple times, and multiple parameter qualifiers can be used. + Parameter qualifiers can include precision and memory qualifiers. @@ -184,7 +184,7 @@ Shader Functionality to Implement/Finish - packSnorm2x16and unpackSnorm2x16 - Add gl_FragDepth layout qualifiers to communicate what kind of changes will be made to gl_FragDepth (GL_AMD_conservative depth). + Add C-style curly brace initializer lists syntax for initializers. Full initialization of aggregates is required when these are used. - - Allow .length() to be applied to vectors and matrices, returning the number of components or columns. + + Allow .length() to be applied to vectors and matrices, returning the number of components or columns. + Clarify that .length() returns an int type and can be used as a constant integer expression. + Allow swizzle operations on scalars. + Positive signed decimal literals, as well as octal and hexadecimal, can set all 32 bits. This includes setting the sign bit to create a negative value. diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h index 66f8891af9bd5e5472a9351361b8eac9c1c89548..2ce2409be20d8df5f77e34dbb42a9a9b3d3f2507 100644 --- a/glslang/Include/intermediate.h +++ b/glslang/Include/intermediate.h @@ -312,7 +312,7 @@ enum TOperator { // Array operators // - EOpArrayLength, + EOpArrayLength, // "Array" distinguishes from length(v) built-in function, but it applies to vectors and matrices as well. }; class TIntermTraverser; diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 0f5f81b590da4976680020399f6807a1c684a71d..c0fe1970b6bda8f340046d5c1ee6a082bedd46fb 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -669,22 +669,32 @@ void TParseContext::checkIoArrayConsistency(TSourceLoc loc, int requiredSize, co // TIntermTyped* TParseContext::handleDotDereference(TSourceLoc loc, TIntermTyped* base, TString& field) { - TIntermTyped* result = base; - variableCheck(base); - if (base->isArray()) { - // - // It can only be a method (e.g., length), which can't be resolved until - // we later see the function calling syntax. Save away the name for now. - // - if (field == "length") { + // + // .length() can't be resolved until we later see the function-calling syntax. + // Save away the name in the AST for now. Processing is compeleted in + // handleLengthMethod(). + // + if (field == "length") { + if (base->isArray()) { profileRequires(loc, ENoProfile, 120, GL_3DL_array_objects, ".length"); profileRequires(loc, EEsProfile, 300, 0, ".length"); - result = intermediate.addMethod(base, TType(EbtInt), &field, loc); - } else - error(loc, "only the length method is supported for array", field.c_str(), ""); - } else if (base->isVector() || base->isScalar()) { + } else if (base->isVector() || base->isMatrix()) { + const char* feature = ".length() on vectors and matrices"; + requireProfile(loc, ~EEsProfile, feature); + profileRequires(loc, ~EEsProfile, 420, GL_ARB_shading_language_420pack, feature); + } else { + error(loc, "does not operate on this type:", field.c_str(), base->getType().getCompleteString().c_str()); + + return base; + } + + return intermediate.addMethod(base, TType(EbtInt), &field, loc); + } + + TIntermTyped* result = base; + if (base->isVector() || base->isScalar()) { if (base->isScalar()) { const char* dotFeature = "scalar swizzle"; requireProfile(loc, ~EEsProfile, dotFeature); @@ -720,9 +730,7 @@ TIntermTyped* TParseContext::handleDotDereference(TSourceLoc loc, TIntermTyped* result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision, (int) vectorString.size())); } } - } else if (base->isMatrix()) - error(loc, "field selection not allowed on matrix", ".", ""); - else if (base->getBasicType() == EbtStruct || base->getBasicType() == EbtBlock) { + } else if (base->getBasicType() == EbtStruct || base->getBasicType() == EbtBlock) { const TTypeList* fields = base->getType().getStruct(); bool fieldFound = false; int member; @@ -741,9 +749,9 @@ TIntermTyped* TParseContext::handleDotDereference(TSourceLoc loc, TIntermTyped* result->setType(*(*fields)[member].type); } } else - error(loc, " no such field in structure", field.c_str(), ""); + error(loc, "no such field in structure", field.c_str(), ""); } else - error(loc, " dot operator does not operater on this type:", field.c_str(), base->getType().getCompleteString().c_str()); + error(loc, "does not apply to this type:", field.c_str(), base->getType().getCompleteString().c_str()); return result; } @@ -1013,7 +1021,10 @@ TIntermTyped* TParseContext::handleFunctionCall(TSourceLoc loc, TFunction* funct return result; } -// Do all processing handling object.length(). +// Finish processing object.length(). This started earlier in handleDotDereference(), where +// the ".length" part was recognized and semantically checked, and finished here where the +// function syntax "()" is recognized. +// // Return resulting tree node. TIntermTyped* TParseContext::handleLengthMethod(TSourceLoc loc, TFunction* function, TIntermNode* intermNode) { @@ -1021,26 +1032,36 @@ TIntermTyped* TParseContext::handleLengthMethod(TSourceLoc loc, TFunction* funct if (function->getParamCount() > 0) error(loc, "method does not accept any arguments", function->getName().c_str(), ""); - if (intermNode->getAsTyped() == 0 || ! intermNode->getAsTyped()->getType().isArray()) - error(loc, "", function->getName().c_str(), "can only be applied to an array"); - else if (intermNode->getAsTyped()->getType().isImplicitlySizedArray()) { - if (intermNode->getAsSymbolNode() && isIoResizeArray(intermNode->getAsTyped()->getType())) { - // We could be between a layout declaration that gives a built-in io array implicit size and - // a user redeclaration of that array, meaning we have to substitute its implicit size here - // without actually redeclaring the array. (It is an error to use a member before the - // redeclaration, but not an error to use the array name itself.) - const TString& name = intermNode->getAsSymbolNode()->getName(); - if (name == "gl_in" || name == "gl_out") - length = getIoArrayImplicitSize(); - } - if (length == 0) { - if (intermNode->getAsSymbolNode() && isIoResizeArray(intermNode->getAsTyped()->getType())) - error(loc, "", function->getName().c_str(), "array must first be sized by a redeclaration or layout qualifier"); - else - error(loc, "", function->getName().c_str(), "array must be declared with a size before using this method"); + else { + const TType& type = intermNode->getAsTyped()->getType(); + if (type.isArray()) { + if (type.isImplicitlySizedArray()) { + if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) { + // We could be between a layout declaration that gives a built-in io array implicit size and + // a user redeclaration of that array, meaning we have to substitute its implicit size here + // without actually redeclaring the array. (It is an error to use a member before the + // redeclaration, but not an error to use the array name itself.) + const TString& name = intermNode->getAsSymbolNode()->getName(); + if (name == "gl_in" || name == "gl_out") + length = getIoArrayImplicitSize(); + } + if (length == 0) { + if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) + error(loc, "", function->getName().c_str(), "array must first be sized by a redeclaration or layout qualifier"); + else + error(loc, "", function->getName().c_str(), "array must be declared with a size before using this method"); + } + } else + length = type.getArraySize(); + } else if (type.isMatrix()) + length = type.getMatrixCols(); + else if (type.isVector()) + length = type.getVectorSize(); + else { + // we should not get here, because earlier semantic checking should have prevented this path + error(loc, ".length()", "unexpected use of .length()", ""); } - } else - length = intermNode->getAsTyped()->getType().getArraySize(); + } if (length == 0) length = 1; @@ -1633,7 +1654,7 @@ bool TParseContext::lineContinuationCheck(TSourceLoc loc, bool endOfComment) const char* message = "line continuation"; bool lineContinuationAllowed = (profile == EEsProfile && version >= 300) || - (profile != EEsProfile && version >= 420); + (profile != EEsProfile && (version >= 420 || extensionsTurnedOn(1, &GL_ARB_shading_language_420pack))); if (endOfComment) { if (lineContinuationAllowed) @@ -1645,12 +1666,12 @@ bool TParseContext::lineContinuationCheck(TSourceLoc loc, bool endOfComment) } if (messages & EShMsgRelaxedErrors) { + if (! lineContinuationAllowed) warn(loc, "not allowed in this version", message, ""); return true; } else { - requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, message); profileRequires(loc, EEsProfile, 300, 0, message); - profileRequires(loc, ECoreProfile | ECompatibilityProfile, 420, 0, message); + profileRequires(loc, ~EEsProfile, 420, GL_ARB_shading_language_420pack, message); } return lineContinuationAllowed; diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y index 6292bb9172742cfa5a44d4dcf34d6fb608c477d5..912bd03e373bf6e22864775454608b9a9213c38c 100644 --- a/glslang/MachineIndependent/glslang.y +++ b/glslang/MachineIndependent/glslang.y @@ -362,11 +362,8 @@ function_identifier TIntermMethod* method = $1->getAsMethodNode(); if (method) { - if (method->getObject()->isArray()) { - $$.function = new TFunction(&method->getMethodName(), TType(EbtInt), EOpArrayLength); - $$.intermNode = method->getObject(); - } else - parseContext.error(method->getLoc(), "only arrays have methods", "", ""); + $$.function = new TFunction(&method->getMethodName(), TType(EbtInt), EOpArrayLength); + $$.intermNode = method->getObject(); } else { TIntermSymbol* symbol = $1->getAsSymbolNode(); if (symbol) {