d1: dict[str, tuple[str, ...]] = {}
d2: dict[str, str] = {}
match (d1, d2):
case ({"Symbol": (sym,)}, _) | (_, {"Symbol": sym}):
reveal_type(sym)
mypy/mypy/checkpattern.py(187)visit_or_pattern()
-> self.msg.fail(message_registry.OR_PATTERN_ALTERNATIVE_NAMES, o.patterns[i])
(Pdb) p pattern_types[0]
PatternType(type=tuple[builtins.dict[builtins.str, tuple[builtins.str]], builtins.dict[builtins.str, builtins.str]], rest_type=tuple[builtins.dict[builtins.str, tuple[builtins.str]], Never], captures={<mypy.nodes.NameExpr object at 0x7f50c2c2b9a0>: builtins.str})
(Pdb) p pattern_types[1]
PatternType(type=Never, rest_type=tuple[Never, Never], captures={})
So mypy concludes the alternatives bind differently, even though both capture sym.
Originally posted by @Hnasar in #13950
cc @cdce8p