// 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() */