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