Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Overriding definition such as type alias in a subclass causes a crash #5425

Closed
Michael0x2a opened this issue Aug 7, 2018 · 4 comments · Fixed by #13015
Closed

Overriding definition such as type alias in a subclass causes a crash #5425

Michael0x2a opened this issue Aug 7, 2018 · 4 comments · Fixed by #13015
Labels
crash priority-0-high topic-inheritance Inheritance and incompatible overrides topic-type-alias TypeAlias and other type alias issues

Comments

@Michael0x2a
Copy link
Collaborator

The following program crashes on both mypy 0.620 and the latest version on master:

from typing import Any, Callable

class Parent:
    foo = Callable[..., int] 

class Child(Parent):
    def foo(self, val: int) -> int:
        return val * 2

(In this case, I meant to do foo: Callable[..., int].)

Here's the traceback:

test.py:13: error: INTERNAL ERROR -- please report a bug at https://github.com/python/mypy/
issues version: 0.630+dev-1222c9637b673bcca6218a943cd4b88b8749b0ad
Traceback (most recent call last):
  File "C:\Python3.6\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Python3.6\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\Michael\Dropbox\mypy\mypy\__main__.py", line 11, in <module>
    main(None)
  File "C:\Users\Michael\Dropbox\mypy\mypy\main.py", line 91, in main
    res = type_check_only(sources, bin_dir, options, flush_errors, fscache)  # noqa
  File "C:\Users\Michael\Dropbox\mypy\mypy\main.py", line 148, in type_check_only
    fscache=fscache)
  File "C:\Users\Michael\Dropbox\mypy\mypy\build.py", line 177, in build
    flush_errors, fscache)
  File "C:\Users\Michael\Dropbox\mypy\mypy\build.py", line 350, in _build
    graph = dispatch(sources, manager)
  File "C:\Users\Michael\Dropbox\mypy\mypy\build.py", line 2572, in dispatch
    process_graph(graph, manager)
  File "C:\Users\Michael\Dropbox\mypy\mypy\build.py", line 2866, in process_graph
    process_stale_scc(graph, scc, manager)
  File "C:\Users\Michael\Dropbox\mypy\mypy\build.py", line 2989, in process_stale_scc
    graph[id].type_check_first_pass()
  File "C:\Users\Michael\Dropbox\mypy\mypy\build.py", line 2162, in type_check_first_pass
    self.type_checker().check_first_pass()
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 253, in check_first_pass
    self.accept(d)
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 352, in accept
    stmt.accept(self)
  File "C:\Users\Michael\Dropbox\mypy\mypy\nodes.py", line 808, in accept
    return visitor.visit_class_def(self)
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 1389, in visit_class_def
    self.accept(defn.defs)
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 352, in accept
    stmt.accept(self)
  File "C:\Users\Michael\Dropbox\mypy\mypy\nodes.py", line 873, in accept
    return visitor.visit_block(self)
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 1535, in visit_block
    self.accept(s)
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 352, in accept
    stmt.accept(self)
  File "C:\Users\Michael\Dropbox\mypy\mypy\nodes.py", line 591, in accept
    return visitor.visit_func_def(self)
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 663, in visit_func_def
    self._visit_func_def(defn)
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 674, in _visit_func_def
    self.check_method_override(defn)
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 1200, in check_method_override
    self.check_method_or_accessor_override_for_base(defn, base)
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 1210, in check_method_or_accessor_override_for_base
    self.check_method_override_for_base_with_name(defn, name, base)
  File "C:\Users\Michael\Dropbox\mypy\mypy\checker.py", line 1254, in check_method_override_for_base_with_name
    assert False, str(base_attr.node)
AssertionError: <mypy.nodes.TypeAlias object at 0x000002139F12C588>
test.py:13: : note: use --pdb to drop into pdb

I did a cursory skim of the existing crash issues, but maybe this is already a known issue? If so, feel free to close.

@ilevkivskyi
Copy link
Member

I think this is a new crash caused by the recent refactoring, previously type aliases were just Vars (hence the assert), but now they have a new dedicated SymbolNode. The fix is straightforward however.

@ilevkivskyi ilevkivskyi self-assigned this Aug 7, 2018
@JukkaL JukkaL changed the title Overriding a type alias in a subclass causes a crash Overriding definition such as type alias in a subclass causes a crash Sep 24, 2018
@JukkaL
Copy link
Collaborator

JukkaL commented Sep 24, 2018

As discussed in #5662, similar crashes are possible for other kinds of overrides. We should verify that all combinations of base class / subclass node types are handled correctly, including these:

  • Variable
  • Method
  • Type alias
  • Type variable
  • Class definition
  • Module reference
  • Other special assignments (new type, named tuple, typed dict)

@pdeblanc
Copy link

I have an example for a crash on a trivial override (i.e. not changing the type):

from typing import Generic, TypeVar

T = TypeVar('T')


class Parent(Generic[T]):
    def __init__(self, value: T) -> None:
        self.value: T = value


class Child(Parent[T]):
    def __init__(self, value: T) -> None:
        self.value: T = value

Mypy:

➜  ~ git:(mypy-bug) ✗ mypy --version
mypy 0.701
➜  ~ git:(mypy-bug) ✗ mypy foo.py --show-traceback
foo.py:13: error: INTERNAL ERROR -- please report a bug at https://github.com/python/mypy/issues version: 0.701
Traceback (most recent call last):
  File "/usr/local/bin/mypy", line 10, in <module>
    sys.exit(console_entry())
  File "mypy/checker.py", line 395, in accept
  File "mypy/nodes.py", line 1019, in accept
  File "mypy/checker.py", line 1711, in visit_assignment_stmt__StatementVisitor_glue
  File "mypy/checker.py", line 1717, in visit_assignment_stmt
  File "mypy/checker.py", line 1777, in check_assignment
  File "mypy/checker.py", line 1880, in check_compatibility_all_supers
  File "mypy/checker.py", line 1967, in lvalue_type_from_base
AssertionError: Internal error: base lookup outside class
foo.py:13: : note: use --pdb to drop into pdb

@ilevkivskyi
Copy link
Member

@pdeblanc I think what you see is a symptom of another horrible crash #5846

ilevkivskyi added a commit that referenced this issue Jul 18, 2019
Fixes #5846

The fix for crash is kind of straightforward. Previously `active_self_type()` always returned `None` at method scope (sic!)

While working on this I discovered couple other problems:
* Area around checking LSP is generally problematic (see also #5425 that I tried to fix earlier but failed). In particular, the are two ways to get current `TypeInfo`, one is from `lvalue.node.info` or `defn.info`, another is using `active_self_type()` (this is rather abusing it IMO). I don't try to fix this here (i.e. switch to always using one way) because this is a relatively large refactoring.
* Currently in type checker we defer nested functions instead of top-level ones. I believe this is not by design and is rather caused by absence of docstrings and unintuitive method names in `CheckerScope` class. Namely, there "top function" stays for "top of stack function", not "top-level function". I don't try to fix this here either because this is conceptually a big change.
@ilevkivskyi ilevkivskyi removed their assignment Dec 9, 2019
@AlexWaygood AlexWaygood added topic-type-alias TypeAlias and other type alias issues topic-inheritance Inheritance and incompatible overrides labels Apr 8, 2022
wesleywright added a commit to wesleywright/mypy that referenced this issue Jun 23, 2022
wesleywright added a commit to wesleywright/mypy that referenced this issue Jun 23, 2022
JukkaL pushed a commit that referenced this issue Jun 24, 2022
…same name as type alias (#13015)

Work on #5425

Co-authored-by: Wesley Wright <wesleyw@dropbox.com>
Gobot1234 pushed a commit to Gobot1234/mypy that referenced this issue Aug 12, 2022
…same name as type alias (python#13015)

Work on python#5425

Co-authored-by: Wesley Wright <wesleyw@dropbox.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
crash priority-0-high topic-inheritance Inheritance and incompatible overrides topic-type-alias TypeAlias and other type alias issues
Projects
None yet
5 participants