bpo-40334: Spacialized error message for invalid args after bare '*' (GH-19865)
When parsing things like `def f(*): pass` the old parser used to output `SyntaxError: named arguments must follow bare *`, which the new parser wasn't able to do.
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index 354b3f4..d83b73a 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -242,11 +242,11 @@
check('from __future__ import doesnt_exist', 1, 1)
check('from __future__ import braces', 1, 1)
check('x=1\nfrom __future__ import division', 2, 1)
+ check('def f(*):\n pass', 1, 7 if support.use_old_parser() else 8)
@support.skip_if_new_parser("Pegen column offsets might be different")
def testSyntaxErrorOffsetCustom(self):
self.check('for 1 in []: pass', 1, 5)
- self.check('def f(*):\n pass', 1, 7)
self.check('[*x for x in xs]', 1, 2)
self.check('def f():\n x, y: int', 2, 3)
self.check('(yield i) = 2', 1, 1)
diff --git a/Lib/test/test_peg_parser.py b/Lib/test/test_peg_parser.py
index 1914944..d6939fd 100644
--- a/Lib/test/test_peg_parser.py
+++ b/Lib/test/test_peg_parser.py
@@ -603,6 +603,12 @@
("1 += 1", "cannot assign to literal"),
("pass\n pass", "unexpected indent"),
("def f():\npass", "expected an indented block"),
+ ("def f(*): pass", "named arguments must follow bare *"),
+ ("def f(*,): pass", "named arguments must follow bare *"),
+ ("def f(*, **a): pass", "named arguments must follow bare *"),
+ ("lambda *: pass", "named arguments must follow bare *"),
+ ("lambda *,: pass", "named arguments must follow bare *"),
+ ("lambda *, **a: pass", "named arguments must follow bare *"),
]
GOOD_BUT_FAIL_TEST_CASES = [
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py
index e7468ca..0c0fc48 100644
--- a/Lib/test/test_syntax.py
+++ b/Lib/test/test_syntax.py
@@ -627,9 +627,9 @@
Traceback (most recent call last):
SyntaxError: cannot assign to __debug__
- # >>> with (lambda *:0): pass
- # Traceback (most recent call last):
- # SyntaxError: named arguments must follow bare *
+ >>> with (lambda *:0): pass
+ Traceback (most recent call last):
+ SyntaxError: named arguments must follow bare *
Corner-cases that used to crash: