Home | History | Annotate | Download | only in test
      1 // skip
      2 
      3 // 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 
      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 
     11 package p
     12 
     13 import "unsafe"
     14 
     15 // Should be no init func in the assembly.
     16 // All these initializations should be done at link time.
     17 
     18 type S struct{ a, b, c int }
     19 type SS struct{ aa, bb, cc S }
     20 type SA struct{ a, b, c [3]int }
     21 type SC struct{ a, b, c []int }
     22 
     23 var (
     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 
     40 var a = [3]int{1001, 1002, 1003}
     41 var s = S{1101, 1102, 1103}
     42 var c = []int{1201, 1202, 1203}
     43 
     44 var aa = [3][3]int{[3]int{2001, 2002, 2003}, [3]int{2004, 2005, 2006}, [3]int{2007, 2008, 2009}}
     45 var as = [3]S{S{2101, 2102, 2103}, S{2104, 2105, 2106}, S{2107, 2108, 2109}}
     46 var ac = [3][]int{[]int{2201, 2202, 2203}, []int{2204, 2205, 2206}, []int{2207, 2208, 2209}}
     47 
     48 var sa = SA{[3]int{3001, 3002, 3003}, [3]int{3004, 3005, 3006}, [3]int{3007, 3008, 3009}}
     49 var ss = SS{S{3101, 3102, 3103}, S{3104, 3105, 3106}, S{3107, 3108, 3109}}
     50 var sc = SC{[]int{3201, 3202, 3203}, []int{3204, 3205, 3206}, []int{3207, 3208, 3209}}
     51 
     52 var ca = [][3]int{[3]int{4001, 4002, 4003}, [3]int{4004, 4005, 4006}, [3]int{4007, 4008, 4009}}
     53 var cs = []S{S{4101, 4102, 4103}, S{4104, 4105, 4106}, S{4107, 4108, 4109}}
     54 var cc = [][]int{[]int{4201, 4202, 4203}, []int{4204, 4205, 4206}, []int{4207, 4208, 4209}}
     55 
     56 var answers = [...]int{
     57 	// 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 }
    107 
    108 var (
    109 	copy_zero     = zero
    110 	copy_one      = one
    111 	copy_pi       = pi
    112 	copy_slice    = slice
    113 	copy_sliceInt = sliceInt
    114 	copy_hello    = hello
    115 
    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 
    123 	copy_four, copy_five = four, five
    124 	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
    130 )
    131 
    132 var copy_a = a
    133 var copy_s = s
    134 var copy_c = c
    135 
    136 var copy_aa = aa
    137 var copy_as = as
    138 var copy_ac = ac
    139 
    140 var copy_sa = sa
    141 var copy_ss = ss
    142 var copy_sc = sc
    143 
    144 var copy_ca = ca
    145 var copy_cs = cs
    146 var copy_cc = cc
    147 
    148 var copy_answers = answers
    149 
    150 var bx bool
    151 var b0 = false
    152 var b1 = true
    153 
    154 var fx float32
    155 var f0 = float32(0)
    156 var f1 = float32(1)
    157 
    158 var gx float64
    159 var g0 = float64(0)
    160 var g1 = float64(1)
    161 
    162 var ix int
    163 var i0 = 0
    164 var i1 = 1
    165 
    166 var jx uint
    167 var j0 = uint(0)
    168 var j1 = uint(1)
    169 
    170 var cx complex64
    171 var c0 = complex64(0)
    172 var c1 = complex64(1)
    173 
    174 var dx complex128
    175 var d0 = complex128(0)
    176 var d1 = complex128(1)
    177 
    178 var sx []int
    179 var s0 = []int{0, 0, 0}
    180 var s1 = []int{1, 2, 3}
    181 
    182 func fi() int { return 1 }
    183 
    184 var ax [10]int
    185 var a0 = [10]int{0, 0, 0}
    186 var a1 = [10]int{1, 2, 3, 4}
    187 
    188 type T struct{ X, Y int }
    189 
    190 var tx T
    191 var t0 = T{}
    192 var t0a = T{0, 0}
    193 var t0b = T{X: 0}
    194 var t1 = T{X: 1, Y: 2}
    195 var t1a = T{3, 4}
    196 
    197 var psx *[]int
    198 var ps0 = &[]int{0, 0, 0}
    199 var ps1 = &[]int{1, 2, 3}
    200 
    201 var pax *[10]int
    202 var pa0 = &[10]int{0, 0, 0}
    203 var pa1 = &[10]int{1, 2, 3}
    204 
    205 var ptx *T
    206 var pt0 = &T{}
    207 var pt0a = &T{0, 0}
    208 var pt0b = &T{X: 0}
    209 var pt1 = &T{X: 1, Y: 2}
    210 var pt1a = &T{3, 4}
    211 
    212 // 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
    221 var copy_b0 = b0
    222 var copy_b1 = b1
    223 
    224 // var copy_fx = fx
    225 var copy_f0 = f0
    226 var copy_f1 = f1
    227 
    228 // var copy_gx = gx
    229 var copy_g0 = g0
    230 var copy_g1 = g1
    231 
    232 // var copy_ix = ix
    233 var copy_i0 = i0
    234 var copy_i1 = i1
    235 
    236 // var copy_jx = jx
    237 var copy_j0 = j0
    238 var copy_j1 = j1
    239 
    240 // var copy_cx = cx
    241 var copy_c0 = c0
    242 var copy_c1 = c1
    243 
    244 // var copy_dx = dx
    245 var copy_d0 = d0
    246 var copy_d1 = d1
    247 
    248 // var copy_sx = sx
    249 var copy_s0 = s0
    250 var copy_s1 = s1
    251 
    252 // var copy_ax = ax
    253 var copy_a0 = a0
    254 var copy_a1 = a1
    255 
    256 // var copy_tx = tx
    257 var copy_t0 = t0
    258 var copy_t0a = t0a
    259 var copy_t0b = t0b
    260 var copy_t1 = t1
    261 var copy_t1a = t1a
    262 
    263 // var copy_psx = psx
    264 var copy_ps0 = ps0
    265 var copy_ps1 = ps1
    266 
    267 // var copy_pax = pax
    268 var copy_pa0 = pa0
    269 var copy_pa1 = pa1
    270 
    271 // var copy_ptx = ptx
    272 var copy_pt0 = pt0
    273 var copy_pt0a = pt0a
    274 var copy_pt0b = pt0b
    275 var copy_pt1 = pt1
    276 var copy_pt1a = pt1a
    277 
    278 var _ interface{} = 1
    279 
    280 type T1 int
    281 
    282 func (t *T1) M() {}
    283 
    284 type Mer interface {
    285 	M()
    286 }
    287 
    288 var _ Mer = (*T1)(nil)
    289 
    290 var Byte byte
    291 var PtrByte unsafe.Pointer = unsafe.Pointer(&Byte)
    292