New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cmd/compile: generate closure for go/defer builtin calls #19710
Comments
This is my interesting. Why you use defer delete? |
@mattn I have a map that I occasionally add temporary values to (for intermediate computations). I was trying to use defer+delete to remove those temporary entries automatically. |
Good news and bad news: Bad news is this has been broken forever. (I tested Go 1.5, Go 1.6, Go 1.7, and Go 1.8) Because it's not a regression and has been broken forever, it doesn't qualify for a Go 1.8.1 cherry-pick. Good news is that it's fixed at tip (what will be Go 1.9). I haven't bisected to see where it was fixed and whether it was intentional. If it was fixed by accident, it likely still lacks a test. |
Probably fixed by the order.go changes for mapdelete_fast*. Yes, needs a test. Should double-check go delete(x), and defer/delete of the other built-in functions. |
order.go, walk.go, and ssa.go are scattered with special handling of go/defer of built-in functions. I wonder whether instead we should just do a very early rewrite of defer builtin(a, b, c) to defer func(a typa, b typb, c typc) {
builtin(a, b, c)
}(a, b, c) That would probably also simplify instrumentation of such cases, which are also the topic of scattered special handling. |
@josharian I was thinking the same thing. |
I think we should add a test for 1.9 and and leave the closurization of deferred built-ins for 1.10. (That will also enable us to simplify other things, like not lowering OPANIC in walk.go.) I'll send a test CL. |
CL https://golang.org/cl/43497 mentions this issue. |
Updates #19710 Change-Id: I37d19a4a02b9010cb5f9062b3d141d5d65e12e01 Reviewed-on: https://go-review.googlesource.com/43497 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Note to self: walkprintfunc does this now for |
This is fixed at tip, we can close this now cc @mdempsky |
Please answer these questions before submitting your issue. Thanks!
What version of Go are you using (
go version
)?Go 1.8.
Also happens on play.golang.org.
What operating system and processor architecture are you using (
go env
)?GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
What did you do?
Evaluate this code:
What did you expect to see?
What did you see instead?
The
defer
statement is supposed to freeze its arguments the instant it is evaluated, but it does not when used withdelete
. Compare to this program, which works correctly:The text was updated successfully, but these errors were encountered: