diff --git a/mypy/checker.py b/mypy/checker.py index 69e6f15ef0c3a..d9dfe0b3b25f2 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -3608,6 +3608,14 @@ def check_compatibility_all_supers(self, lvalue: RefExpr, rvalue: Expression) -> if is_private(lvalue_node.name): continue + # Enum members "name"/"value" shadow properties, not overrides. + if ( + lvalue_node.info.is_enum + and lvalue_node.name in ("name", "value") + and base.fullname in ENUM_BASES + ): + continue + base_type, base_node = self.node_type_from_base(lvalue_node.name, base, lvalue) # TODO: if the r.h.s. is a descriptor, we should check setter override as well. custom_setter = is_custom_settable_property(base_node) diff --git a/test-data/unit/check-enum.test b/test-data/unit/check-enum.test index c05dfdef2bf7f..12ce11e84e4b7 100644 --- a/test-data/unit/check-enum.test +++ b/test-data/unit/check-enum.test @@ -2933,3 +2933,22 @@ def f5(x: str | Custom | SE): reveal_type(x) # N: Revealed type is "builtins.str | __main__.Custom | __main__.SE" [builtins fixtures/primitives.pyi] + +[case testEnumMemberNamedValueWithAuto] +from enum import Enum, auto + +class A(Enum): + value = auto() + +class B(Enum): + name = auto() + +class C(Enum): + name = auto() + value = auto() + +reveal_type(A.value) # N: Revealed type is "Literal[__main__.A.value]?" +reveal_type(B.name) # N: Revealed type is "Literal[__main__.B.name]?" +reveal_type(C.name) # N: Revealed type is "Literal[__main__.C.name]?" +reveal_type(C.value) # N: Revealed type is "Literal[__main__.C.value]?" +[builtins fixtures/primitives.pyi]