Skip to content

Crash with Generic Class and Dict #18996

Open
@mscheifer

Description

@mscheifer

Crash Report

I first encountered the bug on a project where I had just started trying to implement the new generic type syntax introduced in Python 3.12. I initially saw this bug with mypy 1.15 but it also occurs on the current master branch.

Traceback

repro.py:5: 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: 1.16.0+dev.7b4f6311e29452cc8d4ddb78331d0047c8b17e93
Traceback (most recent call last):
  File "/home/matthew/code/mypy/venv/bin/mypy", line 8, in <module>
    sys.exit(console_entry())
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/__main__.py", line 15, in console_entry
    main()
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/main.py", line 127, in main
    res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/main.py", line 211, in run_build
    res = build.build(sources, options, None, flush_errors, fscache, stdout, stderr)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/build.py", line 191, in build
    result = _build(
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/build.py", line 267, in _build
    graph = dispatch(sources, manager, stdout)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/build.py", line 2939, in dispatch
    process_graph(graph, manager)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/build.py", line 3337, in process_graph
    process_stale_scc(graph, scc, manager)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/build.py", line 3438, in process_stale_scc
    graph[id].type_check_first_pass()
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/build.py", line 2311, in type_check_first_pass
    self.type_checker().check_first_pass()
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 472, in check_first_pass
    self.accept(d)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 579, in accept
    stmt.accept(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/nodes.py", line 1200, in accept
    return visitor.visit_class_def(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 2536, in visit_class_def
    self.accept(defn.defs)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 579, in accept
    stmt.accept(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/nodes.py", line 1281, in accept
    return visitor.visit_block(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 3025, in visit_block
    self.accept(s)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 579, in accept
    stmt.accept(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/nodes.py", line 813, in accept
    return visitor.visit_func_def(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 1129, in visit_func_def
    self._visit_func_def(defn)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 1133, in _visit_func_def
    self.check_func_item(defn, name=defn.name)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 1168, in check_func_item
    self.check_func_def(defn, typ, name, allow_empty)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 1455, in check_func_def
    self.accept(item.body)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 579, in accept
    stmt.accept(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/nodes.py", line 1281, in accept
    return visitor.visit_block(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 3025, in visit_block
    self.accept(s)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 579, in accept
    stmt.accept(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/nodes.py", line 1301, in accept
    return visitor.visit_expression_stmt(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checker.py", line 4711, in visit_expression_stmt
    expr_type = self.expr_checker.accept(s.expr, allow_none_return=True, always_allow_any=True)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checkexpr.py", line 5962, in accept
    typ = self.visit_call_expr(node, allow_none_return=True)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checkexpr.py", line 488, in visit_call_expr
    return self.visit_call_expr_inner(e, allow_none_return=allow_none_return)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checkexpr.py", line 578, in visit_call_expr_inner
    self.accept(e.callee, type_context, always_allow_any=True, is_callee=True)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checkexpr.py", line 5970, in accept
    typ = node.accept(self)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/nodes.py", line 1914, in accept
    return visitor.visit_member_expr(self)
           ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checkexpr.py", line 3342, in visit_member_expr
    result = self.analyze_ordinary_member_access(e, is_lvalue)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checkexpr.py", line 3372, in analyze_ordinary_member_access
    member_type = analyze_member_access(
        e.name,
    ...<10 lines>...
        rvalue=rvalue,
    )
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checkmember.py", line 219, in analyze_member_access
    result = _analyze_member_access(name, typ, mx, override_info)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checkmember.py", line 238, in _analyze_member_access
    return analyze_instance_member_access(name, typ, mx, override_info)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checkmember.py", line 360, in analyze_instance_member_access
    signature = check_self_arg(
        signature, mx.self_type, method.is_class, mx.context, name, mx.msg
    )
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/checkmember.py", line 1038, in check_self_arg
    if subtypes.is_subtype(
       ~~~~~~~~~~~~~~~~~~~^
        dispatched_arg_type,
        ^^^^^^^^^^^^^^^^^^^^
    ...<6 lines>...
        ignore_pos_arg_names=True,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
    ):
    ^
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/subtypes.py", line 188, in is_subtype
    return _is_subtype(left, right, subtype_context, proper_subtype=False)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/subtypes.py", line 355, in _is_subtype
    return left.accept(SubtypeVisitor(orig_right, subtype_context, proper_subtype))
           ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/types.py", line 1475, in accept
    return visitor.visit_instance(self)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/subtypes.py", line 573, in visit_instance
    infer_class_variances(right.type)
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/subtypes.py", line 2152, in infer_class_variances
    if not infer_variance(info, i):
           ~~~~~~~~~~~~~~^^^^^^^^^
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/subtypes.py", line 2114, in infer_variance
    if not is_subtype(typ, typ2):
           ~~~~~~~~~~^^^^^^^^^^^
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/subtypes.py", line 188, in is_subtype
    return _is_subtype(left, right, subtype_context, proper_subtype=False)
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/subtypes.py", line 355, in _is_subtype
    return left.accept(SubtypeVisitor(orig_right, subtype_context, proper_subtype))
           ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/types.py", line 3039, in accept
    return visitor.visit_partial_type(self)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/home/matthew/code/mypy/venv/lib/python3.13/site-packages/mypy/subtypes.py", line 1088, in visit_partial_type
    raise RuntimeError(f'Partial type "{left}" cannot be checked with "issubtype()"')
RuntimeError: Partial type "<partial dict[?, ?]>" cannot be checked with "issubtype()"
repro.py:5: : note: use --pdb to drop into pdb

To Reproduce

$ mypy repro.py

repro.py:

class Repro[T]:
    def __init__(self, v) -> None:
        self.storage = {}

        self.foo()

    def foo(self):
        pass

This is as minimal as I could get it.

Your Environment

  • Mypy version used: mypy 1.16.0+dev.7b4f6311e29452cc8d4ddb78331d0047c8b17e93 (compiled: no)
  • Mypy command-line flags: None
  • Mypy configuration options from mypy.ini (and other config files): None
  • Python version used: Python 3.13.2
  • Operating system and version: Manjaro Linux

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions