1/* Test fetestexceptflag.
2 Copyright (C) 2016-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#include <fenv.h>
20#include <stdio.h>
21#include <math-tests.h>
22
23static int
24test_one (int exc_test, int exc_set, int exc_save)
25{
26 int result = 0;
27
28 printf (format: "Individual test: %x %x %x\n", (unsigned int) exc_test,
29 (unsigned int) exc_set, (unsigned int) exc_save);
30
31 feclearexcept (FE_ALL_EXCEPT);
32 int ret = fesetexcept (excepts: exc_set);
33 if (ret != 0)
34 {
35 puts (s: "fesetexcept failed");
36 if (exc_set == 0 || EXCEPTION_TESTS (float))
37 {
38 puts (s: "failure of fesetexcept was unexpected");
39 result = 1;
40 }
41 else
42 puts (s: "failure of fesetexcept OK, skipping further tests");
43 return result;
44 }
45 fexcept_t saved;
46 ret = fegetexceptflag (flagp: &saved, excepts: exc_save);
47 if (ret == 0)
48 puts (s: "fegetexceptflag succeeded");
49 else
50 {
51 puts (s: "fegetexceptflag failed");
52 result = 1;
53 return result;
54 }
55 ret = fetestexceptflag (flagp: &saved, excepts: exc_test);
56 if (ret == (exc_set & exc_test))
57 puts (s: "fetestexceptflag result correct");
58 else
59 {
60 printf (format: "fetestexceptflag returned %x, expected %x\n", ret,
61 exc_set & exc_test);
62 result = 1;
63 }
64 if (exc_save == FE_ALL_EXCEPT)
65 {
66 /* Also test fetestexceptflag testing all exceptions but
67 possibly with only some set. */
68 ret = fetestexceptflag (flagp: &saved, FE_ALL_EXCEPT);
69 if (ret == exc_set)
70 puts (s: "fetestexceptflag (FE_ALL_EXCEPT) result correct");
71 else
72 {
73 printf (format: "fetestexceptflag (FE_ALL_EXCEPT) returned %x, expected %x\n",
74 ret, exc_set);
75 result = 1;
76 }
77 }
78 return result;
79}
80
81static int
82test_fetestexceptflag (int exc, const char *exc_name)
83{
84 int result = 0;
85
86 printf (format: "Testing %s\n", exc_name);
87
88 /* Test each case of: whether this exception is set or clear;
89 whether other exceptions are set or clear; whether the whole
90 state is saved or just the state for this exception. */
91 result |= test_one (exc_test: exc, exc_set: 0, exc_save: exc);
92 result |= test_one (exc_test: exc, exc_set: 0, FE_ALL_EXCEPT);
93 result |= test_one (exc_test: exc, exc_set: exc, exc_save: exc);
94 result |= test_one (exc_test: exc, exc_set: exc, FE_ALL_EXCEPT);
95 result |= test_one (exc_test: exc, FE_ALL_EXCEPT & ~exc, exc_save: exc);
96 result |= test_one (exc_test: exc, FE_ALL_EXCEPT & ~exc, FE_ALL_EXCEPT);
97 result |= test_one (exc_test: exc, FE_ALL_EXCEPT, exc_save: exc);
98 result |= test_one (exc_test: exc, FE_ALL_EXCEPT, FE_ALL_EXCEPT);
99
100 return result;
101}
102
103static int
104do_test (void)
105{
106 int result = 0;
107
108 result |= test_fetestexceptflag (exc: 0, exc_name: "0");
109 result |= test_fetestexceptflag (FE_ALL_EXCEPT, exc_name: "FE_ALL_EXCEPT");
110#ifdef FE_DIVBYZERO
111 result |= test_fetestexceptflag (FE_DIVBYZERO, exc_name: "FE_DIVBYZERO");
112#endif
113#ifdef FE_INEXACT
114 result |= test_fetestexceptflag (FE_INEXACT, exc_name: "FE_INEXACT");
115#endif
116#ifdef FE_INVALID
117 result |= test_fetestexceptflag (FE_INVALID, exc_name: "FE_INVALID");
118#endif
119#ifdef FE_OVERFLOW
120 result |= test_fetestexceptflag (FE_OVERFLOW, exc_name: "FE_OVERFLOW");
121#endif
122#ifdef FE_UNDERFLOW
123 result |= test_fetestexceptflag (FE_UNDERFLOW, exc_name: "FE_UNDERFLOW");
124#endif
125
126 return result;
127}
128
129#define TEST_FUNCTION do_test ()
130#include "../test-skeleton.c"
131

source code of glibc/math/test-fetestexceptflag.c