blob: c500638929ac78bb5ac9c9249efd75a80900dcc9 [file] [log] [blame]
Dan Willemsenebae3022017-01-13 23:01:08 -08001// errorcheck
2
3// Copyright 2016 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// Test various valid and invalid struct assignments and conversions.
8// Does not compile.
9
10package main
11
12type I interface {
13 m()
14}
15
16// conversions between structs
17
18func _() {
19 type S struct{}
20 type T struct{}
21 var s S
22 var t T
23 var u struct{}
24 s = s
25 s = t // ERROR "cannot use .* in assignment"
26 s = u
27 s = S(s)
28 s = S(t)
29 s = S(u)
30 t = u
31 t = T(u)
32}
33
34func _() {
35 type S struct{ x int }
36 type T struct {
37 x int "foo"
38 }
39 var s S
40 var t T
41 var u struct {
42 x int "bar"
43 }
44 s = s
45 s = t // ERROR "cannot use .* in assignment"
46 s = u // ERROR "cannot use .* in assignment"
47 s = S(s)
48 s = S(t)
49 s = S(u)
50 t = u // ERROR "cannot use .* in assignment"
51 t = T(u)
52}
53
54func _() {
55 type E struct{ x int }
56 type S struct{ x E }
57 type T struct {
58 x E "foo"
59 }
60 var s S
61 var t T
62 var u struct {
63 x E "bar"
64 }
65 s = s
66 s = t // ERROR "cannot use .* in assignment"
67 s = u // ERROR "cannot use .* in assignment"
68 s = S(s)
69 s = S(t)
70 s = S(u)
71 t = u // ERROR "cannot use .* in assignment"
72 t = T(u)
73}
74
75func _() {
76 type S struct {
77 x struct {
78 x int "foo"
79 }
80 }
81 type T struct {
82 x struct {
83 x int "bar"
84 } "foo"
85 }
86 var s S
87 var t T
88 var u struct {
89 x struct {
90 x int "bar"
91 } "bar"
92 }
93 s = s
94 s = t // ERROR "cannot use .* in assignment"
95 s = u // ERROR "cannot use .* in assignment"
96 s = S(s)
97 s = S(t)
98 s = S(u)
99 t = u // ERROR "cannot use .* in assignment"
100 t = T(u)
101}
102
103func _() {
104 type E1 struct {
105 x int "foo"
106 }
107 type E2 struct {
108 x int "bar"
109 }
110 type S struct{ x E1 }
111 type T struct {
112 x E2 "foo"
113 }
114 var s S
115 var t T
116 var u struct {
117 x E2 "bar"
118 }
119 s = s
120 s = t // ERROR "cannot use .* in assignment"
121 s = u // ERROR "cannot use .* in assignment"
122 s = S(s)
123 s = S(t) // ERROR "cannot convert"
124 s = S(u) // ERROR "cannot convert"
125 t = u // ERROR "cannot use .* in assignment"
126 t = T(u)
127}
128
129func _() {
130 type E struct{ x int }
131 type S struct {
132 f func(struct {
133 x int "foo"
134 })
135 }
136 type T struct {
137 f func(struct {
138 x int "bar"
139 })
140 }
141 var s S
142 var t T
143 var u struct{ f func(E) }
144 s = s
145 s = t // ERROR "cannot use .* in assignment"
146 s = u // ERROR "cannot use .* in assignment"
147 s = S(s)
148 s = S(t)
149 s = S(u) // ERROR "cannot convert"
150 t = u // ERROR "cannot use .* in assignment"
151 t = T(u) // ERROR "cannot convert"
152}
153
154// conversions between pointers to structs
155
156func _() {
157 type S struct{}
158 type T struct{}
159 var s *S
160 var t *T
161 var u *struct{}
162 s = s
163 s = t // ERROR "cannot use .* in assignment"
164 s = u // ERROR "cannot use .* in assignment"
165 s = (*S)(s)
166 s = (*S)(t)
167 s = (*S)(u)
168 t = u // ERROR "cannot use .* in assignment"
169 t = (*T)(u)
170}
171
172func _() {
173 type S struct{ x int }
174 type T struct {
175 x int "foo"
176 }
177 var s *S
178 var t *T
179 var u *struct {
180 x int "bar"
181 }
182 s = s
183 s = t // ERROR "cannot use .* in assignment"
184 s = u // ERROR "cannot use .* in assignment"
185 s = (*S)(s)
186 s = (*S)(t)
187 s = (*S)(u)
188 t = u // ERROR "cannot use .* in assignment"
189 t = (*T)(u)
190}
191
192func _() {
193 type E struct{ x int }
194 type S struct{ x E }
195 type T struct {
196 x E "foo"
197 }
198 var s *S
199 var t *T
200 var u *struct {
201 x E "bar"
202 }
203 s = s
204 s = t // ERROR "cannot use .* in assignment"
205 s = u // ERROR "cannot use .* in assignment"
206 s = (*S)(s)
207 s = (*S)(t)
208 s = (*S)(u)
209 t = u // ERROR "cannot use .* in assignment"
210 t = (*T)(u)
211}
212
213func _() {
214 type S struct {
215 x struct {
216 x int "foo"
217 }
218 }
219 type T struct {
220 x struct {
221 x int "bar"
222 } "foo"
223 }
224 var s *S
225 var t *T
226 var u *struct {
227 x struct {
228 x int "bar"
229 } "bar"
230 }
231 s = s
232 s = t // ERROR "cannot use .* in assignment"
233 s = u // ERROR "cannot use .* in assignment"
234 s = (*S)(s)
235 s = (*S)(t)
236 s = (*S)(u)
237 t = u // ERROR "cannot use .* in assignment"
238 t = (*T)(u)
239}
240
241func _() {
242 type E1 struct {
243 x int "foo"
244 }
245 type E2 struct {
246 x int "bar"
247 }
248 type S struct{ x E1 }
249 type T struct {
250 x E2 "foo"
251 }
252 var s *S
253 var t *T
254 var u *struct {
255 x E2 "bar"
256 }
257 s = s
258 s = t // ERROR "cannot use .* in assignment"
259 s = u // ERROR "cannot use .* in assignment"
260 s = (*S)(s)
261 s = (*S)(t) // ERROR "cannot convert"
262 s = (*S)(u) // ERROR "cannot convert"
263 t = u // ERROR "cannot use .* in assignment"
264 t = (*T)(u)
265}
266
267func _() {
268 type E struct{ x int }
269 type S struct {
270 f func(struct {
271 x int "foo"
272 })
273 }
274 type T struct {
275 f func(struct {
276 x int "bar"
277 })
278 }
279 var s *S
280 var t *T
281 var u *struct{ f func(E) }
282 s = s
283 s = t // ERROR "cannot use .* in assignment"
284 s = u // ERROR "cannot use .* in assignment"
285 s = (*S)(s)
286 s = (*S)(t)
287 s = (*S)(u) // ERROR "cannot convert"
288 t = u // ERROR "cannot use .* in assignment"
289 t = (*T)(u) // ERROR "cannot convert"
290}
291
292func _() {
293 type E struct{ x int }
294 type S struct {
295 f func(*struct {
296 x int "foo"
297 })
298 }
299 type T struct {
300 f func(*struct {
301 x int "bar"
302 })
303 }
304 var s *S
305 var t *T
306 var u *struct{ f func(E) }
307 s = s
308 s = t // ERROR "cannot use .* in assignment"
309 s = u // ERROR "cannot use .* in assignment"
310 s = (*S)(s)
311 s = (*S)(t)
312 s = (*S)(u) // ERROR "cannot convert"
313 t = u // ERROR "cannot use .* in assignment"
314 t = (*T)(u) // ERROR "cannot convert"
315}