blob: df4d50d36769ce0f9649f7f3855b156f39eeaaf5 [file] [log] [blame]
Colin Cross7bb052a2015-02-03 12:59:37 -08001// skip
2
Dan Willemsen0c157092016-07-08 13:57:52 -07003// Copyright 2010 The Go Authors. All rights reserved.
Colin Cross7bb052a2015-02-03 12:59:37 -08004// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Test that many initializations can be done at link time and
8// generate no executable init functions.
9// This test is run by sinit_run.go.
10
11package p
12
Dan Willemsen6ff23252015-09-15 13:49:18 -070013import "unsafe"
14
Colin Cross7bb052a2015-02-03 12:59:37 -080015// Should be no init func in the assembly.
16// All these initializations should be done at link time.
17
18type S struct{ a, b, c int }
19type SS struct{ aa, bb, cc S }
20type SA struct{ a, b, c [3]int }
21type SC struct{ a, b, c []int }
22
23var (
24 zero = 2
25 one = 1
26 pi = 3.14
27 slice = []byte{1, 2, 3}
28 sliceInt = []int{1, 2, 3}
29 hello = "hello, world"
30 bytes = []byte("hello, world")
31 four, five = 4, 5
32 x, y = 0.1, "hello"
33 nilslice []byte = nil
34 nilmap map[string]int = nil
35 nilfunc func() = nil
36 nilchan chan int = nil
37 nilptr *byte = nil
38)
39
40var a = [3]int{1001, 1002, 1003}
41var s = S{1101, 1102, 1103}
42var c = []int{1201, 1202, 1203}
43
44var aa = [3][3]int{[3]int{2001, 2002, 2003}, [3]int{2004, 2005, 2006}, [3]int{2007, 2008, 2009}}
45var as = [3]S{S{2101, 2102, 2103}, S{2104, 2105, 2106}, S{2107, 2108, 2109}}
Colin Cross7bb052a2015-02-03 12:59:37 -080046
47var sa = SA{[3]int{3001, 3002, 3003}, [3]int{3004, 3005, 3006}, [3]int{3007, 3008, 3009}}
48var ss = SS{S{3101, 3102, 3103}, S{3104, 3105, 3106}, S{3107, 3108, 3109}}
Colin Cross7bb052a2015-02-03 12:59:37 -080049
50var ca = [][3]int{[3]int{4001, 4002, 4003}, [3]int{4004, 4005, 4006}, [3]int{4007, 4008, 4009}}
51var cs = []S{S{4101, 4102, 4103}, S{4104, 4105, 4106}, S{4107, 4108, 4109}}
Colin Cross7bb052a2015-02-03 12:59:37 -080052
53var answers = [...]int{
54 // s
55 1101, 1102, 1103,
56
57 // ss
58 3101, 3102, 3103,
59 3104, 3105, 3106,
60 3107, 3108, 3109,
61
62 // [0]
63 1001, 1201, 1301,
64 2101, 2102, 2103,
65 4101, 4102, 4103,
66 5101, 5102, 5103,
67 3001, 3004, 3007,
68 3201, 3204, 3207,
69 3301, 3304, 3307,
70
71 // [0][j]
72 2001, 2201, 2301, 4001, 4201, 4301, 5001, 5201, 5301,
73 2002, 2202, 2302, 4002, 4202, 4302, 5002, 5202, 5302,
74 2003, 2203, 2303, 4003, 4203, 4303, 5003, 5203, 5303,
75
76 // [1]
77 1002, 1202, 1302,
78 2104, 2105, 2106,
79 4104, 4105, 4106,
80 5104, 5105, 5106,
81 3002, 3005, 3008,
82 3202, 3205, 3208,
83 3302, 3305, 3308,
84
85 // [1][j]
86 2004, 2204, 2304, 4004, 4204, 4304, 5004, 5204, 5304,
87 2005, 2205, 2305, 4005, 4205, 4305, 5005, 5205, 5305,
88 2006, 2206, 2306, 4006, 4206, 4306, 5006, 5206, 5306,
89
90 // [2]
91 1003, 1203, 1303,
92 2107, 2108, 2109,
93 4107, 4108, 4109,
94 5107, 5108, 5109,
95 3003, 3006, 3009,
96 3203, 3206, 3209,
97 3303, 3306, 3309,
98
99 // [2][j]
100 2007, 2207, 2307, 4007, 4207, 4307, 5007, 5207, 5307,
101 2008, 2208, 2308, 4008, 4208, 4308, 5008, 5208, 5308,
102 2009, 2209, 2309, 4009, 4209, 4309, 5009, 5209, 5309,
103}
104
105var (
106 copy_zero = zero
107 copy_one = one
108 copy_pi = pi
109 copy_slice = slice
110 copy_sliceInt = sliceInt
111 copy_hello = hello
112
113 // Could be handled without an initialization function, but
114 // requires special handling for "a = []byte("..."); b = a"
115 // which is not a likely case.
116 // copy_bytes = bytes
117 // https://codereview.appspot.com/171840043 is one approach to
118 // make this special case work.
119
120 copy_four, copy_five = four, five
121 copy_x, copy_y = x, y
122 copy_nilslice = nilslice
123 copy_nilmap = nilmap
124 copy_nilfunc = nilfunc
125 copy_nilchan = nilchan
126 copy_nilptr = nilptr
127)
128
129var copy_a = a
130var copy_s = s
131var copy_c = c
132
133var copy_aa = aa
134var copy_as = as
Colin Cross7bb052a2015-02-03 12:59:37 -0800135
136var copy_sa = sa
137var copy_ss = ss
Colin Cross7bb052a2015-02-03 12:59:37 -0800138
139var copy_ca = ca
140var copy_cs = cs
Colin Cross7bb052a2015-02-03 12:59:37 -0800141
142var copy_answers = answers
143
144var bx bool
145var b0 = false
146var b1 = true
147
148var fx float32
149var f0 = float32(0)
150var f1 = float32(1)
151
152var gx float64
153var g0 = float64(0)
154var g1 = float64(1)
155
156var ix int
157var i0 = 0
158var i1 = 1
159
160var jx uint
161var j0 = uint(0)
162var j1 = uint(1)
163
164var cx complex64
165var c0 = complex64(0)
166var c1 = complex64(1)
167
168var dx complex128
169var d0 = complex128(0)
170var d1 = complex128(1)
171
172var sx []int
173var s0 = []int{0, 0, 0}
174var s1 = []int{1, 2, 3}
175
176func fi() int { return 1 }
177
178var ax [10]int
179var a0 = [10]int{0, 0, 0}
180var a1 = [10]int{1, 2, 3, 4}
181
182type T struct{ X, Y int }
183
184var tx T
185var t0 = T{}
186var t0a = T{0, 0}
187var t0b = T{X: 0}
188var t1 = T{X: 1, Y: 2}
189var t1a = T{3, 4}
190
191var psx *[]int
192var ps0 = &[]int{0, 0, 0}
193var ps1 = &[]int{1, 2, 3}
194
195var pax *[10]int
196var pa0 = &[10]int{0, 0, 0}
197var pa1 = &[10]int{1, 2, 3}
198
199var ptx *T
200var pt0 = &T{}
201var pt0a = &T{0, 0}
202var pt0b = &T{X: 0}
203var pt1 = &T{X: 1, Y: 2}
204var pt1a = &T{3, 4}
205
206// The checks similar to
207// var copy_bx = bx
208// are commented out. The compiler no longer statically initializes them.
209// See issue 7665 and https://codereview.appspot.com/93200044.
210// If https://codereview.appspot.com/169040043 is submitted, and this
211// test is changed to pass -complete to the compiler, then we can
212// uncomment the copy lines again.
213
214// var copy_bx = bx
215var copy_b0 = b0
216var copy_b1 = b1
217
218// var copy_fx = fx
219var copy_f0 = f0
220var copy_f1 = f1
221
222// var copy_gx = gx
223var copy_g0 = g0
224var copy_g1 = g1
225
226// var copy_ix = ix
227var copy_i0 = i0
228var copy_i1 = i1
229
230// var copy_jx = jx
231var copy_j0 = j0
232var copy_j1 = j1
233
234// var copy_cx = cx
235var copy_c0 = c0
236var copy_c1 = c1
237
238// var copy_dx = dx
239var copy_d0 = d0
240var copy_d1 = d1
241
242// var copy_sx = sx
243var copy_s0 = s0
244var copy_s1 = s1
245
246// var copy_ax = ax
247var copy_a0 = a0
248var copy_a1 = a1
249
250// var copy_tx = tx
251var copy_t0 = t0
252var copy_t0a = t0a
253var copy_t0b = t0b
254var copy_t1 = t1
255var copy_t1a = t1a
256
257// var copy_psx = psx
258var copy_ps0 = ps0
259var copy_ps1 = ps1
260
261// var copy_pax = pax
262var copy_pa0 = pa0
263var copy_pa1 = pa1
264
265// var copy_ptx = ptx
266var copy_pt0 = pt0
267var copy_pt0a = pt0a
268var copy_pt0b = pt0b
269var copy_pt1 = pt1
270var copy_pt1a = pt1a
271
272var _ interface{} = 1
273
274type T1 int
275
276func (t *T1) M() {}
277
278type Mer interface {
279 M()
280}
281
282var _ Mer = (*T1)(nil)
Dan Willemsen6ff23252015-09-15 13:49:18 -0700283
284var Byte byte
285var PtrByte unsafe.Pointer = unsafe.Pointer(&Byte)