// runoutput // 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. // Issue 3866 // runtime.equal failed to take padding between arguments and // return values into account, so in certain cases gc-generated // code will read a random bool from the stack as the result of // the comparison. // This program generates a lot of equality tests and hopes to // catch this. // NOTE: this program assumes comparing instance of T and T's // underlying []byte will make gc emit calls to runtime.equal, // and if gc optimizes this case, then the test will no longer // be correct (in the sense that it no longer tests runtime.equal). package main import ( "bytes" "fmt" "strconv" "strings" ) const ntest = 1024 func main() { var decls, calls bytes.Buffer for i := 1; i <= ntest; i++ { s := strconv.Itoa(i) decls.WriteString(strings.Replace(decl, "$", s, -1)) calls.WriteString(strings.Replace("call(test$)\n\t", "$", s, -1)) } program = strings.Replace(program, "$DECLS", decls.String(), 1) program = strings.Replace(program, "$CALLS", calls.String(), 1) fmt.Print(program) } var program = `package main var count int func call(f func() bool) { if f() { count++ } } $DECLS func main() { $CALLS if count != 0 { println("failed", count, "case(s)") } } ` const decl = ` type T$ [$]uint8 func test$() bool { v := T${1} return v == [$]uint8{2} || v != [$]uint8{1} }`