diff options
author | Jason7602 <jansonzhe@gmail.com> | 2021-11-09 23:46:41 +0800 |
---|---|---|
committer | Robert Findley <rfindley@google.com> | 2021-12-09 18:03:49 +0000 |
commit | ece493eb831a7797d03d60b44b817caf1c63a0ab (patch) | |
tree | 0551320d18942d553252202e6d958936f2d2fe63 /src/go | |
parent | 78b4518e31b39aac4fbad1679db95b3f526229a7 (diff) | |
download | go-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.go | 10 | ||||
-rw-r--r-- | src/go/types/testdata/fixedbugs/issue45985.go2 | 5 |
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] } |