aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2021-04-27 23:01:16 +0700
committerCuong Manh Le <cuong.manhle.vn@gmail.com>2021-04-28 00:49:58 +0000
commitc9f43507c6d8106646b1262052cc9a2c5dbb6e4c (patch)
tree414c512dcb4c5ebba5ecad15e101ff331a9674cc
parent983dea90c169930e35721232afe39fd4e3fbe4a6 (diff)
downloadgo-c9f43507c6d8106646b1262052cc9a2c5dbb6e4c.tar.gz
go-c9f43507c6d8106646b1262052cc9a2c5dbb6e4c.zip
cmd/compile: fix typechecking logical operators panic with non-boolean operand
In CL 255899, we added code to make clearer error when non-bool used as operand to logical operators. The code is safe, because node type is guaranteed to be non-nil. In CL 279442, we refactored typechecking arith, including moving typechecking logical operators to separate case. Now we have to explicitly check if operand type is not nil, because calling Expr can set operand type nil for non-bool operands. Fixes #45804 Change-Id: Ie2b6e18f65c0614a803b343f60e78ee1d660bbeb Reviewed-on: https://go-review.googlesource.com/c/go/+/314209 Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
-rw-r--r--src/cmd/compile/internal/typecheck/typecheck.go4
-rw-r--r--test/fixedbugs/issue45804.go19
2 files changed, 23 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/typecheck/typecheck.go b/src/cmd/compile/internal/typecheck/typecheck.go
index ab493e0caa..00dd44b96b 100644
--- a/src/cmd/compile/internal/typecheck/typecheck.go
+++ b/src/cmd/compile/internal/typecheck/typecheck.go
@@ -596,6 +596,10 @@ func typecheck1(n ir.Node, top int) ir.Node {
case ir.OANDAND, ir.OOROR:
n := n.(*ir.LogicalExpr)
n.X, n.Y = Expr(n.X), Expr(n.Y)
+ if n.X.Type() == nil || n.Y.Type() == nil {
+ n.SetType(nil)
+ return n
+ }
// For "x == x && len(s)", it's better to report that "len(s)" (type int)
// can't be used with "&&" than to report that "x == x" (type untyped bool)
// can't be converted to int (see issue #41500).
diff --git a/test/fixedbugs/issue45804.go b/test/fixedbugs/issue45804.go
new file mode 100644
index 0000000000..28d42c8d81
--- /dev/null
+++ b/test/fixedbugs/issue45804.go
@@ -0,0 +1,19 @@
+// errorcheck
+
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+func g() int
+func h(int)
+
+var b bool
+
+func f() {
+ did := g()
+ if !did && b { // ERROR "invalid operation"
+ h(x) // ERROR "undefined"
+ }
+}