diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index 016668b46105..4829b99231cd 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -45,6 +45,7 @@ from mypy.typevars import fill_typevars from mypy.visitor import ExpressionVisitor from mypy.funcplugins import get_function_plugin_callbacks, PluginCallback +from mypy.typeanal import make_optional_type from mypy import experiments @@ -1928,10 +1929,11 @@ def analyze_super(self, e: SuperExpr, is_lvalue: bool) -> Type: return AnyType() def visit_slice_expr(self, e: SliceExpr) -> Type: + expected = make_optional_type(self.named_type('builtins.int')) for index in [e.begin_index, e.end_index, e.stride]: if index: t = self.accept(index) - self.chk.check_subtype(t, self.named_type('builtins.int'), + self.chk.check_subtype(t, expected, index, messages.INVALID_SLICE_INDEX) return self.named_type('builtins.slice') diff --git a/test-data/unit/check-expressions.test b/test-data/unit/check-expressions.test index 1d840269da42..ae1498acdadd 100644 --- a/test-data/unit/check-expressions.test +++ b/test-data/unit/check-expressions.test @@ -1006,6 +1006,16 @@ a[None:] a[:None] [builtins fixtures/slice.pyi] +[case testNoneSliceBoundsWithStrictOptional] +# flags: --strict-optional +from typing import Any +a = None # type: Any +a[None:1] +a[1:None] +a[None:] +a[:None] +[builtins fixtures/slice.pyi] + -- String interpolation -- --------------------