[roland/test-snan] Clean up math/test-snan.
diff mbox

Message ID 20150206210012.080072C3A9B@topped-with-meat.com
State New
Headers show

Commit Message

Roland McGrath Feb. 6, 2015, 9 p.m. UTC
This is a general cleanup of test-snan.c, intended not to change at all
what it actually does.  My real motivation for touching this test was to
make it stop gratuitously using SA_SIGINFO (which it doesn't actually need).
But when I saw the cruft and duplication rampant in this file, I had to act.

Tested x86_64-linux-gnu.

OK?


Thanks,
Roland


2015-02-06  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.

Comments

Carlos O'Donell Feb. 7, 2015, 2:47 a.m. UTC | #1
On 02/06/2015 04:00 PM, Roland McGrath wrote:
> This is a general cleanup of test-snan.c, intended not to change at all
> what it actually does.  My real motivation for touching this test was to
> make it stop gratuitously using SA_SIGINFO (which it doesn't actually need).
> But when I saw the cruft and duplication rampant in this file, I had to act.
> 
> Tested x86_64-linux-gnu.
> 
> OK?
> 
> 
> Thanks,
> Roland
> 
> 
> 2015-02-06  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.

OK.

c.
Carlos O'Donell Feb. 7, 2015, 2:47 a.m. UTC | #2
On 02/06/2015 04:00 PM, Roland McGrath wrote:
> This is a general cleanup of test-snan.c, intended not to change at all
> what it actually does.  My real motivation for touching this test was to
> make it stop gratuitously using SA_SIGINFO (which it doesn't actually need).
> But when I saw the cruft and duplication rampant in this file, I had to act.
> 
> Tested x86_64-linux-gnu.
> 
> OK?
> 
> 
> Thanks,
> Roland
> 
> 
> 2015-02-06  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.

OK.

c.
Roland McGrath Feb. 10, 2015, 9:56 p.m. UTC | #3
Committed.

Thanks,
Roland

Patch
diff mbox

--- 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;