modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/ieee/pr30704.c (about)

     1  /* PR middle-end/30704 */
     2  
     3  typedef __SIZE_TYPE__ size_t;
     4  extern void abort (void);
     5  extern int memcmp (const void *, const void *, size_t);
     6  extern void *memcpy (void *, const void *, size_t);
     7  
     8  long long
     9  f1 (void)
    10  {
    11    long long t;
    12    double d = 0x0.fffffffffffff000p-1022;
    13    memcpy (&t, &d, sizeof (long long));
    14    return t;
    15  }
    16  
    17  double
    18  f2 (void)
    19  {
    20    long long t = 0x000fedcba9876543LL;
    21    double d;
    22    memcpy (&d, &t, sizeof (long long));
    23    return d;
    24  }
    25  
    26  int
    27  main ()
    28  {
    29    union
    30    {
    31      long long ll;
    32      double d;
    33    } u;
    34  
    35    if (sizeof (long long) != sizeof (double) || __DBL_MIN_EXP__ != -1021)
    36      return 0;
    37  
    38    u.ll = f1 ();
    39    if (u.d != 0x0.fffffffffffff000p-1022)
    40      abort ();
    41  
    42    u.d = f2 ();
    43    if (u.ll != 0x000fedcba9876543LL)
    44      abort ();
    45  
    46    double b = 234.0;
    47    long long c;
    48    double d = b;
    49    memcpy (&c, &b, sizeof (double));
    50    long long e = c;
    51    if (memcmp (&e, &d, sizeof (double)) != 0)
    52      abort ();
    53  
    54    return 0;
    55  }