1
0
mirror of https://github.com/golang/go synced 2024-09-29 20:14:29 -06:00

go/types, types2: consolidate testdata/examples test files

Besides applying gofmt (which doesn't damage the tests in this case),
the ERROR comments in the types2 files now match the go/types files.
But because types2 still reports some errors are different positions,
the checking code now allows for some position discrepancy (similar
to what we do for other tests).

Except for an outstanding TODO in go/types/testdata/examples/types.go
the test files are now identical.

For #54511.

Change-Id: I5748e0f678d11c5c0bdf4fdf28bd04f0b11b5b23
Reviewed-on: https://go-review.googlesource.com/c/go/+/424674
Reviewed-by: Robert Findley <rfindley@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
This commit is contained in:
Robert Griesemer 2022-08-17 18:09:55 -07:00 committed by Robert Griesemer
parent 9485d4c1bd
commit 9ad772033f
9 changed files with 67 additions and 70 deletions

View File

@ -299,7 +299,7 @@ func TestManual(t *testing.T) {
func TestCheck(t *testing.T) { DefPredeclaredTestFuncs(); testDirFiles(t, "testdata/check", 55, false) } // TODO(gri) narrow column tolerance
func TestSpec(t *testing.T) { testDirFiles(t, "testdata/spec", 0, false) }
func TestExamples(t *testing.T) { testDirFiles(t, "testdata/examples", 0, false) }
func TestExamples(t *testing.T) { testDirFiles(t, "testdata/examples", 45, false) }
func TestFixedbugs(t *testing.T) { testDirFiles(t, "testdata/fixedbugs", 0, false) }
func testDirFiles(t *testing.T, dir string, colDelta uint, manual bool) {

View File

@ -211,7 +211,7 @@ func _() {
func h[] /* ERROR empty type parameter list */ () {}
func _() {
h[ /* ERROR cannot index */ ] /* ERROR operand */ ()
h /* ERROR cannot index */ [] /* ERROR operand */ ()
}
// Parameterized functions must have a function body.

View File

@ -7,7 +7,7 @@
package p
type Ordered interface {
~int|~float64|~string
~int | ~float64 | ~string
}
func min[T Ordered](x, y T) T { panic(0) }
@ -24,13 +24,13 @@ func _() {
_ = min(x, 1)
_ = min(x, 1.0)
_ = min(1, 2)
_ = min(1, 2.3 /* ERROR default type float64 .* does not match */ )
_ = min(1, 2.3 /* ERROR default type float64 .* does not match */)
var y float64
_ = min(1, y)
_ = min(1.2, y)
_ = min(1.2, 3.4)
_ = min(1.2, 3 /* ERROR default type int .* does not match */ )
_ = min(1.2, 3 /* ERROR default type int .* does not match */)
var s string
_ = min(s, "foo")
@ -51,10 +51,10 @@ func _() {
// Provided type arguments always take precedence over
// inferred types.
mixed[int, string](1.1 /* ERROR cannot use 1.1 */ , "", false)
mixed[int, string](1.1 /* ERROR cannot use 1.1 */, "", false)
}
func related1[Slice interface{~[]Elem}, Elem any](s Slice, e Elem) {}
func related1[Slice interface{ ~[]Elem }, Elem any](s Slice, e Elem) {}
func _() {
// related1 can be called with explicit instantiation.
@ -69,16 +69,16 @@ func _() {
// A type argument inferred from another explicitly provided
// type argument overrides whatever value argument type is given.
related1[[]string](ss, 0 /* ERROR cannot use 0 */ )
related1[[]string](ss, 0 /* ERROR cannot use 0 */)
// A type argument may be inferred from a value argument
// and then help infer another type argument via constraint
// type inference.
related1(si, 0)
related1(si, "foo" /* ERROR cannot use "foo" */ )
related1(si, "foo" /* ERROR cannot use "foo" */)
}
func related2[Elem any, Slice interface{[]Elem}](e Elem, s Slice) {}
func related2[Elem any, Slice interface{ []Elem }](e Elem, s Slice) {}
func _() {
// related2 can be called with explicit instantiation.
@ -97,7 +97,7 @@ func _() {
// last.
related2(1.2, []float64{})
related2(1.0, []int{})
related2( /* ERROR does not implement */ float64(1.0), []int{}) // TODO(gri) fix error position
related2 /* ERROR does not implement */ (float64(1.0), []int{}) // TODO(gri) fix error position
}
type List[P any] []P
@ -112,5 +112,5 @@ func _() {
// The 2nd type argument cannot be inferred from the first
// one because there's two possible choices: []Elem and
// List[Elem].
related3[int]( /* ERROR cannot infer Slice */ )
related3 /* ERROR cannot infer Slice */ [int]()
}

View File

@ -106,7 +106,7 @@ var _ = T /* ERROR cannot use generic type T */ (0)
// In type context, generic (parameterized) types cannot be parenthesized before
// being instantiated. See also NOTES entry from 12/4/2019.
var _ (T /* ERROR cannot use generic type T */ )[ /* ERROR unexpected \[ */ int]
var _ (T /* ERROR cannot use generic type T */ )[ /* ERROR unexpected \[|expected ';' */ int]
// All types may be parameterized, including interfaces.
type I1[T any] interface{

View File

@ -9,13 +9,13 @@ package p
// Constraint type sets of the form T, ~T, or A|B may omit the interface.
type (
_[T int] struct{}
_[T ~int] struct{}
_[T int|string] struct{}
_[T ~int|~string] struct{}
_[T int] struct{}
_[T ~int] struct{}
_[T int | string] struct{}
_[T ~int | ~string] struct{}
)
func min[T int|string](x, y T) T {
func min[T int | string](x, y T) T {
if x < y {
return x
}
@ -45,9 +45,8 @@ func _() *int {
// A type parameter may not be embedded in an interface;
// so it can also not be used as a constraint.
func _[A any, B A /* ERROR cannot use a type parameter as constraint */ ]() {}
func _[A any, B, C A /* ERROR cannot use a type parameter as constraint */ ]() {}
func _[A any, B A /* ERROR cannot use a type parameter as constraint */]() {}
func _[A any, B, C A /* ERROR cannot use a type parameter as constraint */]() {}
// Error messages refer to the type constraint as it appears in the source.
// (No implicit interface should be exposed.)
@ -55,6 +54,6 @@ func _[T string](x T) T {
return x /* ERROR constrained by string */ * x
}
func _[T int|string](x T) T {
func _[T int | string](x T) T {
return x /* ERROR constrained by int|string */ * x
}

View File

@ -183,6 +183,7 @@ func _() {
var s1 string
g3(nil, "1", myString("2"), "3")
g3(& /* ERROR does not match */ s1, "1", myString("2"), "3")
_ = s1
type myStruct struct{x int}
var s2 myStruct

View File

@ -7,7 +7,7 @@
package p
type Ordered interface {
~int|~float64|~string
~int | ~float64 | ~string
}
func min[T Ordered](x, y T) T { panic(0) }
@ -24,13 +24,13 @@ func _() {
_ = min(x, 1)
_ = min(x, 1.0)
_ = min(1, 2)
_ = min(1, 2.3 /* ERROR default type float64 .* does not match */ )
_ = min(1, 2.3 /* ERROR default type float64 .* does not match */)
var y float64
_ = min(1, y)
_ = min(1.2, y)
_ = min(1.2, 3.4)
_ = min(1.2, 3 /* ERROR default type int .* does not match */ )
_ = min(1.2, 3 /* ERROR default type int .* does not match */)
var s string
_ = min(s, "foo")
@ -51,10 +51,10 @@ func _() {
// Provided type arguments always take precedence over
// inferred types.
mixed[int, string](1.1 /* ERROR cannot use 1.1 */ , "", false)
mixed[int, string](1.1 /* ERROR cannot use 1.1 */, "", false)
}
func related1[Slice interface{~[]Elem}, Elem any](s Slice, e Elem) {}
func related1[Slice interface{ ~[]Elem }, Elem any](s Slice, e Elem) {}
func _() {
// related1 can be called with explicit instantiation.
@ -69,16 +69,16 @@ func _() {
// A type argument inferred from another explicitly provided
// type argument overrides whatever value argument type is given.
related1[[]string](ss, 0 /* ERROR cannot use 0 */ )
related1[[]string](ss, 0 /* ERROR cannot use 0 */)
// A type argument may be inferred from a value argument
// and then help infer another type argument via constraint
// type inference.
related1(si, 0)
related1(si, "foo" /* ERROR cannot use "foo" */ )
related1(si, "foo" /* ERROR cannot use "foo" */)
}
func related2[Elem any, Slice interface{[]Elem}](e Elem, s Slice) {}
func related2[Elem any, Slice interface{ []Elem }](e Elem, s Slice) {}
func _() {
// related2 can be called with explicit instantiation.

View File

@ -106,7 +106,7 @@ var _ = T /* ERROR cannot use generic type T */ (0)
// In type context, generic (parameterized) types cannot be parenthesized before
// being instantiated. See also NOTES entry from 12/4/2019.
var _ (T /* ERROR cannot use generic type T */ )[ /* ERROR expected ';' */ int]
var _ (T /* ERROR cannot use generic type T */ )[ /* ERROR unexpected \[|expected ';' */ int]
// All types may be parameterized, including interfaces.
type I1[T any] interface{
@ -145,21 +145,17 @@ func _() {
x.m("foo")
}
// We accept parenthesized embedded struct fields so we can distinguish between
// a named field with a parenthesized type foo (T) and an embedded parameterized
// type (foo(T)), similarly to interface embedding.
// They still need to be valid embedded types after the parentheses are stripped
// (i.e., in contrast to interfaces, we cannot embed a struct literal). The name
// of the embedded field is derived as before, after stripping parentheses.
// (7/14/2020: See comment above. We probably will revert this generalized ability
// if we go with [] for type parameters.)
type _ struct {
// TODO(gri) The next 3 lines need to be adjusted to match
// the corresponding types2 tests. This requires
// a go/parser fix (issue #51655).
int8
*int16
*List[int]
List[int]
int8 /* ERROR int8 redeclared */
* /* ERROR List redeclared */ List[int]
* /* ERROR int16 redeclared */ int16
List /* ERROR List redeclared */ [int]
}
// Issue #45639: We don't allow this anymore. Keep this code
@ -169,27 +165,27 @@ type _ struct {
// are type parameters. As with ordinary type definitions, the
// types underlying properties are "inherited" but the methods
// are not.
//func _[T interface{ m(); ~int }]() {
// type L T
// var x L
//
// // m is not defined on L (it is not "inherited" from
// // its underlying type).
// x.m /* ERROR x.m undefined */ ()
//
// // But the properties of T, such that as that it supports
// // the operations of the types given by its type bound,
// // are also the properties of L.
// x++
// _ = x - x
//
// // On the other hand, if we define a local alias for T,
// // that alias stands for T as expected.
// type A = T
// var y A
// y.m()
// _ = y < 0
//}
// func _[T interface{ m(); ~int }]() {
// type L T
// var x L
//
// // m is not defined on L (it is not "inherited" from
// // its underlying type).
// x.m /* ERROR x.m undefined */ ()
//
// // But the properties of T, such that as that it supports
// // the operations of the types given by its type bound,
// // are also the properties of L.
// x++
// _ = x - x
//
// // On the other hand, if we define a local alias for T,
// // that alias stands for T as expected.
// type A = T
// var y A
// y.m()
// _ = y < 0
// }
// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
// // It is not permitted to declare a local type whose underlying
@ -285,7 +281,7 @@ func _() {
// (If a type set contains just a single const type, we could
// allow it, but such type sets don't make much sense in the
// first place.)
func _[T interface {~int|~float64}]() {
func _[T interface{~int|~float64}]() {
// not valid
const _ = T /* ERROR not constant */ (0)
const _ T /* ERROR invalid constant type T */ = 1

View File

@ -9,13 +9,13 @@ package p
// Constraint type sets of the form T, ~T, or A|B may omit the interface.
type (
_[T int] struct{}
_[T ~int] struct{}
_[T int|string] struct{}
_[T ~int|~string] struct{}
_[T int] struct{}
_[T ~int] struct{}
_[T int | string] struct{}
_[T ~int | ~string] struct{}
)
func min[T int|string](x, y T) T {
func min[T int | string](x, y T) T {
if x < y {
return x
}
@ -45,7 +45,8 @@ func _() *int {
// A type parameter may not be embedded in an interface;
// so it can also not be used as a constraint.
func _[A any, B A /* ERROR cannot use a type parameter as constraint */ ]() {}
func _[A any, B A /* ERROR cannot use a type parameter as constraint */]() {}
func _[A any, B, C A /* ERROR cannot use a type parameter as constraint */]() {}
// Error messages refer to the type constraint as it appears in the source.
// (No implicit interface should be exposed.)
@ -53,6 +54,6 @@ func _[T string](x T) T {
return x /* ERROR constrained by string */ * x
}
func _[T int|string](x T) T {
func _[T int | string](x T) T {
return x /* ERROR constrained by int|string */ * x
}