| // run |
| |
| // 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. |
| |
| // Test case for issue 849. |
| |
| package main |
| |
| type I interface { |
| f() |
| } |
| |
| var callee string |
| var error_ bool |
| |
| type T int |
| |
| func (t *T) f() { callee = "f" } |
| func (i *T) g() { callee = "g" } |
| |
| // test1 and test2 are the same except that in the interface J |
| // the entries are swapped. test2 and test3 are the same except |
| // that in test3 the interface J is declared outside the function. |
| // |
| // Error: test2 calls g instead of f |
| |
| func test1(x I) { |
| type J interface { |
| I |
| g() |
| } |
| x.(J).f() |
| if callee != "f" { |
| println("test1 called", callee) |
| error_ = true |
| } |
| } |
| |
| func test2(x I) { |
| type J interface { |
| g() |
| I |
| } |
| x.(J).f() |
| if callee != "f" { |
| println("test2 called", callee) |
| error_ = true |
| } |
| } |
| |
| type J interface { |
| g() |
| I |
| } |
| |
| func test3(x I) { |
| x.(J).f() |
| if callee != "f" { |
| println("test3 called", callee) |
| error_ = true |
| } |
| } |
| |
| func main() { |
| x := new(T) |
| test1(x) |
| test2(x) |
| test3(x) |
| if error_ { |
| panic("wrong method called") |
| } |
| } |
| |
| /* |
| 6g bug286.go && 6l bug286.6 && 6.out |
| test2 called g |
| panic: wrong method called |
| |
| panic PC=0x24e040 |
| runtime.panic+0x7c /home/gri/go1/src/pkg/runtime/proc.c:1012 |
| runtime.panic(0x0, 0x24e0a0) |
| main.main+0xef /home/gri/go1/test/bugs/bug286.go:76 |
| main.main() |
| mainstart+0xf /home/gri/go1/src/pkg/runtime/amd64/asm.s:60 |
| mainstart() |
| goexit /home/gri/go1/src/pkg/runtime/proc.c:145 |
| goexit() |
| */ |