https://github.com/python/cpython/commit/12092af02eaac070723ad957bd83f4d3acf982eb commit: 12092af02eaac070723ad957bd83f4d3acf982eb branch: 3.14 author: Miss Islington (bot) <[email protected]> committer: gpshead <[email protected]> date: 2026-02-24T21:13:08Z summary:
[3.14] gh-145187: Fix crash on invalid type parameter bound expression in conditional block (GH-145188) (#145196) gh-145187: Fix crash on invalid type parameter bound expression in conditional block (GH-145188) Fix parsing crash found by oss-fuzz (cherry picked from commit 5e61a16c1058e5de66b71dfdc9720d40e9f515d9) Co-authored-by: Stan Ulbrych <[email protected]> files: A Misc/NEWS.d/next/Core_and_Builtins/2026-02-24-18-30-56.gh-issue-145187.YjPu1Z.rst M Lib/test/test_type_params.py M Python/codegen.c diff --git a/Lib/test/test_type_params.py b/Lib/test/test_type_params.py index 0f393def827271..84c1b954136736 100644 --- a/Lib/test/test_type_params.py +++ b/Lib/test/test_type_params.py @@ -152,6 +152,13 @@ def test_incorrect_mro_explicit_object(self): with self.assertRaisesRegex(TypeError, r"\(MRO\) for bases object, Generic"): class My[X](object): ... + def test_compile_error_in_type_param_bound(self): + # This should not crash, see gh-145187 + check_syntax_error( + self, + "if True:\n class h[l:{7for*()in 0}]:2" + ) + class TypeParamsNonlocalTest(unittest.TestCase): def test_nonlocal_disallowed_01(self): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-24-18-30-56.gh-issue-145187.YjPu1Z.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-24-18-30-56.gh-issue-145187.YjPu1Z.rst new file mode 100644 index 00000000000000..08c6b44164ebc3 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-24-18-30-56.gh-issue-145187.YjPu1Z.rst @@ -0,0 +1,2 @@ +Fix compiler assertion fail when a type parameter bound contains an invalid +expression in a conditional block. diff --git a/Python/codegen.c b/Python/codegen.c index bacd3460f2fa9c..085ebc391a165f 100644 --- a/Python/codegen.c +++ b/Python/codegen.c @@ -1200,11 +1200,11 @@ codegen_type_param_bound_or_default(compiler *c, expr_ty e, ADDOP_LOAD_CONST_NEW(c, LOC(e), defaults); RETURN_IF_ERROR(codegen_setup_annotations_scope(c, LOC(e), key, name)); if (allow_starred && e->kind == Starred_kind) { - VISIT(c, expr, e->v.Starred.value); - ADDOP_I(c, LOC(e), UNPACK_SEQUENCE, (Py_ssize_t)1); + VISIT_IN_SCOPE(c, expr, e->v.Starred.value); + ADDOP_I_IN_SCOPE(c, LOC(e), UNPACK_SEQUENCE, (Py_ssize_t)1); } else { - VISIT(c, expr, e); + VISIT_IN_SCOPE(c, expr, e); } ADDOP_IN_SCOPE(c, LOC(e), RETURN_VALUE); PyCodeObject *co = _PyCompile_OptimizeAndAssemble(c, 1); _______________________________________________ Python-checkins mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3//lists/python-checkins.python.org Member address: [email protected]
