github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/go/analysis/passes/bools/testdata/src/a/a.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // This file contains tests for the bool checker. 6 7 package a 8 9 import "io" 10 11 type T int 12 13 func (t T) Foo() int { return int(t) } 14 15 type FT func() int 16 17 var S []int 18 19 func RatherStupidConditions() { 20 var f, g func() int 21 if f() == 0 || f() == 0 { // OK f might have side effects 22 } 23 var t T 24 _ = t.Foo() == 2 || t.Foo() == 2 // OK Foo might have side effects 25 if v, w := f(), g(); v == w || v == w { // want `redundant or: v == w \|\| v == w` 26 } 27 _ = f == nil || f == nil // want `redundant or: f == nil \|\| f == nil` 28 29 var B byte 30 _ = B == byte(1) || B == byte(1) // want `redundant or: B == byte\(1\) \|\| B == byte\(1\)` 31 _ = t == T(2) || t == T(2) // want `redundant or: t == T\(2\) \|\| t == T\(2\)` 32 _ = FT(f) == nil || FT(f) == nil // want `redundant or: FT\(f\) == nil \|\| FT\(f\) == nil` 33 34 _ = (func() int)(f) == nil || (func() int)(f) == nil // want `redundant or: \(func\(\) int\)\(f\) == nil \|\| \(func\(\) int\)\(f\) == nil` 35 _ = append(S, 3) == nil || append(S, 3) == nil // OK append has side effects 36 37 var namedFuncVar FT 38 _ = namedFuncVar() == namedFuncVar() // OK still func calls 39 40 var c chan int 41 _ = 0 == <-c || 0 == <-c // OK subsequent receives may yield different values 42 for i, j := <-c, <-c; i == j || i == j; i, j = <-c, <-c { // want `redundant or: i == j \|\| i == j` 43 } 44 45 var i, j, k int 46 _ = i+1 == 1 || i+1 == 1 // want `redundant or: i\+1 == 1 \|\| i\+1 == 1` 47 _ = i == 1 || j+1 == i || i == 1 // want `redundant or: i == 1 \|\| i == 1` 48 49 _ = i == 1 || i == 1 || f() == 1 // want `redundant or: i == 1 \|\| i == 1` 50 _ = i == 1 || f() == 1 || i == 1 // OK f may alter i as a side effect 51 _ = f() == 1 || i == 1 || i == 1 // want `redundant or: i == 1 \|\| i == 1` 52 53 // Test partition edge cases 54 _ = f() == 1 || i == 1 || i == 1 || j == 1 // want `redundant or: i == 1 \|\| i == 1` 55 _ = f() == 1 || j == 1 || i == 1 || i == 1 // want `redundant or: i == 1 \|\| i == 1` 56 _ = i == 1 || f() == 1 || i == 1 || i == 1 // want `redundant or: i == 1 \|\| i == 1` 57 _ = i == 1 || i == 1 || f() == 1 || i == 1 // want `redundant or: i == 1 \|\| i == 1` 58 _ = i == 1 || i == 1 || j == 1 || f() == 1 // want `redundant or: i == 1 \|\| i == 1` 59 _ = j == 1 || i == 1 || i == 1 || f() == 1 // want `redundant or: i == 1 \|\| i == 1` 60 _ = i == 1 || f() == 1 || f() == 1 || i == 1 61 62 _ = i == 1 || (i == 1 || i == 2) // want `redundant or: i == 1 \|\| i == 1` 63 _ = i == 1 || (f() == 1 || i == 1) // OK f may alter i as a side effect 64 _ = i == 1 || (i == 1 || f() == 1) // want `redundant or: i == 1 \|\| i == 1` 65 _ = i == 1 || (i == 2 || (i == 1 || i == 3)) // want `redundant or: i == 1 \|\| i == 1` 66 67 var a, b bool 68 _ = i == 1 || (a || (i == 1 || b)) // want `redundant or: i == 1 \|\| i == 1` 69 70 // Check that all redundant ors are flagged 71 _ = j == 0 || 72 i == 1 || 73 f() == 1 || 74 j == 0 || // want `redundant or: j == 0 \|\| j == 0` 75 i == 1 || // want `redundant or: i == 1 \|\| i == 1` 76 i == 1 || // want `redundant or: i == 1 \|\| i == 1` 77 i == 1 || 78 j == 0 || 79 k == 0 80 81 _ = i == 1*2*3 || i == 1*2*3 // want `redundant or: i == 1\*2\*3 \|\| i == 1\*2\*3` 82 83 // These test that redundant, suspect expressions do not trigger multiple errors. 84 _ = i != 0 || i != 0 // want `redundant or: i != 0 \|\| i != 0` 85 _ = i == 0 && i == 0 // want `redundant and: i == 0 && i == 0` 86 87 // and is dual to or; check the basics and 88 // let the or tests pull the rest of the weight. 89 _ = 0 != <-c && 0 != <-c // OK subsequent receives may yield different values 90 _ = f() != 0 && f() != 0 // OK f might have side effects 91 _ = f != nil && f != nil // want `redundant and: f != nil && f != nil` 92 _ = i != 1 && i != 1 && f() != 1 // want `redundant and: i != 1 && i != 1` 93 _ = i != 1 && f() != 1 && i != 1 // OK f may alter i as a side effect 94 _ = f() != 1 && i != 1 && i != 1 // want `redundant and: i != 1 && i != 1` 95 } 96 97 func RoyallySuspectConditions() { 98 var i, j int 99 100 _ = i == 0 || i == 1 // OK 101 _ = i != 0 || i != 1 // want `suspect or: i != 0 \|\| i != 1` 102 _ = i != 0 || 1 != i // want `suspect or: i != 0 \|\| 1 != i` 103 _ = 0 != i || 1 != i // want `suspect or: 0 != i \|\| 1 != i` 104 _ = 0 != i || i != 1 // want `suspect or: 0 != i \|\| i != 1` 105 106 _ = (0 != i) || i != 1 // want `suspect or: 0 != i \|\| i != 1` 107 108 _ = i+3 != 7 || j+5 == 0 || i+3 != 9 // want `suspect or: i\+3 != 7 \|\| i\+3 != 9` 109 110 _ = i != 0 || j == 0 || i != 1 // want `suspect or: i != 0 \|\| i != 1` 111 112 _ = i != 0 || i != 1<<4 // want `suspect or: i != 0 \|\| i != 1<<4` 113 114 _ = i != 0 || j != 0 115 _ = 0 != i || 0 != j 116 117 var s string 118 _ = s != "one" || s != "the other" // want `suspect or: s != .one. \|\| s != .the other.` 119 120 _ = "et" != "alii" || "et" != "cetera" // want `suspect or: .et. != .alii. \|\| .et. != .cetera.` 121 _ = "me gustas" != "tu" || "le gustas" != "tu" // OK we could catch this case, but it's not worth the code 122 123 var err error 124 _ = err != nil || err != io.EOF // TODO catch this case? 125 126 // Sanity check and. 127 _ = i != 0 && i != 1 // OK 128 _ = i == 0 && i == 1 // want `suspect and: i == 0 && i == 1` 129 _ = i == 0 && 1 == i // want `suspect and: i == 0 && 1 == i` 130 _ = 0 == i && 1 == i // want `suspect and: 0 == i && 1 == i` 131 _ = 0 == i && i == 1 // want `suspect and: 0 == i && i == 1` 132 }