| // 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)") | |
| } | |
| } |