mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
[3.13] gh-131927: Prevent emitting compiler warnings twice (GH-131993) (GH-132463)
(cherry picked from commit 3d08c8ad20
)
This commit is contained in:
parent
ff66901d8a
commit
4ff5d88fb1
4 changed files with 48 additions and 2 deletions
|
@ -18,3 +18,9 @@ PyAPI_FUNC(int) PyErr_WarnExplicitFormat(
|
||||||
|
|
||||||
// DEPRECATED: Use PyErr_WarnEx() instead.
|
// DEPRECATED: Use PyErr_WarnEx() instead.
|
||||||
#define PyErr_Warn(category, msg) PyErr_WarnEx((category), (msg), 1)
|
#define PyErr_Warn(category, msg) PyErr_WarnEx((category), (msg), 1)
|
||||||
|
|
||||||
|
int _PyErr_WarnExplicitObjectWithContext(
|
||||||
|
PyObject *category,
|
||||||
|
PyObject *message,
|
||||||
|
PyObject *filename,
|
||||||
|
int lineno);
|
||||||
|
|
|
@ -1512,6 +1512,24 @@ class TestSpecifics(unittest.TestCase):
|
||||||
pass
|
pass
|
||||||
[[]]
|
[[]]
|
||||||
|
|
||||||
|
def test_compile_warnings(self):
|
||||||
|
# See gh-131927
|
||||||
|
# Compile warnings originating from the same file and
|
||||||
|
# line are now only emitted once.
|
||||||
|
with warnings.catch_warnings(record=True) as caught:
|
||||||
|
warnings.simplefilter("default")
|
||||||
|
compile('1 is 1', '<stdin>', 'eval')
|
||||||
|
compile('1 is 1', '<stdin>', 'eval')
|
||||||
|
|
||||||
|
self.assertEqual(len(caught), 1)
|
||||||
|
|
||||||
|
with warnings.catch_warnings(record=True) as caught:
|
||||||
|
warnings.simplefilter("always")
|
||||||
|
compile('1 is 1', '<stdin>', 'eval')
|
||||||
|
compile('1 is 1', '<stdin>', 'eval')
|
||||||
|
|
||||||
|
self.assertEqual(len(caught), 2)
|
||||||
|
|
||||||
@requires_debug_ranges()
|
@requires_debug_ranges()
|
||||||
class TestSourcePositions(unittest.TestCase):
|
class TestSourcePositions(unittest.TestCase):
|
||||||
# Ensure that compiled code snippets have correct line and column numbers
|
# Ensure that compiled code snippets have correct line and column numbers
|
||||||
|
|
|
@ -1317,6 +1317,28 @@ PyErr_WarnExplicitObject(PyObject *category, PyObject *message,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Like PyErr_WarnExplicitObject, but automatically sets up context */
|
||||||
|
int
|
||||||
|
_PyErr_WarnExplicitObjectWithContext(PyObject *category, PyObject *message,
|
||||||
|
PyObject *filename, int lineno)
|
||||||
|
{
|
||||||
|
PyObject *unused_filename, *module, *registry;
|
||||||
|
int unused_lineno;
|
||||||
|
int stack_level = 1;
|
||||||
|
|
||||||
|
if (!setup_context(stack_level, NULL, &unused_filename, &unused_lineno,
|
||||||
|
&module, ®istry)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rc = PyErr_WarnExplicitObject(category, message, filename, lineno,
|
||||||
|
module, registry);
|
||||||
|
Py_DECREF(unused_filename);
|
||||||
|
Py_DECREF(registry);
|
||||||
|
Py_DECREF(module);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
PyErr_WarnExplicit(PyObject *category, const char *text,
|
PyErr_WarnExplicit(PyObject *category, const char *text,
|
||||||
const char *filename_str, int lineno,
|
const char *filename_str, int lineno,
|
||||||
|
|
|
@ -6616,8 +6616,8 @@ compiler_warn(struct compiler *c, location loc,
|
||||||
if (msg == NULL) {
|
if (msg == NULL) {
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
|
if (_PyErr_WarnExplicitObjectWithContext(PyExc_SyntaxWarning, msg,
|
||||||
loc.lineno, NULL, NULL) < 0)
|
c->c_filename, loc.lineno) < 0)
|
||||||
{
|
{
|
||||||
if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
|
if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
|
||||||
/* Replace the SyntaxWarning exception with a SyntaxError
|
/* Replace the SyntaxWarning exception with a SyntaxError
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue