aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java7
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java13
2 files changed, 18 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
index f6082d9227..c301061dc3 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
@@ -675,9 +675,12 @@ public final class FuncallExpression extends Expression {
if (arg.isPositional()) {
posargs.add(value);
} else if (arg.isStar()) { // expand the starArg
- if (value instanceof Iterable) {
- posargs.addAll((Iterable<Object>) value);
+ if (!(value instanceof Iterable)) {
+ throw new EvalException(
+ getLocation(),
+ "argument after * must be an iterable, not " + EvalUtils.getDataTypeName(value));
}
+ posargs.addAll((Iterable<Object>) value);
} else if (arg.isStarStar()) { // expand the kwargs
addKeywordArgs(kwargs, value, duplicates, getLocation());
} else {
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 2f29dfd1d4..095964344e 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
@@ -308,6 +308,19 @@ public class FunctionTest extends EvaluationTestCase {
}
@Test
+ public void testArgsIsNotIterable() throws Exception {
+ checkEvalError(
+ "argument after * must be an iterable, not int",
+ "def func1(a, b): return a + b",
+ "func1('a', *42)");
+
+ checkEvalError(
+ "argument after * must be an iterable, not string",
+ "def func2(a, b): return a + b",
+ "func2('a', *'str')");
+ }
+
+ @Test
public void testKwargs() throws Exception {
eval("def foo(a, b = 'b', *, c, d = 'd'):",
" return a + b + c + d",