cmd/compile/internal/types2: make built-in to accept type sets with single underlying types

This generalizes make the same way copy was generalized and eliminates
a use of optype.

Change-Id: I8221abd53d77dde8ead47c0075c13fd2a3221642
Reviewed-on: https://go-review.googlesource.com/c/go/+/357776
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
Robert Griesemer 2021-10-21 13:29:00 -07:00
parent 3cd28baffd
commit 2d205ebb96
2 changed files with 16 additions and 12 deletions

View File

@ -460,13 +460,13 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) (
}
var min int // minimum number of arguments
switch optype(T).(type) {
switch singleUnder(T).(type) {
case *Slice:
min = 2
case *Map, *Chan:
min = 1
case *top:
check.errorf(arg0, invalidArg+"cannot make %s; type parameter has no structural type", arg0)
case nil:
check.errorf(arg0, invalidArg+"cannot make %s; type set has no single underlying type", arg0)
return
default:
check.errorf(arg0, invalidArg+"cannot make %s; type must be slice, map, or channel", arg0)

View File

@ -127,15 +127,18 @@ func _[T M4[K, V], K comparable, V any](m T) {
// make
type myChan chan int
func _[
S1 interface{ []int },
S2 interface{ []int | chan int },
S1 ~[]int,
S2 ~[]int | ~chan int,
M1 interface{ map[string]int },
M2 interface{ map[string]int | chan int },
M1 ~map[string]int,
M2 ~map[string]int | ~chan int,
C1 interface{ chan int },
C2 interface{ chan int | chan string },
C1 ~chan int,
C2 ~chan int | ~chan string,
C3 chan int | myChan, // single underlying type
]() {
type S0 []int
_ = make([]int, 10)
@ -145,7 +148,7 @@ func _[
_ = make /* ERROR expects 2 or 3 arguments */ (S1)
_ = make(S1, 10, 20)
_ = make /* ERROR expects 2 or 3 arguments */ (S1, 10, 20, 30)
_ = make(S2 /* ERROR cannot make .* no structural type */ , 10)
_ = make(S2 /* ERROR cannot make .* no single underlying type */ , 10)
type M0 map[string]int
_ = make(map[string]int)
@ -153,7 +156,7 @@ func _[
_ = make(M1)
_ = make(M1, 10)
_ = make/* ERROR expects 1 or 2 arguments */(M1, 10, 20)
_ = make(M2 /* ERROR cannot make .* no structural type */ )
_ = make(M2 /* ERROR cannot make .* no single underlying type */ )
type C0 chan int
_ = make(chan int)
@ -161,7 +164,8 @@ func _[
_ = make(C1)
_ = make(C1, 10)
_ = make/* ERROR expects 1 or 2 arguments */(C1, 10, 20)
_ = make(C2 /* ERROR cannot make .* no structural type */ )
_ = make(C2 /* ERROR cannot make .* no single underlying type */ )
_ = make(C3)
}
// unsafe.Alignof