mirror of
https://github.com/golang/go
synced 2024-11-02 11:50:30 +00:00
[dev.typeparams] cmd/compile: add import/export of calls to builtin functions
For generic functions, we have to leave the builtins in OCALL form, rather than transform to specific ops, since we don't know the exact types involved. Allow export/import of builtins in OCALL form. Added new export/import test mapimp.go. Change-Id: I571f8eeaa13b4f69389dbdb9afb6cc61924b9bf2 Reviewed-on: https://go-review.googlesource.com/c/go/+/321750 Trust: Dan Scales <danscales@google.com> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
ccbfbb1c33
commit
b1a398cf0f
5 changed files with 64 additions and 0 deletions
|
@ -1579,6 +1579,16 @@ func (w *exportWriter) expr(n ir.Node) {
|
||||||
// We don't need a type here, as the type will be provided at the
|
// We don't need a type here, as the type will be provided at the
|
||||||
// declaration of n.
|
// declaration of n.
|
||||||
w.op(ir.ONAME)
|
w.op(ir.ONAME)
|
||||||
|
|
||||||
|
// This handles the case where we haven't yet transformed a call
|
||||||
|
// to a builtin, so we must write out the builtin as a name in the
|
||||||
|
// builtin package.
|
||||||
|
isBuiltin := n.BuiltinOp != ir.OXXX
|
||||||
|
w.bool(isBuiltin)
|
||||||
|
if isBuiltin {
|
||||||
|
w.string(n.Sym().Name)
|
||||||
|
break
|
||||||
|
}
|
||||||
w.localName(n)
|
w.localName(n)
|
||||||
|
|
||||||
// case OPACK, ONONAME:
|
// case OPACK, ONONAME:
|
||||||
|
|
|
@ -1184,6 +1184,10 @@ func (r *importReader) node() ir.Node {
|
||||||
return n
|
return n
|
||||||
|
|
||||||
case ir.ONAME:
|
case ir.ONAME:
|
||||||
|
isBuiltin := r.bool()
|
||||||
|
if isBuiltin {
|
||||||
|
return types.BuiltinPkg.Lookup(r.string()).Def.(*ir.Name)
|
||||||
|
}
|
||||||
return r.localName()
|
return r.localName()
|
||||||
|
|
||||||
// case OPACK, ONONAME:
|
// case OPACK, ONONAME:
|
||||||
|
|
15
test/typeparam/mapimp.dir/a.go
Normal file
15
test/typeparam/mapimp.dir/a.go
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2021 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
|
||||||
|
|
||||||
|
// Map calls the function f on every element of the slice s,
|
||||||
|
// returning a new slice of the results.
|
||||||
|
func Mapper[F, T any](s []F, f func(F) T) []T {
|
||||||
|
r := make([]T, len(s))
|
||||||
|
for i, v := range s {
|
||||||
|
r[i] = f(v)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
28
test/typeparam/mapimp.dir/main.go
Normal file
28
test/typeparam/mapimp.dir/main.go
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright 2021 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 main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"a"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
got := a.Mapper([]int{1, 2, 3}, strconv.Itoa)
|
||||||
|
want := []string{"1", "2", "3"}
|
||||||
|
if !reflect.DeepEqual(got, want) {
|
||||||
|
panic(fmt.Sprintf("got %s, want %s", got, want))
|
||||||
|
}
|
||||||
|
|
||||||
|
fgot := a.Mapper([]float64{2.5, 2.3, 3.5}, func(f float64) string {
|
||||||
|
return strconv.FormatFloat(f, 'f', -1, 64)
|
||||||
|
})
|
||||||
|
fwant := []string{"2.5", "2.3", "3.5"}
|
||||||
|
if !reflect.DeepEqual(fgot, fwant) {
|
||||||
|
panic(fmt.Sprintf("got %s, want %s", fgot, fwant))
|
||||||
|
}
|
||||||
|
}
|
7
test/typeparam/mapimp.go
Normal file
7
test/typeparam/mapimp.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
// rundir -G=3
|
||||||
|
|
||||||
|
// Copyright 2021 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…
Reference in a new issue