[Python-checkins] gh-99153: set location on SyntaxError for try with both except and except* (GH-99160)
iritkatriel
webhook-mailer at python.org
Sun Nov 6 10:36:29 EST 2022
https://github.com/python/cpython/commit/61b6c40b645bd8c8568f1646dc46580fa49d107a
commit: 61b6c40b645bd8c8568f1646dc46580fa49d107a
branch: main
author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com>
committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com>
date: 2022-11-06T15:36:19Z
summary:
gh-99153: set location on SyntaxError for try with both except and except* (GH-99160)
files:
A Misc/NEWS.d/next/Core and Builtins/2022-11-06-13-25-01.gh-issue-99153.uE3CVL.rst
M Grammar/python.gram
M Lib/test/test_syntax.py
M Parser/parser.c
diff --git a/Grammar/python.gram b/Grammar/python.gram
index 7dfc3df22fdd..c947d22b99d4 100644
--- a/Grammar/python.gram
+++ b/Grammar/python.gram
@@ -1254,8 +1254,8 @@ invalid_try_stmt:
| a='try' ':' NEWLINE !INDENT {
RAISE_INDENTATION_ERROR("expected an indented block after 'try' statement on line %d", a->lineno) }
| 'try' ':' block !('except' | 'finally') { RAISE_SYNTAX_ERROR("expected 'except' or 'finally' block") }
- | 'try' ':' block* ((except_block+ except_star_block) | (except_star_block+ except_block)) block* {
- RAISE_SYNTAX_ERROR("cannot have both 'except' and 'except*' on the same 'try'") }
+ | a='try' ':' block* ((except_block+ except_star_block) | (except_star_block+ except_block)) block* {
+ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot have both 'except' and 'except*' on the same 'try'") }
invalid_except_stmt:
| 'except' '*'? a=expression ',' expressions ['as' NAME ] ':' {
RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized") }
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py
index b822bc9fc0a5..72538428f8ba 100644
--- a/Lib/test/test_syntax.py
+++ b/Lib/test/test_syntax.py
@@ -2014,6 +2014,16 @@ def test_generator_in_function_call(self):
"Generator expression must be parenthesized",
lineno=1, end_lineno=1, offset=11, end_offset=53)
+ def test_except_then_except_star(self):
+ self._check_error("try: pass\nexcept ValueError: pass\nexcept* TypeError: pass",
+ r"cannot have both 'except' and 'except\*' on the same 'try'",
+ lineno=1, end_lineno=1, offset=1, end_offset=4)
+
+ def test_except_star_then_except(self):
+ self._check_error("try: pass\nexcept* ValueError: pass\nexcept TypeError: pass",
+ r"cannot have both 'except' and 'except\*' on the same 'try'",
+ lineno=1, end_lineno=1, offset=1, end_offset=4)
+
def test_empty_line_after_linecont(self):
# See issue-40847
s = r"""\
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-11-06-13-25-01.gh-issue-99153.uE3CVL.rst b/Misc/NEWS.d/next/Core and Builtins/2022-11-06-13-25-01.gh-issue-99153.uE3CVL.rst
new file mode 100644
index 000000000000..0445afbbc4fb
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-11-06-13-25-01.gh-issue-99153.uE3CVL.rst
@@ -0,0 +1 @@
+Fix location of :exc:`SyntaxError` for a :keyword:`try` block with both :keyword:`except` and :keyword:`except* <except_star>`.
diff --git a/Parser/parser.c b/Parser/parser.c
index b23507ac87c6..c2580556620d 100644
--- a/Parser/parser.c
+++ b/Parser/parser.c
@@ -21974,13 +21974,13 @@ invalid_try_stmt_rule(Parser *p)
return NULL;
}
D(fprintf(stderr, "%*c> invalid_try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' ':' block* ((except_block+ except_star_block) | (except_star_block+ except_block)) block*"));
- Token * _keyword;
Token * _literal;
asdl_seq * _loop0_203_var;
asdl_seq * _loop0_205_var;
void *_tmp_204_var;
+ Token * a;
if (
- (_keyword = _PyPegen_expect_token(p, 620)) // token='try'
+ (a = _PyPegen_expect_token(p, 620)) // token='try'
&&
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
&&
@@ -21992,7 +21992,7 @@ invalid_try_stmt_rule(Parser *p)
)
{
D(fprintf(stderr, "%*c+ invalid_try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block* ((except_block+ except_star_block) | (except_star_block+ except_block)) block*"));
- _res = RAISE_SYNTAX_ERROR ( "cannot have both 'except' and 'except*' on the same 'try'" );
+ _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot have both 'except' and 'except*' on the same 'try'" );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
More information about the Python-checkins
mailing list