mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
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:
parent
09114fb359
commit
3bf005cea3
|
@ -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);
|
||||
|
|
20
test/fixedbugs/issue9738.go
Normal file
20
test/fixedbugs/issue9738.go
Normal 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()
|
||||
}
|
Loading…
Reference in a new issue