Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / gcc / testsuite / go.test / test / fixedbugs / bug284.go
1 // errorcheck
2
3 // Copyright 2010 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 cases for revised conversion rules.
8
9 package main
10
11 func main() {
12         type NewInt int
13         i0 := 0
14         var i1 int = 1
15         var i2 NewInt = 1
16         i0 = i0
17         i0 = i1
18         i0 = int(i2)
19         i1 = i0
20         i1 = i1
21         i1 = int(i2)
22         i2 = NewInt(i0)
23         i2 = NewInt(i1)
24         i2 = i2
25
26         type A1 [3]int
27         type A2 [3]NewInt
28         var a0 [3]int
29         var a1 A1
30         var a2 A2
31         a0 = a0
32         a0 = a1
33         a0 = [3]int(a2) // ERROR "cannot|invalid"
34         a1 = a0
35         a1 = a1
36         a1 = A1(a2) // ERROR "cannot|invalid"
37         a2 = A2(a0) // ERROR "cannot|invalid"
38         a2 = A2(a1) // ERROR "cannot|invalid"
39         a2 = a2
40
41         type S1 struct {
42                 x int
43         }
44         type S2 struct {
45                 x NewInt
46         }
47         var s0 struct {
48                 x int
49         }
50         var s1 S1
51         var s2 S2
52         s0 = s0
53         s0 = s1
54         s0 = struct {
55                 x int
56         }(s2) // ERROR "cannot|invalid"
57         s1 = s0
58         s1 = s1
59         s1 = S1(s2) // ERROR "cannot|invalid"
60         s2 = S2(s0) // ERROR "cannot|invalid"
61         s2 = S2(s1) // ERROR "cannot|invalid"
62         s2 = s2
63
64         type P1 *int
65         type P2 *NewInt
66         var p0 *int
67         var p1 P1
68         var p2 P2
69         p0 = p0
70         p0 = p1
71         p0 = (*int)(p2) // ERROR "cannot|invalid"
72         p1 = p0
73         p1 = p1
74         p1 = P1(p2) // ERROR "cannot|invalid"
75         p2 = P2(p0) // ERROR "cannot|invalid"
76         p2 = P2(p1) // ERROR "cannot|invalid"
77         p2 = p2
78
79         type Q1 *struct {
80                 x int
81         }
82         type Q2 *S1
83         var q0 *struct {
84                 x int
85         }
86         var q1 Q1
87         var q2 Q2
88         var ps1 *S1
89         q0 = q0
90         q0 = q1
91         q0 = (*struct {
92                 x int
93         })(ps1) // legal because of special conversion exception for pointers
94         q0 = (*struct {
95                 x int
96         })(q2) // ERROR "cannot|invalid"
97         q1 = q0
98         q1 = q1
99         q1 = Q1(q2)    // ERROR "cannot|invalid"
100         q2 = (*S1)(q0) // legal because of special conversion exception for pointers
101         q2 = Q2(q1)    // ERROR "cannot|invalid"
102         q2 = q2
103
104         type F1 func(x NewInt) int
105         type F2 func(x int) NewInt
106         var f0 func(x NewInt) int
107         var f1 F1
108         var f2 F2
109         f0 = f0
110         f0 = f1
111         f0 = func(x NewInt) int(f2) // ERROR "cannot|invalid"
112         f1 = f0
113         f1 = f1
114         f1 = F1(f2) // ERROR "cannot|invalid"
115         f2 = F2(f0) // ERROR "cannot|invalid"
116         f2 = F2(f1) // ERROR "cannot|invalid"
117         f2 = f2
118
119         type X1 interface {
120                 f() int
121         }
122         type X2 interface {
123                 f() NewInt
124         }
125         var x0 interface {
126                 f() int
127         }
128         var x1 X1
129         var x2 X2
130         x0 = x0
131         x0 = x1
132         x0 = interface {
133                 f() int
134         }(x2) // ERROR "cannot|need type assertion|incompatible"
135         x1 = x0
136         x1 = x1
137         x1 = X1(x2) // ERROR "cannot|need type assertion|incompatible"
138         x2 = X2(x0) // ERROR "cannot|need type assertion|incompatible"
139         x2 = X2(x1) // ERROR "cannot|need type assertion|incompatible"
140         x2 = x2
141
142         type L1 []int
143         type L2 []NewInt
144         var l0 []int
145         var l1 L1
146         var l2 L2
147         l0 = l0
148         l0 = l1
149         l0 = []int(l2) // ERROR "cannot|invalid"
150         l1 = l0
151         l1 = l1
152         l1 = L1(l2) // ERROR "cannot|invalid"
153         l2 = L2(l0) // ERROR "cannot|invalid"
154         l2 = L2(l1) // ERROR "cannot|invalid"
155         l2 = l2
156
157         type M1 map[string]int
158         type M2 map[string]NewInt
159         var m0 []int
160         var m1 L1
161         var m2 L2
162         m0 = m0
163         m0 = m1
164         m0 = []int(m2) // ERROR "cannot|invalid"
165         m1 = m0
166         m1 = m1
167         m1 = L1(m2) // ERROR "cannot|invalid"
168         m2 = L2(m0) // ERROR "cannot|invalid"
169         m2 = L2(m1) // ERROR "cannot|invalid"
170         m2 = m2
171
172         type C1 chan int
173         type C2 chan NewInt
174         var c0 chan int
175         var c1 C1
176         var c2 C2
177         c0 = c0
178         c0 = c1
179         c0 = chan int(c2) // ERROR "cannot|invalid"
180         c1 = c0
181         c1 = c1
182         c1 = C1(c2) // ERROR "cannot|invalid"
183         c2 = C2(c0) // ERROR "cannot|invalid"
184         c2 = C2(c1) // ERROR "cannot|invalid"
185         c2 = c2
186
187         // internal compiler error (6g and gccgo)
188         type T interface{}
189         var _ T = 17 // assignment compatible
190         _ = T(17)    // internal compiler error even though assignment compatible
191 }