| package main | |
| var failed = false | |
| //go:noinline | |
| func testSliceLenCap12_ssa(a [10]int, i, j int) (int, int) { | |
| b := a[i:j] | |
| return len(b), cap(b) | |
| } | |
| //go:noinline | |
| func testSliceLenCap1_ssa(a [10]int, i, j int) (int, int) { | |
| b := a[i:] | |
| return len(b), cap(b) | |
| } | |
| //go:noinline | |
| func testSliceLenCap2_ssa(a [10]int, i, j int) (int, int) { | |
| b := a[:j] | |
| return len(b), cap(b) | |
| } | |
| func testSliceLenCap() { | |
| a := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} | |
| tests := [...]struct { | |
| fn func(a [10]int, i, j int) (int, int) | |
| i, j int // slice range | |
| l, c int // len, cap | |
| }{ | |
| // -1 means the value is not used. | |
| {testSliceLenCap12_ssa, 0, 0, 0, 10}, | |
| {testSliceLenCap12_ssa, 0, 1, 1, 10}, | |
| {testSliceLenCap12_ssa, 0, 10, 10, 10}, | |
| {testSliceLenCap12_ssa, 10, 10, 0, 0}, | |
| {testSliceLenCap12_ssa, 0, 5, 5, 10}, | |
| {testSliceLenCap12_ssa, 5, 5, 0, 5}, | |
| {testSliceLenCap12_ssa, 5, 10, 5, 5}, | |
| {testSliceLenCap1_ssa, 0, -1, 0, 10}, | |
| {testSliceLenCap1_ssa, 5, -1, 5, 5}, | |
| {testSliceLenCap1_ssa, 10, -1, 0, 0}, | |
| {testSliceLenCap2_ssa, -1, 0, 0, 10}, | |
| {testSliceLenCap2_ssa, -1, 5, 5, 10}, | |
| {testSliceLenCap2_ssa, -1, 10, 10, 10}, | |
| } | |
| for i, t := range tests { | |
| if l, c := t.fn(a, t.i, t.j); l != t.l && c != t.c { | |
| println("#", i, " len(a[", t.i, ":", t.j, "]), cap(a[", t.i, ":", t.j, "]) =", l, c, | |
| ", want", t.l, t.c) | |
| failed = true | |
| } | |
| } | |
| } | |
| //go:noinline | |
| func testSliceGetElement_ssa(a [10]int, i, j, p int) int { | |
| return a[i:j][p] | |
| } | |
| func testSliceGetElement() { | |
| a := [10]int{0, 10, 20, 30, 40, 50, 60, 70, 80, 90} | |
| tests := [...]struct { | |
| i, j, p int | |
| want int // a[i:j][p] | |
| }{ | |
| {0, 10, 2, 20}, | |
| {0, 5, 4, 40}, | |
| {5, 10, 3, 80}, | |
| {1, 9, 7, 80}, | |
| } | |
| for i, t := range tests { | |
| if got := testSliceGetElement_ssa(a, t.i, t.j, t.p); got != t.want { | |
| println("#", i, " a[", t.i, ":", t.j, "][", t.p, "] = ", got, " wanted ", t.want) | |
| failed = true | |
| } | |
| } | |
| } | |
| //go:noinline | |
| func testSliceSetElement_ssa(a *[10]int, i, j, p, x int) { | |
| (*a)[i:j][p] = x | |
| } | |
| func testSliceSetElement() { | |
| a := [10]int{0, 10, 20, 30, 40, 50, 60, 70, 80, 90} | |
| tests := [...]struct { | |
| i, j, p int | |
| want int // a[i:j][p] | |
| }{ | |
| {0, 10, 2, 17}, | |
| {0, 5, 4, 11}, | |
| {5, 10, 3, 28}, | |
| {1, 9, 7, 99}, | |
| } | |
| for i, t := range tests { | |
| testSliceSetElement_ssa(&a, t.i, t.j, t.p, t.want) | |
| if got := a[t.i+t.p]; got != t.want { | |
| println("#", i, " a[", t.i, ":", t.j, "][", t.p, "] = ", got, " wanted ", t.want) | |
| failed = true | |
| } | |
| } | |
| } | |
| func testSlicePanic1() { | |
| defer func() { | |
| if r := recover(); r != nil { | |
| println("panicked as expected") | |
| } | |
| }() | |
| a := [10]int{0, 10, 20, 30, 40, 50, 60, 70, 80, 90} | |
| testSliceLenCap12_ssa(a, 3, 12) | |
| println("expected to panic, but didn't") | |
| failed = true | |
| } | |
| func testSlicePanic2() { | |
| defer func() { | |
| if r := recover(); r != nil { | |
| println("panicked as expected") | |
| } | |
| }() | |
| a := [10]int{0, 10, 20, 30, 40, 50, 60, 70, 80, 90} | |
| testSliceGetElement_ssa(a, 3, 7, 4) | |
| println("expected to panic, but didn't") | |
| failed = true | |
| } | |
| func main() { | |
| testSliceLenCap() | |
| testSliceGetElement() | |
| testSliceSetElement() | |
| testSlicePanic1() | |
| testSlicePanic2() | |
| if failed { | |
| panic("failed") | |
| } | |
| } |