summaryrefslogtreecommitdiff
path: root/conform/conformtest.pl
diff options
context:
space:
mode:
Diffstat (limited to 'conform/conformtest.pl')
-rw-r--r--conform/conformtest.pl108
1 files changed, 65 insertions, 43 deletions
diff --git a/conform/conformtest.pl b/conform/conformtest.pl
index 8b97d0dfc7..cc0944a889 100644
--- a/conform/conformtest.pl
+++ b/conform/conformtest.pl
@@ -1,5 +1,6 @@
#! /usr/bin/perl
+use GlibcConform;
use Getopt::Long;
use POSIX;
@@ -32,17 +33,6 @@ if (@headers == ()) {
"complex.h", "assert.h", "arpa/inet.h", "aio.h");
}
-$CFLAGS{"ISO"} = "-ansi";
-$CFLAGS{"ISO99"} = "-std=c99";
-$CFLAGS{"ISO11"} = "-std=c1x -D_ISOC11_SOURCE";
-$CFLAGS{"POSIX"} = "-D_POSIX_C_SOURCE=199912 -ansi";
-$CFLAGS{"XPG3"} = "-ansi -D_XOPEN_SOURCE";
-$CFLAGS{"XPG4"} = "-ansi -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED";
-$CFLAGS{"UNIX98"} = "-ansi -D_XOPEN_SOURCE=500";
-$CFLAGS{"XOPEN2K"} = "-std=c99 -D_XOPEN_SOURCE=600";
-$CFLAGS{"XOPEN2K8"} = "-std=c99 -D_XOPEN_SOURCE=700";
-$CFLAGS{"POSIX2008"} = "-std=c99 -D_POSIX_C_SOURCE=200809L";
-
$CFLAGS_namespace = "$flags -fno-builtin $CFLAGS{$standard} -D_ISOMAC";
$CFLAGS = "$CFLAGS_namespace '-D__attribute__(x)='";
@@ -85,6 +75,17 @@ $verbose = 1;
$total = 0;
$skipped = 0;
$errors = 0;
+$xerrors = 0;
+
+sub note_error {
+ my($xfail) = @_;
+ if ($xfail) {
+ $xerrors++;
+ printf ("Ignoring this failure.\n");
+ } else {
+ $errors++;
+ }
+}
sub poorfnmatch {
@@ -117,7 +118,7 @@ sub poorfnmatch {
sub compiletest
{
- my($fnamebase, $msg, $errmsg, $skip, $optional) = @_;
+ my($fnamebase, $msg, $errmsg, $skip, $optional, $xfail) = @_;
my($result) = $skip;
my($printlog) = 0;
@@ -139,7 +140,7 @@ sub compiletest
printf (" $errmsg Compiler message:\n");
$printlog = 1;
}
- ++$errors;
+ note_error($xfail);
$result = 1;
}
} else {
@@ -169,7 +170,7 @@ sub compiletest
sub runtest
{
- my($fnamebase, $msg, $errmsg, $skip) = @_;
+ my($fnamebase, $msg, $errmsg, $skip, $xfail) = @_;
my($result) = $skip;
my($printlog) = 0;
@@ -187,7 +188,7 @@ sub runtest
printf (" $errmsg Compiler message:\n");
$printlog = 1;
}
- ++$errors;
+ note_error($xfail);
$result = 1;
} else {
# Now run the program. If the exit code is not zero something is wrong.
@@ -201,7 +202,7 @@ sub runtest
}
} else {
printf (" FAIL\n");
- ++$errors;
+ note_error($xfail);
$printlog = 1;
unlink "$fnamebase.out";
rename "$fnamebase.out2", "$fnamebase.out";
@@ -264,7 +265,6 @@ sub checknamespace {
close (TESTFILE);
undef %errors;
- $nknown = 0;
open (CONTENT, "$CC $CFLAGS_namespace -E $fnamebase.c -P -Wp,-dN | sed -e '/^# [1-9]/d' -e '/^[[:space:]]*\$/d' |");
loop: while (<CONTENT>) {
chop;
@@ -275,9 +275,8 @@ sub checknamespace {
} else {
# We have to tokenize the line.
my($str) = $_;
- my($index) = 0;
- my($len) = length ($str);
+ $str =~ s/"[^"]*"//g;
foreach $token (split(/[^a-zA-Z0-9_]/, $str)) {
if ($token ne "") {
newtoken ($token, @allow);
@@ -324,7 +323,7 @@ while ($#headers >= 0) {
printf ("Testing <$h>\n");
printf ("----------" . "-" x length ($h) . "\n");
- open (CONTROL, "$CC -E -D$standard -x c data/$h-data |");
+ open (CONTROL, "$CC -E -D$standard -std=c99 -x c data/$h-data |");
control: while (<CONTROL>) {
chop;
next control if (/^#/);
@@ -339,11 +338,16 @@ while ($#headers >= 0) {
close (TESTFILE);
$missing = compiletest ($fnamebase, "Checking whether <$h> is available",
- "Header <$h> not available", 0, 0);
+ "Header <$h> not available", 0, 0, 0);
printf ("\n");
last control if ($missing);
}
+ my($xfail) = 0;
+ if (/^xfail-/) {
+ s/^xfail-//;
+ $xfail = 1;
+ }
my($optional) = 0;
if (/^optional-/) {
s/^optional-//;
@@ -375,7 +379,7 @@ while ($#headers >= 0) {
($optional
? "NOT AVAILABLE."
: "Member \"$member\" not available."), $res,
- $optional);
+ $optional, $xfail);
if ($res == 0 || $missing != 0 || !$optional) {
# Test the types of the members.
@@ -389,9 +393,9 @@ while ($#headers >= 0) {
compiletest ($fnamebase, "Testing for type of member $member",
"Member \"$member\" does not have the correct type.",
- $res, 0);
+ $res, 0, $xfail);
}
- } elsif (/^(macro|constant|macro-constant|macro-int-constant) +([a-zA-Z0-9_]*) *(?:{([^}]*)} *)?(?:([>=<!]+) ([A-Za-z0-9_-]*))?/) {
+ } elsif (/^(macro|constant|macro-constant|macro-int-constant) +([a-zA-Z0-9_]*) *(?:{([^}]*)} *)?(?:([>=<!]+) ([A-Za-z0-9_\\'-]*))?/) {
my($symbol_type) = $1;
my($symbol) = $2;
my($type) = $3;
@@ -418,7 +422,7 @@ while ($#headers >= 0) {
($optional
? "NOT PRESENT"
: "Macro \"$symbol\" is not available."), $res,
- $optional);
+ $optional, $xfail);
}
if ($symbol_type =~ /constant/) {
@@ -433,7 +437,7 @@ while ($#headers >= 0) {
($optional
? "NOT PRESENT"
: "Constant \"$symbol\" not available."), $res,
- $optional);
+ $optional, $xfail);
}
$res = $res || $mres || $cres;
@@ -472,7 +476,7 @@ while ($#headers >= 0) {
close (TESTFILE);
runtest ($fnamebase, "Testing for #if usability of symbol $symbol",
- "Symbol \"$symbol\" not usable in #if.", $res);
+ "Symbol \"$symbol\" not usable in #if.", $res, $xfail);
}
if (defined ($type) && ($res == 0 || !$optional)) {
@@ -491,7 +495,7 @@ while ($#headers >= 0) {
compiletest ($fnamebase, "Testing for type of symbol $symbol",
"Symbol \"$symbol\" does not have the correct type.",
- $res, 0);
+ $res, 0, $xfail);
}
if (defined ($op) && ($res == 0 || !$optional)) {
@@ -504,7 +508,8 @@ while ($#headers >= 0) {
close (TESTFILE);
$res = runtest ($fnamebase, "Testing for value of symbol $symbol",
- "Symbol \"$symbol\" has not the right value.", $res);
+ "Symbol \"$symbol\" has not the right value.", $res,
+ $xfail);
}
} elsif (/^symbol *([a-zA-Z0-9_]*) *([A-Za-z0-9_-]*)?/) {
my($symbol) = $1;
@@ -524,7 +529,7 @@ while ($#headers >= 0) {
close (TESTFILE);
$res = compiletest ($fnamebase, "Testing for symbol $symbol",
- "Symbol \"$symbol\" not available.", $res, 0);
+ "Symbol \"$symbol\" not available.", $res, 0, $xfail);
if ($value ne "") {
# Generate a program to test for the value of this constant.
@@ -535,7 +540,8 @@ while ($#headers >= 0) {
close (TESTFILE);
$res = runtest ($fnamebase, "Testing for value of symbol $symbol",
- "Symbol \"$symbol\" has not the right value.", $res);
+ "Symbol \"$symbol\" has not the right value.", $res,
+ $xfail);
}
} elsif (/^type *({([^}]*)|([a-zA-Z0-9_]*))/) {
my($type) = "$2$3";
@@ -565,7 +571,8 @@ while ($#headers >= 0) {
compiletest ($fnamebase, "Testing for type $type",
($optional
? "NOT AVAILABLE"
- : "Type \"$type\" not available."), $missing, $optional);
+ : "Type \"$type\" not available."), $missing, $optional,
+ $xfail);
} elsif (/^tag *({([^}]*)|([a-zA-Z0-9_]*))/) {
my($type) = "$2$3";
@@ -586,7 +593,7 @@ while ($#headers >= 0) {
close (TESTFILE);
compiletest ($fnamebase, "Testing for type $type",
- "Type \"$type\" not available.", $missing, 0);
+ "Type \"$type\" not available.", $missing, 0, $xfail);
} elsif (/^function *({([^}]*)}|([a-zA-Z0-9_]*)) [(][*]([a-zA-Z0-9_]*) ([(].*[)])/) {
my($rettype) = "$2$3";
my($fname) = "$4";
@@ -608,7 +615,7 @@ while ($#headers >= 0) {
($optional
? "NOT AVAILABLE"
: "Function \"$fname\" is not available."), $res,
- $optional);
+ $optional, $xfail);
if ($res == 0 || $missing == 1 || !$optional) {
# Generate a program to test for the type of this function.
@@ -621,7 +628,8 @@ while ($#headers >= 0) {
close (TESTFILE);
compiletest ($fnamebase, "Test for type of function $fname",
- "Function \"$fname\" has incorrect type.", $res, 0);
+ "Function \"$fname\" has incorrect type.", $res, 0,
+ $xfail);
}
} elsif (/^function *({([^}]*)}|([a-zA-Z0-9_]*)) ([a-zA-Z0-9_]*) ([(].*[)])/) {
my($rettype) = "$2$3";
@@ -644,7 +652,7 @@ while ($#headers >= 0) {
($optional
? "NOT AVAILABLE"
: "Function \"$fname\" is not available."), $res,
- $optional);
+ $optional, $xfail);
if ($res == 0 || $missing != 0 || !$optional) {
# Generate a program to test for the type of this function.
@@ -657,7 +665,8 @@ while ($#headers >= 0) {
close (TESTFILE);
compiletest ($fnamebase, "Test for type of function $fname",
- "Function \"$fname\" has incorrect type.", $res, 0);
+ "Function \"$fname\" has incorrect type.", $res, 0,
+ $xfail);
}
} elsif (/^variable *({([^}]*)}|([a-zA-Z0-9_]*)) ([a-zA-Z0-9_]*) *(.*)/) {
my($type) = "$2$3";
@@ -678,7 +687,8 @@ while ($#headers >= 0) {
close (TESTFILE);
$res = compiletest ($fnamebase, "Test availability of variable $vname",
- "Variable \"$vname\" is not available.", $res, 0);
+ "Variable \"$vname\" is not available.", $res, 0,
+ $xfail);
# Generate a program to test for the type of this function.
open (TESTFILE, ">$fnamebase.c");
@@ -689,7 +699,7 @@ while ($#headers >= 0) {
close (TESTFILE);
compiletest ($fnamebase, "Test for type of variable $fname",
- "Variable \"$vname\" has incorrect type.", $res, 0);
+ "Variable \"$vname\" has incorrect type.", $res, 0, $xfail);
} elsif (/^macro-function *({([^}]*)}|([a-zA-Z0-9_]*)) ([a-zA-Z0-9_]*) ([(].*[)])/) {
my($rettype) = "$2$3";
my($fname) = "$4";
@@ -709,7 +719,8 @@ while ($#headers >= 0) {
close (TESTFILE);
$res = compiletest ($fnamebase, "Test availability of macro $fname",
- "Function \"$fname\" is not available.", $res, 0);
+ "Function \"$fname\" is not available.", $res, 0,
+ $xfail);
# Generate a program to test for the type of this function.
open (TESTFILE, ">$fnamebase.c");
@@ -722,7 +733,7 @@ while ($#headers >= 0) {
close (TESTFILE);
compiletest ($fnamebase, "Test for type of macro $fname",
- "Function \"$fname\" has incorrect type.", $res, 0);
+ "Function \"$fname\" has incorrect type.", $res, 0, $xfail);
} elsif (/^macro-str *([^ ]*) *(\".*\")/) {
# The above regex doesn't handle a \" in a string.
my($macro) = "$1";
@@ -742,7 +753,7 @@ while ($#headers >= 0) {
close (TESTFILE);
compiletest ($fnamebase, "Test availability of macro $macro",
- "Macro \"$macro\" is not available.", $missing, 0);
+ "Macro \"$macro\" is not available.", $missing, 0, $xfail);
# Generate a program to test for the value of this macro.
open (TESTFILE, ">$fnamebase.c");
@@ -754,7 +765,8 @@ while ($#headers >= 0) {
close (TESTFILE);
$res = runtest ($fnamebase, "Testing for value of macro $macro",
- "Macro \"$macro\" has not the right value.", $res);
+ "Macro \"$macro\" has not the right value.", $res,
+ $xfail);
} elsif (/^allow-header *(.*)/) {
my($pattern) = $1;
if ($seenheader{$pattern} != 1) {
@@ -785,6 +797,8 @@ while ($#headers >= 0) {
next acontrol if (/^#/);
next acontrol if (/^[ ]*$/);
+ s/^xfail-//;
+ s/^optional-//;
if (/^element *({([^}]*)}|([^ ]*)) *({([^}]*)}|([^ ]*)) *([A-Za-z0-9_]*) *(.*)/) {
push @allow, $7;
} elsif (/^(macro|constant|macro-constant|macro-int-constant) +([a-zA-Z0-9_]*) *(?:{([^}]*)} *)?(?:([>=<!]+) ([A-Za-z0-9_-]*))?/) {
@@ -849,6 +863,14 @@ if ($errors > 0 && $percent < 1.0) {
printf ("%3d%%)\n", $percent);
}
+printf (" Number of xfailed tests : %4d (", $xerrors);
+$percent = ($xerrors * 100) / $total;
+if ($xerrors > 0 && $percent < 1.0) {
+ printf (" <1%%)\n");
+} else {
+ printf ("%3d%%)\n", $percent);
+}
+
printf (" Number of skipped tests : %4d (", $skipped);
$percent = ($skipped * 100) / $total;
if ($skipped > 0 && $percent < 1.0) {