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