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// https://golang.org/issue/800
8
9package main
10
11var log string
12
13type T int
14
15func (t T) a(s string) T {
16	log += "a(" + s + ")"
17	return t
18}
19
20func (T) b(s string) string {
21	log += "b"
22	return s
23}
24
25type F func(s string) F
26
27func a(s string) F {
28	log += "a(" + s + ")"
29	return F(a)
30}
31
32func b(s string) string {
33	log += "b"
34	return s
35}
36
37type I interface {
38	a(s string) I
39	b(s string) string
40}
41
42type T1 int
43
44func (t T1) a(s string) I {
45	log += "a(" + s + ")"
46	return t
47}
48
49func (T1) b(s string) string {
50	log += "b"
51	return s
52}
53
54var ok = true
55
56func bad() {
57	if !ok {
58		println("BUG")
59		ok = false
60	}
61	println(log)
62}
63
64func main() {
65	var t T
66	if t.a("1").a(t.b("2")); log != "a(1)ba(2)" {
67		bad()
68	}
69	log = ""
70	if a("3")(b("4"))(b("5")); log != "a(3)ba(4)ba(5)" {
71		bad()
72	}
73	log = ""
74	var i I = T1(0)
75	if i.a("6").a(i.b("7")).a(i.b("8")).a(i.b("9")); log != "a(6)ba(7)ba(8)ba(9)" {
76		bad()
77	}
78}
79
80