diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | conform/conformtest.pl | 41 |
2 files changed, 42 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index 72a5f274a2..b783dd3668 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2012-05-01 Joseph Myers <joseph@codesourcery.com> + * conform/conformtest.pl: Handle "macro-int-constant" and test for + usability of symbols in #if. + * conform/conformtest.pl: If macro or constant types start "promoted:", expect the symbol to be of the following type promoted by the integer promotions. diff --git a/conform/conformtest.pl b/conform/conformtest.pl index 2d8cfd703c..4704debc5e 100644 --- a/conform/conformtest.pl +++ b/conform/conformtest.pl @@ -385,7 +385,7 @@ while ($#headers >= 0) { "Member \"$member\" does not have the correct type.", $res, 0); } - } elsif (/^(macro|constant|macro-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; @@ -432,6 +432,43 @@ while ($#headers >= 0) { $res = $res || $mres || $cres; + if ($symbol_type eq "macro-int-constant" && ($res == 0 || !$optional)) { + # Test that the symbol is usable in #if. + open (TESTFILE, ">$fnamebase.c"); + print TESTFILE "$prepend"; + print TESTFILE "#include <$h>\n"; + print TESTFILE "#if $symbol < 0\n"; + print TESTFILE "# define conformtest_negative 1\n"; + my($s) = "0"; + for (my $i = 0; $i < 63; $i++) { + print TESTFILE "# if $symbol & (1LL << $i)\n"; + print TESTFILE "# define conformtest_bit_$i 0LL\n"; + print TESTFILE "# else\n"; + print TESTFILE "# define conformtest_bit_$i (1LL << $i)\n"; + print TESTFILE "# endif\n"; + $s .= "|conformtest_bit_$i"; + } + print TESTFILE "# define conformtest_value ~($s)\n"; + print TESTFILE "#else\n"; + print TESTFILE "# define conformtest_negative 0\n"; + $s = "0"; + for (my $i = 0; $i < 64; $i++) { + print TESTFILE "# if $symbol & (1ULL << $i)\n"; + print TESTFILE "# define conformtest_bit_$i (1ULL << $i)\n"; + print TESTFILE "# else\n"; + print TESTFILE "# define conformtest_bit_$i 0ULL\n"; + print TESTFILE "# endif\n"; + $s .= "|conformtest_bit_$i"; + } + 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"; + close (TESTFILE); + + runtest ($fnamebase, "Testing for #if usability of symbol $symbol", + "Symbol \"$symbol\" not usable in #if.", $res); + } + if (defined ($type) && ($res == 0 || !$optional)) { # Test the type of the symbol. open (TESTFILE, ">$fnamebase.c"); @@ -744,7 +781,7 @@ while ($#headers >= 0) { if (/^element *({([^}]*)}|([^ ]*)) *({([^}]*)}|([^ ]*)) *([A-Za-z0-9_]*) *(.*)/) { push @allow, $7; - } elsif (/^(macro|constant|macro-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_-]*))?/) { push @allow, $1; } elsif (/^(type|tag) *({([^}]*)|([a-zA-Z0-9_]*))/) { my($type) = "$3$4"; |