|  | // run | 
|  |  | 
|  | // Copyright 2009 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. | 
|  |  | 
|  | // Test Implicit methods for embedded types and | 
|  | // mixed pointer and non-pointer receivers. | 
|  |  | 
|  | package main | 
|  |  | 
|  | type T int | 
|  |  | 
|  | var nv, np int | 
|  |  | 
|  | func (t T) V() { | 
|  | if t != 42 { | 
|  | panic(t) | 
|  | } | 
|  | nv++ | 
|  | } | 
|  |  | 
|  | func (t *T) P() { | 
|  | if *t != 42 { | 
|  | println(t, *t) | 
|  | panic("fail") | 
|  | } | 
|  | np++ | 
|  | } | 
|  |  | 
|  | type V interface { | 
|  | V() | 
|  | } | 
|  | type P interface { | 
|  | P() | 
|  | V() | 
|  | } | 
|  |  | 
|  | type S struct { | 
|  | T | 
|  | } | 
|  |  | 
|  | type SP struct { | 
|  | *T | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | var t T | 
|  | var v V | 
|  | var p P | 
|  |  | 
|  | t = 42 | 
|  |  | 
|  | t.P() | 
|  | t.V() | 
|  |  | 
|  | v = t | 
|  | v.V() | 
|  |  | 
|  | p = &t | 
|  | p.P() | 
|  | p.V() | 
|  |  | 
|  | v = &t | 
|  | v.V() | 
|  |  | 
|  | //	p = t	// ERROR | 
|  | var i interface{} = t | 
|  | if _, ok := i.(P); ok { | 
|  | println("dynamic i.(P) succeeded incorrectly") | 
|  | panic("fail") | 
|  | } | 
|  |  | 
|  | //	println("--struct--"); | 
|  | var s S | 
|  | s.T = 42 | 
|  | s.P() | 
|  | s.V() | 
|  |  | 
|  | v = s | 
|  | s.V() | 
|  |  | 
|  | p = &s | 
|  | p.P() | 
|  | p.V() | 
|  |  | 
|  | v = &s | 
|  | v.V() | 
|  |  | 
|  | //	p = s	// ERROR | 
|  | var j interface{} = s | 
|  | if _, ok := j.(P); ok { | 
|  | println("dynamic j.(P) succeeded incorrectly") | 
|  | panic("fail") | 
|  | } | 
|  |  | 
|  | //	println("--struct pointer--"); | 
|  | var sp SP | 
|  | sp.T = &t | 
|  | sp.P() | 
|  | sp.V() | 
|  |  | 
|  | v = sp | 
|  | sp.V() | 
|  |  | 
|  | p = &sp | 
|  | p.P() | 
|  | p.V() | 
|  |  | 
|  | v = &sp | 
|  | v.V() | 
|  |  | 
|  | p = sp // not error | 
|  | p.P() | 
|  | p.V() | 
|  |  | 
|  | if nv != 13 || np != 7 { | 
|  | println("bad count", nv, np) | 
|  | panic("fail") | 
|  | } | 
|  | } |