1// Tests of call chaining f(g()) when g has multiple return values (MRVs).
2// See https://code.google.com/p/go/issues/detail?id=4573.
3
4package main
5
6func assert(actual, expected int) {
7	if actual != expected {
8		panic(actual)
9	}
10}
11
12func g() (int, int) {
13	return 5, 7
14}
15
16func g2() (float64, float64) {
17	return 5, 7
18}
19
20func f1v(x int, v ...int) {
21	assert(x, 5)
22	assert(v[0], 7)
23}
24
25func f2(x, y int) {
26	assert(x, 5)
27	assert(y, 7)
28}
29
30func f2v(x, y int, v ...int) {
31	assert(x, 5)
32	assert(y, 7)
33	assert(len(v), 0)
34}
35
36func complexArgs() (float64, float64) {
37	return 5, 7
38}
39
40func appendArgs() ([]string, string) {
41	return []string{"foo"}, "bar"
42}
43
44func h() (i interface{}, ok bool) {
45	m := map[int]string{1: "hi"}
46	i, ok = m[1] // string->interface{} conversion within multi-valued expression
47	return
48}
49
50func h2() (i interface{}, ok bool) {
51	ch := make(chan string, 1)
52	ch <- "hi"
53	i, ok = <-ch // string->interface{} conversion within multi-valued expression
54	return
55}
56
57func main() {
58	f1v(g())
59	f2(g())
60	f2v(g())
61	if c := complex(complexArgs()); c != 5+7i {
62		panic(c)
63	}
64	if s := append(appendArgs()); len(s) != 2 || s[0] != "foo" || s[1] != "bar" {
65		panic(s)
66	}
67	i, ok := h()
68	if !ok || i.(string) != "hi" {
69		panic(i)
70	}
71	i, ok = h2()
72	if !ok || i.(string) != "hi" {
73		panic(i)
74	}
75}
76