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

     1  // run
     2  
     3  // Copyright 2010 The Go Authors.  All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Test case for issue 849.
     8  
     9  package main
    10  
    11  type I interface {
    12  	f()
    13  }
    14  
    15  var callee string
    16  var error_ bool
    17  
    18  type T int
    19  
    20  func (t *T) f() { callee = "f" }
    21  func (i *T) g() { callee = "g" }
    22  
    23  // test1 and test2 are the same except that in the interface J
    24  // the entries are swapped. test2 and test3 are the same except
    25  // that in test3 the interface J is declared outside the function.
    26  //
    27  // Error: test2 calls g instead of f
    28  
    29  func test1(x I) {
    30  	type J interface {
    31  		I
    32  		g()
    33  	}
    34  	x.(J).f()
    35  	if callee != "f" {
    36  		println("test1 called", callee)
    37  		error_ = true
    38  	}
    39  }
    40  
    41  func test2(x I) {
    42  	type J interface {
    43  		g()
    44  		I
    45  	}
    46  	x.(J).f()
    47  	if callee != "f" {
    48  		println("test2 called", callee)
    49  		error_ = true
    50  	}
    51  }
    52  
    53  type J interface {
    54  	g()
    55  	I
    56  }
    57  
    58  func test3(x I) {
    59  	x.(J).f()
    60  	if callee != "f" {
    61  		println("test3 called", callee)
    62  		error_ = true
    63  	}
    64  }
    65  
    66  func main() {
    67  	x := new(T)
    68  	test1(x)
    69  	test2(x)
    70  	test3(x)
    71  	if error_ {
    72  		panic("wrong method called")
    73  	}
    74  }
    75  
    76  /*
    77  6g bug286.go && 6l bug286.6 && 6.out
    78  test2 called g
    79  panic: wrong method called
    80  
    81  panic PC=0x24e040
    82  runtime.panic+0x7c /home/gri/go1/src/pkg/runtime/proc.c:1012
    83  	runtime.panic(0x0, 0x24e0a0)
    84  main.main+0xef /home/gri/go1/test/bugs/bug286.go:76
    85  	main.main()
    86  mainstart+0xf /home/gri/go1/src/pkg/runtime/amd64/asm.s:60
    87  	mainstart()
    88  goexit /home/gri/go1/src/pkg/runtime/proc.c:145
    89  	goexit()
    90  */