diff --git a/mypy/checkmember.py b/mypy/checkmember.py index cc0be2058fbf..a4a53f66dae0 100644 --- a/mypy/checkmember.py +++ b/mypy/checkmember.py @@ -18,11 +18,15 @@ from mypy import subtypes -def analyze_member_access(name: str, typ: Type, node: Context, is_lvalue: bool, +def analyze_member_access(name: str, + typ: Type, + node: Context, + is_lvalue: bool, is_super: bool, builtin_type: Callable[[str], Instance], not_ready_callback: Callable[[str, Context], None], - msg: MessageBuilder, override_info: TypeInfo = None, + msg: MessageBuilder, + override_info: TypeInfo = None, report_type: Type = None) -> Type: """Analyse attribute access. @@ -72,6 +76,11 @@ def analyze_member_access(name: str, typ: Type, node: Context, is_lvalue: bool, elif isinstance(typ, AnyType): # The base object has dynamic type. return AnyType() + elif isinstance(typ, NoneTyp): + # The only attribute NoneType has are those it inherits from object + return analyze_member_access(name, builtin_type('builtins.object'), node, is_lvalue, + is_super, builtin_type, not_ready_callback, msg, + report_type=report_type) elif isinstance(typ, UnionType): # The base object has dynamic type. msg.disable_type_names += 1 diff --git a/test-data/unit/check-expressions.test b/test-data/unit/check-expressions.test index 96faa414e6c0..e80de39763d6 100644 --- a/test-data/unit/check-expressions.test +++ b/test-data/unit/check-expressions.test @@ -1493,3 +1493,11 @@ reveal_type("foo") # E: Argument 1 to "reveal_type" has incompatible type "str"; [case testRevealTypeVar] reveal_type = 1 1 + "foo" # E: Unsupported operand types for + ("int" and "str") + +[case testEqNone] +None == None +[builtins fixtures/ops.py] + +[case testLtNone] +None < None # E: Unsupported left operand type for < (None) +[builtins fixtures/ops.py]