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)
def test_badfuture3(self):
with self.assertRaises(SyntaxError) as cm:
from test.test_future_stmt import badsyntax_future3
- self.check_syntax_error(cm.exception, "badsyntax_future3", 3)
+ self.check_syntax_error(cm.exception, "badsyntax_future3", 3, 24)
def test_badfuture4(self):
with self.assertRaises(SyntaxError) as cm:
def test_badfuture8(self):
with self.assertRaises(SyntaxError) as cm:
from test.test_future_stmt import badsyntax_future8
- self.check_syntax_error(cm.exception, "badsyntax_future8", 3)
+ self.check_syntax_error(cm.exception, "badsyntax_future8", 3, 24)
def test_badfuture9(self):
with self.assertRaises(SyntaxError) as cm:
from test.test_future_stmt import badsyntax_future9
- self.check_syntax_error(cm.exception, "badsyntax_future9", 3)
+ self.check_syntax_error(cm.exception, "badsyntax_future9", 3, 39)
def test_badfuture10(self):
with self.assertRaises(SyntaxError) as cm:
--- /dev/null
+Provide better error location when attempting to use a :term:`future
+statement <__future__>` with an unknown future feature.
} 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;
}
}