mirror of https://github.com/golang/go.git
misc/cgo/testplugin: test that types and itabs are unique
Make sure that the same type and itab generated in two different plugins are actually the same thing. See also CL 35115 Change-Id: I0c1ecb039d7e2bf5a601d58dfa162a435ae4ef76 Reviewed-on: https://go-review.googlesource.com/35116 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
parent
22689c4450
commit
4c4c5fc7a3
|
|
@ -0,0 +1,46 @@
|
||||||
|
// Copyright 2017 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 (
|
||||||
|
"iface_i"
|
||||||
|
"log"
|
||||||
|
"plugin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a, err := plugin.Open("iface_a.so")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(`plugin.Open("iface_a.so"): %v`, err)
|
||||||
|
}
|
||||||
|
b, err := plugin.Open("iface_b.so")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(`plugin.Open("iface_b.so"): %v`, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
af, err := a.Lookup("F")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(`a.Lookup("F") failed: %v`, err)
|
||||||
|
}
|
||||||
|
bf, err := b.Lookup("F")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(`b.Lookup("F") failed: %v`, err)
|
||||||
|
}
|
||||||
|
if af.(func() interface{})() != bf.(func() interface{})() {
|
||||||
|
panic("empty interfaces not equal")
|
||||||
|
}
|
||||||
|
|
||||||
|
ag, err := a.Lookup("G")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(`a.Lookup("G") failed: %v`, err)
|
||||||
|
}
|
||||||
|
bg, err := b.Lookup("G")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf(`b.Lookup("G") failed: %v`, err)
|
||||||
|
}
|
||||||
|
if ag.(func() iface_i.I)() != bg.(func() iface_i.I)() {
|
||||||
|
panic("nonempty interfaces not equal")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Copyright 2017 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 "iface_i"
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func F() interface{} {
|
||||||
|
return (*iface_i.T)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func G() iface_i.I {
|
||||||
|
return (*iface_i.T)(nil)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Copyright 2017 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 "iface_i"
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func F() interface{} {
|
||||||
|
return (*iface_i.T)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func G() iface_i.I {
|
||||||
|
return (*iface_i.T)(nil)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Copyright 2017 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 iface_i
|
||||||
|
|
||||||
|
type I interface {
|
||||||
|
M()
|
||||||
|
}
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *T) M() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// *T implements I
|
||||||
|
|
@ -15,8 +15,8 @@ goos=$(go env GOOS)
|
||||||
goarch=$(go env GOARCH)
|
goarch=$(go env GOARCH)
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
rm -f plugin*.so unnamed*.so
|
rm -f plugin*.so unnamed*.so iface*.so
|
||||||
rm -rf host pkg sub
|
rm -rf host pkg sub iface
|
||||||
}
|
}
|
||||||
trap cleanup EXIT
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
|
@ -32,3 +32,9 @@ GOPATH=$(pwd) go build -buildmode=plugin unnamed2.go
|
||||||
GOPATH=$(pwd) go build host
|
GOPATH=$(pwd) go build host
|
||||||
|
|
||||||
LD_LIBRARY_PATH=$(pwd) ./host
|
LD_LIBRARY_PATH=$(pwd) ./host
|
||||||
|
|
||||||
|
# Test that types and itabs get properly uniqified.
|
||||||
|
GOPATH=$(pwd) go build -buildmode=plugin iface_a
|
||||||
|
GOPATH=$(pwd) go build -buildmode=plugin iface_b
|
||||||
|
GOPATH=$(pwd) go build iface
|
||||||
|
LD_LIBRARY_PATH=$(pwd) ./iface
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue