https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112614
Bug ID: 112614 Summary: Compile-time float-to-_Decimal64 fails for -NAN Product: gcc Version: 11.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: terra at gnome dot org Target Milestone: --- Created attachment 56636 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=56636&action=edit Preprocessed source code It looks like compile-time conversion of -NAN and -(double)NAN to _Decimal64 fails. Runtime conversion seems ok. -INFINITY is ok. Tentatively blaming the C front end. $ gcc -Wall -O2 d64nansign.c $ ./a.out Sign bit set as expected Sign bit set as expected Sign bit not set as expected Sign bit not set as expected Sign bit set as expected Sign bit set as expected Target: x86_64-linux-gnu #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <assert.h> #include <string.h> #include <math.h> static void test (_Decimal64 x) { uint64_t u; assert (sizeof (x) == sizeof (u)); memcpy (&u, &x, sizeof(x)); if (u >> 63) { printf ("Sign bit set as expected\n"); } else { printf ("Sign bit not set as expected\n"); } } int main (int argc, char **argv) { // compile-time test (-(_Decimal64)(NAN)); test (-(_Decimal64)(NAN)); test ((_Decimal64)(-NAN)); // Fails test ((_Decimal64)(-(double)NAN)); // Fails // runtime test (atof("-nan")); test (-atof("nan")); }