GOARCH="amd64"
GOHOSTOS="linux"
GOVERSION="go1.17.2"
*Here is my test code*
var sink *int
func main(){
escape()
}
// named return value r
func escape() (r int) {
defer func(){
recover()
}()
sink = &r // escape r
panic("qOeOp")
return
}
jokoi@ubuntu:~/GoProJ/test$ go build -gcflags "-d defer" main.go
./main.go:11:2: stack-allocated defer
and i find something comment may be useful in package
cmd/compile/internel/ssagen
if s.hasOpenDefers {
......
// Similarly, skip if there are any heap-allocated result
// parameters that need to be copied back to their stack
slots.
for _, f := range s.curfn.Type().Results().FieldSlice() {
if !f.Nname.(*ir.Name).OnStack() {
s.hasOpenDefers = false
break
}
}
}
......
}
but i cannot understand why ? As far as i know , coping heap-allocated
result parameter back just need a small piece of code like mov rax [rax] at
the exit point of one function , why compiler cannot generate it .
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/a8212173-c664-4f48-93dc-528a8d8391bcn%40googlegroups.com.