blob: 188a5301a2f35d41e949dea0b26deee61c834898 [file] [log] [blame]
Josh Bleecher Snyder9b544442014-11-06 15:14:08 -05001// skip
Russ Coxcd22afa2012-09-23 13:16:14 -04002
Russ Coxa9425c72010-05-03 17:21:49 -07003// Copyright 2010 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
Rob Pike80a97832012-02-24 11:48:19 +11007// Test that many initializations can be done at link time and
8// generate no executable init functions.
Josh Bleecher Snyder9b544442014-11-06 15:14:08 -05009// This test is run by sinit_run.go.
Rob Pike80a97832012-02-24 11:48:19 +110010
Russ Coxa9425c72010-05-03 17:21:49 -070011package p
12
Russ Cox9f90f312015-06-29 12:49:25 -040013import "unsafe"
14
Russ Coxa9425c72010-05-03 17:21:49 -070015// Should be no init func in the assembly.
16// All these initializations should be done at link time.
17
Russ Cox335da672011-08-31 07:37:14 -040018type 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 }
Russ Coxa9425c72010-05-03 17:21:49 -070022
23var (
Russ Cox335da672011-08-31 07:37:14 -040024 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
Russ Coxa9425c72010-05-03 17:21:49 -070038)
39
Russ Cox335da672011-08-31 07:37:14 -040040var a = [3]int{1001, 1002, 1003}
41var s = S{1101, 1102, 1103}
42var c = []int{1201, 1202, 1203}
Russ Coxa9425c72010-05-03 17:21:49 -070043
Russ Cox335da672011-08-31 07:37:14 -040044var 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}}
46var ac = [3][]int{[]int{2201, 2202, 2203}, []int{2204, 2205, 2206}, []int{2207, 2208, 2209}}
Russ Coxa9425c72010-05-03 17:21:49 -070047
Russ Cox335da672011-08-31 07:37:14 -040048var sa = SA{[3]int{3001, 3002, 3003}, [3]int{3004, 3005, 3006}, [3]int{3007, 3008, 3009}}
49var ss = SS{S{3101, 3102, 3103}, S{3104, 3105, 3106}, S{3107, 3108, 3109}}
50var sc = SC{[]int{3201, 3202, 3203}, []int{3204, 3205, 3206}, []int{3207, 3208, 3209}}
Russ Coxa9425c72010-05-03 17:21:49 -070051
Russ Cox335da672011-08-31 07:37:14 -040052var ca = [][3]int{[3]int{4001, 4002, 4003}, [3]int{4004, 4005, 4006}, [3]int{4007, 4008, 4009}}
53var cs = []S{S{4101, 4102, 4103}, S{4104, 4105, 4106}, S{4107, 4108, 4109}}
54var cc = [][]int{[]int{4201, 4202, 4203}, []int{4204, 4205, 4206}, []int{4207, 4208, 4209}}
Russ Coxa9425c72010-05-03 17:21:49 -070055
Russ Cox335da672011-08-31 07:37:14 -040056var answers = [...]int{
Russ Coxa9425c72010-05-03 17:21:49 -070057 // s
58 1101, 1102, 1103,
59
60 // ss
61 3101, 3102, 3103,
62 3104, 3105, 3106,
63 3107, 3108, 3109,
64
65 // [0]
66 1001, 1201, 1301,
67 2101, 2102, 2103,
68 4101, 4102, 4103,
69 5101, 5102, 5103,
70 3001, 3004, 3007,
71 3201, 3204, 3207,
72 3301, 3304, 3307,
73
74 // [0][j]
75 2001, 2201, 2301, 4001, 4201, 4301, 5001, 5201, 5301,
76 2002, 2202, 2302, 4002, 4202, 4302, 5002, 5202, 5302,
77 2003, 2203, 2303, 4003, 4203, 4303, 5003, 5203, 5303,
78
79 // [1]
80 1002, 1202, 1302,
81 2104, 2105, 2106,
82 4104, 4105, 4106,
83 5104, 5105, 5106,
84 3002, 3005, 3008,
85 3202, 3205, 3208,
86 3302, 3305, 3308,
87
88 // [1][j]
89 2004, 2204, 2304, 4004, 4204, 4304, 5004, 5204, 5304,
90 2005, 2205, 2305, 4005, 4205, 4305, 5005, 5205, 5305,
91 2006, 2206, 2306, 4006, 4206, 4306, 5006, 5206, 5306,
92
93 // [2]
94 1003, 1203, 1303,
95 2107, 2108, 2109,
96 4107, 4108, 4109,
97 5107, 5108, 5109,
98 3003, 3006, 3009,
99 3203, 3206, 3209,
100 3303, 3306, 3309,
101
102 // [2][j]
103 2007, 2207, 2307, 4007, 4207, 4307, 5007, 5207, 5307,
104 2008, 2208, 2308, 4008, 4208, 4308, 5008, 5208, 5308,
105 2009, 2209, 2309, 4009, 4209, 4309, 5009, 5209, 5309,
106}
Russ Cox335da672011-08-31 07:37:14 -0400107
108var (
Josh Bleecher Snyder9b544442014-11-06 15:14:08 -0500109 copy_zero = zero
110 copy_one = one
111 copy_pi = pi
112 copy_slice = slice
Russ Cox335da672011-08-31 07:37:14 -0400113 copy_sliceInt = sliceInt
Josh Bleecher Snyder9b544442014-11-06 15:14:08 -0500114 copy_hello = hello
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800115
116 // Could be handled without an initialization function, but
117 // requires special handling for "a = []byte("..."); b = a"
118 // which is not a likely case.
119 // copy_bytes = bytes
120 // https://codereview.appspot.com/171840043 is one approach to
121 // make this special case work.
122
Russ Cox335da672011-08-31 07:37:14 -0400123 copy_four, copy_five = four, five
Josh Bleecher Snyder9b544442014-11-06 15:14:08 -0500124 copy_x, copy_y = x, y
125 copy_nilslice = nilslice
126 copy_nilmap = nilmap
127 copy_nilfunc = nilfunc
128 copy_nilchan = nilchan
129 copy_nilptr = nilptr
Russ Cox335da672011-08-31 07:37:14 -0400130)
131
132var copy_a = a
133var copy_s = s
134var copy_c = c
135
136var copy_aa = aa
137var copy_as = as
138var copy_ac = ac
139
140var copy_sa = sa
141var copy_ss = ss
142var copy_sc = sc
143
144var copy_ca = ca
145var copy_cs = cs
146var copy_cc = cc
147
148var copy_answers = answers
149
150var bx bool
151var b0 = false
152var b1 = true
153
154var fx float32
155var f0 = float32(0)
156var f1 = float32(1)
157
158var gx float64
159var g0 = float64(0)
160var g1 = float64(1)
161
162var ix int
163var i0 = 0
164var i1 = 1
165
166var jx uint
167var j0 = uint(0)
168var j1 = uint(1)
169
170var cx complex64
171var c0 = complex64(0)
172var c1 = complex64(1)
173
174var dx complex128
175var d0 = complex128(0)
176var d1 = complex128(1)
177
178var sx []int
179var s0 = []int{0, 0, 0}
180var s1 = []int{1, 2, 3}
181
Josh Bleecher Snyder9b544442014-11-06 15:14:08 -0500182func fi() int { return 1 }
Russ Cox335da672011-08-31 07:37:14 -0400183
184var ax [10]int
185var a0 = [10]int{0, 0, 0}
186var a1 = [10]int{1, 2, 3, 4}
187
188type T struct{ X, Y int }
189
190var tx T
191var t0 = T{}
192var t0a = T{0, 0}
193var t0b = T{X: 0}
194var t1 = T{X: 1, Y: 2}
195var t1a = T{3, 4}
196
197var psx *[]int
198var ps0 = &[]int{0, 0, 0}
199var ps1 = &[]int{1, 2, 3}
200
201var pax *[10]int
202var pa0 = &[10]int{0, 0, 0}
203var pa1 = &[10]int{1, 2, 3}
204
205var ptx *T
206var pt0 = &T{}
207var pt0a = &T{0, 0}
208var pt0b = &T{X: 0}
209var pt1 = &T{X: 1, Y: 2}
210var pt1a = &T{3, 4}
211
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800212// The checks similar to
213// var copy_bx = bx
214// are commented out. The compiler no longer statically initializes them.
215// See issue 7665 and https://codereview.appspot.com/93200044.
216// If https://codereview.appspot.com/169040043 is submitted, and this
217// test is changed to pass -complete to the compiler, then we can
218// uncomment the copy lines again.
219
220// var copy_bx = bx
Russ Cox335da672011-08-31 07:37:14 -0400221var copy_b0 = b0
222var copy_b1 = b1
223
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800224// var copy_fx = fx
Russ Cox335da672011-08-31 07:37:14 -0400225var copy_f0 = f0
226var copy_f1 = f1
227
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800228// var copy_gx = gx
Russ Cox335da672011-08-31 07:37:14 -0400229var copy_g0 = g0
230var copy_g1 = g1
231
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800232// var copy_ix = ix
Russ Cox335da672011-08-31 07:37:14 -0400233var copy_i0 = i0
234var copy_i1 = i1
235
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800236// var copy_jx = jx
Russ Cox335da672011-08-31 07:37:14 -0400237var copy_j0 = j0
238var copy_j1 = j1
239
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800240// var copy_cx = cx
Russ Cox335da672011-08-31 07:37:14 -0400241var copy_c0 = c0
242var copy_c1 = c1
243
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800244// var copy_dx = dx
Russ Cox335da672011-08-31 07:37:14 -0400245var copy_d0 = d0
246var copy_d1 = d1
247
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800248// var copy_sx = sx
Russ Cox335da672011-08-31 07:37:14 -0400249var copy_s0 = s0
250var copy_s1 = s1
251
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800252// var copy_ax = ax
Russ Cox335da672011-08-31 07:37:14 -0400253var copy_a0 = a0
254var copy_a1 = a1
255
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800256// var copy_tx = tx
Russ Cox335da672011-08-31 07:37:14 -0400257var copy_t0 = t0
258var copy_t0a = t0a
259var copy_t0b = t0b
260var copy_t1 = t1
261var copy_t1a = t1a
262
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800263// var copy_psx = psx
Russ Cox335da672011-08-31 07:37:14 -0400264var copy_ps0 = ps0
265var copy_ps1 = ps1
266
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800267// var copy_pax = pax
Russ Cox335da672011-08-31 07:37:14 -0400268var copy_pa0 = pa0
269var copy_pa1 = pa1
270
Ian Lance Taylorc6e53fe2014-11-04 10:20:35 -0800271// var copy_ptx = ptx
Russ Cox335da672011-08-31 07:37:14 -0400272var copy_pt0 = pt0
273var copy_pt0a = pt0a
274var copy_pt0b = pt0b
275var copy_pt1 = pt1
276var copy_pt1a = pt1a
Russ Cox65924562012-12-30 12:01:53 -0500277
278var _ interface{} = 1
279
280type T1 int
281
282func (t *T1) M() {}
283
Josh Bleecher Snyder9b544442014-11-06 15:14:08 -0500284type Mer interface {
285 M()
286}
Russ Cox65924562012-12-30 12:01:53 -0500287
288var _ Mer = (*T1)(nil)
Russ Cox9f90f312015-06-29 12:49:25 -0400289
290var Byte byte
291var PtrByte unsafe.Pointer = unsafe.Pointer(&Byte)