v4 / vlib / v3 / tests / c_anonymous_param_codegen_test.v
87 lines · 80 sloc · 2.93 KB · 288feee4702b35beadb4037d02b96b5c8674156b
Raw
1import os
2
3const c_anon_param_vexe = @VEXE
4const c_anon_param_tests_dir = os.dir(@FILE)
5const c_anon_param_v3_dir = os.dir(c_anon_param_tests_dir)
6const c_anon_param_vlib_dir = os.dir(c_anon_param_v3_dir)
7const c_anon_param_v3_src = os.join_path(c_anon_param_v3_dir, 'v3.v')
8
9fn 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
18fn 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]
24struct C.AnonNative {
25 value int
26}
27
28fn C.take_ptr(&C.AnonNative) int
29fn C.take_named(stream &C.AnonNative) int
30fn C.take_void(voidptr) int
31fn C.take_primitive(int, u64) int
32fn C.take_multi(&&C.AnonNative) int
33fn C.take_mixed(&C.AnonNative, voidptr, int, &&C.AnonNative) int
34fn C.take_fn(fn (&C.AnonNative) int) int
35fn C.load_matrix(m [16]f32) int
36fn C.width_runes(r []rune) int
37
38fn callback(n &C.AnonNative) int {
39 return n.value
40}
41
42fn 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