// run // Copyright 2020 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. // Checks that conversion of CMP(x,-y) -> CMN(x,y) is only applied in correct context. package main type decimal struct { d [8]byte // digits, big-endian representation dp int // decimal point } var powtab = []int{1, 3, 6, 9, 13, 16, 19, 23, 26} //go:noinline func foo(d *decimal) int { exp := int(d.d[1]) if d.dp < 0 || d.dp == 0 && d.d[0] < '5' { var n int if -d.dp >= len(powtab) { n = 27 } else { n = powtab[-d.dp] // incorrect CMP -> CMN substitution causes indexing panic. } exp += n } return exp } func main() { var d decimal d.d[0] = '1' if foo(&d) != 1 { println("FAILURE (though not the one this test was written to catch)") } }