summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_fstring.py13
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst1
-rw-r--r--Parser/pegen/parse_string.c7
3 files changed, 16 insertions, 5 deletions
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py
index e0bb5b5..ea4e589 100644
--- a/Lib/test/test_fstring.py
+++ b/Lib/test/test_fstring.py
@@ -8,9 +8,12 @@
# Unicode identifiers in tests is allowed by PEP 3131.
import ast
+import os
import types
import decimal
import unittest
+from test.support import temp_cwd, use_old_parser
+from test.support.script_helper import assert_python_failure
a_global = 'global variable'
@@ -1044,6 +1047,16 @@ non-important content
r"f'{1000:j}'",
])
+ @unittest.skipIf(use_old_parser(), "The old parser only supports <fstring> as the filename")
+ def test_filename_in_syntaxerror(self):
+ # see issue 38964
+ with temp_cwd() as cwd:
+ file_path = os.path.join(cwd, 't.py')
+ with open(file_path, 'w') as f:
+ f.write('f"{a b}"') # This generates a SyntaxError
+ _, _, stderr = assert_python_failure(file_path)
+ self.assertIn(file_path, stderr.decode('utf-8'))
+
def test_loop(self):
for i in range(1000):
self.assertEqual(f'i:{i}', 'i:' + str(i))
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst
new file mode 100644
index 0000000..1200764
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-05-25-21-49-11.bpo-38964.lrml90.rst
@@ -0,0 +1 @@
+When there's a :exc:`SyntaxError` in the expression part of an fstring, the filename attribute of the :exc:`SyntaxError` gets correctly set to the name of the file the fstring resides in. \ No newline at end of file
diff --git a/Parser/pegen/parse_string.c b/Parser/pegen/parse_string.c
index ca4b733..a0ec698 100644
--- a/Parser/pegen/parse_string.c
+++ b/Parser/pegen/parse_string.c
@@ -606,11 +606,8 @@ fstring_compile_expr(Parser *p, const char *expr_start, const char *expr_end,
if (tok == NULL) {
return NULL;
}
- tok->filename = PyUnicode_FromString("<fstring>");
- if (!tok->filename) {
- PyTokenizer_Free(tok);
- return NULL;
- }
+ Py_INCREF(p->tok->filename);
+ tok->filename = p->tok->filename;
Parser *p2 = _PyPegen_Parser_New(tok, Py_fstring_input, p->flags, p->feature_version,
NULL, p->arena);