mirror of
https://github.com/golang/go
synced 2024-11-25 06:07:58 -07:00
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:
parent
995f938ae3
commit
66b261a082
74
test/errchk
Executable file
74
test/errchk
Executable 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
|
@ -7,8 +7,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var c00 uint8 = '\0'; // three octal required; should not compile
|
var c00 uint8 = '\0'; // ERROR "oct|char"
|
||||||
var c01 uint8 = '\07'; // three octal required; should not compile
|
var c01 uint8 = '\07'; // ERROR "oct|char"
|
||||||
var cx0 uint8 = '\x0'; // two hex required; should not compile
|
var cx0 uint8 = '\x0'; // ERROR "hex|char"
|
||||||
var cx1 uint8 = '\x'; // two hex required; REALLY should not compile
|
var cx1 uint8 = '\x'; // ERROR "hex|char"
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,6 @@ package main
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var i33 int64;
|
var i33 int64;
|
||||||
if i33 == (1<<64) -1 { // BUG: should not compile; constant too large
|
if i33 == (1<<64) -1 { // ERROR "overflow"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
return 8, 8.0;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,4 @@
|
|||||||
|
|
||||||
=========== ./func1.go
|
|
||||||
func1.go:12: var a redeclared in this block
|
|
||||||
previous declaration at func1.go:12
|
|
||||||
|
|
||||||
=========== ./helloworld.go
|
=========== ./helloworld.go
|
||||||
hello, world
|
hello, world
|
||||||
|
|
||||||
@ -201,9 +197,6 @@ pc: 0x2615
|
|||||||
main·main(0x1, 0x7fff5fbff268, 0x0, ...)
|
main·main(0x1, 0x7fff5fbff268, 0x0, ...)
|
||||||
|
|
||||||
|
|
||||||
=========== fixedbugs/bug015.go
|
|
||||||
fixedbugs/bug015.go:7: overflow converting constant to <int64>INT64
|
|
||||||
|
|
||||||
=========== fixedbugs/bug016.go
|
=========== fixedbugs/bug016.go
|
||||||
fixedbugs/bug016.go:7: overflow converting constant to <uint32>UINT32
|
fixedbugs/bug016.go:7: overflow converting constant to <uint32>UINT32
|
||||||
|
|
||||||
|
2
test/run
2
test/run
@ -18,6 +18,8 @@ export L=${A}l
|
|||||||
|
|
||||||
failed=0
|
failed=0
|
||||||
|
|
||||||
|
PATH=/bin:/usr/bin:$HOME/bin:`pwd`
|
||||||
|
|
||||||
# don't use $$ in file names to avoid spurious diffs
|
# don't use $$ in file names to avoid spurious diffs
|
||||||
RUNFILE=/tmp/gorun-$USER
|
RUNFILE=/tmp/gorun-$USER
|
||||||
TMP1FILE=/tmp/gotest1-$USER
|
TMP1FILE=/tmp/gotest1-$USER
|
||||||
|
Loading…
Reference in New Issue
Block a user