diff --git a/mypy/join.py b/mypy/join.py index d63388d35450..d6ca21448e41 100644 --- a/mypy/join.py +++ b/mypy/join.py @@ -66,6 +66,9 @@ def join_types(s: Type, t: Type) -> Type: if isinstance(s, ErasedType): return t + if isinstance(s, UnionType) and not isinstance(t, UnionType): + s, t = t, s + if isinstance(s, NoneTyp) and not isinstance(t, NoneTyp): s, t = t, s @@ -114,8 +117,12 @@ def visit_none_type(self, t: NoneTyp) -> Type: if experiments.STRICT_OPTIONAL: if isinstance(self.s, (NoneTyp, UninhabitedType)): return t + elif isinstance(self.s, UnboundType): + return AnyType() + elif isinstance(self.s, Void) or isinstance(self.s, ErrorType): + return ErrorType() else: - return self.default(self.s) + return UnionType.make_simplified_union([self.s, t]) else: if not isinstance(self.s, Void): return self.s diff --git a/test-data/unit/check-optional.test b/test-data/unit/check-optional.test index 2d643fea4648..7c6b3b3a4fae 100644 --- a/test-data/unit/check-optional.test +++ b/test-data/unit/check-optional.test @@ -330,3 +330,11 @@ def lookup_field(name, obj): [out] main: note: In function "lookup_field": main:10: error: Need type annotation for variable + +[case testTernaryWithNone] +reveal_type(None if bool() else 0) # E: Revealed type is 'Union[builtins.int, builtins.None]' +[builtins fixtures/bool.py] + +[case testListWithNone] +reveal_type([0, None, 0]) # E: Revealed type is 'builtins.list[Union[builtins.int, builtins.None]]' +[builtins fixtures/list.py]