]> Cypherpunks repositories - gostls13.git/commitdiff
go/types, types2: refuse pointer to array as argument to "clear" builtin
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Sat, 21 Jan 2023 07:53:47 +0000 (14:53 +0700)
committerRobert Griesemer <gri@google.com>
Tue, 24 Jan 2023 17:50:44 +0000 (17:50 +0000)
The accepted proposal only permits map and slice types.

Updates #56351

Change-Id: I95cf4c856a5ecfcdf564601b6215eda3cb6ba86b
Reviewed-on: https://go-review.googlesource.com/c/go/+/463075
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>

src/cmd/compile/internal/types2/builtins.go
src/cmd/compile/internal/types2/builtins_test.go
src/go/types/builtins.go
src/go/types/builtins_test.go
src/internal/types/errors/codes.go
src/internal/types/testdata/check/builtins0.go
src/internal/types/testdata/check/builtins1.go

index a5e7baa8f53601a3b5ddb4605e27c8cc7b9cc2da..4e4d75665230c7480645f92549dfe80d4bf74c14 100644 (file)
@@ -240,15 +240,11 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) (
                }
 
                if !underIs(x.typ, func(u Type) bool {
-                       switch u := u.(type) {
+                       switch u.(type) {
                        case *Map, *Slice:
                                return true
-                       case *Pointer:
-                               if _, ok := under(u.base).(*Array); ok {
-                                       return true
-                               }
                        }
-                       check.errorf(x, InvalidClear, invalidArg+"cannot clear %s: argument must be (or constrained by) map, slice, or array pointer", x)
+                       check.errorf(x, InvalidClear, invalidArg+"cannot clear %s: argument must be (or constrained by) map or slice", x)
                        return false
                }) {
                        return
index 347595e169192659c0df71121341ea368261cb32..863aa95680befeb7b03c5aef800e01d0fe058f2c 100644 (file)
@@ -42,8 +42,6 @@ var builtinCalls = []struct {
 
        {"clear", `var m map[float64]int; clear(m)`, `func(map[float64]int)`},
        {"clear", `var s []byte; clear(s)`, `func([]byte)`},
-       {"clear", `var p *[10]int; clear(p)`, `func(*[10]int)`},
-       {"clear", `var s P; clear(s)`, `func(P)`},
 
        {"close", `var c chan int; close(c)`, `func(chan int)`},
        {"close", `var c chan<- chan string; close(c)`, `func(chan<- chan string)`},
index e7799731e8b50e126e088d48b2471b5e6c3cd32f..938e85ed68905347e0253973609769e0540c0638 100644 (file)
@@ -241,15 +241,11 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b
                }
 
                if !underIs(x.typ, func(u Type) bool {
-                       switch u := u.(type) {
+                       switch u.(type) {
                        case *Map, *Slice:
                                return true
-                       case *Pointer:
-                               if _, ok := under(u.base).(*Array); ok {
-                                       return true
-                               }
                        }
-                       check.errorf(x, InvalidClear, invalidArg+"cannot clear %s: argument must be (or constrained by) map, slice, or array pointer", x)
+                       check.errorf(x, InvalidClear, invalidArg+"cannot clear %s: argument must be (or constrained by) map or slice", x)
                        return false
                }) {
                        return
index aadf4bc5b63e01cce411a255d07f4280f298afd7..5591fecf02672badb425bca28dddc8f66a08cb3f 100644 (file)
@@ -42,8 +42,6 @@ var builtinCalls = []struct {
 
        {"clear", `var m map[float64]int; clear(m)`, `func(map[float64]int)`},
        {"clear", `var s []byte; clear(s)`, `func([]byte)`},
-       {"clear", `var p *[10]int; clear(p)`, `func(*[10]int)`},
-       {"clear", `var s P; clear(s)`, `func(P)`},
 
        {"close", `var c chan int; close(c)`, `func(chan int)`},
        {"close", `var c chan<- chan string; close(c)`, `func(chan<- chan string)`},
index acddcbb9c50deca0acf6130571b50ccf72cc1f31..9615f496c80f2bfdeabad279477af20fae612b59 100644 (file)
@@ -1432,7 +1432,7 @@ const (
        _ // not used anymore
 
        // InvalidClear occurs when clear is called with an argument
-       // that is not of map, slice, or pointer-to-array type.
+       // that is not of map or slice type.
        //
        // Example:
        //  func _(x int) {
index 9ae696d5b914962f66492fd75975159d59f5053f..913dc5156ef4035bf2d91cf780deef4375bbae99 100644 (file)
@@ -144,7 +144,7 @@ func clear1() {
        var m map[float64]string
        var s []byte
        clear(a /* ERROR "cannot clear a" */)
-       clear(&a)
+       clear(&/* ERROR "cannot clear &a" */a)
        clear(m)
        clear(s)
        clear([]int{})
index 725bba18a2ec207ace593f71e5b78258aad25cf1..b99114f4d67d1d64732d72329d5e7050effd69ad 100644 (file)
@@ -14,7 +14,7 @@ func _[T any](x T) {
        clear(x /* ERROR "cannot clear x" */)
 }
 
-func _[T ~map[int]string | ~[]byte | ~*[10]int](x T) {
+func _[T ~map[int]string | ~[]byte](x T) {
        clear(x)
 }