diff --git a/mypy/checkpattern.py b/mypy/checkpattern.py index 81904bc245e0..37ea1a4945b2 100644 --- a/mypy/checkpattern.py +++ b/mypy/checkpattern.py @@ -337,6 +337,8 @@ def visit_sequence_pattern(self, o: SequencePattern) -> PatternType: for p, t in zip(o.patterns, contracted_inner_types): pattern_type = self.accept(p, t) typ, rest, type_map = pattern_type + if is_uninhabited(typ) and not isinstance(p, StarredPattern): + return self.early_non_match() contracted_new_inner_types.append(typ) contracted_rest_inner_types.append(rest) self.update_type_map(captures, type_map) diff --git a/test-data/unit/check-python310.test b/test-data/unit/check-python310.test index 33b952f48f49..dc4d9fde1248 100644 --- a/test-data/unit/check-python310.test +++ b/test-data/unit/check-python310.test @@ -315,6 +315,18 @@ match m: reveal_type(m) # N: Revealed type is "tuple[Literal[1], Literal['str']]" [builtins fixtures/list.pyi] +[case testMatchSequencePatternTupleUnionStopsAfterUnmatchedItem] +# flags: --strict-equality --warn-unreachable +from typing import Literal + +m: tuple[Literal["a"], None] | tuple[Literal["b"], int] = ("a", None) +match m: + case "a", None: + pass + case _: + pass +[builtins fixtures/tuple.pyi] + [case testMatchSequencePatternTupleStarred] # flags: --strict-equality --warn-unreachable from typing import Tuple