| // 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) | |
| } | |
| } |