1
0
mirror of https://github.com/golang/go synced 2024-11-11 19:21:37 -07:00

cmd/compile: fix missing export/import init nodes of builtins that allow multiple arguments

Fixes #52590

Change-Id: Ibd0852ae2a9ad8e4598e93320daff1b3c196929f
Reviewed-on: https://go-review.googlesource.com/c/go/+/402854
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
This commit is contained in:
Cuong Manh Le 2022-04-28 21:03:00 +07:00 committed by Keith Randall
parent 4289bd365c
commit c15d0a93c7
5 changed files with 111 additions and 4 deletions

View File

@ -2001,6 +2001,7 @@ func (w *exportWriter) expr(n ir.Node) {
n := n.(*ir.BinaryExpr)
w.op(n.Op())
w.pos(n.Pos())
w.stmtList(n.Init())
w.expr(n.X)
w.expr(n.Y)
if go117ExportTypes {
@ -2037,6 +2038,7 @@ func (w *exportWriter) expr(n ir.Node) {
n := n.(*ir.CallExpr)
w.op(n.Op())
w.pos(n.Pos())
w.stmtList(n.Init())
w.exprList(n.Args) // emits terminating OEND
// only append() calls may contain '...' arguments
if n.Op() == ir.OAPPEND {

View File

@ -1552,20 +1552,25 @@ func (r *importReader) node() ir.Node {
return ir.NewConvExpr(r.pos(), op, r.typ(), r.expr())
case ir.OCOPY, ir.OCOMPLEX, ir.OREAL, ir.OIMAG, ir.OAPPEND, ir.OCAP, ir.OCLOSE, ir.ODELETE, ir.OLEN, ir.OMAKE, ir.ONEW, ir.OPANIC, ir.ORECOVER, ir.OPRINT, ir.OPRINTN, ir.OUNSAFEADD, ir.OUNSAFESLICE:
pos := r.pos()
if go117ExportTypes {
switch op {
case ir.OCOPY, ir.OCOMPLEX, ir.OUNSAFEADD, ir.OUNSAFESLICE:
n := ir.NewBinaryExpr(r.pos(), op, r.expr(), r.expr())
init := r.stmtList()
n := ir.NewBinaryExpr(pos, op, r.expr(), r.expr())
n.SetInit(init)
n.SetType(r.typ())
return n
case ir.OREAL, ir.OIMAG, ir.OCAP, ir.OCLOSE, ir.OLEN, ir.ONEW, ir.OPANIC:
n := ir.NewUnaryExpr(r.pos(), op, r.expr())
n := ir.NewUnaryExpr(pos, op, r.expr())
if op != ir.OPANIC {
n.SetType(r.typ())
}
return n
case ir.OAPPEND, ir.ODELETE, ir.ORECOVER, ir.OPRINT, ir.OPRINTN:
n := ir.NewCallExpr(r.pos(), op, nil, r.exprList())
init := r.stmtList()
n := ir.NewCallExpr(pos, op, nil, r.exprList())
n.SetInit(init)
if op == ir.OAPPEND {
n.IsDDD = r.bool()
}
@ -1577,7 +1582,14 @@ func (r *importReader) node() ir.Node {
// ir.OMAKE
goto error
}
n := builtinCall(r.pos(), op)
n := builtinCall(pos, op)
switch n.Op() {
case ir.OCOPY, ir.OCOMPLEX, ir.OUNSAFEADD, ir.OUNSAFESLICE:
// treated like other builtin calls
fallthrough
case ir.OAPPEND, ir.ODELETE, ir.ORECOVER, ir.OPRINT, ir.OPRINTN:
n.SetInit(r.stmtList())
}
n.Args = r.exprList()
if op == ir.OAPPEND {
n.IsDDD = r.bool()

View File

@ -0,0 +1,68 @@
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package a
import "unsafe"
func Append() {
_ = append(appendArgs())
}
func Delete() {
delete(deleteArgs())
}
func Print() {
print(ints())
}
func Println() {
println(ints())
}
func Complex() {
_ = complex(float64s())
}
func Copy() {
copy(slices())
}
func UnsafeAdd() {
_ = unsafe.Add(unsafeAdd())
}
func UnsafeSlice() {
_ = unsafe.Slice(unsafeSlice())
}
func appendArgs() ([]int, int) {
return []int{}, 0
}
func deleteArgs() (map[int]int, int) {
return map[int]int{}, 0
}
func ints() (int, int) {
return 1, 1
}
func float64s() (float64, float64) {
return 0, 0
}
func slices() ([]int, []int) {
return []int{}, []int{}
}
func unsafeAdd() (unsafe.Pointer, int) {
return nil, 0
}
func unsafeSlice() (*byte, int) {
var p [10]byte
return &p[0], 0
}

View File

@ -0,0 +1,18 @@
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package b
import "./a"
func f() {
a.Append()
a.Delete()
a.Print()
a.Println()
a.Complex()
a.Copy()
a.UnsafeAdd()
a.UnsafeSlice()
}

View File

@ -0,0 +1,7 @@
// compiledir
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package ignored