[[]]
def test_compile_warnings(self):
- # See gh-131927
- # Compile warnings originating from the same file and
- # line are now only emitted once.
+ # Each invocation of compile() emits compiler warnings, even if they
+ # have the same message and line number.
+ source = textwrap.dedent(r"""
+ # tokenizer
+ 1or 0 # line 3
+ # code generator
+ 1 is 1 # line 5
+ """)
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)
+ for i in range(2):
+ # Even if compile() is at the same line.
+ compile(source, '<stdin>', 'exec')
- 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)
+ self.assertEqual([wm.lineno for wm in caught], [3, 5] * 2)
def test_compile_warning_in_finally(self):
# Ensure that warnings inside finally blocks are
try:
pass
finally:
- 1 is 1
+ 1 is 1 # line 5
+ try:
+ pass
+ finally: # nested
+ 1 is 1 # line 9
""")
with warnings.catch_warnings(record=True) as caught:
- warnings.simplefilter("default")
+ warnings.simplefilter("always")
compile(source, '<stdin>', 'exec')
- self.assertEqual(len(caught), 1)
- self.assertEqual(caught[0].category, SyntaxWarning)
- self.assertIn("\"is\" with 'int' literal", str(caught[0].message))
+ self.assertEqual(sorted(wm.lineno for wm in caught), [5, 9])
+ for wm in caught:
+ self.assertEqual(wm.category, SyntaxWarning)
+ self.assertIn("\"is\" with 'int' literal", str(wm.message))
+
+ # Other code path is used for "try" with "except*".
+ source = textwrap.dedent("""
+ try:
+ pass
+ except *Exception:
+ pass
+ finally:
+ 1 is 1 # line 7
+ try:
+ pass
+ except *Exception:
+ pass
+ finally: # nested
+ 1 is 1 # line 13
+ """)
+
+ with warnings.catch_warnings(record=True) as caught:
+ warnings.simplefilter("always")
+ compile(source, '<stdin>', 'exec')
+
+ self.assertEqual(sorted(wm.lineno for wm in caught), [7, 13])
+ for wm in caught:
+ self.assertEqual(wm.category, SyntaxWarning)
+ self.assertIn("\"is\" with 'int' literal", str(wm.message))
+
@requires_debug_ranges()
class TestSourcePositions(unittest.TestCase):
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
PyErr_WarnExplicit(PyObject *category, const char *text,
const char *filename_str, int lineno,
bool c_save_nested_seqs; /* if true, construct recursive instruction sequences
* (including instructions for nested code objects)
*/
+ int c_disable_warning;
};
#define INSTR_SEQUENCE(C) ((C)->u->u_instr_sequence)
f->fb_loc = loc;
f->fb_exit = exit;
f->fb_datum = datum;
+ if (t == FINALLY_END) {
+ c->c_disable_warning++;
+ }
return SUCCESS;
}
u->u_nfblocks--;
assert(u->u_fblock[u->u_nfblocks].fb_type == t);
assert(SAME_LABEL(u->u_fblock[u->u_nfblocks].fb_block, block_label));
+ if (t == FINALLY_END) {
+ c->c_disable_warning--;
+ }
}
static int
compiler_warn(struct compiler *c, location loc,
const char *format, ...)
{
+ if (c->c_disable_warning) {
+ return SUCCESS;
+ }
va_list vargs;
va_start(vargs, format);
PyObject *msg = PyUnicode_FromFormatV(format, vargs);
if (msg == NULL) {
return ERROR;
}
- if (_PyErr_WarnExplicitObjectWithContext(PyExc_SyntaxWarning, msg,
- c->c_filename, loc.lineno) < 0)
+ if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
+ c->c_filename, loc.lineno, NULL, NULL) < 0)
{
if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
/* Replace the SyntaxWarning exception with a SyntaxError