mirror of
https://github.com/golang/go
synced 2024-11-17 18:14:46 -07:00
c8d6ee12d5
When being used by the compiler, fix up types2 error messages to be more like Go 1.17 compiler errors. In particular: - add information about which method is missing when a type is not assignable/convertible/etc. to an interface. - add information about any existing method which has the same name, but wrong type. - add extra hint in the case that the source or destination type is a pointer to an interface, rather than an interface. - add extra hint "need type assertion" in the case that the source is an interface that is implemented by the destination. - the following change in the CL stack also adds information about any existing method with a different name that only differs in case. Include much of the new logic in a new common function (*Checker).missingMethodReason(). types2 still adds a little more information in some cases then the Go 1.17 compiler. For example, it typically says "(value of type T)", rather than "(type T)", where "value" could also be "constant", "variable", etc. I kept the types2 error messages almost all the same when types2 is not used by the compiler. The only change (to reduce amount of compatibility code) was to change "M method" phrasing in one case to "method M" phrasing in one error message (which is the phrasing it uses in all other cases). That is the reason that there are a few small changes in types2/testdata/check/*.src. Added new test test/fixedbugs/issue48471.go to test that the added information is appearing correctly. Also adjusted the pattern matching in a bunch of other test/fixedbugs/*.go, now that types2 is producing error messages closer to Go 1.17. Was able to remove a couple test files from the types2 exception list in run.go. Updated #48471 Change-Id: I8af1eae6eb8a5541d8ea20b66f494e2e795e1956 Reviewed-on: https://go-review.googlesource.com/c/go/+/363436 Trust: Dan Scales <danscales@google.com> Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
// errorcheck
|
|
|
|
// Copyright 2010 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.
|
|
|
|
// Verify that illegal uses of ... are detected.
|
|
// Does not compile.
|
|
|
|
package main
|
|
|
|
import "unsafe"
|
|
|
|
func sum(args ...int) int { return 0 }
|
|
|
|
var (
|
|
_ = sum(1, 2, 3)
|
|
_ = sum()
|
|
_ = sum(1.0, 2.0)
|
|
_ = sum(1.5) // ERROR "1\.5 .untyped float constant. as int|integer"
|
|
_ = sum("hello") // ERROR ".hello. (.untyped string constant. as int|.type untyped string. as type int)|incompatible"
|
|
_ = sum([]int{1}) // ERROR "\[\]int{.*}.*as type int"
|
|
)
|
|
|
|
func sum3(int, int, int) int { return 0 }
|
|
func tuple() (int, int, int) { return 1, 2, 3 }
|
|
|
|
var (
|
|
_ = sum(tuple())
|
|
_ = sum(tuple()...) // ERROR "\.{3} with 3-valued|multiple-value"
|
|
_ = sum3(tuple())
|
|
_ = sum3(tuple()...) // ERROR "\.{3} in call to non-variadic|multiple-value|invalid use of .*[.][.][.]"
|
|
)
|
|
|
|
type T []T
|
|
|
|
func funny(args ...T) int { return 0 }
|
|
|
|
var (
|
|
_ = funny(nil)
|
|
_ = funny(nil, nil)
|
|
_ = funny([]T{}) // ok because []T{} is a T; passes []T{[]T{}}
|
|
)
|
|
|
|
func Foo(n int) {}
|
|
|
|
func bad(args ...int) {
|
|
print(1, 2, args...) // ERROR "[.][.][.]"
|
|
println(args...) // ERROR "[.][.][.]"
|
|
ch := make(chan int)
|
|
close(ch...) // ERROR "[.][.][.]"
|
|
_ = len(args...) // ERROR "[.][.][.]"
|
|
_ = new(int...) // ERROR "[.][.][.]"
|
|
n := 10
|
|
_ = make([]byte, n...) // ERROR "[.][.][.]"
|
|
_ = make([]byte, 10 ...) // ERROR "[.][.][.]"
|
|
var x int
|
|
_ = unsafe.Pointer(&x...) // ERROR "[.][.][.]"
|
|
_ = unsafe.Sizeof(x...) // ERROR "[.][.][.]"
|
|
_ = [...]byte("foo") // ERROR "[.][.][.]"
|
|
_ = [...][...]int{{1,2,3},{4,5,6}} // ERROR "[.][.][.]"
|
|
|
|
Foo(x...) // ERROR "\.{3} in call to non-variadic|invalid use of .*[.][.][.]"
|
|
}
|