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()
}
// 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()
--- /dev/null
+// 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
+}