Skip to content

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

@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) <31488909+miss-islington@users.noreply.github.com>
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 <Pablogsal@gmail.com>

 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

      pFad - Phonifier reborn

      Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

      Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy