-- Tests for strict Optional behavior

[case testImplicitNoneType]
x = None
x()  # E: "None" not callable

[case testImplicitNoneTypeInNestedFunction]
def f() -> None:
    def g() -> None:
        x = None
        x()  # E: "None" not callable

[case testExplicitNoneType]
x = None  # type: None
x()  # E: "None" not callable

[case testNoneMemberOfOptional]
from typing import Optional
x = None  # type: Optional[int]

[case testTypeMemberOfOptional]
from typing import Optional
x = 0  # type: Optional[int]

[case testNoneNotMemberOfType]
x = None  # type: int
[out]
main:1: error: Incompatible types in assignment (expression has type "None", variable has type "int")

[case testTypeNotMemberOfNone]
x = 0  # type: None
[out]
main:1: error: Incompatible types in assignment (expression has type "int", variable has type "None")

[case testOptionalNotMemberOfType]
from typing import Optional
def f(a: int) -> None: pass
x = None  # type:  Optional[int]
f(x)  # E: Argument 1 to "f" has incompatible type "Optional[int]"; expected "int"

[case testIsinstanceCases]
from typing import Optional
x = None  # type:  Optional[int]
if isinstance(x, int):
  reveal_type(x)  # N: Revealed type is "builtins.int"
else:
  reveal_type(x)  # N: Revealed type is "None"
[builtins fixtures/isinstance.pyi]

[case testIfCases]
from typing import Optional
x = None  # type:  Optional[int]
if x:
  reveal_type(x)  # N: Revealed type is "builtins.int"
else:
  reveal_type(x)  # N: Revealed type is "Union[Literal[0], None]"
[builtins fixtures/bool.pyi]

[case testIfNotCases]
from typing import Optional
x = None  # type:  Optional[int]
if not x:
  reveal_type(x)  # N: Revealed type is "Union[Literal[0], None]"
else:
  reveal_type(x)  # N: Revealed type is "builtins.int"
[builtins fixtures/bool.pyi]

[case testIsNotNoneCases]
from typing import Optional
x = None  # type:  Optional[int]
if x is not None:
  reveal_type(x)  # N: Revealed type is "builtins.int"
else:
  reveal_type(x)  # N: Revealed type is "None"
[builtins fixtures/bool.pyi]

[case testIsNoneCases]
from typing import Optional
x = None  # type:  Optional[int]
if x is None:
  reveal_type(x)  # N: Revealed type is "None"
else:
  reveal_type(x)  # N: Revealed type is "builtins.int"
reveal_type(x)  # N: Revealed type is "Union[builtins.int, None]"
[builtins fixtures/bool.pyi]

[case testAnyCanBeNone]
from typing import Optional, Any
x = None  # type:  Any
if x is None:
  reveal_type(x)  # N: Revealed type is "None"
else:
  reveal_type(x)  # N: Revealed type is "Any"
[builtins fixtures/bool.pyi]

[case testOrCases]
from typing import Optional
x = None  # type: Optional[str]
y1 = x or 'a'
reveal_type(y1)  # N: Revealed type is "builtins.str"
y2 = x or 1
reveal_type(y2)  # N: Revealed type is "Union[builtins.str, builtins.int]"
z1 = 'a' or x
reveal_type(z1)  # N: Revealed type is "Union[builtins.str, None]"
z2 = int() or x
reveal_type(z2)  # N: Revealed type is "Union[builtins.int, builtins.str, None]"

[case testAndCases]
from typing import Optional
x = None  # type: Optional[str]
y1 = x and 'b'
reveal_type(y1)  # N: Revealed type is "Union[Literal[''], None, builtins.str]"
y2 = x and 1  # x could be '', so...
reveal_type(y2)  # N: Revealed type is "Union[Literal[''], None, builtins.int]"
z1 = 'b' and x
reveal_type(z1)  # N: Revealed type is "Union[builtins.str, None]"
z2 = int() and x
reveal_type(z2)  # N: Revealed type is "Union[Literal[0], builtins.str, None]"

[case testLambdaReturningNone]
f = lambda: None
x = f()
reveal_type(x)  # N: Revealed type is "None"

[case testNoneArgumentType]
def f(x: None) -> None: pass
f(None)

[case testInferOptionalFromDefaultNone]
# flags: --implicit-optional
def f(x: int = None) -> None:
  x + 1  # E: Unsupported left operand type for + ("None") \
         # N: Left operand is of type "Optional[int]"
f(None)
[out]

[case testNoInferOptionalFromDefaultNone]
# flags: --no-implicit-optional
def f(x: int = None) -> None:  # E: Incompatible default for argument "x" (default has type "None", argument has type "int") \
                               # N: PEP 484 prohibits implicit Optional. Accordingly, mypy has changed its default to no_implicit_optional=True \
                               # N: Use https://github.com/hauntsaninja/no_implicit_optional to automatically upgrade your codebase
  pass
[out]

[case testInferOptionalFromDefaultNoneComment]
# flags: --implicit-optional
def f(x=None):
  # type: (int) -> None
  x + 1  # E: Unsupported left operand type for + ("None") \
         # N: Left operand is of type "Optional[int]"
f(None)
[out]

[case testNoInferOptionalFromDefaultNoneComment]
# flags: --no-implicit-optional
def f(x=None):  # E: Incompatible default for argument "x" (default has type "None", argument has type "int") \
                # N: PEP 484 prohibits implicit Optional. Accordingly, mypy has changed its default to no_implicit_optional=True \
                # N: Use https://github.com/hauntsaninja/no_implicit_optional to automatically upgrade your codebase
  # type: (int) -> None
  pass
[out]

[case testInferOptionalType]
x = None
if bool():
  # scope limit assignment
  x = 1
  # in scope of the assignment, x is an int
  reveal_type(x)  # N: Revealed type is "builtins.int"
# out of scope of the assignment, it's an Optional[int]
reveal_type(x)  # N: Revealed type is "Union[builtins.int, None]"
[builtins fixtures/bool.pyi]

[case testInferOptionalTypeLocallyBound]
x = None
x = 1
reveal_type(x)  # N: Revealed type is "builtins.int"

[case testInferOptionalAnyType]
from typing import Any
x = None
a = None  # type: Any
if bool():
  x = a
  reveal_type(x)  # N: Revealed type is "Any"
reveal_type(x)  # N: Revealed type is "Union[Any, None]"
[builtins fixtures/bool.pyi]

[case testInferOptionalTypeFromOptional]
from typing import Optional
y = None  # type: Optional[int]
x = None
x = y
reveal_type(x)  # N: Revealed type is "Union[builtins.int, None]"

[case testInferOptionalListType]
x = [None]
x.append(1)  # E: Argument 1 to "append" of "list" has incompatible type "int"; expected "None"
[builtins fixtures/list.pyi]

[case testInferNonOptionalListType]
x = []
x.append(1)
x()  # E: "list[int]" not callable
[builtins fixtures/list.pyi]

[case testInferOptionalDictKeyValueTypes]
x = {None: None}
x["bar"] = 1
[builtins fixtures/dict.pyi]
[out]
main:2: error: Invalid index type "str" for "dict[None, None]"; expected type "None"
main:2: error: Incompatible types in assignment (expression has type "int", target has type "None")

[case testInferNonOptionalDictType]
x = {}
x["bar"] = 1
x()  # E: "dict[str, int]" not callable
[builtins fixtures/dict.pyi]

[case testNoneClassVariable]
from typing import Optional
class C:
    x = None  # type: int
    def __init__(self) -> None:
        self.x = 0

[case testNoneClassVariableInInit]
from typing import Optional
class C:
    x = None  # type: int
    def __init__(self) -> None:
        self.x = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")
[out]

[case testMultipleAssignmentNoneClassVariableInInit]
from typing import Optional
class C:
    x, y = None, None  # type: int, str
    def __init__(self) -> None:
        self.x = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")
        self.y = None  # E: Incompatible types in assignment (expression has type "None", variable has type "str")
[builtins fixtures/tuple.pyi]
[out]

[case testOverloadWithNone]
from foo import *
[file foo.pyi]
from typing import overload
@overload
def f(x: None) -> str: pass
@overload
def f(x: int) -> int: pass
reveal_type(f(None))  # N: Revealed type is "builtins.str"
reveal_type(f(0))  # N: Revealed type is "builtins.int"

[case testOptionalTypeOrTypePlain]
from typing import Optional
def f(a: Optional[int]) -> int:
    return a or 0
[out]

[case testOptionalTypeOrTypeTypeVar]
from typing import Optional, TypeVar
T = TypeVar('T')
def f(a: Optional[T], b: T) -> T:
    return a or b
[out]

[case testOptionalTypeOrTypeBothOptional]
from typing import Optional
def f(a: Optional[int], b: Optional[int]) -> None:
    reveal_type(a or b)
def g(a: int, b: Optional[int]) -> None:
    reveal_type(a or b)
[out]
main:3: note: Revealed type is "Union[builtins.int, None]"
main:5: note: Revealed type is "Union[builtins.int, None]"

[case testOptionalTypeOrTypeComplexUnion]
from typing import Union
def f(a: Union[int, str, None]) -> None:
    reveal_type(a or 'default')
[out]
main:3: note: Revealed type is "Union[builtins.int, builtins.str]"

[case testOptionalTypeOrTypeNoTriggerPlain]
from typing import Optional
def f(a: Optional[int], b: int) -> int:
    return b or a
[out]
main:3: error: Incompatible return value type (got "Optional[int]", expected "int")

[case testOptionalTypeOrTypeNoTriggerTypeVar]
from typing import Optional, TypeVar
T = TypeVar('T')
def f(a: Optional[T], b: T) -> T:
    return b or a
[out]
main:4: error: Incompatible return value type (got "Optional[T]", expected "T")

[case testNoneOrStringIsString]
def f() -> str:
    a = None
    b = ''
    return a or b
[out]

[case testNoneOrTypeVarIsTypeVar]
from typing import TypeVar
T = TypeVar('T')
def f(b: T) -> T:
    a = None
    return a or b
[out]

[case testYieldNothingInFunctionReturningGenerator]
from typing import Generator
def f() -> Generator[None, None, None]:
    yield
[out]

[case testNoneAndStringIsNone]
a: None = None
b = "foo"
reveal_type(a and b)  # N: Revealed type is "None"

c = None
reveal_type(c and b)  # N: Revealed type is "None"

[case testNoneMatchesObjectInOverload]
import a
a.f(None)

[file a.pyi]
from typing import overload
@overload
def f() -> None: ...
@overload
def f(o: object) -> None: ...

[case testGenericSubclassReturningNone]
from typing import Generic, TypeVar

T = TypeVar('T')

class Base(Generic[T]):
  def f(self) -> T:
    pass

class SubNone(Base[None]):
  def f(self) -> None:
    pass

class SubInt(Base[int]):
  def f(self) -> int:
    return 1

[case testUseOfNoneReturningFunction]
from typing import Optional
def f() -> None:
    pass

def g(x: Optional[int]) -> int:
  pass

x = f()  # E: "f" does not return a value (it only ever returns None)
f() + 1  # E: "f" does not return a value (it only ever returns None)
g(f())  # E: "f" does not return a value (it only ever returns None)

[case testEmptyReturn]
def f() -> None:
    return

[case testReturnNone]
def f() -> None:
    return None

[case testNoneCallable]
from typing import Callable
def f() -> None: pass
x = f  # type: Callable[[], None]

[case testOptionalCallable]
from typing import Callable, Optional
T = Optional[Callable[..., None]]

[case testAnyTypeInPartialTypeList]
# flags: --check-untyped-defs
def f(): ...

def lookup_field(name, obj):
    try:
        pass
    except:
        attr = f()
    else:
        attr = None

[case testTernaryWithNone]
reveal_type(None if bool() else 0)  # N: Revealed type is "Union[None, Literal[0]?]"
[builtins fixtures/bool.pyi]

[case testListWithNone]
reveal_type([0, None, 0])    # N: Revealed type is "builtins.list[Union[builtins.int, None]]"
[builtins fixtures/list.pyi]

[case testNoneContextInference]
from typing import Dict, List
def f() -> List[None]:
    return []
def g() -> Dict[None, None]:
    return {}
[builtins fixtures/dict.pyi]

[case testRaiseFromNone]
raise BaseException from None
[builtins fixtures/exception.pyi]

[case testOptionalNonPartialTypeWithNone]
from typing import Generator
def f() -> Generator[str, None, None]: pass
x = f()
reveal_type(x)  # N: Revealed type is "typing.Generator[builtins.str, None, None]"
l = [f()]
reveal_type(l)  # N: Revealed type is "builtins.list[typing.Generator[builtins.str, None, None]]"
[builtins fixtures/list.pyi]

[case testNoneListTernary]
x = [None] if "" else [1]  # E: List item 0 has incompatible type "int"; expected "None"
[builtins fixtures/list.pyi]

[case testListIncompatibleErrorMessage]
from typing import List, Callable

def foo(l: List[Callable[[], str]]) -> None: pass
def f() -> int:
    return 42

foo([f])  # E: List item 0 has incompatible type "Callable[[], int]"; expected "Callable[[], str]"
[builtins fixtures/list.pyi]

[case testInferEqualsNotOptional]
from typing import Optional
x = ''  # type: Optional[str]
if x == '<string>':
    reveal_type(x)  # N: Revealed type is "builtins.str"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, None]"
if x is '<string>':
    reveal_type(x)  # N: Revealed type is "builtins.str"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, None]"
[builtins fixtures/ops.pyi]

[case testInferEqualsNotOptionalWithUnion]
from typing import Union
x = ''  # type: Union[str, int, None]
if x == '<string>':
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int]"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int, None]"
if x is '<string>':
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int]"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int, None]"
[builtins fixtures/ops.pyi]

[case testInferEqualsNotOptionalWithOverlap]
from typing import Union
x = ''  # type: Union[str, int, None]
if x == object():
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int]"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int, None]"
if x is object():
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int]"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int, None]"
[builtins fixtures/ops.pyi]

[case testInferEqualsStillOptionalWithNoOverlap]
from typing import Optional
x = ''  # type: Optional[str]
if x == 0:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, None]"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, None]"
if x is 0:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, None]"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, None]"
[builtins fixtures/ops.pyi]

[case testInferEqualsStillOptionalWithBothOptional]
from typing import Union
x = ''  # type: Union[str, int, None]
y = ''  # type: Union[str, None]
if x == y:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int, None]"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int, None]"
if x is y:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int, None]"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.str, builtins.int, None]"
[builtins fixtures/ops.pyi]

[case testInferEqualsNotOptionalWithMultipleArgs]
from typing import Optional
x: Optional[int]
y: Optional[int]
if x == y == 1:
    reveal_type(x)  # N: Revealed type is "builtins.int"
    reveal_type(y)  # N: Revealed type is "builtins.int"
else:
    reveal_type(x)  # N: Revealed type is "Union[builtins.int, None]"
    reveal_type(y)  # N: Revealed type is "Union[builtins.int, None]"

class A: pass
a: Optional[A]
b: Optional[A]
if a == b == object():
    reveal_type(a)  # N: Revealed type is "__main__.A"
    reveal_type(b)  # N: Revealed type is "__main__.A"
else:
    reveal_type(a)  # N: Revealed type is "Union[__main__.A, None]"
    reveal_type(b)  # N: Revealed type is "Union[__main__.A, None]"
[builtins fixtures/ops.pyi]

[case testInferInWithErasedTypes]
from typing import TypeVar, Callable

T = TypeVar('T')
def foo(f: Callable[[T], bool], it: T) -> None: ...

foo(lambda x: x in [1, 2] and bool(), 3)
[builtins fixtures/list.pyi]

[case testWarnNoReturnWorksWithStrictOptional]
# flags: --warn-no-return
def f() -> None:
  1 + 1  # no error

def g() -> int:
  1 + 1  #
[out]
main:5: error: Missing return statement

[case testGenericTypeAliasesOptional]
from typing import TypeVar, Generic, Optional
T = TypeVar('T')
class Node(Generic[T]):
    def __init__(self, x: T) -> None:
        self.x = x

ONode = Optional[Node[T]]
def f(x: T) -> ONode[T]:
    if 1 > 0:
        return Node(x)
    else:
        return None

x = None # type: ONode[int]
if int():
    x = f(1)
if int():
    x = f('x') # E: Argument 1 to "f" has incompatible type "str"; expected "int"

x.x = 1 # E: Item "None" of "Optional[Node[int]]" has no attribute "x"
if x is not None:
    x.x = 1 # OK here

[builtins fixtures/ops.pyi]

[case testOptionalTypeNarrowedInBooleanStatement]
from typing import Optional

x: Optional[int] = None
x is not None and x + 42
x is not None and x + '42'  # E: Unsupported operand types for + ("int" and "str")
[builtins fixtures/isinstance.pyi]

[case testInvalidBooleanBranchIgnored]
from typing import Optional

x: None = None
x is not None and x + 42
[builtins fixtures/isinstance.pyi]

[case testOptionalLambdaInference]
from typing import Optional, Callable
f = None # type: Optional[Callable[[int], None]]
f = lambda x: None
f(0)
[builtins fixtures/function.pyi]

[case testDontSimplifyNoneUnionsWithStrictOptional]
from typing import Any, TypeVar, Union
A = None  # type: Any
class C(A): pass
T = TypeVar('T')
S = TypeVar('S')
def u(x: T, y: S) -> Union[S, T]: pass
a = None # type: Any

# Test both orders
reveal_type(u(C(), None))  # N: Revealed type is "Union[None, __main__.C]"
reveal_type(u(None, C()))  # N: Revealed type is "Union[__main__.C, None]"

reveal_type(u(a, None))  # N: Revealed type is "Union[None, Any]"
reveal_type(u(None, a))  # N: Revealed type is "Union[Any, None]"

reveal_type(u(1, None))  # N: Revealed type is "Union[None, builtins.int]"
reveal_type(u(None, 1))  # N: Revealed type is "Union[builtins.int, None]"

[case testOptionalAndAnyBaseClass]
from typing import Any, Optional
A = None  # type: Any
class C(A):
    pass
x = None  # type: Optional[C]
x.foo()  # E: Item "None" of "Optional[C]" has no attribute "foo"

[case testIsinstanceAndOptionalAndAnyBase]
from typing import Any, Optional

B = None  # type: Any
class A(B): pass

def f(a: Optional[A]):
    reveal_type(a) # N: Revealed type is "Union[__main__.A, None]"
    if a is not None:
        reveal_type(a) # N: Revealed type is "__main__.A"
    else:
        reveal_type(a) # N: Revealed type is "None"
    reveal_type(a) # N: Revealed type is "Union[__main__.A, None]"
[builtins fixtures/isinstance.pyi]

[case testFlattenOptionalUnion]
from typing import Optional, Union

x: Optional[Union[int, str]]
reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.str, None]"
y: Optional[Union[int, None]]
reveal_type(y) # N: Revealed type is "Union[builtins.int, None]"

[case testOverloadWithNoneAndOptional]
from typing import overload, Optional

@overload
def f(x: int) -> str: ...
@overload
def f(x: Optional[int]) -> Optional[str]: ...
def f(x): return x

reveal_type(f(1)) # N: Revealed type is "builtins.str"
reveal_type(f(None)) # N: Revealed type is "Union[builtins.str, None]"
x: Optional[int]
reveal_type(f(x)) # N: Revealed type is "Union[builtins.str, None]"

[case testUnionTruthinessTracking]
from typing import Optional, Any
def test_or_shortcut(value: Optional[Any]) -> None:
    if not value:
        pass
    if not value or value.get('foo') == 'hello':
        pass
[builtins fixtures/bool.pyi]

[case testNarrowingFromObjectToOptional]
from typing import Optional
x: object
y: Optional[int]
x = y
reveal_type(x) # N: Revealed type is "Union[builtins.int, None]"
[out]

[case testNarrowOptionalOutsideLambda]
from typing import Optional

class A:
    a: int

def f(x: Optional[A]) -> None:
    assert x
    lambda: x.a
[builtins fixtures/isinstancelist.pyi]

[case testNarrowOptionalOutsideLambdaWithDeferred]
from typing import Optional

class A:
    a: int

    def f(self, x: Optional['A']) -> None:
        assert x
        lambda: (self.y, x.a) # E: Cannot determine type of "y"
        self.y = int()
[builtins fixtures/isinstancelist.pyi]

[case testDeferredAndOptionalInferenceSpecialCase]
def f() -> str:
    y
    x = None
    if int():
        x = ''
    if x is None:
        x = ''
        g(x)
    return x

def g(x: str) -> None: pass

y = int()
[builtins fixtures/bool.pyi]

[case testOptionalAssignAny1]
from typing import Optional
def f():
    return 0

def g(x: Optional[int]) -> int:
    if x is None:
        reveal_type(x)  # N: Revealed type is "None"
        # As a special case for Unions containing None, during
        x = f()
        reveal_type(x)  # N: Revealed type is "Union[builtins.int, Any]"
    reveal_type(x)  # N: Revealed type is "Union[builtins.int, Any]"
    return x
[builtins fixtures/bool.pyi]

[case testOptionalAssignAny2]
from typing import Optional
def f():
    return 0

def g(x: Optional[int]) -> int:
    if x is None:
        reveal_type(x)  # N: Revealed type is "None"
        x = 1
        reveal_type(x)  # N: Revealed type is "builtins.int"
        # Same as above, even after we've assigned to x
        x = f()
        reveal_type(x)  # N: Revealed type is "Union[builtins.int, Any]"
    reveal_type(x)  # N: Revealed type is "Union[builtins.int, Any]"
    return x
[builtins fixtures/bool.pyi]

[case testOptionalAssignAny3]
from typing import Optional
def f():
    return 0

def g(x: Optional[int]) -> int:
    if x is not None:
        return x
    reveal_type(x)  # N: Revealed type is "None"
    x = f()
    reveal_type(x)  # N: Revealed type is "Union[builtins.int, Any]"
    return x
[builtins fixtures/bool.pyi]

[case testStrictOptionalCovarianceCrossModule]
# flags: --config-file tmp/mypy.ini
from a import asdf
x = ["lol"]
asdf(x)

[file a.py]
from typing import List, Optional

def asdf(x: List[Optional[str]]) -> None:
    pass

x = ["lol"]
asdf(x)

[file mypy.ini]
\[mypy]
\[mypy-a]
strict_optional = False
[out]
main:4: error: Argument 1 to "asdf" has incompatible type "list[str]"; expected "list[Optional[str]]"
main:4: note: "list" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance
main:4: note: Consider using "Sequence" instead, which is covariant
[builtins fixtures/list.pyi]

[case testOptionalBackwards1]
from typing import Any, Optional

def f1(b: bool) -> Optional[int]:
    if b:
        z = 10
        reveal_type(z)  # N: Revealed type is "builtins.int"
    else:
        z = None
        reveal_type(z)  # N: Revealed type is "None"
    reveal_type(z)  # N: Revealed type is "Union[builtins.int, None]"
    return z

def f2(b: bool) -> int:
    if b:
        z = 10
    else:
        z = None
    return z  # E: Incompatible return value type (got "Optional[int]", expected "int")

def f3(b: bool) -> int:
    # XXX: This one is a little questionable! Maybe we *do* want to allow this?
    z = 10
    if b:
        z = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")
    return z

def f4() -> Optional[int]:
    z = 10
    z = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")

    return z

def f5() -> None:
    z = 10

    def f() -> None:
        nonlocal z
        z = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")

def f6(b: bool) -> None:
    if b:
        z = 10
    else:
        z = 11

    def f() -> None:
        nonlocal z
        z = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")

def f7(b: bool) -> None:
    if b:
        z = 10
    else:
        z = 11

    z = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")

def f8(b: bool, c: bool) -> Optional[int]:
    if b:
        if c:
            z = 10
        else:
            z = 11
    else:
        z = None
    return z

def f9(b: bool) -> None:
    if b:
        z: int = 10
    else:
        z = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")

def f10(b: bool) -> None:
    z: int
    if b:
        z = 10
    else:
        z = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")

def f11(b: bool, c: bool) -> None:
    if b:
        z = 10
    elif c:
        z = 30
    else:
        z = None

def f12(b: bool, a: Any) -> None:
    if b:
        z = a
    else:
        z = None
    reveal_type(z)  # N: Revealed type is "Any"

def f13(b: bool, a: Any) -> None:
    if b:
        try:
            z = f2(True)
        except Exception:
            raise RuntimeError
    else:
        z = None

def f14(b: bool, a: Any) -> None:
    if b:
        with a:
            z = 10
    else:
        z = None

def f15() -> None:
    try:
        z = f2(True)
    except Exception:
        z = None
    reveal_type(z)  # N: Revealed type is "Union[builtins.int, None]"

def f16(z: Any) -> None:
    for x in z:
        if x == 0:
            y = 50
            break
    else:
        y = None
    reveal_type(y)  # N: Revealed type is "Union[builtins.int, None]"

def f17(b: bool, c: bool, d: bool) -> None:
    if b:
        z = 2
    elif c:
        z = None
    elif d:
        z = 3
    reveal_type(z)  # N: Revealed type is "Union[builtins.int, None]"

def f18(b: bool, c: bool, d: bool) -> None:
    if b:
        z = 4
    else:
        if c:
            z = 5
        else:
            z = None
    reveal_type(z)  # N: Revealed type is "Union[builtins.int, None]"

def f19(b: bool, c: bool, d: bool) -> None:
    if b:
        z = 5
    else:
        z = None
        if c:
            z = 6
    reveal_type(z)  # N: Revealed type is "Union[builtins.int, None]"

def f20(b: bool) -> None:
    if b:
        x: Any = 5
    else:
        x = None
    reveal_type(x)  # N: Revealed type is "Any"

def f_unannot(): pass

def f21(b: bool) -> None:
    if b:
        x = f_unannot()
    else:
        x = None
    reveal_type(x)  # N: Revealed type is "Any"

def f22(b: bool) -> None:
    if b:
        z = 10
    if not b:
        z = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")

def f23(b: bool) -> None:
    if b:
        z = 10
    if b:
        z = 11
    else:
        z = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")

[builtins fixtures/exception.pyi]

[case testOptionalBackwards2]

def f1(b: bool) -> None:
    if b:
        x = []  # E: Need type annotation for "x" (hint: "x: list[<type>] = ...")
    else:
        x = None

def f2(b: bool) -> None:
    if b:
        x = []
        x.append(1)
    else:
        x = None
    reveal_type(x)  # N: Revealed type is "Union[builtins.list[builtins.int], None]"


[builtins fixtures/list.pyi]

[case testOptionalBackwards3]

# We don't allow this sort of updating for globals or attributes currently.
gb: bool
if gb:
    Z = 10
else:
    Z = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")

class Foo:
    def __init__(self, b: bool) -> None:
        if b:
            self.x = 5
        else:
            self.x = None  # E: Incompatible types in assignment (expression has type "None", variable has type "int")

    def foo(self) -> None:
        reveal_type(self.x)  # N: Revealed type is "builtins.int"

[case testOptionalBackwards4]
from typing import Any, Optional

def f1(b: bool) -> Optional[int]:
    if b:
        z = 10
        reveal_type(z)  # N: Revealed type is "builtins.int"
    else:
        # Force the node to get deferred between the two assignments
        Defer().defer
        z = None
        reveal_type(z)  # N: Revealed type is "None"
    reveal_type(z)  # N: Revealed type is "Union[builtins.int, None]"
    return z

class Defer:
    def __init__(self) -> None:
        self.defer = 10

[case testOptionalIterator]
# mypy: no-strict-optional
from typing import Optional, List

x: Optional[List[int]]
if 3 in x:
    pass

[case testNarrowedVariableInNestedFunctionBasic]
from typing import Optional

def can_narrow(x: Optional[str]) -> None:
    if x is None:
        x = "a"
    def nested() -> str:
        return reveal_type(x)  # N: Revealed type is "builtins.str"
    nested()

def foo(a): pass

class C:
    def can_narrow_in_method(self, x: Optional[str]) -> None:
        if x is None:
            x = "a"
        def nested() -> str:
            return reveal_type(x)  # N: Revealed type is "builtins.str"
        # Reading the variable is fine
        y = x
        with foo(x):
            foo(x)
        for a in foo(x):
            foo(x)
        nested()

def can_narrow_lambda(x: Optional[str]) -> None:
    if x is None:
        x = "a"
    nested = lambda: x
    reveal_type(nested())  # N: Revealed type is "builtins.str"

def cannot_narrow_if_reassigned(x: Optional[str]) -> None:
    if x is None:
        x = "a"
    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")
    if int():
        x = None
    nested()

x: Optional[str] = "x"

def narrow_global_in_func() -> None:
    global x
    if x is None:
        x = "a"
    def nested() -> str:
        # This should perhaps not be narrowed, since the nested function could outlive
        # the outer function, and since other functions could also assign to x, but
        # this seems like a minor issue.
        return x
    nested()

x = "y"

def narrowing_global_at_top_level_not_propagated() -> str:
    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")
    return x  # E: Incompatible return value type (got "Optional[str]", expected "str")

[case testNarrowedVariableInNestedFunctionMore1]
from typing import Optional, overload

class C:
    a: Optional[str]

def attribute_narrowing(c: C) -> None:
    # This case is not supported, since we can't keep track of assignments to attributes.
    c.a = "x"
    def nested() -> str:
        return c.a  # E: Incompatible return value type (got "Optional[str]", expected "str")
    nested()

def assignment_in_for(x: Optional[str]) -> None:
    if x is None:
        x = "e"
    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")
    for x in ["x"]:
        pass

def foo(): pass

def assignment_in_with(x: Optional[str]) -> None:
    if x is None:
        x = "e"
    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")
    with foo() as x:
        pass

g: Optional[str]

def assign_to_global() -> None:
    global g
    g = "x"
    # This is unsafe, but we don't generate an error, for convenience. Besides,
    # this is probably a very rare case.
    def nested() -> str:
        return g

def assign_to_nonlocal(x: Optional[str]) -> None:
    def nested() -> str:
        nonlocal x

        if x is None:
            x = "a"

        def nested2() -> str:
            return x  # E: Incompatible return value type (got "Optional[str]", expected "str")

        return nested2()
    nested()
    x = None

def dec(f):
    return f

@dec
def decorated_outer(x: Optional[str]) -> None:
    if x is None:
        x = "a"
    def nested() -> str:
        return x
    nested()

@dec
def decorated_outer_bad(x: Optional[str]) -> None:
    if x is None:
        x = "a"
    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")
    x = None
    nested()

def decorated_inner(x: Optional[str]) -> None:
    if x is None:
        x = "a"
    @dec
    def nested() -> str:
        return x
    nested()

def decorated_inner_bad(x: Optional[str]) -> None:
    if x is None:
        x = "a"
    @dec
    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")
    x = None
    nested()

@overload
def overloaded_outer(x: None) -> None: ...
@overload
def overloaded_outer(x: str) -> None: ...
def overloaded_outer(x: Optional[str]) -> None:
    if x is None:
        x = "a"
    def nested() -> str:
        return x
    nested()

@overload
def overloaded_outer_bad(x: None) -> None: ...
@overload
def overloaded_outer_bad(x: str) -> None: ...
def overloaded_outer_bad(x: Optional[str]) -> None:
    if x is None:
        x = "a"
    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")
    x = None
    nested()

[case testNarrowedVariableInNestedFunctionMore2]
from typing import Optional

def narrow_multiple(x: Optional[str], y: Optional[int]) -> None:
    z: Optional[str] = x
    if x is None:
        x = ""
    if y is None:
        y = 1
    if int():
        if z is None:
            z = ""
        def nested() -> None:
            a: str = x
            b: int = y
            c: str = z
        nested()

def narrow_multiple_partial(x: Optional[str], y: Optional[int]) -> None:
    z: Optional[str] = x
    if x is None:
        x = ""
    if isinstance(y, int):
        if z is None:
            z = ""
        def nested() -> None:
            a: str = x
            b: int = y
            c: str = z  # E: Incompatible types in assignment (expression has type "Optional[str]", variable has type "str")
        z = None
        nested()

def multiple_nested_functions(x: Optional[str], y: Optional[str]) -> None:
    if x is None:
        x = ""
    def nested1() -> str:
        return x
    if y is None:
        y = ""
    def nested2() -> str:
        a: str = y
        return x

class C:
    a: str
    def __setitem__(self, key, value): pass

def narrowed_variable_used_in_lvalue_but_not_assigned(c: Optional[C]) -> None:
    if c is None:
        c = C()
    def nested() -> C:
        return c
    c.a = "x"
    c[1] = 2
    cc = C()
    cc[c] = 3
    nested()

def narrow_with_multi_lvalues_1(x: Optional[str]) -> None:
    if x is None:
        x = ""

    def nested() -> str:
        return x

    y = z = None

def narrow_with_multi_lvalue_2(x: Optional[str]) -> None:
    if x is None:
        x = ""

    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")

    x = y = None

def narrow_with_multi_lvalue_3(x: Optional[str]) -> None:
    if x is None:
        x = ""

    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")

    y = x = None

def narrow_with_multi_assign_1(x: Optional[str]) -> None:
    if x is None:
        x = ""

    def nested() -> str:
        return x

    y, z = None, None

def narrow_with_multi_assign_2(x: Optional[str]) -> None:
    if x is None:
        x = ""

    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")

    x, y = None, None

def narrow_with_multi_assign_3(x: Optional[str]) -> None:
    if x is None:
        x = ""

    def nested() -> str:
        return x  # E: Incompatible return value type (got "Optional[str]", expected "str")

    y, x = None, None

[builtins fixtures/isinstance.pyi]

[case testNestedFunctionSpecialCase]
class C:
    def __enter__(self, *args): ...
    def __exit__(self, *args) -> bool: ...

def f(x: object) -> None:
    if x is not None:
        pass

    def nested() -> None:
        with C():
            pass
[builtins fixtures/tuple.pyi]
