From 7b45a39f7e2f4e05387162c34786bedd621382f2 Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Mon, 2 Jun 2025 18:37:50 +0100 Subject: [PATCH] Fix crash on invalid property inside its own body --- mypy/checkmember.py | 4 ++++ test-data/unit/check-classes.test | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/mypy/checkmember.py b/mypy/checkmember.py index b89452d90392..86e1dc06fc25 100644 --- a/mypy/checkmember.py +++ b/mypy/checkmember.py @@ -981,6 +981,10 @@ def expand_and_bind_callable( assert isinstance(expanded, CallableType) if var.is_settable_property and mx.is_lvalue and var.setter_type is not None: # TODO: use check_call() to infer better type, same as for __set__(). + if not expanded.arg_types: + # This can happen when accessing invalid property from its own body, + # error will be reported elsewhere. + return AnyType(TypeOfAny.from_error) return expanded.arg_types[0] else: return expanded.ret_type diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test index f8b841185fc6..054ba0708ce3 100644 --- a/test-data/unit/check-classes.test +++ b/test-data/unit/check-classes.test @@ -8726,3 +8726,16 @@ class Fields: reveal_type(Fields.bool_f) # N: Revealed type is "__main__.BoolField" reveal_type(Fields.int_f) # N: Revealed type is "__main__.NumField" reveal_type(Fields.custom_f) # N: Revealed type is "__main__.AnyField[__main__.Custom]" + +[case testRecursivePropertyWithInvalidSetterNoCrash] +class NoopPowerResource: + _hardware_type: int + + @property + def hardware_type(self) -> int: + return self._hardware_type + + @hardware_type.setter + def hardware_type(self) -> None: # E: Invalid property setter signature + self.hardware_type = None # Note: intentionally recursive +[builtins fixtures/property.pyi]