cmd/gc: always treat the output parameters as having been assigned in capturevars.

Fixes #9738.

Change-Id: Iab75de2d78335d4e31c3dce6a0e1826d8cddf5f3
Reviewed-on: https://go-review.googlesource.com/3690
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
This commit is contained in:
Shenghou Ma 2015-01-31 02:50:56 -05:00 committed by Minux Ma
parent 09114fb359
commit 3bf005cea3
2 changed files with 22 additions and 1 deletions

View file

@ -209,7 +209,8 @@ capturevars(Node *xfunc)
dowidth(v->type);
outer = v->outerexpr;
v->outerexpr = N;
if(!v->closure->addrtaken && !v->closure->assigned && v->type->width <= 128)
// out parameters will be assigned to implicitly upon return.
if(outer->class != PPARAMOUT && !v->closure->addrtaken && !v->closure->assigned && v->type->width <= 128)
v->byval = 1;
else {
outer = nod(OADDR, outer, N);

View file

@ -0,0 +1,20 @@
// run
// Copyright 2015 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.
package main
func F() (x int) {
defer func() {
if x != 42 {
println("BUG: x =", x)
}
}()
return 42
}
func main() {
F()
}