1// run
2
3// Copyright 2009 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7package main
8
9import "fmt"
10
11type Element interface {
12}
13
14type Vector struct {
15	nelem int
16	elem  []Element
17}
18
19func New() *Vector {
20	v := new(Vector)
21	v.nelem = 0
22	v.elem = make([]Element, 10)
23	return v
24}
25
26func (v *Vector) At(i int) Element {
27	return v.elem[i]
28}
29
30func (v *Vector) Insert(e Element) {
31	v.elem[v.nelem] = e
32	v.nelem++
33}
34
35func main() {
36	type I struct{ val int }
37	i0 := new(I)
38	i0.val = 0
39	i1 := new(I)
40	i1.val = 11
41	i2 := new(I)
42	i2.val = 222
43	i3 := new(I)
44	i3.val = 3333
45	i4 := new(I)
46	i4.val = 44444
47	v := New()
48	r := "hi\n"
49	v.Insert(i4)
50	v.Insert(i3)
51	v.Insert(i2)
52	v.Insert(i1)
53	v.Insert(i0)
54	for i := 0; i < v.nelem; i++ {
55		var x *I
56		x = v.At(i).(*I)
57		r += fmt.Sprintln(i, x.val) // prints correct list
58	}
59	for i := 0; i < v.nelem; i++ {
60		r += fmt.Sprintln(i, v.At(i).(*I).val)
61	}
62	expect := `hi
630 44444
641 3333
652 222
663 11
674 0
680 44444
691 3333
702 222
713 11
724 0
73`
74	if r != expect {
75		panic(r)
76	}
77}
78
79/*
80bug027.go:50: illegal types for operand
81	(<Element>I{}) CONV (<I>{})
82bug027.go:50: illegal types for operand
83	(<Element>I{}) CONV (<I>{})
84*/
85