]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile/internal/types2: disallow lone type parameter on RHS of type declaration
authorRobert Griesemer <gri@golang.org>
Wed, 27 Oct 2021 20:55:15 +0000 (13:55 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 28 Oct 2021 00:11:24 +0000 (00:11 +0000)
We may revisit this decision in a future release. By disallowing this
for Go 1.18 we are ensuring that we don't lock in the generics design
in a place that may need to change later. (Type declarations are the
primary construct where it crucially matters what the underlying type
of a type parameter is.)

Comment out all tests that rely on this feature; add comments referring
to issue so we can find all places easily should we change our minds.

Fixes #45639.

Change-Id: I730510e4da66d3716d455a9071c7778a1e4a1152
Reviewed-on: https://go-review.googlesource.com/c/go/+/359177
Trust: Robert Griesemer <gri@golang.org>
Trust: Dan Scales <danscales@google.com>
Reviewed-by: Dan Scales <danscales@google.com>
20 files changed:
src/cmd/compile/internal/types2/api_test.go
src/cmd/compile/internal/types2/decl.go
src/cmd/compile/internal/types2/testdata/check/linalg.go2
src/cmd/compile/internal/types2/testdata/check/typeinst.go2
src/cmd/compile/internal/types2/testdata/check/typeinst2.go2
src/cmd/compile/internal/types2/testdata/check/typeparams.go2
src/cmd/compile/internal/types2/testdata/examples/methods.go2
src/cmd/compile/internal/types2/testdata/examples/types.go2
src/cmd/compile/internal/types2/testdata/fixedbugs/issue39634.go2
src/cmd/compile/internal/types2/testdata/fixedbugs/issue39768.go2
src/cmd/compile/internal/types2/testdata/fixedbugs/issue39938.go2
src/cmd/compile/internal/types2/testdata/fixedbugs/issue45639.go2
src/cmd/compile/internal/types2/testdata/fixedbugs/issue47747.go2
test/typeparam/absdiff.go
test/typeparam/absdiffimp.dir/a.go
test/typeparam/absdiffimp.dir/main.go
test/typeparam/boundmethod.go
test/typeparam/issue47708.go
test/typeparam/issue47740.go
test/typeparam/issue47740.out

index ecb5a29830e5d927b23e4c8464d13b45421df729..26652f3e74fe1f70d024ef565b57395db5a153ef 100644 (file)
@@ -622,13 +622,6 @@ func TestDefsInfo(t *testing.T) {
                {`package p3; type x int`, `x`, `type p3.x int`},
                {`package p4; func f()`, `f`, `func p4.f()`},
                {`package p5; func f() int { x, _ := 1, 2; return x }`, `_`, `var _ int`},
-
-               // generic types must be sanitized
-               // (need to use sufficiently nested types to provoke unexpanded types)
-               {genericPkg + `g0; type t[P any] P; const x = t[int](42)`, `x`, `const generic_g0.x generic_g0.t[int]`},
-               {genericPkg + `g1; type t[P any] P; var x = t[int](42)`, `x`, `var generic_g1.x generic_g1.t[int]`},
-               {genericPkg + `g2; type t[P any] P; type x struct{ f t[int] }`, `x`, `type generic_g2.x struct{f generic_g2.t[int]}`},
-               {genericPkg + `g3; type t[P any] P; func f(x struct{ f t[string] }); var g = f`, `g`, `var generic_g3.g func(x struct{f generic_g3.t[string]})`},
        }
 
        for _, test := range tests {
@@ -667,13 +660,6 @@ func TestUsesInfo(t *testing.T) {
                {`package p2; func _() { _ = x }; var x int`, `x`, `var p2.x int`},
                {`package p3; func _() { type _ x }; type x int`, `x`, `type p3.x int`},
                {`package p4; func _() { _ = f }; func f()`, `f`, `func p4.f()`},
-
-               // generic types must be sanitized
-               // (need to use sufficiently nested types to provoke unexpanded types)
-               {genericPkg + `g0; func _() { _ = x }; type t[P any] P; const x = t[int](42)`, `x`, `const generic_g0.x generic_g0.t[int]`},
-               {genericPkg + `g1; func _() { _ = x }; type t[P any] P; var x = t[int](42)`, `x`, `var generic_g1.x generic_g1.t[int]`},
-               {genericPkg + `g2; func _() { type _ x }; type t[P any] P; type x struct{ f t[int] }`, `x`, `type generic_g2.x struct{f generic_g2.t[int]}`},
-               {genericPkg + `g3; func _() { _ = f }; type t[P any] P; func f(x struct{ f t[string] })`, `f`, `func generic_g3.f(x struct{f generic_g3.t[string]})`},
        }
 
        for _, test := range tests {
index 63be4b32231ecd76cf904186ac322e1621af036e..5d2a6c531b41ec5bdb7890faa39b04b5999dcb7d 100644 (file)
@@ -604,9 +604,12 @@ func (check *Checker) typeDecl(obj *TypeName, tdecl *syntax.TypeDecl, def *Named
                named.underlying = Typ[Invalid]
        }
 
-       // If the RHS is a type parameter, it must be from this type declaration.
-       if tpar, _ := named.underlying.(*TypeParam); tpar != nil && tparamIndex(named.TypeParams().list(), tpar) < 0 {
-               check.errorf(tdecl.Type, "cannot use function type parameter %s as RHS in type declaration", tpar)
+       // Disallow a lone type parameter as the RHS of a type declaration (issue #45639).
+       // We can look directly at named.underlying because even if it is still a *Named
+       // type (underlying not fully resolved yet) it cannot become a type parameter due
+       // to this very restriction.
+       if tpar, _ := named.underlying.(*TypeParam); tpar != nil {
+               check.error(tdecl.Type, "cannot use a type parameter as RHS in type declaration")
                named.underlying = Typ[Invalid]
        }
 }
index efc090a1d1f0b788dd8977cf551ed2d77a40a108..f02e773dbeeeebbafde08ab38ac4cef93f11897a 100644 (file)
@@ -4,8 +4,6 @@
 
 package linalg
 
-import "math"
-
 // Numeric is type bound that matches any numeric type.
 // It would likely be in a constraints package in the standard library.
 type Numeric interface {
@@ -52,32 +50,33 @@ type Complex interface {
        ~complex64 | ~complex128
 }
 
-// OrderedAbs is a helper type that defines an Abs method for
-// ordered numeric types.
-type OrderedAbs[T OrderedNumeric] T
-
-func (a OrderedAbs[T]) Abs() OrderedAbs[T] {
-       if a < 0 {
-               return -a
-       }
-       return a
-}
-
-// ComplexAbs is a helper type that defines an Abs method for
-// complex types.
-type ComplexAbs[T Complex] T
-
-func (a ComplexAbs[T]) Abs() ComplexAbs[T] {
-       r := float64(real(a))
-       i := float64(imag(a))
-       d := math.Sqrt(r * r + i * i)
-       return ComplexAbs[T](complex(d, 0))
-}
-
-func OrderedAbsDifference[T OrderedNumeric](a, b T) T {
-       return T(AbsDifference(OrderedAbs[T](a), OrderedAbs[T](b)))
-}
-
-func ComplexAbsDifference[T Complex](a, b T) T {
-       return T(AbsDifference(ComplexAbs[T](a), ComplexAbs[T](b)))
-}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// // OrderedAbs is a helper type that defines an Abs method for
+// // ordered numeric types.
+// type OrderedAbs[T OrderedNumeric] T
+// 
+// func (a OrderedAbs[T]) Abs() OrderedAbs[T] {
+//     if a < 0 {
+//             return -a
+//     }
+//     return a
+// }
+// 
+// // ComplexAbs is a helper type that defines an Abs method for
+// // complex types.
+// type ComplexAbs[T Complex] T
+// 
+// func (a ComplexAbs[T]) Abs() ComplexAbs[T] {
+//     r := float64(real(a))
+//     i := float64(imag(a))
+//     d := math.Sqrt(r * r + i * i)
+//     return ComplexAbs[T](complex(d, 0))
+// }
+// 
+// func OrderedAbsDifference[T OrderedNumeric](a, b T) T {
+//     return T(AbsDifference(OrderedAbs[T](a), OrderedAbs[T](b)))
+// }
+// 
+// func ComplexAbsDifference[T Complex](a, b T) T {
+//     return T(AbsDifference(ComplexAbs[T](a), ComplexAbs[T](b)))
+// }
index 14f1b07ee2ccf6ce214748e6d09170c5375b279a..a3d1b5e28fb52945b455c6b9f3267b4557b04fb7 100644 (file)
@@ -8,7 +8,8 @@ type myInt int
 
 // Parameterized type declarations
 
-type T1[P any] P
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+type T1[P any] P // ERROR cannot use a type parameter as RHS in type declaration
 
 type T2[P any] struct {
         f P
@@ -19,7 +20,7 @@ type List[P any] []P
 
 // Alias type declarations cannot have type parameters.
 // Issue #46477 proposses to change that.
-type A1[P any] = /* ERROR cannot be alias */ P
+type A1[P any] = /* ERROR cannot be alias */ struct{}
 
 // Pending clarification of #46477 we disallow aliases
 // of generic types.
index 783ff346c99af347ea9953010442d5767bd1b23f..5529bd093df7c1d4ba3b7fbbdae77736fddcce98 100644 (file)
@@ -87,25 +87,27 @@ type NumericAbs[T any] interface {
 
 func AbsDifference[T NumericAbs[T]](x T) { panic(0) }
 
-type OrderedAbs[T any] T
-
-func (a OrderedAbs[T]) Abs() OrderedAbs[T]
-
-func OrderedAbsDifference[T any](x T) {
-       AbsDifference(OrderedAbs[T](x))
-}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// type OrderedAbs[T any] T
+// 
+// func (a OrderedAbs[T]) Abs() OrderedAbs[T]
+// 
+// func OrderedAbsDifference[T any](x T) {
+//     AbsDifference(OrderedAbs[T](x))
+// }
 
 // same code, reduced to essence
 
 func g[P interface{ m() P }](x P) { panic(0) }
 
-type T4[P any] P
-
-func (_ T4[P]) m() T4[P]
-
-func _[Q any](x Q) {
-       g(T4[Q](x))
-}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// type T4[P any] P
+// 
+// func (_ T4[P]) m() T4[P]
+// 
+// func _[Q any](x Q) {
+//     g(T4[Q](x))
+// }
 
 // Another test case that caused  problems in the past
 
index 1200a6e8741c0fe4874f1a23180c42dde9d5b2ad..11adb21d95f029ec1b6d8a385d83479ceb705264 100644 (file)
@@ -353,15 +353,16 @@ func _() {
 
 // the previous example was extracted from
 
-func f12[T interface{m() T}]() {}
-
-type A[T any] T
-
-func (a A[T]) m() A[T]
-
-func _[T any]() {
-       f12[A[T]]()
-}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// func f12[T interface{m() T}]() {}
+// 
+// type A[T any] T
+// 
+// func (a A[T]) m() A[T]
+// 
+// func _[T any]() {
+//     f12[A[T]]()
+// }
 
 // method expressions
 
index 4e87041e54771391056937e8b8e5424df025f5c5..1d76d553dcc44a1b57f2f983edefa404c39ab534 100644 (file)
@@ -6,8 +6,6 @@
 
 package p
 
-import "unsafe"
-
 // Parameterized types may have methods.
 type T1[A any] struct{ a A }
 
@@ -97,17 +95,18 @@ type T0 struct{}
 func (T0) _() {}
 func (T1[A]) _() {}
 
-// A generic receiver type may constrain its type parameter such
-// that it must be a pointer type. Such receiver types are not
-// permitted.
-type T3a[P interface{ ~int | ~string | ~float64 }] P
-
-func (T3a[_]) m() {} // this is ok
-
-type T3b[P interface{ ~unsafe.Pointer }] P
-
-func (T3b /* ERROR invalid receiver */ [_]) m() {}
-
-type T3c[P interface{ *int | *string }] P
-
-func (T3c /* ERROR invalid receiver */ [_]) m() {}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// // A generic receiver type may constrain its type parameter such
+// // that it must be a pointer type. Such receiver types are not
+// // permitted.
+// type T3a[P interface{ ~int | ~string | ~float64 }] P
+// 
+// func (T3a[_]) m() {} // this is ok
+// 
+// type T3b[P interface{ ~unsafe.Pointer }] P
+// 
+// func (T3b /* ERROR invalid receiver */ [_]) m() {}
+// 
+// type T3c[P interface{ *int | *string }] P
+// 
+// func (T3c /* ERROR invalid receiver */ [_]) m() {}
index f177c78d06edd3c8f512331d9290c0b34c71228f..72b74cee016a1d37138e5a3c2415f09ce867974a 100644 (file)
@@ -185,12 +185,13 @@ type _ struct {
 //     _ = y < 0
 // }
 
-// It is not permitted to declare a local type whose underlying
-// type is a type parameter not declared by that type declaration.
-func _[T any]() {
-       type _ T         // ERROR cannot use function type parameter T as RHS in type declaration
-       type _ [_ any] T // ERROR cannot use function type parameter T as RHS in type declaration
-}
+// 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
+// // type is a type parameter not declared by that type declaration.
+// func _[T any]() {
+//     type _ T         // ERROR cannot use function type parameter T as RHS in type declaration
+//     type _ [_ any] T // ERROR cannot use function type parameter T as RHS in type declaration
+// }
 
 // As a special case, an explicit type argument may be omitted
 // from a type parameter bound if the type bound expects exactly
index 200484b6d91103ebf0f60c457c1da28f92a77cc4..9a98f7f955e8c24e3e2eaf4d0ead54099a96c51c 100644 (file)
@@ -74,9 +74,10 @@ func F20[t Z20]() { F20(t /* ERROR invalid composite literal type */ {}) }
 type Z21 /* ERROR illegal cycle */ interface{ Z21 }
 func F21[T Z21]() { ( /* ERROR not used */ F21[Z21]) }
 
-// crash 24
-type T24[P any] P
-func (r T24[P]) m() { T24 /* ERROR without instantiation */ .m() }
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// // crash 24
+// type T24[P any] P
+// func (r T24[P]) m() { T24 /* ERROR without instantiation */ .m() }
 
 // crash 25
 type T25[A any] int
index fb522733e0b83f0e86b388a561f458514ee15f3c..696d9d9beef9d2f9961456e1ddf3ed6f31c51889 100644 (file)
@@ -4,14 +4,15 @@
 
 package p
 
-type T[P any] P
-type A = T  // ERROR cannot use generic type
-var x A[int]
-var _ A
-
-type B = T[int]
-var y B = x
-var _ B /* ERROR not a generic type */ [int]
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// type T[P any] P
+// type A = T  // ERROR cannot use generic type
+// var x A[int]
+// var _ A
+//
+// type B = T[int]
+// var y B = x
+// var _ B /* ERROR not a generic type */ [int]
 
 // test case from issue
 
index 31bec5fb01dcb268b4e92c3f434065264206cd28..114646786d5b74324413b74cbbca0c211f3c6cb2 100644 (file)
@@ -8,7 +8,7 @@
 
 package p
 
-type E0[P any] P
+type E0[P any] []P
 type E1[P any] *P
 type E2[P any] struct{ _ P }
 type E3[P any] struct{ _ *P }
index 441fb4cb346211c684e0a9e51247102b89ed7048..80148fe4819862f4761eb439da062e735204aa20 100644 (file)
@@ -4,9 +4,10 @@
 
 package P
 
-// It is not permitted to declare a local type whose underlying
-// type is a type parameters not declared by that type declaration.
-func _[T any]() {
-       type _ T         // ERROR cannot use function type parameter T as RHS in type declaration
-       type _ [_ any] T // ERROR cannot use function type parameter T as RHS in type declaration
-}
+// 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
+// // type is a type parameters not declared by that type declaration.
+// func _[T any]() {
+//     type _ T         // ERROR cannot use function type parameter T as RHS in type declaration
+//     type _ [_ any] T // ERROR cannot use function type parameter T as RHS in type declaration
+// }
index af52056bef2ad91606a289f3168aa28a4ca13624..6a2e787bf99848bc662654db7b6dd97b55bcec93 100644 (file)
@@ -4,15 +4,16 @@
 
 package p
 
-type T1[P any] P
-
-func (T1[_]) m() {}
-
-func _[P any](x *T1[P]) {
-        // x.m exists because x is of type *T1 where T1 is a defined type
-        // (even though under(T1) is a type parameter)
-        x.m()
-}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// type T1[P any] P
+// 
+// func (T1[_]) m() {}
+// 
+// func _[P any](x *T1[P]) {
+//         // x.m exists because x is of type *T1 where T1 is a defined type
+//         // (even though under(T1) is a type parameter)
+//         x.m()
+// }
 
 
 func _[P interface{ m() }](x P) {
@@ -40,29 +41,31 @@ type Barer[t any] interface {
        Bar(t)
 }
 
-type Foo1[t any] t
-type Bar[t any] t
-
-func (l Foo1[t]) Foo(v Barer[t]) { v.Bar(t(l)) }
-func (b *Bar[t]) Bar(l t)        { *b = Bar[t](l) }
-
-func _[t any](f Fooer1[t]) t {
-       var b Bar[t]
-       f.Foo(&b)
-       return t(b)
-}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// type Foo1[t any] t
+// type Bar[t any] t
+// 
+// func (l Foo1[t]) Foo(v Barer[t]) { v.Bar(t(l)) }
+// func (b *Bar[t]) Bar(l t)        { *b = Bar[t](l) }
+// 
+// func _[t any](f Fooer1[t]) t {
+//     var b Bar[t]
+//     f.Foo(&b)
+//     return t(b)
+// }
 
 // Test case 2 from issue
 
-type Fooer2[t any] interface {
-       Foo()
-}
-
-type Foo2[t any] t
-
-func (f *Foo2[t]) Foo() {}
-
-func _[t any](v t) {
-       var f = Foo2[t](v)
-       _ = Fooer2[t](&f)
-}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// type Fooer2[t any] interface {
+//     Foo()
+// }
+// 
+// type Foo2[t any] t
+// 
+// func (f *Foo2[t]) Foo() {}
+// 
+// func _[t any](v t) {
+//     var f = Foo2[t](v)
+//     _ = Fooer2[t](&f)
+// }
index cad6e84c4e496b5c5c76e42f86833605d9bc3e6f..f1822831b2773fcbe8afe44d624158d3390463d4 100644 (file)
@@ -6,11 +6,6 @@
 
 package main
 
-import (
-       "fmt"
-       "math"
-)
-
 type Numeric interface {
        ~int | ~int8 | ~int16 | ~int32 | ~int64 |
                ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
@@ -43,55 +38,57 @@ type Complex interface {
        ~complex64 | ~complex128
 }
 
-// orderedAbs is a helper type that defines an Abs method for
-// ordered numeric types.
-type orderedAbs[T orderedNumeric] T
-
-func (a orderedAbs[T]) Abs() orderedAbs[T] {
-       if a < 0 {
-               return -a
-       }
-       return a
-}
-
-// complexAbs is a helper type that defines an Abs method for
-// complex types.
-type complexAbs[T Complex] T
-
-func (a complexAbs[T]) Abs() complexAbs[T] {
-       r := float64(real(a))
-       i := float64(imag(a))
-       d := math.Sqrt(r*r + i*i)
-       return complexAbs[T](complex(d, 0))
-}
-
-// OrderedAbsDifference returns the absolute value of the difference
-// between a and b, where a and b are of an ordered type.
-func orderedAbsDifference[T orderedNumeric](a, b T) T {
-       return T(absDifference(orderedAbs[T](a), orderedAbs[T](b)))
-}
-
-// ComplexAbsDifference returns the absolute value of the difference
-// between a and b, where a and b are of a complex type.
-func complexAbsDifference[T Complex](a, b T) T {
-       return T(absDifference(complexAbs[T](a), complexAbs[T](b)))
-}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// // orderedAbs is a helper type that defines an Abs method for
+// // ordered numeric types.
+// type orderedAbs[T orderedNumeric] T
+//
+// func (a orderedAbs[T]) Abs() orderedAbs[T] {
+//     if a < 0 {
+//             return -a
+//     }
+//     return a
+// }
+//
+// // complexAbs is a helper type that defines an Abs method for
+// // complex types.
+// type complexAbs[T Complex] T
+//
+// func (a complexAbs[T]) Abs() complexAbs[T] {
+//     r := float64(real(a))
+//     i := float64(imag(a))
+//     d := math.Sqrt(r*r + i*i)
+//     return complexAbs[T](complex(d, 0))
+// }
+//
+// // OrderedAbsDifference returns the absolute value of the difference
+// // between a and b, where a and b are of an ordered type.
+// func orderedAbsDifference[T orderedNumeric](a, b T) T {
+//     return T(absDifference(orderedAbs[T](a), orderedAbs[T](b)))
+// }
+//
+// // ComplexAbsDifference returns the absolute value of the difference
+// // between a and b, where a and b are of a complex type.
+// func complexAbsDifference[T Complex](a, b T) T {
+//     return T(absDifference(complexAbs[T](a), complexAbs[T](b)))
+// }
 
 func main() {
-       if got, want := orderedAbsDifference(1.0, -2.0), 3.0; got != want {
-               panic(fmt.Sprintf("got = %v, want = %v", got, want))
-       }
-       if got, want := orderedAbsDifference(-1.0, 2.0), 3.0; got != want {
-               panic(fmt.Sprintf("got = %v, want = %v", got, want))
-       }
-       if got, want := orderedAbsDifference(-20, 15), 35; got != want {
-               panic(fmt.Sprintf("got = %v, want = %v", got, want))
-       }
-
-       if got, want := complexAbsDifference(5.0+2.0i, 2.0-2.0i), 5+0i; got != want {
-               panic(fmt.Sprintf("got = %v, want = %v", got, want))
-       }
-       if got, want := complexAbsDifference(2.0-2.0i, 5.0+2.0i), 5+0i; got != want {
-               panic(fmt.Sprintf("got = %v, want = %v", got, want))
-       }
+       // // For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+       // if got, want := orderedAbsDifference(1.0, -2.0), 3.0; got != want {
+       //      panic(fmt.Sprintf("got = %v, want = %v", got, want))
+       // }
+       // if got, want := orderedAbsDifference(-1.0, 2.0), 3.0; got != want {
+       //      panic(fmt.Sprintf("got = %v, want = %v", got, want))
+       // }
+       // if got, want := orderedAbsDifference(-20, 15), 35; got != want {
+       //      panic(fmt.Sprintf("got = %v, want = %v", got, want))
+       // }
+       //
+       // if got, want := complexAbsDifference(5.0+2.0i, 2.0-2.0i), 5+0i; got != want {
+       //      panic(fmt.Sprintf("got = %v, want = %v", got, want))
+       // }
+       // if got, want := complexAbsDifference(2.0-2.0i, 5.0+2.0i), 5+0i; got != want {
+       //      panic(fmt.Sprintf("got = %v, want = %v", got, want))
+       // }
 }
index 7b5bfbe2aced91f92fdc096aafde63f1bc24fb6c..60822fdb8bd8691d92e5124df61b207686f386ca 100644 (file)
@@ -4,10 +4,6 @@
 
 package a
 
-import (
-       "math"
-)
-
 type Numeric interface {
        ~int | ~int8 | ~int16 | ~int32 | ~int64 |
                ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
@@ -40,36 +36,37 @@ type Complex interface {
        ~complex64 | ~complex128
 }
 
-// orderedAbs is a helper type that defines an Abs method for
-// ordered numeric types.
-type orderedAbs[T orderedNumeric] T
-
-func (a orderedAbs[T]) Abs() orderedAbs[T] {
-       if a < 0 {
-               return -a
-       }
-       return a
-}
-
-// complexAbs is a helper type that defines an Abs method for
-// complex types.
-type complexAbs[T Complex] T
-
-func (a complexAbs[T]) Abs() complexAbs[T] {
-       r := float64(real(a))
-       i := float64(imag(a))
-       d := math.Sqrt(r*r + i*i)
-       return complexAbs[T](complex(d, 0))
-}
-
-// OrderedAbsDifference returns the absolute value of the difference
-// between a and b, where a and b are of an ordered type.
-func OrderedAbsDifference[T orderedNumeric](a, b T) T {
-       return T(absDifference(orderedAbs[T](a), orderedAbs[T](b)))
-}
-
-// ComplexAbsDifference returns the absolute value of the difference
-// between a and b, where a and b are of a complex type.
-func ComplexAbsDifference[T Complex](a, b T) T {
-       return T(absDifference(complexAbs[T](a), complexAbs[T](b)))
-}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// // orderedAbs is a helper type that defines an Abs method for
+// // ordered numeric types.
+// type orderedAbs[T orderedNumeric] T
+//
+// func (a orderedAbs[T]) Abs() orderedAbs[T] {
+//     if a < 0 {
+//             return -a
+//     }
+//     return a
+// }
+//
+// // complexAbs is a helper type that defines an Abs method for
+// // complex types.
+// type complexAbs[T Complex] T
+//
+// func (a complexAbs[T]) Abs() complexAbs[T] {
+//     r := float64(real(a))
+//     i := float64(imag(a))
+//     d := math.Sqrt(r*r + i*i)
+//     return complexAbs[T](complex(d, 0))
+// }
+//
+// // OrderedAbsDifference returns the absolute value of the difference
+// // between a and b, where a and b are of an ordered type.
+// func OrderedAbsDifference[T orderedNumeric](a, b T) T {
+//     return T(absDifference(orderedAbs[T](a), orderedAbs[T](b)))
+// }
+//
+// // ComplexAbsDifference returns the absolute value of the difference
+// // between a and b, where a and b are of a complex type.
+// func ComplexAbsDifference[T Complex](a, b T) T {
+//     return T(absDifference(complexAbs[T](a), complexAbs[T](b)))
+// }
index 8eefdbdf384939cc8dba4ca7307fc183c4f04491..c648013327d345d59c343db64b1f337860a81384 100644 (file)
@@ -4,26 +4,22 @@
 
 package main
 
-import (
-       "a"
-       "fmt"
-)
-
 func main() {
-       if got, want := a.OrderedAbsDifference(1.0, -2.0), 3.0; got != want {
-               panic(fmt.Sprintf("got = %v, want = %v", got, want))
-       }
-       if got, want := a.OrderedAbsDifference(-1.0, 2.0), 3.0; got != want {
-               panic(fmt.Sprintf("got = %v, want = %v", got, want))
-       }
-       if got, want := a.OrderedAbsDifference(-20, 15), 35; got != want {
-               panic(fmt.Sprintf("got = %v, want = %v", got, want))
-       }
-
-       if got, want := a.ComplexAbsDifference(5.0+2.0i, 2.0-2.0i), 5+0i; got != want {
-               panic(fmt.Sprintf("got = %v, want = %v", got, want))
-       }
-       if got, want := a.ComplexAbsDifference(2.0-2.0i, 5.0+2.0i), 5+0i; got != want {
-               panic(fmt.Sprintf("got = %v, want = %v", got, want))
-       }
+       // For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+       // if got, want := a.OrderedAbsDifference(1.0, -2.0), 3.0; got != want {
+       //      panic(fmt.Sprintf("got = %v, want = %v", got, want))
+       // }
+       // if got, want := a.OrderedAbsDifference(-1.0, 2.0), 3.0; got != want {
+       //      panic(fmt.Sprintf("got = %v, want = %v", got, want))
+       // }
+       // if got, want := a.OrderedAbsDifference(-20, 15), 35; got != want {
+       //      panic(fmt.Sprintf("got = %v, want = %v", got, want))
+       // }
+       //
+       // if got, want := a.ComplexAbsDifference(5.0+2.0i, 2.0-2.0i), 5+0i; got != want {
+       //      panic(fmt.Sprintf("got = %v, want = %v", got, want))
+       // }
+       // if got, want := a.ComplexAbsDifference(2.0-2.0i, 5.0+2.0i), 5+0i; got != want {
+       //      panic(fmt.Sprintf("got = %v, want = %v", got, want))
+       // }
 }
index 22f416422da426ea6552a6a801b1eb0d53c12fdb..a14eb544ce73d45fe3b386cf46f96c770b715654 100644 (file)
@@ -59,12 +59,13 @@ type Ints interface {
        ~int32 | ~int
 }
 
-type StringInt[T Ints] T
-
-//go:noinline
-func (m StringInt[T]) String() string {
-       return strconv.Itoa(int(m))
-}
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// type StringInt[T Ints] T
+//
+// //go:noinline
+// func (m StringInt[T]) String() string {
+//     return strconv.Itoa(int(m))
+// }
 
 type StringStruct[T Ints] struct {
        f T
@@ -84,22 +85,23 @@ func main() {
                panic(fmt.Sprintf("got %s, want %s", got, want))
        }
 
-       x2 := []StringInt[myint]{StringInt[myint](5), StringInt[myint](7), StringInt[myint](6)}
-
-       // stringify on an instantiated type, whose bound method is associated with
-       // the generic type StringInt[T], which maps directly to T.
-       got2 := stringify(x2)
-       want2 := []string{ "5", "7", "6" }
-       if !reflect.DeepEqual(got2, want2) {
-               panic(fmt.Sprintf("got %s, want %s", got2, want2))
-       }
+       // For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+       // x2 := []StringInt[myint]{StringInt[myint](5), StringInt[myint](7), StringInt[myint](6)}
+       //
+       // // stringify on an instantiated type, whose bound method is associated with
+       // // the generic type StringInt[T], which maps directly to T.
+       // got2 := stringify(x2)
+       // want2 := []string{"5", "7", "6"}
+       // if !reflect.DeepEqual(got2, want2) {
+       //      panic(fmt.Sprintf("got %s, want %s", got2, want2))
+       // }
 
        // stringify on an instantiated type, whose bound method is associated with
        // the generic type StringStruct[T], which maps to a struct containing T.
        x3 := []StringStruct[myint]{StringStruct[myint]{f: 11}, StringStruct[myint]{f: 10}, StringStruct[myint]{f: 9}}
 
        got3 := stringify(x3)
-       want3 := []string{ "11", "10", "9" }
+       want3 := []string{"11", "10", "9"}
        if !reflect.DeepEqual(got3, want3) {
                panic(fmt.Sprintf("got %s, want %s", got3, want3))
        }
index 261d6efb613deb1ac62378ef3fbcc846bf7ae0b9..35d57c8a64e0175c6c5bd1a086e168c646b903df 100644 (file)
@@ -6,35 +6,32 @@
 
 package main
 
-import (
-       "fmt"
-)
-
 type FooType[T any] interface {
-       Foo(BarType[T])string
+       Foo(BarType[T]) string
 }
 type BarType[T any] interface {
-       Bar(FooType[T])string
-}
-
-type Baz[T any] T
-func (l Baz[T]) Foo(v BarType[T]) string {
-       return v.Bar(l)
-}
-type Bob[T any] T
-func (l Bob[T]) Bar(v FooType[T]) string {
-       if v,ok := v.(Baz[T]);ok{
-               return fmt.Sprintf("%v%v",v,l)
-       }
-       return ""
+       Bar(FooType[T]) string
 }
 
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// type Baz[T any] T
+// func (l Baz[T]) Foo(v BarType[T]) string {
+//     return v.Bar(l)
+// }
+// type Bob[T any] T
+// func (l Bob[T]) Bar(v FooType[T]) string {
+//     if v,ok := v.(Baz[T]);ok{
+//             return fmt.Sprintf("%v%v",v,l)
+//     }
+//     return ""
+// }
 
 func main() {
-       var baz Baz[int] = 123
-       var bob Bob[int] = 456
-
-       if got, want := baz.Foo(bob), "123456"; got != want {
-               panic(fmt.Sprintf("got %s want %s", got, want))
-       }
+       // For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+       // var baz Baz[int] = 123
+       // var bob Bob[int] = 456
+       //
+       // if got, want := baz.Foo(bob), "123456"; got != want {
+       //      panic(fmt.Sprintf("got %s want %s", got, want))
+       // }
 }
index a8c6839de329576059543fc32276647a91184822..ea1168f4e62e048ec4c631544ed6b91651bdda56 100644 (file)
@@ -12,10 +12,11 @@ type Exp[Ty any] interface {
        Eval() Ty
 }
 
-type Lit[Ty any] Ty
-
-func (lit Lit[Ty]) Eval() Ty       { return Ty(lit) }
-func (lit Lit[Ty]) String() string { return fmt.Sprintf("(lit %v)", Ty(lit)) }
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// type Lit[Ty any] Ty
+//
+// func (lit Lit[Ty]) Eval() Ty       { return Ty(lit) }
+// func (lit Lit[Ty]) String() string { return fmt.Sprintf("(lit %v)", Ty(lit)) }
 
 type Eq[Ty any] struct {
        a Exp[Ty]
@@ -26,12 +27,14 @@ func (e Eq[Ty]) String() string {
        return fmt.Sprintf("(eq %v %v)", e.a, e.b)
 }
 
-var (
-       e0 = Eq[int]{Lit[int](128), Lit[int](64)}
-       e1 = Eq[bool]{Lit[bool](true), Lit[bool](true)}
-)
+// For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+// var (
+//     e0 = Eq[int]{Lit[int](128), Lit[int](64)}
+//     e1 = Eq[bool]{Lit[bool](true), Lit[bool](true)}
+// )
 
 func main() {
-       fmt.Printf("%v\n", e0)
-       fmt.Printf("%v\n", e1)
+       // For now, a lone type parameter is not permitted as RHS in a type declaration (issue #45639).
+       // fmt.Printf("%v\n", e0)
+       // fmt.Printf("%v\n", e1)
 }
index f23c310f66511d77da053b07fa97edb655845e09..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,2 +0,0 @@
-(eq (lit 128) (lit 64))
-(eq (lit true) (lit true))