| // 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. | |
| package main | |
| // Interface | |
| type I interface { F() int } | |
| // Implements interface | |
| type S struct { } | |
| func (s *S) F() int { return 1 } | |
| // Allocates S but returns I | |
| // Arg is unused but important: | |
| // if you take it out (and the 0s below) | |
| // then the bug goes away. | |
| func NewI(i int) I { | |
| return new(S) | |
| } | |
| // Uses interface method. | |
| func Use(x I) { | |
| x.F() | |
| } | |
| func main() { | |
| i := NewI(0); | |
| Use(i); | |
| // Again, without temporary | |
| // Crashes because x.F is 0. | |
| Use(NewI(0)); | |
| } | |