diff --git a/mypy/meet.py b/mypy/meet.py index 29c4d3663503..6f22925727b8 100644 --- a/mypy/meet.py +++ b/mypy/meet.py @@ -682,6 +682,11 @@ def visit_erased_type(self, t: ErasedType) -> ProperType: def visit_type_var(self, t: TypeVarType) -> ProperType: if isinstance(self.s, TypeVarType) and self.s.id == t.id: return self.s + # this may be alright on things other than just instances + elif isinstance(self.s, (Instance, NoneType, TupleType)): + return t.copy_modified(upper_bound=meet_types(t.upper_bound, self.s)) + elif isinstance(self.s, UnionType): + return meet_types(t, self.s) else: return self.default(self.s) @@ -753,13 +758,7 @@ def visit_instance(self, t: Instance) -> ProperType: if is_subtype(self.s.fallback, t): return self.s return self.default(self.s) - elif isinstance(self.s, TypeType): - return meet_types(t, self.s) - elif isinstance(self.s, TupleType): - return meet_types(t, self.s) - elif isinstance(self.s, LiteralType): - return meet_types(t, self.s) - elif isinstance(self.s, TypedDictType): + elif isinstance(self.s, (TypeType, TupleType, LiteralType, TypedDictType, TypeVarType)): return meet_types(t, self.s) return self.default(self.s) diff --git a/mypy/test/testtypes.py b/mypy/test/testtypes.py index b1f21b3be79b..89afabe674d3 100644 --- a/mypy/test/testtypes.py +++ b/mypy/test/testtypes.py @@ -1135,7 +1135,9 @@ def test_simple_generics(self) -> None: self.assert_meet(self.fx.ga, self.fx.nonet, self.fx.nonet) self.assert_meet(self.fx.ga, self.fx.anyt, self.fx.ga) - for t in [self.fx.a, self.fx.t, self.tuple(), self.callable(self.fx.a, self.fx.b)]: + self.assert_meet(self.fx.t, self.fx.ga, self.fx.t) + + for t in [self.fx.a, self.tuple(), self.callable(self.fx.a, self.fx.b)]: self.assert_meet(t, self.fx.ga, self.fx.nonet) def test_generics_with_multiple_args(self) -> None: