]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: better position for "3-index slice of string" error
authorRobert Findley <rfindley@google.com>
Thu, 18 Nov 2021 00:37:04 +0000 (19:37 -0500)
committerRobert Findley <rfindley@google.com>
Thu, 18 Nov 2021 02:18:12 +0000 (02:18 +0000)
This is a port of CL 363670 from types2 to go/types.

Change-Id: I2ac3a5f86bb4eafddd2854e193083b2b737e29b6
Reviewed-on: https://go-review.googlesource.com/c/go/+/364901
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/go/types/index.go
src/go/types/testdata/check/expr3.src
src/go/types/testdata/check/typeparams.go2

index ace9ee06ab4e6a5e09452de33bcd466b2db19d37..6ea25bc764f6d0d9a6fcb4ad24156eb68650f0e3 100644 (file)
@@ -223,7 +223,11 @@ func (check *Checker) sliceExpr(x *operand, e *ast.SliceExpr) {
        case *Basic:
                if isString(u) {
                        if e.Slice3 {
-                               check.invalidOp(x, _InvalidSliceExpr, "3-index slice of string")
+                               at := e.Max
+                               if at == nil {
+                                       at = e // e.Index[2] should be present but be careful
+                               }
+                               check.invalidOp(at, _InvalidSliceExpr, "3-index slice of string")
                                x.mode = invalid
                                return
                        }
index 0f15c15a55a92721e3bc76d7ccfd1679b9f7805c..a63542b843dff88909ff033206cc96e462143602 100644 (file)
@@ -109,8 +109,8 @@ func indexes() {
        _ = t[- /* ERROR "negative" */ 1]
        _ = t[- /* ERROR "negative" */ 1 :]
        _ = t[: - /* ERROR "negative" */ 1]
-       _ = t /* ERROR "3-index slice of string" */ [1:2:3]
-       _ = "foo" /* ERROR "3-index slice of string" */ [1:2:3]
+       _ = t[1:2:3 /* ERROR "3-index slice of string" */ ]
+       _ = "foo"[1:2:3 /* ERROR "3-index slice of string" */ ]
        var t0 byte
        t0 = t[0]
        _ = t0
index 0d3b6ea5274a2db76ed70021db63881b0db4b2a8..e3aca4ccb0321564f7fbf4207fd64c669875636c 100644 (file)
@@ -129,7 +129,7 @@ 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] }
+func _[T interface{ ~string }] (x T, i, j, k int) { var _ T = x[i:j:k /* ERROR 3-index slice of string */ ] }
 
 type myByte1 []byte
 type myByte2 []byte
@@ -137,7 +137,7 @@ func _[T interface{ []byte | myByte1 | myByte2 }] (x T, i, j, k int) { var _ T =
 func _[T interface{ []byte | myByte1 | []int }] (x T, i, j, k int) { var _ T = x /* ERROR no structural type */ [i:j:k] }
 
 func _[T interface{ []byte | myByte1 | myByte2 | string }] (x T, i, j, k int) { var _ T = x[i:j] }
-func _[T interface{ []byte | myByte1 | myByte2 | string }] (x T, i, j, k int) { var _ T = x /* ERROR 3-index slice of string */ [i:j:k] }
+func _[T interface{ []byte | myByte1 | myByte2 | string }] (x T, i, j, k int) { var _ T = x[i:j:k /* ERROR 3-index slice of string */ ] }
 func _[T interface{ []byte | myByte1 | []int | string }] (x T, i, j, k int) { var _ T = x /* ERROR no structural type */ [i:j] }
 
 // len/cap built-ins