]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix wrong check for b.Controls in isBlockMultiValueExit
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Sat, 28 Aug 2021 07:55:10 +0000 (14:55 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Sat, 28 Aug 2021 16:58:26 +0000 (16:58 +0000)
b.Controls has type [2]*Value, thus len(b.Controls) > 0 is always true.
The right check should be b.Controls[0] != nil, though, this is also
always true, since when we always set control value for BlockRet and
BlockRetJmp when state.exit is called.

Though checkFunc also checks for nil control value of ret/retjmp, but
it happens later after expand_calls pass, so better to be defensive
here, just in case.

Change-Id: Ie4a292a3494dfbf5e6d872cde498703023b84d00
Reviewed-on: https://go-review.googlesource.com/c/go/+/345433
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: Keith Randall <khr@golang.org>
src/cmd/compile/internal/ssa/expand_calls.go

index eba36ce33ba8ee63b5cd4654dfe2769732ddf790..a1ce27cc4a75548a1a9e13b21cb599c7306cc487 100644 (file)
@@ -24,7 +24,7 @@ type selKey struct {
 type Abi1RO uint8 // An offset within a parameter's slice of register indices, for abi1.
 
 func isBlockMultiValueExit(b *Block) bool {
-       return (b.Kind == BlockRet || b.Kind == BlockRetJmp) && len(b.Controls) > 0 && b.Controls[0].Op == OpMakeResult
+       return (b.Kind == BlockRet || b.Kind == BlockRetJmp) && b.Controls[0] != nil && b.Controls[0].Op == OpMakeResult
 }
 
 func badVal(s string, v *Value) error {