REPLs don't handle `SystemError` from the compiler
Open
@johnslavik is already working on this.
Since Jun 1, 2026.
3.14
3.15
3.16
stdlib
topic-repl
type-bug
- Dominant language
- Python
- Stars
- 77.2k
- Forks
- 35.9k
- PR merge metrics
- PR metrics pending
Description
Bug report
Bug description:
During investigating #150700 I found that running the snippet class X: [(lambda: __class__)() for () in ()] causes the following bugs to appear:
- The REPL leaks
_IncompleteInputError, which aborts writing the user input to history - The user input isn't shown;
Tracebackis shown immediately after the prompt string>>>
❯ ./python.exe
Python 3.16.0a0 (heads/gh-143535-singledispatchmethod-dispatches-on-first-argument:fad06746051, M) [Clang 17.0.0 (clang-1700.6.3.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> Traceback (most recent call last):r () in ()]
File "/Users/bartosz.slawecki/Python/cpython/Lib/codeop.py", line 64, in _maybe_compile
compiler(source, filename, symbol, flags=flags)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/bartosz.slawecki/Python/cpython/Lib/codeop.py", line 117, in __call__
codeob = compile(source, filename, symbol, flags, True)
File "<stdin>", line 1
class X: [(lambda: __class__)() for () in ()]
^
_IncompleteInputError: incomplete input
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/readline.py", line 406, in multiline_input
return reader.readline()
~~~~~~~~~~~~~~~^^
File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/reader.py", line 1021, in readline
self.handle1()
~~~~~~~~~~~~^^
File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/reader.py", line 1004, in handle1
self.do_cmd(cmd)
~~~~~~~~~~~^^^^^
File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/reader.py", line 924, in do_cmd
command.do()
~~~~~~~~~~^^
File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/readline.py", line 297, in do
r.more_lines is not None and r.more_lines(text)
~~~~~~~~~~~~^^^^^^
File "/Users/bartosz.slawecki/Python/cpython/Lib/_pyrepl/simple_interact.py", line 85, in _more_lines
code = console.compile(src, "<stdin>", "single")
File "/Users/bartosz.slawecki/Python/cpython/Lib/codeop.py", line 154, in __call__
return _maybe_compile(self.compiler, source, filename, symbol, flags=self.compiler.flags)
File "/Users/bartosz.slawecki/Python/cpython/Lib/codeop.py", line 67, in _maybe_compile
compiler(source + "\n", filename, symbol, flags=flags)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/bartosz.slawecki/Python/cpython/Lib/codeop.py", line 117, in __call__
codeob = compile(source, filename, symbol, flags, True)
SystemError: compiler_lookup_arg(name='__class__') with reftype=5 failed in X; freevars of code <lambda>: ('__class__',)
I believe SystemError should be handled.
CPython versions tested on:
3.14, 3.15, 3.16, CPython main branch
Operating systems tested on:
macOS
Linked PRs
- gh-151480
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.