Skip to content

Commit

Permalink
gh-126139: Improve error message location for future statement with u…
Browse files Browse the repository at this point in the history
…nknown feature (#126140)
  • Loading branch information
brianschubert authored Oct 29, 2024
1 parent 9dfef4e commit 224c370
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 8 deletions.
4 changes: 2 additions & 2 deletions Lib/test/test_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,8 +319,8 @@ def baz():
check('def f():\n global x\n nonlocal x', 2, 3)

# Errors thrown by future.c
check('from __future__ import doesnt_exist', 1, 1)
check('from __future__ import braces', 1, 1)
check('from __future__ import doesnt_exist', 1, 24)
check('from __future__ import braces', 1, 24)
check('x=1\nfrom __future__ import division', 2, 1)
check('foo(1=2)', 1, 5)
check('def f():\n x, y: int', 2, 3)
Expand Down
8 changes: 4 additions & 4 deletions Lib/test/test_future_stmt/test_future.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ def test_unknown_future_flag(self):
"""
self.assertSyntaxError(
code, lineno=2,
message='future feature rested_snopes is not defined',
message='future feature rested_snopes is not defined', offset=24,
)

def test_future_import_not_on_top(self):
Expand Down Expand Up @@ -137,19 +137,19 @@ def test_future_import_star(self):
code = """
from __future__ import *
"""
self.assertSyntaxError(code, message='future feature * is not defined')
self.assertSyntaxError(code, message='future feature * is not defined', offset=24)

def test_future_import_braces(self):
code = """
from __future__ import braces
"""
# Congrats, you found an easter egg!
self.assertSyntaxError(code, message='not a chance')
self.assertSyntaxError(code, message='not a chance', offset=24)

code = """
from __future__ import nested_scopes, braces
"""
self.assertSyntaxError(code, message='not a chance')
self.assertSyntaxError(code, message='not a chance', offset=39)

def test_module_with_future_import_not_on_top(self):
with self.assertRaises(SyntaxError) as cm:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Provide better error location when attempting to use a :term:`future
statement <__future__>` with an unknown future feature.
12 changes: 10 additions & 2 deletions Python/future.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,20 @@ future_check_features(_PyFutureFeatures *ff, stmt_ty s, PyObject *filename)
} else if (strcmp(feature, "braces") == 0) {
PyErr_SetString(PyExc_SyntaxError,
"not a chance");
PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1);
PyErr_RangedSyntaxLocationObject(filename,
name->lineno,
name->col_offset + 1,
name->end_lineno,
name->end_col_offset + 1);
return 0;
} else {
PyErr_Format(PyExc_SyntaxError,
UNDEFINED_FUTURE_FEATURE, feature);
PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1);
PyErr_RangedSyntaxLocationObject(filename,
name->lineno,
name->col_offset + 1,
name->end_lineno,
name->end_col_offset + 1);
return 0;
}
}
Expand Down

0 comments on commit 224c370

Please sign in to comment.