1*6314f412SSerge Pavlov // RUN: %clang_cc1 -S -emit-llvm -triple i386-linux -std=c++2a -Wno-unknown-pragmas %s -o - | FileCheck %s
2*6314f412SSerge Pavlov 
3*6314f412SSerge Pavlov // nextUp(1.F) == 0x1.000002p0F
4*6314f412SSerge Pavlov 
add_round_down(float x,float y)5*6314f412SSerge Pavlov constexpr float add_round_down(float x, float y) {
6*6314f412SSerge Pavlov   #pragma STDC FENV_ROUND FE_DOWNWARD
7*6314f412SSerge Pavlov   float res = x;
8*6314f412SSerge Pavlov   res += y;
9*6314f412SSerge Pavlov   return res;
10*6314f412SSerge Pavlov }
11*6314f412SSerge Pavlov 
add_round_up(float x,float y)12*6314f412SSerge Pavlov constexpr float add_round_up(float x, float y) {
13*6314f412SSerge Pavlov   #pragma STDC FENV_ROUND FE_UPWARD
14*6314f412SSerge Pavlov   float res = x;
15*6314f412SSerge Pavlov   res += y;
16*6314f412SSerge Pavlov   return res;
17*6314f412SSerge Pavlov }
18*6314f412SSerge Pavlov 
19*6314f412SSerge Pavlov float V1 = add_round_down(1.0F, 0x0.000001p0F);
20*6314f412SSerge Pavlov float V2 = add_round_up(1.0F, 0x0.000001p0F);
21*6314f412SSerge Pavlov // CHECK: @V1 = {{.*}} float 1.000000e+00
22*6314f412SSerge Pavlov // CHECK: @V2 = {{.*}} float 0x3FF0000020000000
23*6314f412SSerge Pavlov 
add_cast_round_down(float x,double y)24*6314f412SSerge Pavlov constexpr float add_cast_round_down(float x, double y) {
25*6314f412SSerge Pavlov   #pragma STDC FENV_ROUND FE_DOWNWARD
26*6314f412SSerge Pavlov   float res = x;
27*6314f412SSerge Pavlov   res += y;
28*6314f412SSerge Pavlov   return res;
29*6314f412SSerge Pavlov }
30*6314f412SSerge Pavlov 
add_cast_round_up(float x,double y)31*6314f412SSerge Pavlov constexpr float add_cast_round_up(float x, double y) {
32*6314f412SSerge Pavlov   #pragma STDC FENV_ROUND FE_UPWARD
33*6314f412SSerge Pavlov   float res = x;
34*6314f412SSerge Pavlov   res += y;
35*6314f412SSerge Pavlov   return res;
36*6314f412SSerge Pavlov }
37*6314f412SSerge Pavlov 
38*6314f412SSerge Pavlov float V3 = add_cast_round_down(1.0F, 0x0.000001p0F);
39*6314f412SSerge Pavlov float V4 = add_cast_round_up(1.0F, 0x0.000001p0F);
40*6314f412SSerge Pavlov 
41*6314f412SSerge Pavlov // CHECK: @V3 = {{.*}} float 1.000000e+00
42*6314f412SSerge Pavlov // CHECK: @V4 = {{.*}} float 0x3FF0000020000000
43*6314f412SSerge Pavlov 
44*6314f412SSerge Pavlov // The next three variables use the same function as initializer, only rounding
45*6314f412SSerge Pavlov // modes differ.
46*6314f412SSerge Pavlov 
__anona905c8530102() 47*6314f412SSerge Pavlov float V5 = []() -> float {
48*6314f412SSerge Pavlov   return [](float x, float y)->float {
49*6314f412SSerge Pavlov     #pragma STDC FENV_ROUND FE_UPWARD
50*6314f412SSerge Pavlov     return x + y;
51*6314f412SSerge Pavlov   }([](float x, float y) -> float {
52*6314f412SSerge Pavlov       #pragma STDC FENV_ROUND FE_UPWARD
53*6314f412SSerge Pavlov       return x + y;
54*6314f412SSerge Pavlov     }(1.0F, 0x0.000001p0F),
55*6314f412SSerge Pavlov   0x0.000001p0F);
56*6314f412SSerge Pavlov }();
57*6314f412SSerge Pavlov // CHECK: @V5 = {{.*}} float 0x3FF0000040000000
58*6314f412SSerge Pavlov 
__anona905c8530402() 59*6314f412SSerge Pavlov float V6 = []() -> float {
60*6314f412SSerge Pavlov   return [](float x, float y)->float {
61*6314f412SSerge Pavlov     #pragma STDC FENV_ROUND FE_DOWNWARD
62*6314f412SSerge Pavlov     return x + y;
63*6314f412SSerge Pavlov   }([](float x, float y) -> float {
64*6314f412SSerge Pavlov       #pragma STDC FENV_ROUND FE_UPWARD
65*6314f412SSerge Pavlov       return x + y;
66*6314f412SSerge Pavlov     }(1.0F, 0x0.000001p0F),
67*6314f412SSerge Pavlov   0x0.000001p0F);
68*6314f412SSerge Pavlov }();
69*6314f412SSerge Pavlov // CHECK: @V6 = {{.*}} float 0x3FF0000020000000
70*6314f412SSerge Pavlov 
__anona905c8530702() 71*6314f412SSerge Pavlov float V7 = []() -> float {
72*6314f412SSerge Pavlov   return [](float x, float y)->float {
73*6314f412SSerge Pavlov     #pragma STDC FENV_ROUND FE_DOWNWARD
74*6314f412SSerge Pavlov     return x + y;
75*6314f412SSerge Pavlov   }([](float x, float y) -> float {
76*6314f412SSerge Pavlov       #pragma STDC FENV_ROUND FE_DOWNWARD
77*6314f412SSerge Pavlov       return x + y;
78*6314f412SSerge Pavlov     }(1.0F, 0x0.000001p0F),
79*6314f412SSerge Pavlov   0x0.000001p0F);
80*6314f412SSerge Pavlov }();
81*6314f412SSerge Pavlov // CHECK: @V7 = {{.*}} float 1.000000e+00
82