#!/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 . The 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