• Russ Cox's avatar
    cmd/gc: fix x=x crash · 89d46fed
    Russ Cox authored
    [Same as CL 102820043 except applied changes to 6g/gsubr.c
    also to 5g/gsubr.c and 8g/gsubr.c. The problem I had last night
    trying to do that was that 8g's copy of nodarg has different
    (but equivalent) control flow and I was pasting the new code
    into the wrong place.]
    
    Description from CL 102820043:
    
    The 'nodarg' function is used to obtain a Node*
    representing a function argument or result.
    It returned a brand new Node*, but that violates
    the guarantee in most places in the compiler that
    two Node*s refer to the same variable if and only if
    they are the same Node* pointer. Reestablish that
    invariant by making nodarg return a preexisting
    named variable if present.
    
    Having fixed that, avoid any copy during x=x in
    componentgen, because the VARDEF we emit
    before the copy marks the lhs x as dead incorrectly.
    
    The change in walk.c avoids modifying the result
    of nodarg. This was the only place in the compiler
    that did so.
    
    Fixes #8097.
    
    LGTM=khr
    R=golang-codereviews, khr
    CC=golang-codereviews, iant, khr, r
    https://golang.org/cl/103750043
    89d46fed
cgen.c 33.4 KB