• 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
map_test.go 19.9 KB