Throw a static error when lvalue of an augmented assignment is a list. RELNOTES: When the lvalue of an augmented assignment is a list, we now throw an error before evaluating the code (e.g. `a, b += 2, 3`). PiperOrigin-RevId: 165906611
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java b/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java index 4415a85..6f5eb9c 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
@@ -158,6 +158,16 @@ super.visit(node); } + @Override + public void visit(AugmentedAssignmentStatement node) { + if (node.getLValue().getExpression() instanceof ListLiteral) { + throw new ValidationException( + node.getLocation(), "cannot perform augmented assignment on a list or tuple expression"); + } + // Other bad cases are handled when visiting the LValue node. + super.visit(node); + } + /** Returns true if the current block is the top level i.e. has no parent. */ private boolean isTopLevel() { return block.parent == null;
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java index 374ac78..bd43adb 100644 --- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java +++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -964,7 +964,8 @@ @Test public void testInvalidAugmentedAssignment_ListLiteral() throws Exception { - new SkylarkTest().testIfErrorContains("cannot perform augmented assignment on a list literal", + new SkylarkTest().testIfErrorContains( + "cannot perform augmented assignment on a list or tuple expression", "def f(a, b):", " [a, b] += []", "f(1, 2)");
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java index 014d3be..604c53f 100644 --- a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java +++ b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java
@@ -39,6 +39,11 @@ } @Test + public void testAugmentedAssignmentWithMultipleLValues() { + checkError("cannot perform augmented assignment on a list or tuple expression", "a, b += 2, 3"); + } + + @Test public void testReturnOutsideFunction() throws Exception { checkError("Return statements must be inside a function", "return 2\n"); }