modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/fixedbugs/bug284.go (about)

     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  }