summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/pr61441.c
blob: aaa259130a720d953db6cdf461e6e0d956ceab76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/* { dg-do run { target { *-*-linux* *-*-gnu* } } } */
/* { dg-options "-O1 -lm -fexcess-precision=standard -fsignaling-nans" } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target issignaling } */

#define _GNU_SOURCE
#include <stdio.h>
#include <math.h>

void conversion()
{
  float sNaN = __builtin_nansf ("");
  double x = (double) sNaN;
  if (issignaling(x))
  {
    __builtin_abort();
  }
}

enum op {Add, Mult, Div, Abs};

void operation(enum op t)
{
  float x, y;
  float sNaN = __builtin_nansf ("");
  switch (t)
  {
    case Abs:
      x = fabs(sNaN);
      break;
    case Add:
      x = sNaN + 2.0;
      break;
    case Mult:
      x = sNaN * 2.0;
      break;
    case Div:
    default:
      x = sNaN / 2.0;
      break;
  }
  if (t == Abs)
  {
    if (!issignaling(x))
    {
      __builtin_abort();
    }
  }
  else if (issignaling(x))
  {
    __builtin_abort();
  }
}

int main (void)
{
  conversion();
  operation(Add);
  operation(Mult);
  operation(Div);
#if __FLT_EVAL_METHOD__ == 0
  operation(Abs);
#endif
  return 0;
}