1// errorcheck -0 -d=ssa/late_fuse/debug=1 2 3//go:build (amd64 && !gcflags_noopt) || (arm64 && !gcflags_noopt) 4 5// Copyright 2021 The Go Authors. All rights reserved. 6// Use of this source code is governed by a BSD-style 7// license that can be found in the LICENSE file. 8 9package main 10 11import "strings" 12 13const Cf2 = 2.0 14 15func fEqEq(a int, f float64) bool { 16 return a == 0 && f > Cf2 || a == 0 && f < -Cf2 // ERROR "Redirect Eq64 based on Eq64$" 17} 18 19func fEqNeq(a int32, f float64) bool { 20 return a == 0 && f > Cf2 || a != 0 && f < -Cf2 // ERROR "Redirect Neq32 based on Eq32$" 21} 22 23func fEqLess(a int8, f float64) bool { 24 return a == 0 && f > Cf2 || a < 0 && f < -Cf2 25} 26 27func fEqLeq(a float64, f float64) bool { 28 return a == 0 && f > Cf2 || a <= 0 && f < -Cf2 29} 30 31func fEqLessU(a uint, f float64) bool { 32 return a == 0 && f > Cf2 || a < 0 && f < -Cf2 33} 34 35func fEqLeqU(a uint64, f float64) bool { 36 return a == 0 && f > Cf2 || a <= 0 && f < -Cf2 // ERROR "Redirect Eq64 based on Eq64$" 37} 38 39func fNeqEq(a int, f float64) bool { 40 return a != 0 && f > Cf2 || a == 0 && f < -Cf2 // ERROR "Redirect Eq64 based on Neq64$" 41} 42 43func fNeqNeq(a int32, f float64) bool { 44 return a != 0 && f > Cf2 || a != 0 && f < -Cf2 // ERROR "Redirect Neq32 based on Neq32$" 45} 46 47func fNeqLess(a float32, f float64) bool { 48 // TODO: Add support for floating point numbers in prove 49 return a != 0 && f > Cf2 || a < 0 && f < -Cf2 50} 51 52func fNeqLeq(a int16, f float64) bool { 53 return a != 0 && f > Cf2 || a <= 0 && f < -Cf2 // ERROR "Redirect Leq16 based on Neq16$" 54} 55 56func fNeqLessU(a uint, f float64) bool { 57 return a != 0 && f > Cf2 || a < 0 && f < -Cf2 58} 59 60func fNeqLeqU(a uint32, f float64) bool { 61 return a != 2 && f > Cf2 || a <= 2 && f < -Cf2 // ERROR "Redirect Leq32U based on Neq32$" 62} 63 64func fLessEq(a int, f float64) bool { 65 return a < 0 && f > Cf2 || a == 0 && f < -Cf2 66} 67 68func fLessNeq(a int32, f float64) bool { 69 return a < 0 && f > Cf2 || a != 0 && f < -Cf2 70} 71 72func fLessLess(a float32, f float64) bool { 73 return a < 0 && f > Cf2 || a < 0 && f < -Cf2 // ERROR "Redirect Less32F based on Less32F$" 74} 75 76func fLessLeq(a float64, f float64) bool { 77 return a < 0 && f > Cf2 || a <= 0 && f < -Cf2 78} 79 80func fLeqEq(a float64, f float64) bool { 81 return a <= 0 && f > Cf2 || a == 0 && f < -Cf2 82} 83 84func fLeqNeq(a int16, f float64) bool { 85 return a <= 0 && f > Cf2 || a != 0 && f < -Cf2 // ERROR "Redirect Neq16 based on Leq16$" 86} 87 88func fLeqLess(a float32, f float64) bool { 89 return a <= 0 && f > Cf2 || a < 0 && f < -Cf2 90} 91 92func fLeqLeq(a int8, f float64) bool { 93 return a <= 0 && f > Cf2 || a <= 0 && f < -Cf2 // ERROR "Redirect Leq8 based on Leq8$" 94} 95 96func fLessUEq(a uint8, f float64) bool { 97 return a < 0 && f > Cf2 || a == 0 && f < -Cf2 98} 99 100func fLessUNeq(a uint16, f float64) bool { 101 return a < 0 && f > Cf2 || a != 0 && f < -Cf2 102} 103 104func fLessULessU(a uint32, f float64) bool { 105 return a < 0 && f > Cf2 || a < 0 && f < -Cf2 106} 107 108func fLessULeqU(a uint64, f float64) bool { 109 return a < 0 && f > Cf2 || a <= 0 && f < -Cf2 110} 111 112func fLeqUEq(a uint8, f float64) bool { 113 return a <= 2 && f > Cf2 || a == 2 && f < -Cf2 // ERROR "Redirect Eq8 based on Leq8U$" 114} 115 116func fLeqUNeq(a uint16, f float64) bool { 117 return a <= 2 && f > Cf2 || a != 2 && f < -Cf2 // ERROR "Redirect Neq16 based on Leq16U$" 118} 119 120func fLeqLessU(a uint32, f float64) bool { 121 return a <= 0 && f > Cf2 || a < 0 && f < -Cf2 122} 123 124func fLeqLeqU(a uint64, f float64) bool { 125 return a <= 2 && f > Cf2 || a <= 2 && f < -Cf2 // ERROR "Redirect Leq64U based on Leq64U$" 126} 127 128// Arg tests are disabled because the op name is different on amd64 and arm64. 129 130func fEqPtrEqPtr(a, b *int, f float64) bool { 131 return a == b && f > Cf2 || a == b && f < -Cf2 // ERROR "Redirect EqPtr based on EqPtr$" 132} 133 134func fEqPtrNeqPtr(a, b *int, f float64) bool { 135 return a == b && f > Cf2 || a != b && f < -Cf2 // ERROR "Redirect NeqPtr based on EqPtr$" 136} 137 138func fNeqPtrEqPtr(a, b *int, f float64) bool { 139 return a != b && f > Cf2 || a == b && f < -Cf2 // ERROR "Redirect EqPtr based on NeqPtr$" 140} 141 142func fNeqPtrNeqPtr(a, b *int, f float64) bool { 143 return a != b && f > Cf2 || a != b && f < -Cf2 // ERROR "Redirect NeqPtr based on NeqPtr$" 144} 145 146func fEqInterEqInter(a interface{}, f float64) bool { 147 return a == nil && f > Cf2 || a == nil && f < -Cf2 // ERROR "Redirect IsNonNil based on IsNonNil$" 148} 149 150func fEqInterNeqInter(a interface{}, f float64) bool { 151 return a == nil && f > Cf2 || a != nil && f < -Cf2 152} 153 154func fNeqInterEqInter(a interface{}, f float64) bool { 155 return a != nil && f > Cf2 || a == nil && f < -Cf2 156} 157 158func fNeqInterNeqInter(a interface{}, f float64) bool { 159 return a != nil && f > Cf2 || a != nil && f < -Cf2 // ERROR "Redirect IsNonNil based on IsNonNil$" 160} 161 162func fEqSliceEqSlice(a []int, f float64) bool { 163 return a == nil && f > Cf2 || a == nil && f < -Cf2 // ERROR "Redirect IsNonNil based on IsNonNil$" 164} 165 166func fEqSliceNeqSlice(a []int, f float64) bool { 167 return a == nil && f > Cf2 || a != nil && f < -Cf2 168} 169 170func fNeqSliceEqSlice(a []int, f float64) bool { 171 return a != nil && f > Cf2 || a == nil && f < -Cf2 172} 173 174func fNeqSliceNeqSlice(a []int, f float64) bool { 175 return a != nil && f > Cf2 || a != nil && f < -Cf2 // ERROR "Redirect IsNonNil based on IsNonNil$" 176} 177 178func fPhi(a, b string) string { 179 aslash := strings.HasSuffix(a, "/") // ERROR "Redirect Phi based on Phi$" 180 bslash := strings.HasPrefix(b, "/") 181 switch { 182 case aslash && bslash: 183 return a + b[1:] 184 case !aslash && !bslash: 185 return a + "/" + b 186 } 187 return a + b 188} 189 190func main() { 191} 192