| // Copyright 2014 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. |
| |
| // This file contains tests for the bool checker. |
| |
| package typeparams |
| |
| type T[P interface{ ~int }] struct { |
| a P |
| } |
| |
| func (t T[P]) Foo() int { return int(t.a) } |
| |
| type FT[P any] func() P |
| |
| func Sink[Elem any]() chan Elem { |
| return make(chan Elem) |
| } |
| |
| func RedundantConditions[P interface{ int }]() { |
| type _f[P1 any] func() P1 |
| |
| var f, g _f[P] |
| if f() == 0 || f() == 0 { // OK f might have side effects |
| } |
| var t T[P] |
| _ = t.Foo() == 2 || t.Foo() == 2 // OK Foo might have side effects |
| if v, w := f(), g(); v == w || v == w { // want `redundant or: v == w \|\| v == w` |
| } |
| |
| // error messages present type params correctly. |
| _ = t == T[P]{2} || t == T[P]{2} // want `redundant or: t == T\[P\]\{2\} \|\| t == T\[P\]\{2\}` |
| _ = FT[P](f) == nil || FT[P](f) == nil // want `redundant or: FT\[P\]\(f\) == nil \|\| FT\[P\]\(f\) == nil` |
| _ = (func() P)(f) == nil || (func() P)(f) == nil // want `redundant or: \(func\(\) P\)\(f\) == nil \|\| \(func\(\) P\)\(f\) == nil` |
| |
| var tint T[int] |
| var fint _f[int] |
| _ = tint == T[int]{2} || tint == T[int]{2} // want `redundant or: tint == T\[int\]\{2\} \|\| tint\ == T\[int\]\{2\}` |
| _ = FT[int](fint) == nil || FT[int](fint) == nil // want `redundant or: FT\[int\]\(fint\) == nil \|\| FT\[int\]\(fint\) == nil` |
| _ = (func() int)(fint) == nil || (func() int)(fint) == nil // want `redundant or: \(func\(\) int\)\(fint\) == nil \|\| \(func\(\) int\)\(fint\) == nil` |
| |
| c := Sink[P]() |
| _ = 0 == <-c || 0 == <-c // OK subsequent receives may yield different values |
| for i, j := <-c, <-c; i == j || i == j; i, j = <-c, <-c { // want `redundant or: i == j \|\| i == j` |
| } |
| |
| var i, j P |
| _ = i == 1 || j+1 == i || i == 1 // want `redundant or: i == 1 \|\| i == 1` |
| _ = i == 1 || f() == 1 || i == 1 // OK f may alter i as a side effect |
| _ = f() == 1 || i == 1 || i == 1 // want `redundant or: i == 1 \|\| i == 1` |
| } |
| |
| func SuspectConditions[P interface{ ~int }, S interface{ ~string }]() { |
| var i, j P |
| _ = i == 0 || i == 1 // OK |
| _ = i+3 != 7 || j+5 == 0 || i+3 != 9 // want `suspect or: i\+3 != 7 \|\| i\+3 != 9` |
| |
| var s S |
| _ = s != "one" || s != "the other" // want `suspect or: s != .one. \|\| s != .the other.` |
| } |