1// run
2
3// Copyright 2013 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
9func main() {
10	ok := true
11	for _, tt := range tests {
12		func() {
13			defer func() {
14				if err := recover(); err == nil {
15					println(tt.name, "did not panic")
16					ok = false
17				}
18			}()
19			tt.fn()
20		}()
21	}
22	if !ok {
23		println("BUG")
24	}
25}
26
27var intp *int
28var slicep *[]byte
29var a10p *[10]int
30var a10Mp *[1<<20]int
31var structp *Struct
32var bigstructp *BigStruct
33var i int
34var m *M
35var m1 *M1
36var m2 *M2
37
38var V interface{}
39
40func use(x interface{}) {
41	V = x
42}
43
44var tests = []struct{
45	name string
46	fn func()
47}{
48	// Edit .+1,/^}/s/^[^	].+/	{"&", func() { println(&) }},\n	{"\&&", func() { println(\&&) }},/g
49	{"*intp", func() { println(*intp) }},
50	{"&*intp", func() { println(&*intp) }},
51	{"*slicep", func() { println(*slicep) }},
52	{"&*slicep", func() { println(&*slicep) }},
53	{"(*slicep)[0]", func() { println((*slicep)[0]) }},
54	{"&(*slicep)[0]", func() { println(&(*slicep)[0]) }},
55	{"(*slicep)[i]", func() { println((*slicep)[i]) }},
56	{"&(*slicep)[i]", func() { println(&(*slicep)[i]) }},
57	{"*a10p", func() { use(*a10p) }},
58	{"&*a10p", func() { println(&*a10p) }},
59	{"a10p[0]", func() { println(a10p[0]) }},
60	{"&a10p[0]", func() { println(&a10p[0]) }},
61	{"a10p[i]", func() { println(a10p[i]) }},
62	{"&a10p[i]", func() { println(&a10p[i]) }},
63	{"*structp", func() { use(*structp) }},
64	{"&*structp", func() { println(&*structp) }},
65	{"structp.i", func() { println(structp.i) }},
66	{"&structp.i", func() { println(&structp.i) }},
67	{"structp.j", func() { println(structp.j) }},
68	{"&structp.j", func() { println(&structp.j) }},
69	{"structp.k", func() { println(structp.k) }},
70	{"&structp.k", func() { println(&structp.k) }},
71	{"structp.x[0]", func() { println(structp.x[0]) }},
72	{"&structp.x[0]", func() { println(&structp.x[0]) }},
73	{"structp.x[i]", func() { println(structp.x[i]) }},
74	{"&structp.x[i]", func() { println(&structp.x[i]) }},
75	{"structp.x[9]", func() { println(structp.x[9]) }},
76	{"&structp.x[9]", func() { println(&structp.x[9]) }},
77	{"structp.l", func() { println(structp.l) }},
78	{"&structp.l", func() { println(&structp.l) }},
79	{"*bigstructp", func() { use(*bigstructp) }},
80	{"&*bigstructp", func() { println(&*bigstructp) }},
81	{"bigstructp.i", func() { println(bigstructp.i) }},
82	{"&bigstructp.i", func() { println(&bigstructp.i) }},
83	{"bigstructp.j", func() { println(bigstructp.j) }},
84	{"&bigstructp.j", func() { println(&bigstructp.j) }},
85	{"bigstructp.k", func() { println(bigstructp.k) }},
86	{"&bigstructp.k", func() { println(&bigstructp.k) }},
87	{"bigstructp.x[0]", func() { println(bigstructp.x[0]) }},
88	{"&bigstructp.x[0]", func() { println(&bigstructp.x[0]) }},
89	{"bigstructp.x[i]", func() { println(bigstructp.x[i]) }},
90	{"&bigstructp.x[i]", func() { println(&bigstructp.x[i]) }},
91	{"bigstructp.x[9]", func() { println(bigstructp.x[9]) }},
92	{"&bigstructp.x[9]", func() { println(&bigstructp.x[9]) }},
93	{"bigstructp.x[100<<20]", func() { println(bigstructp.x[100<<20]) }},
94	{"&bigstructp.x[100<<20]", func() { println(&bigstructp.x[100<<20]) }},
95	{"bigstructp.l", func() { println(bigstructp.l) }},
96	{"&bigstructp.l", func() { println(&bigstructp.l) }},
97	{"m1.F()", func() { println(m1.F()) }},
98	{"m1.M.F()", func() { println(m1.M.F()) }},
99	{"m2.F()", func() { println(m2.F()) }},
100	{"m2.M.F()", func() { println(m2.M.F()) }},
101}
102
103type Struct struct {
104	i int
105	j float64
106	k string
107	x [10]int
108	l []byte
109}
110
111type BigStruct struct {
112	i int
113	j float64
114	k string
115	x [128<<20]byte
116	l []byte
117}
118
119type M struct {
120}
121
122func (m *M) F() int {return 0}
123
124type M1 struct {
125	M
126}
127
128type M2 struct {
129	x int
130	M
131}
132