| // 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") | 
 | 	} | 
 | } |