1// 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|incompatible type"
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|incompatible type"
46	s = u // ERROR "cannot use .* in assignment|incompatible type"
47	s = S(s)
48	s = S(t)
49	s = S(u)
50	t = u // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
67	s = u // ERROR "cannot use .* in assignment|incompatible type"
68	s = S(s)
69	s = S(t)
70	s = S(u)
71	t = u // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
95	s = u // ERROR "cannot use .* in assignment|incompatible type"
96	s = S(s)
97	s = S(t)
98	s = S(u)
99	t = u // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
121	s = u // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
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|incompatible type"
146	s = u // ERROR "cannot use .* in assignment|incompatible type"
147	s = S(s)
148	s = S(t)
149	s = S(u) // ERROR "cannot convert"
150	t = u    // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
164	s = u // ERROR "cannot use .* in assignment|incompatible type"
165	s = (*S)(s)
166	s = (*S)(t)
167	s = (*S)(u)
168	t = u // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
184	s = u // ERROR "cannot use .* in assignment|incompatible type"
185	s = (*S)(s)
186	s = (*S)(t)
187	s = (*S)(u)
188	t = u // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
205	s = u // ERROR "cannot use .* in assignment|incompatible type"
206	s = (*S)(s)
207	s = (*S)(t)
208	s = (*S)(u)
209	t = u // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
233	s = u // ERROR "cannot use .* in assignment|incompatible type"
234	s = (*S)(s)
235	s = (*S)(t)
236	s = (*S)(u)
237	t = u // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
259	s = u // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
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|incompatible type"
284	s = u // ERROR "cannot use .* in assignment|incompatible type"
285	s = (*S)(s)
286	s = (*S)(t)
287	s = (*S)(u) // ERROR "cannot convert"
288	t = u       // ERROR "cannot use .* in assignment|incompatible type"
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|incompatible type"
309	s = u // ERROR "cannot use .* in assignment|incompatible type"
310	s = (*S)(s)
311	s = (*S)(t)
312	s = (*S)(u) // ERROR "cannot convert"
313	t = u       // ERROR "cannot use .* in assignment|incompatible type"
314	t = (*T)(u) // ERROR "cannot convert"
315}
316
317func _() {
318	var s []byte
319	_ = ([4]byte)(s) // ERROR "cannot convert"
320	_ = (*[4]byte)(s)
321
322	type A [4]byte
323	_ = (A)(s) // ERROR "cannot convert"
324	_ = (*A)(s)
325
326	type P *[4]byte
327	_ = (P)(s)
328	_ = (*P)(s) // ERROR "cannot convert"
329}
330