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