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