mirror of https://github.com/python/cpython
gh-99153: set location on SyntaxError for try with both except and except* (GH-99160)
This commit is contained in:
parent
d3b82b4463
commit
61b6c40b64
|
@ -1254,8 +1254,8 @@ invalid_try_stmt:
|
||||||
| a='try' ':' NEWLINE !INDENT {
|
| a='try' ':' NEWLINE !INDENT {
|
||||||
RAISE_INDENTATION_ERROR("expected an indented block after 'try' statement on line %d", a->lineno) }
|
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' | 'finally') { RAISE_SYNTAX_ERROR("expected 'except' or 'finally' block") }
|
||||||
| 'try' ':' block* ((except_block+ except_star_block) | (except_star_block+ except_block)) block* {
|
| a='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'") }
|
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot have both 'except' and 'except*' on the same 'try'") }
|
||||||
invalid_except_stmt:
|
invalid_except_stmt:
|
||||||
| 'except' '*'? a=expression ',' expressions ['as' NAME ] ':' {
|
| 'except' '*'? a=expression ',' expressions ['as' NAME ] ':' {
|
||||||
RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized") }
|
RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized") }
|
||||||
|
|
|
@ -2014,6 +2014,16 @@ class SyntaxTestCase(unittest.TestCase):
|
||||||
"Generator expression must be parenthesized",
|
"Generator expression must be parenthesized",
|
||||||
lineno=1, end_lineno=1, offset=11, end_offset=53)
|
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):
|
def test_empty_line_after_linecont(self):
|
||||||
# See issue-40847
|
# See issue-40847
|
||||||
s = r"""\
|
s = r"""\
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix location of :exc:`SyntaxError` for a :keyword:`try` block with both :keyword:`except` and :keyword:`except* <except_star>`.
|
|
@ -21974,13 +21974,13 @@ invalid_try_stmt_rule(Parser *p)
|
||||||
return NULL;
|
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*"));
|
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;
|
Token * _literal;
|
||||||
asdl_seq * _loop0_203_var;
|
asdl_seq * _loop0_203_var;
|
||||||
asdl_seq * _loop0_205_var;
|
asdl_seq * _loop0_205_var;
|
||||||
void *_tmp_204_var;
|
void *_tmp_204_var;
|
||||||
|
Token * a;
|
||||||
if (
|
if (
|
||||||
(_keyword = _PyPegen_expect_token(p, 620)) // token='try'
|
(a = _PyPegen_expect_token(p, 620)) // token='try'
|
||||||
&&
|
&&
|
||||||
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
|
(_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*"));
|
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()) {
|
if (_res == NULL && PyErr_Occurred()) {
|
||||||
p->error_indicator = 1;
|
p->error_indicator = 1;
|
||||||
p->level--;
|
p->level--;
|
||||||
|
|
Loading…
Reference in New Issue