This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Don't include function names in test data in generated libm-test.c


This patch makes the strings in the test structures in the generated
libm-test.c that are used to generate test names contain only the
function arguments, and not the function name, with the full test name
being computed at runtime (the same way as is already done for "Real
part of" and "Imaginary part of" test names).  Where a test covers
multiple outputs of a function, only one string is now needed in this
structure, rather than a separate name for each test.

This will allow test arrays to be shared between multiple functions
with identical semantics for their test data (remainder, drem; lgamma,
lgamma_r, gamma; isfinite, finite; exp10, pow10).  It will also allow
the START_DATA and END_DATA calls to be removed, and START and END to
be changed into ordinary macros instead of something specially
processed by gen-libm-test.pl (in the case of END, separate macros for
real and complex functions).  When conversion to MPFR-based generation
of expected results for each format allows accurate expected results
for each rounding mode, it will also allow for test structures to be
shared between rounding modes (containing one string, one test input,
four expected results).

Tested x86_64 and x86.

2013-05-22  Joseph Myers  <joseph@codesourcery.com>

	* math/gen-libm-test.pl (parse_args): Output only string of
	arguments as text for test name, not full call or descriptions of
	tests for extra outputs.
	(generate_testfile): Do not pass function name to parse_args.
	Generate this_func variable from START.
	* math/libm-test.inc (struct test_f_f_data): Rename test_name
	field to arg_str.
	(struct test_ff_f_data): Likewise.
	(test_ff_f_data_nexttoward): Likewise.
	(struct test_fi_f_data): Likewise.
	(struct test_fl_f_data): Likewise.
	(struct test_if_f_data): Likewise.
	(struct test_fff_f_data): Likewise.
	(struct test_c_f_data): Likewise.
	(struct test_f_f1_data): Likewise.  Remove field extra_name.
	(struct test_fF_f1_data): Likewise.
	(struct test_ffI_f1_data): Likewise.
	(struct test_c_c_data): Rename test_name field to arg_str.
	(struct test_cc_c_data): Likewise.
	(struct test_f_i_data): Likewise.
	(struct test_ff_i_data): Likewise.
	(struct test_f_l_data): Likewise.
	(struct test_f_L_data): Likewise.
	(struct test_fFF_11_data): Likewise.  Remove fields extra1_name
	and extra2_name.
	(COMMON_TEST_SETUP): New macro.
	(EXTRA_OUTPUT_TEST_SETUP): Likewise.
	(COMMON_TEST_CLEANUP): Likewise.
	(EXTRA_OUTPUT_TEST_CLEANUP): Likewise.
	(RUN_TEST_f_f): Take argument string.  Call new setup and cleanup
	macros.
	(RUN_TEST_LOOP_f_f): Update call to RUN_TEST_f_f.
	(RUN_TEST_2_f): Take argument string.  Call new setup and cleanup
	macros.
	(RUN_TEST_LOOP_2_f): Update call to RUN_TEST_2_f.
	(RUN_TEST_fff_f): Take argument string.  Call new setup and
	cleanup macros.
	(RUN_TEST_LOOP_fff_f): Update call to RUN_TEST_fff_f.
	(RUN_TEST_c_f): Take argument string.  Call new setup and cleanup
	macros.
	(RUN_TEST_LOOP_c_f): Update call to RUN_TEST_c_f.
	(RUN_TEST_f_f1): Take argument string.  Call new setup and cleanup
	macros.
	(RUN_TEST_LOOP_f_f1): Update call to RUN_TEST_f_f1.
	(RUN_TEST_fF_f1): Take argument string.  Call new setup and
	cleanup macros.
	(RUN_TEST_LOOP_fF_f1): Update call to RUN_TEST_fF_f1.
	(RUN_TEST_fI_f1): Take argument string.  Call new setup and
	cleanup macros.
	(RUN_TEST_LOOP_fI_f1): Update call to RUN_TEST_fI_f1.
	(RUN_TEST_ffI_f1): Take argument string.  Call new setup and
	cleanup macros.
	(RUN_TEST_LOOP_ffI_f1): Update call to RUN_TEST_ffI_f1.
	(RUN_TEST_c_c): Take argument string.  Call new setup and cleanup
	macros.
	(RUN_TEST_LOOP_c_c): Update call to RUN_TEST_c_c.
	(RUN_TEST_cc_c): Take argument string.  Call new setup and cleanup
	macros.
	(RUN_TEST_LOOP_cc_c): Update call to RUN_TEST_cc_c.
	(RUN_TEST_f_i): Take argument string.  Call new setup and cleanup
	macros.
	(RUN_TEST_LOOP_f_i): Update call to RUN_TEST_f_i.
	(RUN_TEST_f_i_tg): Take argument string.  Call new setup and
	cleanup macros.
	(RUN_TEST_LOOP_f_i_tg): Update call to RUN_TEST_f_i_tg.
	(RUN_TEST_ff_i_tg): Take argument string.  Call new setup and
	cleanup macros.
	(RUN_TEST_LOOP_ff_i_tg): Update call to RUN_TEST_ff_i_tg.
	(RUN_TEST_f_b): Take argument string.  Call new setup and cleanup
	macros.
	(RUN_TEST_LOOP_f_b): Update call to RUN_TEST_f_b.
	(RUN_TEST_f_b_tg): Take argument string.  Call new setup and
	cleanup macros.
	(RUN_TEST_LOOP_f_b_tg): Update call to RUN_TEST_f_b_tg.
	(RUN_TEST_f_l): Take argument string.  Call new setup and cleanup
	macros.
	(RUN_TEST_LOOP_f_l): Update call to RUN_TEST_f_l.
	(RUN_TEST_f_L): Take argument string.  Call new setup and cleanup
	macros.
	(RUN_TEST_LOOP_f_L): Update call to RUN_TEST_f_L.
	(RUN_TEST_fFF_11): Take argument string.  Call new setup and
	cleanup macros.
	(RUN_TEST_LOOP_fFF_11): Update call to RUN_TEST_fFF_11.

diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index e1a32e5..a6004a8 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -158,17 +158,17 @@ sub show_exceptions {
 
 # Parse the arguments to TEST_x_y
 sub parse_args {
-  my ($file, $descr, $fct, $args) = @_;
-  my (@args, $str, $descr_args, $descr_res, @descr);
+  my ($file, $descr, $args) = @_;
+  my (@args, $descr_args, $descr_res, @descr);
   my ($current_arg, $cline, $i);
   my (@special);
-  my ($call);
+  my ($call_args);
 
   ($descr_args, $descr_res) = split /_/,$descr, 2;
 
   @args = split /,\s*/, $args;
 
-  $call = "$fct (";
+  $call_args = "";
 
   # Generate first the string that's shown to the user
   $current_arg = 1;
@@ -180,7 +180,7 @@ sub parse_args {
     }
     # FLOAT, int, long int, long long int
     if ($descr[$i] =~ /f|i|l|L/) {
-      $call .= $comma . &beautify ($args[$current_arg]);
+      $call_args .= $comma . &beautify ($args[$current_arg]);
       ++$current_arg;
       next;
     }
@@ -190,15 +190,13 @@ sub parse_args {
     }
     # complex
     if ($descr[$i] eq 'c') {
-      $call .= $comma . &build_complex_beautify ($args[$current_arg], $args[$current_arg+1]);
+      $call_args .= $comma . &build_complex_beautify ($args[$current_arg], $args[$current_arg+1]);
       $current_arg += 2;
       next;
     }
 
     die ("$descr[$i] is unknown");
   }
-  $call .= ')';
-  $str = $call;
 
   # Result
   @descr = split //,$descr_res;
@@ -230,7 +228,7 @@ sub parse_args {
   # Put the C program line together
   # Reset some variables to start again
   $current_arg = 1;
-  $cline = "{ \"$str\"";
+  $cline = "{ \"$call_args\"";
   @descr = split //,$descr_args;
   for ($i=0; $i <= $#descr; $i++) {
     # FLOAT, int, long int, long long int
@@ -275,12 +273,10 @@ sub parse_args {
     ++$i;
     my ($extra_expected) = $_;
     my ($run_extra) = ($extra_expected ne "IGNORE" ? 1 : 0);
-    my ($str) = "$call extra output $i";
     if (!$run_extra) {
-      $str = "";
       $extra_expected = "0";
     }
-    $cline .= ", \"$str\", $run_extra, $extra_expected";
+    $cline .= ", $run_extra, $extra_expected";
   }
   print $file "    $cline },\n";
 }
@@ -289,7 +285,7 @@ sub parse_args {
 sub generate_testfile {
   my ($input, $output) = @_;
   my ($lasttext);
-  my (@args, $i, $str, $thisfct);
+  my (@args, $i);
 
   open INPUT, $input or die ("Can't open $input: $!");
   open OUTPUT, ">$output" or die ("Can't open $output: $!");
@@ -302,17 +298,18 @@ sub generate_testfile {
       my ($descr, $args);
       chop;
       ($descr, $args) = ($_ =~ /TEST_(\w+)\s*\((.*)\)/);
-      &parse_args (\*OUTPUT, $descr, $thisfct, $args);
+      &parse_args (\*OUTPUT, $descr, $args);
       next;
     }
     # START_DATA (function)
     if (/START_DATA/) {
-      ($thisfct) = ($_ =~ /START_DATA\s*\((.*)\)/);
       next;
     }
     # START (function)
     if (/START/) {
+      my ($thisfct);
       ($thisfct) = ($_ =~ /START\s*\((.*)\)/);
+      print OUTPUT "  const char *this_func = \"$thisfct\";\n";
       print OUTPUT "  init_max_error ();\n";
       next;
     }
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 3374ce9..5a02399 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -920,21 +920,21 @@ check_longlong (const char *test_name, long long int computed,
 /* Structures for each kind of test.  */
 struct test_f_f_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg;
   FLOAT expected;
   int exceptions;
 };
 struct test_ff_f_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg1, arg2;
   FLOAT expected;
   int exceptions;
 };
 struct test_ff_f_data_nexttoward
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg1;
   long double arg2;
   FLOAT expected;
@@ -942,7 +942,7 @@ struct test_ff_f_data_nexttoward
 };
 struct test_fi_f_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg1;
   int arg2;
   FLOAT expected;
@@ -950,7 +950,7 @@ struct test_fi_f_data
 };
 struct test_fl_f_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg1;
   long int arg2;
   FLOAT expected;
@@ -958,7 +958,7 @@ struct test_fl_f_data
 };
 struct test_if_f_data
 {
-  const char *test_name;
+  const char *arg_str;
   int arg1;
   FLOAT arg2;
   FLOAT expected;
@@ -966,14 +966,14 @@ struct test_if_f_data
 };
 struct test_fff_f_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg1, arg2, arg3;
   FLOAT expected;
   int exceptions;
 };
 struct test_c_f_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT argr, argc;
   FLOAT expected;
   int exceptions;
@@ -981,44 +981,41 @@ struct test_c_f_data
 /* Used for both RUN_TEST_LOOP_f_f1 and RUN_TEST_LOOP_fI_f1.  */
 struct test_f_f1_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg;
   FLOAT expected;
   int exceptions;
-  const char *extra_name;
   int extra_test;
   int extra_expected;
 };
 struct test_fF_f1_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg;
   FLOAT expected;
   int exceptions;
-  const char *extra_name;
   int extra_test;
   FLOAT extra_expected;
 };
 struct test_ffI_f1_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg1, arg2;
   FLOAT expected;
   int exceptions;
-  const char *extra_name;
   int extra_test;
   int extra_expected;
 };
 struct test_c_c_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT argr, argc;
   FLOAT expr, expc;
   int exceptions;
 };
 struct test_cc_c_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg1r, arg1c, arg2r, arg2c;
   FLOAT expr, expc;
   int exceptions;
@@ -1027,41 +1024,39 @@ struct test_cc_c_data
    RUN_TEST_LOOP_f_b and RUN_TEST_LOOP_f_b_tg.  */
 struct test_f_i_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg;
   int expected;
   int exceptions;
 };
 struct test_ff_i_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg1, arg2;
   int expected;
   int exceptions;
 };
 struct test_f_l_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg;
   long int expected;
   int exceptions;
 };
 struct test_f_L_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg;
   long long int expected;
   int exceptions;
 };
 struct test_fFF_11_data
 {
-  const char *test_name;
+  const char *arg_str;
   FLOAT arg;
   int exceptions;
-  const char *extra1_name;
   int extra1_test;
   FLOAT extra1_expected;
-  const char *extra2_name;
   int extra2_test;
   FLOAT extra2_expected;
 };
@@ -1090,26 +1085,59 @@ struct test_fFF_11_data
 #define ROUND_RESTORE_FE_UPWARD			\
   fesetround (save_round_mode)
 
+/* Common setup for an individual test.  */
+#define COMMON_TEST_SETUP(ARG_STR)					\
+  char *test_name;							\
+  if (asprintf (&test_name, "%s (%s)", this_func, (ARG_STR)) == -1)	\
+    abort ()
+
+/* Setup for a test with an extra output.  */
+#define EXTRA_OUTPUT_TEST_SETUP(ARG_STR, N)			\
+  char *extra##N##_name;					\
+  if (asprintf (&extra##N##_name, "%s (%s) extra output " #N,	\
+		this_func, (ARG_STR)) == -1)			\
+    abort ()
+
+/* Common cleanup after an individual test.  */
+#define COMMON_TEST_CLEANUP			\
+  free (test_name)
+
+/* Cleanup for a test with an extra output.  */
+#define EXTRA_OUTPUT_TEST_CLEANUP(N)		\
+  free (extra##N##_name)
+
 /* Run an individual test, including any required setup and checking
    of results, or loop over all tests in an array.  */
-#define RUN_TEST_f_f(TEST_NAME, FUNC_NAME, ARG, EXPECTED,	\
+#define RUN_TEST_f_f(ARG_STR, FUNC_NAME, ARG, EXPECTED,	\
 		     EXCEPTIONS)				\
-  check_float (TEST_NAME, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
-	       EXCEPTIONS)
+  do								\
+    {								\
+      COMMON_TEST_SETUP (ARG_STR);				\
+      check_float (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
+		   EXCEPTIONS);					\
+      COMMON_TEST_CLEANUP;					\
+    }								\
+  while (0)
 #define RUN_TEST_LOOP_f_f(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_f_f ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
+      RUN_TEST_f_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
 		    (ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_2_f(TEST_NAME, FUNC_NAME, ARG1, ARG2, EXPECTED,	\
+#define RUN_TEST_2_f(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED,		\
 		     EXCEPTIONS)					\
-  check_float (TEST_NAME, FUNC (FUNC_NAME) (ARG1, ARG2), EXPECTED,	\
-	       EXCEPTIONS)
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_float (test_name, FUNC (FUNC_NAME) (ARG1, ARG2), EXPECTED,	\
+		   EXCEPTIONS);						\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_2_f(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_2_f ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg1,	\
+      RUN_TEST_2_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1,	\
 		    (ARRAY)[i].arg2, (ARRAY)[i].expected,		\
 		    (ARRAY)[i].exceptions);				\
   ROUND_RESTORE_ ## ROUNDING_MODE
@@ -1121,230 +1149,314 @@ struct test_fFF_11_data
 #define RUN_TEST_LOOP_fl_f RUN_TEST_LOOP_2_f
 #define RUN_TEST_if_f RUN_TEST_2_f
 #define RUN_TEST_LOOP_if_f RUN_TEST_LOOP_2_f
-#define RUN_TEST_fff_f(TEST_NAME, FUNC_NAME, ARG1, ARG2, ARG3,	\
-		       EXPECTED, EXCEPTIONS)			\
-  check_float (TEST_NAME, FUNC (FUNC_NAME) (ARG1, ARG2, ARG3),	\
-	       EXPECTED, EXCEPTIONS)
+#define RUN_TEST_fff_f(ARG_STR, FUNC_NAME, ARG1, ARG2, ARG3,		\
+		       EXPECTED, EXCEPTIONS)				\
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_float (test_name, FUNC (FUNC_NAME) (ARG1, ARG2, ARG3),	\
+		   EXPECTED, EXCEPTIONS);				\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_fff_f(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_fff_f ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg1,	\
+      RUN_TEST_fff_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1,	\
 		      (ARRAY)[i].arg2, (ARRAY)[i].arg3,			\
 		      (ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_c_f(TEST_NAME, FUNC_NAME, ARG1, ARG2, EXPECTED,	\
+#define RUN_TEST_c_f(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED,		\
 		     EXCEPTIONS)					\
-  check_float (TEST_NAME,						\
-	       FUNC (FUNC_NAME) (BUILD_COMPLEX (ARG1, ARG2)),		\
-	       EXPECTED, EXCEPTIONS)
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_float (test_name,						\
+		   FUNC (FUNC_NAME) (BUILD_COMPLEX (ARG1, ARG2)),	\
+		   EXPECTED, EXCEPTIONS);				\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_c_f(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_c_f ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].argr,	\
+      RUN_TEST_c_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].argr,	\
 		    (ARRAY)[i].argc, (ARRAY)[i].expected,		\
 		    (ARRAY)[i].exceptions);				\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_f_f1(TEST_NAME, FUNC_NAME, ARG, EXPECTED,	\
-		      EXCEPTIONS,				\
-		      EXTRA_NAME, EXTRA_VAR, EXTRA_TEST,	\
-		      EXTRA_EXPECTED)		\
+#define RUN_TEST_f_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED,	\
+		      EXCEPTIONS, EXTRA_VAR, EXTRA_TEST,	\
+		      EXTRA_EXPECTED)				\
   do								\
     {								\
+      COMMON_TEST_SETUP (ARG_STR);				\
       (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;		\
-      check_float (TEST_NAME, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
+      check_float (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
 		   EXCEPTIONS);					\
+      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);			\
       if (EXTRA_TEST)						\
-	check_int (EXTRA_NAME, EXTRA_VAR, EXTRA_EXPECTED, 0);	\
+	check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);	\
+      EXTRA_OUTPUT_TEST_CLEANUP (1);				\
+      COMMON_TEST_CLEANUP;					\
     }								\
   while (0)
 #define RUN_TEST_LOOP_f_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR)	\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_f_f1 ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
-		     (ARRAY)[i].expected,				\
-		     (ARRAY)[i].exceptions, (ARRAY)[i].extra_name,	\
+      RUN_TEST_f_f1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
+		     (ARRAY)[i].expected, (ARRAY)[i].exceptions,	\
 		     EXTRA_VAR, (ARRAY)[i].extra_test,			\
 		     (ARRAY)[i].extra_expected);			\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_fF_f1(TEST_NAME, FUNC_NAME, ARG, EXPECTED,		\
-		       EXCEPTIONS,					\
-		       EXTRA_NAME, EXTRA_VAR, EXTRA_TEST,		\
+#define RUN_TEST_fF_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED,		\
+		       EXCEPTIONS, EXTRA_VAR, EXTRA_TEST,		\
 		       EXTRA_EXPECTED)					\
   do									\
     {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
       (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;			\
-      check_float (TEST_NAME, FUNC (FUNC_NAME) (ARG, &(EXTRA_VAR)),	\
+      check_float (test_name, FUNC (FUNC_NAME) (ARG, &(EXTRA_VAR)),	\
 		   EXPECTED, EXCEPTIONS);				\
+      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
       if (EXTRA_TEST)							\
-	check_float (EXTRA_NAME, EXTRA_VAR, EXTRA_EXPECTED, 0);		\
+	check_float (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);	\
+      EXTRA_OUTPUT_TEST_CLEANUP (1);					\
+      COMMON_TEST_CLEANUP;						\
     }									\
   while (0)
 #define RUN_TEST_LOOP_fF_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR)	\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_fF_f1 ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
-		      (ARRAY)[i].expected,				\
-		      (ARRAY)[i].exceptions, (ARRAY)[i].extra_name,	\
+      RUN_TEST_fF_f1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
+		      (ARRAY)[i].expected, (ARRAY)[i].exceptions,	\
 		      EXTRA_VAR, (ARRAY)[i].extra_test,			\
 		      (ARRAY)[i].extra_expected);			\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_fI_f1(TEST_NAME, FUNC_NAME, ARG, EXPECTED,		\
-		       EXCEPTIONS,					\
-		       EXTRA_NAME, EXTRA_VAR, EXTRA_TEST,		\
+#define RUN_TEST_fI_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED,		\
+		       EXCEPTIONS, EXTRA_VAR, EXTRA_TEST,		\
 		       EXTRA_EXPECTED)					\
   do									\
     {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
       (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;			\
-      check_float (TEST_NAME, FUNC (FUNC_NAME) (ARG, &(EXTRA_VAR)),	\
+      check_float (test_name, FUNC (FUNC_NAME) (ARG, &(EXTRA_VAR)),	\
 		   EXPECTED, EXCEPTIONS);				\
+      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
       if (EXTRA_TEST)							\
-	check_int (EXTRA_NAME, EXTRA_VAR, EXTRA_EXPECTED, 0);		\
+	check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);		\
+      EXTRA_OUTPUT_TEST_CLEANUP (1);					\
+      COMMON_TEST_CLEANUP;						\
     }									\
   while (0)
 #define RUN_TEST_LOOP_fI_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR)	\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_fI_f1 ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
-		      (ARRAY)[i].expected,				\
-		      (ARRAY)[i].exceptions, (ARRAY)[i].extra_name,	\
+      RUN_TEST_fI_f1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
+		      (ARRAY)[i].expected, (ARRAY)[i].exceptions,	\
 		      EXTRA_VAR, (ARRAY)[i].extra_test,			\
 		      (ARRAY)[i].extra_expected);			\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_ffI_f1(TEST_NAME, FUNC_NAME, ARG1, ARG2, EXPECTED,	\
-			EXCEPTIONS,					\
-			EXTRA_NAME, EXTRA_VAR, EXTRA_TEST,		\
+#define RUN_TEST_ffI_f1(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED,	\
+			EXCEPTIONS, EXTRA_VAR, EXTRA_TEST,		\
 			EXTRA_EXPECTED)					\
   do									\
     {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
       (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;			\
-      check_float (TEST_NAME,						\
+      check_float (test_name,						\
 		   FUNC (FUNC_NAME) (ARG1, ARG2, &(EXTRA_VAR)),		\
 		   EXPECTED, EXCEPTIONS);				\
+      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
       if (EXTRA_TEST)							\
-	check_int (EXTRA_NAME, EXTRA_VAR, EXTRA_EXPECTED, 0);		\
+	check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);		\
+      EXTRA_OUTPUT_TEST_CLEANUP (1);					\
+      COMMON_TEST_CLEANUP;						\
     }									\
   while (0)
 #define RUN_TEST_LOOP_ffI_f1(FUNC_NAME, ARRAY, ROUNDING_MODE,		\
 			     EXTRA_VAR)					\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_ffI_f1 ((ARRAY)[i].test_name, FUNC_NAME,			\
+      RUN_TEST_ffI_f1 ((ARRAY)[i].arg_str, FUNC_NAME,			\
 		       (ARRAY)[i].arg1, (ARRAY)[i].arg2,		\
-		       (ARRAY)[i].expected,				\
-		       (ARRAY)[i].exceptions, (ARRAY)[i].extra_name,	\
+		       (ARRAY)[i].expected, (ARRAY)[i].exceptions,	\
 		       EXTRA_VAR, (ARRAY)[i].extra_test,		\
 		       (ARRAY)[i].extra_expected);			\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_c_c(TEST_NAME, FUNC_NAME, ARGR, ARGC, EXPR, EXPC,	\
+#define RUN_TEST_c_c(ARG_STR, FUNC_NAME, ARGR, ARGC, EXPR, EXPC,	\
 		     EXCEPTIONS)					\
-  check_complex (TEST_NAME,						\
-		 FUNC (FUNC_NAME) (BUILD_COMPLEX (ARGR, ARGC)),		\
-		 BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS)
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_complex (test_name,						\
+		     FUNC (FUNC_NAME) (BUILD_COMPLEX (ARGR, ARGC)),	\
+		     BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS);		\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_c_c(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_c_c ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].argr,	\
+      RUN_TEST_c_c ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].argr,	\
 		    (ARRAY)[i].argc, (ARRAY)[i].expr, (ARRAY)[i].expc,	\
 		    (ARRAY)[i].exceptions);				\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_cc_c(TEST_NAME, FUNC_NAME, ARG1R, ARG1C, ARG2R, ARG2C,	\
+#define RUN_TEST_cc_c(ARG_STR, FUNC_NAME, ARG1R, ARG1C, ARG2R, ARG2C,	\
 		      EXPR, EXPC, EXCEPTIONS)				\
-  check_complex (TEST_NAME,						\
-		 FUNC (FUNC_NAME) (BUILD_COMPLEX (ARG1R, ARG1C),	\
-				   BUILD_COMPLEX (ARG2R, ARG2C)),	\
-		 BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS)
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_complex (test_name,						\
+		     FUNC (FUNC_NAME) (BUILD_COMPLEX (ARG1R, ARG1C),	\
+				       BUILD_COMPLEX (ARG2R, ARG2C)),	\
+		     BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS);		\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_cc_c(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_cc_c ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg1r,	\
+      RUN_TEST_cc_c ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1r,	\
 		     (ARRAY)[i].arg1c, (ARRAY)[i].arg2r,		\
 		     (ARRAY)[i].arg2c, (ARRAY)[i].expr,			\
 		     (ARRAY)[i].expc, (ARRAY)[i].exceptions);		\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_f_i(TEST_NAME, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
-  check_int (TEST_NAME, FUNC (FUNC_NAME) (ARG), EXPECTED, EXCEPTIONS)
+#define RUN_TEST_f_i(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_int (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,		\
+		 EXCEPTIONS);						\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_f_i(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_f_i ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
+      RUN_TEST_f_i ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
 		    (ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_f_i_tg(TEST_NAME, FUNC_NAME, ARG, EXPECTED,	\
-			EXCEPTIONS)				\
-  check_int (TEST_NAME, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS)
+#define RUN_TEST_f_i_tg(ARG_STR, FUNC_NAME, ARG, EXPECTED,		\
+			EXCEPTIONS)					\
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_int (test_name, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS);	\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_f_i_tg(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_f_i_tg ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
+      RUN_TEST_f_i_tg ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
 		       (ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_ff_i_tg(TEST_NAME, FUNC_NAME, ARG1, ARG2, EXPECTED,	\
+#define RUN_TEST_ff_i_tg(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED,	\
 			 EXCEPTIONS)					\
-  check_int (TEST_NAME, FUNC_NAME (ARG1, ARG2), EXPECTED, EXCEPTIONS)
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_int (test_name, FUNC_NAME (ARG1, ARG2), EXPECTED,		\
+		 EXCEPTIONS);						\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_ff_i_tg(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_ff_i_tg ((ARRAY)[i].test_name, FUNC_NAME,		\
+      RUN_TEST_ff_i_tg ((ARRAY)[i].arg_str, FUNC_NAME,		\
 			(ARRAY)[i].arg1, (ARRAY)[i].arg2,		\
 			(ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_f_b(TEST_NAME, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
-  check_bool (TEST_NAME, FUNC (FUNC_NAME) (ARG), EXPECTED, EXCEPTIONS)
+#define RUN_TEST_f_b(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_bool (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,		\
+		  EXCEPTIONS);						\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_f_b(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_f_b ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
+      RUN_TEST_f_b ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
 		    (ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_f_b_tg(TEST_NAME, FUNC_NAME, ARG, EXPECTED,	\
-			EXCEPTIONS)				\
-  check_bool (TEST_NAME, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS)
+#define RUN_TEST_f_b_tg(ARG_STR, FUNC_NAME, ARG, EXPECTED,		\
+			EXCEPTIONS)					\
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_bool (test_name, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS);	\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_f_b_tg(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_f_b_tg ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
+      RUN_TEST_f_b_tg ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
 		       (ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_f_l(TEST_NAME, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
-  check_long (TEST_NAME, FUNC (FUNC_NAME) (ARG), EXPECTED, EXCEPTIONS)
+#define RUN_TEST_f_l(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_long (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,		\
+		  EXCEPTIONS);						\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_f_l(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_f_l ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
+      RUN_TEST_f_l ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
 		    (ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_f_L(TEST_NAME, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
-  check_longlong (TEST_NAME, FUNC (FUNC_NAME) (ARG), EXPECTED,		\
-		  EXCEPTIONS)
+#define RUN_TEST_f_L(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
+  do									\
+    {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
+      check_longlong (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
+		      EXCEPTIONS);					\
+      COMMON_TEST_CLEANUP;						\
+    }									\
+  while (0)
 #define RUN_TEST_LOOP_f_L(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_f_L ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
+      RUN_TEST_f_L ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
 		    (ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_fFF_11(TEST_NAME, FUNC_NAME, ARG, EXCEPTIONS,		\
-			EXTRA1_NAME, EXTRA1_VAR, EXTRA1_TEST,		\
-			EXTRA1_EXPECTED, EXTRA2_NAME, EXTRA2_VAR,	\
+#define RUN_TEST_fFF_11(ARG_STR, FUNC_NAME, ARG, EXCEPTIONS,		\
+			EXTRA1_VAR, EXTRA1_TEST,			\
+			EXTRA1_EXPECTED, EXTRA2_VAR,			\
 			EXTRA2_TEST, EXTRA2_EXPECTED)			\
   do									\
     {									\
+      COMMON_TEST_SETUP (ARG_STR);					\
       FUNC (FUNC_NAME) (ARG, &(EXTRA1_VAR), &(EXTRA2_VAR));		\
+      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
       if (EXTRA1_TEST)							\
-	check_float (EXTRA1_NAME, EXTRA1_VAR, EXTRA1_EXPECTED,		\
+	check_float (extra1_name, EXTRA1_VAR, EXTRA1_EXPECTED,		\
 		     EXCEPTIONS);					\
+      EXTRA_OUTPUT_TEST_CLEANUP (1);					\
+      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 2);				\
       if (EXTRA2_TEST)							\
-	check_float (EXTRA2_NAME, EXTRA2_VAR, EXTRA2_EXPECTED, 0);	\
+	check_float (extra2_name, EXTRA2_VAR, EXTRA2_EXPECTED, 0);	\
+      EXTRA_OUTPUT_TEST_CLEANUP (2);					\
+      COMMON_TEST_CLEANUP;						\
     }									\
   while (0)
 #define RUN_TEST_LOOP_fFF_11(FUNC_NAME, ARRAY, ROUNDING_MODE,		\
 			     EXTRA1_VAR, EXTRA2_VAR)			\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_fFF_11 ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
-		       (ARRAY)[i].exceptions, (ARRAY)[i].extra1_name,	\
+      RUN_TEST_fFF_11 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
+		       (ARRAY)[i].exceptions,				\
 		       EXTRA1_VAR, (ARRAY)[i].extra1_test,		\
 		       (ARRAY)[i].extra1_expected,			\
-		       (ARRAY)[i].extra2_name, EXTRA2_VAR,		\
+		       EXTRA2_VAR,					\
 		       (ARRAY)[i].extra2_test,				\
 		       (ARRAY)[i].extra2_expected);			\
   ROUND_RESTORE_ ## ROUNDING_MODE

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]