aboutsummaryrefslogtreecommitdiff
path: root/src/go
diff options
context:
space:
mode:
authorJason7602 <jansonzhe@gmail.com>2021-11-09 23:46:41 +0800
committerRobert Findley <rfindley@google.com>2021-12-09 18:03:49 +0000
commitece493eb831a7797d03d60b44b817caf1c63a0ab (patch)
tree0551320d18942d553252202e6d958936f2d2fe63 /src/go
parent78b4518e31b39aac4fbad1679db95b3f526229a7 (diff)
downloadgo-ece493eb831a7797d03d60b44b817caf1c63a0ab.tar.gz
go-ece493eb831a7797d03d60b44b817caf1c63a0ab.zip
cmd/compile: fix type error reported on the wrong line
The 'Does not match' type error shoud be reported where the function is called, not where the function is declared. And fix the todo by gri of issue45985 Fixes #45985 Fixes #49800 Change-Id: I15aac44dd44f2a57c485a1c273fcd79db912c389 Reviewed-on: https://go-review.googlesource.com/c/go/+/362634 Reviewed-by: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> Trust: Robert Findley <rfindley@google.com> Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/go')
-rw-r--r--src/go/types/infer.go10
-rw-r--r--src/go/types/testdata/fixedbugs/issue45985.go25
2 files changed, 7 insertions, 8 deletions
diff --git a/src/go/types/infer.go b/src/go/types/infer.go
index 909042219c..a5088f2705 100644
--- a/src/go/types/infer.go
+++ b/src/go/types/infer.go
@@ -59,7 +59,7 @@ func (check *Checker) infer(posn positioner, tparams []*TypeParam, targs []Type,
// If we have type arguments, see how far we get with constraint type inference.
if len(targs) > 0 {
var index int
- targs, index = check.inferB(tparams, targs)
+ targs, index = check.inferB(posn, tparams, targs)
if targs == nil || index < 0 {
return targs
}
@@ -174,7 +174,7 @@ func (check *Checker) infer(posn positioner, tparams []*TypeParam, targs []Type,
// See how far we get with constraint type inference.
// Note that even if we don't have any type arguments, constraint type inference
// may produce results for constraints that explicitly specify a type.
- targs, index = check.inferB(tparams, targs)
+ targs, index = check.inferB(posn, tparams, targs)
if targs == nil || index < 0 {
return targs
}
@@ -210,7 +210,7 @@ func (check *Checker) infer(posn positioner, tparams []*TypeParam, targs []Type,
}
// Again, follow up with constraint type inference.
- targs, index = check.inferB(tparams, targs)
+ targs, index = check.inferB(posn, tparams, targs)
if targs == nil || index < 0 {
return targs
}
@@ -359,7 +359,7 @@ func (w *tpWalker) isParameterizedTypeList(list []Type) bool {
// first type argument in that list that couldn't be inferred (and thus is nil). If all
// type arguments were inferred successfully, index is < 0. The number of type arguments
// provided may be less than the number of type parameters, but there must be at least one.
-func (check *Checker) inferB(tparams []*TypeParam, targs []Type) (types []Type, index int) {
+func (check *Checker) inferB(posn positioner, tparams []*TypeParam, targs []Type) (types []Type, index int) {
assert(len(tparams) >= len(targs) && len(targs) > 0)
// Setup bidirectional unification between constraints
@@ -387,7 +387,7 @@ func (check *Checker) inferB(tparams []*TypeParam, targs []Type) (types []Type,
if !u.unify(tpar, sbound) {
// TODO(gri) improve error message by providing the type arguments
// which we know already
- check.errorf(tpar.obj, _InvalidTypeArg, "%s does not match %s", tpar, sbound)
+ check.errorf(posn, _InvalidTypeArg, "%s does not match %s", tpar, sbound)
return nil, 0
}
}
diff --git a/src/go/types/testdata/fixedbugs/issue45985.go2 b/src/go/types/testdata/fixedbugs/issue45985.go2
index 637e2cad5e..9a0f5e3697 100644
--- a/src/go/types/testdata/fixedbugs/issue45985.go2
+++ b/src/go/types/testdata/fixedbugs/issue45985.go2
@@ -4,11 +4,10 @@
package issue45985
-// TODO(rFindley): this error should be on app[int] below.
-func app[S /* ERROR "S does not match" */ interface{ ~[]T }, T any](s S, e T) S {
+func app[S interface{ ~[]T }, T any](s S, e T) S {
return append(s, e)
}
func _() {
- _ = app[int]
+ _ = app/* ERROR "S does not match" */[int]
}