mirror of
https://github.com/golang/go
synced 2024-11-20 05:44:44 -07:00
3dbf65871c
Failing at compile time requires that for each conversion between two interface types the compiler compare the sets of unexported methods to see if they come from different packages. Since this test will fail approximately never on real code, and since it can't catch all cases of the problem, I don't think it's worth testing in the compiler. This CL changes this test to look for a run-time panic rather than a compile-time error. R=gri, rsc1, iant2, rsc CC=golang-dev https://golang.org/cl/4332041
49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
// Copyright 2011 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 (
|
|
"./p"
|
|
)
|
|
|
|
type Exported interface {
|
|
private()
|
|
}
|
|
|
|
type Implementation struct{}
|
|
|
|
func (p *Implementation) private() { println("main.Implementation.private()") }
|
|
|
|
|
|
func main() {
|
|
// nothing unusual here
|
|
var x Exported
|
|
x = new(Implementation)
|
|
x.private() // main.Implementation.private()
|
|
|
|
// same here - should be and is legal
|
|
var px p.Exported
|
|
px = p.X
|
|
|
|
// this assignment is correctly illegal:
|
|
// px.private undefined (cannot refer to unexported field or method private)
|
|
// px.private()
|
|
|
|
// this assignment is correctly illegal:
|
|
// *Implementation does not implement p.Exported (missing p.private method)
|
|
// px = new(Implementation)
|
|
|
|
// this assignment is correctly illegal:
|
|
// p.Exported does not implement Exported (missing private method)
|
|
// x = px
|
|
|
|
// this assignment unexpectedly compiles and then executes
|
|
x = px.(Exported)
|
|
|
|
// this is a legitimate call, but because of the previous assignment,
|
|
// it invokes the method private in p!
|
|
x.private() // p.Implementation.private()
|
|
}
|