diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index aa08c97c3ada8a..591d5bb00b264e 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -786,6 +786,14 @@ def or_false(x): self.assertIn('LOAD_', opcodes[0].opname) self.assertEqual('RETURN_VALUE', opcodes[1].opname) + def test_lineno_procedure_call(self): + def call(): + ( + print() + ) + line1 = call.__code__.co_firstlineno + 1 + assert line1 not in [line for (_, _, line) in call.__code__.co_lines()] + def test_lineno_after_implicit_return(self): TRUE = True # Don't use constant True or False, as compiler will remove test diff --git a/Python/compile.c b/Python/compile.c index 942614fdab8502..ea1bf6bf923afd 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3397,6 +3397,8 @@ compiler_visit_stmt_expr(struct compiler *c, expr_ty value) } VISIT(c, expr, value); + /* Mark POP_TOP as artificial */ + c->u->u_lineno = -1; ADDOP(c, POP_TOP); return 1; }