diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index f7e652d8bbb..55ea8d24faa 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -186,6 +186,7 @@ class BuiltinTest(unittest.TestCase): def __coerce__(self, other): raise ValueError self.assertRaises(ValueError, coerce, 42, BadNumber()) + self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000)) def test_compile(self): compile('print 1\n', '', 'exec') diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 9cab2dec792..9eb063c30b1 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -371,9 +371,10 @@ def test_float_overflow(): for x in -2.0, -1.0, 0.0, 1.0, 2.0: verify(float(long(x)) == x) + shuge = '12345' * 1000 huge = 1L << 30000 mhuge = -huge - namespace = {'huge': huge, 'mhuge': mhuge, 'math': math} + namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math} for test in ["float(huge)", "float(mhuge)", "complex(huge)", "complex(mhuge)", "complex(huge, 1)", "complex(mhuge, 1)", @@ -386,7 +387,8 @@ def test_float_overflow(): "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.", "math.sin(huge)", "math.sin(mhuge)", "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better - "math.floor(huge)", "math.floor(mhuge)"]: + "math.floor(huge)", "math.floor(mhuge)", + "float(shuge) == int(shuge)"]: try: eval(test, namespace) diff --git a/Misc/NEWS b/Misc/NEWS index 971cfe0f308..028c21b0512 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -23,6 +23,10 @@ Core and builtins - Fixed crash when printing a subclass of str and __str__ returned self. See SF bug #667147. +- Fixed an invalid RuntimeWarning and an undetected error when trying + to convert a long integer into a float which couldn't fit. + See SF bug #676155. + Extension modules ----------------- diff --git a/Objects/floatobject.c b/Objects/floatobject.c index cd283493ba7..09406e477dd 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -629,7 +629,10 @@ float_coerce(PyObject **pv, PyObject **pw) return 0; } else if (PyLong_Check(*pw)) { - *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw)); + double x = PyLong_AsDouble(*pw); + if (x == -1.0 && PyErr_Occurred()) + return -1; + *pw = PyFloat_FromDouble(x); Py_INCREF(*pv); return 0; }