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:
parent
d544591d72
commit
0e90ba9335
@ -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)
|
||||
|
16
test/fixedbugs/issue52701.go
Normal file
16
test/fixedbugs/issue52701.go
Normal 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{}):
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user