Skip to content

Crash on super call in function with type variable #2361

Closed

Description

@ddfisher

#2193 causes a crash when calling super in function which takes a generic argument (even if the generic argument is unused). Here's the minimum reproducer I've found:

from typing import TypeVar

T = TypeVar('T', int, str)

class A:
    pass

class B(A):
    def __init__(self, arg):
        # type: (T) -> None
        super(B, self).__init__()

@JukkaL @elazarg could you take a look?

Activity

  1. ddfisher commented on Oct 28, 2016

    @ddfisher
    CollaboratorAuthor

    Here's the traceback (it's for the last line of the file):

    Traceback (most recent call last):
      File "/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/runpy.py", line 184, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/Users/ddfisher/src/mypy/mypy/__main__.py", line 5, in <module>
        main(None)
      File "/Users/ddfisher/src/mypy/mypy/main.py", line 41, in main
        res = type_check_only(sources, bin_dir, options)
      File "/Users/ddfisher/src/mypy/mypy/main.py", line 86, in type_check_only
        options=options)
      File "/Users/ddfisher/src/mypy/mypy/build.py", line 180, in build
        dispatch(sources, manager)
      File "/Users/ddfisher/src/mypy/mypy/build.py", line 1509, in dispatch
        process_graph(graph, manager)
      File "/Users/ddfisher/src/mypy/mypy/build.py", line 1689, in process_graph
        process_stale_scc(graph, scc)
      File "/Users/ddfisher/src/mypy/mypy/build.py", line 1768, in process_stale_scc
        graph[id].type_check_first_pass()
      File "/Users/ddfisher/src/mypy/mypy/build.py", line 1437, in type_check_first_pass
        self.type_checker.check_first_pass()
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 178, in check_first_pass
        self.accept(d)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 237, in accept
        typ = node.accept(self)
      File "/Users/ddfisher/src/mypy/mypy/nodes.py", line 709, in accept
        return visitor.visit_class_def(self)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 977, in visit_class_def
        self.accept(defn.defs)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 237, in accept
        typ = node.accept(self)
      File "/Users/ddfisher/src/mypy/mypy/nodes.py", line 770, in accept
        return visitor.visit_block(self)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 1069, in visit_block
        self.accept(s)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 237, in accept
        typ = node.accept(self)
      File "/Users/ddfisher/src/mypy/mypy/nodes.py", line 531, in accept
        return visitor.visit_func_def(self)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 448, in visit_func_def
        self.check_func_item(defn, name=defn.name())
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 511, in check_func_item
        self.check_func_def(defn, typ, name)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 633, in check_func_def
        self.accept(item.body)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 237, in accept
        typ = node.accept(self)
      File "/Users/ddfisher/src/mypy/mypy/nodes.py", line 770, in accept
        return visitor.visit_block(self)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 1069, in visit_block
        self.accept(s)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 237, in accept
        typ = node.accept(self)
      File "/Users/ddfisher/src/mypy/mypy/nodes.py", line 784, in accept
        return visitor.visit_expression_stmt(self)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 1502, in visit_expression_stmt
        self.accept(s.expr)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 237, in accept
        typ = node.accept(self)
      File "/Users/ddfisher/src/mypy/mypy/nodes.py", line 1246, in accept
        return visitor.visit_call_expr(self)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 1933, in visit_call_expr
        return self.expr_checker.visit_call_expr(e)
      File "/Users/ddfisher/src/mypy/mypy/checkexpr.py", line 170, in visit_call_expr
        callee_type = self.accept(e.callee)
      File "/Users/ddfisher/src/mypy/mypy/checkexpr.py", line 1759, in accept
        return self.chk.accept(node, context)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 237, in accept
        typ = node.accept(self)
      File "/Users/ddfisher/src/mypy/mypy/nodes.py", line 1474, in accept
        return visitor.visit_super_expr(self)
      File "/Users/ddfisher/src/mypy/mypy/checker.py", line 2069, in visit_super_expr
        return self.expr_checker.visit_super_expr(e)
      File "/Users/ddfisher/src/mypy/mypy/checkexpr.py", line 1587, in visit_super_expr
        t = self.analyze_super(e, False)
      File "/Users/ddfisher/src/mypy/mypy/checkexpr.py", line 1617, in analyze_super
        original_type=declared_self)
      File "/Users/ddfisher/src/mypy/mypy/checkmember.py", line 185, in analyze_member_access
        return msg.has_no_attr(original_type, name, node)
      File "/Users/ddfisher/src/mypy/mypy/messages.py", line 355, in has_no_attr
        self.fail('{} has no attribute "{}"'.format(self.format(typ),
      File "/Users/ddfisher/src/mypy/mypy/messages.py", line 150, in format
        s = self.format_simple(typ, verbosity)
      File "/Users/ddfisher/src/mypy/mypy/messages.py", line 269, in format_simple
        raise RuntimeError('Type is None')
    RuntimeError: Type is None
    
  2. elazarg commented on Oct 28, 2016

    @elazarg
    Contributor

    Ouch. I think it's what we discussed here. But I will dig deeper.

  3. elazarg commented on Oct 28, 2016

    @elazarg
    Contributor

    Reverting mypy/checkexpr:1612 to typ=fill_typevars(e.info) avoids the crash. Of course it doesn't mean that's the right fix.

  4. JukkaL commented on Jan 16, 2017

    @JukkaL
    Collaborator

    This seems to work now.

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions