Check for specific error messages in the testsuite. This

permits testing that the compiler emits error messages for
specific lines that match egrep regexps.  The desired error
messages are expressed using comments of the form
	// ERROR "regexp"

R=r
DELTA=90  (73 added, 8 deleted, 9 changed)
OCL=15513
CL=15566
This commit is contained in:
Ian Lance Taylor 2008-09-19 14:39:49 -07:00
parent 995f938ae3
commit 66b261a082
6 changed files with 82 additions and 13 deletions

74
test/errchk Executable file
View file

@ -0,0 +1,74 @@
#!/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 "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 "errchk: $SOURCEFILE: missing expected error message on line $lineno: '$regexp'"
echo 1 > $TMPSTAT
elif ! echo "$errmsg" | egrep -q "$regexp"; then
echo 1>&2 "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 "errchk: $SOURCEFILE: unmatched error messages:"
echo 1>&2 "=================================================="
cat 1>&2 $TMPALL
echo 1>&2 "=================================================="
echo 1 > $TMPSTAT
fi
status=`cat $TMPSTAT`
exit $status

View file

@ -7,8 +7,8 @@
package main
func main() {
var c00 uint8 = '\0'; // three octal required; should not compile
var c01 uint8 = '\07'; // three octal required; should not compile
var cx0 uint8 = '\x0'; // two hex required; should not compile
var cx1 uint8 = '\x'; // two hex required; REALLY should not compile
var c00 uint8 = '\0'; // ERROR "oct|char"
var c01 uint8 = '\07'; // ERROR "oct|char"
var cx0 uint8 = '\x0'; // ERROR "hex|char"
var cx1 uint8 = '\x'; // ERROR "hex|char"
}

View file

@ -8,6 +8,6 @@ package main
func main() {
var i33 int64;
if i33 == (1<<64) -1 { // BUG: should not compile; constant too large
if i33 == (1<<64) -1 { // ERROR "overflow"
}
}

View file

@ -13,6 +13,6 @@ func f1(a int) (int, float) { // BUG (not caught by compiler): multiple return
}
func f2(a int) (a int, b float) { // return value names must be different from parameter names
func f2(a int) (a int, b float) { // ERROR "redeclared|definition"
return 8, 8.0;
}

View file

@ -1,8 +1,4 @@
=========== ./func1.go
func1.go:12: var a redeclared in this block
previous declaration at func1.go:12
=========== ./helloworld.go
hello, world
@ -201,9 +197,6 @@ pc: 0x2615
main·main(0x1, 0x7fff5fbff268, 0x0, ...)
=========== fixedbugs/bug015.go
fixedbugs/bug015.go:7: overflow converting constant to <int64>INT64
=========== fixedbugs/bug016.go
fixedbugs/bug016.go:7: overflow converting constant to <uint32>UINT32

View file

@ -18,6 +18,8 @@ export L=${A}l
failed=0
PATH=/bin:/usr/bin:$HOME/bin:`pwd`
# don't use $$ in file names to avoid spurious diffs
RUNFILE=/tmp/gorun-$USER
TMP1FILE=/tmp/gotest1-$USER