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