| 1 | import os |
| 2 | |
| 3 | const c_anon_param_vexe = @VEXE |
| 4 | const c_anon_param_tests_dir = os.dir(@FILE) |
| 5 | const c_anon_param_v3_dir = os.dir(c_anon_param_tests_dir) |
| 6 | const c_anon_param_vlib_dir = os.dir(c_anon_param_v3_dir) |
| 7 | const c_anon_param_v3_src = os.join_path(c_anon_param_v3_dir, 'v3.v') |
| 8 | |
| 9 | fn c_anon_param_build_v3() string { |
| 10 | v3_bin := os.join_path(os.temp_dir(), 'v3_c_anon_param_test_${os.getpid()}') |
| 11 | os.rm(v3_bin) or {} |
| 12 | build := |
| 13 | os.execute('${c_anon_param_vexe} -gc none -path "${c_anon_param_vlib_dir}|@vlib|@vmodules" -o ${v3_bin} ${c_anon_param_v3_src}') |
| 14 | assert build.exit_code == 0, build.output |
| 15 | return v3_bin |
| 16 | } |
| 17 | |
| 18 | fn test_c_anonymous_params_keep_pointer_call_shape() { |
| 19 | v3_bin := c_anon_param_build_v3() |
| 20 | src := os.join_path(os.temp_dir(), 'v3_c_anon_param_${os.getpid()}.v') |
| 21 | os.write_file(src, 'module main |
| 22 | |
| 23 | @[typedef] |
| 24 | struct C.AnonNative { |
| 25 | value int |
| 26 | } |
| 27 | |
| 28 | fn C.take_ptr(&C.AnonNative) int |
| 29 | fn C.take_named(stream &C.AnonNative) int |
| 30 | fn C.take_void(voidptr) int |
| 31 | fn C.take_primitive(int, u64) int |
| 32 | fn C.take_multi(&&C.AnonNative) int |
| 33 | fn C.take_mixed(&C.AnonNative, voidptr, int, &&C.AnonNative) int |
| 34 | fn C.take_fn(fn (&C.AnonNative) int) int |
| 35 | fn C.load_matrix(m [16]f32) int |
| 36 | fn C.width_runes(r []rune) int |
| 37 | |
| 38 | fn callback(n &C.AnonNative) int { |
| 39 | return n.value |
| 40 | } |
| 41 | |
| 42 | fn main() { |
| 43 | mut native := C.AnonNative{ |
| 44 | value: 3 |
| 45 | } |
| 46 | ptr := &native |
| 47 | pptr := &ptr |
| 48 | _ := C.take_ptr(ptr) |
| 49 | _ = C.take_ptr(&native) |
| 50 | _ = C.take_named(ptr) |
| 51 | _ = C.take_void(voidptr(ptr)) |
| 52 | _ = C.take_primitive(1, u64(2)) |
| 53 | _ = C.take_multi(pptr) |
| 54 | _ = C.take_mixed(ptr, voidptr(ptr), 3, pptr) |
| 55 | _ = C.take_fn(callback) |
| 56 | mut matrix := [16]f32{} |
| 57 | _ = C.load_matrix(matrix) |
| 58 | runes := []rune{} |
| 59 | _ = C.width_runes(runes) |
| 60 | } |
| 61 | ') or { |
| 62 | panic(err) |
| 63 | } |
| 64 | c_path := os.join_path(os.temp_dir(), 'v3_c_anon_param_${os.getpid()}.c') |
| 65 | os.rm(c_path) or {} |
| 66 | compile := os.execute('${v3_bin} ${src} -b c -o ${c_path}') |
| 67 | assert compile.exit_code == 0, compile.output |
| 68 | generated := os.read_file(c_path) or { panic(err) } |
| 69 | assert generated.contains('take_ptr(ptr)'), generated |
| 70 | assert generated.contains('take_ptr(&native)'), generated |
| 71 | assert generated.contains('take_named(ptr)'), generated |
| 72 | assert generated.contains('take_void((void*)(ptr))'), generated |
| 73 | assert generated.contains('take_multi(pptr)'), generated |
| 74 | assert generated.contains('take_mixed(ptr, (void*)(ptr), 3, pptr)'), generated |
| 75 | assert generated.contains('load_matrix(matrix)'), generated |
| 76 | assert generated.contains('width_runes(runes)'), generated |
| 77 | assert !generated.contains('take_ptr(*'), generated |
| 78 | assert !generated.contains('take_named(*'), generated |
| 79 | assert !generated.contains('take_void(*'), generated |
| 80 | assert !generated.contains('take_multi(*'), generated |
| 81 | assert !generated.contains('take_mixed(*'), generated |
| 82 | assert !generated.contains('load_matrix(*'), generated |
| 83 | assert !generated.contains('width_runes(*'), generated |
| 84 | assert !generated.contains('*&native'), generated |
| 85 | assert !generated.contains('*(AnonNative*)'), generated |
| 86 | assert !generated.contains('*(struct AnonNative*)'), generated |
| 87 | } |
| 88 | |