diff --git a/mypy/checker.py b/mypy/checker.py index deb096c1c479..c7673699173b 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -2979,14 +2979,13 @@ def visit_operator_assignment_stmt(self, def visit_assert_stmt(self, s: AssertStmt) -> None: self.expr_checker.accept(s.expr) - if s.msg is not None: - self.expr_checker.accept(s.msg) - if isinstance(s.expr, TupleExpr) and len(s.expr.items) > 0: self.fail(message_registry.MALFORMED_ASSERT, s) # If this is asserting some isinstance check, bind that type in the following code - true_map, _ = self.find_isinstance_check(s.expr) + true_map, else_map = self.find_isinstance_check(s.expr) + if s.msg is not None: + self.expr_checker.analyze_cond_branch(else_map, s.msg, None) self.push_type_map(true_map) def visit_raise_stmt(self, s: RaiseStmt) -> None: diff --git a/test-data/unit/check-expressions.test b/test-data/unit/check-expressions.test index affcad39b7e8..234837091bf9 100644 --- a/test-data/unit/check-expressions.test +++ b/test-data/unit/check-expressions.test @@ -2331,3 +2331,22 @@ def f(x: any) -> None: # E: Name 'any' is not defined \ def f(x: Optional[str]) -> None: # E: Name 'Optional' is not defined \ # N: Did you forget to import it from "typing"? (Suggestion: "from typing import Optional") pass + +[case testAssertionLazilyWithIsNone] +from typing import Optional, List +li: Optional[List] = [] +assert li is None, li[0] +[builtins fixtures/list.pyi] + + +[case testAssertionLazilyWithIsInstance] +from typing import Optional, List +li: Optional[List] = [] +assert not isinstance(li,list), li[0] +[builtins fixtures/isinstancelist.pyi] + +[case testAssertCurrentFrameIsNotUnreachable] +def f() -> int: # E: Missing return statement + x: int + assert isinstance(x, int), '...' +[builtins fixtures/isinstance.pyi]