Thanks to visit codestin.com
Credit goes to github.com

Skip to content

crash for protocol member with contravariant type variable #11020

Description

@opk12

Reproducer

from typing import overload, Protocol, TypeVar

I = TypeVar('I')
V_contra = TypeVar('V_contra', contravariant=True)

class C(Protocol[I]):
    def __abs__(self: 'C[V_contra]') -> 'C[V_contra]':
        ...

    @overload
    def f(self: 'C', q: int) -> int:
        ...
    @overload
    def f(self: 'C[float]', q: float) -> 'C[float]':
        ...

Traceback

$  mypy --show-traceback a.py 
a.py:10: error: INTERNAL ERROR -- Please try using mypy master on Github:
https://mypy.readthedocs.io/en/stable/common_issues.html#using-a-development-mypy-build
Please report a bug at https://github.com/python/mypy/issues
version: 0.920+dev.7576f659d42ee271c78e69d7481b9d49517a49f6
Traceback (most recent call last):
  File "m/bin/mypy", line 8, in <module>
    sys.exit(console_entry())
  File "m/lib/python3.9/site-packages/mypy/__main__.py", line 11, in console_entry
    main(None, sys.stdout, sys.stderr)
  File "m/lib/python3.9/site-packages/mypy/main.py", line 87, in main
    res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr)
  File "m/lib/python3.9/site-packages/mypy/main.py", line 165, in run_build
    res = build.build(sources, options, None, flush_errors, fscache, stdout, stderr)
  File "m/lib/python3.9/site-packages/mypy/build.py", line 179, in build
    result = _build(
  File "m/lib/python3.9/site-packages/mypy/build.py", line 254, in _build
    graph = dispatch(sources, manager, stdout)
  File "m/lib/python3.9/site-packages/mypy/build.py", line 2707, in dispatch
    process_graph(graph, manager)
  File "m/lib/python3.9/site-packages/mypy/build.py", line 3031, in process_graph
    process_stale_scc(graph, scc, manager)
  File "m/lib/python3.9/site-packages/mypy/build.py", line 3129, in process_stale_scc
    graph[id].type_check_first_pass()
  File "m/lib/python3.9/site-packages/mypy/build.py", line 2175, in type_check_first_pass
    self.type_checker().check_first_pass()
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 295, in check_first_pass
    self.accept(d)
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 402, in accept
    stmt.accept(self)
  File "m/lib/python3.9/site-packages/mypy/nodes.py", line 959, in accept
    return visitor.visit_class_def(self)
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 1734, in visit_class_def
    self.accept(defn.defs)
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 402, in accept
    stmt.accept(self)
  File "m/lib/python3.9/site-packages/mypy/nodes.py", line 1024, in accept
    return visitor.visit_block(self)
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 1996, in visit_block
    self.accept(s)
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 402, in accept
    stmt.accept(self)
  File "m/lib/python3.9/site-packages/mypy/nodes.py", line 530, in accept
    return visitor.visit_overloaded_func_def(self)
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 435, in visit_overloaded_func_def
    self._visit_overloaded_func_def(defn)
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 462, in _visit_overloaded_func_def
    self.check_overlapping_overloads(defn)
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 526, in check_overlapping_overloads
    if is_unsafe_overlapping_overload_signatures(sig1, sig2):
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 5478, in is_unsafe_overlapping_overload_signatures
    return (is_callable_compatible(signature, other,
  File "m/lib/python3.9/site-packages/mypy/subtypes.py", line 879, in is_callable_compatible
    if not ignore_return and not is_compat_return(left.ret_type, right.ret_type):
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 5480, in <lambda>
    is_compat_return=lambda l, r: not is_subtype_no_promote(l, r),
  File "m/lib/python3.9/site-packages/mypy/checker.py", line 5958, in is_subtype_no_promote
    return is_subtype(left, right, ignore_promotions=True)
  File "m/lib/python3.9/site-packages/mypy/subtypes.py", line 93, in is_subtype
    return _is_subtype(left, right,
  File "m/lib/python3.9/site-packages/mypy/subtypes.py", line 147, in _is_subtype
    return left.accept(SubtypeVisitor(orig_right,
  File "m/lib/python3.9/site-packages/mypy/types.py", line 858, in accept
    return visitor.visit_instance(self)
  File "m/lib/python3.9/site-packages/mypy/subtypes.py", line 276, in visit_instance
    if right.type.is_protocol and is_protocol_implementation(left, right):
  File "m/lib/python3.9/site-packages/mypy/subtypes.py", line 559, in is_protocol_implementation
    supertype = get_proper_type(find_member(member, right, left))
  File "m/lib/python3.9/site-packages/mypy/subtypes.py", line 626, in find_member
    return find_node_type(method, itype, subtype)
  File "m/lib/python3.9/site-packages/mypy/subtypes.py", line 716, in find_node_type
    signature = bind_self(typ, subtype)
  File "m/lib/python3.9/site-packages/mypy/typeops.py", line 239, in bind_self
    typeargs = infer_type_arguments(all_ids, self_param_type, original_type,
  File "m/lib/python3.9/site-packages/mypy/infer.py", line 45, in infer_type_arguments
    constraints = infer_constraints(template, actual,
  File "m/lib/python3.9/site-packages/mypy/constraints.py", line 101, in infer_constraints
    return _infer_constraints(template, actual, direction)
  File "m/lib/python3.9/site-packages/mypy/constraints.py", line 174, in _infer_constraints
    return template.accept(ConstraintBuilderVisitor(actual, direction))
  File "m/lib/python3.9/site-packages/mypy/types.py", line 858, in accept
    return visitor.visit_instance(self)
  File "m/lib/python3.9/site-packages/mypy/constraints.py", line 399, in visit_instance
    mypy.subtypes.is_protocol_implementation(instance, erased)):
  File "m/lib/python3.9/site-packages/mypy/subtypes.py", line 559, in is_protocol_implementation
    supertype = get_proper_type(find_member(member, right, left))
  File "m/lib/python3.9/site-packages/mypy/subtypes.py", line 626, in find_member
    return find_node_type(method, itype, subtype)
  File "m/lib/python3.9/site-packages/mypy/subtypes.py", line 716, in find_node_type
    signature = bind_self(typ, subtype)
  File "m/lib/python3.9/site-packages/mypy/typeops.py", line 239, in bind_self
    typeargs = infer_type_arguments(all_ids, self_param_type, original_type,
  File "m/lib/python3.9/site-packages/mypy/infer.py", line 45, in infer_type_arguments
    constraints = infer_constraints(template, actual,
  File "m/lib/python3.9/site-packages/mypy/constraints.py", line 101, in infer_constraints
    return _infer_constraints(template, actual, direction)
  File "m/lib/python3.9/site-packages/mypy/constraints.py", line 174, in _infer_constraints
    return template.accept(ConstraintBuilderVisitor(actual, direction))
  File "m/lib/python3.9/site-packages/mypy/types.py", line 858, in accept
    return visitor.visit_instance(self)
  File "m/lib/python3.9/site-packages/mypy/constraints.py", line 401, in visit_instance
    self.infer_constraints_from_protocol_members(res, instance, template,
  File "m/lib/python3.9/site-packages/mypy/constraints.py", line 447, in infer_constraints_from_protocol_members
    assert inst is not None and temp is not None
AssertionError: 
a.py:10: : note: use --pdb to drop into pdb

Your Environment

  • Mypy version used: mypy 0.920+dev.7576f659d42ee271c78e69d7481b9d49517a49f6 ; and also mypy 0.910
  • Mypy command-line flags: --show-traceback a.py
  • No mypy.ini or config files.
  • Python version used: Python 3.9
  • Operating system and version: Debian 11

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions