cmd/compile: simplify OPTRLIT handling

Previously, we would recognize &(T{...}) expressions during type
checking, rewrite them into (*T){...}, and then do a lot of extra work
to make sure the user doesn't write (*T){...} themselves and
resynthesizing the OPTRLIT later on.

This CL simply handles &T{...} directly in the straight forward
manner, by changing OADDR directly to OPTRLIT when appropriate.

While here, match go/types's invalid composite literal type error
message.

Passes toolstash-check.

Change-Id: I902b14c7e2cd9fa93e6915dd58272d2352ba38f8
Reviewed-on: https://go-review.googlesource.com/c/go/+/197120
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Matthew Dempsky 2019-09-25 00:21:23 -07:00
parent 87e2b34f7b
commit 00b773a4a9
7 changed files with 67 additions and 113 deletions

View file

@ -395,18 +395,16 @@ func walkclosure(clo *Node, init *Nodes) *Node {
typ := closureType(clo)
clos := nod(OCOMPLIT, nil, nod(ODEREF, typenod(typ), nil))
clos := nod(OCOMPLIT, nil, typenod(typ))
clos.Esc = clo.Esc
clos.Right.SetImplicit(true)
clos.List.Set(append([]*Node{nod(OCFUNC, xfunc.Func.Nname, nil)}, clo.Func.Enter.Slice()...))
clos = nod(OADDR, clos, nil)
clos.Esc = clo.Esc
// Force type conversion from *struct to the func type.
clos = convnop(clos, clo.Type)
// typecheck will insert a PTRLIT node under CONVNOP,
// tag it with escape analysis result.
clos.Left.Esc = clo.Esc
// non-escaping temp to use, if any.
if x := prealloc[clo]; x != nil {
if !types.Identical(typ, x.Type) {
@ -547,18 +545,16 @@ func walkpartialcall(n *Node, init *Nodes) *Node {
typ := partialCallType(n)
clos := nod(OCOMPLIT, nil, nod(ODEREF, typenod(typ), nil))
clos := nod(OCOMPLIT, nil, typenod(typ))
clos.Esc = n.Esc
clos.Right.SetImplicit(true)
clos.List.Set2(nod(OCFUNC, n.Func.Nname, nil), n.Left)
clos = nod(OADDR, clos, nil)
clos.Esc = n.Esc
// Force type conversion from *struct to the func type.
clos = convnop(clos, n.Type)
// The typecheck inside convnop will insert a PTRLIT node under CONVNOP.
// Tag it with escape analysis result.
clos.Left.Esc = n.Esc
// non-escaping temp to use, if any.
if x := prealloc[n]; x != nil {
if !types.Identical(typ, x.Type) {