aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Environment.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java12
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 9d6ec1c52b..e9d7bd93dd 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():",