github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/test/fixedbugs/bug324.dir/prog.go (about)

     1  // Copyright 2011 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  	"./p"
     9  )
    10  
    11  type Exported interface {
    12  	private()
    13  }
    14  
    15  type Implementation struct{}
    16  
    17  func (p *Implementation) private() {}
    18  
    19  
    20  func main() {
    21  	// nothing unusual here
    22  	var x Exported
    23  	x = new(Implementation)
    24  	x.private()  //  main.Implementation.private()
    25  
    26  	// same here - should be and is legal
    27  	var px p.Exported
    28  	px = p.X
    29  	
    30  	// this assignment is correctly illegal:
    31  	//	px.private undefined (cannot refer to unexported field or method private)
    32  	// px.private()
    33  
    34  	// this assignment is correctly illegal:
    35  	//	*Implementation does not implement p.Exported (missing p.private method)
    36  	// px = new(Implementation)
    37  
    38  	// this assignment is correctly illegal:
    39  	//	p.Exported does not implement Exported (missing private method)
    40  	// x = px
    41  
    42  	// this assignment unexpectedly compiles and then executes
    43  	defer func() {
    44  		recover()
    45  	}()
    46  	x = px.(Exported)
    47  	
    48  	println("should not get this far")
    49  
    50  	// this is a legitimate call, but because of the previous assignment,
    51  	// it invokes the method private in p!
    52  	x.private()  // p.Implementation.private()
    53  }