• Matthew Dempsky's avatar
    cmd/compile: fix miscompilation of "defer delete(m, k)" · 2c0c68d6
    Matthew Dempsky authored
    Previously, for slow map key types (i.e., any type other than a 32-bit
    or 64-bit plain memory type), we would rewrite
    
        defer delete(m, k)
    
    into
    
        ktmp := k
        defer delete(m, &ktmp)
    
    However, if the defer statement was inside a loop, we would end up
    reusing the same ktmp value for all of the deferred deletes.
    
    We already rewrite
    
        defer print(x, y, z)
    
    into
    
        defer func(a1, a2, a3) {
            print(a1, a2, a3)
        }(x, y, z)
    
    This CL generalizes this rewrite to also apply for slow map deletes.
    
    This could be extended to apply even more generally to other builtins,
    but as discussed on #24259, there are cases where we must *not* do
    this (e.g., "defer recover()"). However, if we elect to do this more
    generally, this CL should still make that easier.
    
    Lastly, while here, fix a few isues in wrapCall (nee walkprintfunc):
    
    1) lookupN appends the generation number to the symbol anyway, so "%d"
    was being literally included in the generated function names.
    
    2) walkstmt will be called when the function is compiled later anyway,
    so no need to do it now.
    
    Fixes #24259.
    
    Change-Id: I70286867c64c69c18e9552f69e3f4154a0fc8b04
    Reviewed-on: https://go-review.googlesource.com/99017
    Run-TryBot: Matthew Dempsky <mdempsky@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    2c0c68d6
Name
Last commit
Last update
..
addr2line Loading commit data...
api Loading commit data...
asm Loading commit data...
buildid Loading commit data...
cgo Loading commit data...
compile Loading commit data...
cover Loading commit data...
dist Loading commit data...
doc Loading commit data...
fix Loading commit data...
go Loading commit data...
gofmt Loading commit data...
internal Loading commit data...
link Loading commit data...
nm Loading commit data...
objdump Loading commit data...
pack Loading commit data...
pprof Loading commit data...
test2json Loading commit data...
trace Loading commit data...
vendor Loading commit data...
vet Loading commit data...