diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2022-02-16 11:18:16 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-16 11:18:16 (GMT) |
commit | a657bff34945e40be24cd75d02560a93b7623cf5 (patch) | |
tree | b2e076d63d447c3a735844a692ea645105d15186 | |
parent | c292118ef3528df85a9d76ad21029009b560b088 (diff) | |
download | cpython-a657bff34945e40be24cd75d02560a93b7623cf5.zip cpython-a657bff34945e40be24cd75d02560a93b7623cf5.tar.gz cpython-a657bff34945e40be24cd75d02560a93b7623cf5.tar.bz2 |
bpo-46762: Fix an assert failure in f-strings where > or < is the last character if the f-string is missing a trailing right brace. (GH-31365)
(cherry picked from commit ffd9f8ff84ed53c956b16d027f7d2926ea631051)
Co-authored-by: Eric V. Smith <ericvsmith@users.noreply.github.com>
-rw-r--r-- | Lib/test/test_fstring.py | 2 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2022-02-15-20-26-46.bpo-46762.1H7vab.rst | 2 | ||||
-rw-r--r-- | Parser/pegen/parse_string.c | 20 |
3 files changed, 14 insertions, 10 deletions
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 92a4d22..b62887f 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1060,6 +1060,8 @@ x = ( "f'{{{'", "f'{{}}{'", "f'{'", + "f'x{<'", # See bpo-46762. + "f'x{>'", ]) # But these are just normal strings. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-15-20-26-46.bpo-46762.1H7vab.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-15-20-26-46.bpo-46762.1H7vab.rst new file mode 100644 index 0000000..cd53eb4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-02-15-20-26-46.bpo-46762.1H7vab.rst @@ -0,0 +1,2 @@ +Fix an assert failure in debug builds when a '<', '>', or '=' is the last +character in an f-string that's missing a closing right brace. diff --git a/Parser/pegen/parse_string.c b/Parser/pegen/parse_string.c index af350b3..15a132b 100644 --- a/Parser/pegen/parse_string.c +++ b/Parser/pegen/parse_string.c @@ -668,12 +668,12 @@ fstring_find_expr(Parser *p, const char **str, const char *end, int raw, int rec *str += 1; continue; } - /* Don't get out of the loop for these, if they're single - chars (not part of 2-char tokens). If by themselves, they - don't end an expression (unlike say '!'). */ - if (ch == '>' || ch == '<') { - continue; - } + } + /* Don't get out of the loop for these, if they're single + chars (not part of 2-char tokens). If by themselves, they + don't end an expression (unlike say '!'). */ + if (ch == '>' || ch == '<') { + continue; } /* Normal way out of this loop. */ @@ -700,10 +700,10 @@ fstring_find_expr(Parser *p, const char **str, const char *end, int raw, int rec } } expr_end = *str; - /* If we leave this loop in a string or with mismatched parens, we - don't care. We'll get a syntax error when compiling the - expression. But, we can produce a better error message, so - let's just do that.*/ + /* If we leave the above loop in a string or with mismatched parens, we + don't really care. We'll get a syntax error when compiling the + expression. But, we can produce a better error message, so let's just + do that.*/ if (quote_char) { RAISE_SYNTAX_ERROR("f-string: unterminated string"); goto error; |