mirror of
https://github.com/golang/go.git
synced 2025-05-06 08:03:03 +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);
|
dowidth(v->type);
|
||||||
outer = v->outerexpr;
|
outer = v->outerexpr;
|
||||||
v->outerexpr = N;
|
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;
|
v->byval = 1;
|
||||||
else {
|
else {
|
||||||
outer = nod(OADDR, outer, N);
|
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…
x
Reference in New Issue
Block a user