From ebeab63d9515b539ae627f10cfc1766eecd243aa Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Tue, 5 Oct 2021 23:53:07 +0700 Subject: [PATCH] go/types: better error message for invalid untyped nil conversion This is port of CL 354049 for types2 to go/type. The change is identical, but for some tweaks to the error message/position in tests, since when go/types reports the exact operation "cannot convert" instead of the general "invalid operation" like types2. Updates #48784 Change-Id: I3e99f2721501d23187fd0a8970eb1de28e0c41d8 Reviewed-on: https://go-review.googlesource.com/c/go/+/354050 Trust: Cuong Manh Le Run-TryBot: Cuong Manh Le TryBot-Result: Go Bot Reviewed-by: Robert Findley --- src/go/types/errorcodes.go | 2 +- src/go/types/expr.go | 6 ++++++ src/go/types/testdata/check/expr2.src | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/go/types/errorcodes.go b/src/go/types/errorcodes.go index bcc850f7538..49c6a74c20d 100644 --- a/src/go/types/errorcodes.go +++ b/src/go/types/errorcodes.go @@ -875,7 +875,7 @@ const ( // context in which it is used. // // Example: - // var _ = 1 + nil + // var _ = 1 + new(int) _InvalidUntypedConversion // _BadOffsetofSyntax occurs when unsafe.Offsetof is called with an argument diff --git a/src/go/types/expr.go b/src/go/types/expr.go index 2fc5aa85d2e..fac5a5e31d4 100644 --- a/src/go/types/expr.go +++ b/src/go/types/expr.go @@ -967,6 +967,12 @@ func (check *Checker) binary(x *operand, e ast.Expr, lhs, rhs ast.Expr, op token if isString(x.typ) != isString(y.typ) { return false } + if x.isNil() && !hasNil(y.typ) { + return false + } + if y.isNil() && !hasNil(x.typ) { + return false + } return true } if canMix(x, &y) { diff --git a/src/go/types/testdata/check/expr2.src b/src/go/types/testdata/check/expr2.src index f9726b5de53..8757fd9e487 100644 --- a/src/go/types/testdata/check/expr2.src +++ b/src/go/types/testdata/check/expr2.src @@ -29,7 +29,7 @@ func arrays() { _ = a == b _ = a != b _ = a /* ERROR < not defined */ < b - _ = a == nil /* ERROR cannot convert */ + _ = a /* ERROR cannot compare.*mismatched types */ == nil type C [10]int var c C @@ -53,7 +53,7 @@ func structs() { _ = s == t _ = s != t _ = s /* ERROR < not defined */ < t - _ = s == nil /* ERROR cannot convert */ + _ = s /* ERROR cannot compare.*mismatched types */ == nil type S struct { x int