From c1c9fa8250306ec7612d62521f2943e3a029d11d Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 11 Mar 2026 14:12:29 +0300 Subject: [PATCH] cgen: types are not respected with -no-builtin (fixes #21264) --- vlib/v/gen/c/cgen.v | 17 ++++++++++++- .../gen/c/no_builtin_no_preludes_types_test.v | 19 ++++++++++++++ .../testdata/no_builtin_no_preludes_types.vv | 25 +++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 vlib/v/gen/c/no_builtin_no_preludes_types_test.v create mode 100644 vlib/v/gen/c/testdata/no_builtin_no_preludes_types.vv diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 985152383..e4ea6cc45 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -1829,6 +1829,20 @@ static inline ${option_name}_void __Option_${styp}_pushval(${styp} ch, ${el_type // cc_type whether to prefix 'struct' or not (C__Foo -> struct Foo) fn (mut g Gen) cc_type(typ ast.Type, is_prefix_struct bool) string { sym := g.table.sym(g.unwrap_generic(typ)) + if g.pref.no_preludes { + match sym.kind { + .voidptr { + return 'void*' + } + .charptr { + return 'char*' + } + .byteptr { + return 'unsigned char*' + } + else {} + } + } mut styp := sym.scoped_cname() // TODO: this needs to be removed; cgen shouldn't resolve generic types (job of checker) match sym.info { @@ -1878,7 +1892,8 @@ pub fn (mut g Gen) write_typedef_types() { .array { info := sym.info as ast.Array elem_sym := g.table.sym(info.elem_type) - if elem_sym.kind != .placeholder && !info.elem_type.has_flag(.generic) { + if !g.pref.no_preludes && elem_sym.kind != .placeholder + && !info.elem_type.has_flag(.generic) { g.type_definitions.writeln('typedef array ${sym.cname};') } } diff --git a/vlib/v/gen/c/no_builtin_no_preludes_types_test.v b/vlib/v/gen/c/no_builtin_no_preludes_types_test.v new file mode 100644 index 000000000..03cbe4a35 --- /dev/null +++ b/vlib/v/gen/c/no_builtin_no_preludes_types_test.v @@ -0,0 +1,19 @@ +import os + +const vexe = @VEXE + +const vroot = os.real_path(@VMODROOT) + +const testdata_file = os.join_path(vroot, 'vlib/v/gen/c/testdata/no_builtin_no_preludes_types.vv') + +fn test_no_builtin_no_preludes_types_are_lowered_to_c() { + os.chdir(vroot) or {} + cmd := '${os.quoted_path(vexe)} -no-builtin -no-preludes -enable-globals -gc none -no-skip-unused -o - ${os.quoted_path(testdata_file)}' + compilation := os.execute(cmd) + assert compilation.exit_code == 0 + generated_c := compilation.output.replace('\r\n', '\n') + assert !generated_c.contains('typedef array Array_charptr;') + assert !generated_c.contains('voidptr file') + assert generated_c.contains('main__proc_read(void* file, char* buff, u32 size, u64* offset);') + assert generated_c.contains('(void*,char*,u32,u64*);') +} diff --git a/vlib/v/gen/c/testdata/no_builtin_no_preludes_types.vv b/vlib/v/gen/c/testdata/no_builtin_no_preludes_types.vv new file mode 100644 index 000000000..d9e2563f2 --- /dev/null +++ b/vlib/v/gen/c/testdata/no_builtin_no_preludes_types.vv @@ -0,0 +1,25 @@ +// vtest vflags: -no-builtin -no-preludes -enable-globals -gc none +module main + +fn C.klog(...charptr) +fn C.proc_create(charptr, int, int, &C.proc_ops) + +struct C.proc_ops { + proc_read fn (voidptr, &char, u32, &u64) +} + +fn proc_read(file voidptr, buff &char, size u32, offset &u64) {} + +__global fops = C.proc_ops{ + proc_read: proc_read +} + +fn custom_init() int { + C.klog(c'Hello module %s!\n', c'proc') + C.proc_create(c'proc_proc', 0, 0, &fops) + return 0 +} + +fn main() { + custom_init() +} -- 2.39.5