Branch
Hash :
a747e037
Author :
Date :
2025-05-07T11:34:47
Add syntax-check rule against CPU predef misspellings. * lib/getloadavg.c: Test __alpha, not __alpha__. * tests/test-snan-2.c: Likewise. * m4/exponentd.m4: Test __arm__, not __arm. * lib/utimensat.c: Test __hppa, not __hppa__. * tests/qemu.h: Likewise. * lib/fma.c: Test __sparc, not __sparc__. * tests/qemu.h: Likewise. * tests/test-exp2.h: Likewise. * tests/test-nonblocking-pipe.h: Likewise. * tests/test-snan-1.c: Likewise. * tests/test-snan-2.c: Likewise.
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
/* Tests of signalling not-a-number.
Copyright (C) 2023-2025 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
/* Written by Bruno Haible <bruno@clisp.org>, 2023. */
#include <config.h>
/* Specification. */
#include "snan.h"
#include <stdio.h>
#include "fpe-trapping.h"
#if HAVE_FPE_TRAPPING
# include <fenv.h>
# include "macros.h"
float volatile resultf;
double volatile resultd;
long double volatile resultl;
int
main (int argc, char *argv[])
{
/* Fetch the NaN values before we start watching out for FE_INVALID
exceptions, because the division 0.0 / 0.0 itself also raises an
FE_INVALID exception.
The use of 'volatile' prevents the compiler from doing constant-folding
optimizations on these values. An alternative, for GCC only, would be
the command-line option '-fsignaling-nans'. */
_GL_UNUSED float volatile nanf = SNaNf ();
_GL_UNUSED double volatile nand = SNaNd ();
_GL_UNUSED long double volatile nanl = SNaNl ();
/* Check that the values are really signalling. */
/* Clear FE_INVALID exceptions from past operations. */
feclearexcept (FE_INVALID);
/* An FE_INVALID exception shall trigger a SIGFPE signal, which by default
terminates the program. */
if (sigfpe_on_invalid () < 0)
{
fputs ("Skipping test: trapping floating-point exceptions are not supported on this machine.\n", stderr);
return 77;
}
if (argc > 1)
switch (argv[1][0])
{
case 'f':
/* This test does not work on 32-bit x86 processors, as well as
on x86_64 processors with CC="gcc -mfpmath=387", because loading
SNaNf() into a 387 FPU register already converted it to a quiet NaN.
See <https://lists.gnu.org/archive/html/bug-gnulib/2023-10/msg00060.html>
for details. */
#if !((defined __i386 || defined _M_IX86) \
|| ((defined __x86_64__ || defined _M_X64) && __FLT_EVAL_METHOD__ == 2))
/* This test does not work on AIX 7.1 with the xlc compiler, even with
the compiler options -qfloat=fenv -qfloat=nans -qfloat=spnans. */
#if !(defined _AIX && defined __xlC__)
resultf = nanf + 42.0f;
#else
fputs ("Skipping test: known failure on this platform with this compiler\n", stderr);
return 77;
#endif
#else
fputs ("Skipping test: known failure on this platform\n", stderr);
return 77;
#endif
break;
case 'd':
/* This test does not work on 32-bit x86 processors, as well as
on x86_64 processors with CC="gcc -mfpmath=387", because loading
SNaNd() into a 387 FPU register already converted it to a quiet NaN.
See <https://lists.gnu.org/archive/html/bug-gnulib/2023-10/msg00060.html>
for details. */
#if !((defined __i386 || defined _M_IX86) \
|| ((defined __x86_64__ || defined _M_X64) && __FLT_EVAL_METHOD__ == 2))
resultd = nand + 42.0;
#else
fputs ("Skipping test: known failure on this platform\n", stderr);
return 77;
#endif
break;
case 'l':
/* This test does not work on Linux/alpha with glibc 2.7. But it
works with glibc 2.36. Cause unknown.
This test does not work on Linux/loongarch64 with glibc 2.37.
Cause unknown.
This test does not work on eglibc 2.13/mips64
(bug in libc function __addtf3).
This test does not work on FreeBSD/arm64 and OpenBSD/mips64
(bug in libc function __addtf3).
This test does not work on FreeBSD/sparc64 and NetBSD/sparc64
(bug in libc function _Qp_add).
This test does not work on Cygwin 2.9.0/i386. Cause unknown.
This test does not work on MSVC/i386, because of the general IA-32
problem (see above) and 'long double' == 'double'. */
#if !((__GLIBC__ == 2 && __GLIBC_MINOR__ < 36 && defined __alpha) \
|| (__GLIBC__ >= 2 && defined __loongarch__) \
|| (((__GLIBC__ == 2 && __GLIBC_MINOR__ < 19 && defined __mips64) \
|| ((defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__) && (defined __aarch64__ || defined __mips64__ || defined __sparc))) \
&& !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE) \
|| (defined __CYGWIN__ && defined __i386) \
|| (((defined __i386 || defined _M_IX86) \
|| ((defined __x86_64__ || defined _M_X64) && __FLT_EVAL_METHOD__ == 2)) \
&& HAVE_SAME_LONG_DOUBLE_AS_DOUBLE))
resultl = nanl + 42.0L;
#else
fputs ("Skipping test: known failure on this platform\n", stderr);
return 77;
#endif
break;
default:
break;
}
return test_exit_status;
}
#else
/* No HAVE_FPE_TRAPPING available.
We could use the various alternative approaches from
libgfortran/config/fpu-*.h, but that's not worth it. */
int
main ()
{
fputs ("Skipping test: feenableexcept not available\n", stderr);
return 77;
}
#endif