Merge from mainline (167278:168000).
[official-gcc/graphite-test-results.git] / gcc / testsuite / go.test / test / fixedbugs / bug284.go
blobbcf161e3de4e69cc8f8e31605f7c76bb4fa14c0a
1 // errchk $G -e $D/$F.go
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.
7 // Test cases for revised conversion rules.
9 package main
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
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
41 type S1 struct {
42 x int
44 type S2 struct {
45 x NewInt
47 var s0 struct {
48 x int
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
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
79 type Q1 *struct {
80 x int
82 type Q2 *S1
83 var q0 *struct {
84 x int
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
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
119 type X1 interface {
120 f() int
122 type X2 interface {
123 f() NewInt
125 var x0 interface {
126 f() int
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
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
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
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
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