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