| // Copyright 2013 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // initialization cycles |
| |
| package init0 |
| |
| // initialization cycles (we don't know the types) |
| const ( |
| s0 /* ERROR initialization cycle */ = s0 |
| |
| x0 /* ERROR initialization cycle */ = y0 |
| y0 = x0 |
| |
| a0 = b0 |
| b0 /* ERROR initialization cycle */ = c0 |
| c0 = d0 |
| d0 = b0 |
| ) |
| |
| var ( |
| s1 /* ERROR initialization cycle */ = s1 |
| |
| x1 /* ERROR initialization cycle */ = y1 |
| y1 = x1 |
| |
| a1 = b1 |
| b1 /* ERROR initialization cycle */ = c1 |
| c1 = d1 |
| d1 = b1 |
| ) |
| |
| // initialization cycles (we know the types) |
| const ( |
| s2 /* ERROR initialization cycle */ int = s2 |
| |
| x2 /* ERROR initialization cycle */ int = y2 |
| y2 = x2 |
| |
| a2 = b2 |
| b2 /* ERROR initialization cycle */ int = c2 |
| c2 = d2 |
| d2 = b2 |
| ) |
| |
| var ( |
| s3 /* ERROR initialization cycle */ int = s3 |
| |
| x3 /* ERROR initialization cycle */ int = y3 |
| y3 = x3 |
| |
| a3 = b3 |
| b3 /* ERROR initialization cycle */ int = c3 |
| c3 = d3 |
| d3 = b3 |
| ) |
| |
| // cycles via struct fields |
| |
| type S1 struct { |
| f int |
| } |
| const cx3 S1 /* ERROR invalid constant type */ = S1{cx3.f} |
| var vx3 /* ERROR initialization cycle */ S1 = S1{vx3.f} |
| |
| // cycles via functions |
| |
| var x4 = x5 |
| var x5 /* ERROR initialization cycle */ = f1() |
| func f1() int { return x5*10 } |
| |
| var x6, x7 /* ERROR initialization cycle */ = f2() |
| var x8 = x7 |
| func f2() (int, int) { return f3() + f3(), 0 } |
| func f3() int { return x8 } |
| |
| // cycles via closures |
| |
| var x9 /* ERROR initialization cycle */ = func() int { return x9 }() |
| |
| var x10 /* ERROR initialization cycle */ = f4() |
| |
| func f4() int { |
| _ = func() { |
| _ = x10 |
| } |
| return 0 |
| } |
| |
| // cycles via method expressions |
| |
| type T1 struct{} |
| |
| func (T1) m() bool { _ = x11; return false } |
| |
| var x11 /* ERROR initialization cycle */ = T1.m(T1{}) |
| |
| // cycles via method values |
| |
| type T2 struct{} |
| |
| func (T2) m() bool { _ = x12; return false } |
| |
| var t1 T2 |
| var x12 /* ERROR initialization cycle */ = t1.m |