]> Cypherpunks.ru repositories - gostls13.git/blob - src/internal/types/testdata/spec/range.go
8547ed343a6e74e029f6f61decbaf8c5a267db93
[gostls13.git] / src / internal / types / testdata / spec / range.go
1 // -goexperiment=range
2
3 // Copyright 2023 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
6
7 package p
8
9 type MyInt int32
10 type MyBool bool
11 type MyString string
12 type MyFunc1 func(func(int) bool)
13 type MyFunc2 func(int) bool
14 type MyFunc3 func(MyFunc2)
15
16 type T struct{}
17
18 func (*T) PM() {}
19 func (T) M()   {}
20
21 func f1()                             {}
22 func f2(func())                       {}
23 func f4(func(int) bool)               {}
24 func f5(func(int, string) bool)       {}
25 func f7(func(int) MyBool)             {}
26 func f8(func(MyInt, MyString) MyBool) {}
27
28 func test() {
29         // TODO: Would be nice to 'for range T.M' and 'for range (*T).PM' directly,
30         // but there is no gofmt-friendly way to write the error pattern in the right place.
31         m1 := T.M
32         for range m1 /* ERROR "cannot range over m1 (variable of type func(T)): func must be func(yield func(...) bool): argument is not func" */ {
33         }
34         m2 := (*T).PM
35         for range m2 /* ERROR "cannot range over m2 (variable of type func(*T)): func must be func(yield func(...) bool): argument is not func" */ {
36         }
37         for range f1 /* ERROR "cannot range over f1 (value of type func()): func must be func(yield func(...) bool): wrong argument count" */ {
38         }
39         for range f2 /* ERROR "cannot range over f2 (value of type func(func())): func must be func(yield func(...) bool): yield func does not return bool" */ {
40         }
41         for range f4 /* ERROR "range over f4 (value of type func(func(int) bool)) must have one iteration variable" */ {
42         }
43         for _ = range f4 {
44         }
45         for _, _ = range f5 {
46         }
47         for _ = range f7 {
48         }
49         for _, _ = range f8 {
50         }
51         for range 1 {
52         }
53         for range uint8(1) {
54         }
55         for range int64(1) {
56         }
57         for range MyInt(1) {
58         }
59         for range 'x' {
60         }
61         for range 1.0 /* ERROR "cannot range over 1.0 (untyped float constant 1)" */ {
62         }
63         for _ = range MyFunc1(nil) {
64         }
65         for _ = range MyFunc3(nil) {
66         }
67         for _ = range (func(MyFunc2))(nil) {
68         }
69
70         var i int
71         var s string
72         var mi MyInt
73         var ms MyString
74         for i := range f4 {
75                 _ = i
76         }
77         for i = range f4 {
78                 _ = i
79         }
80         for i, s := range f5 {
81                 _, _ = i, s
82         }
83         for i, s = range f5 {
84                 _, _ = i, s
85         }
86         for i, _ := range f5 {
87                 _ = i
88         }
89         for i, _ = range f5 {
90                 _ = i
91         }
92         for i := range f7 {
93                 _ = i
94         }
95         for i = range f7 {
96                 _ = i
97         }
98         for mi, _ := range f8 {
99                 _ = mi
100         }
101         for mi, _ = range f8 {
102                 _ = mi
103         }
104         for mi, ms := range f8 {
105                 _, _ = mi, ms
106         }
107         for i /* ERROR "cannot use i (value of type MyInt) as int value in assignment" */, s /* ERROR "cannot use s (value of type MyString) as string value in assignment" */ = range f8 {
108                 _, _ = mi, ms
109         }
110         for mi, ms := range f8 {
111                 i, s = mi /* ERROR "cannot use mi (variable of type MyInt) as int value in assignment" */, ms /* ERROR "cannot use ms (variable of type MyString) as string value in assignment" */
112         }
113         for mi, ms = range f8 {
114                 _, _ = mi, ms
115         }
116
117         for i := range 10 {
118                 _ = i
119         }
120         for i = range 10 {
121                 _ = i
122         }
123         for i, j /* ERROR "range over 10 (untyped int constant) permits only one iteration variable" */ := range 10 {
124                 _, _ = i, j
125         }
126         for mi := range MyInt(10) {
127                 _ = mi
128         }
129         for mi = range MyInt(10) {
130                 _ = mi
131         }
132 }
133
134 func _[T int | string](x T) {
135         for range x /* ERROR "cannot range over x (variable of type T constrained by int | string): no core type" */ {
136         }
137 }
138
139 func _[T int | int64](x T) {
140         for range x /* ERROR "cannot range over x (variable of type T constrained by int | int64): no core type" */ {
141         }
142 }
143
144 func _[T ~int](x T) {
145         for range x { // ok
146         }
147 }
148
149 func _[T any](x func(func(T) bool)) {
150         for _ = range x { // ok
151         }
152 }
153
154 func _[T ~func(func(int) bool)](x T) {
155         for _ = range x { // ok
156         }
157 }