1// errorcheck
2
3// Copyright 2009 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// Verify assignment rules are enforced by the compiler.
8// Does not compile.
9
10package main
11
12type (
13	A [10]int
14	B []int
15	C chan int
16	F func() int
17	I interface {
18		m() int
19	}
20	M map[int]int
21	P *int
22	S struct {
23		X int
24	}
25
26	A1 [10]int
27	B1 []int
28	C1 chan int
29	F1 func() int
30	I1 interface {
31		m() int
32	}
33	M1 map[int]int
34	P1 *int
35	S1 struct {
36		X int
37	}
38)
39
40var (
41	a0 [10]int
42	b0 []int
43	c0 chan int
44	f0 func() int
45	i0 interface {
46		m() int
47	}
48	m0 map[int]int
49	p0 *int
50	s0 struct {
51		X int
52	}
53
54	a A
55	b B
56	c C
57	f F
58	i I
59	m M
60	p P
61	s S
62
63	a1 A1
64	b1 B1
65	c1 C1
66	f1 F1
67	i1 I1
68	m1 M1
69	p1 P1
70	s1 S1
71
72	pa0 *[10]int
73	pb0 *[]int
74	pc0 *chan int
75	pf0 *func() int
76	pi0 *interface {
77		m() int
78	}
79	pm0 *map[int]int
80	pp0 **int
81	ps0 *struct {
82		X int
83	}
84
85	pa *A
86	pb *B
87	pc *C
88	pf *F
89	pi *I
90	pm *M
91	pp *P
92	ps *S
93
94	pa1 *A1
95	pb1 *B1
96	pc1 *C1
97	pf1 *F1
98	pi1 *I1
99	pm1 *M1
100	pp1 *P1
101	ps1 *S1
102)
103
104func main() {
105	a0 = a
106	a0 = a1
107	a = a0
108	a = a1 // ERROR "cannot use"
109	a1 = a0
110	a1 = a // ERROR "cannot use"
111
112	b0 = b
113	b0 = b1
114	b = b0
115	b = b1 // ERROR "cannot use"
116	b1 = b0
117	b1 = b // ERROR "cannot use"
118
119	c0 = c
120	c0 = c1
121	c = c0
122	c = c1 // ERROR "cannot use"
123	c1 = c0
124	c1 = c // ERROR "cannot use"
125
126	f0 = f
127	f0 = f1
128	f = f0
129	f = f1 // ERROR "cannot use"
130	f1 = f0
131	f1 = f // ERROR "cannot use"
132
133	i0 = i
134	i0 = i1
135	i = i0
136	i = i1
137	i1 = i0
138	i1 = i
139
140	m0 = m
141	m0 = m1
142	m = m0
143	m = m1 // ERROR "cannot use"
144	m1 = m0
145	m1 = m // ERROR "cannot use"
146
147	p0 = p
148	p0 = p1
149	p = p0
150	p = p1 // ERROR "cannot use"
151	p1 = p0
152	p1 = p // ERROR "cannot use"
153
154	s0 = s
155	s0 = s1
156	s = s0
157	s = s1 // ERROR "cannot use"
158	s1 = s0
159	s1 = s // ERROR "cannot use"
160
161	pa0 = pa  // ERROR "cannot use|incompatible"
162	pa0 = pa1 // ERROR "cannot use|incompatible"
163	pa = pa0  // ERROR "cannot use|incompatible"
164	pa = pa1  // ERROR "cannot use|incompatible"
165	pa1 = pa0 // ERROR "cannot use|incompatible"
166	pa1 = pa  // ERROR "cannot use|incompatible"
167
168	pb0 = pb  // ERROR "cannot use|incompatible"
169	pb0 = pb1 // ERROR "cannot use|incompatible"
170	pb = pb0  // ERROR "cannot use|incompatible"
171	pb = pb1  // ERROR "cannot use|incompatible"
172	pb1 = pb0 // ERROR "cannot use|incompatible"
173	pb1 = pb  // ERROR "cannot use|incompatible"
174
175	pc0 = pc  // ERROR "cannot use|incompatible"
176	pc0 = pc1 // ERROR "cannot use|incompatible"
177	pc = pc0  // ERROR "cannot use|incompatible"
178	pc = pc1  // ERROR "cannot use|incompatible"
179	pc1 = pc0 // ERROR "cannot use|incompatible"
180	pc1 = pc  // ERROR "cannot use|incompatible"
181
182	pf0 = pf  // ERROR "cannot use|incompatible"
183	pf0 = pf1 // ERROR "cannot use|incompatible"
184	pf = pf0  // ERROR "cannot use|incompatible"
185	pf = pf1  // ERROR "cannot use|incompatible"
186	pf1 = pf0 // ERROR "cannot use|incompatible"
187	pf1 = pf  // ERROR "cannot use|incompatible"
188
189	pi0 = pi  // ERROR "cannot use|incompatible"
190	pi0 = pi1 // ERROR "cannot use|incompatible"
191	pi = pi0  // ERROR "cannot use|incompatible"
192	pi = pi1  // ERROR "cannot use|incompatible"
193	pi1 = pi0 // ERROR "cannot use|incompatible"
194	pi1 = pi  // ERROR "cannot use|incompatible"
195
196	pm0 = pm  // ERROR "cannot use|incompatible"
197	pm0 = pm1 // ERROR "cannot use|incompatible"
198	pm = pm0  // ERROR "cannot use|incompatible"
199	pm = pm1  // ERROR "cannot use|incompatible"
200	pm1 = pm0 // ERROR "cannot use|incompatible"
201	pm1 = pm  // ERROR "cannot use|incompatible"
202
203	pp0 = pp  // ERROR "cannot use|incompatible"
204	pp0 = pp1 // ERROR "cannot use|incompatible"
205	pp = pp0  // ERROR "cannot use|incompatible"
206	pp = pp1  // ERROR "cannot use|incompatible"
207	pp1 = pp0 // ERROR "cannot use|incompatible"
208	pp1 = pp  // ERROR "cannot use|incompatible"
209
210	ps0 = ps  // ERROR "cannot use|incompatible"
211	ps0 = ps1 // ERROR "cannot use|incompatible"
212	ps = ps0  // ERROR "cannot use|incompatible"
213	ps = ps1  // ERROR "cannot use|incompatible"
214	ps1 = ps0 // ERROR "cannot use|incompatible"
215	ps1 = ps  // ERROR "cannot use|incompatible"
216
217
218	a0 = [10]int(a)
219	a0 = [10]int(a1)
220	a = A(a0)
221	a = A(a1)
222	a1 = A1(a0)
223	a1 = A1(a)
224
225	b0 = []int(b)
226	b0 = []int(b1)
227	b = B(b0)
228	b = B(b1)
229	b1 = B1(b0)
230	b1 = B1(b)
231
232	c0 = chan int(c)
233	c0 = chan int(c1)
234	c = C(c0)
235	c = C(c1)
236	c1 = C1(c0)
237	c1 = C1(c)
238
239	f0 = func() int(f)
240	f0 = func() int(f1)
241	f = F(f0)
242	f = F(f1)
243	f1 = F1(f0)
244	f1 = F1(f)
245
246	i0 = interface {
247		m() int
248	}(i)
249	i0 = interface {
250		m() int
251	}(i1)
252	i = I(i0)
253	i = I(i1)
254	i1 = I1(i0)
255	i1 = I1(i)
256
257	m0 = map[int]int(m)
258	m0 = map[int]int(m1)
259	m = M(m0)
260	m = M(m1)
261	m1 = M1(m0)
262	m1 = M1(m)
263
264	p0 = (*int)(p)
265	p0 = (*int)(p1)
266	p = P(p0)
267	p = P(p1)
268	p1 = P1(p0)
269	p1 = P1(p)
270
271	s0 = struct {
272		X int
273	}(s)
274	s0 = struct {
275		X int
276	}(s1)
277	s = S(s0)
278	s = S(s1)
279	s1 = S1(s0)
280	s1 = S1(s)
281
282	pa0 = (*[10]int)(pa)
283	pa0 = (*[10]int)(pa1)
284	pa = (*A)(pa0)
285	pa = (*A)(pa1)
286	pa1 = (*A1)(pa0)
287	pa1 = (*A1)(pa)
288
289	pb0 = (*[]int)(pb)
290	pb0 = (*[]int)(pb1)
291	pb = (*B)(pb0)
292	pb = (*B)(pb1)
293	pb1 = (*B1)(pb0)
294	pb1 = (*B1)(pb)
295
296	pc0 = (*chan int)(pc)
297	pc0 = (*chan int)(pc1)
298	pc = (*C)(pc0)
299	pc = (*C)(pc1)
300	pc1 = (*C1)(pc0)
301	pc1 = (*C1)(pc)
302
303	pf0 = (*func() int)(pf)
304	pf0 = (*func() int)(pf1)
305	pf = (*F)(pf0)
306	pf = (*F)(pf1)
307	pf1 = (*F1)(pf0)
308	pf1 = (*F1)(pf)
309
310	pi0 = (*interface {
311		m() int
312	})(pi)
313	pi0 = (*interface {
314		m() int
315	})(pi1)
316	pi = (*I)(pi0)
317	pi = (*I)(pi1)
318	pi1 = (*I1)(pi0)
319	pi1 = (*I1)(pi)
320
321	pm0 = (*map[int]int)(pm)
322	pm0 = (*map[int]int)(pm1)
323	pm = (*M)(pm0)
324	pm = (*M)(pm1)
325	pm1 = (*M1)(pm0)
326	pm1 = (*M1)(pm)
327
328	pp0 = (**int)(pp)
329	pp0 = (**int)(pp1)
330	pp = (*P)(pp0)
331	pp = (*P)(pp1)
332	pp1 = (*P1)(pp0)
333	pp1 = (*P1)(pp)
334
335	ps0 = (*struct {
336		X int
337	})(ps)
338	ps0 = (*struct {
339		X int
340	})(ps1)
341	ps = (*S)(ps0)
342	ps = (*S)(ps1)
343	ps1 = (*S1)(ps0)
344	ps1 = (*S1)(ps)
345
346}
347