Skip to content

[Bug]: strange false alarm from hypothesis-based test for new GraalPy release #1000

Description

@skirpichev

Describe the bug

I have following new failure in the python-gmp CI tests:

________________________________ test_to_float _________________________________

x = 199506311688075838...7743047925967093760

    @given(bigints())
    @example(117529601297931785)
    @example(1<<64)
    @example(9007199254740993)
    @example(10965857771245191)
    @example(10<<10000)
    @example((1<<53) + 1)
    @example(1<<116)
    @example(646541478744828163276576707651635923929979156076518566789121)
    @example((0xfffffffffffff8<<(242*4)) + (1<<970))
    @example(0xa<<10000)
    def test_to_float(x):
        mx = mpz(x)
        try:
>           fx = float(x)
                 ^^^^^^^^
E           OverflowError: int too large to convert to float

tests/test_mpz.py:951: OverflowError

During handling of the above exception, another exception occurred:

>   ???

tests/test_mpz.py:5: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/GraalPy/25.1.3/x64/lib/python3.12/site-packages/hypothesis/core.py:1666: in _raise_to_user
    raise the_error_hypothesis_found
tests/test_mpz.py:953: in test_to_float
    pytest.raises(OverflowError, lambda: float(mx))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

>   pytest.raises(OverflowError, lambda: float(mx))
                                         ^^^^^^^^^
E   OverflowError: integer too large to convert to float
E   Falsifying explicit example: test_to_float(
E       x=0xa_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000,
E   )

tests/test_mpz.py:953: OverflowError

Build log: https://github.com/diofant/python-gmp/actions/runs/28503793926/job/84487159175

The hypothesis thinks it found a falsifying example with x=0xa<<10000. The test checks that both for builtin integers and for the mpz type - conversion to floats raise a OverflowError. That seems to be the case:

Python 3.12.8 (Tue Jun 23 15:26:01 UTC 2026)
[Graal, Oracle GraalVM, Java 25.0.3 (amd64)] on 'linux'
Type "help", "copyright", "credits" or "license" for more information.
>>> from gmp import mpz
>>> m = 0xa<<10000
>>> mz = mpz(m)
>>> float(m)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: int too large to convert to float
>>> float(mz)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: integer too large to convert to float

I guess, the problem could be with hypothesis/pytest related patches for the GraalPy.

This test works successfully on older versions of the GraalPy or on other Python implementations. Also, it seems that change

pytest.raises(OverflowError, lambda: float(mx))

to

with pytest.raises(OverflowError):
    float(mx)

fixes it (or at least reduces probability of a failure).

Operating system

Linux

CPU architecture

x86_64

GraalPy version

25.1.3

JDK version

No response

Context configuration

No response

Steps to reproduce

  1. Clone repo:
git clone git@github.com:diofant/python-gmp.git && cd python-gmp
  1. Build the project:
pip install --verbose .[tests] -Cbuild-dir=build -Csetup-args=-Dbuildtype=debug -Csetup-args=-Db_coverage=true
  1. Run full set of tests (you might want to add that @example(0xa<<10000) to test_to_float(), to be sure):
CI=1 pytest

N.B., I can't provide a simpler reproducer. E.g. without CI=1 or if I select just that specific test - it pass.

Expected behavior

No false alarm. Tests pass.

Stack trace

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions