mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00: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:
parent
4289bd365c
commit
c15d0a93c7
@ -2001,6 +2001,7 @@ func (w *exportWriter) expr(n ir.Node) {
|
|||||||
n := n.(*ir.BinaryExpr)
|
n := n.(*ir.BinaryExpr)
|
||||||
w.op(n.Op())
|
w.op(n.Op())
|
||||||
w.pos(n.Pos())
|
w.pos(n.Pos())
|
||||||
|
w.stmtList(n.Init())
|
||||||
w.expr(n.X)
|
w.expr(n.X)
|
||||||
w.expr(n.Y)
|
w.expr(n.Y)
|
||||||
if go117ExportTypes {
|
if go117ExportTypes {
|
||||||
@ -2037,6 +2038,7 @@ func (w *exportWriter) expr(n ir.Node) {
|
|||||||
n := n.(*ir.CallExpr)
|
n := n.(*ir.CallExpr)
|
||||||
w.op(n.Op())
|
w.op(n.Op())
|
||||||
w.pos(n.Pos())
|
w.pos(n.Pos())
|
||||||
|
w.stmtList(n.Init())
|
||||||
w.exprList(n.Args) // emits terminating OEND
|
w.exprList(n.Args) // emits terminating OEND
|
||||||
// only append() calls may contain '...' arguments
|
// only append() calls may contain '...' arguments
|
||||||
if n.Op() == ir.OAPPEND {
|
if n.Op() == ir.OAPPEND {
|
||||||
|
@ -1552,20 +1552,25 @@ func (r *importReader) node() ir.Node {
|
|||||||
return ir.NewConvExpr(r.pos(), op, r.typ(), r.expr())
|
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:
|
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 {
|
if go117ExportTypes {
|
||||||
switch op {
|
switch op {
|
||||||
case ir.OCOPY, ir.OCOMPLEX, ir.OUNSAFEADD, ir.OUNSAFESLICE:
|
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())
|
n.SetType(r.typ())
|
||||||
return n
|
return n
|
||||||
case ir.OREAL, ir.OIMAG, ir.OCAP, ir.OCLOSE, ir.OLEN, ir.ONEW, ir.OPANIC:
|
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 {
|
if op != ir.OPANIC {
|
||||||
n.SetType(r.typ())
|
n.SetType(r.typ())
|
||||||
}
|
}
|
||||||
return n
|
return n
|
||||||
case ir.OAPPEND, ir.ODELETE, ir.ORECOVER, ir.OPRINT, ir.OPRINTN:
|
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 {
|
if op == ir.OAPPEND {
|
||||||
n.IsDDD = r.bool()
|
n.IsDDD = r.bool()
|
||||||
}
|
}
|
||||||
@ -1577,7 +1582,14 @@ func (r *importReader) node() ir.Node {
|
|||||||
// ir.OMAKE
|
// ir.OMAKE
|
||||||
goto error
|
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()
|
n.Args = r.exprList()
|
||||||
if op == ir.OAPPEND {
|
if op == ir.OAPPEND {
|
||||||
n.IsDDD = r.bool()
|
n.IsDDD = r.bool()
|
||||||
|
68
test/fixedbugs/issue52590.dir/a.go
Normal file
68
test/fixedbugs/issue52590.dir/a.go
Normal 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
|
||||||
|
}
|
18
test/fixedbugs/issue52590.dir/b.go
Normal file
18
test/fixedbugs/issue52590.dir/b.go
Normal 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()
|
||||||
|
}
|
7
test/fixedbugs/issue52590.go
Normal file
7
test/fixedbugs/issue52590.go
Normal 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
|
Loading…
x
Reference in New Issue
Block a user