Skip to content

"Consistent AST position" crashes pytest: "ValueError: line 22-0 is not a valid range" #93387

Closed
@nedbat

Description

@nedbat

Bug report

The coverage.py test suite fails to even start on 3.11.0b2, because of a crash inside pytest related to code positions. This is the error from a nightly build:

py311 run-test: commands[3] | python igor.py test_with_tracer c -rfsEX
  === CPython 3.11.0b1+ with C tracer (.tox/py311/bin/python) ===
  Traceback (most recent call last):
    File "/home/runner/work/coveragepy/coveragepy/igor.py", line 474, in <module>
      sys.exit(main(sys.argv[1:]))
               ^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/igor.py", line 466, in main
      ret = handler(*handler_args)
            ^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/igor.py", line 239, in do_test_with_tracer
      return run_tests(tracer, *runner_args)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/igor.py", line 152, in run_tests
      return pytest.main(list(runner_args))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/_pytest/config/__init__.py", line 145, in main
      config = _prepareconfig(args, plugins)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/_pytest/config/__init__.py", line 324, in _prepareconfig
      config = pluginmanager.hook.pytest_cmdline_parse(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/pluggy/_hooks.py", line 265, in __call__
      return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/pluggy/_manager.py", line 80, in _hookexec
      return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/pluggy/_callers.py", line 55, in _multicall
      gen.send(outcome)
      ^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/_pytest/helpconfig.py", line 102, in pytest_cmdline_parse
      config: Config = outcome.get_result()
                       ^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/pluggy/_result.py", line 60, in get_result
      raise ex[1].with_traceback(ex[2])
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/pluggy/_callers.py", line 39, in _multicall
      res = hook_impl.function(*args)
            ^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/_pytest/config/__init__.py", line 1016, in pytest_cmdline_parse
      self.parse(args)
      ^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/_pytest/config/__init__.py", line 1304, in parse
      self._preparse(args, addopts=addopts)
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/_pytest/config/__init__.py", line 1187, in _preparse
      self.pluginmanager.load_setuptools_entrypoints("pytest11")
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/pluggy/_manager.py", line 287, in load_setuptools_entrypoints
      plugin = ep.load()
               ^^^^^^^^^
    File "/usr/lib/python3.11/importlib/metadata/__init__.py", line 198, in load
      module = import_module(match.group('module'))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/importlib/__init__.py", line 126, in import_module
      return _bootstrap._gcd_import(name[level:], package, level)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "<frozen importlib._bootstrap>", line 1206, in _gcd_import
    File "<frozen importlib._bootstrap>", line 1178, in _find_and_load
    File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked
    File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/_pytest/assertion/rewrite.py", line 159, in exec_module
      source_stat, co = _rewrite_test(fn, self.config)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/runner/work/coveragepy/coveragepy/.tox/py311/lib/python3.11/site-packages/_pytest/assertion/rewrite.py", line 361, in _rewrite_test
      co = compile(tree, strfn, "exec", dont_inherit=True)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ValueError: line 22-0 is not a valid range

When I run the test suite locally with 3.11.0b2, I get the same traceback, but the message is "line 1-0 is not a valid range".

Running pytest directly, rather than through my helper doesn't fail.

I git bisected: the first bad commit was:

7f6e6abdc43d9b61d81eb26b9fb2073dccf6a3cb is the first bad commit
commit 7f6e6abdc43d9b61d81eb26b9fb2073dccf6a3cb
Author: Miss Islington (bot) <[email protected]>
Date:   Mon May 30 11:52:36 2022 -0700

    gh-93351: Ensure the position information in AST nodes created by the parser is always consistent (GH-93352)

    (cherry picked from commit 5893b5db98b38b17750c0572c7209774a5034898)

    Co-authored-by: Pablo Galindo Salgado <[email protected]>

 Lib/test/test_ast.py | 27 +++++++++++++++++++++++++++
 Python/ast.c         | 26 ++++++++++++++++++++++++++
 2 files changed, 53 insertions(+)

Your environment

  • CPython versions tested on: 3.11.0b1 works, 3.11.0b2 fails.
  • Operating system and architecture: Mac OS 10.15.7

To reproduce

$ mktmpenv -p python3.10    # or some other way to create an environment
$ git clone https://github.com/nedbat/coveragepy
$ cd coveragepy
$ pip install tox
$ tox -e py311

Metadata

Metadata

Assignees

No one assigned

    Labels

    type-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions