From 95e8c7a73ed766d47fc0129cd8bd7efd9c9b5b16 Mon Sep 17 00:00:00 2001 From: "g.denis" Date: Thu, 22 Aug 2019 15:24:37 -0400 Subject: [PATCH] Second expression in assert statement should be checked as conditional (#7318) Fixes https://github.com/python/mypy/issues/7284 --- mypy/checker.py | 7 +++---- test-data/unit/check-expressions.test | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) 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]