]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: better error when converting untyped values in assignments
authorRob Findley <rfindley@google.com>
Sun, 12 Jul 2020 20:57:01 +0000 (16:57 -0400)
committerRobert Findley <rfindley@google.com>
Thu, 27 Aug 2020 16:05:08 +0000 (16:05 +0000)
The error returned by convertUntyped is 'cannot convert _ to _', which
can be misleading in contexts where an explicit conversion would be
allowed.

Arguably the error message from convertUntyped should just be 'cannot
use _ as _', as 'convert' has an explicit meaning within the spec.
Making that change caused a large number of test failures, so for now we
just fix this for assignments by interpreting the error.

For #22070

Change-Id: I4eed6f39d1a991e8df7e035ec301d28a05150eb5
Reviewed-on: https://go-review.googlesource.com/c/go/+/242083
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/go/types/assignments.go

index 34a9d7843d94388ecc4419f4174b559195ee181b..9697e504cdc8301c1f020e3b7c0af97383425df7 100644 (file)
@@ -7,6 +7,7 @@
 package types
 
 import (
+       "errors"
        "go/ast"
        "go/token"
 )
@@ -43,8 +44,16 @@ func (check *Checker) assignment(x *operand, T Type, context string) {
                        }
                        target = Default(x.typ)
                }
-               check.convertUntyped(x, target)
-               if x.mode == invalid {
+               if err := check.canConvertUntyped(x, target); err != nil {
+                       var internalErr Error
+                       var msg string
+                       if errors.As(err, &internalErr) {
+                               msg = internalErr.Msg
+                       } else {
+                               msg = err.Error()
+                       }
+                       check.errorf(x.pos(), "cannot use %s as %s value in %s: %v", x, target, context, msg)
+                       x.mode = invalid
                        return
                }
        }