For #49735.
Change-Id: Ib7343061dca0e8d848e0719d39be0393d7cfad93
Reviewed-on: https://go-review.googlesource.com/c/go/+/384615
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
if s, _ := structuralType(S).(*Slice); s != nil {
T = s.elem
} else {
- check.errorf(x, invalidArg+"%s is not a slice", x)
+ var cause string
+ switch {
+ case x.isNil():
+ cause = "have untyped nil"
+ case isTypeParam(S):
+ if u := structuralType(S); u != nil {
+ cause = check.sprintf("%s has structural type %s", x, u)
+ } else {
+ cause = check.sprintf("%s has no structural type", x)
+ }
+ default:
+ cause = check.sprintf("have %s", x)
+ }
+ // don't use invalidArg prefix here as it would repeat "argument" in the error message
+ check.errorf(x, "first argument to append must be a slice; %s", cause)
return
}
var x int
var s []byte
_ = append() // ERROR not enough arguments
- _ = append("foo" /* ERROR not a slice */ )
- _ = append(nil /* ERROR not a slice */ , s)
- _ = append(x /* ERROR not a slice */ , s)
+ _ = append("foo" /* ERROR must be a slice */ )
+ _ = append(nil /* ERROR must be a slice */ , s)
+ _ = append(x /* ERROR must be a slice */ , s)
_ = append(s)
_ = append(s, nil...)
append /* ERROR not used */ (s)
_ = append(f2())
_ = append(f3())
_ = append(f5())
- _ = append(ff /* ERROR not a slice */ ()) // TODO(gri) better error message
+ _ = append(ff /* ERROR must be a slice */ ()) // TODO(gri) better error message
}
func cap1() {
--- /dev/null
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func _[P1 any, P2 ~byte](s1 P1, s2 P2) {
+ _ = append(nil /* ERROR first argument to append must be a slice; have untyped nil */ , 0)
+ _ = append(s1 /* ERROR s1 .* has no structural type */ , 0)
+ _ = append(s2 /* ERROR s2 .* has structural type byte */ , 0)
+}
if s, _ := structuralType(S).(*Slice); s != nil {
T = s.elem
} else {
- check.invalidArg(x, _InvalidAppend, "%s is not a slice", x)
+ var cause string
+ switch {
+ case x.isNil():
+ cause = "have untyped nil"
+ case isTypeParam(S):
+ if u := structuralType(S); u != nil {
+ cause = check.sprintf("%s has structural type %s", x, u)
+ } else {
+ cause = check.sprintf("%s has no structural type", x)
+ }
+ default:
+ cause = check.sprintf("have %s", x)
+ }
+ // don't use Checker.invalidArg here as it would repeat "argument" in the error message
+ check.errorf(x, _InvalidAppend, "first argument to append must be a slice; %s", cause)
return
}
var x int
var s []byte
_ = append() // ERROR not enough arguments
- _ = append("foo" /* ERROR not a slice */ )
- _ = append(nil /* ERROR not a slice */ , s)
- _ = append(x /* ERROR not a slice */ , s)
+ _ = append("foo" /* ERROR must be a slice */ )
+ _ = append(nil /* ERROR must be a slice */ , s)
+ _ = append(x /* ERROR must be a slice */ , s)
_ = append(s)
_ = append(s, nil...)
append /* ERROR not used */ (s)
_ = append(f2())
_ = append(f3())
_ = append(f5())
- _ = append(ff /* ERROR not a slice */ ()) // TODO(gri) better error message
+ _ = append(ff /* ERROR must be a slice */ ()) // TODO(gri) better error message
}
func cap1() {
--- /dev/null
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func _[P1 any, P2 ~byte](s1 P1, s2 P2) {
+ _ = append(nil /* ERROR first argument to append must be a slice; have untyped nil */ , 0)
+ _ = append(s1 /* ERROR s1 .* has no structural type */ , 0)
+ _ = append(s2 /* ERROR s2 .* has structural type byte */ , 0)
+}