// 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 }