Skip to content

INTERNAL ERROR RuntimeError visiting partial-type of imported variable with follow_imports=skip #12109

@chadhpaine

Description

@chadhpaine

Crash Report

mypy 0.931 crashes while checking sources when using follow_imports=skip. Issue not reproduced on mypy 0.910 or with follow_imports=normal.

Traceback

$ PYTHONPATH="./mypyMain/" python.exe -m mypy -p tests.test --show-traceback
C:\mypyrepro\tests\test.py:12: 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.940+dev.3b331b30049bb085485b8aa7c1fe34064cab927e
Traceback (most recent call last):
  File "runpy.py", line 197, in _run_module_as_main
  File "runpy.py", line 87, in _run_code
  File "C:\mypyrepro\mypyMain\mypy\__main__.py", line 34, in <module>
    console_entry()
  File "C:\mypyrepro\mypyMain\mypy\__main__.py", line 12, in console_entry
    main(None, sys.stdout, sys.stderr)
  File "C:\mypyrepro\mypyMain\mypy\main.py", line 96, in main
    res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr)
  File "C:\mypyrepro\mypyMain\mypy\main.py", line 173, in run_build
    res = build.build(sources, options, None, flush_errors, fscache, stdout, stderr)
  File "C:\mypyrepro\mypyMain\mypy\build.py", line 180, in build
    result = _build(
  File "C:\mypyrepro\mypyMain\mypy\build.py", line 256, in _build
    graph = dispatch(sources, manager, stdout)
  File "C:\mypyrepro\mypyMain\mypy\build.py", line 2715, in dispatch
    process_graph(graph, manager)
  File "C:\mypyrepro\mypyMain\mypy\build.py", line 3046, in process_graph
    process_stale_scc(graph, scc, manager)
  File "C:\mypyrepro\mypyMain\mypy\build.py", line 3144, in process_stale_scc
    graph[id].type_check_first_pass()
  File "C:\mypyrepro\mypyMain\mypy\build.py", line 2183, in type_check_first_pass
    self.type_checker().check_first_pass()
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 318, in check_first_pass
    self.accept(d)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 424, in accept
    stmt.accept(self)
  File "C:\mypyrepro\mypyMain\mypy\nodes.py", line 1008, in accept
    return visitor.visit_class_def(self)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 1802, in visit_class_def
    self.accept(defn.defs)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 424, in accept
    stmt.accept(self)
  File "C:\mypyrepro\mypyMain\mypy\nodes.py", line 1077, in accept
    return visitor.visit_block(self)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 2105, in visit_block
    self.accept(s)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 424, in accept
    stmt.accept(self)
  File "C:\mypyrepro\mypyMain\mypy\nodes.py", line 822, in accept
    return visitor.visit_decorator(self)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 3810, in visit_decorator
    self.check_func_item(e.func, name=e.func.name)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 840, in check_func_item
    self.check_func_def(defn, typ, name)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 1025, in check_func_def
    self.accept(item.body)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 424, in accept
    stmt.accept(self)
  File "C:\mypyrepro\mypyMain\mypy\nodes.py", line 1077, in accept
    return visitor.visit_block(self)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 2105, in visit_block
    self.accept(s)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 424, in accept
    stmt.accept(self)
  File "C:\mypyrepro\mypyMain\mypy\nodes.py", line 1234, in accept
    return visitor.visit_return_stmt(self)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 3394, in visit_return_stmt
    self.check_return_stmt(s)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 3426, in check_return_stmt
    typ = get_proper_type(self.expr_checker.accept(
  File "C:\mypyrepro\mypyMain\mypy\checkexpr.py", line 3975, in accept
    typ = node.accept(self)
  File "C:\mypyrepro\mypyMain\mypy\nodes.py", line 2069, in accept
    return visitor.visit_generator_expr(self)
  File "C:\mypyrepro\mypyMain\mypy\checkexpr.py", line 3810, in visit_generator_expr
    return self.check_generator_or_comprehension(e, typ, '<generator>',
  File "C:\mypyrepro\mypyMain\mypy\checkexpr.py", line 3820, in check_generator_or_comprehension
    self.check_for_comp(gen)
  File "C:\mypyrepro\mypyMain\mypy\checkexpr.py", line 3874, in check_for_comp
    true_map, false_map = self.chk.find_isinstance_check(condition)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 4447, in find_isinstance_check
    if_map, else_map = self.find_isinstance_check_helper(node)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 4584, in find_isinstance_check_helper
    if_map, else_map = self.refine_identity_comparison_expression(
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 4992, in refine_identity_comparison_expression
    types = conditional_types(expr_type, target_type)
  File "C:\mypyrepro\mypyMain\mypy\checker.py", line 5544, in conditional_types
    remaining_type = restrict_subtype_away(current_type, proposed_precise_type)
  File "C:\mypyrepro\mypyMain\mypy\subtypes.py", line 1153, in restrict_subtype_away
    new_items = [restrict_subtype_away(item, s, ignore_promotions=ignore_promotions)
  File "C:\mypyrepro\mypyMain\mypy\subtypes.py", line 1156, in <listcomp>
    not covers_at_runtime(item, s, ignore_promotions))]
  File "C:\mypyrepro\mypyMain\mypy\subtypes.py", line 1171, in covers_at_runtime
    if is_proper_subtype(erase_type(item), supertype, ignore_promotions=ignore_promotions,
  File "C:\mypyrepro\mypyMain\mypy\erasetype.py", line 25, in erase_type
    return typ.accept(EraseTypeVisitor())
  File "C:\mypyrepro\mypyMain\mypy\types.py", line 2060, in accept
    return visitor.visit_partial_type(self)
  File "C:\mypyrepro\mypyMain\mypy\erasetype.py", line 48, in visit_partial_type
    raise RuntimeError()
RuntimeError:

To Reproduce

Configuration - multiple files required to reproduce

  • __init__.py
  • tests/
    ** __init__.py
    ** test.py
    ** imported.py
  • mypy.ini

__init__.py: empty

tests/__init__.py: empty

tests/test.py:

from typing import Iterable
from enum import Enum

from tests.imported import STRING

class E(Enum):
    a = STRING
    b = None

    @classmethod
    def keys(cls) -> Iterable[str]:
        return (key.name for key in cls if key.value is not None)

print(list(E.keys()))

tests/imported.py:

STRING = ‘string’

mypy.ini:

[mypy]
follow_imports=skip

Your Environment

  • Mypy version used: 0.931
  • Mypy command-line flags: n/a | -p target
  • Mypy configuration options from mypy.ini (and other config files): follow_imports=skip
  • Python version used: Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32
  • Operating system and version: Microsoft Windows [Version 10.0.19044.1469]

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions