// $G $D/$F.go && $L $F.$A && ./$A.out // 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 type Element interface { } type Vector struct { nelem int; elem *[]Element; } func New() *Vector { v := new(Vector); v.nelem = 0; v.elem = new([10]Element); return v; } func (v *Vector) At(i int) Element { return v.elem[i]; } func (v *Vector) Insert(e Element) { v.elem[v.nelem] = e; v.nelem++; } type I struct { val int; }; // BUG: can't be local; func main() { i0 := new(I); i0.val = 0; i1 := new(I); i1.val = 11; i2 := new(I); i2.val = 222; i3 := new(I); i3.val = 3333; i4 := new(I); i4.val = 44444; v := New(); print "hi\n"; v.Insert(i4); v.Insert(i3); v.Insert(i2); v.Insert(i1); v.Insert(i0); for i := 0; i < v.nelem; i++ { var x *I; x = v.At(i); print i, " ", x.val, "\n"; // prints correct list } for i := 0; i < v.nelem; i++ { print i, " ", I(v.At(i)).val, "\n"; // always prints 5 - bad code - should be *I() } } /* bug027.go:50: illegal types for operand (I{}) CONV ({}) bug027.go:50: illegal types for operand (I{}) CONV ({}) */