Forbid **kwargs and *args in BUILD files.

Rationale: it makes BUILD files less declarative and makes harder to do
automated changes on BUILD files. It is however still allowed in .bzl
files.

--
MOS_MIGRATED_REVID=94577442
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index ae267e5..67e13e5 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -407,16 +407,30 @@
 
   // arg ::= IDENTIFIER '=' nontupleexpr
   //       | expr
+  //       | *args       (only in Skylark mode)
+  //       | **kwargs    (only in Skylark mode)
+  // To keep BUILD files declarative and easy to process, *args and **kwargs
+  // arguments are allowed only in Skylark mode.
   private Argument.Passed parseFuncallArgument() {
     final int start = token.left;
     // parse **expr
     if (token.kind == TokenKind.STAR_STAR) {
+      if (!skylarkMode) {
+        reportError(
+            lexer.createLocation(token.left, token.right),
+            "**kwargs arguments are not allowed in BUILD files");
+      }
       nextToken();
       Expression expr = parseNonTupleExpression();
       return setLocation(new Argument.StarStar(expr), start, expr);
     }
     // parse *expr
     if (token.kind == TokenKind.STAR) {
+      if (!skylarkMode) {
+        reportError(
+            lexer.createLocation(token.left, token.right),
+            "*args arguments are not allowed in BUILD files");
+      }
       nextToken();
       Expression expr = parseNonTupleExpression();
       return setLocation(new Argument.Star(expr), start, expr);
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index ef1b9f9..5f33718 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -1036,6 +1036,20 @@
   }
 
   @Test
+  public void testKwargsForbidden() throws Exception {
+    setFailFast(false);
+    parseFile("func(**dict)");
+    assertContainsEvent("**kwargs arguments are not allowed in BUILD files");
+  }
+
+  @Test
+  public void testArgsForbidden() throws Exception {
+    setFailFast(false);
+    parseFile("func(*array)");
+    assertContainsEvent("*args arguments are not allowed in BUILD files");
+  }
+
+  @Test
   public void testOptionalArgBeforeMandatoryArgInFuncDef() throws Exception {
     setFailFast(false);
     parseFileForSkylark("def func(a, b = 'a', c):\n  return 0\n");