blob: c1183868f3f0d1e070638c4f0a07ddb90f327300 [file] [log] [blame]
#!/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