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