|  | // Tests of call chaining f(g()) when g has multiple return values (MRVs). | 
|  | // See https://code.google.com/p/go/issues/detail?id=4573. | 
|  |  | 
|  | package main | 
|  |  | 
|  | func assert(actual, expected int) { | 
|  | if actual != expected { | 
|  | panic(actual) | 
|  | } | 
|  | } | 
|  |  | 
|  | func g() (int, int) { | 
|  | return 5, 7 | 
|  | } | 
|  |  | 
|  | func g2() (float64, float64) { | 
|  | return 5, 7 | 
|  | } | 
|  |  | 
|  | func f1v(x int, v ...int) { | 
|  | assert(x, 5) | 
|  | assert(v[0], 7) | 
|  | } | 
|  |  | 
|  | func f2(x, y int) { | 
|  | assert(x, 5) | 
|  | assert(y, 7) | 
|  | } | 
|  |  | 
|  | func f2v(x, y int, v ...int) { | 
|  | assert(x, 5) | 
|  | assert(y, 7) | 
|  | assert(len(v), 0) | 
|  | } | 
|  |  | 
|  | func complexArgs() (float64, float64) { | 
|  | return 5, 7 | 
|  | } | 
|  |  | 
|  | func appendArgs() ([]string, string) { | 
|  | return []string{"foo"}, "bar" | 
|  | } | 
|  |  | 
|  | func h() (i interface{}, ok bool) { | 
|  | m := map[int]string{1: "hi"} | 
|  | i, ok = m[1] // string->interface{} conversion within multi-valued expression | 
|  | return | 
|  | } | 
|  |  | 
|  | func h2() (i interface{}, ok bool) { | 
|  | ch := make(chan string, 1) | 
|  | ch <- "hi" | 
|  | i, ok = <-ch // string->interface{} conversion within multi-valued expression | 
|  | return | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | f1v(g()) | 
|  | f2(g()) | 
|  | f2v(g()) | 
|  | if c := complex(complexArgs()); c != 5+7i { | 
|  | panic(c) | 
|  | } | 
|  | if s := append(appendArgs()); len(s) != 2 || s[0] != "foo" || s[1] != "bar" { | 
|  | panic(s) | 
|  | } | 
|  | i, ok := h() | 
|  | if !ok || i.(string) != "hi" { | 
|  | panic(i) | 
|  | } | 
|  | i, ok = h2() | 
|  | if !ok || i.(string) != "hi" { | 
|  | panic(i) | 
|  | } | 
|  | } |