STINNER Victor <vstin...@python.org> added the comment:
Oh, clang on FreeBSD spotted a similar bug in float.__trunc__()! static PyObject * float___trunc___impl(PyObject *self) /*[clinic end generated code: output=dd3e289dd4c6b538 input=591b9ba0d650fdff]*/ { double x = PyFloat_AsDouble(self); double wholepart; /* integral portion of x, rounded toward 0 */ (void)modf(x, &wholepart); /* Try to get out cheap if this fits in a Python int. The attempt * to cast to long must be protected, as C doesn't define what * happens if the double is too big to fit in a long. Some rare * systems raise an exception then (RISCOS was mentioned as one, * and someone using a non-default option on Sun also bumped into * that). Note that checking for >= and <= LONG_{MIN,MAX} would * still be vulnerable: if a long has more bits of precision than * a double, casting MIN/MAX to double may yield an approximation, * and if that's rounded up, then, e.g., wholepart=LONG_MAX+1 would * yield true from the C expression wholepart<=LONG_MAX, despite * that wholepart is actually greater than LONG_MAX. */ if (LONG_MIN < wholepart && wholepart < LONG_MAX) { /* <=== HERE */ const long aslong = (long)wholepart; return PyLong_FromLong(aslong); } return PyLong_FromDouble(wholepart); } Objects/floatobject.c:881:45: warning: implicit conversion from 'long' to 'double' changes value from 9223372036854775807 to 9223372036854775808 [-Wimplicit-int-float-conversion] if (LONG_MIN < wholepart && wholepart < LONG_MAX) { ~ ^~~~~~~~ /usr/include/sys/limits.h:64:18: note: expanded from macro 'LONG_MAX' #define LONG_MAX __LONG_MAX /* max for a long */ ^~~~~~~~~~ /usr/include/x86/_limits.h:64:20: note: expanded from macro '__LONG_MAX' #define __LONG_MAX 0x7fffffffffffffff /* max for a long */ ^~~~~~~~~~~~~~~~~~ 1 warning generated. ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue39277> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com