Skip to content

Commit

Permalink
cmd/compile/internal/types2: implement generic slice expressions
Browse files Browse the repository at this point in the history
For now, the constraint's underlying type set must be a single
type that is sliceable.

Change-Id: I08b6a2e88fe35e8238a95b3f40dc969689021a0f
Reviewed-on: https://go-review.googlesource.com/c/go/+/354070
Trust: Robert Griesemer <[email protected]>
Run-TryBot: Robert Griesemer <[email protected]>
TryBot-Result: Go Bot <[email protected]>
Reviewed-by: Ian Lance Taylor <[email protected]>
  • Loading branch information
griesemer committed Oct 5, 2021
1 parent 097a82f commit 7e69c5d
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 8 deletions.
7 changes: 1 addition & 6 deletions src/cmd/compile/internal/types2/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ func (check *Checker) sliceExpr(x *operand, e *syntax.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.Full {
Expand Down Expand Up @@ -246,11 +246,6 @@ func (check *Checker) sliceExpr(x *operand, e *syntax.SliceExpr) {
case *Slice:
valid = true
// x.typ doesn't change

case *TypeParam:
check.error(x, "generic slice expressions not yet implemented")
x.mode = invalid
return
}

if !valid {
Expand Down
8 changes: 6 additions & 2 deletions src/cmd/compile/internal/types2/testdata/check/typeparams.go2
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit 7e69c5d

Please sign in to comment.