Give error for calling a user-defined function at global scope.

This commit is contained in:
John Kessenich
2015-10-06 13:11:38 -06:00
parent 894c1c109f
commit 820a22fcc8
5 changed files with 32 additions and 6 deletions

View File

@@ -31,7 +31,7 @@ bool radians(bool x) // okay, can overload built-in functions
return true; return true;
} }
int gi = f(1,2,3); // ERROR, can't call user-defined function from global scope
void main() void main()
{ {

View File

@@ -1,8 +1,9 @@
110scope.vert 110scope.vert
ERROR: 0:5: 'a' : redefinition ERROR: 0:5: 'a' : redefinition
ERROR: 0:34: 'f' : can't call user function from global scope
ERROR: 0:57: 'z' : undeclared identifier ERROR: 0:57: 'z' : undeclared identifier
ERROR: 0:57: 'z' : redefinition ERROR: 0:57: 'z' : redefinition
ERROR: 3 compilation errors. No code generated. ERROR: 4 compilation errors. No code generated.
Shader version: 110 Shader version: 110
@@ -38,6 +39,16 @@ ERROR: node is still EOpNull!
0:31 Branch: Return with expression 0:31 Branch: Return with expression
0:31 Constant: 0:31 Constant:
0:31 true (const bool) 0:31 true (const bool)
0:34 Sequence
0:34 move second child to first child (temp int)
0:34 'gi' (global int)
0:34 Function Call: f(i1;i1;i1; (global int)
0:34 Constant:
0:34 1 (const int)
0:34 Constant:
0:34 2 (const int)
0:34 Constant:
0:34 3 (const int)
0:36 Function Definition: main( (global void) 0:36 Function Definition: main( (global void)
0:36 Function Parameters: 0:36 Function Parameters:
0:? Sequence 0:? Sequence
@@ -115,6 +126,7 @@ ERROR: node is still EOpNull!
0:? 'c' (global bool) 0:? 'c' (global bool)
0:? 'f' (global float) 0:? 'f' (global float)
0:? 'tan' (global float) 0:? 'tan' (global float)
0:? 'gi' (global int)
Linked vertex stage: Linked vertex stage:
@@ -153,6 +165,16 @@ ERROR: node is still EOpNull!
0:31 Branch: Return with expression 0:31 Branch: Return with expression
0:31 Constant: 0:31 Constant:
0:31 true (const bool) 0:31 true (const bool)
0:34 Sequence
0:34 move second child to first child (temp int)
0:34 'gi' (global int)
0:34 Function Call: f(i1;i1;i1; (global int)
0:34 Constant:
0:34 1 (const int)
0:34 Constant:
0:34 2 (const int)
0:34 Constant:
0:34 3 (const int)
0:36 Function Definition: main( (global void) 0:36 Function Definition: main( (global void)
0:36 Function Parameters: 0:36 Function Parameters:
0:? Sequence 0:? Sequence
@@ -230,4 +252,5 @@ ERROR: node is still EOpNull!
0:? 'c' (global bool) 0:? 'c' (global bool)
0:? 'f' (global float) 0:? 'f' (global float)
0:? 'tan' (global float) 0:? 'tan' (global float)
0:? 'gi' (global int)

View File

@@ -2,5 +2,5 @@
// For the version, it uses the latest git tag followed by the number of commits. // For the version, it uses the latest git tag followed by the number of commits.
// For the date, it uses the current date (when then script is run). // For the date, it uses the current date (when then script is run).
#define GLSLANG_REVISION "3.0.779" #define GLSLANG_REVISION "3.0.780"
#define GLSLANG_DATE "05-Oct-2015" #define GLSLANG_DATE "06-Oct-2015"

View File

@@ -1124,7 +1124,10 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction
// if builtIn == true, it's definitely a built-in function with EOpNull // if builtIn == true, it's definitely a built-in function with EOpNull
if (! builtIn) { if (! builtIn) {
call->setUserDefined(); call->setUserDefined();
intermediate.addToCallGraph(infoSink, currentCaller, fnCandidate->getMangledName()); if (symbolTable.atGlobalLevel())
error(loc, "can't call user function from global scope", fnCandidate->getName().c_str(), "");
else
intermediate.addToCallGraph(infoSink, currentCaller, fnCandidate->getMangledName());
} }
if (builtIn) if (builtIn)

View File

@@ -323,7 +323,7 @@ protected:
TQualifier globalInputDefaults; TQualifier globalInputDefaults;
TQualifier globalOutputDefaults; TQualifier globalOutputDefaults;
int* atomicUintOffsets; // to become an array of the right size to hold an offset per binding point int* atomicUintOffsets; // to become an array of the right size to hold an offset per binding point
TString currentCaller; TString currentCaller; // name of last function body entered (not valid when at global scope)
TIdSetType inductiveLoopIds; TIdSetType inductiveLoopIds;
bool anyIndexLimits; bool anyIndexLimits;
TVector<TIntermTyped*> needsIndexLimitationChecking; TVector<TIntermTyped*> needsIndexLimitationChecking;