Skip to content

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

Closed

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]

Activity

  1. AlexWaygood commented on Mar 26, 2022

    @AlexWaygood
    Member

    Similar traceback to #11981 and #11686

  2. added a commit that references this issue on Nov 6, 2022
    e57eefe
  3. added a commit that references this issue on Nov 7, 2022
    d2a3e66
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