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

     1  // Copyright 2010 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file
     4  
     5  package main
     6  
     7  import (
     8  	p0 "./bug0"
     9  	p1 "./bug1"
    10  
    11  	"reflect"
    12  	"strings"
    13  )
    14  
    15  var v0 p0.T
    16  var v1 p1.T
    17  
    18  type I0 interface {
    19  	M(p0.T)
    20  }
    21  
    22  type I1 interface {
    23  	M(p1.T)
    24  }
    25  
    26  type t0 int
    27  
    28  func (t0) M(p0.T) {}
    29  
    30  type t1 float64
    31  
    32  func (t1) M(p1.T) {}
    33  
    34  var i0 I0 = t0(0) // ok
    35  var i1 I1 = t1(0) // ok
    36  
    37  var p0i p0.I = t0(0) // ok
    38  var p1i p1.I = t1(0) // ok
    39  
    40  func main() {
    41  	// check that reflect paths are correct,
    42  	// meaning that reflect data for v0, v1 didn't get confused.
    43  
    44  	// path is full (rooted) path name.  check suffix for gc, prefix for gccgo
    45  	if s := reflect.TypeOf(v0).PkgPath(); !strings.HasSuffix(s, "/bug0") && !strings.HasPrefix(s, "bug0") {
    46  		println("bad v0 path", len(s), s)
    47  		panic("fail")
    48  	}
    49  	if s := reflect.TypeOf(v1).PkgPath(); !strings.HasSuffix(s, "/bug1") && !strings.HasPrefix(s, "bug1") {
    50  		println("bad v1 path", s)
    51  		panic("fail")
    52  	}
    53  
    54  	// check that dynamic interface check doesn't get confused
    55  	var i interface{} = t0(0)
    56  	if _, ok := i.(I1); ok {
    57  		println("used t0 as i1")
    58  		panic("fail")
    59  	}
    60  	if _, ok := i.(p1.I); ok {
    61  		println("used t0 as p1.I")
    62  		panic("fail")
    63  	}
    64  
    65  	i = t1(1)
    66  	if _, ok := i.(I0); ok {
    67  		println("used t1 as i0")
    68  		panic("fail")
    69  	}
    70  	if _, ok := i.(p0.I); ok {
    71  		println("used t1 as p0.I")
    72  		panic("fail")
    73  	}
    74  
    75  	// check that type switch works.
    76  	// the worry is that if p0.T and p1.T have the same hash,
    77  	// the binary search will handle one of them incorrectly.
    78  	for j := 0; j < 3; j++ {
    79  		switch j {
    80  		case 0:
    81  			i = p0.T{}
    82  		case 1:
    83  			i = p1.T{}
    84  		case 2:
    85  			i = 3.14
    86  		}
    87  		switch i.(type) {
    88  		case p0.T:
    89  			if j != 0 {
    90  				println("type switch p0.T")
    91  				panic("fail")
    92  			}
    93  		case p1.T:
    94  			if j != 1 {
    95  				println("type switch p1.T")
    96  				panic("fail")
    97  			}
    98  		default:
    99  			if j != 2 {
   100  				println("type switch default", j)
   101  				panic("fail")
   102  			}
   103  		}
   104  	}
   105  }