diff options
Diffstat (limited to 'conform/conformtest.pl')
-rw-r--r-- | conform/conformtest.pl | 108 |
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) { |