Commit e08008e8 authored by Ian Lance Taylor's avatar Ian Lance Taylor

test: run index test by default

Running this test via "bash run" uncovered three different
bugs (4344, 4348, 4353).  We need to run it by default.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6832043
parent ccef88c5
// $G $D/$F.go && $L $F.$A && // skip
// ./$A.out -pass 0 >tmp.go && $G tmp.go && $L -o $A.out1 tmp.$A && ./$A.out1 &&
// ./$A.out -pass 1 >tmp.go && errchk $G -e tmp.go &&
// ./$A.out -pass 2 >tmp.go && errchk $G -e tmp.go
// rm -f tmp.go $A.out1
// NOTE: This test is not run by 'run.go' and so not run by all.bash.
// To run this test you must use the ./run shell script.
// Copyright 2010 The Go Authors. All rights reserved. // Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// Generate test of index and slice bounds checks. // Generate test of index and slice bounds checks.
// The output is compiled and run. // The actual tests are index0.go, index1.go, index2.go.
package main package main
import ( import (
"bufio" "bufio"
"flag"
"fmt" "fmt"
"os" "os"
"runtime" "runtime"
...@@ -155,14 +147,13 @@ func bug() { ...@@ -155,14 +147,13 @@ func bug() {
func main() { func main() {
` `
// Passes: // pass variable set in index[012].go
// 0 - dynamic checks // 0 - dynamic checks
// 1 - static checks of invalid constants (cannot assign to types) // 1 - static checks of invalid constants (cannot assign to types)
// 2 - static checks of array bounds // 2 - static checks of array bounds
var pass = flag.Int("pass", 0, "which test (0,1,2)")
func testExpr(b *bufio.Writer, expr string) { func testExpr(b *bufio.Writer, expr string) {
if *pass == 0 { if pass == 0 {
fmt.Fprintf(b, "\ttest(func(){use(%s)}, %q)\n", expr, expr) fmt.Fprintf(b, "\ttest(func(){use(%s)}, %q)\n", expr, expr)
} else { } else {
fmt.Fprintf(b, "\tuse(%s) // ERROR \"index|overflow\"\n", expr) fmt.Fprintf(b, "\tuse(%s) // ERROR \"index|overflow\"\n", expr)
...@@ -172,12 +163,10 @@ func testExpr(b *bufio.Writer, expr string) { ...@@ -172,12 +163,10 @@ func testExpr(b *bufio.Writer, expr string) {
func main() { func main() {
b := bufio.NewWriter(os.Stdout) b := bufio.NewWriter(os.Stdout)
flag.Parse() if pass == 0 {
fmt.Fprint(b, "// run\n\n")
if *pass == 0 {
fmt.Fprint(b, "// $G $D/$F.go && $L $F.$A && ./$A.out\n\n")
} else { } else {
fmt.Fprint(b, "// errchk $G -e $D/$F.go\n\n") fmt.Fprint(b, "// errorcheck\n\n")
} }
fmt.Fprint(b, prolog) fmt.Fprint(b, prolog)
...@@ -240,7 +229,7 @@ func main() { ...@@ -240,7 +229,7 @@ func main() {
} }
// Only print the test case if it is appropriate for this pass. // Only print the test case if it is appropriate for this pass.
if thisPass == *pass { if thisPass == pass {
pae := p+a+e+big pae := p+a+e+big
cni := c+n+i cni := c+n+i
......
// runoutput ./index.go
// Copyright 2012 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.
// Generate test of index and slice bounds checks.
// The output is compiled and run.
package main
const pass = 0
// errorcheckoutput ./index.go
// Copyright 2010 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.
// Generate test of index and slice bounds checks.
// The output is error checked.
package main
const pass = 1
// errorcheckoutput ./index.go
// Copyright 2010 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.
// Generate test of index and slice bounds checks.
// The output is error checked.
package main
const pass = 2
...@@ -128,7 +128,7 @@ func main() { ...@@ -128,7 +128,7 @@ func main() {
if !*verbose && test.err == nil { if !*verbose && test.err == nil {
continue continue
} }
fmt.Printf("%-10s %-20s: %s\n", test.action, test.goFileName(), errStr) fmt.Printf("%-20s %-20s: %s\n", test.action, test.goFileName(), errStr)
} }
if *summary { if *summary {
...@@ -198,7 +198,7 @@ type test struct { ...@@ -198,7 +198,7 @@ type test struct {
donec chan bool // closed when done donec chan bool // closed when done
src string src string
action string // "compile", "build", "run", "errorcheck", "skip", "runoutput", "compiledir" action string // "compile", "build", etc.
tempDir string tempDir string
err error err error
...@@ -300,7 +300,7 @@ func (t *test) run() { ...@@ -300,7 +300,7 @@ func (t *test) run() {
fallthrough fallthrough
case "compile", "compiledir", "build", "run", "runoutput", "rundir": case "compile", "compiledir", "build", "run", "runoutput", "rundir":
t.action = action t.action = action
case "errorcheck", "errorcheckdir": case "errorcheck", "errorcheckdir", "errorcheckoutput":
t.action = action t.action = action
wantError = true wantError = true
for len(args) > 0 && strings.HasPrefix(args[0], "-") { for len(args) > 0 && strings.HasPrefix(args[0], "-") {
...@@ -467,7 +467,7 @@ func (t *test) run() { ...@@ -467,7 +467,7 @@ func (t *test) run() {
case "runoutput": case "runoutput":
useTmp = false useTmp = false
out, err := runcmd("go", "run", t.goFileName()) out, err := runcmd(append([]string{"go", "run", t.goFileName()}, args...)...)
if err != nil { if err != nil {
t.err = err t.err = err
} }
...@@ -484,6 +484,36 @@ func (t *test) run() { ...@@ -484,6 +484,36 @@ func (t *test) run() {
if string(out) != t.expectedOutput() { if string(out) != t.expectedOutput() {
t.err = fmt.Errorf("incorrect output\n%s", out) t.err = fmt.Errorf("incorrect output\n%s", out)
} }
case "errorcheckoutput":
useTmp = false
out, err := runcmd(append([]string{"go", "run", t.goFileName()}, args...)...)
if err != nil {
t.err = err
}
tfile := filepath.Join(t.tempDir, "tmp__.go")
err = ioutil.WriteFile(tfile, out, 0666)
if err != nil {
t.err = fmt.Errorf("write tempfile:%s", err)
return
}
cmdline := []string{"go", "tool", gc, "-e", "-o", "a." + letter}
cmdline = append(cmdline, flags...)
cmdline = append(cmdline, tfile)
out, err = runcmd(cmdline...)
if wantError {
if err == nil {
t.err = fmt.Errorf("compilation succeeded unexpectedly\n%s", out)
return
}
} else {
if err != nil {
t.err = err
return
}
}
t.err = t.errorCheck(string(out), tfile, "tmp__.go")
return
} }
} }
......
...@@ -61,7 +61,7 @@ build() { ...@@ -61,7 +61,7 @@ build() {
} }
runoutput() { runoutput() {
go run "$D/$F.go" > tmp.go go run "$D/$F.go" "$@" > tmp.go
go run tmp.go go run tmp.go
} }
...@@ -96,6 +96,16 @@ errorcheck() { ...@@ -96,6 +96,16 @@ errorcheck() {
errchk $zero $G -e $* $D/$F.go errchk $zero $G -e $* $D/$F.go
} }
errorcheckoutput() {
zero=""
if [ "$1" = "-0" ]; then
zero="-0"
shift
fi
go run "$D/$F.go" "$@" > tmp.go
errchk $zero $G -e tmp.go
}
skip() { skip() {
true true
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment