summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDavid Symonds <dsymonds@golang.org>2014-06-03 11:20:32 +1000
committerDavid Symonds <dsymonds@golang.org>2014-06-03 11:20:32 +1000
commit1d6c27231292f71231325557ab8d3dec71916c30 (patch)
tree127175ed8a833a07b10ffde06776e2bd5cab5a21 /test
parent89022a5b62d5437ae629df335e35d95247cba01c (diff)
downloadgo-1d6c27231292f71231325557ab8d3dec71916c30.tar.gz
[release-branch.go1.3] runtime: fix 1-byte return during x.(T) for 0-byte T
??? CL 100940043 / 93baf7bea171 runtime: fix 1-byte return during x.(T) for 0-byte T The 1-byte write was silently clearing a byte on the stack. If there was another function call with more arguments in the same stack frame, no harm done. Otherwise, if the variable at that location was already zero, no harm done. Otherwise, problems. Fixes issue 8139. LGTM=dsymonds R=golang-codereviews, dsymonds CC=golang-codereviews, iant, r https://codereview.appspot.com/100940043 ??? TBR=adg CC=golang-codereviews https://codereview.appspot.com/105760045
Diffstat (limited to 'test')
-rw-r--r--test/fixedbugs/issue8139.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/test/fixedbugs/issue8139.go b/test/fixedbugs/issue8139.go
new file mode 100644
index 000000000..821c9ff65
--- /dev/null
+++ b/test/fixedbugs/issue8139.go
@@ -0,0 +1,50 @@
+// run
+
+// Copyright 2014 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 8139. The x.(T) assertions used to write 1 (unexpected)
+// return byte for the 0-byte return value T.
+
+package main
+
+import "fmt"
+
+type T struct{}
+
+func (T) M() {}
+
+type M interface {
+ M()
+}
+
+var e interface{} = T{}
+var i M = T{}
+var b bool
+
+func f1() int {
+ if b {
+ return f1() // convince inliner not to inline
+ }
+ z := 0x11223344
+ _ = e.(T)
+ return z
+}
+
+func f2() int {
+ if b {
+ return f1() // convince inliner not to inline
+ }
+ z := 0x11223344
+ _ = i.(T)
+ return z
+}
+
+func main() {
+ x := f1()
+ y := f2()
+ if x != 0x11223344 || y != 0x11223344 {
+ fmt.Printf("BUG: x=%#x y=%#x, want 0x11223344 for both\n", x, y)
+ }
+}