go/test/errchk
Ian Lance Taylor b70d42f323 6g currently accepts setting a string value to an integer
constant without an explicit conversion.  I think that is a
bug.  This adds a test case for it.

Also, change errchk to include the string BUG in error
messages, so that failures are included in the count reported
by the run shell script.

R=r,ken
DELTA=11  (7 added, 0 deleted, 4 changed)
OCL=15857
CL=15880
2008-09-25 15:08:52 -07:00

75 lines
2.4 KiB
Bash
Executable file

#!/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-$$
rm -f $TMPOUT $TMPERR $TMPALL $TMPTMP $TMPSTAT
trap "rm -f $TMPOUT $TMPERR $TMPALL $TMPTMP $TMPSTAT" 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 > $TMPALL
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
echo 1>&2 "BUG: errchk: $SOURCEFILE: missing expected error message on line $lineno: '$regexp'"
echo 1 > $TMPSTAT
elif ! echo "$errmsg" | egrep -q "$regexp"; then
echo 1>&2 "BUG: errchk: $SOURCEFILE: error message on line $lineno does not match '$regexp'"
echo 1>&2 $errmsg
echo 1 > $TMPSTAT
fi
done
if test -s $TMPALL; then
echo 1>&2 "BUG: errchk: $SOURCEFILE: unmatched error messages:"
echo 1>&2 "=================================================="
cat 1>&2 $TMPALL
echo 1>&2 "=================================================="
echo 1 > $TMPSTAT
fi
status=`cat $TMPSTAT`
exit $status