1
0
mirror of https://github.com/golang/go synced 2024-11-25 16:57:58 -07:00

cmd/compile: fix constructing expr side-effects when comparing 0-size types

In walkCompare, any ir.OCONVNOP was removed from both operands. So when
constructing assignments for them to preserve any side-effects, using
temporary variables can cause type mismatched with original type.

Instead, using blank assignments will prevent that issue and still make
sure that the operands will be evaluated.

Fixes #52701

Change-Id: I229046acb154890bb36fe441d258563687fdce37
Reviewed-on: https://go-review.googlesource.com/c/go/+/403997
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Robert Griesemer <gri@google.com>
This commit is contained in:
Cuong Manh Le 2022-05-05 01:00:38 +07:00 committed by Gopher Robot
parent d544591d72
commit 0e90ba9335
2 changed files with 18 additions and 3 deletions

View File

@ -268,9 +268,8 @@ func walkCompare(n *ir.BinaryExpr, init *ir.Nodes) ir.Node {
expr = ir.NewBool(n.Op() == ir.OEQ)
// We still need to use cmpl and cmpr, in case they contain
// an expression which might panic. See issue 23837.
t := typecheck.Temp(cmpl.Type())
a1 := typecheck.Stmt(ir.NewAssignStmt(base.Pos, t, cmpl))
a2 := typecheck.Stmt(ir.NewAssignStmt(base.Pos, t, cmpr))
a1 := typecheck.Stmt(ir.NewAssignStmt(base.Pos, ir.BlankNode, cmpl))
a2 := typecheck.Stmt(ir.NewAssignStmt(base.Pos, ir.BlankNode, cmpr))
init.Append(a1, a2)
}
return finishCompare(n, expr, init)

View File

@ -0,0 +1,16 @@
// compile
// Copyright 2022 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
type T1 struct{}
type T2 struct{}
func f() {
switch (T1{}) {
case T1(T2{}):
}
}