diff --git a/Install/Windows/glslangValidator.exe b/Install/Windows/glslangValidator.exe index 6bc8a7a118787dcd670c0161f5a2f2be68c36b50..7f095f44cad4eb6bf95f549ffcb882c444ec1562 100644 Binary files a/Install/Windows/glslangValidator.exe and b/Install/Windows/glslangValidator.exe differ diff --git a/Test/100scope.vert b/Test/100scope.vert index 0076846ebefa75150bd82a57378725ecb5701870..7e9f82bafe3446c0247a3dc0f671a88fbd7af61b 100644 --- a/Test/100scope.vert +++ b/Test/100scope.vert @@ -17,12 +17,16 @@ bool b; float b(int a); // ERROR: redefinition float f; // ERROR: redefinition -float tan; // ERROR: redefines built-in function -float sin(float x); // ERROR: can't overload built-in functions -float cos(float x) // ERROR: can't overload built-in functions +float tan; // okay, built-in is in an outer scope +float sin(float x); // ERROR: can't redefine built-in functions +float cos(float x) // ERROR: can't redefine built-in functions { return 1.0; } +bool radians(bool x) // okay, can overload built-in functions +{ + return true; +} invariant gl_Position; diff --git a/Test/150.geom b/Test/150.geom index c09b4ce6de8e974a401e83ee3d56b57b2af37093..7e3621291c9290b0093feb09d563f0657f1c15b6 100644 --- a/Test/150.geom +++ b/Test/150.geom @@ -52,11 +52,11 @@ out vec4 ov3; // stream should be 3 layout(stream = 6) out ooutb { vec4 a; } ouuaa6; -layout(stream = 6) out ooutb { +layout(stream = 6) out ooutb2 { layout(stream = 6) vec4 a; } ouua6; -layout(stream = 7) out ooutb { +layout(stream = 7) out ooutb3 { layout(stream = 6) vec4 a; // ERROR } ouua7; @@ -74,7 +74,7 @@ layout(triangle_strip) uniform; // ERROR layout(triangle_strip) out vec4 badv4; // ERROR, not on a variable layout(triangle_strip) in vec4 bad2v4; // ERROR, not on a variable or input layout(invocations = 3) out outbn { int a; }; // ERROR, not on a block -out outbn { +out outbn2 { layout(invocations = 3) int a; // ERROR, not on a block member layout(max_vertices = 3) int b; // ERROR, not on a block member layout(triangle_strip) int c; // ERROR, not on a block member @@ -90,3 +90,15 @@ layout(invocations = 4, max_vertices = 127) out; in inbn { layout(stream = 2) int a; // ERROR, stream on input } inbi; + +in sameName { + int a15; +}; + +out sameName { + float f15; +}; + +uniform sameName { + bool b15; +}; diff --git a/Test/300.vert b/Test/300.vert index 01ececec2897727c84f51b60d15d270306b6babf..1d9d6316732669f1cb86c8beefbb8b77a6a410d3 100644 --- a/Test/300.vert +++ b/Test/300.vert @@ -80,3 +80,27 @@ out S s2; invariant s2; invariant out S s3; flat out int; + +uniform ub2 { + float f; +} a; + +uniform ub2 { // ERROR redeclaration of block name (same instance name) + float g; +} a; + +uniform ub2 { // ERROR redeclaration of block name (different instance name) + float f; +} c; + +uniform ub2 { // ERROR redeclaration of block name (no instance name) + float f123; +}; + +uniform ub3 { + bool b23; +}; + +uniform ub3 { // ERROR redeclaration of block name (no instance name in first or declared) + bool b234; +}; diff --git a/Test/300scope.vert b/Test/300scope.vert index 263b62ce34796f2dad9232ebc74d90c80f384413..f88cb0581b310831aae9e6ba99fbc0375125b145 100644 --- a/Test/300scope.vert +++ b/Test/300scope.vert @@ -18,11 +18,15 @@ float b(int a); // ERROR: redefinition float f; // ERROR: redefinition float tan; // ERROR: redefines built-in function -float sin(float x); // ERROR: can't overload built-in functions -float cos(float x) // ERROR: can't overload built-in functions +float sin(float x); // ERROR: can't redefine built-in functions +float cos(float x) // ERROR: can't redefine built-in functions { return 1.0; } +bool radians(bool x) // ERROR: can't overload built-in functions +{ + return true; +} invariant gl_Position; diff --git a/Test/430scope.vert b/Test/430scope.vert index 00685adf92c9362a29254dc923b3498b465a9301..b854ef74d04b97d6cbb9c879629d42c8c86aaff8 100644 --- a/Test/430scope.vert +++ b/Test/430scope.vert @@ -18,11 +18,15 @@ float b(int a); // ERROR: redefinition float f; // ERROR: redefinition float tan; // okay, hides built-in function -float sin(float x); // okay, can overload built-in functions -float cos(float x) // okay, can overload built-in functions +float sin(float x); // okay, can redefine built-in functions +float cos(float x) // okay, can redefine built-in functions { return 1.0; } +bool radians(bool x) // okay, can overload built-in functions +{ + return true; +} invariant gl_Position; diff --git a/Test/baseResults/100scope.vert.out b/Test/baseResults/100scope.vert.out index 792667008030c9ab1bbdee9fd072c9cfb047ea75..4b948e33bb9bf8690fab18b274708d379ae0f996 100644 --- a/Test/baseResults/100scope.vert.out +++ b/Test/baseResults/100scope.vert.out @@ -1,11 +1,12 @@ ERROR: 0:5: 'a' : redefinition -ERROR: 0:17: 'b' : illegal redeclaration +ERROR: 0:17: 'b' : redeclaration of existing name ERROR: 0:19: 'f' : redefinition -ERROR: 0:20: 'tan' : redefinition -ERROR: 0:31: 'local function declaration' : not supported with this profile: es -ERROR: 0:50: 'z' : undeclared identifier -ERROR: 0:50: 'z' : redefinition -ERROR: 7 compilation errors. No code generated. +ERROR: 0:21: 'redefinition of built-in function' : not supported with this profile: es +ERROR: 0:22: 'redefinition of built-in function' : not supported with this profile: es +ERROR: 0:35: 'local function declaration' : not supported with this profile: es +ERROR: 0:54: 'z' : undeclared identifier +ERROR: 0:54: 'z' : redefinition +ERROR: 8 compilation errors. No code generated. ERROR: node is still EOpNull! 0:3 Function Definition: f(i1;i1;i1; (highp int) @@ -32,73 +33,81 @@ ERROR: node is still EOpNull! 0:24 Branch: Return with expression 0:24 Constant: 0:24 1.000000 -0:29 Function Definition: main( (void) -0:29 Function Parameters: +0:26 Function Definition: radians(b1; (bool) +0:26 Function Parameters: +0:26 'x' (in bool) +0:28 Sequence +0:28 Branch: Return with expression +0:28 Constant: +0:28 true (const bool) +0:33 Function Definition: main( (void) +0:33 Function Parameters: 0:? Sequence -0:32 Function Call: g( (highp int) -0:35 'sin' (highp float) -0:37 Function Call: f(i1;i1;i1; (highp int) -0:37 Constant: -0:37 1 (const int) -0:37 Constant: -0:37 2 (const int) -0:37 Constant: -0:37 3 (const int) -0:40 move second child to first child (highp float) -0:40 'f' (highp float) -0:40 Constant: -0:40 3.000000 -0:42 move second child to first child (highp 4-component vector of float) -0:42 'gl_Position' (invariant gl_Position highp 4-component vector of float) -0:42 Construct vec4 (highp 4-component vector of float) -0:42 'f' (highp float) -0:44 Sequence -0:44 Sequence -0:44 move second child to first child (highp int) -0:44 'f' (highp int) -0:44 Constant: -0:44 0 (const int) -0:44 Loop with condition tested first -0:44 Loop Condition -0:44 Compare Less Than (bool) -0:44 'f' (highp int) -0:44 Constant: -0:44 10 (const int) -0:44 Loop Body -0:45 Pre-Increment (highp int) -0:45 'f' (highp int) -0:44 Loop Terminal Expression -0:44 Pre-Increment (highp int) -0:44 'f' (highp int) -0:47 Sequence -0:47 move second child to first child (highp int) -0:47 'x' (highp int) -0:47 Constant: -0:47 1 (const int) -0:49 Sequence -0:49 Sequence -0:49 move second child to first child (highp float) -0:49 'x' (highp float) -0:49 Constant: -0:49 2.000000 -0:49 move second child to first child (highp float) -0:49 'y' (highp float) -0:49 'x' (highp float) +0:36 Function Call: g( (highp int) +0:39 'sin' (highp float) +0:41 Function Call: f(i1;i1;i1; (highp int) +0:41 Constant: +0:41 1 (const int) +0:41 Constant: +0:41 2 (const int) +0:41 Constant: +0:41 3 (const int) +0:44 move second child to first child (highp float) +0:44 'f' (highp float) +0:44 Constant: +0:44 3.000000 +0:46 move second child to first child (highp 4-component vector of float) +0:46 'gl_Position' (invariant gl_Position highp 4-component vector of float) +0:46 Construct vec4 (highp 4-component vector of float) +0:46 'f' (highp float) +0:48 Sequence +0:48 Sequence +0:48 move second child to first child (highp int) +0:48 'f' (highp int) +0:48 Constant: +0:48 0 (const int) +0:48 Loop with condition tested first +0:48 Loop Condition +0:48 Compare Less Than (bool) +0:48 'f' (highp int) +0:48 Constant: +0:48 10 (const int) +0:48 Loop Body +0:49 Pre-Increment (highp int) +0:49 'f' (highp int) +0:48 Loop Terminal Expression +0:48 Pre-Increment (highp int) +0:48 'f' (highp int) +0:51 Sequence +0:51 move second child to first child (highp int) +0:51 'x' (highp int) +0:51 Constant: +0:51 1 (const int) 0:53 Sequence 0:53 Sequence -0:53 move second child to first child (highp int) -0:53 'x' (highp int) -0:53 'x' (highp int) -0:61 Sequence -0:61 Sequence -0:61 move second child to first child (structure{x}) -0:61 'S' (structure{x}) -0:61 Constant: -0:61 0 (const int) -0:62 x: direct index for structure (highp int) -0:62 'S' (structure{x}) -0:62 Constant: -0:62 0 (const int) +0:53 move second child to first child (highp float) +0:53 'x' (highp float) +0:53 Constant: +0:53 2.000000 +0:53 move second child to first child (highp float) +0:53 'y' (highp float) +0:53 'x' (highp float) +0:57 Sequence +0:57 Sequence +0:57 move second child to first child (highp int) +0:57 'x' (highp int) +0:57 'x' (highp int) +0:65 Sequence +0:65 Sequence +0:65 move second child to first child (structure{x}) +0:65 'S' (structure{x}) +0:65 Constant: +0:65 0 (const int) +0:66 x: direct index for structure (highp int) +0:66 'S' (structure{x}) +0:66 Constant: +0:66 0 (const int) 0:? Linker Objects 0:? 'b' (bool) +0:? 'tan' (highp float) diff --git a/Test/baseResults/150.geom.out b/Test/baseResults/150.geom.out index 0da9b61ddc7ff1dd392b80804676d226b93c89b6..9ae6fa73bf85f19dc81356f1ac2fa5198d9c507b 100644 --- a/Test/baseResults/150.geom.out +++ b/Test/baseResults/150.geom.out @@ -135,4 +135,7 @@ ERROR: node is still EOpNull! 0:? '__anon__1' (layout(stream=3 ) out block{a}) 0:? 'outbi' (layout(stream=3 ) out block{a,b,c}) 0:? 'inbi' (in block{a}) +0:? '__anon__2' (in block{a15}) +0:? '__anon__3' (layout(stream=3 ) out block{f15}) +0:? '__anon__4' (layout(column_major shared ) uniform block{b15}) diff --git a/Test/baseResults/300.vert.out b/Test/baseResults/300.vert.out index 8000c70f1a34c6471ac87283fea268520be44555..d27382d09c5c9befa4aee7bcb7646d515156e8d8 100644 --- a/Test/baseResults/300.vert.out +++ b/Test/baseResults/300.vert.out @@ -18,9 +18,12 @@ ERROR: 0:63: '' : array size required ERROR: 0:65: '' : array size required ERROR: 0:64: '' : array size required ERROR: 0:67: '' : array size required -ERROR: 0:78: 'invariant' : can only apply to an output - invIn -ERROR: 21 compilation errors. No code generated. +ERROR: 0:78: 'invariant' : can only apply to an output: invIn +ERROR: 0:88: 'ub2' : Cannot reuse block name within the same interface: uniform +ERROR: 0:92: 'ub2' : Cannot reuse block name within the same interface: uniform +ERROR: 0:96: 'ub2' : Cannot reuse block name within the same interface: uniform +ERROR: 0:104: 'ub3' : Cannot reuse block name within the same interface: uniform +ERROR: 25 compilation errors. No code generated. ERROR: node is still EOpNull! 0:27 Function Definition: main( (void) @@ -167,6 +170,8 @@ ERROR: node is still EOpNull! 0:? 'invIn' (in highp 4-component vector of float) 0:? 's2' (smooth out structure{c,f}) 0:? 's3' (invariant smooth out structure{c,f}) +0:? 'a' (layout(column_major shared ) uniform block{f}) +0:? '__anon__0' (layout(column_major shared ) uniform block{b23}) 0:? 'gl_VertexID' (gl_VertexId highp int) 0:? 'gl_InstanceID' (gl_InstanceId highp int) diff --git a/Test/baseResults/300scope.vert.out b/Test/baseResults/300scope.vert.out index 27b43d075f6044ae79daeda0b462740028971781..27e07047f864f2b19a711f3bcc79d6c40a59f326 100644 --- a/Test/baseResults/300scope.vert.out +++ b/Test/baseResults/300scope.vert.out @@ -1,13 +1,18 @@ ERROR: 0:5: 'a' : redefinition -ERROR: 0:17: 'b' : illegal redeclaration +ERROR: 0:17: 'b' : redeclaration of existing name ERROR: 0:19: 'f' : redefinition ERROR: 0:20: 'tan' : redefinition -ERROR: 0:21: 'redeclaration of built-in function' : no longer supported in es profile; removed in version 300 -ERROR: 0:22: 'redeclaration of built-in function' : no longer supported in es profile; removed in version 300 -ERROR: 0:31: 'local function declaration' : not supported with this profile: es -ERROR: 0:50: 'z' : undeclared identifier -ERROR: 0:50: 'z' : redefinition -ERROR: 9 compilation errors. No code generated. +ERROR: 0:21: 'redefinition of built-in function' : not supported with this profile: es +ERROR: 0:21: 'sin' : redeclaration of existing name +ERROR: 0:22: 'redefinition of built-in function' : not supported with this profile: es +ERROR: 0:22: 'cos' : redeclaration of existing name +ERROR: 0:26: 'radians' : redeclaration of existing name +ERROR: 0:26: 'radians' : can't find function +ERROR: 0:28: 'return' : void function cannot return a value +ERROR: 0:35: 'local function declaration' : not supported with this profile: es +ERROR: 0:54: 'z' : undeclared identifier +ERROR: 0:54: 'z' : redefinition +ERROR: 14 compilation errors. No code generated. ERROR: node is still EOpNull! 0:3 Function Definition: f(i1;i1;i1; (highp int) @@ -34,73 +39,80 @@ ERROR: node is still EOpNull! 0:24 Branch: Return with expression 0:24 Constant: 0:24 1.000000 -0:29 Function Definition: main( (void) -0:29 Function Parameters: +0:26 Function Definition: radians(b1; (bool) +0:26 Function Parameters: +0:26 'x' (in bool) +0:28 Sequence +0:28 Branch: Return with expression +0:28 Constant: +0:28 true (const bool) +0:33 Function Definition: main( (void) +0:33 Function Parameters: 0:? Sequence -0:32 Function Call: g( (highp int) -0:35 'sin' (highp float) -0:37 Function Call: f(i1;i1;i1; (highp int) -0:37 Constant: -0:37 1 (const int) -0:37 Constant: -0:37 2 (const int) -0:37 Constant: -0:37 3 (const int) -0:40 move second child to first child (highp float) -0:40 'f' (highp float) -0:40 Constant: -0:40 3.000000 -0:42 move second child to first child (highp 4-component vector of float) -0:42 'gl_Position' (invariant gl_Position highp 4-component vector of float) -0:42 Construct vec4 (highp 4-component vector of float) -0:42 'f' (highp float) -0:44 Sequence -0:44 Sequence -0:44 move second child to first child (highp int) -0:44 'f' (highp int) -0:44 Constant: -0:44 0 (const int) -0:44 Loop with condition tested first -0:44 Loop Condition -0:44 Compare Less Than (bool) -0:44 'f' (highp int) -0:44 Constant: -0:44 10 (const int) -0:44 Loop Body -0:45 Pre-Increment (highp int) -0:45 'f' (highp int) -0:44 Loop Terminal Expression -0:44 Pre-Increment (highp int) -0:44 'f' (highp int) -0:47 Sequence -0:47 move second child to first child (highp int) -0:47 'x' (highp int) -0:47 Constant: -0:47 1 (const int) -0:49 Sequence -0:49 Sequence -0:49 move second child to first child (highp float) -0:49 'x' (highp float) -0:49 Constant: -0:49 2.000000 -0:49 move second child to first child (highp float) -0:49 'y' (highp float) -0:49 'x' (highp float) +0:36 Function Call: g( (highp int) +0:39 'sin' (highp float) +0:41 Function Call: f(i1;i1;i1; (highp int) +0:41 Constant: +0:41 1 (const int) +0:41 Constant: +0:41 2 (const int) +0:41 Constant: +0:41 3 (const int) +0:44 move second child to first child (highp float) +0:44 'f' (highp float) +0:44 Constant: +0:44 3.000000 +0:46 move second child to first child (highp 4-component vector of float) +0:46 'gl_Position' (invariant gl_Position highp 4-component vector of float) +0:46 Construct vec4 (highp 4-component vector of float) +0:46 'f' (highp float) +0:48 Sequence +0:48 Sequence +0:48 move second child to first child (highp int) +0:48 'f' (highp int) +0:48 Constant: +0:48 0 (const int) +0:48 Loop with condition tested first +0:48 Loop Condition +0:48 Compare Less Than (bool) +0:48 'f' (highp int) +0:48 Constant: +0:48 10 (const int) +0:48 Loop Body +0:49 Pre-Increment (highp int) +0:49 'f' (highp int) +0:48 Loop Terminal Expression +0:48 Pre-Increment (highp int) +0:48 'f' (highp int) +0:51 Sequence +0:51 move second child to first child (highp int) +0:51 'x' (highp int) +0:51 Constant: +0:51 1 (const int) 0:53 Sequence 0:53 Sequence -0:53 move second child to first child (highp int) -0:53 'x' (highp int) -0:53 'x' (highp int) -0:61 Sequence -0:61 Sequence -0:61 move second child to first child (structure{x}) -0:61 'S' (structure{x}) -0:61 Constant: -0:61 0 (const int) -0:62 x: direct index for structure (highp int) -0:62 'S' (structure{x}) -0:62 Constant: -0:62 0 (const int) +0:53 move second child to first child (highp float) +0:53 'x' (highp float) +0:53 Constant: +0:53 2.000000 +0:53 move second child to first child (highp float) +0:53 'y' (highp float) +0:53 'x' (highp float) +0:57 Sequence +0:57 Sequence +0:57 move second child to first child (highp int) +0:57 'x' (highp int) +0:57 'x' (highp int) +0:65 Sequence +0:65 Sequence +0:65 move second child to first child (structure{x}) +0:65 'S' (structure{x}) +0:65 Constant: +0:65 0 (const int) +0:66 x: direct index for structure (highp int) +0:66 'S' (structure{x}) +0:66 Constant: +0:66 0 (const int) 0:? Linker Objects 0:? 'b' (bool) 0:? 'gl_VertexID' (gl_VertexId highp int) diff --git a/Test/baseResults/430scope.vert.out b/Test/baseResults/430scope.vert.out index 62dd94abc9bd6f24efa3a4877d0a602d49975b8e..4776db801717ab91b3e68393513daf3e752a6e2a 100644 --- a/Test/baseResults/430scope.vert.out +++ b/Test/baseResults/430scope.vert.out @@ -1,9 +1,9 @@ Warning, version 430 is not yet complete; some version-specific features are present, but many are missing. ERROR: 0:5: 'a' : redefinition -ERROR: 0:17: 'b' : illegal redeclaration +ERROR: 0:17: 'b' : redeclaration of existing name ERROR: 0:19: 'f' : redefinition -ERROR: 0:50: 'z' : undeclared identifier -ERROR: 0:50: 'z' : redefinition +ERROR: 0:54: 'z' : undeclared identifier +ERROR: 0:54: 'z' : redefinition ERROR: 5 compilation errors. No code generated. ERROR: node is still EOpNull! @@ -31,76 +31,83 @@ ERROR: node is still EOpNull! 0:24 Branch: Return with expression 0:24 Constant: 0:24 1.000000 -0:29 Function Definition: main( (void) -0:29 Function Parameters: +0:26 Function Definition: radians(b1; (bool) +0:26 Function Parameters: +0:26 'x' (in bool) +0:28 Sequence +0:28 Branch: Return with expression +0:28 Constant: +0:28 true (const bool) +0:33 Function Definition: main( (void) +0:33 Function Parameters: 0:? Sequence -0:32 Function Call: g( (int) -0:35 'sin' (float) -0:37 Function Call: f(i1;i1;i1; (int) -0:37 Constant: -0:37 1 (const int) -0:37 Constant: -0:37 2 (const int) -0:37 Constant: -0:37 3 (const int) -0:40 move second child to first child (float) -0:40 'f' (float) -0:40 Constant: -0:40 3.000000 -0:42 move second child to first child (4-component vector of float) -0:42 gl_Position: direct index for structure (invariant gl_Position 4-component vector of float) -0:42 '__anon__0' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord}) -0:42 Constant: -0:42 0 (const uint) -0:42 Construct vec4 (4-component vector of float) -0:42 'f' (float) -0:44 Sequence -0:44 Sequence -0:44 move second child to first child (int) -0:44 'f' (int) -0:44 Constant: -0:44 0 (const int) -0:44 Loop with condition tested first -0:44 Loop Condition -0:44 Compare Less Than (bool) -0:44 'f' (int) -0:44 Constant: -0:44 10 (const int) -0:44 Loop Body -0:45 Pre-Increment (int) -0:45 'f' (int) -0:44 Loop Terminal Expression -0:44 Pre-Increment (int) -0:44 'f' (int) -0:47 Sequence -0:47 move second child to first child (int) -0:47 'x' (int) -0:47 Constant: -0:47 1 (const int) -0:49 Sequence -0:49 Sequence -0:49 move second child to first child (float) -0:49 'x' (float) -0:49 Constant: -0:49 2.000000 -0:49 move second child to first child (float) -0:49 'y' (float) -0:49 'x' (float) +0:36 Function Call: g( (int) +0:39 'sin' (float) +0:41 Function Call: f(i1;i1;i1; (int) +0:41 Constant: +0:41 1 (const int) +0:41 Constant: +0:41 2 (const int) +0:41 Constant: +0:41 3 (const int) +0:44 move second child to first child (float) +0:44 'f' (float) +0:44 Constant: +0:44 3.000000 +0:46 move second child to first child (4-component vector of float) +0:46 gl_Position: direct index for structure (invariant gl_Position 4-component vector of float) +0:46 '__anon__0' (out block{gl_Position,gl_PointSize,gl_ClipDistance,gl_ClipVertex,gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,gl_BackSecondaryColor,gl_TexCoord,gl_FogFragCoord}) +0:46 Constant: +0:46 0 (const uint) +0:46 Construct vec4 (4-component vector of float) +0:46 'f' (float) +0:48 Sequence +0:48 Sequence +0:48 move second child to first child (int) +0:48 'f' (int) +0:48 Constant: +0:48 0 (const int) +0:48 Loop with condition tested first +0:48 Loop Condition +0:48 Compare Less Than (bool) +0:48 'f' (int) +0:48 Constant: +0:48 10 (const int) +0:48 Loop Body +0:49 Pre-Increment (int) +0:49 'f' (int) +0:48 Loop Terminal Expression +0:48 Pre-Increment (int) +0:48 'f' (int) +0:51 Sequence +0:51 move second child to first child (int) +0:51 'x' (int) +0:51 Constant: +0:51 1 (const int) 0:53 Sequence 0:53 Sequence -0:53 move second child to first child (int) -0:53 'x' (int) -0:53 'x' (int) -0:61 Sequence -0:61 Sequence -0:61 move second child to first child (structure{x}) -0:61 'S' (structure{x}) -0:61 Constant: -0:61 0 (const int) -0:62 x: direct index for structure (int) -0:62 'S' (structure{x}) -0:62 Constant: -0:62 0 (const int) +0:53 move second child to first child (float) +0:53 'x' (float) +0:53 Constant: +0:53 2.000000 +0:53 move second child to first child (float) +0:53 'y' (float) +0:53 'x' (float) +0:57 Sequence +0:57 Sequence +0:57 move second child to first child (int) +0:57 'x' (int) +0:57 'x' (int) +0:65 Sequence +0:65 Sequence +0:65 move second child to first child (structure{x}) +0:65 'S' (structure{x}) +0:65 Constant: +0:65 0 (const int) +0:66 x: direct index for structure (int) +0:66 'S' (structure{x}) +0:66 Constant: +0:66 0 (const int) 0:? Linker Objects 0:? 'b' (bool) 0:? 'tan' (float) diff --git a/Test/baseResults/specExamples.frag.out b/Test/baseResults/specExamples.frag.out index f5afa45015df6da3e66ad42b48f1e1ff309c3d7d..92ceaf5ddff873ba8ab35f5352f5077bcfe1d612 100644 --- a/Test/baseResults/specExamples.frag.out +++ b/Test/baseResults/specExamples.frag.out @@ -3,8 +3,7 @@ ERROR: 0:6: '=' : cannot convert from 'const uint' to 'int' ERROR: 0:20: '' : numeric literal too big ERROR: 0:21: '' : hexidecimal literal too big ERROR: 0:37: 'view' : redefinition -ERROR: 0:63: 'invariant' : can only apply to an output - Color +ERROR: 0:63: 'invariant' : can only apply to an output: Color ERROR: 0:68: 'lightPosition' : redefinition ERROR: 0:75: 'Atten' : member storage qualifier cannot contradict block storage qualifier ERROR: 0:87: 'Color' : redefinition diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 9adb2eb8f15b0ee40ea8ac7006a894e229653f4f..a983c05287c6f96c04a13011a15d7ca80b18e139 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -733,12 +733,13 @@ TFunction* TParseContext::handleFunctionDeclarator(TSourceLoc loc, TFunction& fu // // Redeclarations (full prototype match) are allowed. But, return types and parameter qualifiers must match. // - // ES does not allow redeclaring or hiding of built-in functions. + // ES 100 does not allow redefining, but does allow overloading of built-in functions. + // ES 300 does not allow redefining or overloading of built-in functions. // bool builtIn; TSymbol* symbol = symbolTable.find(function.getMangledName(), &builtIn); if (symbol && symbol->getAsFunction() && builtIn) - requireNotRemoved(loc, EEsProfile, 300, "redeclaration of built-in function"); + requireProfile(loc, ~EEsProfile, "redefinition of built-in function"); const TFunction* prevDec = symbol ? symbol->getAsFunction() : 0; if (prevDec) { if (prevDec->getType() != function.getType()) { @@ -752,7 +753,7 @@ TFunction* TParseContext::handleFunctionDeclarator(TSourceLoc loc, TFunction& fu if (! symbolTable.insert(function)) - error(loc, "illegal redeclaration", function.getName().c_str(), ""); + error(loc, "redeclaration of existing name", function.getName().c_str(), ""); // // If this is a redeclaration, it could also be a definition, @@ -775,7 +776,7 @@ TIntermAggregate* TParseContext::handleFunctionPrototype(TSourceLoc loc, TFuncti TFunction* prevDec = symbol ? symbol->getAsFunction() : 0; if (! prevDec) - error(loc, "can't find function name", function.getName().c_str(), ""); + error(loc, "can't find function", function.getName().c_str(), ""); // // Note: 'prevDec' could be 'function' if this is the first time we've seen function @@ -3332,13 +3333,17 @@ void TParseContext::declareBlock(TSourceLoc loc, TTypeList& typeList, const TStr // whose type is EbtBlock, but without all the structure; that will come from the type // the instances point to. // - TType blockNameType(EbtBlock); + TType blockNameType(EbtBlock, blockType.getQualifier().storage); TVariable* blockNameVar = new TVariable(blockName, blockNameType); if (! symbolTable.insert(*blockNameVar)) { TSymbol* existingName = symbolTable.find(*blockName); - if (existingName->getType().getBasicType() != EbtBlock) { + if (existingName->getType().getBasicType() == EbtBlock) { + if (existingName->getType().getQualifier().storage == blockType.getQualifier().storage) { + error(loc, "Cannot reuse block name within the same interface:", blockName->c_str(), blockType.getStorageQualifierString()); + return; + } + } else { error(loc, "block name cannot redefine a non-block name", blockName->c_str(), ""); - return; } } @@ -3414,7 +3419,7 @@ void TParseContext::invariantCheck(TSourceLoc loc, const TType& type, const TStr bool pipeIn = type.getQualifier().isPipeInput(); if (version >= 300 || profile != EEsProfile && version >= 420) { if (! pipeOut) - error(loc, "can only apply to an output\n", "invariant", identifier.c_str()); + error(loc, "can only apply to an output:", "invariant", identifier.c_str()); } else { if ((language == EShLangVertex && pipeIn) || (! pipeOut && ! pipeIn)) error(loc, "can only apply to an output or an input in a non-vertex stage\n", "invariant", ""); diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp index 7a843c45648cba0145c8912710970cca18b22e92..ee1cdd688ed3c707eaeefbd2baadcdb8005c360d 100644 --- a/glslang/MachineIndependent/ShaderLang.cpp +++ b/glslang/MachineIndependent/ShaderLang.cpp @@ -168,7 +168,7 @@ void InitializeStageSymbolTable(TBuiltIns& builtIns, int version, EProfile profi (*symbolTables[language]).adoptLevels(*commonTable[CommonIndex(profile, language)]); InitializeSymbolTable(builtIns.getStageString(language), version, profile, language, infoSink, *symbolTables[language]); IdentifyBuiltIns(version, profile, language, *symbolTables[language]); - if (profile == EEsProfile) + if (profile == EEsProfile && version >= 300) (*symbolTables[language]).setNoBuiltInRedeclarations(); } diff --git a/glslang/MachineIndependent/SymbolTable.h b/glslang/MachineIndependent/SymbolTable.h index e51f9cee3d17cafb74745e5748c57e4992b3ef99..52182dbb3af7876b6e00479e79669ad5be165924 100644 --- a/glslang/MachineIndependent/SymbolTable.h +++ b/glslang/MachineIndependent/SymbolTable.h @@ -292,9 +292,8 @@ public: return isOkay; } else { // Check for redefinition errors: - // - STL itself will tell us if there is a direct name collision at this level - // - additionally, check for function/variable name collisions - // - for ES, for overriding or hiding built-in function + // - STL itself will tell us if there is a direct name collision, with name mangling, at this level + // - additionally, check for function-redefining-variable name collisions const TString& insertName = symbol.getMangledName(); if (symbol.getAsFunction()) { // make sure there isn't a variable of this name @@ -457,11 +456,13 @@ public: { symbol.setUniqueId(++uniqueId); - if (! symbol.getAsFunction()) { - // make sure there isn't a function of this name - if (table[currentLevel()]->hasFunctionName(symbol.getName())) - return false; - if (atGlobalLevel() && currentLevel() > 0 && noBuiltInRedeclarations) { + // make sure there isn't a function of this variable name + if (! symbol.getAsFunction() && table[currentLevel()]->hasFunctionName(symbol.getName())) + return false; + + // check for not overloading or redefining a built-in function + if (noBuiltInRedeclarations) { + if (atGlobalLevel() && currentLevel() > 0) { if (table[0]->hasFunctionName(symbol.getName())) return false; if (currentLevel() > 1 && table[1]->hasFunctionName(symbol.getName()))