From b20d49fcf515d85dfa53c05995ee197e5f08a10d Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Wed, 28 Feb 2024 16:43:05 +0000 Subject: [PATCH 1/2] gh-116034: fix location info on the error of a failed assertion --- Lib/test/test_traceback.py | 17 +++++++++++++++++ ...24-02-28-16-42-17.gh-issue-116034.-Uu9tf.rst | 1 + Python/compile.c | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2024-02-28-16-42-17.gh-issue-116034.-Uu9tf.rst diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 61eb0a7ef93d7f..d12b559cf076d6 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -666,6 +666,23 @@ def f_with_binary_operator(): result_lines = self.get_exception(f_with_binary_operator) self.assertEqual(result_lines, expected_error.splitlines()) + def test_caret_for_failed_assertion(self): + def f_assert(): + test = 3 + assert test == 1 and test == 2, "Bug found?" + + lineno_f = f_assert.__code__.co_firstlineno + expected_error = ( + 'Traceback (most recent call last):\n' + f' File "{__file__}", line {self.callable_line}, in get_exception\n' + ' callable()\n' + f' File "{__file__}", line {lineno_f+2}, in f_assert\n' + ' assert test == 1 and test == 2, "Bug found?"\n' + ' ^^^^^^^^^^^^^^^^^^^^^^^\n' + ) + result_lines = self.get_exception(f_assert) + self.assertEqual(result_lines, expected_error.splitlines()) + def test_traceback_specialization_with_syntax_error(self): bytecode = compile("1 / 0 / 1 / 2\n", TESTFN, "exec") diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-02-28-16-42-17.gh-issue-116034.-Uu9tf.rst b/Misc/NEWS.d/next/Core and Builtins/2024-02-28-16-42-17.gh-issue-116034.-Uu9tf.rst new file mode 100644 index 00000000000000..c711b63605d1a1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2024-02-28-16-42-17.gh-issue-116034.-Uu9tf.rst @@ -0,0 +1 @@ +Fix location of the error on a failed assertion. diff --git a/Python/compile.c b/Python/compile.c index ddd7b5c795b9ef..a871e9c417517f 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3883,7 +3883,7 @@ compiler_assert(struct compiler *c, stmt_ty s) VISIT(c, expr, s->v.Assert.msg); ADDOP_I(c, LOC(s), CALL, 0); } - ADDOP_I(c, LOC(s), RAISE_VARARGS, 1); + ADDOP_I(c, LOC(s->v.Assert.test), RAISE_VARARGS, 1); USE_LABEL(c, end); return SUCCESS; From 44c7aeb202bc4f3a33578750d31d7c14aff43146 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Wed, 28 Feb 2024 19:22:32 +0000 Subject: [PATCH 2/2] update test_multiline_assert --- Lib/test/test_compile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 815800f4e2f530..6ed7fe2b06597c 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -1412,7 +1412,7 @@ def test_multiline_assert(self): self.assertOpcodeSourcePositionIs(compiled_code, 'CALL', line=1, end_line=3, column=0, end_column=30, occurrence=1) self.assertOpcodeSourcePositionIs(compiled_code, 'RAISE_VARARGS', - line=1, end_line=3, column=0, end_column=30, occurrence=1) + line=1, end_line=3, column=8, end_column=16, occurrence=1) def test_multiline_generator_expression(self): snippet = textwrap.dedent("""\