go/test/fixedbugs/bug248.dir/bug3.go
Yury Smolsky cb80c28961 test: eliminate use of Perl in test/fixedbugs/bug248.go
This change enables bug248 to be tested with Go code.
For that, it adds a flag -1 to error check and run directory
with one package failing compilation prior the last package
which should be run.

Specifically, the "p" package in bug1.go file was renamed into "q"
to compile them in separate steps,
bug2.go and bug3.go files were reordered,
bug2.go was changed into non-main package.

Updates #25586.

Change-Id: Ie47aacd56ebb2ce4eac66c792d1a53e1e30e637c
Reviewed-on: https://go-review.googlesource.com/114818
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2018-05-26 15:20:42 +00:00

106 lines
1.9 KiB
Go

// 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
package main
import (
p0 "./bug0"
p1 "./bug1"
"reflect"
"strings"
)
var v0 p0.T
var v1 p1.T
type I0 interface {
M(p0.T)
}
type I1 interface {
M(p1.T)
}
type t0 int
func (t0) M(p0.T) {}
type t1 float64
func (t1) M(p1.T) {}
var i0 I0 = t0(0) // ok
var i1 I1 = t1(0) // ok
var p0i p0.I = t0(0) // ok
var p1i p1.I = t1(0) // ok
func main() {
// check that reflect paths are correct,
// meaning that reflect data for v0, v1 didn't get confused.
// path is full (rooted) path name. check suffix for gc, prefix for gccgo
if s := reflect.TypeOf(v0).PkgPath(); !strings.HasSuffix(s, "/bug0") && !strings.HasPrefix(s, "bug0") {
println("bad v0 path", len(s), s)
panic("fail")
}
if s := reflect.TypeOf(v1).PkgPath(); !strings.HasSuffix(s, "/bug1") && !strings.HasPrefix(s, "bug1") {
println("bad v1 path", s)
panic("fail")
}
// check that dynamic interface check doesn't get confused
var i interface{} = t0(0)
if _, ok := i.(I1); ok {
println("used t0 as i1")
panic("fail")
}
if _, ok := i.(p1.I); ok {
println("used t0 as p1.I")
panic("fail")
}
i = t1(1)
if _, ok := i.(I0); ok {
println("used t1 as i0")
panic("fail")
}
if _, ok := i.(p0.I); ok {
println("used t1 as p0.I")
panic("fail")
}
// check that type switch works.
// the worry is that if p0.T and p1.T have the same hash,
// the binary search will handle one of them incorrectly.
for j := 0; j < 3; j++ {
switch j {
case 0:
i = p0.T{}
case 1:
i = p1.T{}
case 2:
i = 3.14
}
switch i.(type) {
case p0.T:
if j != 0 {
println("type switch p0.T")
panic("fail")
}
case p1.T:
if j != 1 {
println("type switch p1.T")
panic("fail")
}
default:
if j != 2 {
println("type switch default", j)
panic("fail")
}
}
}
}