From c0baf62f713a5d1781862626bc0058bdef6765f6 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Fri, 16 Jan 2026 22:12:39 -0400 Subject: [PATCH 1/9] Ignore .worktrees directory (#6) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9c325f3e29f8..880418969bd2 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ include/ pyvenv.cfg .tox +.worktrees pip-wheel-metadata From b5dfda62f4e05eea475fe6b1a40b7da76ca9b96d Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Sat, 17 Jan 2026 00:28:47 -0400 Subject: [PATCH 2/9] chore: sync AGENTS rules to keep contributor guidance consistent (#8) --- .gitignore | 2 +- AGENTS.md | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 AGENTS.md diff --git a/.gitignore b/.gitignore index 880418969bd2..ed1e1ff7d572 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,6 @@ include/ pyvenv.cfg .tox -.worktrees pip-wheel-metadata @@ -61,3 +60,4 @@ test_capi test_capi /mypyc/lib-rt/build/ /mypyc/lib-rt/*.so +.worktrees/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000000..2855e173a207 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,17 @@ +# Agent Requirements + +All agents must follow these rules: + +1) Fully test your changes before submitting a PR (run the full suite or all relevant tests). +2) PR titles must be descriptive and follow Conventional Commits-style prefixes: + - Common: `feat:`, `fix:`, `chore:`, `refactor:`, `docs:`, `test:`, `perf:` + - Support titles: `fix(docs):`, `fix(benchmarks):`, `fix(cicd):` +3) Commit messages must follow the same Conventional Commits-style prefixes and include a short functional description plus a user-facing value proposition. +4) PR descriptions must include Summary, Rationale, and Details sections. +5) Run relevant Python tests for changes (pytest/unittest or the repo's configured runner). +6) Follow formatting/linting configured in pyproject.toml, setup.cfg, tox.ini, or ruff.toml. +7) Update dependency lockfiles when adding or removing Python dependencies. +8) If the repo uses mypyc, verify tests run against compiled extensions (not interpreted Python) and note how you confirmed. +9) Keep base image tags pinned. + +Reference: https://www.conventionalcommits.org/en/v1.0.0/ From d239756fdd60d4e7c4ac949072c07287c27ed626 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Sun, 18 Jan 2026 14:02:52 -0400 Subject: [PATCH 3/9] Fix final load in unreachable branches --- mypyc/irbuild/expression.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/mypyc/irbuild/expression.py b/mypyc/irbuild/expression.py index d0e91125e80f..157907b87ddd 100644 --- a/mypyc/irbuild/expression.py +++ b/mypyc/irbuild/expression.py @@ -49,7 +49,7 @@ UnaryExpr, Var, ) -from mypy.types import Instance, ProperType, TupleType, TypeType, get_proper_type +from mypy.types import AnyType, Instance, ProperType, TupleType, TypeOfAny, TypeType, get_proper_type from mypyc.common import MAX_SHORT_INT from mypyc.ir.class_ir import ClassIR from mypyc.ir.func_ir import FUNC_CLASSMETHOD, FUNC_STATICMETHOD @@ -147,12 +147,15 @@ def transform_name_expr(builder: IRBuilder, expr: NameExpr) -> Value: return math_literal if isinstance(expr.node, Var) and expr.node.is_final: + typ = builder.types.get(expr) or expr.node.type + if typ is None: + typ = AnyType(TypeOfAny.special_form) value = builder.emit_load_final( expr.node, fullname, expr.name, builder.is_native_ref_expr(expr), - builder.types[expr], + typ, expr.line, ) if value is not None: @@ -208,8 +211,11 @@ def transform_member_expr(builder: IRBuilder, expr: MemberExpr) -> Value: final = builder.get_final_ref(expr) if final is not None: fullname, final_var, native = final + typ = builder.types.get(expr) or final_var.type + if typ is None: + typ = AnyType(TypeOfAny.special_form) value = builder.emit_load_final( - final_var, fullname, final_var.name, native, builder.types[expr], expr.line + final_var, fullname, final_var.name, native, typ, expr.line ) if value is not None: return value From 3b23303c835722bf976a71fd96fcc26ba48d9fa3 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Sun, 18 Jan 2026 14:03:09 -0400 Subject: [PATCH 4/9] Add unreachable Final regression case --- mypyc/test-data/irbuild-unreachable.test | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/mypyc/test-data/irbuild-unreachable.test b/mypyc/test-data/irbuild-unreachable.test index 8eafede66b56..f8ef773a53b6 100644 --- a/mypyc/test-data/irbuild-unreachable.test +++ b/mypyc/test-data/irbuild-unreachable.test @@ -68,6 +68,34 @@ L3: y = r6 return 1 +[case testUnreachableFinalNameExpr] +from typing import Final + +ZERO: Final = 0 + +def f(x: int) -> int: + if x is None: + return ZERO + return ZERO +[out] +def f(x): + x :: int + r0, r1 :: object + r2 :: bit + r3 :: object + r4 :: int +L0: + r0 = load_address _Py_NoneStruct + r1 = box(int, x) + r2 = r1 == r0 + if r2 goto L1 else goto L2 :: bool +L1: + r3 = object 0 + r4 = unbox(int, r3) + return r4 +L2: + return 0 + [case testUnreachableStatementAfterReturn] def f(x: bool) -> int: if x: From ee700a32d5b4a4636007f6fe31ad06c6e8bc05db Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 18 Jan 2026 18:11:13 +0000 Subject: [PATCH 5/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypyc/irbuild/expression.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/mypyc/irbuild/expression.py b/mypyc/irbuild/expression.py index 157907b87ddd..ace2190b6ce5 100644 --- a/mypyc/irbuild/expression.py +++ b/mypyc/irbuild/expression.py @@ -49,7 +49,15 @@ UnaryExpr, Var, ) -from mypy.types import AnyType, Instance, ProperType, TupleType, TypeOfAny, TypeType, get_proper_type +from mypy.types import ( + AnyType, + Instance, + ProperType, + TupleType, + TypeOfAny, + TypeType, + get_proper_type, +) from mypyc.common import MAX_SHORT_INT from mypyc.ir.class_ir import ClassIR from mypyc.ir.func_ir import FUNC_CLASSMETHOD, FUNC_STATICMETHOD @@ -151,12 +159,7 @@ def transform_name_expr(builder: IRBuilder, expr: NameExpr) -> Value: if typ is None: typ = AnyType(TypeOfAny.special_form) value = builder.emit_load_final( - expr.node, - fullname, - expr.name, - builder.is_native_ref_expr(expr), - typ, - expr.line, + expr.node, fullname, expr.name, builder.is_native_ref_expr(expr), typ, expr.line ) if value is not None: return value From 58200631c400a75629a8cb04788b21aa63a0ca27 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Sun, 18 Jan 2026 14:13:36 -0400 Subject: [PATCH 6/9] Revert .gitignore to upstream --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index ed1e1ff7d572..9c325f3e29f8 100644 --- a/.gitignore +++ b/.gitignore @@ -60,4 +60,3 @@ test_capi test_capi /mypyc/lib-rt/build/ /mypyc/lib-rt/*.so -.worktrees/ From f0ddb6238418d6c537d81636259669abe3be529c Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Sun, 18 Jan 2026 14:13:45 -0400 Subject: [PATCH 7/9] Remove unintended AGENTS.md --- AGENTS.md | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index 2855e173a207..000000000000 --- a/AGENTS.md +++ /dev/null @@ -1,17 +0,0 @@ -# Agent Requirements - -All agents must follow these rules: - -1) Fully test your changes before submitting a PR (run the full suite or all relevant tests). -2) PR titles must be descriptive and follow Conventional Commits-style prefixes: - - Common: `feat:`, `fix:`, `chore:`, `refactor:`, `docs:`, `test:`, `perf:` - - Support titles: `fix(docs):`, `fix(benchmarks):`, `fix(cicd):` -3) Commit messages must follow the same Conventional Commits-style prefixes and include a short functional description plus a user-facing value proposition. -4) PR descriptions must include Summary, Rationale, and Details sections. -5) Run relevant Python tests for changes (pytest/unittest or the repo's configured runner). -6) Follow formatting/linting configured in pyproject.toml, setup.cfg, tox.ini, or ruff.toml. -7) Update dependency lockfiles when adding or removing Python dependencies. -8) If the repo uses mypyc, verify tests run against compiled extensions (not interpreted Python) and note how you confirmed. -9) Keep base image tags pinned. - -Reference: https://www.conventionalcommits.org/en/v1.0.0/ From c5d6a6afc531b860dc3352c8aa8870701385e780 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Sun, 18 Jan 2026 14:20:37 -0400 Subject: [PATCH 8/9] Fix Final load type naming --- mypyc/irbuild/expression.py | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/mypyc/irbuild/expression.py b/mypyc/irbuild/expression.py index ace2190b6ce5..9a79d4e13a27 100644 --- a/mypyc/irbuild/expression.py +++ b/mypyc/irbuild/expression.py @@ -49,15 +49,7 @@ UnaryExpr, Var, ) -from mypy.types import ( - AnyType, - Instance, - ProperType, - TupleType, - TypeOfAny, - TypeType, - get_proper_type, -) +from mypy.types import AnyType, Instance, ProperType, TupleType, TypeOfAny, TypeType, get_proper_type from mypyc.common import MAX_SHORT_INT from mypyc.ir.class_ir import ClassIR from mypyc.ir.func_ir import FUNC_CLASSMETHOD, FUNC_STATICMETHOD @@ -155,11 +147,16 @@ def transform_name_expr(builder: IRBuilder, expr: NameExpr) -> Value: return math_literal if isinstance(expr.node, Var) and expr.node.is_final: - typ = builder.types.get(expr) or expr.node.type - if typ is None: - typ = AnyType(TypeOfAny.special_form) + final_type = builder.types.get(expr) or expr.node.type + if final_type is None: + final_type = AnyType(TypeOfAny.special_form) value = builder.emit_load_final( - expr.node, fullname, expr.name, builder.is_native_ref_expr(expr), typ, expr.line + expr.node, + fullname, + expr.name, + builder.is_native_ref_expr(expr), + final_type, + expr.line, ) if value is not None: return value @@ -214,11 +211,11 @@ def transform_member_expr(builder: IRBuilder, expr: MemberExpr) -> Value: final = builder.get_final_ref(expr) if final is not None: fullname, final_var, native = final - typ = builder.types.get(expr) or final_var.type - if typ is None: - typ = AnyType(TypeOfAny.special_form) + final_type = builder.types.get(expr) or final_var.type + if final_type is None: + final_type = AnyType(TypeOfAny.special_form) value = builder.emit_load_final( - final_var, fullname, final_var.name, native, typ, expr.line + final_var, fullname, final_var.name, native, final_type, expr.line ) if value is not None: return value From b85022c005cd26bb3ea43942d3cf1fc005535d59 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 18 Jan 2026 18:22:08 +0000 Subject: [PATCH 9/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypyc/irbuild/expression.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/mypyc/irbuild/expression.py b/mypyc/irbuild/expression.py index 9a79d4e13a27..c19248622f1d 100644 --- a/mypyc/irbuild/expression.py +++ b/mypyc/irbuild/expression.py @@ -49,7 +49,15 @@ UnaryExpr, Var, ) -from mypy.types import AnyType, Instance, ProperType, TupleType, TypeOfAny, TypeType, get_proper_type +from mypy.types import ( + AnyType, + Instance, + ProperType, + TupleType, + TypeOfAny, + TypeType, + get_proper_type, +) from mypyc.common import MAX_SHORT_INT from mypyc.ir.class_ir import ClassIR from mypyc.ir.func_ir import FUNC_CLASSMETHOD, FUNC_STATICMETHOD @@ -151,12 +159,7 @@ def transform_name_expr(builder: IRBuilder, expr: NameExpr) -> Value: if final_type is None: final_type = AnyType(TypeOfAny.special_form) value = builder.emit_load_final( - expr.node, - fullname, - expr.name, - builder.is_native_ref_expr(expr), - final_type, - expr.line, + expr.node, fullname, expr.name, builder.is_native_ref_expr(expr), final_type, expr.line ) if value is not None: return value