Skip to content

Crashes related to calling isinstance() on a NamedTuple #3419

Closed
@JelleZijlstra

Description

@JelleZijlstra

I found two separate tracebacks playing with variations on the code from #3418:

from typing import Dict, NamedTuple

NameDict = Dict[str, 'NameInfo']

class NameInfo(NamedTuple):
    ast: bool

def parse_ast(name_dict: NameDict) -> None:
    if isinstance(name_dict[''], int):
        pass

produces

Traceback (most recent call last):
  File "/Users/jzijlstra-mpbt/py/venvs/venv36/bin/mypy", line 6, in <module>
    exec(compile(open(__file__).read(), __file__, 'exec'))
  File "/Users/jzijlstra-mpbt/py/mypy/scripts/mypy", line 6, in <module>
    main(__file__)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/main.py", line 46, in main
    res = type_check_only(sources, bin_dir, options)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/main.py", line 93, in type_check_only
    options=options)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 188, in build
    graph = dispatch(sources, manager)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1595, in dispatch
    process_graph(graph, manager)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1838, in process_graph
    process_stale_scc(graph, scc, manager)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1937, in process_stale_scc
    graph[id].type_check_first_pass()
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1510, in type_check_first_pass
    self.type_checker.check_first_pass()
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 177, in check_first_pass
    self.accept(d)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
    stmt.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 565, in accept
    return visitor.visit_func_def(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 510, in visit_func_def
    self.check_func_item(defn, name=defn.name())
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 569, in check_func_item
    self.check_func_def(defn, typ, name)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 718, in check_func_def
    self.accept(item.body)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
    stmt.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 811, in accept
    return visitor.visit_block(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1173, in visit_block
    self.accept(s)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
    stmt.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 970, in accept
    return visitor.visit_if_stmt(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1916, in visit_if_stmt
    if_map, else_map = self.find_isinstance_check(e)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 2477, in find_isinstance_check
    return find_isinstance_check(n, self.type_map)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 2731, in find_isinstance_check
    return conditional_type_map(expr, vartype, type)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 2531, in conditional_type_map
    and is_proper_subtype(current_type, proposed_type)):
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/subtypes.py", line 558, in is_proper_subtype
    return left.accept(ProperSubtypeVisitor(right))
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/types.py", line 411, in accept
    return visitor.visit_instance(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/subtypes.py", line 594, in visit_instance
    for base in left.type.mro:
TypeError: 'NoneType' object is not iterable
typeshed_client/parser.py:9: note: use --pdb to drop into pdb

The other stack trace I haven't been able to minimize yet, but the traceback is

/Users/jzijlstra-mpbt/py/typeshed_client/typeshed_client/resolver.py:61: error: INTERNAL ERROR -- please report a bug at https://github.com/python/mypy/issues version: 0.520-dev-38453c0ddfaa6660309f782b227bd40b8c4634ba-dirty
Traceback (most recent call last):
  File "/Users/jzijlstra-mpbt/py/venvs/venv36/bin/mypy", line 6, in <module>
    exec(compile(open(__file__).read(), __file__, 'exec'))
  File "/Users/jzijlstra-mpbt/py/mypy/scripts/mypy", line 6, in <module>
    main(__file__)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/main.py", line 46, in main
    res = type_check_only(sources, bin_dir, options)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/main.py", line 93, in type_check_only
    options=options)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 188, in build
    graph = dispatch(sources, manager)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1595, in dispatch
    process_graph(graph, manager)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1838, in process_graph
    process_stale_scc(graph, scc, manager)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1937, in process_stale_scc
    graph[id].type_check_first_pass()
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1510, in type_check_first_pass
    self.type_checker.check_first_pass()
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 177, in check_first_pass
    self.accept(d)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
    stmt.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 750, in accept
    return visitor.visit_class_def(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1080, in visit_class_def
    self.accept(defn.defs)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
    stmt.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 811, in accept
    return visitor.visit_block(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1173, in visit_block
    self.accept(s)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
    stmt.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 565, in accept
    return visitor.visit_func_def(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 510, in visit_func_def
    self.check_func_item(defn, name=defn.name())
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 569, in check_func_item
    self.check_func_def(defn, typ, name)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 718, in check_func_def
    self.accept(item.body)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
    stmt.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 811, in accept
    return visitor.visit_block(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1173, in visit_block
    self.accept(s)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
    stmt.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 970, in accept
    return visitor.visit_if_stmt(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1906, in visit_if_stmt
    t = self.expr_checker.accept(e)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 2058, in accept
    typ = node.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 1368, in accept
    return visitor.visit_unary_expr(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 1408, in visit_unary_expr
    operand_type = self.accept(e.expr)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 2058, in accept
    typ = node.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 1303, in accept
    return visitor.visit_call_expr(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 201, in visit_call_expr
    ret_type = self.check_call_expr_with_callee_type(callee_type, e)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 341, in check_call_expr_with_callee_type
    e.arg_names, callable_node=e.callee)[0]
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 393, in check_call
    callee, args, arg_kinds, formal_to_actual)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 538, in infer_arg_types_in_context2
    res[ai] = self.accept(args[ai], callee.arg_types[i])
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 2058, in accept
    typ = node.accept(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 1256, in accept
    return visitor.visit_member_expr(self)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 1012, in visit_member_expr
    result = self.analyze_ordinary_member_access(e, False)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 1027, in analyze_ordinary_member_access
    original_type=original_type, chk=self.chk)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkmember.py", line 100, in analyze_member_access
    original_type=original_type, chk=chk)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkmember.py", line 222, in analyze_member_var_access
    v = lookup_member_var_or_accessor(info, name, is_lvalue)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkmember.py", line 341, in lookup_member_var_or_accessor
    node = info.get(name)
  File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 2033, in get
    for cls in self.mro:
TypeError: 'NoneType' object is not iterable
/Users/jzijlstra-mpbt/py/typeshed_client/typeshed_client/resolver.py:61: note: use --pdb to drop into pdb

The crashing line is if not isinstance(info.ast, parser.ImportedName):, where info is a NameInfo from the above example. I think it's likely the same underlying bug.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions