]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix type error reported on the wrong line
authorJason7602 <jansonzhe@gmail.com>
Tue, 9 Nov 2021 15:46:41 +0000 (23:46 +0800)
committerRobert Findley <rfindley@google.com>
Thu, 9 Dec 2021 18:03:49 +0000 (18:03 +0000)
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>

src/cmd/compile/internal/types2/infer.go
src/cmd/compile/internal/types2/testdata/fixedbugs/issue45985.go2
src/go/types/infer.go
src/go/types/testdata/fixedbugs/issue45985.go2

index 4f85a5894cc0726feffeaa4d93ceb81d56257203..b203985b8d129027d75a8b16c10c54e7bc0307b5 100644 (file)
@@ -60,7 +60,7 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
        // If we have type arguments, see how far we get with constraint type inference.
        if len(targs) > 0 && useConstraintTypeInference {
                var index int
-               targs, index = check.inferB(tparams, targs)
+               targs, index = check.inferB(pos, tparams, targs)
                if targs == nil || index < 0 {
                        return targs
                }
@@ -171,7 +171,7 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
        // Note that even if we don't have any type arguments, constraint type inference
        // may produce results for constraints that explicitly specify a type.
        if useConstraintTypeInference {
-               targs, index = check.inferB(tparams, targs)
+               targs, index = check.inferB(pos, tparams, targs)
                if targs == nil || index < 0 {
                        return targs
                }
@@ -209,7 +209,7 @@ func (check *Checker) infer(pos syntax.Pos, tparams []*TypeParam, targs []Type,
 
        // Again, follow up with constraint type inference.
        if useConstraintTypeInference {
-               targs, index = check.inferB(tparams, targs)
+               targs, index = check.inferB(pos, tparams, targs)
                if targs == nil || index < 0 {
                        return targs
                }
@@ -360,7 +360,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(pos syntax.Pos, tparams []*TypeParam, targs []Type) (types []Type, index int) {
        assert(len(tparams) >= len(targs) && len(targs) > 0)
 
        // Setup bidirectional unification between constraints
@@ -388,7 +388,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, "%s does not match %s", tpar, sbound)
+                               check.errorf(pos, "%s does not match %s", tpar, sbound)
                                return nil, 0
                        }
                }
index 9963d2ee003c165774539cca29614f05147908e9..cea8c1498321c7182c490d262cd9b4f58a03190f 100644 (file)
@@ -4,11 +4,10 @@
 
 package issue45985
 
-// TODO(gri): 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]
 }
index 909042219c2912d5a0d97e5f96c677b0f35a3a45..a5088f27050bf35fffbd2afbc534697d9ffc7885 100644 (file)
@@ -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
                        }
                }
index 637e2cad5e05e0f42513b790c7f150329c934191..9a0f5e36970058c347a5f312609f6821c208be59 100644 (file)
@@ -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]
 }