diff options
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java | 7 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java | 13 |
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", |