about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog20
-rw-r--r--math/test-snan.c378
2 files changed, 85 insertions, 313 deletions
diff --git a/ChangeLog b/ChangeLog
index 4851863b85..ef9bbf6152 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2015-02-10  Roland McGrath  <roland@hack.frob.com>
+
+	* math/test-snan.c: Drop unnecessary #include's of <stdlib.h>,
+	<sys/time.h>, <string.h>, and <errno.h>.
+	(dest_offset, dest_address, value, zero): Remove unused variables.
+	(ldouble): Remove typedef.
+	(myFPsighandler): Use simple handler signature, not SA_SIGINFO
+	signature.  Pass 1 to siglongjmp rather than 0 (which is converted to
+	1).  Fix code style.
+	(set_sigaction_FP, remove_sigaction_FP): Functions removed.
+	(check): Function removed.
+	(CHECK): New macro.
+	(TEST_FUNC): Fix code style.  Use CHECK macro rather than repeating
+	boilerplate feclearexcept + feenableexcept + sigsetjmp code.
+	Don't call set_sigaction_FP and remove_sigaction_FP here.
+	(ldouble_test): Just use 'long double' as macro argument, no need for
+	the 'ldouble' typedef.
+	(do_test): Set up SIGFPE handler at start, using plain signal rather
+	than sigaction.  Fix code style.
+
 2015-02-10  Evangelos Foutras  <evangelos@foutrelis.com>
 
 	[BZ #17949]
diff --git a/math/test-snan.c b/math/test-snan.c
index 2bcf2be529..0c36224cc1 100644
--- a/math/test-snan.c
+++ b/math/test-snan.c
@@ -19,73 +19,40 @@
 
 #define _GNU_SOURCE 1
 #include <stdio.h>
-#include <stdlib.h>
-#include <sys/time.h>
-#include <string.h>
 #include <math.h>
 #include <float.h>
 #include <fenv.h>
 #include <signal.h>
 #include <setjmp.h>
-#include <errno.h>
 
 #include <math-tests.h>
 
 
-int dest_offset;
-char *dest_address;
-double	value = 123.456;
-double	zero = 0.0;
-
 static sigjmp_buf sigfpe_buf;
 
-typedef long double ldouble;
-
-
-void
-myFPsighandler(int signal,
-             siginfo_t *info,
-             void *context)
-{
-  siglongjmp(sigfpe_buf, 0);
-}
-
-int
-set_sigaction_FP(void)
+static void
+myFPsighandler (int signal)
 {
-    struct sigaction sa;
-    /* register RT signal handler via sigaction */
-    sa.sa_flags = SA_SIGINFO;
-    sa.sa_sigaction = &myFPsighandler;
-    sigemptyset(&sa.sa_mask);
-    sigaction(SIGFPE, &sa, NULL);
-
-    return 0;
-}
-
-int
-remove_sigaction_FP(void)
-{
-    struct sigaction sa;
-    /* restore default RT signal handler via sigaction */
-    sa.sa_flags = SA_SIGINFO;
-    sa.sa_handler = SIG_DFL;
-    sigemptyset(&sa.sa_mask);
-    sigaction(SIGFPE, &sa, NULL);
-
-    return 0;
+  siglongjmp (sigfpe_buf, 1);
 }
 
 static int errors = 0;
 
-static void
-check (const char *testname, int result)
-{
-  if (!result) {
-    printf ("Failure: %s\n", testname);
-    errors++;
-  }
-}
+#define CHECK(testname, expr)						      \
+  do {									      \
+    feclearexcept (FE_ALL_EXCEPT);					      \
+    feenableexcept (FE_ALL_EXCEPT);					      \
+    if (sigsetjmp (sigfpe_buf, 0))					      \
+      {									      \
+	printf ("%s raised SIGFPE\n", testname);			      \
+	++errors;							      \
+      }									      \
+    else if (!(expr))							      \
+      {									      \
+        printf ("Failure: %s\n", testname);				      \
+        ++errors;							      \
+      }									      \
+  } while (0)
 
 #define TEST_FUNC(NAME, FLOAT, SUFFIX)					      \
 static void								      \
@@ -112,278 +79,63 @@ NAME (void)								      \
   (void) &minus_sNaN_var;						      \
   (void) &Inf_var;							      \
 									      \
-  set_sigaction_FP ();							      \
-  fegetenv(&saved_fenv);						      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " issignaling (qNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " issignaling (qNaN)", !issignaling (qNaN_var));	      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " issignaling (-qNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " issignaling (-qNaN)", !issignaling (-qNaN_var));	      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " issignaling (sNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " issignaling (sNaN)",				      \
-	     SNAN_TESTS (FLOAT) ? issignaling (sNaN_var) : 1);		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " issignaling (-sNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " issignaling (-sNaN)",				      \
-	     SNAN_TESTS (FLOAT) ? issignaling (minus_sNaN_var) : 1);	      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isnan (qNaN) raised SIGFPE\n");			      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isnan (qNaN)", isnan (qNaN_var));			      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isnan (-qNaN) raised SIGFPE\n");			      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isnan (-qNaN)", isnan (-qNaN_var));		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isnan (sNaN) raised SIGFPE\n");			      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isnan (sNaN)",					      \
-	     SNAN_TESTS (FLOAT) ? isnan (sNaN_var) : 1);		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isnan (-sNaN) raised SIGFPE\n");			      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isnan (-sNaN)",					      \
-	     SNAN_TESTS (FLOAT) ? isnan (minus_sNaN_var) : 1);		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isinf (qNaN) raised SIGFPE\n");			      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isinf (qNaN)", !isinf (qNaN_var));		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isinf (-qNaN) raised SIGFPE\n");			      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isinf (-qNaN)", !isinf (-qNaN_var));		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isinf (sNaN) raised SIGFPE\n");			      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isinf (sNaN)",					      \
-	     SNAN_TESTS (FLOAT) ? !isinf (sNaN_var) : 1);		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isinf (-sNaN) raised SIGFPE\n");			      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isinf (-sNaN)",					      \
-	     SNAN_TESTS (FLOAT) ? !isinf (minus_sNaN_var) : 1);		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isfinite (qNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isfinite (qNaN)", !isfinite (qNaN_var));		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isfinite (-qNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isfinite (-qNaN)", !isfinite (-qNaN_var));	      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isfinite (sNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isfinite (sNaN)",					      \
-	     SNAN_TESTS (FLOAT) ? !isfinite (sNaN_var) : 1);		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isfinite (-sNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isfinite (-sNaN)",				      \
-	     SNAN_TESTS (FLOAT) ? !isfinite (minus_sNaN_var) : 1);	      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isnormal (qNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isnormal (qNaN)", !isnormal (qNaN_var));		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isnormal (-qNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isnormal (-qNaN)", !isnormal (-qNaN_var));	      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isnormal (sNaN) isnormal SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isnormal (sNaN)",					      \
-	     SNAN_TESTS (FLOAT) ? !isnormal (sNaN_var) : 1);		      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " isnormal (-sNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " isnormal (-sNaN)",				      \
-	     SNAN_TESTS (FLOAT) ? !isnormal (minus_sNaN_var) : 1);	      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " fpclassify (qNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " fpclassify (qNaN)", (fpclassify (qNaN_var)==FP_NAN));   \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " fpclassify (-qNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " fpclassify (-qNaN)", (fpclassify (-qNaN_var)==FP_NAN)); \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " fpclassify (sNaN) isnormal SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " fpclassify (sNaN)",				      \
-	     SNAN_TESTS (FLOAT) ? fpclassify (sNaN_var) == FP_NAN : 1);	      \
-    }									      \
-									      \
-  feclearexcept(FE_ALL_EXCEPT);						      \
-  feenableexcept (FE_ALL_EXCEPT);					      \
-  if (sigsetjmp(sigfpe_buf, 0))						      \
-    {									      \
-      printf (#FLOAT " fpclassify (-sNaN) raised SIGFPE\n");		      \
-      errors++;								      \
-    } else {								      \
-      check (#FLOAT " fpclassify (-sNaN)",				      \
-	     SNAN_TESTS (FLOAT) ? fpclassify (minus_sNaN_var) == FP_NAN : 1); \
-    }									      \
-									      \
-  fesetenv(&saved_fenv); /* restore saved fenv */			      \
-  remove_sigaction_FP();						      \
-}
+  fegetenv (&saved_fenv);						      \
+									      \
+  CHECK (#FLOAT " issignaling (qNaN)", !issignaling (qNaN_var));	      \
+  CHECK (#FLOAT " issignaling (-qNaN)", !issignaling (-qNaN_var));	      \
+  CHECK (#FLOAT " issignaling (sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? issignaling (sNaN_var) : 1);		      \
+  CHECK (#FLOAT " issignaling (-sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? issignaling (minus_sNaN_var) : 1);	      \
+  CHECK (#FLOAT " isnan (qNaN)", isnan (qNaN_var));			      \
+  CHECK (#FLOAT " isnan (-qNaN)", isnan (-qNaN_var));			      \
+  CHECK (#FLOAT " isnan (sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? isnan (sNaN_var) : 1);			      \
+  CHECK (#FLOAT " isnan (-sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? isnan (minus_sNaN_var) : 1);		      \
+  CHECK (#FLOAT " isinf (qNaN)", !isinf (qNaN_var));			      \
+  CHECK (#FLOAT " isinf (-qNaN)", !isinf (-qNaN_var));			      \
+  CHECK (#FLOAT " isinf (sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? !isinf (sNaN_var) : 1);			      \
+  CHECK (#FLOAT " isinf (-sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? !isinf (minus_sNaN_var) : 1);		      \
+  CHECK (#FLOAT " isfinite (qNaN)", !isfinite (qNaN_var));		      \
+  CHECK (#FLOAT " isfinite (-qNaN)", !isfinite (-qNaN_var));		      \
+  CHECK (#FLOAT " isfinite (sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? !isfinite (sNaN_var) : 1);		      \
+  CHECK (#FLOAT " isfinite (-sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? !isfinite (minus_sNaN_var) : 1);		      \
+  CHECK (#FLOAT " isnormal (qNaN)", !isnormal (qNaN_var));		      \
+  CHECK (#FLOAT " isnormal (-qNaN)", !isnormal (-qNaN_var));		      \
+  CHECK (#FLOAT " isnormal (sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? !isnormal (sNaN_var) : 1);		      \
+  CHECK (#FLOAT " isnormal (-sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? !isnormal (minus_sNaN_var) : 1);		      \
+  CHECK (#FLOAT " fpclassify (qNaN)", (fpclassify (qNaN_var)==FP_NAN));	      \
+  CHECK (#FLOAT " fpclassify (-qNaN)", (fpclassify (-qNaN_var)==FP_NAN));     \
+  CHECK (#FLOAT " fpclassify (sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? fpclassify (sNaN_var) == FP_NAN : 1);	      \
+  CHECK (#FLOAT " fpclassify (-sNaN)",					      \
+         SNAN_TESTS (FLOAT) ? fpclassify (minus_sNaN_var) == FP_NAN : 1);     \
+									      \
+  fesetenv (&saved_fenv); /* restore saved fenv */			      \
+}									      \
 
 TEST_FUNC (float_test, float, f)
 TEST_FUNC (double_test, double, )
 #ifndef NO_LONG_DOUBLE
-TEST_FUNC (ldouble_test, ldouble, l)
+TEST_FUNC (ldouble_test, long double, l)
 #endif
 
 static int
 do_test (void)
 {
-  float_test();
-  double_test();
+  signal (SIGFPE, &myFPsighandler);
+
+  float_test ();
+  double_test ();
 #ifndef NO_LONG_DOUBLE
-  ldouble_test();
+  ldouble_test ();
 #endif
 
   return errors != 0;