Skip to content

[mypy 1.6 regression] Crash involving ParamSpec, TypeAlias and overloads #16245

Description

@AlexWaygood

Running mypy on this code causes it to crash, and exit without a traceback or error message, if you're using mypy 1.6:

fromtypingimportCallable, Protocol, TypeVar, overloadfromtyping_extensionsimportParamSpec, TypeAlias_P=ParamSpec("_P")
_R_co=TypeVar("_R_co", covariant=True)
_Handler: TypeAlias=Callable[_P, _R_co]
class_HandlerDecorator(Protocol):
def__call__(self, handler: _Handler[_P, _R_co]) ->_Handler[_P, _R_co]: ...
@overloaddefevent(event_handler: _Handler[_P, _R_co]) ->_Handler[_P, _R_co]: ...
@overloaddefevent(namespace: str, *args, **kwargs) ->_HandlerDecorator: ...

If you use mypy master, it prints a verrrry long traceback to the terminal indicating a RecursionError. Here's a small excerpt from the end of the traceback:

 File "C:\Users\alexw\coding\mypy\mypy\types.py", line 756, in acceptreturn visitor.visit_param_spec(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\alexw\coding\mypy\mypy\expandtype.py", line 252, in visit_param_specself.expand_types(t.prefix.arg_types + repl.arg_types),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\alexw\coding\mypy\mypy\expandtype.py", line 458, in expand_types
a.append(t.accept(self))
^^^^^^^^^^^^^^
File "C:\Users\alexw\coding\mypy\mypy\types.py", line 398, in acceptreturn visitor.visit_type_alias_type(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\alexw\coding\mypy\mypy\expandtype.py", line 451, in visit_type_alias_type
args =self.expand_types_with_unpack(t.args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\alexw\coding\mypy\mypy\expandtype.py", line 393, in expand_types_with_unpack
items.append(item.accept(self))
^^^^^^^^^^^^^^^^^
File "C:\Users\alexw\coding\mypy\mypy\types.py", line 756, in acceptreturn visitor.visit_param_spec(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\alexw\coding\mypy\mypy\expandtype.py", line 239, in visit_param_spec
repl =self.variables.get(t.id, t.copy_modified(prefix=Parameters([], [], [])))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\alexw\coding\mypy\mypy\types.py", line 743, in copy_modifiedreturn ParamSpecType(
^^^^^^^^^^^^^^
File "C:\Users\alexw\coding\mypy\mypy\types.py", line 719, in __init__super().__init__(name, fullname, id, upper_bound, default, line=line, column=column)
File "C:\Users\alexw\coding\mypy\mypy\types.py", line 554, in __init__super().__init__(line, column)
RecursionError: maximum recursion depth exceeded

On mypy 1.5.1, mypy had this output when checking this code:

crasher.py:11: error: An overloaded function outside a stub file must have an implementation [no-overload-impl]
crasher.py:12: error: Overloaded function signatures 1 and 2 overlap with incompatible return types [misc]
Found 2 errors in 1 file (checked 1 source file)

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions