Home | History | Annotate | Download | only in fixedbugs
      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 }
    192