]> Cypherpunks.ru repositories - gostls13.git/blob - test/cmp.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / cmp.go
1 // run
2
3 // Copyright 2009 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
6
7 // Test equality and inequality operations.
8
9 package main
10
11 import (
12         "os"
13         "unsafe"
14 )
15
16 var global bool
17
18 func use(b bool) { global = b }
19
20 func stringptr(s string) uintptr { return *(*uintptr)(unsafe.Pointer(&s)) }
21
22 func isfalse(b bool) {
23         if b {
24                 // stack will explain where
25                 panic("wanted false, got true")
26         }
27 }
28
29 func istrue(b bool) {
30         if !b {
31                 // stack will explain where
32                 panic("wanted true, got false")
33         }
34 }
35
36 type T *int
37
38 type X int
39
40 func (X) x() {}
41
42 func main() {
43         var a []int
44         var b map[string]int
45
46         var c string = "hello"
47         var d string = "hel" // try to get different pointer
48         d = d + "lo"
49
50         // go.tools/ssa/interp can't handle unsafe.Pointer.
51         if os.Getenv("GOSSAINTERP") == "" {
52                 if stringptr(c) == stringptr(d) {
53                         panic("compiler too smart -- got same string")
54                 }
55         }
56
57         var e = make(chan int)
58
59         var ia interface{} = a
60         var ib interface{} = b
61         var ic interface{} = c
62         var id interface{} = d
63         var ie interface{} = e
64
65         // these comparisons are okay because
66         // string compare is okay and the others
67         // are comparisons where the types differ.
68         isfalse(ia == ib)
69         isfalse(ia == ic)
70         isfalse(ia == id)
71         isfalse(ib == ic)
72         isfalse(ib == id)
73         istrue(ic == id)
74         istrue(ie == ie)
75
76         istrue(ia != ib)
77         istrue(ia != ic)
78         istrue(ia != id)
79         istrue(ib != ic)
80         istrue(ib != id)
81         isfalse(ic != id)
82         isfalse(ie != ie)
83
84         // these are not okay, because there is no comparison on slices or maps.
85         //isfalse(a == ib)
86         //isfalse(a == ic)
87         //isfalse(a == id)
88         //isfalse(b == ic)
89         //isfalse(b == id)
90
91         istrue(c == id)
92         istrue(e == ie)
93
94         //isfalse(ia == b)
95         isfalse(ia == c)
96         isfalse(ia == d)
97         isfalse(ib == c)
98         isfalse(ib == d)
99         istrue(ic == d)
100         istrue(ie == e)
101
102         //istrue(a != ib)
103         //istrue(a != ic)
104         //istrue(a != id)
105         //istrue(b != ic)
106         //istrue(b != id)
107         isfalse(c != id)
108         isfalse(e != ie)
109
110         //istrue(ia != b)
111         istrue(ia != c)
112         istrue(ia != d)
113         istrue(ib != c)
114         istrue(ib != d)
115         isfalse(ic != d)
116         isfalse(ie != e)
117
118         // gc used to let this go through as true.
119         var g uint64 = 123
120         var h int64 = 123
121         var ig interface{} = g
122         var ih interface{} = h
123         isfalse(ig == ih)
124         istrue(ig != ih)
125
126         // map of interface should use == on interface values,
127         // not memory.
128         var m = make(map[interface{}]int)
129         m[ic] = 1
130         m[id] = 2
131         if m[c] != 2 {
132                 println("m[c] = ", m[c])
133                 panic("bad m[c]")
134         }
135
136         // interface comparisons (issue 7207)
137         {
138                 type I1 interface {
139                         x()
140                 }
141                 type I2 interface {
142                         x()
143                 }
144                 a1 := I1(X(0))
145                 b1 := I1(X(1))
146                 a2 := I2(X(0))
147                 b2 := I2(X(1))
148                 a3 := I1(a2)
149                 a4 := I2(a1)
150                 var e interface{} = X(0)
151                 a5 := e.(I1)
152                 a6 := e.(I2)
153                 isfalse(a1 == b1)
154                 isfalse(a1 == b2)
155                 isfalse(a2 == b1)
156                 isfalse(a2 == b2)
157                 istrue(a1 == a2)
158                 istrue(a1 == a3)
159                 istrue(a1 == a4)
160                 istrue(a1 == a5)
161                 istrue(a1 == a6)
162                 istrue(a2 == a3)
163                 istrue(a2 == a4)
164                 istrue(a2 == a5)
165                 istrue(a2 == a6)
166                 istrue(a3 == a4)
167                 istrue(a3 == a5)
168                 istrue(a3 == a6)
169                 istrue(a4 == a5)
170                 istrue(a4 == a6)
171                 istrue(a5 == a6)
172         }
173
174         // non-interface comparisons
175         {
176                 c := make(chan int)
177                 c1 := (<-chan int)(c)
178                 c2 := (chan<- int)(c)
179                 istrue(c == c1)
180                 istrue(c == c2)
181                 istrue(c1 == c)
182                 istrue(c2 == c)
183
184                 isfalse(c != c1)
185                 isfalse(c != c2)
186                 isfalse(c1 != c)
187                 isfalse(c2 != c)
188
189                 d := make(chan int)
190                 isfalse(c == d)
191                 isfalse(d == c)
192                 isfalse(d == c1)
193                 isfalse(d == c2)
194                 isfalse(c1 == d)
195                 isfalse(c2 == d)
196
197                 istrue(c != d)
198                 istrue(d != c)
199                 istrue(d != c1)
200                 istrue(d != c2)
201                 istrue(c1 != d)
202                 istrue(c2 != d)
203         }
204
205         // named types vs not
206         {
207                 var x = new(int)
208                 var y T
209                 var z T = x
210
211                 isfalse(x == y)
212                 istrue(x == z)
213                 isfalse(y == z)
214
215                 isfalse(y == x)
216                 istrue(z == x)
217                 isfalse(z == y)
218
219                 istrue(x != y)
220                 isfalse(x != z)
221                 istrue(y != z)
222
223                 istrue(y != x)
224                 isfalse(z != x)
225                 istrue(z != y)
226         }
227
228         // structs
229         {
230                 var x = struct {
231                         x int
232                         y string
233                 }{1, "hi"}
234                 var y = struct {
235                         x int
236                         y string
237                 }{2, "bye"}
238                 var z = struct {
239                         x int
240                         y string
241                 }{1, "hi"}
242
243                 isfalse(x == y)
244                 isfalse(y == x)
245                 isfalse(y == z)
246                 isfalse(z == y)
247                 istrue(x == z)
248                 istrue(z == x)
249
250                 istrue(x != y)
251                 istrue(y != x)
252                 istrue(y != z)
253                 istrue(z != y)
254                 isfalse(x != z)
255                 isfalse(z != x)
256
257                 var m = make(map[struct {
258                         x int
259                         y string
260                 }]int)
261                 m[x] = 10
262                 m[y] = 20
263                 m[z] = 30
264                 istrue(m[x] == 30)
265                 istrue(m[y] == 20)
266                 istrue(m[z] == 30)
267                 istrue(m[x] != 10)
268                 isfalse(m[x] != 30)
269                 isfalse(m[y] != 20)
270                 isfalse(m[z] != 30)
271                 isfalse(m[x] == 10)
272
273                 var m1 = make(map[struct {
274                         x int
275                         y string
276                 }]struct {
277                         x int
278                         y string
279                 })
280                 m1[x] = x
281                 m1[y] = y
282                 m1[z] = z
283                 istrue(m1[x] == z)
284                 istrue(m1[y] == y)
285                 istrue(m1[z] == z)
286                 istrue(m1[x] == x)
287                 isfalse(m1[x] != z)
288                 isfalse(m1[y] != y)
289                 isfalse(m1[z] != z)
290                 isfalse(m1[x] != x)
291
292                 var ix, iy, iz interface{} = x, y, z
293
294                 isfalse(ix == iy)
295                 isfalse(iy == ix)
296                 isfalse(iy == iz)
297                 isfalse(iz == iy)
298                 istrue(ix == iz)
299                 istrue(iz == ix)
300
301                 isfalse(x == iy)
302                 isfalse(y == ix)
303                 isfalse(y == iz)
304                 isfalse(z == iy)
305                 istrue(x == iz)
306                 istrue(z == ix)
307
308                 isfalse(ix == y)
309                 isfalse(iy == x)
310                 isfalse(iy == z)
311                 isfalse(iz == y)
312                 istrue(ix == z)
313                 istrue(iz == x)
314
315                 istrue(ix != iy)
316                 istrue(iy != ix)
317                 istrue(iy != iz)
318                 istrue(iz != iy)
319                 isfalse(ix != iz)
320                 isfalse(iz != ix)
321
322                 istrue(x != iy)
323                 istrue(y != ix)
324                 istrue(y != iz)
325                 istrue(z != iy)
326                 isfalse(x != iz)
327                 isfalse(z != ix)
328
329                 istrue(ix != y)
330                 istrue(iy != x)
331                 istrue(iy != z)
332                 istrue(iz != y)
333                 isfalse(ix != z)
334                 isfalse(iz != x)
335         }
336
337         // structs with _ fields
338         {
339                 var x = struct {
340                         x int
341                         _ string
342                         y float64
343                         _ float64
344                         z int
345                 }{
346                         x: 1, y: 2, z: 3,
347                 }
348                 var ix interface{} = x
349
350                 istrue(x == x)
351                 istrue(x == ix)
352                 istrue(ix == x)
353                 istrue(ix == ix)
354         }
355
356         // arrays
357         {
358                 var x = [2]string{"1", "hi"}
359                 var y = [2]string{"2", "bye"}
360                 var z = [2]string{"1", "hi"}
361
362                 isfalse(x == y)
363                 isfalse(y == x)
364                 isfalse(y == z)
365                 isfalse(z == y)
366                 istrue(x == z)
367                 istrue(z == x)
368
369                 istrue(x != y)
370                 istrue(y != x)
371                 istrue(y != z)
372                 istrue(z != y)
373                 isfalse(x != z)
374                 isfalse(z != x)
375
376                 var m = make(map[[2]string]int)
377                 m[x] = 10
378                 m[y] = 20
379                 m[z] = 30
380                 istrue(m[x] == 30)
381                 istrue(m[y] == 20)
382                 istrue(m[z] == 30)
383                 isfalse(m[x] != 30)
384                 isfalse(m[y] != 20)
385                 isfalse(m[z] != 30)
386
387                 var ix, iy, iz interface{} = x, y, z
388
389                 isfalse(ix == iy)
390                 isfalse(iy == ix)
391                 isfalse(iy == iz)
392                 isfalse(iz == iy)
393                 istrue(ix == iz)
394                 istrue(iz == ix)
395
396                 isfalse(x == iy)
397                 isfalse(y == ix)
398                 isfalse(y == iz)
399                 isfalse(z == iy)
400                 istrue(x == iz)
401                 istrue(z == ix)
402
403                 isfalse(ix == y)
404                 isfalse(iy == x)
405                 isfalse(iy == z)
406                 isfalse(iz == y)
407                 istrue(ix == z)
408                 istrue(iz == x)
409
410                 istrue(ix != iy)
411                 istrue(iy != ix)
412                 istrue(iy != iz)
413                 istrue(iz != iy)
414                 isfalse(ix != iz)
415                 isfalse(iz != ix)
416
417                 istrue(x != iy)
418                 istrue(y != ix)
419                 istrue(y != iz)
420                 istrue(z != iy)
421                 isfalse(x != iz)
422                 isfalse(z != ix)
423
424                 istrue(ix != y)
425                 istrue(iy != x)
426                 istrue(iy != z)
427                 istrue(iz != y)
428                 isfalse(ix != z)
429                 isfalse(iz != x)
430         }
431
432         // named booleans
433         {
434                 type mybool bool
435                 var b mybool
436
437                 type T struct{ data [20]byte }
438                 var x, y T
439                 b = x == y
440                 istrue(x == y)
441                 istrue(bool(b))
442
443                 m := make(map[string][10]interface{})
444                 b = m["x"] == m["y"]
445                 istrue(m["x"] == m["y"])
446                 istrue(bool(b))
447         }
448
449         shouldPanic(p1)
450         shouldPanic(p2)
451         shouldPanic(p3)
452         shouldPanic(p4)
453 }
454
455 func p1() {
456         var a []int
457         var ia interface{} = a
458         use(ia == ia)
459 }
460
461 func p2() {
462         var b []int
463         var ib interface{} = b
464         use(ib == ib)
465 }
466
467 func p3() {
468         var a []int
469         var ia interface{} = a
470         var m = make(map[interface{}]int)
471         m[ia] = 1
472 }
473
474 func p4() {
475         var b []int
476         var ib interface{} = b
477         var m = make(map[interface{}]int)
478         m[ib] = 1
479 }
480
481 func shouldPanic(f func()) {
482         defer func() {
483                 if recover() == nil {
484                         panic("function should panic")
485                 }
486         }()
487         f()
488 }