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"));
}

Reply via email to