Skip to content

Crash when using try/except in platform-specific code in a function that takes an TypeVar argument #9682

Closed
@cptpcrd

Description

@cptpcrd

Crash Report

I added some platform-specific code to my program in a very specific context, and mypy started crashing with an INTERNAL ERROR. I managed to get it down to a minimal example below.

Traceback

$ mypy bad.py --show-traceback
bad.py:8: error: INTERNAL ERROR -- Please try using mypy master on Github:
https://mypy.rtfd.io/en/latest/common_issues.html#using-a-development-mypy-build
Please report a bug at https://github.com/python/mypy/issues
version: 0.790
Traceback (most recent call last):
  File "/usr/bin/mypy", line 33, in <module>
    sys.exit(load_entry_point('mypy==0.790', 'console_scripts', 'mypy')())
  File "/usr/lib/python3.8/site-packages/mypy/__main__.py", line 8, in console_entry
    main(None, sys.stdout, sys.stderr)
  File "/usr/lib/python3.8/site-packages/mypy/main.py", line 90, in main
    res = build.build(sources, options, None, flush_errors, fscache, stdout, stderr)
  File "/usr/lib/python3.8/site-packages/mypy/build.py", line 180, in build
    result = _build(
  File "/usr/lib/python3.8/site-packages/mypy/build.py", line 254, in _build
    graph = dispatch(sources, manager, stdout)
  File "/usr/lib/python3.8/site-packages/mypy/build.py", line 2630, in dispatch
    process_graph(graph, manager)
  File "/usr/lib/python3.8/site-packages/mypy/build.py", line 2953, in process_graph
    process_stale_scc(graph, scc, manager)
  File "/usr/lib/python3.8/site-packages/mypy/build.py", line 3051, in process_stale_scc
    graph[id].type_check_first_pass()
  File "/usr/lib/python3.8/site-packages/mypy/build.py", line 2111, in type_check_first_pass
    self.type_checker().check_first_pass()
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 294, in check_first_pass
    self.accept(d)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 401, in accept
    stmt.accept(self)
  File "/usr/lib/python3.8/site-packages/mypy/nodes.py", line 677, in accept
    return visitor.visit_func_def(self)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 726, in visit_func_def
    self._visit_func_def(defn)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 730, in _visit_func_def
    self.check_func_item(defn, name=defn.name)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 792, in check_func_item
    self.check_func_def(defn, typ, name)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 975, in check_func_def
    self.accept(item.body)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 401, in accept
    stmt.accept(self)
  File "/usr/lib/python3.8/site-packages/mypy/nodes.py", line 1005, in accept
    return visitor.visit_block(self)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 1973, in visit_block
    self.accept(s)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 401, in accept
    stmt.accept(self)
  File "/usr/lib/python3.8/site-packages/mypy/nodes.py", line 1196, in accept
    return visitor.visit_if_stmt(self)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 3256, in visit_if_stmt
    self.accept(b)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 401, in accept
    stmt.accept(self)
  File "/usr/lib/python3.8/site-packages/mypy/nodes.py", line 1005, in accept
    return visitor.visit_block(self)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 1973, in visit_block
    self.accept(s)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 401, in accept
    stmt.accept(self)
  File "/usr/lib/python3.8/site-packages/mypy/nodes.py", line 1196, in accept
    return visitor.visit_if_stmt(self)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 3256, in visit_if_stmt
    self.accept(b)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 401, in accept
    stmt.accept(self)
  File "/usr/lib/python3.8/site-packages/mypy/nodes.py", line 1005, in accept
    return visitor.visit_block(self)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 1973, in visit_block
    self.accept(s)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 401, in accept
    stmt.accept(self)
  File "/usr/lib/python3.8/site-packages/mypy/nodes.py", line 1235, in accept
    return visitor.visit_try_stmt(self)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 3350, in visit_try_stmt
    self.visit_try_without_finally(s, try_frame=bool(s.finally_body))
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 3403, in visit_try_without_finally
    self.check_assignment(var, self.temp_node(t, var))
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 2053, in check_assignment
    lvalue_type, index_lvalue, inferred = self.check_lvalue(lvalue)
  File "/usr/lib/python3.8/site-packages/mypy/checker.py", line 2800, in check_lvalue
    assert isinstance(inferred, Var)
AssertionError: 
bad.py:8: : note: use --pdb to drop into pdb

To Reproduce

I managed to simplify my code down to this:

import sys
from typing import TypeVar

T = TypeVar("T", int, float)

def f(t: T) -> None:
    if sys.platform.startswith("anything"):
        try:
            pass
        except Exception as ex:
            pass

For some reason, it must be in a function that takes TypeVar/AnyStr argument, and it must be in an if statement that performs a sys.platform check that isn't true on the current platform (I've reproduced this on both Linux and Windows).

Your Environment

  • Mypy version used: 0.790 (reproduced against the latest master)
  • Mypy command-line flags: N/A
  • Mypy configuration options from mypy.ini (and other config files): N/A
  • Python version used: 3.8.6
  • Operating system and version: Arch Linux

As mentioned above, I was also able to reproduce this on Windows (Python 3.8.4, mypy 0.790).

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions