summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2021-05-06 12:38:50 (GMT)
committerGitHub <noreply@github.com>2021-05-06 12:38:50 (GMT)
commit8d4b18429de504445a1338077e495090d91044b4 (patch)
tree10ce565ceed11df95a29bbfa4299e187d2e07f61
parent60ba0b68470a584103e28958d91e93a6db37ec92 (diff)
downloadcpython-8d4b18429de504445a1338077e495090d91044b4.zip
cpython-8d4b18429de504445a1338077e495090d91044b4.tar.gz
cpython-8d4b18429de504445a1338077e495090d91044b4.tar.bz2
Correct location for syntax error in try-except (GH-25939)
-rw-r--r--Lib/test/test_exceptions.py2
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2021-05-06-12-43-04.bpo-44056.4LWcJW.rst2
-rw-r--r--Python/compile.c2
3 files changed, 4 insertions, 2 deletions
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index 3c427fe..1fe479f 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -218,7 +218,7 @@ class ExceptionTests(unittest.TestCase):
check('class foo:return 1', 1, 11)
check('def f():\n continue', 2, 3)
check('def f():\n break', 2, 3)
- check('try:\n pass\nexcept:\n pass\nexcept ValueError:\n pass', 2, 3)
+ check('try:\n pass\nexcept:\n pass\nexcept ValueError:\n pass', 3, 1)
# Errors thrown by tokenizer.c
check('(0x+1)', 1, 3)
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-06-12-43-04.bpo-44056.4LWcJW.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-06-12-43-04.bpo-44056.4LWcJW.rst
new file mode 100644
index 0000000..24a6581
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-05-06-12-43-04.bpo-44056.4LWcJW.rst
@@ -0,0 +1,2 @@
+Syntax errors when default ``except`` is not the last ``except`` are
+reported with the correct location. Patch by Mark Shannon.
diff --git a/Python/compile.c b/Python/compile.c
index 4fc8b38..d6bcca1 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -3165,9 +3165,9 @@ compiler_try_except(struct compiler *c, stmt_ty s)
for (i = 0; i < n; i++) {
excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
s->v.Try.handlers, i);
+ SET_LOC(c, handler);
if (!handler->v.ExceptHandler.type && i < n-1)
return compiler_error(c, "default 'except:' must be last");
- SET_LOC(c, handler);
except = compiler_new_block(c);
if (except == NULL)
return 0;