diff --git a/mypy/semanal.py b/mypy/semanal.py index 973a28db0588..6155a15ef2bb 100644 --- a/mypy/semanal.py +++ b/mypy/semanal.py @@ -6505,7 +6505,9 @@ def _lookup( implicit_node = node # 2b. Class attributes __qualname__ and __module__ if self.type and not self.is_func_scope() and name in {"__qualname__", "__module__"}: - return SymbolTableNode(MDEF, Var(name, self.str_type())) + v = Var(name, self.str_type()) + v._fullname = self.qualified_name(name) + return SymbolTableNode(MDEF, v) # 3. Local (function) scopes for table in reversed(self.locals): if table is not None and name in table: diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test index 0e9d6357af1a..8c359deb4f2f 100644 --- a/test-data/unit/check-classes.test +++ b/test-data/unit/check-classes.test @@ -8927,6 +8927,11 @@ class C: __module__ # E: Name "__module__" is not defined __qualname__ # E: Name "__qualname__" is not defined + x: __module__ # E: Variable "__main__.C.__module__" is not valid as a type \ + # N: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases + y: __qualname__ # E: Variable "__main__.C.__qualname__" is not valid as a type \ + # N: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases + [case testPropertySetterType] class A: @property