| #!/bin/bash | |
| # 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> is | |
| # interpreted by egrep. | |
| if test $# -lt 2; then | |
| echo 1>&2 "Usage: errchk COMPILER [OPTS] SOURCEFILE" | |
| exit 1 | |
| fi | |
| ARGCOUNT=$# | |
| SOURCEFILE=${!ARGCOUNT} | |
| TMPOUT=/tmp/errchk-out-$$ | |
| TMPERR=/tmp/errchk-err-$$ | |
| TMPALL=/tmp/errchk-all-$$ | |
| TMPTMP=/tmp/errchk-tmp-$$ | |
| TMPSTAT=/tmp/errchk-stat-$$ | |
| TMPBUG=/tmp/errchk-bug-$$ | |
| rm -f $TMPOUT $TMPERR $TMPALL $TMPTMP $TMPSTAT $TMPBUG | |
| trap "rm -f $TMPOUT $TMPERR $TMPALL $TMPTMP $TMPSTAT $TMPBUG" 0 1 2 3 14 15 | |
| if $* >$TMPOUT 2>$TMPERR; then | |
| echo 1>&2 "BUG: errchk: command succeeded unexpectedly: " "$@" | |
| cat $TMPOUT | |
| cat 1>&2 $TMPERR | |
| rm -f $TMPOUT $TMPERR | |
| exit 1 | |
| fi | |
| cat $TMPOUT $TMPERR | grep -v '^ ' > $TMPALL | |
| bug() { | |
| if ! test -f $TMPBUG | |
| then | |
| echo 1>&2 -n BUG: '' | |
| echo >$TMPBUG | |
| fi | |
| } | |
| header=0 | |
| echo 0 > $TMPSTAT | |
| pr -n -t $SOURCEFILE | grep '// ERROR' | while read line; do | |
| lineno=`echo $line | sed -e 's/^[ ]*\([0-9]*\).*$/\1/'` | |
| regexp=`echo $line | sed -e 's|.*// ERROR "\([^"]*\)".*$|\1|'` | |
| errmsg=`grep "$SOURCEFILE:$lineno" <$TMPALL` | |
| grep -v "$SOURCEFILE:$lineno" < $TMPALL > $TMPTMP | |
| mv -f $TMPTMP $TMPALL | |
| if test -z "$errmsg"; then | |
| bug | |
| echo 1>&2 "errchk: $SOURCEFILE:$lineno: missing expected error: '$regexp'" | |
| echo 1 > $TMPSTAT | |
| elif ! echo "$errmsg" | egrep -q "$regexp"; then | |
| bug | |
| echo 1>&2 "errchk: $SOURCEFILE:$lineno: error message does not match '$regexp'" | |
| echo 1>&2 $errmsg | |
| echo 1 > $TMPSTAT | |
| fi | |
| done | |
| if test -s $TMPALL; then | |
| bug | |
| echo 1>&2 "errchk: $SOURCEFILE: unmatched error messages:" | |
| echo 1>&2 "==================================================" | |
| cat 1>&2 $TMPALL | |
| echo 1>&2 "==================================================" | |
| echo 1 > $TMPSTAT | |
| fi | |
| status=`cat $TMPSTAT` | |
| exit $status |