| // run | |
| // Copyright 2012 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. | |
| // Issue 4167: inlining of a (*T).Method expression taking | |
| // its arguments from a multiple return breaks the compiler. | |
| package main | |
| type pa []int | |
| type p int | |
| func (this *pa) func1() (v *p, c int) { | |
| for _ = range *this { | |
| c++ | |
| } | |
| v = (*p)(&c) | |
| return | |
| } | |
| func (this *pa) func2() p { | |
| return (*p).func3(this.func1()) | |
| } | |
| func (this *p) func3(f int) p { | |
| return *this | |
| } | |
| func (this *pa) func2dots() p { | |
| return (*p).func3(this.func1()) | |
| } | |
| func (this *p) func3dots(f ...int) p { | |
| return *this | |
| } | |
| func main() { | |
| arr := make(pa, 13) | |
| length := arr.func2() | |
| if int(length) != len(arr) { | |
| panic("length != len(arr)") | |
| } | |
| length = arr.func2dots() | |
| if int(length) != len(arr) { | |
| panic("length != len(arr)") | |
| } | |
| } |