|  | // errorcheck -0 -d=ssa/opt/debug=3 | 
|  |  | 
|  | package main | 
|  |  | 
|  | // Trivial interface call devirtualization test. | 
|  |  | 
|  | type real struct { | 
|  | value int | 
|  | } | 
|  |  | 
|  | func (r *real) Value() int { return r.value } | 
|  |  | 
|  | type Valuer interface { | 
|  | Value() int | 
|  | } | 
|  |  | 
|  | type indirectiface struct { | 
|  | a, b, c int | 
|  | } | 
|  |  | 
|  | func (i indirectiface) Value() int { | 
|  | return i.a + i.b + i.c | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | var r Valuer | 
|  | rptr := &real{value: 3} | 
|  | r = rptr | 
|  |  | 
|  | if r.Value() != 3 { // ERROR "de-virtualizing call$" | 
|  | panic("not 3") | 
|  | } | 
|  |  | 
|  | // Can't do types that aren't "direct" interfaces (yet). | 
|  | r = indirectiface{3, 4, 5} | 
|  | if r.Value() != 12 { | 
|  | panic("not 12") | 
|  | } | 
|  | } |