| 1 | @[unsafe] |
| 2 | fn foo() int { |
| 3 | mut static x := 42 |
| 4 | x++ |
| 5 | return x |
| 6 | } |
| 7 | |
| 8 | fn xfoo() int { |
| 9 | return unsafe { foo() } |
| 10 | } |
| 11 | |
| 12 | fn test_static_vars_work() { |
| 13 | assert xfoo() == 43 |
| 14 | assert xfoo() == 44 |
| 15 | assert xfoo() == 45 |
| 16 | } |
| 17 | |
| 18 | fn test_static_vars_in_unsafe_blocks() { |
| 19 | f := fn () int { |
| 20 | unsafe { |
| 21 | mut static counter := 0 |
| 22 | counter++ |
| 23 | return counter |
| 24 | } |
| 25 | } |
| 26 | assert f() == 1 |
| 27 | assert f() == 2 |
| 28 | dump(f()) // 3 |
| 29 | } |
| 30 | |
| 31 | @[unsafe] |
| 32 | fn next_fib() int { |
| 33 | mut static fibs := []int{} |
| 34 | if fibs.len == 0 { |
| 35 | fibs << 1 |
| 36 | fibs << 1 |
| 37 | } else { |
| 38 | fibs << fibs[fibs.len - 1] + fibs[fibs.len - 2] |
| 39 | } |
| 40 | return fibs[fibs.len - 1] |
| 41 | } |
| 42 | |
| 43 | fn test_static_vars_with_array_initializers() { |
| 44 | assert unsafe { next_fib() } == 1 |
| 45 | assert unsafe { next_fib() } == 2 |
| 46 | assert unsafe { next_fib() } == 3 |
| 47 | assert unsafe { next_fib() } == 5 |
| 48 | } |
| 49 | |