1// run 2 3// Copyright 2010 The Go Authors. All rights reserved. 4// Use of this source code is governed by a BSD-style 5// license that can be found in the LICENSE file. 6 7// Test case for issue 849. 8 9package main 10 11type I interface { 12 f() 13} 14 15var callee string 16var error_ bool 17 18type T int 19 20func (t *T) f() { callee = "f" } 21func (i *T) g() { callee = "g" } 22 23// test1 and test2 are the same except that in the interface J 24// the entries are swapped. test2 and test3 are the same except 25// that in test3 the interface J is declared outside the function. 26// 27// Error: test2 calls g instead of f 28 29func test1(x I) { 30 type J interface { 31 I 32 g() 33 } 34 x.(J).f() 35 if callee != "f" { 36 println("test1 called", callee) 37 error_ = true 38 } 39} 40 41func test2(x I) { 42 type J interface { 43 g() 44 I 45 } 46 x.(J).f() 47 if callee != "f" { 48 println("test2 called", callee) 49 error_ = true 50 } 51} 52 53type J interface { 54 g() 55 I 56} 57 58func test3(x I) { 59 x.(J).f() 60 if callee != "f" { 61 println("test3 called", callee) 62 error_ = true 63 } 64} 65 66func main() { 67 x := new(T) 68 test1(x) 69 test2(x) 70 test3(x) 71 if error_ { 72 panic("wrong method called") 73 } 74} 75 76/* 776g bug286.go && 6l bug286.6 && 6.out 78test2 called g 79panic: wrong method called 80 81panic PC=0x24e040 82runtime.panic+0x7c /home/gri/go1/src/pkg/runtime/proc.c:1012 83 runtime.panic(0x0, 0x24e0a0) 84main.main+0xef /home/gri/go1/test/bugs/bug286.go:76 85 main.main() 86mainstart+0xf /home/gri/go1/src/pkg/runtime/amd64/asm.s:60 87 mainstart() 88goexit /home/gri/go1/src/pkg/runtime/proc.c:145 89 goexit() 90*/ 91