mirror of
https://github.com/golang/go
synced 2024-11-24 05:50:13 -07:00
ef5964dd6b
Ending typecheck1 in the switch makes it safe for each case to do an appropriate type assertion. The main change is dropping the computation of "ok" and using the syntax nodes themselves to decide what's OK. Passes buildall w/ toolstash -cmp. Change-Id: I2a1873a51e3f1194d74bb87a6653cb9857a02a1b Reviewed-on: https://go-review.googlesource.com/c/go/+/275444 Trust: Russ Cox <rsc@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
144 lines
6.5 KiB
Go
144 lines
6.5 KiB
Go
// errorcheck
|
|
|
|
// Copyright 2020 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.
|
|
|
|
package p
|
|
|
|
import "unsafe"
|
|
|
|
const C = 1
|
|
|
|
var x, x1, x2 int
|
|
var b bool
|
|
var s string
|
|
var c chan int
|
|
var cp complex128
|
|
var slice []int
|
|
var array [2]int
|
|
var bytes []byte
|
|
var runes []rune
|
|
var r rune
|
|
|
|
func f0() {}
|
|
func f1() int { return 1 }
|
|
func f2() (int, int) { return 1, 1 }
|
|
|
|
type T struct{ X int }
|
|
|
|
func (T) M1() int { return 1 }
|
|
func (T) M0() {}
|
|
func (T) M() {}
|
|
|
|
var t T
|
|
var tp *T
|
|
|
|
type I interface{ M() }
|
|
|
|
var i I
|
|
|
|
var m map[int]int
|
|
|
|
func _() {
|
|
// Note: if the next line changes to x, the error silences the x+x etc below!
|
|
x1 // ERROR "x1 evaluated but not used"
|
|
|
|
nil // ERROR "nil evaluated but not used"
|
|
C // ERROR "C evaluated but not used"
|
|
1 // ERROR "1 evaluated but not used"
|
|
x + x // ERROR "x \+ x evaluated but not used"
|
|
x - x // ERROR "x - x evaluated but not used"
|
|
x | x // ERROR "x \| x evaluated but not used"
|
|
"a" + s // ERROR ".a. \+ s evaluated but not used"
|
|
&x // ERROR "&x evaluated but not used"
|
|
b && b // ERROR "b && b evaluated but not used"
|
|
append(slice, 1) // ERROR "append\(slice, 1\) evaluated but not used"
|
|
string(bytes) // ERROR "string\(bytes\) evaluated but not used"
|
|
string(runes) // ERROR "string\(runes\) evaluated but not used"
|
|
f0() // ok
|
|
f1() // ok
|
|
f2() // ok
|
|
_ = f0() // ERROR "f0\(\) used as value"
|
|
_ = f1() // ok
|
|
_, _ = f2() // ok
|
|
_ = f2() // ERROR "assignment mismatch: 1 variable but f2 returns 2 values"
|
|
T.M0 // ERROR "T.M0 evaluated but not used"
|
|
t.M0 // ERROR "t.M0 evaluated but not used"
|
|
cap // ERROR "use of builtin cap not in function call"
|
|
cap(slice) // ERROR "cap\(slice\) evaluated but not used"
|
|
close(c) // ok
|
|
_ = close(c) // ERROR "close\(c\) used as value"
|
|
func() {} // ERROR "func literal evaluated but not used"
|
|
X{} // ERROR "undefined: X"
|
|
map[string]int{} // ERROR "map\[string\]int{} evaluated but not used"
|
|
struct{}{} // ERROR "struct ?{}{} evaluated but not used"
|
|
[1]int{} // ERROR "\[1\]int{} evaluated but not used"
|
|
[]int{} // ERROR "\[\]int{} evaluated but not used"
|
|
&struct{}{} // ERROR "&struct ?{}{} evaluated but not used"
|
|
float32(x) // ERROR "float32\(x\) evaluated but not used"
|
|
I(t) // ERROR "I\(t\) evaluated but not used"
|
|
int(x) // ERROR "int\(x\) evaluated but not used"
|
|
copy(slice, slice) // ok
|
|
_ = copy(slice, slice) // ok
|
|
delete(m, 1) // ok
|
|
_ = delete(m, 1) // ERROR "delete\(m, 1\) used as value"
|
|
t.X // ERROR "t.X evaluated but not used"
|
|
tp.X // ERROR "tp.X evaluated but not used"
|
|
t.M // ERROR "t.M evaluated but not used"
|
|
I.M // ERROR "I.M evaluated but not used"
|
|
i.(T) // ERROR "i.\(T\) evaluated but not used"
|
|
x == x // ERROR "x == x evaluated but not used"
|
|
x != x // ERROR "x != x evaluated but not used"
|
|
x != x // ERROR "x != x evaluated but not used"
|
|
x < x // ERROR "x < x evaluated but not used"
|
|
x >= x // ERROR "x >= x evaluated but not used"
|
|
x > x // ERROR "x > x evaluated but not used"
|
|
*tp // ERROR "\*tp evaluated but not used"
|
|
slice[0] // ERROR "slice\[0\] evaluated but not used"
|
|
m[1] // ERROR "m\[1\] evaluated but not used"
|
|
len(slice) // ERROR "len\(slice\) evaluated but not used"
|
|
make(chan int) // ERROR "make\(chan int\) evaluated but not used"
|
|
make(map[int]int) // ERROR "make\(map\[int\]int\) evaluated but not used"
|
|
make([]int, 1) // ERROR "make\(\[\]int, 1\) evaluated but not used"
|
|
x * x // ERROR "x \* x evaluated but not used"
|
|
x / x // ERROR "x / x evaluated but not used"
|
|
x % x // ERROR "x % x evaluated but not used"
|
|
x << x // ERROR "x << x evaluated but not used"
|
|
x >> x // ERROR "x >> x evaluated but not used"
|
|
x & x // ERROR "x & x evaluated but not used"
|
|
x &^ x // ERROR "x &\^ x evaluated but not used"
|
|
new(int) // ERROR "new\(int\) evaluated but not used"
|
|
!b // ERROR "!b evaluated but not used"
|
|
^x // ERROR "\^x evaluated but not used"
|
|
+x // ERROR "\+x evaluated but not used"
|
|
-x // ERROR "-x evaluated but not used"
|
|
b || b // ERROR "b \|\| b evaluated but not used"
|
|
panic(1) // ok
|
|
_ = panic(1) // ERROR "panic\(1\) used as value"
|
|
print(1) // ok
|
|
_ = print(1) // ERROR "print\(1\) used as value"
|
|
println(1) // ok
|
|
_ = println(1) // ERROR "println\(1\) used as value"
|
|
c <- 1 // ok
|
|
slice[1:1] // ERROR "slice\[1:1\] evaluated but not used"
|
|
array[1:1] // ERROR "array\[1:1\] evaluated but not used"
|
|
s[1:1] // ERROR "s\[1:1\] evaluated but not used"
|
|
slice[1:1:1] // ERROR "slice\[1:1:1\] evaluated but not used"
|
|
array[1:1:1] // ERROR "array\[1:1:1\] evaluated but not used"
|
|
recover() // ok
|
|
<-c // ok
|
|
string(r) // ERROR "string\(r\) evaluated but not used"
|
|
iota // ERROR "undefined: iota"
|
|
real(cp) // ERROR "real\(cp\) evaluated but not used"
|
|
imag(cp) // ERROR "imag\(cp\) evaluated but not used"
|
|
complex(1, 2) // ERROR "complex\(1, 2\) evaluated but not used"
|
|
unsafe.Alignof(t.X) // ERROR "unsafe.Alignof\(t.X\) evaluated but not used"
|
|
unsafe.Offsetof(t.X) // ERROR "unsafe.Offsetof\(t.X\) evaluated but not used"
|
|
unsafe.Sizeof(t) // ERROR "unsafe.Sizeof\(t\) evaluated but not used"
|
|
_ = int // ERROR "type int is not an expression"
|
|
(x) // ERROR "x evaluated but not used"
|
|
_ = new(x2) // ERROR "x2 is not a type"
|
|
_ = new(1 + 1) // ERROR "1 \+ 1 is not a type"
|
|
}
|