mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
test: re-enable most go/tests that were disabled because of types2 differences
I made the default be that, where there are differences between types2 and -G=0 error messages, we want errorcheck tests to pass types2. Typically, we can get errorcheck to pass on types2 and -G=0 if they give the same number of error messages on the same lines, just different wording. If they give a different number of error messages, then I made types2 pass. I added an exception list for -G=0 to cover those cases where -G=0 and types give different numbers of error messages. Because types2 does not run if there are syntax errors, for several tests, I had to split the tests into two parts in order to get all the indicated errors to be reported in types2 (bug228.go, bug388.go, issue11610.go, issue14520.go) I tried to preserve the GCCGO labeling correctly (but may have gotten some wrong). When types2 now matches where a GCCGO error previously occurred, I transformed GCCGO_ERROR -> ERROR. When types2 no longer reports an error in a certain place, I transformed ERROR -> GCCGO_ERROR. When types2 reports an error in a new place, I used GC_ERROR. The remaining entries in types2Failures are things that I think we probably still need to fix - either actually missing errors in types2, or cases where types2 gives worse errors than -G=0. Change-Id: I7f01e82b322b16094096b67d7ed2bb39b410c34f Reviewed-on: https://go-review.googlesource.com/c/go/+/372854 Trust: Dan Scales <danscales@google.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
4ceb5a94d8
commit
90a8482a17
@ -9,6 +9,5 @@ package main
|
|||||||
var x int
|
var x int
|
||||||
|
|
||||||
var a = []int{x: 1} // ERROR "constant"
|
var a = []int{x: 1} // ERROR "constant"
|
||||||
var b = [...]int{x: 1} // GCCGO_ERROR "constant"
|
var b = [...]int{x: 1} // ERROR "constant"
|
||||||
var c = map[int]int{x: 1}
|
var c = map[int]int{x: 1}
|
||||||
|
|
||||||
|
@ -11,14 +11,14 @@ type I2 int
|
|||||||
|
|
||||||
type I3 interface{ int } // ERROR "interface"
|
type I3 interface{ int } // ERROR "interface"
|
||||||
|
|
||||||
type S struct {
|
type S struct { // GC_ERROR "invalid recursive type"
|
||||||
x interface{ S } // ERROR "interface"
|
x interface{ S } // GCCGO_ERROR "interface"
|
||||||
}
|
}
|
||||||
type I4 interface { // GC_ERROR "invalid recursive type I4\n\tLINE: I4 refers to\n\tLINE: I4$"
|
type I4 interface { // GC_ERROR "invalid recursive type I4\n\tLINE:.* I4 refers to\n\tLINE:.* I4$"
|
||||||
I4 // GCCGO_ERROR "interface"
|
I4 // GCCGO_ERROR "interface"
|
||||||
}
|
}
|
||||||
|
|
||||||
type I5 interface { // GC_ERROR "invalid recursive type I5\n\tLINE: I5 refers to\n\tLINE+4: I6 refers to\n\tLINE: I5$"
|
type I5 interface { // GC_ERROR "invalid recursive type I5\n\tLINE:.* I5 refers to\n\tLINE+4:.* I6 refers to\n\tLINE:.* I5$"
|
||||||
I6
|
I6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,10 +10,6 @@ func f(x int, y ...int) // ok
|
|||||||
|
|
||||||
func g(x int, y float32) (...) // ERROR "[.][.][.]"
|
func g(x int, y float32) (...) // ERROR "[.][.][.]"
|
||||||
|
|
||||||
func h(x, y ...int) // ERROR "[.][.][.]"
|
|
||||||
|
|
||||||
func i(x int, y ...int, z float32) // ERROR "[.][.][.]"
|
|
||||||
|
|
||||||
var x ...int; // ERROR "[.][.][.]|syntax|type"
|
var x ...int; // ERROR "[.][.][.]|syntax|type"
|
||||||
|
|
||||||
type T ...int; // ERROR "[.][.][.]|syntax|type"
|
type T ...int; // ERROR "[.][.][.]|syntax|type"
|
||||||
|
13
test/fixedbugs/bug228a.go
Normal file
13
test/fixedbugs/bug228a.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// errorcheck
|
||||||
|
|
||||||
|
// Copyright 2009 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 main
|
||||||
|
|
||||||
|
func f(x int, y ...int) // ok
|
||||||
|
|
||||||
|
func h(x, y ...int) // ERROR "[.][.][.]"
|
||||||
|
|
||||||
|
func i(x int, y ...int, z float32) // ERROR "[.][.][.]"
|
@ -9,6 +9,7 @@ package main
|
|||||||
type I interface{ m() }
|
type I interface{ m() }
|
||||||
type T struct{ m func() }
|
type T struct{ m func() }
|
||||||
type M struct{}
|
type M struct{}
|
||||||
|
|
||||||
func (M) m() {}
|
func (M) m() {}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -17,6 +18,7 @@ func main() {
|
|||||||
var i I
|
var i I
|
||||||
|
|
||||||
i = m
|
i = m
|
||||||
i = t // ERROR "not a method|has no methods" "does not implement I"
|
// types2 does not give extra error "T.m is a field, not a method"
|
||||||
|
i = t // ERROR "not a method|has no methods|does not implement I"
|
||||||
_ = i
|
_ = i
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,13 @@ package main
|
|||||||
|
|
||||||
var a [10]int // ok
|
var a [10]int // ok
|
||||||
var b [1e1]int // ok
|
var b [1e1]int // ok
|
||||||
var c [1.5]int // ERROR "truncated"
|
var c [1.5]int // ERROR "truncated|must be integer"
|
||||||
var d ["abc"]int // ERROR "invalid array bound|not numeric"
|
var d ["abc"]int // ERROR "invalid array bound|not numeric|must be integer"
|
||||||
var e [nil]int // ERROR "use of untyped nil|invalid array bound|not numeric"
|
var e [nil]int // ERROR "use of untyped nil|invalid array bound|not numeric|must be constant"
|
||||||
var f [e]int // ok: error already reported for e
|
var f [e]int // ok: error already reported for e
|
||||||
var g [1 << 65]int // ERROR "array bound is too large|overflows"
|
var g [1 << 65]int // ERROR "array bound is too large|overflows|must be integer"
|
||||||
var h [len(a)]int // ok
|
var h [len(a)]int // ok
|
||||||
|
|
||||||
func ff() string
|
func ff() string
|
||||||
|
|
||||||
var i [len([1]string{ff()})]int // ERROR "non-constant array bound|not constant"
|
var i [len([1]string{ff()})]int // ERROR "non-constant array bound|not constant|must be constant"
|
||||||
|
@ -13,16 +13,6 @@ func foo(runtime.UintType, i int) { // ERROR "cannot declare name runtime.UintT
|
|||||||
println(i, runtime.UintType) // GCCGO_ERROR "undefined identifier"
|
println(i, runtime.UintType) // GCCGO_ERROR "undefined identifier"
|
||||||
}
|
}
|
||||||
|
|
||||||
func bar(i int) {
|
|
||||||
runtime.UintType := i // ERROR "non-name runtime.UintType|non-name on left side|undefined identifier"
|
|
||||||
println(runtime.UintType) // GCCGO_ERROR "invalid use of type|undefined identifier"
|
|
||||||
}
|
|
||||||
|
|
||||||
func baz() {
|
|
||||||
main.i := 1 // ERROR "non-name main.i|non-name on left side"
|
|
||||||
println(main.i) // GCCGO_ERROR "no fields or methods"
|
|
||||||
}
|
|
||||||
|
|
||||||
func qux() {
|
func qux() {
|
||||||
var main.i // ERROR "unexpected [.]|expected type"
|
var main.i // ERROR "unexpected [.]|expected type"
|
||||||
println(main.i)
|
println(main.i)
|
||||||
|
23
test/fixedbugs/bug388a.go
Normal file
23
test/fixedbugs/bug388a.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// errorcheck
|
||||||
|
|
||||||
|
// Copyright 2011 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.
|
||||||
|
|
||||||
|
// Issue 2231
|
||||||
|
|
||||||
|
package main
|
||||||
|
import "runtime"
|
||||||
|
|
||||||
|
func bar(i int) {
|
||||||
|
runtime.UintType := i // ERROR "non-name runtime.UintType|non-name on left side|undefined"
|
||||||
|
println(runtime.UintType) // ERROR "invalid use of type|undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
func baz() {
|
||||||
|
main.i := 1 // ERROR "non-name main.i|non-name on left side|undefined"
|
||||||
|
println(main.i) // ERROR "no fields or methods|undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
}
|
@ -8,9 +8,9 @@ package p
|
|||||||
|
|
||||||
type t struct {
|
type t struct {
|
||||||
x int // GCCGO_ERROR "duplicate field name .x."
|
x int // GCCGO_ERROR "duplicate field name .x."
|
||||||
x int // GC_ERROR "duplicate field x"
|
x int // GC_ERROR "duplicate field x|x redeclared"
|
||||||
}
|
}
|
||||||
|
|
||||||
func f(t *t) int {
|
func f(t *t) int {
|
||||||
return t.x // GC_ERROR "ambiguous selector t.x"
|
return t.x
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,6 @@
|
|||||||
|
|
||||||
package p
|
package p
|
||||||
|
|
||||||
var _ = int8(4) * 300 // ERROR "constant 300 overflows int8" "constant 1200 overflows int8|integer constant overflow"
|
var _ = int8(4) * 300 // ERROR "overflows int8"
|
||||||
var _ = complex64(1) * 1e200 // ERROR "constant 1e\+200 overflows complex64|complex real part overflow"
|
var _ = complex64(1) * 1e200 // ERROR "complex real part overflow|overflows complex64"
|
||||||
var _ = complex128(1) * 1e500 // ERROR "constant 1e\+500 overflows complex128|complex real part overflow"
|
var _ = complex128(1) * 1e500 // ERROR "complex real part overflow|overflows complex128"
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
// following an empty import.
|
// following an empty import.
|
||||||
|
|
||||||
package a
|
package a
|
||||||
import"" // ERROR "import path is empty"
|
|
||||||
var? // ERROR "invalid character U\+003F '\?'|invalid character 0x3f in input file"
|
var? // ERROR "invalid character U\+003F '\?'|invalid character 0x3f in input file"
|
||||||
|
|
||||||
var x int // ERROR "unexpected var|expected identifier|expected type"
|
var x int // ERROR "unexpected var|expected identifier|expected type"
|
||||||
|
11
test/fixedbugs/issue11610a.go
Normal file
11
test/fixedbugs/issue11610a.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// errorcheck
|
||||||
|
|
||||||
|
// Copyright 2015 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.
|
||||||
|
|
||||||
|
// Test an internal compiler error on ? symbol in declaration
|
||||||
|
// following an empty import.
|
||||||
|
|
||||||
|
package a
|
||||||
|
import"" // ERROR "import path is empty|invalid import path \(empty string\)"
|
@ -11,15 +11,15 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
type I interface {
|
type I interface {
|
||||||
int // ERROR "interface contains embedded non-interface"
|
int // ERROR "interface contains embedded non-interface|embedding non-interface type int requires"
|
||||||
}
|
}
|
||||||
|
|
||||||
func n() {
|
func n() {
|
||||||
(I)
|
(I) // GC_ERROR "is not an expression"
|
||||||
}
|
}
|
||||||
|
|
||||||
func m() {
|
func m() {
|
||||||
(interface{int}) // ERROR "interface contains embedded non-interface" "type interface { int } is not an expression"
|
(interface{int}) // ERROR "interface contains embedded non-interface|embedding non-interface type int requires" "type interface { int } is not an expression|\(interface{int}\) \(type\) is not an expression"
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -6,9 +6,6 @@
|
|||||||
|
|
||||||
package f
|
package f
|
||||||
|
|
||||||
import /* // ERROR "import path" */ `
|
|
||||||
bogus`
|
|
||||||
|
|
||||||
func f(x int /* // GC_ERROR "unexpected newline"
|
func f(x int /* // GC_ERROR "unexpected newline"
|
||||||
|
|
||||||
*/) // GCCGO_ERROR "expected .*\).*|expected declaration"
|
*/) // GCCGO_ERROR "expected .*\).*|expected declaration"
|
||||||
|
10
test/fixedbugs/issue14520a.go
Normal file
10
test/fixedbugs/issue14520a.go
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// errorcheck
|
||||||
|
|
||||||
|
// Copyright 2016 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 f
|
||||||
|
|
||||||
|
import /* // ERROR "import path" */ `
|
||||||
|
bogus`
|
@ -6,4 +6,4 @@
|
|||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
const A = complex(0()) // ERROR "cannot call non-function" "not enough arguments"
|
const A = complex(0()) // ERROR "cannot call non-function"
|
||||||
|
@ -13,9 +13,9 @@ package main
|
|||||||
|
|
||||||
func f(x int, y uint) {
|
func f(x int, y uint) {
|
||||||
if true {
|
if true {
|
||||||
return "a" > 10 // ERROR "^too many arguments to return$|return with value in function with no return|mismatched types"
|
return "a" > 10 // ERROR "^too many arguments to return$|return with value in function with no return|no result values expected|mismatched types"
|
||||||
}
|
}
|
||||||
return "gopher" == true, 10 // ERROR "^too many arguments to return$|return with value in function with no return|mismatched types"
|
return "gopher" == true, 10 // ERROR "^too many arguments to return$|return with value in function with no return|no result values expected|mismatched types"
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -7,39 +7,40 @@
|
|||||||
package p
|
package p
|
||||||
|
|
||||||
func f() {
|
func f() {
|
||||||
_ = bool("") // ERROR "cannot convert .. \(type untyped string\) to type bool|invalid type conversion"
|
_ = bool("") // ERROR "cannot convert .. \(.*untyped string.*\) to type bool|invalid type conversion"
|
||||||
_ = bool(1) // ERROR "cannot convert 1 \(type untyped int\) to type bool|invalid type conversion"
|
_ = bool(1) // ERROR "cannot convert 1 \(.*untyped int.*\) to type bool|invalid type conversion"
|
||||||
_ = bool(1.0) // ERROR "cannot convert 1 \(type untyped float\) to type bool|invalid type conversion"
|
_ = bool(1.0) // ERROR "cannot convert 1.* \(.*untyped float.*\) to type bool|invalid type conversion"
|
||||||
_ = bool(-4 + 2i) // ERROR "cannot convert -4 \+ 2i \(type untyped complex\) to type bool|invalid type conversion"
|
_ = bool(-4 + 2i) // ERROR "cannot convert -4 \+ 2i \(.*untyped complex.*\) to type bool|invalid type conversion"
|
||||||
|
|
||||||
_ = string(true) // ERROR "cannot convert true \(type untyped bool\) to type string|invalid type conversion"
|
_ = string(true) // ERROR "cannot convert true \(.*untyped bool.*\) to type string|invalid type conversion"
|
||||||
_ = string(-1)
|
_ = string(-1)
|
||||||
_ = string(1.0) // ERROR "cannot convert 1 \(type untyped float\) to type string|invalid type conversion"
|
_ = string(1.0) // ERROR "cannot convert 1.* \(.*untyped float.*\) to type string|invalid type conversion"
|
||||||
_ = string(-4 + 2i) // ERROR "cannot convert -4 \+ 2i \(type untyped complex\) to type string|invalid type conversion"
|
_ = string(-4 + 2i) // ERROR "cannot convert -4 \+ 2i \(.*untyped complex.*\) to type string|invalid type conversion"
|
||||||
|
|
||||||
_ = int("") // ERROR "cannot convert .. \(type untyped string\) to type int|invalid type conversion"
|
_ = int("") // ERROR "cannot convert .. \(.*untyped string.*\) to type int|invalid type conversion"
|
||||||
_ = int(true) // ERROR "cannot convert true \(type untyped bool\) to type int|invalid type conversion"
|
_ = int(true) // ERROR "cannot convert true \(.*untyped bool.*\) to type int|invalid type conversion"
|
||||||
_ = int(-1)
|
_ = int(-1)
|
||||||
_ = int(1)
|
_ = int(1)
|
||||||
_ = int(1.0)
|
_ = int(1.0)
|
||||||
_ = int(-4 + 2i) // ERROR "truncated to integer"
|
_ = int(-4 + 2i) // ERROR "truncated to integer|cannot convert -4 \+ 2i \(.*untyped complex.*\) to type int"
|
||||||
|
|
||||||
_ = uint("") // ERROR "cannot convert .. \(type untyped string\) to type uint|invalid type conversion"
|
_ = uint("") // ERROR "cannot convert .. \(.*untyped string.*\) to type uint|invalid type conversion"
|
||||||
_ = uint(true) // ERROR "cannot convert true \(type untyped bool\) to type uint|invalid type conversion"
|
_ = uint(true) // ERROR "cannot convert true \(.*untyped bool.*\) to type uint|invalid type conversion"
|
||||||
_ = uint(-1) // ERROR "constant -1 overflows uint|integer constant overflow"
|
_ = uint(-1) // ERROR "constant -1 overflows uint|integer constant overflow|cannot convert -1 \(untyped int constant\) to type uint"
|
||||||
_ = uint(1)
|
_ = uint(1)
|
||||||
_ = uint(1.0)
|
_ = uint(1.0)
|
||||||
_ = uint(-4 + 2i) // ERROR "constant -4 overflows uint" "truncated to integer"
|
// types1 reports extra error "truncated to integer"
|
||||||
|
_ = uint(-4 + 2i) // ERROR "constant -4 overflows uint|truncated to integer|cannot convert -4 \+ 2i \(untyped complex constant.*\) to type uint"
|
||||||
|
|
||||||
_ = float64("") // ERROR "cannot convert .. \(type untyped string\) to type float64|invalid type conversion"
|
_ = float64("") // ERROR "cannot convert .. \(.*untyped string.*\) to type float64|invalid type conversion"
|
||||||
_ = float64(true) // ERROR "cannot convert true \(type untyped bool\) to type float64|invalid type conversion"
|
_ = float64(true) // ERROR "cannot convert true \(.*untyped bool.*\) to type float64|invalid type conversion"
|
||||||
_ = float64(-1)
|
_ = float64(-1)
|
||||||
_ = float64(1)
|
_ = float64(1)
|
||||||
_ = float64(1.0)
|
_ = float64(1.0)
|
||||||
_ = float64(-4 + 2i) // ERROR "truncated to"
|
_ = float64(-4 + 2i) // ERROR "truncated to|cannot convert -4 \+ 2i \(.*untyped complex.*\) to type float64"
|
||||||
|
|
||||||
_ = complex128("") // ERROR "cannot convert .. \(type untyped string\) to type complex128|invalid type conversion"
|
_ = complex128("") // ERROR "cannot convert .. \(.*untyped string.*\) to type complex128|invalid type conversion"
|
||||||
_ = complex128(true) // ERROR "cannot convert true \(type untyped bool\) to type complex128|invalid type conversion"
|
_ = complex128(true) // ERROR "cannot convert true \(.*untyped bool.*\) to type complex128|invalid type conversion"
|
||||||
_ = complex128(-1)
|
_ = complex128(-1)
|
||||||
_ = complex128(1)
|
_ = complex128(1)
|
||||||
_ = complex128(1.0)
|
_ = complex128(1.0)
|
||||||
|
@ -24,19 +24,19 @@ func main() {
|
|||||||
_ = Foo{ // GCCGO_ERROR "too few expressions"
|
_ = Foo{ // GCCGO_ERROR "too few expressions"
|
||||||
1,
|
1,
|
||||||
2,
|
2,
|
||||||
3, // GC_ERROR "too few values in Foo{...}"
|
3,
|
||||||
}
|
} // GC_ERROR "too few values in"
|
||||||
|
|
||||||
_ = Foo{
|
_ = Foo{
|
||||||
1,
|
1,
|
||||||
2,
|
2,
|
||||||
3,
|
3,
|
||||||
Bar{"A", "B"}, // ERROR "too many values in Bar{...}|too many expressions"
|
Bar{"A", "B"}, // ERROR "too many values in|too many expressions"
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = Foo{ // GCCGO_ERROR "too few expressions"
|
_ = Foo{ // GCCGO_ERROR "too few expressions"
|
||||||
1,
|
1,
|
||||||
2,
|
2,
|
||||||
Bar{"A", "B"}, // ERROR "too many values in Bar{...}|too many expressions" "too few values in Foo{...}"
|
Bar{"A", "B"}, // ERROR "too many values in|too many expressions"
|
||||||
}
|
} // GC_ERROR "too few values in"
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ package p
|
|||||||
|
|
||||||
func f(done chan struct{}) {
|
func f(done chan struct{}) {
|
||||||
select {
|
select {
|
||||||
case done: // ERROR "must be receive|expected .*<-.* or .*=" "not used"
|
case done: // ERROR "must be receive|expected .*<-.* or .*=|must be send or receive|not used"
|
||||||
case (chan struct{})(done): // ERROR "must be receive|expected .*<-.* or .*="
|
case (chan struct{})(done): // ERROR "must be receive|expected .*<-.* or .*=|must be send or receive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,8 @@ package p
|
|||||||
|
|
||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
type T [uintptr(unsafe.Pointer(nil))]int // ERROR "non-constant array bound|array bound is not constant"
|
type T [uintptr(unsafe.Pointer(nil))]int // ERROR "non-constant array bound|array bound is not constant|must be constant"
|
||||||
|
|
||||||
func f() {
|
func f() {
|
||||||
_ = complex(1<<uintptr(unsafe.Pointer(nil)), 0) // ERROR "shift of type float64|non-integer type for left operand of shift"
|
_ = complex(1<<uintptr(unsafe.Pointer(nil)), 0) // ERROR "shift of type float64|non-integer type for left operand of shift|must be integer"
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,8 @@ type T struct {
|
|||||||
|
|
||||||
type E struct{}
|
type E struct{}
|
||||||
|
|
||||||
func (T) b() {} // ERROR "field and method named b|redeclares struct field name"
|
func (T) b() {} // ERROR "field and method named b|redeclares struct field name|field and method with the same name b"
|
||||||
func (*T) E() {} // ERROR "field and method named E|redeclares struct field name"
|
func (*T) E() {} // ERROR "field and method named E|redeclares struct field name|field and method with the same name E"
|
||||||
|
|
||||||
func _() {
|
func _() {
|
||||||
var x T
|
var x T
|
||||||
|
@ -18,11 +18,11 @@ const iii int = 0x3
|
|||||||
func f(v int) {
|
func f(v int) {
|
||||||
switch v {
|
switch v {
|
||||||
case zero, one:
|
case zero, one:
|
||||||
case two, one: // ERROR "previous case at LINE-1|duplicate case in switch"
|
case two, one: // ERROR "previous case at LINE-1|duplicate case .*in.* switch"
|
||||||
|
|
||||||
case three:
|
case three:
|
||||||
case 3: // ERROR "previous case at LINE-1|duplicate case in switch"
|
case 3: // ERROR "previous case at LINE-1|duplicate case .*in.* switch"
|
||||||
case iii: // ERROR "previous case at LINE-2|duplicate case in switch"
|
case iii: // ERROR "previous case at LINE-2|duplicate case .*in.* switch"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ const b = "b"
|
|||||||
var _ = map[string]int{
|
var _ = map[string]int{
|
||||||
"a": 0,
|
"a": 0,
|
||||||
b: 1,
|
b: 1,
|
||||||
"a": 2, // ERROR "previous key at LINE-2|duplicate key in map literal"
|
"a": 2, // ERROR "previous key at LINE-2|duplicate key.*in map literal"
|
||||||
"b": 3, // GC_ERROR "previous key at LINE-2"
|
"b": 3, // GC_ERROR "previous key at LINE-2|duplicate key.*in map literal"
|
||||||
"b": 4, // GC_ERROR "previous key at LINE-3"
|
"b": 4, // GC_ERROR "previous key at LINE-3|duplicate key.*in map literal"
|
||||||
}
|
}
|
||||||
|
@ -11,46 +11,46 @@ package p
|
|||||||
|
|
||||||
func f() {
|
func f() {
|
||||||
var a [10]int
|
var a [10]int
|
||||||
_ = a[-1] // ERROR "invalid array index -1|index out of bounds"
|
_ = a[-1] // ERROR "invalid array index -1|index out of bounds|must not be negative"
|
||||||
_ = a[-1:] // ERROR "invalid slice index -1|index out of bounds"
|
_ = a[-1:] // ERROR "invalid slice index -1|index out of bounds|must not be negative"
|
||||||
_ = a[:-1] // ERROR "invalid slice index -1|index out of bounds"
|
_ = a[:-1] // ERROR "invalid slice index -1|index out of bounds|must not be negative"
|
||||||
_ = a[10] // ERROR "invalid array index 10|index out of bounds"
|
_ = a[10] // ERROR "invalid array index 10|index .*out of bounds"
|
||||||
_ = a[9:10]
|
_ = a[9:10]
|
||||||
_ = a[10:10]
|
_ = a[10:10]
|
||||||
_ = a[9:12] // ERROR "invalid slice index 12|index out of bounds"
|
_ = a[9:12] // ERROR "invalid slice index 12|index .*out of bounds"
|
||||||
_ = a[11:12] // ERROR "invalid slice index 11|index out of bounds"
|
_ = a[11:12] // ERROR "invalid slice index 11|index .*out of bounds"
|
||||||
_ = a[1<<100 : 1<<110] // ERROR "overflows int|integer constant overflow" "invalid slice index 1 << 100|index out of bounds"
|
_ = a[1<<100 : 1<<110] // ERROR "overflows int|integer constant overflow|invalid slice index 1 << 100|index out of bounds"
|
||||||
|
|
||||||
var s []int
|
var s []int
|
||||||
_ = s[-1] // ERROR "invalid slice index -1|index out of bounds"
|
_ = s[-1] // ERROR "invalid slice index -1|index .*out of bounds|must not be negative"
|
||||||
_ = s[-1:] // ERROR "invalid slice index -1|index out of bounds"
|
_ = s[-1:] // ERROR "invalid slice index -1|index .*out of bounds|must not be negative"
|
||||||
_ = s[:-1] // ERROR "invalid slice index -1|index out of bounds"
|
_ = s[:-1] // ERROR "invalid slice index -1|index .*out of bounds|must not be negative"
|
||||||
_ = s[10]
|
_ = s[10]
|
||||||
_ = s[9:10]
|
_ = s[9:10]
|
||||||
_ = s[10:10]
|
_ = s[10:10]
|
||||||
_ = s[9:12]
|
_ = s[9:12]
|
||||||
_ = s[11:12]
|
_ = s[11:12]
|
||||||
_ = s[1<<100 : 1<<110] // ERROR "overflows int|integer constant overflow" "invalid slice index 1 << 100|index out of bounds"
|
_ = s[1<<100 : 1<<110] // ERROR "overflows int|integer constant overflow|invalid slice index 1 << 100|index out of bounds"
|
||||||
|
|
||||||
const c = "foofoofoof"
|
const c = "foofoofoof"
|
||||||
_ = c[-1] // ERROR "invalid string index -1|index out of bounds"
|
_ = c[-1] // ERROR "invalid string index -1|index out of bounds|must not be negative"
|
||||||
_ = c[-1:] // ERROR "invalid slice index -1|index out of bounds"
|
_ = c[-1:] // ERROR "invalid slice index -1|index out of bounds|must not be negative"
|
||||||
_ = c[:-1] // ERROR "invalid slice index -1|index out of bounds"
|
_ = c[:-1] // ERROR "invalid slice index -1|index out of bounds|must not be negative"
|
||||||
_ = c[10] // ERROR "invalid string index 10|index out of bounds"
|
_ = c[10] // ERROR "invalid string index 10|index .*out of bounds"
|
||||||
_ = c[9:10]
|
_ = c[9:10]
|
||||||
_ = c[10:10]
|
_ = c[10:10]
|
||||||
_ = c[9:12] // ERROR "invalid slice index 12|index out of bounds"
|
_ = c[9:12] // ERROR "invalid slice index 12|index .*out of bounds"
|
||||||
_ = c[11:12] // ERROR "invalid slice index 11|index out of bounds"
|
_ = c[11:12] // ERROR "invalid slice index 11|index .*out of bounds"
|
||||||
_ = c[1<<100 : 1<<110] // ERROR "overflows int|integer constant overflow" "invalid slice index 1 << 100|index out of bounds"
|
_ = c[1<<100 : 1<<110] // ERROR "overflows int|integer constant overflow|invalid slice index 1 << 100|index out of bounds"
|
||||||
|
|
||||||
var t string
|
var t string
|
||||||
_ = t[-1] // ERROR "invalid string index -1|index out of bounds"
|
_ = t[-1] // ERROR "invalid string index -1|index out of bounds|must not be negative"
|
||||||
_ = t[-1:] // ERROR "invalid slice index -1|index out of bounds"
|
_ = t[-1:] // ERROR "invalid slice index -1|index out of bounds|must not be negative"
|
||||||
_ = t[:-1] // ERROR "invalid slice index -1|index out of bounds"
|
_ = t[:-1] // ERROR "invalid slice index -1|index out of bounds|must not be negative"
|
||||||
_ = t[10]
|
_ = t[10]
|
||||||
_ = t[9:10]
|
_ = t[9:10]
|
||||||
_ = t[10:10]
|
_ = t[10:10]
|
||||||
_ = t[9:12]
|
_ = t[9:12]
|
||||||
_ = t[11:12]
|
_ = t[11:12]
|
||||||
_ = t[1<<100 : 1<<110] // ERROR "overflows int|integer constant overflow" "invalid slice index 1 << 100|index out of bounds"
|
_ = t[1<<100 : 1<<110] // ERROR "overflows int|integer constant overflow|invalid slice index 1 << 100|index out of bounds"
|
||||||
}
|
}
|
||||||
|
@ -9,5 +9,5 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
_ = [...]int(4) // ERROR "\[\.\.\.\].*outside of array literal"
|
_ = [...]int(4) // ERROR "\[\.\.\.\].*outside of array literal|invalid use of \[\.\.\.\] array"
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,6 @@
|
|||||||
|
|
||||||
package p
|
package p
|
||||||
|
|
||||||
import "fmt" // ERROR "fmt redeclared|imported"
|
import "fmt" // GCCGO_ERROR "fmt redeclared|imported"
|
||||||
|
|
||||||
var _ = fmt.Printf
|
var _ = fmt.Printf
|
||||||
|
@ -4,4 +4,4 @@
|
|||||||
|
|
||||||
package p
|
package p
|
||||||
|
|
||||||
func fmt() {}
|
func fmt() {} // GC_ERROR "fmt already declared through import of package"
|
||||||
|
@ -10,6 +10,6 @@ package main
|
|||||||
|
|
||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
var x struct {
|
var x struct { // GC_ERROR "initialization loop for x"
|
||||||
a [unsafe.Sizeof(x.a)]int // ERROR "array bound|typechecking loop|invalid expression"
|
a [unsafe.Sizeof(x.a)]int // GCCGO_ERROR "array bound|typechecking loop|invalid expression"
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,6 @@
|
|||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
var y struct {
|
var y struct { // GC_ERROR "initialization loop for y"
|
||||||
d [len(y.d)]int // ERROR "array bound|typechecking loop|invalid array"
|
d [len(y.d)]int // GCCGO_ERROR "array bound|typechecking loop|invalid array"
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,6 @@
|
|||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
var z struct {
|
var z struct { // GC_ERROR "initialization loop for z"
|
||||||
e [cap(z.e)]int // ERROR "array bound|typechecking loop|invalid array"
|
e [cap(z.e)]int // GCCGO_ERROR "array bound|typechecking loop|invalid array"
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,6 @@ package main
|
|||||||
|
|
||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
var x struct {
|
var x struct { // GC_ERROR "initialization loop for x"
|
||||||
b [unsafe.Offsetof(x.b)]int // ERROR "array bound|typechecking loop|invalid array"
|
b [unsafe.Offsetof(x.b)]int // GCCGO_ERROR "array bound|typechecking loop|invalid array"
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,6 @@ package main
|
|||||||
|
|
||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
var x struct {
|
var x struct { // GC_ERROR "initialization loop for x"
|
||||||
c [unsafe.Alignof(x.c)]int // ERROR "array bound|typechecking loop|invalid array"
|
c [unsafe.Alignof(x.c)]int // GCCGO_ERROR "array bound|typechecking loop|invalid array"
|
||||||
}
|
}
|
||||||
|
@ -9,11 +9,11 @@
|
|||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "bufio" // GCCGO_ERROR "previous|not used"
|
import "bufio" // ERROR "previous|not used"
|
||||||
import bufio "os" // ERROR "redeclared|redefinition|incompatible" "imported and not used"
|
import bufio "os" // ERROR "redeclared|redefinition|incompatible" "imported and not used"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt" // GCCGO_ERROR "previous|not used"
|
"fmt" // ERROR "previous|not used"
|
||||||
fmt "math" // ERROR "redeclared|redefinition|incompatible" "imported and not used: \x22math\x22 as fmt"
|
fmt "math" // ERROR "redeclared|redefinition|incompatible" "imported and not used: \x22math\x22 as fmt"
|
||||||
. "math" // GC_ERROR "imported and not used: \x22math\x22$"
|
. "math" // GC_ERROR "imported and not used: \x22math\x22$"
|
||||||
)
|
)
|
||||||
|
@ -34,5 +34,6 @@ import "\xFFFD" // ERROR "import path"
|
|||||||
import `\xFFFD` // ERROR "import path"
|
import `\xFFFD` // ERROR "import path"
|
||||||
|
|
||||||
// Invalid local imports.
|
// Invalid local imports.
|
||||||
import "/foo" // ERROR "import path cannot be absolute path"
|
// types2 adds extra "not used" error.
|
||||||
import "c:/foo" // ERROR "import path contains invalid character"
|
import "/foo" // ERROR "import path cannot be absolute path|not used"
|
||||||
|
import "c:/foo" // ERROR "import path contains invalid character|invalid character"
|
||||||
|
@ -18,7 +18,7 @@ type T struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var x = 1
|
var x = 1
|
||||||
var a1 = S { 0, X: 1 } // ERROR "mixture|undefined"
|
var a1 = S{0, X: 1} // ERROR "mixture|undefined" "too few values"
|
||||||
var a2 = S{Y: 3, Z: 2, Y: 3} // ERROR "duplicate"
|
var a2 = S{Y: 3, Z: 2, Y: 3} // ERROR "duplicate"
|
||||||
var a3 = T{S{}, 2, 3, 4, 5, 6} // ERROR "convert|too many"
|
var a3 = T{S{}, 2, 3, 4, 5, 6} // ERROR "convert|too many"
|
||||||
var a4 = [5]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} // ERROR "index|too many"
|
var a4 = [5]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} // ERROR "index|too many"
|
||||||
|
77
test/run.go
77
test/run.go
@ -350,13 +350,12 @@ func (t *test) initExpectFail(hasGFlag bool) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if t.glevel == 0 && !hasGFlag && !unifiedEnabled {
|
var failureSets []map[string]bool
|
||||||
// tests should always pass when run w/o types2 (i.e., using the
|
|
||||||
// legacy typechecker, option -G=0).
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
failureSets := []map[string]bool{types2Failures}
|
if t.glevel == 0 && !hasGFlag && !unifiedEnabled {
|
||||||
|
failureSets = append(failureSets, g0Failures)
|
||||||
|
} else {
|
||||||
|
failureSets = append(failureSets, types2Failures)
|
||||||
|
|
||||||
// Note: gccgo supports more 32-bit architectures than this, but
|
// Note: gccgo supports more 32-bit architectures than this, but
|
||||||
// hopefully the 32-bit failures are fixed before this matters.
|
// hopefully the 32-bit failures are fixed before this matters.
|
||||||
@ -370,6 +369,7 @@ func (t *test) initExpectFail(hasGFlag bool) {
|
|||||||
} else {
|
} else {
|
||||||
failureSets = append(failureSets, g3Failures)
|
failureSets = append(failureSets, g3Failures)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
filename := strings.Replace(t.goFileName(), "\\", "/", -1) // goFileName() uses \ on Windows
|
filename := strings.Replace(t.goFileName(), "\\", "/", -1) // goFileName() uses \ on Windows
|
||||||
|
|
||||||
@ -2115,47 +2115,15 @@ func overlayDir(dstRoot, srcRoot string) error {
|
|||||||
// List of files that the compiler cannot errorcheck with the new typechecker (compiler -G option).
|
// List of files that the compiler cannot errorcheck with the new typechecker (compiler -G option).
|
||||||
// Temporary scaffolding until we pass all the tests at which point this map can be removed.
|
// Temporary scaffolding until we pass all the tests at which point this map can be removed.
|
||||||
var types2Failures = setOf(
|
var types2Failures = setOf(
|
||||||
"import1.go", // types2 reports extra errors
|
|
||||||
"import6.go", // issue #43109
|
|
||||||
"initializerr.go", // types2 reports extra errors
|
|
||||||
"notinheap.go", // types2 doesn't report errors about conversions that are invalid due to //go:notinheap
|
"notinheap.go", // types2 doesn't report errors about conversions that are invalid due to //go:notinheap
|
||||||
"shift1.go", // mostly just different wording, but reports two new errors.
|
"shift1.go", // types2 reports two new errors which are probably not right
|
||||||
"typecheck.go", // invalid function is not causing errors when called
|
"fixedbugs/issue10700.go", // types2 should give hint about ptr to interface
|
||||||
|
|
||||||
"fixedbugs/bug176.go", // types2 reports all errors (pref: types2)
|
|
||||||
"fixedbugs/bug195.go", // types2 reports slightly different (but correct) bugs
|
|
||||||
"fixedbugs/bug228.go", // types2 doesn't run when there are syntax errors
|
|
||||||
"fixedbugs/bug231.go", // types2 bug? (same error reported twice)
|
|
||||||
"fixedbugs/bug255.go", // types2 reports extra errors
|
|
||||||
"fixedbugs/bug388.go", // types2 not run due to syntax errors
|
|
||||||
"fixedbugs/bug412.go", // types2 produces a follow-on error
|
|
||||||
|
|
||||||
"fixedbugs/issue10700.go", // types2 reports ok hint, but does not match regexp
|
|
||||||
"fixedbugs/issue11590.go", // types2 doesn't report a follow-on error (pref: types2)
|
|
||||||
"fixedbugs/issue11610.go", // types2 not run after syntax errors
|
|
||||||
"fixedbugs/issue11614.go", // types2 reports an extra error
|
|
||||||
"fixedbugs/issue14520.go", // missing import path error by types2
|
|
||||||
"fixedbugs/issue17038.go", // types2 doesn't report a follow-on error (pref: types2)
|
|
||||||
"fixedbugs/issue18331.go", // missing error about misuse of //go:noescape (irgen needs code from noder)
|
"fixedbugs/issue18331.go", // missing error about misuse of //go:noescape (irgen needs code from noder)
|
||||||
"fixedbugs/issue18419.go", // types2 reports no field or method member, but should say unexported
|
"fixedbugs/issue18419.go", // types2 reports no field or method member, but should say unexported
|
||||||
"fixedbugs/issue19012.go", // multiple errors on same line
|
"fixedbugs/issue20233.go", // types2 reports two instead of one error (pref: -G=0)
|
||||||
"fixedbugs/issue20233.go", // types2 reports two instead of one error (pref: compiler)
|
"fixedbugs/issue20245.go", // types2 reports two instead of one error (pref: -G=0)
|
||||||
"fixedbugs/issue20245.go", // types2 reports two instead of one error (pref: compiler)
|
"fixedbugs/issue28268.go", // types2 reports follow-on errors (pref: -G=0)
|
||||||
"fixedbugs/issue21979.go", // types2 doesn't report a follow-on error (pref: types2)
|
|
||||||
"fixedbugs/issue23732.go", // types2 reports different (but ok) line numbers
|
|
||||||
"fixedbugs/issue25958.go", // types2 doesn't report a follow-on error (pref: types2)
|
|
||||||
"fixedbugs/issue28079b.go", // types2 reports follow-on errors
|
|
||||||
"fixedbugs/issue28268.go", // types2 reports follow-on errors
|
|
||||||
"fixedbugs/issue31053.go", // types2 reports "unknown field" instead of "cannot refer to unexported field"
|
"fixedbugs/issue31053.go", // types2 reports "unknown field" instead of "cannot refer to unexported field"
|
||||||
"fixedbugs/issue33460.go", // types2 reports alternative positions in separate error
|
|
||||||
"fixedbugs/issue4232.go", // types2 reports (correct) extra errors
|
|
||||||
"fixedbugs/issue4452.go", // types2 reports (correct) extra errors
|
|
||||||
"fixedbugs/issue4510.go", // types2 reports different (but ok) line numbers
|
|
||||||
"fixedbugs/issue7525b.go", // types2 reports init cycle error on different line - ok otherwise
|
|
||||||
"fixedbugs/issue7525c.go", // types2 reports init cycle error on different line - ok otherwise
|
|
||||||
"fixedbugs/issue7525d.go", // types2 reports init cycle error on different line - ok otherwise
|
|
||||||
"fixedbugs/issue7525e.go", // types2 reports init cycle error on different line - ok otherwise
|
|
||||||
"fixedbugs/issue7525.go", // types2 reports init cycle error on different line - ok otherwise
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var types2Failures32Bit = setOf(
|
var types2Failures32Bit = setOf(
|
||||||
@ -2168,6 +2136,29 @@ var g3Failures = setOf(
|
|||||||
"typeparam/nested.go", // -G=3 doesn't support function-local types with generics
|
"typeparam/nested.go", // -G=3 doesn't support function-local types with generics
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// In all of these cases, -G=0 reports reasonable errors, but either -G=0 or types2
|
||||||
|
// report extra errors, so we can't match correctly on both. We now set the patterns
|
||||||
|
// to match correctly on all the types2 errors.
|
||||||
|
var g0Failures = setOf(
|
||||||
|
"import1.go", // types2 reports extra errors
|
||||||
|
"initializerr.go", // types2 reports extra error
|
||||||
|
"typecheck.go", // types2 reports extra error at function call
|
||||||
|
|
||||||
|
"fixedbugs/bug176.go", // types2 reports all errors (pref: types2)
|
||||||
|
"fixedbugs/bug195.go", // types2 reports slight different errors, and an extra error
|
||||||
|
"fixedbugs/bug412.go", // types2 produces a follow-on error
|
||||||
|
|
||||||
|
"fixedbugs/issue11614.go", // types2 reports an extra error
|
||||||
|
"fixedbugs/issue17038.go", // types2 doesn't report a follow-on error (pref: types2)
|
||||||
|
"fixedbugs/issue23732.go", // types2 reports different (but ok) line numbers
|
||||||
|
"fixedbugs/issue4510.go", // types2 reports different (but ok) line numbers
|
||||||
|
"fixedbugs/issue7525b.go", // types2 reports init cycle error on different line - ok otherwise
|
||||||
|
"fixedbugs/issue7525c.go", // types2 reports init cycle error on different line - ok otherwise
|
||||||
|
"fixedbugs/issue7525d.go", // types2 reports init cycle error on different line - ok otherwise
|
||||||
|
"fixedbugs/issue7525e.go", // types2 reports init cycle error on different line - ok otherwise
|
||||||
|
"fixedbugs/issue7525.go", // types2 reports init cycle error on different line - ok otherwise
|
||||||
|
)
|
||||||
|
|
||||||
var unifiedFailures = setOf(
|
var unifiedFailures = setOf(
|
||||||
"closure3.go", // unified IR numbers closures differently than -d=inlfuncswithclosures
|
"closure3.go", // unified IR numbers closures differently than -d=inlfuncswithclosures
|
||||||
"escape4.go", // unified IR can inline f5 and f6; test doesn't expect this
|
"escape4.go", // unified IR can inline f5 and f6; test doesn't expect this
|
||||||
|
@ -17,6 +17,6 @@ func mine(int b) int { // ERROR "undefined.*b"
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
mine() // GCCGO_ERROR "not enough arguments"
|
mine() // ERROR "not enough arguments"
|
||||||
c = mine() // ERROR "undefined.*c|not enough arguments"
|
c = mine() // ERROR "undefined.*c|not enough arguments"
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user