blob: c0a9792cefd7a62b7ee4da0b0481aca4156f09c1 [file]
// run
// Copyright 2026 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.
// Same time-traveling prove bug as issue80517_2.go, but the victims are a
// signed division and a signed modulo. make([]byte, n) teaches prove that
// n >= 0 only after it runs; a buggy prove lets that fact travel back and
// rewrites the earlier n/4 and n%3 into unsigned operations, corrupting
// the result for negative n.
package main
var sink []byte
//go:noinline
func trigger(n int) (q, r int) {
defer func() { recover() }()
if n < 100 {
q = n / 4 // signed division
r = n % 3 // signed modulo
sink = make([]byte, n) // only asserts n >= 0 after this point
}
return
}
func main() {
if q, r := trigger(-8); q != -2 || r != -2 {
println("n/4 =", q, "want -2; n%3 =", r, "want -2")
panic("prove miscompiled a signed div/mod")
}
}