]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: implement generic slice expressions
authorRobert Griesemer <gri@golang.org>
Tue, 5 Oct 2021 18:45:22 +0000 (11:45 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 5 Oct 2021 19:28:36 +0000 (19:28 +0000)
This is a clean port of CL 354070 from types2 to go/types.

Change-Id: I44de1b8e6c0177e2a33e7f36a82465dc520c35aa
Reviewed-on: https://go-review.googlesource.com/c/go/+/354092
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>

src/go/types/index.go
src/go/types/testdata/check/typeparams.go2

index ca04072f7addcb2d31f9f2ddb34d0573a0d322dd..613f6292e49934c6aca0902262104cfb7494ed9a 100644 (file)
@@ -207,7 +207,7 @@ func (check *Checker) sliceExpr(x *operand, e *ast.SliceExpr) {
 
        valid := false
        length := int64(-1) // valid if >= 0
-       switch typ := under(x.typ).(type) {
+       switch typ := optype(x.typ).(type) {
        case *Basic:
                if isString(typ) {
                        if e.Slice3 {
@@ -246,11 +246,6 @@ func (check *Checker) sliceExpr(x *operand, e *ast.SliceExpr) {
        case *Slice:
                valid = true
                // x.typ doesn't change
-
-       case *TypeParam:
-               check.errorf(x, _Todo, "generic slice expressions not yet implemented")
-               x.mode = invalid
-               return
        }
 
        if !valid {
index bfacb3e1e7ebfcfd0cc3929f2de46f8c3a254616..10f84314fdd104cfc4dfc1aed2ad620fa63c546d 100644 (file)
@@ -115,9 +115,13 @@ func _[T interface{ [10]byte | string }](x T, i int) { _ = x[i]; _ = x[9]; _ = x
 func _[T interface{ [10]int | *[20]int | []int }](x T, i int) { _ = x[i]; _ = x[9]; _ = x[10 /* ERROR out of bounds */ ] }
 
 // slicing
-// TODO(gri) implement this
 
-func _[T interface{ ~string }] (x T, i, j, k int) { _ = x /* ERROR generic slice expressions not yet implemented */ [i:j:k] }
+func _[T interface{ ~[10]E }, E any] (x T, i, j, k int) { var _ []E = x[i:j] }
+func _[T interface{ ~[10]E }, E any] (x T, i, j, k int) { var _ []E = x[i:j:k] }
+func _[T interface{ ~[]byte }] (x T, i, j, k int) { var _ T = x[i:j] }
+func _[T interface{ ~[]byte }] (x T, i, j, k int) { var _ T = x[i:j:k] }
+func _[T interface{ ~string }] (x T, i, j, k int) { var _ T = x[i:j] }
+func _[T interface{ ~string }] (x T, i, j, k int) { var _ T = x /* ERROR 3-index slice of string */ [i:j:k] }
 
 // len/cap built-ins