From 9bcb4be2e301f3a14310506ee71a77e3bee9f76f Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Sun, 18 Oct 2026 01:49:31 +0100 Subject: [PATCH] Fix crash on invalid star lvalue --- mypy/semanal.py | 6 +++--- test-data/unit/check-incremental.test | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/mypy/semanal.py b/mypy/semanal.py index a816108f59f4..745a51e27c84 100644 --- a/mypy/semanal.py +++ b/mypy/semanal.py @@ -8499,16 +8499,16 @@ def names_modified_by_assignment(s: AssignmentStmt) -> list[NameExpr]: return result -def names_modified_in_lvalue(lvalue: Lvalue) -> list[NameExpr]: +def names_modified_in_lvalue(lvalue: Lvalue, include_star: bool = False) -> list[NameExpr]: """Return all NameExpr assignment targets in an Lvalue.""" if isinstance(lvalue, NameExpr): return [lvalue] - elif isinstance(lvalue, StarExpr): + elif isinstance(lvalue, StarExpr) and include_star: return names_modified_in_lvalue(lvalue.expr) elif isinstance(lvalue, (ListExpr, TupleExpr)): result: list[NameExpr] = [] for item in lvalue.items: - result += names_modified_in_lvalue(item) + result += names_modified_in_lvalue(item, include_star=True) return result return [] diff --git a/test-data/unit/check-incremental.test b/test-data/unit/check-incremental.test index 71ec6e973685..cf1369691f08 100644 --- a/test-data/unit/check-incremental.test +++ b/test-data/unit/check-incremental.test @@ -8293,3 +8293,15 @@ Jérôme = False [stale] [out] [out2] + +[case testInvalidUnpackTargetFromUndefinedNoCrash] +*a = b +a +[out] +main:1: error: Starred assignment target must be in a list or tuple +main:1: error: Name "b" is not defined +main:2: error: Name "a" is not defined +[out2] +main:1: error: Starred assignment target must be in a list or tuple +main:1: error: Name "b" is not defined +main:2: error: Name "a" is not defined