conformtest: Make more tests into compilation tests [committed]

Submitted by Joseph S. Myers on March 16, 2017, 5:52 p.m.

Details

Message ID alpine.DEB.2.20.1703161751450.18031@digraph.polyomino.org.uk
State New
Headers show

Commit Message

Joseph S. Myers March 16, 2017, 5:52 p.m.
The conformtest header tests test some things through compilation
tests and others through execution tests.  This patch makes more of
the tests into compilation tests, using _Static_assert (note: for
float.h tests on floating-point values this is depending on a GNU
extension, that those assertions are allowed in the absence of
-pedantic although they aren't strictly integer constant expressions).
The remaining execution tests are for values of things listed as
"symbol" (in fact no such things have a value expectation listed) and
for values of macros defined as string constants (three such values
listed in total).

This is intended as preparation for enabling the vast bulk of the
tests to run for cross compilation.  (Even the few remaining execution
tests ought in principle to run for cross compilation when a test
wrapper is defined, but that's more complicated.  The existing
execution tests for native builds in fact are linked and run with an
existing installed libc that's required to exist to link against,
rather than with the newly built libc; only the new headers are used.)

Tested for x86_64.  Committed.

2017-03-16  Joseph Myers  <joseph@codesourcery.com>

	* conform/conformtest.pl: Use compilation instead of execution
	tests for testing values of constants and usability in #if.

Patch hide | download patch | download mbox

diff --git a/conform/conformtest.pl b/conform/conformtest.pl
index fedcbc3..54b38f8 100644
--- a/conform/conformtest.pl
+++ b/conform/conformtest.pl
@@ -472,11 +472,11 @@  while ($#headers >= 0) {
 	}
 	print TESTFILE "# define conformtest_value ($s)\n";
 	print TESTFILE "#endif\n";
-	print TESTFILE "int main (void) { return !((($symbol < 0) == conformtest_negative) && ($symbol == conformtest_value)); }\n";
+	print TESTFILE "_Static_assert ((($symbol < 0) == conformtest_negative) && ($symbol == conformtest_value), \"value match inside and outside #if\");\n";
 	close (TESTFILE);
 
-	runtest ($fnamebase, "Testing for #if usability of symbol $symbol",
-		 "Symbol \"$symbol\" not usable in #if.", $res, $xfail);
+	compiletest ($fnamebase, "Testing for #if usability of symbol $symbol",
+		     "Symbol \"$symbol\" not usable in #if.", $res, 0, $xfail);
       }
 
       if (defined ($type) && ($res == 0 || !$optional)) {
@@ -503,13 +503,12 @@  while ($#headers >= 0) {
 	open (TESTFILE, ">$fnamebase.c");
 	print TESTFILE "$prepend";
 	print TESTFILE "#include <$h>\n";
-	# Negate the value since 0 means ok
-	print TESTFILE "int main (void) { return !($symbol $op $value); }\n";
+	print TESTFILE "_Static_assert ($symbol $op $value, \"value constraint\");\n";
 	close (TESTFILE);
 
-	$res = runtest ($fnamebase, "Testing for value of symbol $symbol",
-			"Symbol \"$symbol\" has not the right value.", $res,
-			$xfail);
+	$res = compiletest ($fnamebase, "Testing for value of symbol $symbol",
+			    "Symbol \"$symbol\" has not the right value.",
+			    $res, 0, $xfail);
       }
     } elsif (/^symbol *([a-zA-Z0-9_]*) *([A-Za-z0-9_-]*)?/) {
       my($symbol) = $1;