* Fix strict aliasing in PyFloat_Pack8() and PyFloat_Pack4().
* Fix _testcapi.float_set_snan() on x86 (32-bit).
uint64_t v;
memcpy(&v, &d, 8);
v &= ~(1ULL << 51); /* make sNaN */
- memcpy(&d, &v, 8);
- return PyFloat_FromDouble(d);
+
+ // gh-130317: memcpy() is needed to preserve the sNaN flag on x86 (32-bit)
+ PyObject *res = PyFloat_FromDouble(0.0);
+ memcpy(&((PyFloatObject *)res)->ob_fval, &v, 8);
+ return res;
}
static PyMethodDef test_methods[] = {
memcpy(&v, &x, 8);
if ((v & (1ULL << 51)) == 0) {
- union float_val {
- float f;
- uint32_t u32;
- } *py = (union float_val *)&y;
-
- py->u32 &= ~(1 << 22); /* make sNaN */
+ uint32_t u32;
+ memcpy(&u32, &y, 4);
+ u32 &= ~(1 << 22); /* make sNaN */
+ memcpy(&y, &u32, 4);
}
}
return -1;
}
else {
- const unsigned char *s = (unsigned char*)&x;
+ unsigned char as_bytes[8];
+ memcpy(as_bytes, &x, 8);
+ const unsigned char *s = as_bytes;
int i, incr = 1;
if ((double_format == ieee_little_endian_format && !le)