mirror of
https://github.com/python/cpython.git
synced 2025-11-24 12:20:42 +00:00
[3.14] gh-138944: Fix SyntaxError message for invalid syntax following valid import-as statement (GH-138945) (#140646)
(cherry picked from commit 3dab11f888)
This commit is contained in:
parent
6c025a040d
commit
d0c78a458b
4 changed files with 60 additions and 19 deletions
|
|
@ -1387,11 +1387,11 @@ invalid_import:
|
||||||
| 'import' token=NEWLINE {
|
| 'import' token=NEWLINE {
|
||||||
RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") }
|
RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") }
|
||||||
invalid_dotted_as_name:
|
invalid_dotted_as_name:
|
||||||
| dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) a=expression {
|
| dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) a=expression {
|
||||||
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a,
|
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a,
|
||||||
"cannot use %s as import target", _PyPegen_get_expr_name(a)) }
|
"cannot use %s as import target", _PyPegen_get_expr_name(a)) }
|
||||||
invalid_import_from_as_name:
|
invalid_import_from_as_name:
|
||||||
| NAME 'as' !(NAME (',' | ')' | NEWLINE)) a=expression {
|
| NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) a=expression {
|
||||||
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a,
|
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a,
|
||||||
"cannot use %s as import target", _PyPegen_get_expr_name(a)) }
|
"cannot use %s as import target", _PyPegen_get_expr_name(a)) }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2111,6 +2111,25 @@ SyntaxError: cannot use subscript as import target
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
SyntaxError: cannot use subscript as import target
|
SyntaxError: cannot use subscript as import target
|
||||||
|
|
||||||
|
# Check that we don't raise a "cannot use name as import target" error
|
||||||
|
# if there is an error in an unrelated statement after ';'
|
||||||
|
|
||||||
|
>>> import a as b; None = 1
|
||||||
|
Traceback (most recent call last):
|
||||||
|
SyntaxError: cannot assign to None
|
||||||
|
|
||||||
|
>>> import a, b as c; d = 1; None = 1
|
||||||
|
Traceback (most recent call last):
|
||||||
|
SyntaxError: cannot assign to None
|
||||||
|
|
||||||
|
>>> from a import b as c; None = 1
|
||||||
|
Traceback (most recent call last):
|
||||||
|
SyntaxError: cannot assign to None
|
||||||
|
|
||||||
|
>>> from a import b, c as d; e = 1; None = 1
|
||||||
|
Traceback (most recent call last):
|
||||||
|
SyntaxError: cannot assign to None
|
||||||
|
|
||||||
# Check that we dont raise the "trailing comma" error if there is more
|
# Check that we dont raise the "trailing comma" error if there is more
|
||||||
# input to the left of the valid part that we parsed.
|
# input to the left of the valid part that we parsed.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
Fix :exc:`SyntaxError` message when invalid syntax appears on the same line
|
||||||
|
as a valid ``import ... as ...`` or ``from ... import ... as ...``
|
||||||
|
statement. Patch by Brian Schubert.
|
||||||
53
Parser/parser.c
generated
53
Parser/parser.c
generated
|
|
@ -23692,7 +23692,7 @@ invalid_import_rule(Parser *p)
|
||||||
return _res;
|
return _res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// invalid_dotted_as_name: dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) expression
|
// invalid_dotted_as_name: dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression
|
||||||
static void *
|
static void *
|
||||||
invalid_dotted_as_name_rule(Parser *p)
|
invalid_dotted_as_name_rule(Parser *p)
|
||||||
{
|
{
|
||||||
|
|
@ -23705,12 +23705,12 @@ invalid_dotted_as_name_rule(Parser *p)
|
||||||
}
|
}
|
||||||
void * _res = NULL;
|
void * _res = NULL;
|
||||||
int _mark = p->mark;
|
int _mark = p->mark;
|
||||||
{ // dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) expression
|
{ // dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression
|
||||||
if (p->error_indicator) {
|
if (p->error_indicator) {
|
||||||
p->level--;
|
p->level--;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
D(fprintf(stderr, "%*c> invalid_dotted_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) expression"));
|
D(fprintf(stderr, "%*c> invalid_dotted_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression"));
|
||||||
Token * _keyword;
|
Token * _keyword;
|
||||||
expr_ty a;
|
expr_ty a;
|
||||||
expr_ty dotted_name_var;
|
expr_ty dotted_name_var;
|
||||||
|
|
@ -23724,7 +23724,7 @@ invalid_dotted_as_name_rule(Parser *p)
|
||||||
(a = expression_rule(p)) // expression
|
(a = expression_rule(p)) // expression
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
D(fprintf(stderr, "%*c+ invalid_dotted_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) expression"));
|
D(fprintf(stderr, "%*c+ invalid_dotted_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression"));
|
||||||
_res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot use %s as import target" , _PyPegen_get_expr_name ( a ) );
|
_res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot use %s as import target" , _PyPegen_get_expr_name ( a ) );
|
||||||
if (_res == NULL && PyErr_Occurred()) {
|
if (_res == NULL && PyErr_Occurred()) {
|
||||||
p->error_indicator = 1;
|
p->error_indicator = 1;
|
||||||
|
|
@ -23735,7 +23735,7 @@ invalid_dotted_as_name_rule(Parser *p)
|
||||||
}
|
}
|
||||||
p->mark = _mark;
|
p->mark = _mark;
|
||||||
D(fprintf(stderr, "%*c%s invalid_dotted_as_name[%d-%d]: %s failed!\n", p->level, ' ',
|
D(fprintf(stderr, "%*c%s invalid_dotted_as_name[%d-%d]: %s failed!\n", p->level, ' ',
|
||||||
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | NEWLINE)) expression"));
|
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression"));
|
||||||
}
|
}
|
||||||
_res = NULL;
|
_res = NULL;
|
||||||
done:
|
done:
|
||||||
|
|
@ -23743,7 +23743,7 @@ invalid_dotted_as_name_rule(Parser *p)
|
||||||
return _res;
|
return _res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// invalid_import_from_as_name: NAME 'as' !(NAME (',' | ')' | NEWLINE)) expression
|
// invalid_import_from_as_name: NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression
|
||||||
static void *
|
static void *
|
||||||
invalid_import_from_as_name_rule(Parser *p)
|
invalid_import_from_as_name_rule(Parser *p)
|
||||||
{
|
{
|
||||||
|
|
@ -23756,12 +23756,12 @@ invalid_import_from_as_name_rule(Parser *p)
|
||||||
}
|
}
|
||||||
void * _res = NULL;
|
void * _res = NULL;
|
||||||
int _mark = p->mark;
|
int _mark = p->mark;
|
||||||
{ // NAME 'as' !(NAME (',' | ')' | NEWLINE)) expression
|
{ // NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression
|
||||||
if (p->error_indicator) {
|
if (p->error_indicator) {
|
||||||
p->level--;
|
p->level--;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
D(fprintf(stderr, "%*c> invalid_import_from_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | NEWLINE)) expression"));
|
D(fprintf(stderr, "%*c> invalid_import_from_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression"));
|
||||||
Token * _keyword;
|
Token * _keyword;
|
||||||
expr_ty a;
|
expr_ty a;
|
||||||
expr_ty name_var;
|
expr_ty name_var;
|
||||||
|
|
@ -23775,7 +23775,7 @@ invalid_import_from_as_name_rule(Parser *p)
|
||||||
(a = expression_rule(p)) // expression
|
(a = expression_rule(p)) // expression
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
D(fprintf(stderr, "%*c+ invalid_import_from_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | NEWLINE)) expression"));
|
D(fprintf(stderr, "%*c+ invalid_import_from_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression"));
|
||||||
_res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot use %s as import target" , _PyPegen_get_expr_name ( a ) );
|
_res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot use %s as import target" , _PyPegen_get_expr_name ( a ) );
|
||||||
if (_res == NULL && PyErr_Occurred()) {
|
if (_res == NULL && PyErr_Occurred()) {
|
||||||
p->error_indicator = 1;
|
p->error_indicator = 1;
|
||||||
|
|
@ -23786,7 +23786,7 @@ invalid_import_from_as_name_rule(Parser *p)
|
||||||
}
|
}
|
||||||
p->mark = _mark;
|
p->mark = _mark;
|
||||||
D(fprintf(stderr, "%*c%s invalid_import_from_as_name[%d-%d]: %s failed!\n", p->level, ' ',
|
D(fprintf(stderr, "%*c%s invalid_import_from_as_name[%d-%d]: %s failed!\n", p->level, ' ',
|
||||||
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | NEWLINE)) expression"));
|
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME 'as' !(NAME (',' | ')' | ';' | NEWLINE)) expression"));
|
||||||
}
|
}
|
||||||
_res = NULL;
|
_res = NULL;
|
||||||
done:
|
done:
|
||||||
|
|
@ -35834,7 +35834,7 @@ _gather_138_rule(Parser *p)
|
||||||
return _res;
|
return _res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// _tmp_139: NAME (',' | ')' | NEWLINE)
|
// _tmp_139: NAME (',' | ')' | ';' | NEWLINE)
|
||||||
static void *
|
static void *
|
||||||
_tmp_139_rule(Parser *p)
|
_tmp_139_rule(Parser *p)
|
||||||
{
|
{
|
||||||
|
|
@ -35847,27 +35847,27 @@ _tmp_139_rule(Parser *p)
|
||||||
}
|
}
|
||||||
void * _res = NULL;
|
void * _res = NULL;
|
||||||
int _mark = p->mark;
|
int _mark = p->mark;
|
||||||
{ // NAME (',' | ')' | NEWLINE)
|
{ // NAME (',' | ')' | ';' | NEWLINE)
|
||||||
if (p->error_indicator) {
|
if (p->error_indicator) {
|
||||||
p->level--;
|
p->level--;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | NEWLINE)"));
|
D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | ';' | NEWLINE)"));
|
||||||
void *_tmp_173_var;
|
void *_tmp_173_var;
|
||||||
expr_ty name_var;
|
expr_ty name_var;
|
||||||
if (
|
if (
|
||||||
(name_var = _PyPegen_name_token(p)) // NAME
|
(name_var = _PyPegen_name_token(p)) // NAME
|
||||||
&&
|
&&
|
||||||
(_tmp_173_var = _tmp_173_rule(p)) // ',' | ')' | NEWLINE
|
(_tmp_173_var = _tmp_173_rule(p)) // ',' | ')' | ';' | NEWLINE
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | NEWLINE)"));
|
D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME (',' | ')' | ';' | NEWLINE)"));
|
||||||
_res = _PyPegen_dummy_name(p, name_var, _tmp_173_var);
|
_res = _PyPegen_dummy_name(p, name_var, _tmp_173_var);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
p->mark = _mark;
|
p->mark = _mark;
|
||||||
D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ',
|
D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ',
|
||||||
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME (',' | ')' | NEWLINE)"));
|
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME (',' | ')' | ';' | NEWLINE)"));
|
||||||
}
|
}
|
||||||
_res = NULL;
|
_res = NULL;
|
||||||
done:
|
done:
|
||||||
|
|
@ -37788,7 +37788,7 @@ _loop0_172_rule(Parser *p)
|
||||||
return _seq;
|
return _seq;
|
||||||
}
|
}
|
||||||
|
|
||||||
// _tmp_173: ',' | ')' | NEWLINE
|
// _tmp_173: ',' | ')' | ';' | NEWLINE
|
||||||
static void *
|
static void *
|
||||||
_tmp_173_rule(Parser *p)
|
_tmp_173_rule(Parser *p)
|
||||||
{
|
{
|
||||||
|
|
@ -37839,6 +37839,25 @@ _tmp_173_rule(Parser *p)
|
||||||
D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ',
|
D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ',
|
||||||
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'"));
|
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'"));
|
||||||
}
|
}
|
||||||
|
{ // ';'
|
||||||
|
if (p->error_indicator) {
|
||||||
|
p->level--;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'"));
|
||||||
|
Token * _literal;
|
||||||
|
if (
|
||||||
|
(_literal = _PyPegen_expect_token(p, 13)) // token=';'
|
||||||
|
)
|
||||||
|
{
|
||||||
|
D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'"));
|
||||||
|
_res = _literal;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
p->mark = _mark;
|
||||||
|
D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ',
|
||||||
|
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'"));
|
||||||
|
}
|
||||||
{ // NEWLINE
|
{ // NEWLINE
|
||||||
if (p->error_indicator) {
|
if (p->error_indicator) {
|
||||||
p->level--;
|
p->level--;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue