Add missing check that a function call is not using the same name as a variable hiding the function's name. Also, support version 110 separate name spaces for functions and variable names.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24480 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
John Kessenich 2013-12-11 22:38:19 +00:00
parent 623833fabc
commit 3a4687d782
17 changed files with 576 additions and 285 deletions

Binary file not shown.

View File

@ -16,6 +16,9 @@ int f(int a, int b, int c); // okay to redeclare
bool b; bool b;
float b(int a); // ERROR: redefinition float b(int a); // ERROR: redefinition
float c(int a);
bool c; // ERROR: redefinition
float f; // ERROR: redefinition float f; // ERROR: redefinition
float tan; // okay, built-in is in an outer scope float tan; // okay, built-in is in an outer scope
float sin(float x); // ERROR: can't redefine built-in functions float sin(float x); // ERROR: can't redefine built-in functions
@ -37,7 +40,7 @@ void main()
float sin; // okay float sin; // okay
sin; sin;
sin(0.7); // ERROR, use of hidden function
f(1,2,3); f(1,2,3);
float f; // hides f() float f; // hides f()
@ -65,6 +68,9 @@ void main()
S S = S(0); // 'S' is only visible as a struct and constructor S S = S(0); // 'S' is only visible as a struct and constructor
S.x; // 'S' is now visible as a variable S.x; // 'S' is now visible as a variable
} }
int degrees;
degrees(3.2); // ERROR, use of hidden built-in function
} }
varying struct SSS { float f; } s; // ERROR varying struct SSS { float f; } s; // ERROR

74
Test/110scope.vert Normal file
View File

@ -0,0 +1,74 @@
#version 110
int f(int a, int b, int c)
{
int a = b; // ERROR, redefinition
{
float a = float(a) + 1.0; // okay
}
return a;
}
int f(int a, int b, int c); // okay to redeclare
bool b;
float b(int a); // okay, b and b() are different
float c(int a);
bool c; // okay, and c() are different
float f; // okay f and f() are different
float tan; // okay, hides built-in function
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;
}
void main()
{
int g(); // okay
g();
float sin; // okay
sin;
sin(0.7); // okay
f(1,2,3);
float f;
f = 3.0;
gl_Position = vec4(f);
for (int f = 0; f < 10; ++f)
++f;
int x = 1;
{
float x = 2.0, /* 2nd x visible here */ y = x; // y is initialized to 2
int z = z; // ERROR: z not previously defined.
}
{
int x = x; // x is initialized to '1'
}
struct S
{
int x;
};
{
S S = S(0); // 'S' is only visible as a struct and constructor
S.x; // 'S' is now visible as a variable
}
int degrees;
degrees(3.2);
}

View File

@ -16,6 +16,9 @@ int f(int a, int b, int c); // okay to redeclare
bool b; bool b;
float b(int a); // ERROR: redefinition float b(int a); // ERROR: redefinition
float c(int a);
bool c; // ERROR: redefinition
float f; // ERROR: redefinition float f; // ERROR: redefinition
float tan; // ERROR: redefines built-in function float tan; // ERROR: redefines built-in function
float sin(float x); // ERROR: can't redefine built-in functions float sin(float x); // ERROR: can't redefine built-in functions
@ -37,7 +40,7 @@ void main()
float sin; // okay float sin; // okay
sin; sin;
sin(0.7); // ERROR, use of hidden function
f(1,2,3); f(1,2,3);
float f; // hides f() float f; // hides f()
@ -65,4 +68,7 @@ void main()
S S = S(0); // 'S' is only visible as a struct and constructor S S = S(0); // 'S' is only visible as a struct and constructor
S.x; // 'S' is now visible as a variable S.x; // 'S' is now visible as a variable
} }
int degrees;
degrees(3.2); // ERROR, use of hidden built-in function
} }

View File

@ -16,6 +16,9 @@ int f(int a, int b, int c); // okay to redeclare
bool b; bool b;
float b(int a); // ERROR: redefinition float b(int a); // ERROR: redefinition
float c(int a);
bool c; // ERROR: redefinition
float f; // ERROR: redefinition float f; // ERROR: redefinition
float tan; // okay, hides built-in function float tan; // okay, hides built-in function
float sin(float x); // okay, can redefine built-in functions float sin(float x); // okay, can redefine built-in functions
@ -37,7 +40,7 @@ void main()
float sin; // okay float sin; // okay
sin; sin;
sin(0.7); // ERROR, use of hidden function
f(1,2,3); f(1,2,3);
float f; // hides f() float f; // hides f()
@ -65,4 +68,7 @@ void main()
S S = S(0); // 'S' is only visible as a struct and constructor S S = S(0); // 'S' is only visible as a struct and constructor
S.x; // 'S' is now visible as a variable S.x; // 'S' is now visible as a variable
} }
int degrees;
degrees(3.2); // ERROR, use of hidden built-in function
} }

View File

@ -1,14 +1,17 @@
100scope.vert 100scope.vert
ERROR: 0:5: 'a' : redefinition ERROR: 0:5: 'a' : redefinition
ERROR: 0:17: 'b' : function name is redeclaration of existing name ERROR: 0:17: 'b' : function name is redeclaration of existing name
ERROR: 0:19: 'f' : redefinition ERROR: 0:20: 'c' : redefinition
ERROR: 0:21: 'redefinition of built-in function' : not supported with this profile: es ERROR: 0:22: 'f' : redefinition
ERROR: 0:22: 'redefinition of built-in function' : not supported with this profile: es ERROR: 0:24: '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:25: 'redefinition of built-in function' : not supported with this profile: es
ERROR: 0:54: 'z' : undeclared identifier ERROR: 0:38: 'local function declaration' : not supported with this profile: es
ERROR: 0:54: 'z' : redefinition ERROR: 0:43: 'sin' : can't use function syntax on variable
ERROR: 0:70: 'vertex-shader struct output' : not supported for this version or the enabled extensions ERROR: 0:57: 'z' : undeclared identifier
ERROR: 9 compilation errors. No code generated. ERROR: 0:57: 'z' : redefinition
ERROR: 0:73: 'degrees' : can't use function syntax on variable
ERROR: 0:76: 'vertex-shader struct output' : not supported for this version or the enabled extensions
ERROR: 12 compilation errors. No code generated.
ERROR: node is still EOpNull! ERROR: node is still EOpNull!
@ -29,87 +32,91 @@ ERROR: node is still EOpNull!
0:8 1.000000 0:8 1.000000
0:11 Branch: Return with expression 0:11 Branch: Return with expression
0:11 'a' (in highp int) 0:11 'a' (in highp int)
0:22 Function Definition: cos(f1; (highp float) 0:25 Function Definition: cos(f1; (highp float)
0:22 Function Parameters: 0:25 Function Parameters:
0:22 'x' (in highp float) 0:25 'x' (in highp float)
0:24 Sequence 0:27 Sequence
0:24 Branch: Return with expression 0:27 Branch: Return with expression
0:24 Constant: 0:27 Constant:
0:24 1.000000 0:27 1.000000
0:26 Function Definition: radians(b1; (bool) 0:29 Function Definition: radians(b1; (bool)
0:26 Function Parameters: 0:29 Function Parameters:
0:26 'x' (in bool) 0:29 'x' (in bool)
0:28 Sequence 0:31 Sequence
0:28 Branch: Return with expression 0:31 Branch: Return with expression
0:28 Constant: 0:31 Constant:
0:28 true (const bool) 0:31 true (const bool)
0:33 Function Definition: main( (void) 0:36 Function Definition: main( (void)
0:33 Function Parameters: 0:36 Function Parameters:
0:? Sequence 0:? Sequence
0:36 Function Call: g( (highp int) 0:39 Function Call: g( (highp int)
0:39 'sin' (highp float) 0:42 'sin' (highp float)
0:41 Function Call: f(i1;i1;i1; (highp int) 0:43 Constant:
0:41 Constant: 0:43 0.000000
0:41 1 (const int) 0:44 Function Call: f(i1;i1;i1; (highp 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 Constant:
0:44 3.000000 0:44 1 (const int)
0:46 move second child to first child (highp 4-component vector of float) 0:44 Constant:
0:46 'gl_Position' (invariant gl_Position highp 4-component vector of float) 0:44 2 (const int)
0:46 Construct vec4 (highp 4-component vector of float) 0:44 Constant:
0:46 'f' (highp float) 0:44 3 (const int)
0:48 Sequence 0:47 move second child to first child (highp float)
0:48 Sequence 0:47 'f' (highp float)
0:48 move second child to first child (highp int) 0:47 Constant:
0:48 'f' (highp int) 0:47 3.000000
0:48 Constant: 0:49 move second child to first child (highp 4-component vector of float)
0:48 0 (const int) 0:49 'gl_Position' (invariant gl_Position highp 4-component vector of float)
0:48 Loop with condition tested first 0:49 Construct vec4 (highp 4-component vector of float)
0:48 Loop Condition 0:49 'f' (highp float)
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 Sequence
0:51 move second child to first child (highp int) 0:51 Sequence
0:51 'x' (highp int) 0:51 move second child to first child (highp int)
0:51 Constant: 0:51 'f' (highp int)
0:51 1 (const int) 0:51 Constant:
0:53 Sequence 0:51 0 (const int)
0:53 Sequence 0:51 Loop with condition tested first
0:53 move second child to first child (highp float) 0:51 Loop Condition
0:53 'x' (highp float) 0:51 Compare Less Than (bool)
0:53 Constant: 0:51 'f' (highp int)
0:53 2.000000 0:51 Constant:
0:53 move second child to first child (highp float) 0:51 10 (const int)
0:53 'y' (highp float) 0:51 Loop Body
0:53 'x' (highp float) 0:52 Pre-Increment (highp int)
0:57 Sequence 0:52 'f' (highp int)
0:57 Sequence 0:51 Loop Terminal Expression
0:57 move second child to first child (highp int) 0:51 Pre-Increment (highp int)
0:57 'x' (highp int) 0:51 'f' (highp int)
0:57 'x' (highp int) 0:54 Sequence
0:65 Sequence 0:54 move second child to first child (highp int)
0:65 Sequence 0:54 'x' (highp int)
0:65 move second child to first child (structure{x}) 0:54 Constant:
0:65 'S' (structure{x}) 0:54 1 (const int)
0:65 Constant: 0:56 Sequence
0:65 0 (const int) 0:56 Sequence
0:66 x: direct index for structure (highp int) 0:56 move second child to first child (highp float)
0:66 'S' (structure{x}) 0:56 'x' (highp float)
0:66 Constant: 0:56 Constant:
0:66 0 (const int) 0:56 2.000000
0:56 move second child to first child (highp float)
0:56 'y' (highp float)
0:56 'x' (highp float)
0:60 Sequence
0:60 Sequence
0:60 move second child to first child (highp int)
0:60 'x' (highp int)
0:60 'x' (highp int)
0:68 Sequence
0:68 Sequence
0:68 move second child to first child (structure{x})
0:68 'S' (structure{x})
0:68 Constant:
0:68 0 (const int)
0:69 x: direct index for structure (highp int)
0:69 'S' (structure{x})
0:69 Constant:
0:69 0 (const int)
0:73 Constant:
0:73 0.000000
0:? Linker Objects 0:? Linker Objects
0:? 'b' (bool) 0:? 'b' (bool)
0:? 'tan' (highp float) 0:? 'tan' (highp float)

View File

@ -0,0 +1,122 @@
110scope.vert
ERROR: 0:5: 'a' : redefinition
ERROR: 0:57: 'z' : undeclared identifier
ERROR: 0:57: 'z' : redefinition
ERROR: 3 compilation errors. No code generated.
ERROR: node is still EOpNull!
0:3 Function Definition: f(i1;i1;i1; (int)
0:3 Function Parameters:
0:3 'a' (in int)
0:3 'b' (in int)
0:3 'c' (in int)
0:? Sequence
0:8 Sequence
0:8 Sequence
0:8 move second child to first child (float)
0:8 'a' (float)
0:8 add (float)
0:8 Convert int to float (float)
0:8 'a' (in int)
0:8 Constant:
0:8 1.000000
0:11 Branch: Return with expression
0:11 'a' (in int)
0:25 Function Definition: cos(f1; (float)
0:25 Function Parameters:
0:25 'x' (in float)
0:27 Sequence
0:27 Branch: Return with expression
0:27 Constant:
0:27 1.000000
0:29 Function Definition: radians(b1; (bool)
0:29 Function Parameters:
0:29 'x' (in bool)
0:31 Sequence
0:31 Branch: Return with expression
0:31 Constant:
0:31 true (const bool)
0:36 Function Definition: main( (void)
0:36 Function Parameters:
0:? Sequence
0:39 Function Call: g( (int)
0:42 'sin' (float)
0:43 Function Call: sin(f1; (float)
0:43 Constant:
0:43 0.700000
0:44 Function Call: f(i1;i1;i1; (int)
0:44 Constant:
0:44 1 (const int)
0:44 Constant:
0:44 2 (const int)
0:44 Constant:
0:44 3 (const int)
0:47 move second child to first child (float)
0:47 'f' (float)
0:47 Constant:
0:47 3.000000
0:49 move second child to first child (4-component vector of float)
0:49 'gl_Position' (gl_Position 4-component vector of float)
0:49 Construct vec4 (4-component vector of float)
0:49 'f' (float)
0:51 Sequence
0:51 Sequence
0:51 move second child to first child (int)
0:51 'f' (int)
0:51 Constant:
0:51 0 (const int)
0:51 Loop with condition tested first
0:51 Loop Condition
0:51 Compare Less Than (bool)
0:51 'f' (int)
0:51 Constant:
0:51 10 (const int)
0:51 Loop Body
0:52 Pre-Increment (int)
0:52 'f' (int)
0:51 Loop Terminal Expression
0:51 Pre-Increment (int)
0:51 'f' (int)
0:54 Sequence
0:54 move second child to first child (int)
0:54 'x' (int)
0:54 Constant:
0:54 1 (const int)
0:56 Sequence
0:56 Sequence
0:56 move second child to first child (float)
0:56 'x' (float)
0:56 Constant:
0:56 2.000000
0:56 move second child to first child (float)
0:56 'y' (float)
0:56 'x' (float)
0:60 Sequence
0:60 Sequence
0:60 move second child to first child (int)
0:60 'x' (int)
0:60 'x' (int)
0:68 Sequence
0:68 Sequence
0:68 move second child to first child (structure{x})
0:68 'S' (structure{x})
0:68 Constant:
0:68 0 (const int)
0:69 x: direct index for structure (int)
0:69 'S' (structure{x})
0:69 Constant:
0:69 0 (const int)
0:73 Constant:
0:73 183.346494
0:? Linker Objects
0:? 'b' (bool)
0:? 'c' (bool)
0:? 'f' (float)
0:? 'tan' (float)
Linked vertex stage:

View File

@ -14,7 +14,7 @@ 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' : only the length method is supported for array
ERROR: 0:33: '=' : cannot convert from '7-element array of float' to 'int' 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' : only the length method is supported for array
ERROR: 0:34: 'f' : no matching overloaded function found ERROR: 0:34: 'f' : can't use function syntax on variable
ERROR: 0:34: 'a4' : redefinition ERROR: 0:34: 'a4' : redefinition
ERROR: 0:35: 'arrays of arrays' : not supported with this profile: none ERROR: 0:35: 'arrays of arrays' : not supported with this profile: none
ERROR: 0:36: 'arrays of arrays' : not supported with this profile: none ERROR: 0:36: 'arrays of arrays' : not supported with this profile: none
@ -38,13 +38,14 @@ ERROR: 0:57: 'float' : overloaded functions must have the same return type
ERROR: 0:87: 'overloadC' : no matching overloaded function found ERROR: 0:87: 'overloadC' : no matching overloaded function found
ERROR: 0:90: 'overloadC' : no matching overloaded function found ERROR: 0:90: 'overloadC' : no matching overloaded function found
ERROR: 0:95: 'overloadD' : ambiguous function signature match: multiple signatures match under implicit type conversion ERROR: 0:95: 'overloadD' : ambiguous function signature match: multiple signatures match under implicit type conversion
ERROR: 0:98: 'overloadB' : can't use function syntax on variable
ERROR: 0:106: 'overloadC' : no matching overloaded function found ERROR: 0:106: 'overloadC' : no matching overloaded function found
ERROR: 0:107: 'overloadE' : no matching overloaded function found ERROR: 0:107: 'overloadE' : no matching overloaded function found
ERROR: 0:108: 'overloadE' : no matching overloaded function found ERROR: 0:108: 'overloadE' : no matching overloaded function found
ERROR: 0:111: 'overloadE' : no matching overloaded function found ERROR: 0:111: 'overloadE' : no matching overloaded function found
ERROR: 0:117: 'overloadF' : no matching overloaded function found ERROR: 0:117: 'overloadF' : no matching overloaded function found
ERROR: 0:121: 'gl_TexCoord array size' : must be less than gl_MaxTextureCoords (32) ERROR: 0:121: 'gl_TexCoord array size' : must be less than gl_MaxTextureCoords (32)
ERROR: 45 compilation errors. No code generated. ERROR: 46 compilation errors. No code generated.
ERROR: node is still EOpNull! ERROR: node is still EOpNull!
@ -138,10 +139,8 @@ ERROR: node is still EOpNull!
0:95 Function Call: overloadD(f1;i1; (3-component vector of float) 0:95 Function Call: overloadD(f1;i1; (3-component vector of float)
0:95 'i' (int) 0:95 'i' (int)
0:95 'i' (int) 0:95 'i' (int)
0:98 Function Call: overloadB(f1;f1; (2-component vector of float) 0:98 Constant:
0:98 Constant: 0:98 0.000000
0:98 1 (const int)
0:98 'i' (int)
0:100 Constant: 0:100 Constant:
0:100 0.000000 0:100 0.000000
0:101 Function Call: texture2D(s21;vf2; (4-component vector of float) 0:101 Function Call: texture2D(s21;vf2; (4-component vector of float)

View File

@ -1,21 +1,24 @@
300scope.vert 300scope.vert
ERROR: 0:5: 'a' : redefinition ERROR: 0:5: 'a' : redefinition
ERROR: 0:17: 'b' : function name is redeclaration of existing name ERROR: 0:17: 'b' : function name is redeclaration of existing name
ERROR: 0:19: 'f' : redefinition ERROR: 0:20: 'c' : redefinition
ERROR: 0:20: 'tan' : redefinition ERROR: 0:22: 'f' : redefinition
ERROR: 0:21: 'redefinition of built-in function' : not supported with this profile: es ERROR: 0:23: 'tan' : redefinition
ERROR: 0:21: 'sin' : function name is redeclaration of existing name ERROR: 0:24: '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:24: 'sin' : function name is redeclaration of existing name
ERROR: 0:22: 'cos' : function name is redeclaration of existing name ERROR: 0:25: 'redefinition of built-in function' : not supported with this profile: es
ERROR: 0:22: 'cos' : function already has a body ERROR: 0:25: 'cos' : function name is redeclaration of existing name
ERROR: 0:24: 'return' : void function cannot return a value ERROR: 0:25: 'cos' : function already has a body
ERROR: 0:26: 'radians' : function name is redeclaration of existing name ERROR: 0:27: 'return' : void function cannot return a value
ERROR: 0:26: 'radians' : can't find function ERROR: 0:29: 'radians' : function name is redeclaration of existing name
ERROR: 0:28: 'return' : void function cannot return a value ERROR: 0:29: 'radians' : can't find function
ERROR: 0:35: 'local function declaration' : not supported with this profile: es ERROR: 0:31: 'return' : void function cannot return a value
ERROR: 0:54: 'z' : undeclared identifier ERROR: 0:38: 'local function declaration' : not supported with this profile: es
ERROR: 0:54: 'z' : redefinition ERROR: 0:43: 'sin' : can't use function syntax on variable
ERROR: 16 compilation errors. No code generated. ERROR: 0:57: 'z' : undeclared identifier
ERROR: 0:57: 'z' : redefinition
ERROR: 0:73: 'degrees' : can't use function syntax on variable
ERROR: 19 compilation errors. No code generated.
ERROR: node is still EOpNull! ERROR: node is still EOpNull!
@ -36,87 +39,91 @@ ERROR: node is still EOpNull!
0:8 1.000000 0:8 1.000000
0:11 Branch: Return with expression 0:11 Branch: Return with expression
0:11 'a' (in highp int) 0:11 'a' (in highp int)
0:22 Function Definition: cos(f1; (highp float) 0:25 Function Definition: cos(f1; (highp float)
0:22 Function Parameters: 0:25 Function Parameters:
0:22 'x' (in highp float) 0:25 'x' (in highp float)
0:24 Sequence 0:27 Sequence
0:24 Branch: Return with expression 0:27 Branch: Return with expression
0:24 Constant: 0:27 Constant:
0:24 1.000000 0:27 1.000000
0:26 Function Definition: radians(b1; (bool) 0:29 Function Definition: radians(b1; (bool)
0:26 Function Parameters: 0:29 Function Parameters:
0:26 'x' (in bool) 0:29 'x' (in bool)
0:28 Sequence 0:31 Sequence
0:28 Branch: Return with expression 0:31 Branch: Return with expression
0:28 Constant: 0:31 Constant:
0:28 true (const bool) 0:31 true (const bool)
0:33 Function Definition: main( (void) 0:36 Function Definition: main( (void)
0:33 Function Parameters: 0:36 Function Parameters:
0:? Sequence 0:? Sequence
0:36 Function Call: g( (highp int) 0:39 Function Call: g( (highp int)
0:39 'sin' (highp float) 0:42 'sin' (highp float)
0:41 Function Call: f(i1;i1;i1; (highp int) 0:43 Constant:
0:41 Constant: 0:43 0.000000
0:41 1 (const int) 0:44 Function Call: f(i1;i1;i1; (highp 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 Constant:
0:44 3.000000 0:44 1 (const int)
0:46 move second child to first child (highp 4-component vector of float) 0:44 Constant:
0:46 'gl_Position' (invariant gl_Position highp 4-component vector of float) 0:44 2 (const int)
0:46 Construct vec4 (highp 4-component vector of float) 0:44 Constant:
0:46 'f' (highp float) 0:44 3 (const int)
0:48 Sequence 0:47 move second child to first child (highp float)
0:48 Sequence 0:47 'f' (highp float)
0:48 move second child to first child (highp int) 0:47 Constant:
0:48 'f' (highp int) 0:47 3.000000
0:48 Constant: 0:49 move second child to first child (highp 4-component vector of float)
0:48 0 (const int) 0:49 'gl_Position' (invariant gl_Position highp 4-component vector of float)
0:48 Loop with condition tested first 0:49 Construct vec4 (highp 4-component vector of float)
0:48 Loop Condition 0:49 'f' (highp float)
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 Sequence
0:51 move second child to first child (highp int) 0:51 Sequence
0:51 'x' (highp int) 0:51 move second child to first child (highp int)
0:51 Constant: 0:51 'f' (highp int)
0:51 1 (const int) 0:51 Constant:
0:53 Sequence 0:51 0 (const int)
0:53 Sequence 0:51 Loop with condition tested first
0:53 move second child to first child (highp float) 0:51 Loop Condition
0:53 'x' (highp float) 0:51 Compare Less Than (bool)
0:53 Constant: 0:51 'f' (highp int)
0:53 2.000000 0:51 Constant:
0:53 move second child to first child (highp float) 0:51 10 (const int)
0:53 'y' (highp float) 0:51 Loop Body
0:53 'x' (highp float) 0:52 Pre-Increment (highp int)
0:57 Sequence 0:52 'f' (highp int)
0:57 Sequence 0:51 Loop Terminal Expression
0:57 move second child to first child (highp int) 0:51 Pre-Increment (highp int)
0:57 'x' (highp int) 0:51 'f' (highp int)
0:57 'x' (highp int) 0:54 Sequence
0:65 Sequence 0:54 move second child to first child (highp int)
0:65 Sequence 0:54 'x' (highp int)
0:65 move second child to first child (structure{x}) 0:54 Constant:
0:65 'S' (structure{x}) 0:54 1 (const int)
0:65 Constant: 0:56 Sequence
0:65 0 (const int) 0:56 Sequence
0:66 x: direct index for structure (highp int) 0:56 move second child to first child (highp float)
0:66 'S' (structure{x}) 0:56 'x' (highp float)
0:66 Constant: 0:56 Constant:
0:66 0 (const int) 0:56 2.000000
0:56 move second child to first child (highp float)
0:56 'y' (highp float)
0:56 'x' (highp float)
0:60 Sequence
0:60 Sequence
0:60 move second child to first child (highp int)
0:60 'x' (highp int)
0:60 'x' (highp int)
0:68 Sequence
0:68 Sequence
0:68 move second child to first child (structure{x})
0:68 'S' (structure{x})
0:68 Constant:
0:68 0 (const int)
0:69 x: direct index for structure (highp int)
0:69 'S' (structure{x})
0:69 Constant:
0:69 0 (const int)
0:73 Constant:
0:73 0.000000
0:? Linker Objects 0:? Linker Objects
0:? 'b' (bool) 0:? 'b' (bool)
0:? 'gl_VertexID' (gl_VertexId highp int) 0:? 'gl_VertexID' (gl_VertexId highp int)

View File

@ -2,10 +2,13 @@
Warning, version 430 is not yet complete; some version-specific features are present, but many are missing. Warning, version 430 is not yet complete; some version-specific features are present, but many are missing.
ERROR: 0:5: 'a' : redefinition ERROR: 0:5: 'a' : redefinition
ERROR: 0:17: 'b' : function name is redeclaration of existing name ERROR: 0:17: 'b' : function name is redeclaration of existing name
ERROR: 0:19: 'f' : redefinition ERROR: 0:20: 'c' : redefinition
ERROR: 0:54: 'z' : undeclared identifier ERROR: 0:22: 'f' : redefinition
ERROR: 0:54: 'z' : redefinition ERROR: 0:43: 'sin' : can't use function syntax on variable
ERROR: 5 compilation errors. No code generated. ERROR: 0:57: 'z' : undeclared identifier
ERROR: 0:57: 'z' : redefinition
ERROR: 0:73: 'degrees' : can't use function syntax on variable
ERROR: 8 compilation errors. No code generated.
ERROR: node is still EOpNull! ERROR: node is still EOpNull!
@ -26,90 +29,94 @@ ERROR: node is still EOpNull!
0:8 1.000000 0:8 1.000000
0:11 Branch: Return with expression 0:11 Branch: Return with expression
0:11 'a' (in int) 0:11 'a' (in int)
0:22 Function Definition: cos(f1; (float) 0:25 Function Definition: cos(f1; (float)
0:22 Function Parameters: 0:25 Function Parameters:
0:22 'x' (in float) 0:25 'x' (in float)
0:24 Sequence 0:27 Sequence
0:24 Branch: Return with expression 0:27 Branch: Return with expression
0:24 Constant: 0:27 Constant:
0:24 1.000000 0:27 1.000000
0:26 Function Definition: radians(b1; (bool) 0:29 Function Definition: radians(b1; (bool)
0:26 Function Parameters: 0:29 Function Parameters:
0:26 'x' (in bool) 0:29 'x' (in bool)
0:28 Sequence 0:31 Sequence
0:28 Branch: Return with expression 0:31 Branch: Return with expression
0:28 Constant: 0:31 Constant:
0:28 true (const bool) 0:31 true (const bool)
0:33 Function Definition: main( (void) 0:36 Function Definition: main( (void)
0:33 Function Parameters: 0:36 Function Parameters:
0:? Sequence 0:? Sequence
0:36 Function Call: g( (int) 0:39 Function Call: g( (int)
0:39 'sin' (float) 0:42 'sin' (float)
0:41 Function Call: f(i1;i1;i1; (int) 0:43 Constant:
0:41 Constant: 0:43 0.000000
0:41 1 (const int) 0:44 Function Call: f(i1;i1;i1; (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 Constant:
0:44 3.000000 0:44 1 (const int)
0:46 move second child to first child (4-component vector of float) 0:44 Constant:
0:46 gl_Position: direct index for structure (invariant gl_Position 4-component vector of float) 0:44 2 (const int)
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:44 Constant:
0:46 Constant: 0:44 3 (const int)
0:46 0 (const uint) 0:47 move second child to first child (float)
0:46 Construct vec4 (4-component vector of float) 0:47 'f' (float)
0:46 'f' (float) 0:47 Constant:
0:48 Sequence 0:47 3.000000
0:48 Sequence 0:49 move second child to first child (4-component vector of float)
0:48 move second child to first child (int) 0:49 gl_Position: direct index for structure (invariant gl_Position 4-component vector of float)
0:48 'f' (int) 0:49 '__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:48 Constant: 0:49 Constant:
0:48 0 (const int) 0:49 0 (const uint)
0:48 Loop with condition tested first 0:49 Construct vec4 (4-component vector of float)
0:48 Loop Condition 0:49 'f' (float)
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 Sequence
0:51 move second child to first child (int) 0:51 Sequence
0:51 'x' (int) 0:51 move second child to first child (int)
0:51 Constant: 0:51 'f' (int)
0:51 1 (const int) 0:51 Constant:
0:53 Sequence 0:51 0 (const int)
0:53 Sequence 0:51 Loop with condition tested first
0:53 move second child to first child (float) 0:51 Loop Condition
0:53 'x' (float) 0:51 Compare Less Than (bool)
0:53 Constant: 0:51 'f' (int)
0:53 2.000000 0:51 Constant:
0:53 move second child to first child (float) 0:51 10 (const int)
0:53 'y' (float) 0:51 Loop Body
0:53 'x' (float) 0:52 Pre-Increment (int)
0:57 Sequence 0:52 'f' (int)
0:57 Sequence 0:51 Loop Terminal Expression
0:57 move second child to first child (int) 0:51 Pre-Increment (int)
0:57 'x' (int) 0:51 'f' (int)
0:57 'x' (int) 0:54 Sequence
0:65 Sequence 0:54 move second child to first child (int)
0:65 Sequence 0:54 'x' (int)
0:65 move second child to first child (structure{x}) 0:54 Constant:
0:65 'S' (structure{x}) 0:54 1 (const int)
0:65 Constant: 0:56 Sequence
0:65 0 (const int) 0:56 Sequence
0:66 x: direct index for structure (int) 0:56 move second child to first child (float)
0:66 'S' (structure{x}) 0:56 'x' (float)
0:66 Constant: 0:56 Constant:
0:66 0 (const int) 0:56 2.000000
0:56 move second child to first child (float)
0:56 'y' (float)
0:56 'x' (float)
0:60 Sequence
0:60 Sequence
0:60 move second child to first child (int)
0:60 'x' (int)
0:60 'x' (int)
0:68 Sequence
0:68 Sequence
0:68 move second child to first child (structure{x})
0:68 'S' (structure{x})
0:68 Constant:
0:68 0 (const int)
0:69 x: direct index for structure (int)
0:69 'S' (structure{x})
0:69 Constant:
0:69 0 (const int)
0:73 Constant:
0:73 0.000000
0:? Linker Objects 0:? Linker Objects
0:? 'b' (bool) 0:? 'b' (bool)
0:? 'tan' (float) 0:? 'tan' (float)

View File

@ -45,6 +45,7 @@ switch.frag
tokenLength.vert tokenLength.vert
100Limits.vert 100Limits.vert
100scope.vert 100scope.vert
110scope.vert
300scope.vert 300scope.vert
400.frag 400.frag
420.vert 420.vert

View File

@ -9,5 +9,5 @@
// source have to figure out how to create revision.h just to get a build // source have to figure out how to create revision.h just to get a build
// going. However, if it is not updated, it can be a version behind. // going. However, if it is not updated, it can be a version behind.
#define GLSLANG_REVISION "24420" #define GLSLANG_REVISION "24468"
#define GLSLANG_DATE "2013/12/09 17:25:14" #define GLSLANG_DATE "2013/12/11 11:57:40"

View File

@ -2904,6 +2904,11 @@ const TFunction* TParseContext::findFunction(TSourceLoc loc, const TFunction& ca
{ {
const TFunction* function = 0; const TFunction* function = 0;
if (symbolTable.isFunctionNameVariable(call.getName())) {
error(loc, "can't use function syntax on variable", call.getName().c_str(), "");
return 0;
}
if (profile == EEsProfile || version < 120) if (profile == EEsProfile || version < 120)
function = findFunctionExact(loc, call, builtIn); function = findFunctionExact(loc, call, builtIn);
else if (version < 400) else if (version < 400)

View File

@ -170,6 +170,8 @@ void InitializeStageSymbolTable(TBuiltIns& builtIns, int version, EProfile profi
IdentifyBuiltIns(version, profile, language, *symbolTables[language]); IdentifyBuiltIns(version, profile, language, *symbolTables[language]);
if (profile == EEsProfile && version >= 300) if (profile == EEsProfile && version >= 300)
(*symbolTables[language]).setNoBuiltInRedeclarations(); (*symbolTables[language]).setNoBuiltInRedeclarations();
if (version == 110)
(*symbolTables[language]).setSeparateNameSpaces();
} }
// //

View File

@ -322,11 +322,11 @@ TSymbolTableLevel* TSymbolTableLevel::clone() const
TVariable* container = anon->getAnonContainer().clone(); TVariable* container = anon->getAnonContainer().clone();
container->changeName(NewPoolTString("")); container->changeName(NewPoolTString(""));
// insert the whole container // insert the whole container
symTableLevel->insert(*container); symTableLevel->insert(*container, false);
containerCopied[anon->getAnonId()] = true; containerCopied[anon->getAnonId()] = true;
} }
} else } else
symTableLevel->insert(*iter->second->clone()); symTableLevel->insert(*iter->second->clone(), false);
} }
return symTableLevel; return symTableLevel;
@ -338,6 +338,7 @@ void TSymbolTable::copyTable(const TSymbolTable& copyOf)
uniqueId = copyOf.uniqueId; uniqueId = copyOf.uniqueId;
noBuiltInRedeclarations = copyOf.noBuiltInRedeclarations; noBuiltInRedeclarations = copyOf.noBuiltInRedeclarations;
separateNameSpaces = copyOf.separateNameSpaces;
for (unsigned int i = copyOf.adoptedLevels; i < copyOf.table.size(); ++i) for (unsigned int i = copyOf.adoptedLevels; i < copyOf.table.size(); ++i)
table.push_back(copyOf.table[i]->clone()); table.push_back(copyOf.table[i]->clone());
} }

View File

@ -283,7 +283,7 @@ public:
TSymbolTableLevel() : defaultPrecision(0), anonId(0) { } TSymbolTableLevel() : defaultPrecision(0), anonId(0) { }
~TSymbolTableLevel(); ~TSymbolTableLevel();
bool insert(TSymbol& symbol) bool insert(TSymbol& symbol, bool separateNameSpaces)
{ {
// //
// returning true means symbol was added to the table with no semantic errors // returning true means symbol was added to the table with no semantic errors
@ -316,7 +316,7 @@ public:
const TString& insertName = symbol.getMangledName(); const TString& insertName = symbol.getMangledName();
if (symbol.getAsFunction()) { if (symbol.getAsFunction()) {
// make sure there isn't a variable of this name // make sure there isn't a variable of this name
if (level.find(name) != level.end()) if (! separateNameSpaces && level.find(name) != level.end())
return false; return false;
// insert, and whatever happens is okay // insert, and whatever happens is okay
@ -367,6 +367,34 @@ public:
return false; return false;
} }
// See if there is a variable at this level having the given non-function-style name.
// Return true if name is found, and set variable to true if the name was a variable.
bool findFunctionVariableName(const TString& name, bool& variable) const
{
tLevel::const_iterator candidate = level.lower_bound(name);
if (candidate != level.end()) {
const TString& candidateName = (*candidate).first;
TString::size_type parenAt = candidateName.find_first_of('(');
if (parenAt == candidateName.npos) {
// not a mangled name
if (candidateName == name) {
// found a variable name match
variable = true;
return true;
}
} else {
// a mangled name
if (candidateName.compare(0, parenAt, name) == 0) {
// found a function name match
variable = false;
return true;
}
}
}
return false;
}
// Use this to do a lazy 'push' of precision defaults the first time // Use this to do a lazy 'push' of precision defaults the first time
// a precision statement is seen in a new scope. Leave it at 0 for // a precision statement is seen in a new scope. Leave it at 0 for
// when no push was needed. Thus, it is not the current defaults, // when no push was needed. Thus, it is not the current defaults,
@ -415,7 +443,7 @@ protected:
class TSymbolTable { class TSymbolTable {
public: public:
TSymbolTable() : uniqueId(0), noBuiltInRedeclarations(false), adoptedLevels(0) TSymbolTable() : uniqueId(0), noBuiltInRedeclarations(false), separateNameSpaces(false), adoptedLevels(0)
{ {
// //
// This symbol table cannot be used until push() is called. // This symbol table cannot be used until push() is called.
@ -438,6 +466,7 @@ public:
} }
uniqueId = symTable.uniqueId; uniqueId = symTable.uniqueId;
noBuiltInRedeclarations = symTable.noBuiltInRedeclarations; noBuiltInRedeclarations = symTable.noBuiltInRedeclarations;
separateNameSpaces = symTable.separateNameSpaces;
} }
// //
@ -459,6 +488,7 @@ public:
bool atGlobalLevel() { return isGlobalLevel(currentLevel()); } bool atGlobalLevel() { return isGlobalLevel(currentLevel()); }
void setNoBuiltInRedeclarations() { noBuiltInRedeclarations = true; } void setNoBuiltInRedeclarations() { noBuiltInRedeclarations = true; }
void setSeparateNameSpaces() { separateNameSpaces = true; }
void push() void push()
{ {
@ -477,7 +507,7 @@ public:
symbol.setUniqueId(++uniqueId); symbol.setUniqueId(++uniqueId);
// make sure there isn't a function of this variable name // make sure there isn't a function of this variable name
if (! symbol.getAsFunction() && table[currentLevel()]->hasFunctionName(symbol.getName())) if (! separateNameSpaces && ! symbol.getAsFunction() && table[currentLevel()]->hasFunctionName(symbol.getName()))
return false; return false;
// check for not overloading or redefining a built-in function // check for not overloading or redefining a built-in function
@ -490,7 +520,7 @@ public:
} }
} }
return table[currentLevel()]->insert(symbol); return table[currentLevel()]->insert(symbol, separateNameSpaces);
} }
// //
@ -517,12 +547,12 @@ public:
TSymbol* copyUp(TSymbol* shared) TSymbol* copyUp(TSymbol* shared)
{ {
TSymbol* copy = copyUpDeferredInsert(shared); TSymbol* copy = copyUpDeferredInsert(shared);
table[globalLevel]->insert(*copy); table[globalLevel]->insert(*copy, separateNameSpaces);
if (shared->getAsVariable()) if (shared->getAsVariable())
return copy; return copy;
else { else {
// get copy of an anonymous member's container // get copy of an anonymous member's container
table[currentLevel()]->insert(*copy); table[currentLevel()]->insert(*copy, separateNameSpaces);
// return the copy of the anonymous member // return the copy of the anonymous member
return table[currentLevel()]->find(shared->getName()); return table[currentLevel()]->find(shared->getName());
} }
@ -545,6 +575,23 @@ public:
return symbol; return symbol;
} }
bool isFunctionNameVariable(const TString& name) const
{
if (separateNameSpaces)
return false;
int level = currentLevel();
do {
bool variable;
bool found = table[level]->findFunctionVariableName(name, variable);
if (found)
return variable;
--level;
} while (level >= 0);
return false;
}
void findFunctionNameList(const TString& name, TVector<TFunction*>& list, bool& builtIn) void findFunctionNameList(const TString& name, TVector<TFunction*>& list, bool& builtIn)
{ {
// For user levels, return the set found in the first scope with a match // For user levels, return the set found in the first scope with a match
@ -606,6 +653,7 @@ protected:
std::vector<TSymbolTableLevel*> table; std::vector<TSymbolTableLevel*> table;
int uniqueId; // for unique identification in code generation int uniqueId; // for unique identification in code generation
bool noBuiltInRedeclarations; bool noBuiltInRedeclarations;
bool separateNameSpaces;
unsigned int adoptedLevels; unsigned int adoptedLevels;
}; };

View File

@ -91,7 +91,7 @@ void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)
else if (vertices != unit.vertices) else if (vertices != unit.vertices)
error(infoSink, "Contradictory layout max_vertices values"); error(infoSink, "Contradictory layout max_vertices values");
if (vertexSpacing == ElgNone) if (vertexSpacing == EvsNone)
vertexSpacing = unit.vertexSpacing; vertexSpacing = unit.vertexSpacing;
else if (vertexSpacing != unit.vertexSpacing) else if (vertexSpacing != unit.vertexSpacing)
error(infoSink, "Contradictory input vertex spacing"); error(infoSink, "Contradictory input vertex spacing");