Index: Objects/floatobject.c =================================================================== --- Objects/floatobject.c (revision 61312) +++ Objects/floatobject.c (working copy) @@ -1751,9 +1751,6 @@ /*---------------------------------------------------------------------------- * _PyFloat_{Pack,Unpack}{4,8}. See floatobject.h. - * - * TODO: On platforms that use the standard IEEE-754 single and double - * formats natively, these routines could simply copy the bytes. */ int _PyFloat_Pack4(double x, unsigned char *p, int le) @@ -1833,28 +1830,31 @@ /* Done */ return 0; - Overflow: - PyErr_SetString(PyExc_OverflowError, - "float too large to pack with f format"); - return -1; } else { float y = (float)x; const char *s = (char*)&y; int i, incr = 1; + if (Py_IS_INFINITY(y) && !Py_IS_INFINITY(x)) + goto Overflow; + if ((float_format == ieee_little_endian_format && !le) || (float_format == ieee_big_endian_format && le)) { p += 3; incr = -1; } - + for (i = 0; i < 4; i++) { *p = *s++; p += incr; } return 0; } + Overflow: + PyErr_SetString(PyExc_OverflowError, + "float too large to pack with f format"); + return -1; } int Index: Misc/NEWS =================================================================== --- Misc/NEWS (revision 61312) +++ Misc/NEWS (working copy) @@ -21,6 +21,10 @@ Library ------- +- Issue #705836: struct.pack(">f", x) now raises OverflowError on all + platforms when x is too large to fit into an IEEE 754 float; previously + it only raised OverflowError on non IEEE 754 platforms. + - Issue #1106316: pdb.post_mortem()'s parameter, "traceback", is now optional: it defaults to the traceback of the exception that is currently being handled (is mandatory to be in the middle of an exception, otherwise Index: Lib/test/test_struct.py =================================================================== --- Lib/test/test_struct.py (revision 61312) +++ Lib/test/test_struct.py (working copy) @@ -482,7 +482,7 @@ except OverflowError: pass else: - TestFailed("expected OverflowError") + raise TestFailed("expected OverflowError") test_705836()