diff options
author | Lysandros Nikolaou <lisandrosnik@gmail.com> | 2020-05-18 19:14:47 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-18 19:14:47 (GMT) |
commit | 75b863aa97016c6813709eb620c43295f84dd51f (patch) | |
tree | 42e29d58a8f325cbbd43bb910837ae1cb8ca0666 /Parser | |
parent | d71a6492dbd5434dfa6a0ad95e3ad98aa690887a (diff) | |
download | cpython-75b863aa97016c6813709eb620c43295f84dd51f.zip cpython-75b863aa97016c6813709eb620c43295f84dd51f.tar.gz cpython-75b863aa97016c6813709eb620c43295f84dd51f.tar.bz2 |
bpo-40334: Reproduce error message for type comments on bare '*' in the new parser (GH-20151)
Diffstat (limited to 'Parser')
-rw-r--r-- | Parser/pegen/parse.c | 23 | ||||
-rw-r--r-- | Parser/pegen/pegen.c | 40 | ||||
-rw-r--r-- | Parser/pegen/pegen.h | 4 |
3 files changed, 44 insertions, 23 deletions
diff --git a/Parser/pegen/parse.c b/Parser/pegen/parse.c index e9c2032..fe95d27 100644 --- a/Parser/pegen/parse.c +++ b/Parser/pegen/parse.c @@ -12041,7 +12041,7 @@ invalid_parameters_rule(Parser *p) return _res; } -// invalid_star_etc: '*' (')' | ',' (')' | '**')) +// invalid_star_etc: '*' (')' | ',' (')' | '**')) | '*' ',' TYPE_COMMENT static void * invalid_star_etc_rule(Parser *p) { @@ -12071,6 +12071,27 @@ invalid_star_etc_rule(Parser *p) } p->mark = _mark; } + { // '*' ',' TYPE_COMMENT + Token * _literal; + Token * _literal_1; + Token * type_comment_var; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + && + (type_comment_var = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + ) + { + _res = RAISE_SYNTAX_ERROR ( "bare * has associated type comment" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + return NULL; + } + goto done; + } + p->mark = _mark; + } _res = NULL; done: return _res; diff --git a/Parser/pegen/pegen.c b/Parser/pegen/pegen.c index 7f3e456..ca4ea82 100644 --- a/Parser/pegen/pegen.c +++ b/Parser/pegen/pegen.c @@ -431,25 +431,6 @@ error: return NULL; } -void *_PyPegen_arguments_parsing_error(Parser *p, expr_ty e) { - int kwarg_unpacking = 0; - for (Py_ssize_t i = 0, l = asdl_seq_LEN(e->v.Call.keywords); i < l; i++) { - keyword_ty keyword = asdl_seq_GET(e->v.Call.keywords, i); - if (!keyword->arg) { - kwarg_unpacking = 1; - } - } - - const char *msg = NULL; - if (kwarg_unpacking) { - msg = "positional argument follows keyword argument unpacking"; - } else { - msg = "positional argument follows keyword argument"; - } - - return RAISE_SYNTAX_ERROR(msg); -} - #if 0 static const char * token_name(int type) @@ -2099,4 +2080,23 @@ _PyPegen_get_invalid_target(expr_ty e) default: return e; } -}
\ No newline at end of file +} + +void *_PyPegen_arguments_parsing_error(Parser *p, expr_ty e) { + int kwarg_unpacking = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(e->v.Call.keywords); i < l; i++) { + keyword_ty keyword = asdl_seq_GET(e->v.Call.keywords, i); + if (!keyword->arg) { + kwarg_unpacking = 1; + } + } + + const char *msg = NULL; + if (kwarg_unpacking) { + msg = "positional argument follows keyword argument unpacking"; + } else { + msg = "positional argument follows keyword argument"; + } + + return RAISE_SYNTAX_ERROR(msg); +} diff --git a/Parser/pegen/pegen.h b/Parser/pegen/pegen.h index b9d4c04..146804a 100644 --- a/Parser/pegen/pegen.h +++ b/Parser/pegen/pegen.h @@ -256,13 +256,13 @@ asdl_seq *_PyPegen_seq_extract_starred_exprs(Parser *, asdl_seq *); asdl_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *); expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *); asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *); -void *_PyPegen_arguments_parsing_error(Parser *, expr_ty); int _PyPegen_check_barry_as_flufl(Parser *); mod_ty _PyPegen_make_module(Parser *, asdl_seq *); // Error reporting helpers - expr_ty _PyPegen_get_invalid_target(expr_ty e); +void *_PyPegen_arguments_parsing_error(Parser *, expr_ty); + void *_PyPegen_parse(Parser *); |