xref: /llvm-project/clang/test/AST/ast-print-fp-pragmas.c (revision 7c1d9b15eee3a34678addab2bab66f3020ac0753)
1 // RUN: %clang_cc1 -triple x86_64-pc-linux -ast-print %s -o - | FileCheck %s
2 
func_1(float x,float y)3 float func_1(float x, float y) {
4 #pragma STDC FENV_ACCESS ON
5   if (x != 0) {
6     return y;
7   }
8   return x + y;
9 }
10 
11 // CHECK-LABEL: float func_1(float x, float y) {
12 // CHECK-NEXT:  #pragma STDC FENV_ACCESS ON
13 // CHECK-NEXT:      if (x != 0) {
14 // CHECK-NEXT:          return y;
15 // CHECK-NEXT:      }
16 // CHECK-NEXT:      return x + y;
17 // CHECK-NEXT:  }
18 
func_2(float x,float y)19 float func_2(float x, float y) {
20 #pragma STDC FENV_ACCESS ON
21   if (x != 0) {
22   #pragma STDC FENV_ACCESS OFF
23     return y;
24   }
25   return x + y;
26 }
27 
28 // CHECK-LABEL: float func_2(float x, float y) {
29 // CHECK-NEXT:  #pragma STDC FENV_ACCESS ON
30 // CHECK-NEXT:      if (x != 0) {
31 // CHECK-NEXT:      #pragma STDC FENV_ACCESS OFF
32 // CHECK-NEXT:          return y;
33 // CHECK-NEXT:      }
34 // CHECK-NEXT:      return x + y;
35 // CHECK-NEXT:  }
36 
func_3(float x,float y)37 float func_3(float x, float y) {
38 #pragma STDC FENV_ROUND FE_DOWNWARD
39   return x + y;
40 }
41 
42 // CHECK-LABEL: float func_3(float x, float y) {
43 // CHECK-NEXT:  #pragma STDC FENV_ROUND FE_DOWNWARD
44 // CHECK-NEXT:      return x + y;
45 // CHECK-NEXT:  }
46 
func_4(float x,float y,float z)47 float func_4(float x, float y, float z) {
48 #pragma STDC FENV_ACCESS ON
49 #pragma clang fp exceptions(maytrap)
50 #pragma STDC FENV_ROUND FE_UPWARD
51   if (z != 0) {
52   #pragma STDC FENV_ACCESS OFF
53   #pragma STDC FENV_ROUND FE_TOWARDZERO
54     return z + x;
55   }
56   return x + y;
57 }
58 
59 // CHECK-LABEL: float func_4(float x, float y, float z) {
60 // CHECK-NEXT:  #pragma STDC FENV_ACCESS ON
61 // CHECK-NEXT:  #pragma clang fp exceptions(maytrap)
62 // CHECK-NEXT:  #pragma STDC FENV_ROUND FE_UPWARD
63 // CHECK-NEXT:      if (z != 0) {
64 // CHECK-NEXT:      #pragma STDC FENV_ACCESS OFF
65 // CHECK-NEXT:      #pragma STDC FENV_ROUND FE_TOWARDZERO
66 // CHECK-NEXT:          return z + x;
67 // CHECK-NEXT:      }
68 // CHECK-NEXT:      return x + y;
69 // CHECK-NEXT:  }
70