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