https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110656
Bug ID: 110656 Summary: Floating point to char/short or bitfield conversions Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: jakub at gcc dot gnu.org Target Milestone: --- While implementing floating point to _BitInt convertions, I'm wondering if it is correct that we implement say float -> signed char conversion effectively as float -> int -> signed char. signed char foo (float x) { return x; } with foo (512.0f). ISO C17 has in F.4 says "or if the integral part of the floating value exceeds the range of the integer type, then the “invalid” floating-point exception is raised and the resulting value is unspecified." but we even with -ftrapping-math trigger invalid say for 8589934592.0f (when it doesn't fit into int), but the above just does cvttss2sil %xmm0, %eax movsbl %al, %eax on x86_64. In the scope of _BitInt, I wonder if I should care, i.e. whether I should call say a library routine for floating point to _BitInt(N)/unsigned _BitInt(N) conversions when N is smaller than bit width of __int128 (if it exists, long long otherwise) and is not equal to width of int, long or long long, or if I can implement those like it is implemented for char/short and bitfields. I guess for now I'll try to implement the library side so that it handles correctly all valid Ns and we can decide on the compiler side later.