]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/types2: make built-in to accept type sets with single underlying...
authorRobert Griesemer <gri@golang.org>
Thu, 21 Oct 2021 20:29:00 +0000 (13:29 -0700)
committerRobert Griesemer <gri@golang.org>
Sat, 23 Oct 2021 16:18:04 +0000 (16:18 +0000)
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>
src/cmd/compile/internal/types2/builtins.go
src/cmd/compile/internal/types2/testdata/check/builtins.go2

index 154395cddb5a33f35031fa07bffad7e888eaf992..37e1f00d263c3d9a6615600d4cae0c8b837a21cf 100644 (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)
index 83764404397b883321a5eedee537ee44470774d8..d1067a190f8cdc7ba56f07367c2c172b8a27d445 100644 (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