[Python-checkins] bpo-40246: Revert reporting of invalid string prefixes (GH-19888)

Lysandros Nikolaou webhook-mailer at python.org
Mon May 4 07:32:41 EDT 2020


https://github.com/python/cpython/commit/846d8b28ab9bb6197ee81372820311c0abe509c0
commit: 846d8b28ab9bb6197ee81372820311c0abe509c0
branch: master
author: Lysandros Nikolaou <lisandrosnik at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020-05-04T12:32:18+01:00
summary:

bpo-40246: Revert reporting of invalid string prefixes (GH-19888)

Due to backwards compatibility concerns regarding keywords immediately followed by a string without whitespace between them (like in `bg="#d00" if clear else"#fca"`) will fail to parse,
commit 41d5b94af44e34ac05d4cd57460ed104ccf96628 has to be reverted.

files:
A Misc/NEWS.d/next/Core and Builtins/2020-05-03-23-28-11.bpo-40246.c1D7x8.rst
M Include/errcode.h
M Lib/test/test_fstring.py
M Parser/pegen/pegen.c
M Parser/tokenizer.c
M Python/pythonrun.c

diff --git a/Include/errcode.h b/Include/errcode.h
index 9af8d5c03d59b..b37cd261d5ec4 100644
--- a/Include/errcode.h
+++ b/Include/errcode.h
@@ -31,7 +31,6 @@ extern "C" {
 #define E_LINECONT      25      /* Unexpected characters after a line continuation */
 #define E_IDENTIFIER    26      /* Invalid characters in identifier */
 #define E_BADSINGLE     27      /* Ill-formed single statement input */
-#define E_BADPREFIX     28      /* Bad string prefixes */
 
 #ifdef __cplusplus
 }
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py
index fe465b7e1d43d..ac5aa9a76efe7 100644
--- a/Lib/test/test_fstring.py
+++ b/Lib/test/test_fstring.py
@@ -864,7 +864,7 @@ def test_invalid_string_prefixes(self):
                              "Bf''",
                              "BF''",]
         double_quote_cases = [case.replace("'", '"') for case in single_quote_cases]
-        self.assertAllRaise(SyntaxError, 'invalid string prefix',
+        self.assertAllRaise(SyntaxError, 'unexpected EOF while parsing',
                             single_quote_cases + double_quote_cases)
 
     def test_leading_trailing_spaces(self):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-03-23-28-11.bpo-40246.c1D7x8.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-03-23-28-11.bpo-40246.c1D7x8.rst
new file mode 100644
index 0000000000000..62cd632ffd070
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-05-03-23-28-11.bpo-40246.c1D7x8.rst	
@@ -0,0 +1 @@
+Reporting a specialised error message for invalid string prefixes, which was introduced in :issue:`40246`, is being reverted due to backwards compatibility concerns for strings that immediately follow a reserved keyword without whitespace between them. Constructs like `bg="#d00" if clear else"#fca"` were failing to parse, which is not an acceptable breakage on such short notice.
diff --git a/Parser/pegen/pegen.c b/Parser/pegen/pegen.c
index 391f9b91eab90..c311593af70f5 100644
--- a/Parser/pegen/pegen.c
+++ b/Parser/pegen/pegen.c
@@ -334,9 +334,6 @@ tokenizer_error(Parser *p)
         case E_IDENTIFIER:
             msg = "invalid character in identifier";
             break;
-        case E_BADPREFIX:
-            RAISE_SYNTAX_ERROR("invalid string prefix");
-            return -1;
         case E_EOFS:
             RAISE_SYNTAX_ERROR("EOF while scanning triple-quoted string literal");
             return -1;
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index 95dfc5388037d..0f2b6af5e50ad 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -1396,10 +1396,6 @@ tok_get(struct tok_state *tok, const char **p_start, const char **p_end)
         *p_start = tok->start;
         *p_end = tok->cur;
 
-        if (c == '"' || c == '\'') {
-            tok->done = E_BADPREFIX;
-            return ERRORTOKEN;
-        }
         /* async/await parsing block. */
         if (tok->cur - tok->start == 5 && tok->start[0] == 'a') {
             /* May be an 'async' or 'await' token.  For Python 3.7 or
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 79147e430a1ad..1b79a33c814da 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -1609,9 +1609,6 @@ err_input(perrdetail *err)
     case E_BADSINGLE:
         msg = "multiple statements found while compiling a single statement";
         break;
-    case E_BADPREFIX:
-        msg = "invalid string prefix";
-        break;
     default:
         fprintf(stderr, "error=%d\n", err->error);
         msg = "unknown parsing error";



More information about the Python-checkins mailing list