diff --git a/go/ssa/builder.go b/go/ssa/builder.go index 45a837617cb..4a3eed97177 100644 --- a/go/ssa/builder.go +++ b/go/ssa/builder.go @@ -1026,8 +1026,7 @@ func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) { // assignOp emits to fn code to perform loc = val. func (b *builder) assignOp(fn *Function, loc lvalue, val Value, op token.Token, pos token.Pos) { - oldv := loc.load(fn) - loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, val, oldv.Type()), loc.typ(), pos)) + loc.store(fn, emitArith(fn, op, loc.load(fn), val, loc.typ(), pos)) } // localValueSpec emits to fn code to define all of the vars in the diff --git a/go/ssa/interp/interp_test.go b/go/ssa/interp/interp_test.go index c78d0d29e0e..91ecb97934e 100644 --- a/go/ssa/interp/interp_test.go +++ b/go/ssa/interp/interp_test.go @@ -124,6 +124,8 @@ var testdataTests = []string{ "reflect.go", "static.go", "width32.go", + + "fixedbugs/issue52342.go", } // Specific GOARCH to use for a test case in go.tools/go/ssa/interp/testdata/. diff --git a/go/ssa/interp/testdata/fixedbugs/issue52342.go b/go/ssa/interp/testdata/fixedbugs/issue52342.go new file mode 100644 index 00000000000..2e1cc63cfe8 --- /dev/null +++ b/go/ssa/interp/testdata/fixedbugs/issue52342.go @@ -0,0 +1,17 @@ +package main + +func main() { + var d byte + + d = 1 + d <<= 256 + if d != 0 { + panic(d) + } + + d = 1 + d >>= 256 + if d != 0 { + panic(d) + } +}