|  | // 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 methods derived from embedded interface values. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import "os" | 
|  |  | 
|  | const Value = 1e12 | 
|  |  | 
|  | type Inter interface { M() int64 } | 
|  |  | 
|  | type T int64 | 
|  | func (t T) M() int64 { return int64(t) } | 
|  | var t = T(Value) | 
|  | var pt = &t | 
|  | var ti Inter = t | 
|  |  | 
|  | type S struct { Inter } | 
|  | var s = S{ ti } | 
|  | var ps = &s | 
|  |  | 
|  | var i Inter | 
|  |  | 
|  | var ok = true | 
|  |  | 
|  | func check(s string, v int64) { | 
|  | if v != Value { | 
|  | println(s, v) | 
|  | ok = false | 
|  | } | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | check("t.M()", t.M()) | 
|  | check("pt.M()", pt.M()) | 
|  | check("ti.M()", ti.M()) | 
|  | check("s.M()", s.M()) | 
|  | check("ps.M()", ps.M()) | 
|  |  | 
|  | i = t | 
|  | check("i = t; i.M()", i.M()) | 
|  |  | 
|  | i = pt | 
|  | check("i = pt; i.M()", i.M()) | 
|  |  | 
|  | i = s | 
|  | check("i = s; i.M()", i.M()) | 
|  |  | 
|  | i = ps | 
|  | check("i = ps; i.M()", i.M()) | 
|  |  | 
|  | if !ok { | 
|  | println("BUG: interface10") | 
|  | os.Exit(1) | 
|  | } | 
|  | } |