| #!/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-$$ |
| TMPBUG=/tmp/errchk-bug-$$ |
| |
| rm -f $TMPOUT $TMPERR $TMPALL $TMPTMP $TMPBUG |
| |
| trap "rm -f $TMPOUT $TMPERR $TMPALL $TMPTMP $TMPBUG" 0 1 2 3 14 15 |
| |
| (if $* >$TMPOUT 2>$TMPERR; then |
| echo 1>&4 "BUG: errchk: command succeeded unexpectedly" |
| cat 1>&3 $TMPOUT |
| cat 1>&4 $TMPERR |
| rm -f $TMPOUT $TMPERR |
| fi) 3>&1 4>&2 >$TMPTMP 2>&1 |
| |
| if ! test -f $TMPOUT; then |
| exit 0 |
| fi |
| |
| if test -s $TMPTMP; then |
| echo 1>&2 BUG: errchk: compiler crashed |
| cat $TMPOUT |
| cat 1>&2 $TMPERR |
| exit 0 |
| fi |
| |
| cat $TMPOUT $TMPERR | grep -v '^ ' > $TMPALL |
| |
| bug() { |
| if ! test -f $TMPBUG |
| then |
| echo 1>&2 -n BUG: '' |
| echo >$TMPBUG |
| fi |
| } |
| |
| header=0 |
| 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'" |
| elif ! echo "$errmsg" | egrep -q "$regexp"; then |
| bug |
| echo 1>&2 "errchk: $SOURCEFILE:$lineno: error message does not match '$regexp'" |
| echo 1>&2 $errmsg |
| 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 "==================================================" |
| fi |
| |
| exit 0 |