mirror of
https://github.com/golang/go.git
synced 2024-09-22 10:58:58 +00:00
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:
parent
3cd28baffd
commit
2d205ebb96
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user