diff options
author | 2016-08-11 18:53:26 +0000 | |
---|---|---|
committer | 2016-08-12 08:52:09 +0000 | |
commit | 83e3acb88d9973011a1101f747fa4664e2515eca (patch) | |
tree | 02444526b7e68f4b3de3416e81f30a8b94928886 /src | |
parent | 7c80d88eb8e329a99da4cb433343725482bd7c15 (diff) |
Roll forward fix of global var shadow detection
RELNOTES[INC]: Skylark: It is an error to shadow a global variable with a local variable after the global has already been accessed in the function.
--
MOS_MIGRATED_REVID=130014492
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/Environment.java | 5 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java | 12 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Environment.java b/src/main/java/com/google/devtools/build/lib/syntax/Environment.java index 2aab8811b2..ec504a06ec 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/Environment.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/Environment.java @@ -222,12 +222,14 @@ public final class Environment implements Freezable { FuncallExpression caller, Frame lexicalFrame, Frame globalFrame, + Set<String> knownGlobalVariables, boolean isSkylark) { this.continuation = continuation; this.function = function; this.caller = caller; this.lexicalFrame = lexicalFrame; this.globalFrame = globalFrame; + this.knownGlobalVariables = knownGlobalVariables; this.isSkylark = isSkylark; } } @@ -369,7 +371,8 @@ public final class Environment implements Freezable { */ void enterScope(BaseFunction function, FuncallExpression caller, Frame globals) { continuation = - new Continuation(continuation, function, caller, lexicalFrame, globalFrame, isSkylark); + new Continuation(continuation, function, caller, lexicalFrame, globalFrame, + knownGlobalVariables, isSkylark); lexicalFrame = new Frame(mutability(), null); globalFrame = globals; knownGlobalVariables = new HashSet<>(); diff --git a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java index d5d393702b..3451238e01 100644 --- a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java @@ -120,6 +120,18 @@ public class FunctionTest extends EvaluationTestCase { } @Test + public void testFunctionDefLocalVariableReferencedInCallBeforeAssignment() throws Exception { + checkEvalErrorContains("Variable 'a' is referenced before assignment.", + "def dummy(x):", + " pass", + "a = 1", + "def func():", + " dummy(a)", + " a = 2", + "func()\n"); + } + + @Test public void testFunctionDefLocalVariableReferencedAfterAssignment() throws Exception { eval("a = 1", "def func():", |