Use the new PyErr_WarnExplicit() API to issue better warnings for
global after assign / use.
Note: I'm not updating the PyErr_Warn() call for import * / exec
combined with a function, because I can't trigger it with an example.
Jeremy, just follow the example of the call to PyErr_WarnExplicit()
that I *did* include.
diff --git a/Python/compile.c b/Python/compile.c
index b445122..6b5fa11 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -4830,18 +4830,27 @@
st->st_cur->ste_lineno);
st->st_errors++;
return;
- } else if (flags & DEF_LOCAL) {
- sprintf(buf, GLOBAL_AFTER_ASSIGN, name);
- if (PyErr_Warn(PyExc_SyntaxWarning,
- buf) < 0) {
- /* XXX set line number? */
- st->st_errors++;
- }
- } else {
- sprintf(buf, GLOBAL_AFTER_USE, name);
- if (PyErr_Warn(PyExc_SyntaxWarning,
- buf) < 0) {
- /* XXX set line number? */
+ }
+ else {
+ if (flags & DEF_LOCAL)
+ sprintf(buf, GLOBAL_AFTER_ASSIGN,
+ name);
+ else
+ sprintf(buf, GLOBAL_AFTER_USE, name);
+ if (PyErr_WarnExplicit(PyExc_SyntaxWarning,
+ buf, st->st_filename,
+ st->st_cur->ste_lineno,
+ NULL, NULL) < 0)
+ {
+ if (PyErr_ExceptionMatches(
+ PyExc_SyntaxWarning))
+ {
+ PyErr_SetString(
+ PyExc_SyntaxError, buf);
+ PyErr_SyntaxLocation(
+ st->st_filename,
+ st->st_cur->ste_lineno);
+ }
st->st_errors++;
}
}