| #!/usr/bin/perl | |
| # Copyright 2009 The Go Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style | |
| # license that can be found in the LICENSE file. | |
| # This script checks that the compilers emits the errors which we | |
| # expect. Usage: errchk COMPILER [OPTS] SOURCEFILE. This will run | |
| # the command COMPILER [OPTS] SOURCEFILE. The compilation is expected | |
| # to fail; if it succeeds, this script will report an error. The | |
| # stderr output of the compiler will be matched against comments in | |
| # SOURCEFILE. For each line of the source file which should generate | |
| # an error, there should be a comment of the form // ERROR "regexp". | |
| # If the compiler generates an error for a line which has no such | |
| # commnt, this script will report an error. Likewise if the compiler | |
| # does not generate an error for a line which has a comment, or if the | |
| # error message does not match the <regexp>. The <regexp> syntax | |
| # is Perl but its best to stick to egrep. | |
| use POSIX; | |
| if(@ARGV < 1) { | |
| print STDERR "Usage: errchk COMPILER [OPTS] SOURCEFILE\n"; | |
| exit 1; | |
| } | |
| $file = $ARGV[@ARGV-1]; | |
| open(SRC, $file) || die "BUG: errchk: open $file: $!"; | |
| @src = <SRC>; | |
| close(SRC); | |
| # Run command | |
| $cmd = join(' ', @ARGV); | |
| open(CMD, "exec $cmd </dev/null 2>&1 |") || die "BUG: errchk: run $cmd: $!"; | |
| @out = grep { !/^ / } <CMD>; | |
| close CMD; | |
| if($? == 0) { | |
| print STDERR "BUG: errchk: command succeeded unexpectedly\n"; | |
| print STDERR @out; | |
| exit 0; | |
| } | |
| if(!WIFEXITED($?)) { | |
| print STDERR "BUG: errchk: compiler crashed\n"; | |
| print STDERR @out, "\n"; | |
| exit 0; | |
| } | |
| sub bug() { | |
| if(!$bug++) { | |
| print STDERR "BUG: "; | |
| } | |
| } | |
| $line = 0; | |
| foreach $src (@src) { | |
| $line++; | |
| next unless $src =~ m|// ERROR (.*)|; | |
| $regexp = $1; | |
| if($regexp !~ /^"([^"]*)"/) { | |
| print STDERR "$file:$line: malformed regexp\n"; | |
| next; | |
| } | |
| $regexp = $1; | |
| @errmsg = grep { /$file:$line:/ } @out; | |
| @out = grep { !/$file:$line:/ } @out; | |
| if(@errmsg == 0) { | |
| bug(); | |
| print STDERR "errchk: $file:$line: missing expected error: '$regexp'\n"; | |
| next; | |
| } | |
| @match = grep { /$regexp/ } @errmsg; | |
| if(@match == 0) { | |
| bug(); | |
| print STDERR "errchk: $file:$line: error message does not match '$regexp'\n"; | |
| next; | |
| } | |
| } | |
| if(@out != 0) { | |
| bug(); | |
| print STDERR "errchk: $file: unmatched error messages:\n"; | |
| print STDERR "==================================================\n"; | |
| print STDERR @out; | |
| print STDERR "==================================================\n"; | |
| } | |
| exit 0; |