package main import "errors" type Base struct { name string } type E struct { // Base i int } type StructWithAllTypeFields struct { i8 int8 i16 int16 i32 int32 i64 int64 i int u8 uint8 u16 uint16 u32 uint32 u64 uint64 u uint f32 float32 f64 float64 b bool c64 complex64 c128 complex128 slice []int arr [3]int arr2 [3]E s string e E pf *StructWithAllTypeFields // resursive pi *int intr Interface m map[string]uint64 c chan int err error fn func(string) (int, error) pad1 int pad2 int } type Interface interface { Foo(a []int, b string) int } type Struct struct{} func (s *Struct) Foo(a []int, b string) int { return 1 } func FuncWithAllTypeStructParam(s StructWithAllTypeFields) { println(&s) // Expected: // all variables: s // s.i8: '\x01' // s.i16: 2 // s.i32: 3 // s.i64: 4 // s.i: 5 // s.u8: '\x06' // s.u16: 7 // s.u32: 8 // s.u64: 9 // s.u: 10 // s.f32: 11 // s.f64: 12 // s.b: true // s.c64: complex64{real = 13, imag = 14} // s.c128: complex128{real = 15, imag = 16} // s.slice: []int{21, 22, 23} // s.arr: [3]int{24, 25, 26} // s.arr2: [3]github.com/goplus/llgo/compiler/cl/_testdata/debug.E{{i = 27}, {i = 28}, {i = 29}} // s.s: "hello" // s.e: github.com/goplus/llgo/compiler/cl/_testdata/debug.E{i = 30} // s.pad1: 100 // s.pad2: 200 s.i8 = '\b' // Expected: // s.i8: '\b' // s.i16: 2 println(len(s.s), s.i8) } // Params is a function with all types of parameters. func FuncWithAllTypeParams( i8 int8, i16 int16, i32 int32, i64 int64, i int, u8 uint8, u16 uint16, u32 uint32, u64 uint64, u uint, f32 float32, f64 float64, b bool, c64 complex64, c128 complex128, slice []int, arr [3]int, arr2 [3]E, s string, e E, f StructWithAllTypeFields, pf *StructWithAllTypeFields, pi *int, intr Interface, m map[string]uint64, c chan int, err error, fn func(string) (int, error), ) (int, error) { // Expected: // all variables: i8 i16 i32 i64 i u8 u16 u32 u64 u f32 f64 b c64 c128 slice arr arr2 s e f pf pi intr m c err fn // i32: 3 // i64: 4 // i: 5 // u32: 8 // u64: 9 // u: 10 // f32: 11 // f64: 12 // slice: []int{21, 22, 23} // arr: [3]int{24, 25, 26} // arr2: [3]github.com/goplus/llgo/compiler/cl/_testdata/debug.E{{i = 27}, {i = 28}, {i = 29}} // slice[0]: 21 // slice[1]: 22 // slice[2]: 23 // arr[0]: 24 // arr[1]: 25 // arr[2]: 26 // arr2[0].i: 27 // arr2[1].i: 28 // arr2[2].i: 29 // e: github.com/goplus/llgo/compiler/cl/_testdata/debug.E{i = 30} // Expected(skip): // i8: '\b' // i16: 2 // u8: '\x06' // u16: 7 // b: true println( i8, i16, i32, i64, i, u8, u16, u32, u64, u, f32, f64, b, c64, c128, slice, arr[0:], s, &e, &f, pf, pi, intr, m, c, err, fn, ) i8 = 9 i16 = 10 i32 = 11 i64 = 12 i = 13 u8 = 14 u16 = 15 u32 = 16 u64 = 17 u = 18 f32 = 19 f64 = 20 b = false c64 = 21 + 22i c128 = 23 + 24i slice = []int{31, 32, 33} arr = [3]int{34, 35, 36} arr2 = [3]E{{i: 37}, {i: 38}, {i: 39}} s = "world" e = E{i: 40} println(i8, i16, i32, i64, i, u8, u16, u32, u64, u, f32, f64, b, c64, c128, slice, arr[0:], &arr2, s, &e, &f, pf, pi, intr, m, c, err, fn, ) // Expected: // i8: '\t' // i16: 10 // i32: 11 // i64: 12 // i: 13 // u8: '\x0e' // u16: 15 // u32: 16 // u64: 17 // u: 18 // f32: 19 // f64: 20 // b: false // c64: complex64{real = 21, imag = 22} // c128: complex128{real = 23, imag = 24} // slice: []int{31, 32, 33} // arr2: [3]github.com/goplus/llgo/compiler/cl/_testdata/debug.E{{i = 37}, {i = 38}, {i = 39}} // s: "world" // e: github.com/goplus/llgo/compiler/cl/_testdata/debug.E{i = 40} // Expected(skip): // arr: [3]int{34, 35, 36} return 1, errors.New("some error") } type TinyStruct struct { I int } type SmallStruct struct { I int J int } type MidStruct struct { I int J int K int } type BigStruct struct { I int J int K int L int M int N int O int P int Q int R int } func FuncStructParams(t TinyStruct, s SmallStruct, m MidStruct, b BigStruct) { // println(&t, &s, &m, &b) // Expected: // all variables: t s m b // t.I: 1 // s.I: 2 // s.J: 3 // m.I: 4 // m.J: 5 // m.K: 6 // b.I: 7 // b.J: 8 // b.K: 9 // b.L: 10 // b.M: 11 // b.N: 12 // b.O: 13 // b.P: 14 // b.Q: 15 // b.R: 16 println(t.I, s.I, s.J, m.I, m.J, m.K, b.I, b.J, b.K, b.L, b.M, b.N, b.O, b.P, b.Q, b.R) t.I = 10 s.I = 20 s.J = 21 m.I = 40 m.J = 41 m.K = 42 b.I = 70 b.J = 71 b.K = 72 b.L = 73 b.M = 74 b.N = 75 b.O = 76 b.P = 77 b.Q = 78 b.R = 79 // Expected: // all variables: t s m b // t.I: 10 // s.I: 20 // s.J: 21 // m.I: 40 // m.J: 41 // m.K: 42 // b.I: 70 // b.J: 71 // b.K: 72 // b.L: 73 // b.M: 74 // b.N: 75 // b.O: 76 // b.P: 77 // b.Q: 78 // b.R: 79 println("done") } func FuncStructPtrParams(t *TinyStruct, s *SmallStruct, m *MidStruct, b *BigStruct) { // Expected: // all variables: t s m b // t.I: 1 // s.I: 2 // s.J: 3 // m.I: 4 // m.J: 5 // m.K: 6 // b.I: 7 // b.J: 8 // b.K: 9 // b.L: 10 // b.M: 11 // b.N: 12 // b.O: 13 // b.P: 14 // b.Q: 15 // b.R: 16 println(t, s, m, b) t.I = 10 s.I = 20 s.J = 21 m.I = 40 m.J = 41 m.K = 42 b.I = 70 b.J = 71 b.K = 72 b.L = 73 b.M = 74 b.N = 75 b.O = 76 b.P = 77 b.Q = 78 b.R = 79 // Expected: // all variables: t s m b // t.I: 10 // s.I: 20 // s.J: 21 // m.I: 40 // m.J: 41 // m.K: 42 // b.I: 70 // b.J: 71 // b.K: 72 // b.L: 73 // b.M: 74 // b.N: 75 // b.O: 76 // b.P: 77 // b.Q: 78 // b.R: 79 println(t.I, s.I, s.J, m.I, m.J, m.K, b.I, b.J, b.K, b.L, b.M, b.N, b.O, b.P, b.Q, b.R) println("done") } func ScopeIf(branch int) { a := 1 // Expected: // all variables: a branch // a: 1 if branch == 1 { b := 2 c := 3 // Expected: // all variables: a b c branch // a: 1 // b: 2 // c: 3 // branch: 1 println(a, b, c) } else { c := 3 d := 4 // Expected: // all variables: a c d branch // a: 1 // c: 3 // d: 4 // branch: 0 println(a, c, d) } // Expected: // all variables: a branch // a: 1 println("a:", a) } func ScopeFor() { a := 1 for i := 0; i < 10; i++ { switch i { case 0: println("i is 0") // Expected: // all variables: i a // i: 0 // a: 1 println("i:", i) case 1: println("i is 1") // Expected: // all variables: i a // i: 1 // a: 1 println("i:", i) default: println("i is", i) } } println("a:", a) } func ScopeSwitch(i int) { a := 0 switch i { case 1: b := 1 println("i is 1") // Expected: // all variables: i a b // i: 1 // a: 0 // b: 1 println("i:", i, "a:", a, "b:", b) case 2: c := 2 println("i is 2") // Expected: // all variables: i a c // i: 2 // a: 0 // c: 2 println("i:", i, "a:", a, "c:", c) default: d := 3 println("i is", i) // Expected: // all variables: i a d // i: 3 // a: 0 // d: 3 println("i:", i, "a:", a, "d:", d) } // Expected: // all variables: a i // a: 0 println("a:", a) } func main() { FuncStructParams(TinyStruct{I: 1}, SmallStruct{I: 2, J: 3}, MidStruct{I: 4, J: 5, K: 6}, BigStruct{I: 7, J: 8, K: 9, L: 10, M: 11, N: 12, O: 13, P: 14, Q: 15, R: 16}) FuncStructPtrParams(&TinyStruct{I: 1}, &SmallStruct{I: 2, J: 3}, &MidStruct{I: 4, J: 5, K: 6}, &BigStruct{I: 7, J: 8, K: 9, L: 10, M: 11, N: 12, O: 13, P: 14, Q: 15, R: 16}) i := 100 s := StructWithAllTypeFields{ i8: 1, i16: 2, i32: 3, i64: 4, i: 5, u8: 6, u16: 7, u32: 8, u64: 9, u: 10, f32: 11, f64: 12, b: true, c64: 13 + 14i, c128: 15 + 16i, slice: []int{21, 22, 23}, arr: [3]int{24, 25, 26}, arr2: [3]E{{i: 27}, {i: 28}, {i: 29}}, s: "hello", e: E{i: 30}, pf: &StructWithAllTypeFields{i16: 100}, pi: &i, intr: &Struct{}, m: map[string]uint64{"a": 31, "b": 32}, c: make(chan int), err: errors.New("Test error"), fn: func(s string) (int, error) { println("fn:", s) i = 201 return 1, errors.New("fn error") }, pad1: 100, pad2: 200, } // Expected: // all variables: s i err // s.i8: '\x01' // s.i16: 2 // s.i32: 3 // s.i64: 4 // s.i: 5 // s.u8: '\x06' // s.u16: 7 // s.u32: 8 // s.u64: 9 // s.u: 10 // s.f32: 11 // s.f64: 12 // s.b: true // s.c64: complex64{real = 13, imag = 14} // s.c128: complex128{real = 15, imag = 16} // s.slice: []int{21, 22, 23} // s.arr: [3]int{24, 25, 26} // s.arr2: [3]github.com/goplus/llgo/compiler/cl/_testdata/debug.E{{i = 27}, {i = 28}, {i = 29}} // s.s: "hello" // s.e: github.com/goplus/llgo/compiler/cl/_testdata/debug.E{i = 30} // s.pf.i16: 100 // *(s.pf).i16: 100 // *(s.pi): 100 globalStructPtr = &s globalStruct = s println("globalInt:", globalInt) // Expected(skip): // all variables: globalInt globalStruct globalStructPtr s i err println("s:", &s) FuncWithAllTypeStructParam(s) println("called function with struct") i, err := FuncWithAllTypeParams( s.i8, s.i16, s.i32, s.i64, s.i, s.u8, s.u16, s.u32, s.u64, s.u, s.f32, s.f64, s.b, s.c64, s.c128, s.slice, s.arr, s.arr2, s.s, s.e, s, s.pf, s.pi, s.intr, s.m, s.c, s.err, s.fn, ) println(i, err) ScopeIf(1) ScopeIf(0) ScopeFor() ScopeSwitch(1) ScopeSwitch(2) ScopeSwitch(3) println(globalStructPtr) println(&globalStruct) s.i8 = 0x12 println(s.i8) // Expected: // all variables: s i err // s.i8: '\x12' // Expected(skip): // globalStruct.i8: '\x01' println((*globalStructPtr).i8) println("done") println("") println(&s, &globalStruct, globalStructPtr.i16, globalStructPtr) globalStructPtr = nil } var globalInt int = 301 var globalStruct StructWithAllTypeFields var globalStructPtr *StructWithAllTypeFields