xref: /aosp_15_r20/bionic/tests/fenv_test.cpp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2012 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  *
4*8d67ca89SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8d67ca89SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8d67ca89SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8d67ca89SAndroid Build Coastguard Worker  *
8*8d67ca89SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8d67ca89SAndroid Build Coastguard Worker  *
10*8d67ca89SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8d67ca89SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8d67ca89SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8d67ca89SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8d67ca89SAndroid Build Coastguard Worker  * limitations under the License.
15*8d67ca89SAndroid Build Coastguard Worker  */
16*8d67ca89SAndroid Build Coastguard Worker 
17*8d67ca89SAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*8d67ca89SAndroid Build Coastguard Worker 
19*8d67ca89SAndroid Build Coastguard Worker #include "DoNotOptimize.h"
20*8d67ca89SAndroid Build Coastguard Worker #include "utils.h"
21*8d67ca89SAndroid Build Coastguard Worker 
22*8d67ca89SAndroid Build Coastguard Worker #include <fenv.h>
23*8d67ca89SAndroid Build Coastguard Worker #include <stdint.h>
24*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
25*8d67ca89SAndroid Build Coastguard Worker 
TestRounding(float expectation1,float expectation2)26*8d67ca89SAndroid Build Coastguard Worker static void TestRounding(float expectation1, float expectation2) {
27*8d67ca89SAndroid Build Coastguard Worker   // Volatile to prevent compile-time evaluation.
28*8d67ca89SAndroid Build Coastguard Worker   volatile float f = 1.968750f;
29*8d67ca89SAndroid Build Coastguard Worker   volatile float m = 0x1.0p23f;
30*8d67ca89SAndroid Build Coastguard Worker   float x;
31*8d67ca89SAndroid Build Coastguard Worker   DoNotOptimize(x = f + m);
32*8d67ca89SAndroid Build Coastguard Worker   ASSERT_FLOAT_EQ(expectation1, x);
33*8d67ca89SAndroid Build Coastguard Worker   DoNotOptimize(x = x - m);
34*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(expectation2, x);
35*8d67ca89SAndroid Build Coastguard Worker }
36*8d67ca89SAndroid Build Coastguard Worker 
DivideByZero()37*8d67ca89SAndroid Build Coastguard Worker static void DivideByZero() {
38*8d67ca89SAndroid Build Coastguard Worker   // Volatile to prevent compile-time evaluation.
39*8d67ca89SAndroid Build Coastguard Worker   volatile float zero = 0.0f;
40*8d67ca89SAndroid Build Coastguard Worker   DoNotOptimize(123.0f / zero);
41*8d67ca89SAndroid Build Coastguard Worker }
42*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,fesetround_fegetround_FE_TONEAREST)43*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, fesetround_fegetround_FE_TONEAREST) {
44*8d67ca89SAndroid Build Coastguard Worker   fesetround(FE_TONEAREST);
45*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_TONEAREST, fegetround());
46*8d67ca89SAndroid Build Coastguard Worker   TestRounding(8388610.0f, 2.0f);
47*8d67ca89SAndroid Build Coastguard Worker }
48*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,fesetround_fegetround_FE_TOWARDZERO)49*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, fesetround_fegetround_FE_TOWARDZERO) {
50*8d67ca89SAndroid Build Coastguard Worker   fesetround(FE_TOWARDZERO);
51*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_TOWARDZERO, fegetround());
52*8d67ca89SAndroid Build Coastguard Worker   TestRounding(8388609.0f, 1.0f);
53*8d67ca89SAndroid Build Coastguard Worker }
54*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,fesetround_fegetround_FE_UPWARD)55*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, fesetround_fegetround_FE_UPWARD) {
56*8d67ca89SAndroid Build Coastguard Worker   fesetround(FE_UPWARD);
57*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_UPWARD, fegetround());
58*8d67ca89SAndroid Build Coastguard Worker   TestRounding(8388610.0f, 2.0f);
59*8d67ca89SAndroid Build Coastguard Worker }
60*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,fesetround_fegetround_FE_DOWNWARD)61*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, fesetround_fegetround_FE_DOWNWARD) {
62*8d67ca89SAndroid Build Coastguard Worker   fesetround(FE_DOWNWARD);
63*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_DOWNWARD, fegetround());
64*8d67ca89SAndroid Build Coastguard Worker   TestRounding(8388609.0f, 1.0f);
65*8d67ca89SAndroid Build Coastguard Worker }
66*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,feclearexcept_fetestexcept)67*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, feclearexcept_fetestexcept) {
68*8d67ca89SAndroid Build Coastguard Worker   // Clearing clears.
69*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_ALL_EXCEPT);
70*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fetestexcept(FE_ALL_EXCEPT));
71*8d67ca89SAndroid Build Coastguard Worker 
72*8d67ca89SAndroid Build Coastguard Worker   // Dividing by zero sets FE_DIVBYZERO.
73*8d67ca89SAndroid Build Coastguard Worker   DivideByZero();
74*8d67ca89SAndroid Build Coastguard Worker   int raised = fetestexcept(FE_DIVBYZERO | FE_OVERFLOW);
75*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE((raised & FE_OVERFLOW) == 0);
76*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE((raised & FE_DIVBYZERO) != 0);
77*8d67ca89SAndroid Build Coastguard Worker 
78*8d67ca89SAndroid Build Coastguard Worker   // Clearing an unset bit is a no-op.
79*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_OVERFLOW);
80*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE((raised & FE_OVERFLOW) == 0);
81*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE((raised & FE_DIVBYZERO) != 0);
82*8d67ca89SAndroid Build Coastguard Worker 
83*8d67ca89SAndroid Build Coastguard Worker   // Clearing a set bit works.
84*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_DIVBYZERO);
85*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fetestexcept(FE_ALL_EXCEPT));
86*8d67ca89SAndroid Build Coastguard Worker }
87*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,FE_DFL_ENV_macro)88*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, FE_DFL_ENV_macro) {
89*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fesetenv(FE_DFL_ENV));
90*8d67ca89SAndroid Build Coastguard Worker }
91*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,feraiseexcept)92*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, feraiseexcept) {
93*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_ALL_EXCEPT);
94*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fetestexcept(FE_ALL_EXCEPT));
95*8d67ca89SAndroid Build Coastguard Worker 
96*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, feraiseexcept(FE_DIVBYZERO | FE_OVERFLOW));
97*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_DIVBYZERO | FE_OVERFLOW, fetestexcept(FE_ALL_EXCEPT));
98*8d67ca89SAndroid Build Coastguard Worker }
99*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,fegetenv_fesetenv)100*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, fegetenv_fesetenv) {
101*8d67ca89SAndroid Build Coastguard Worker   // Set FE_OVERFLOW only.
102*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_ALL_EXCEPT);
103*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fetestexcept(FE_ALL_EXCEPT));
104*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, feraiseexcept(FE_OVERFLOW));
105*8d67ca89SAndroid Build Coastguard Worker 
106*8d67ca89SAndroid Build Coastguard Worker   // fegetenv (unlike feholdexcept) leaves the current state untouched...
107*8d67ca89SAndroid Build Coastguard Worker   fenv_t state;
108*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fegetenv(&state));
109*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_OVERFLOW, fetestexcept(FE_ALL_EXCEPT));
110*8d67ca89SAndroid Build Coastguard Worker 
111*8d67ca89SAndroid Build Coastguard Worker   // Dividing by zero sets the appropriate flag...
112*8d67ca89SAndroid Build Coastguard Worker   DivideByZero();
113*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_DIVBYZERO | FE_OVERFLOW, fetestexcept(FE_ALL_EXCEPT));
114*8d67ca89SAndroid Build Coastguard Worker 
115*8d67ca89SAndroid Build Coastguard Worker   // And fesetenv (unlike feupdateenv) clobbers that to return to where
116*8d67ca89SAndroid Build Coastguard Worker   // we started.
117*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fesetenv(&state));
118*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_OVERFLOW, fetestexcept(FE_ALL_EXCEPT));
119*8d67ca89SAndroid Build Coastguard Worker }
120*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,fegetenv_fesetenv_rounding_mode)121*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, fegetenv_fesetenv_rounding_mode) {
122*8d67ca89SAndroid Build Coastguard Worker   // Test that fegetenv()/fesetenv() includes the rounding mode.
123*8d67ca89SAndroid Build Coastguard Worker   fesetround(FE_DOWNWARD);
124*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_DOWNWARD, fegetround());
125*8d67ca89SAndroid Build Coastguard Worker 
126*8d67ca89SAndroid Build Coastguard Worker   fenv_t env;
127*8d67ca89SAndroid Build Coastguard Worker   fegetenv(&env);
128*8d67ca89SAndroid Build Coastguard Worker 
129*8d67ca89SAndroid Build Coastguard Worker   fesetround(FE_UPWARD);
130*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_UPWARD, fegetround());
131*8d67ca89SAndroid Build Coastguard Worker 
132*8d67ca89SAndroid Build Coastguard Worker   fesetenv(&env);
133*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_DOWNWARD, fegetround());
134*8d67ca89SAndroid Build Coastguard Worker }
135*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,feholdexcept_feupdateenv)136*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, feholdexcept_feupdateenv) {
137*8d67ca89SAndroid Build Coastguard Worker   // Set FE_OVERFLOW only.
138*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_ALL_EXCEPT);
139*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fetestexcept(FE_ALL_EXCEPT));
140*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, feraiseexcept(FE_OVERFLOW));
141*8d67ca89SAndroid Build Coastguard Worker 
142*8d67ca89SAndroid Build Coastguard Worker   // feholdexcept (unlike fegetenv) clears everything...
143*8d67ca89SAndroid Build Coastguard Worker   fenv_t state;
144*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, feholdexcept(&state));
145*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fetestexcept(FE_ALL_EXCEPT));
146*8d67ca89SAndroid Build Coastguard Worker 
147*8d67ca89SAndroid Build Coastguard Worker   // Dividing by zero sets the appropriate flag...
148*8d67ca89SAndroid Build Coastguard Worker   DivideByZero();
149*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_DIVBYZERO, fetestexcept(FE_ALL_EXCEPT));
150*8d67ca89SAndroid Build Coastguard Worker 
151*8d67ca89SAndroid Build Coastguard Worker   // And feupdateenv (unlike fesetenv) merges what we started with
152*8d67ca89SAndroid Build Coastguard Worker   // (FE_OVERFLOW) with what we now have (FE_DIVBYZERO).
153*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, feupdateenv(&state));
154*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_DIVBYZERO | FE_OVERFLOW, fetestexcept(FE_ALL_EXCEPT));
155*8d67ca89SAndroid Build Coastguard Worker }
156*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,fegetexceptflag_fesetexceptflag)157*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, fegetexceptflag_fesetexceptflag) {
158*8d67ca89SAndroid Build Coastguard Worker   // Set three flags.
159*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_ALL_EXCEPT);
160*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, feraiseexcept(FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW));
161*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW, fetestexcept(FE_ALL_EXCEPT));
162*8d67ca89SAndroid Build Coastguard Worker 
163*8d67ca89SAndroid Build Coastguard Worker   fexcept_t all; // FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW
164*8d67ca89SAndroid Build Coastguard Worker   fexcept_t two; // FE_OVERFLOW | FE_UNDERFLOW
165*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fegetexceptflag(&all, FE_ALL_EXCEPT));
166*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fegetexceptflag(&two, FE_OVERFLOW | FE_UNDERFLOW));
167*8d67ca89SAndroid Build Coastguard Worker 
168*8d67ca89SAndroid Build Coastguard Worker   // Check we can restore all.
169*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_ALL_EXCEPT);
170*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fesetexceptflag(&all, FE_ALL_EXCEPT));
171*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW, fetestexcept(FE_ALL_EXCEPT));
172*8d67ca89SAndroid Build Coastguard Worker 
173*8d67ca89SAndroid Build Coastguard Worker   // Check that `two` only stored a subset.
174*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_ALL_EXCEPT);
175*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fesetexceptflag(&two, FE_ALL_EXCEPT));
176*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_OVERFLOW | FE_UNDERFLOW, fetestexcept(FE_ALL_EXCEPT));
177*8d67ca89SAndroid Build Coastguard Worker 
178*8d67ca89SAndroid Build Coastguard Worker   // Check that we can restore a single flag.
179*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_ALL_EXCEPT);
180*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fesetexceptflag(&all, FE_DIVBYZERO));
181*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_DIVBYZERO, fetestexcept(FE_ALL_EXCEPT));
182*8d67ca89SAndroid Build Coastguard Worker 
183*8d67ca89SAndroid Build Coastguard Worker   // Check that we can restore a subset of flags.
184*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_ALL_EXCEPT);
185*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fesetexceptflag(&all, FE_OVERFLOW | FE_UNDERFLOW));
186*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_OVERFLOW | FE_UNDERFLOW, fetestexcept(FE_ALL_EXCEPT));
187*8d67ca89SAndroid Build Coastguard Worker }
188*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,fedisableexcept_fegetexcept)189*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, fedisableexcept_fegetexcept) {
190*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
191*8d67ca89SAndroid Build Coastguard Worker   feclearexcept(FE_ALL_EXCEPT);
192*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fetestexcept(FE_ALL_EXCEPT));
193*8d67ca89SAndroid Build Coastguard Worker 
194*8d67ca89SAndroid Build Coastguard Worker   // No SIGFPE please...
195*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fedisableexcept(FE_ALL_EXCEPT));
196*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fegetexcept());
197*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, feraiseexcept(FE_INVALID));
198*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(FE_INVALID, fetestexcept(FE_ALL_EXCEPT));
199*8d67ca89SAndroid Build Coastguard Worker #else
200*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "musl doesn't have fegetexcept";
201*8d67ca89SAndroid Build Coastguard Worker #endif
202*8d67ca89SAndroid Build Coastguard Worker }
203*8d67ca89SAndroid Build Coastguard Worker 
TEST(fenv,feenableexcept_fegetexcept)204*8d67ca89SAndroid Build Coastguard Worker TEST(fenv, feenableexcept_fegetexcept) {
205*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
206*8d67ca89SAndroid Build Coastguard Worker #if defined(__aarch64__) || defined(__arm__) || defined(__riscv)
207*8d67ca89SAndroid Build Coastguard Worker   // ARM and RISC-V don't support hardware trapping of floating point
208*8d67ca89SAndroid Build Coastguard Worker   // exceptions. ARM used to if you go back far enough, but it was
209*8d67ca89SAndroid Build Coastguard Worker   // removed in the Cortex-A8 between r3p1 and r3p2. RISC-V never has.
210*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, feenableexcept(FE_INVALID));
211*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fegetexcept());
212*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, feenableexcept(FE_DIVBYZERO));
213*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fegetexcept());
214*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, feenableexcept(FE_OVERFLOW));
215*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fegetexcept());
216*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, feenableexcept(FE_UNDERFLOW));
217*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fegetexcept());
218*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, feenableexcept(FE_INEXACT));
219*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fegetexcept());
220*8d67ca89SAndroid Build Coastguard Worker #if defined(_FE_DENORMAL)  // riscv64 doesn't support this.
221*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, feenableexcept(FE_DENORMAL));
222*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, fegetexcept());
223*8d67ca89SAndroid Build Coastguard Worker #endif
224*8d67ca89SAndroid Build Coastguard Worker #else
225*8d67ca89SAndroid Build Coastguard Worker   // We can't recover from SIGFPE, so sacrifice a child...
226*8d67ca89SAndroid Build Coastguard Worker   pid_t pid = fork();
227*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, pid) << strerror(errno);
228*8d67ca89SAndroid Build Coastguard Worker 
229*8d67ca89SAndroid Build Coastguard Worker   if (pid == 0) {
230*8d67ca89SAndroid Build Coastguard Worker     signal(SIGFPE, SIG_DFL);  // Disable debuggerd.
231*8d67ca89SAndroid Build Coastguard Worker     feclearexcept(FE_ALL_EXCEPT);
232*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(0, fetestexcept(FE_ALL_EXCEPT));
233*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(0, feenableexcept(FE_INVALID));
234*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(FE_INVALID, fegetexcept());
235*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(0, feraiseexcept(FE_INVALID));
236*8d67ca89SAndroid Build Coastguard Worker     _exit(123);
237*8d67ca89SAndroid Build Coastguard Worker   }
238*8d67ca89SAndroid Build Coastguard Worker 
239*8d67ca89SAndroid Build Coastguard Worker   AssertChildExited(pid, -SIGFPE);
240*8d67ca89SAndroid Build Coastguard Worker #endif
241*8d67ca89SAndroid Build Coastguard Worker #else
242*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "musl doesn't have fegetexcept";
243*8d67ca89SAndroid Build Coastguard Worker #endif
244*8d67ca89SAndroid Build Coastguard Worker }
245