From d398402707ab2298a12fbeabefe274eba5b1c2cd Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Fri, 15 May 2026 10:37:50 +0300 Subject: [PATCH] ci: fix follow-up CI failures --- vlib/builtin/builtin_test.c.v | 5 ++++ vlib/builtin/cfns.c.v | 1 + vlib/runtime/used_memory_windows.c.v | 1 + vlib/v/builder/cc_test.v | 29 ++++++++++++++++--- vlib/v/gen/c/cheaders.v | 1 + .../gen/c/cheaders_manual_stdlib_decls_test.v | 1 + vlib/v/gen/c/consts_and_globals.v | 8 ++--- vlib/v/gen/c/thread_bool_wait_codegen_test.v | 2 +- vlib/v/util/check_dflags_test.v | 27 +++++++++-------- 9 files changed, 54 insertions(+), 21 deletions(-) diff --git a/vlib/builtin/builtin_test.c.v b/vlib/builtin/builtin_test.c.v index 7f527dcbc..3adc0cc90 100644 --- a/vlib/builtin/builtin_test.c.v +++ b/vlib/builtin/builtin_test.c.v @@ -13,6 +13,11 @@ fn test_g_main_argv() { assert first_arg.contains('builtin_test') } +fn test_c_strstr_is_declared() { + found := unsafe { C.strstr(c'hello world', c'world') } != unsafe { nil } + assert found +} + @[if windows] fn test_bool_size() { println(@LOCATION) diff --git a/vlib/builtin/cfns.c.v b/vlib/builtin/cfns.c.v index ad9531b3a..938ee8414 100644 --- a/vlib/builtin/cfns.c.v +++ b/vlib/builtin/cfns.c.v @@ -118,6 +118,7 @@ fn C.close(fd i32) i32 fn C.strrchr(s &char, c i32) &char fn C.strchr(s &char, c i32) &char +fn C.strstr(const_haystack &char, const_needle &char) &char // process execution, os.process: @[trusted] diff --git a/vlib/runtime/used_memory_windows.c.v b/vlib/runtime/used_memory_windows.c.v index d695c0419..6f0581ce9 100644 --- a/vlib/runtime/used_memory_windows.c.v +++ b/vlib/runtime/used_memory_windows.c.v @@ -1,5 +1,6 @@ module runtime +#define PSAPI_VERSION 2 #include // Windows 7+ exports K32GetProcessMemoryInfo from kernel32.dll, so avoid diff --git a/vlib/v/builder/cc_test.v b/vlib/v/builder/cc_test.v index 2cab054ab..801523d09 100644 --- a/vlib/v/builder/cc_test.v +++ b/vlib/v/builder/cc_test.v @@ -530,22 +530,43 @@ fn builder_linker_args(args []string) string { } fn builder_linker_args_with_cc(args []string, cc CC) string { - mut builder := new_test_builder(args) - builder.ccoptions.cc = cc + mut builder := new_test_builder_without_cc_setup(args) + ccompiler := ccompiler_name_for_test_cc(cc) + builder.pref.ccompiler = ccompiler + builder.pref.ccompiler_type = pref.cc_from_string(ccompiler) + builder.setup_ccompiler_options(ccompiler) + builder.setup_output_name() return builder.get_linker_args().join(' ') } fn new_test_builder(args []string) Builder { + mut builder := new_test_builder_without_cc_setup(args) + builder.setup_ccompiler_options(builder.pref.ccompiler) + builder.setup_output_name() + return builder +} + +fn new_test_builder_without_cc_setup(args []string) Builder { mut full_args := [''] full_args << args prefs, _ := pref.parse_args_and_show_errors([], full_args, false) mut builder := new_builder(prefs) builder.out_name_c = os.join_path(os.vtmp_dir(), 'builder_cc_test.tmp.c') - builder.setup_ccompiler_options(prefs.ccompiler) - builder.setup_output_name() return builder } +fn ccompiler_name_for_test_cc(cc CC) string { + return match cc { + .tcc { 'tcc' } + .gcc { 'gcc' } + .icc { 'icc' } + .msvc { 'msvc' } + .clang { 'clang' } + .emcc { 'emcc' } + .unknown { '' } + } +} + fn new_builder_for_args(args []string) Builder { mut full_args := [''] full_args << args diff --git a/vlib/v/gen/c/cheaders.v b/vlib/v/gen/c/cheaders.v index 8c424eab5..0260e8c3e 100644 --- a/vlib/v/gen/c/cheaders.v +++ b/vlib/v/gen/c/cheaders.v @@ -616,6 +616,7 @@ V_CRT_LINKAGE int V_CRT_CALL memcmp(const void *left, const void *right, size_t V_CRT_LINKAGE void * V_CRT_CALL memchr(const void *str, int c, size_t n); V_CRT_LINKAGE char * V_CRT_CALL strchr(const char *str, int c); V_CRT_LINKAGE char * V_CRT_CALL strrchr(const char *str, int c); +V_CRT_LINKAGE char * V_CRT_CALL strstr(const char *haystack, const char *needle); V_CRT_LINKAGE int V_CRT_CALL fseek(FILE *stream, long offset, int whence); V_CRT_LINKAGE isize V_CRT_CALL getline(char **lineptr, size_t *n, FILE *stream); #if defined(_WIN32) || defined(_WIN64) diff --git a/vlib/v/gen/c/cheaders_manual_stdlib_decls_test.v b/vlib/v/gen/c/cheaders_manual_stdlib_decls_test.v index 9bc0a10e2..94f8ba79d 100644 --- a/vlib/v/gen/c/cheaders_manual_stdlib_decls_test.v +++ b/vlib/v/gen/c/cheaders_manual_stdlib_decls_test.v @@ -28,6 +28,7 @@ fn test_default_c_prelude_uses_manual_stdio_stdlib_string_and_stdarg_decls() { assert generated_c.contains('V_CRT_LINKAGE int V_CRT_CALL mkstemp(char *stemplate);'), generated_c assert generated_c.contains('V_CRT_LINKAGE int V_CRT_CALL strcmp(const char *left, const char *right);'), generated_c assert generated_c.contains('V_CRT_LINKAGE int V_CRT_CALL strncmp(const char *left, const char *right, size_t n);'), generated_c + assert generated_c.contains('V_CRT_LINKAGE char * V_CRT_CALL strstr(const char *haystack, const char *needle);'), generated_c assert generated_c.contains('#if !defined(_WIN32) && !defined(_WIN64) && !defined(__BIONIC__)'), generated_c assert generated_c.contains('V_CRT_LINKAGE char * V_CRT_CALL strdup(const char *str);'), generated_c assert generated_c.contains('V_CRT_LINKAGE int V_CRT_CALL rand(void);'), generated_c diff --git a/vlib/v/gen/c/consts_and_globals.v b/vlib/v/gen/c/consts_and_globals.v index f68e0ce63..a7769a707 100644 --- a/vlib/v/gen/c/consts_and_globals.v +++ b/vlib/v/gen/c/consts_and_globals.v @@ -592,12 +592,12 @@ fn (mut g Gen) global_decl(node ast.GlobalDecl) { continue } if field.is_extern { - thread_local := if field.name == 'g_memory_block' && g.pref.prealloc { + tls_kw := if field.name == 'g_memory_block' && g.pref.prealloc { '_Thread_local ' } else { '' } - def_builder.writeln('${extern}${thread_local}${field_visibility_kw}${qualifiers}${styp} ${attributes}${final_c_name}; // global 2') + def_builder.writeln('${extern}${tls_kw}${field_visibility_kw}${qualifiers}${styp} ${attributes}${final_c_name}; // global 2') g.global_const_defs[name] = GlobalConstDef{ mod: node.mod def: def_builder.str() @@ -607,12 +607,12 @@ fn (mut g Gen) global_decl(node ast.GlobalDecl) { } mut needs_ending_semicolon := false if field.language != .c || field.has_expr { - thread_local := if field.name == 'g_memory_block' && g.pref.prealloc { + tls_kw := if field.name == 'g_memory_block' && g.pref.prealloc { '_Thread_local ' } else { '' } - def_builder.write_string('${extern}${thread_local}${field_visibility_kw}${qualifiers}${styp} ${attributes}${final_c_name}') + def_builder.write_string('${extern}${tls_kw}${field_visibility_kw}${qualifiers}${styp} ${attributes}${final_c_name}') needs_ending_semicolon = true } if field.has_expr || cinit { diff --git a/vlib/v/gen/c/thread_bool_wait_codegen_test.v b/vlib/v/gen/c/thread_bool_wait_codegen_test.v index 43cec8f0c..f856beaf4 100644 --- a/vlib/v/gen/c/thread_bool_wait_codegen_test.v +++ b/vlib/v/gen/c/thread_bool_wait_codegen_test.v @@ -45,7 +45,7 @@ fn test_prealloc_spawn_args_use_c_malloc() { assert res.output.contains('builtin__prealloc_scope_release(arg->prealloc_scope);'), res.output assert res.output.contains('free(arg);'), res.output assert !res.output.contains('builtin___v_malloc(sizeof(thread_arg_main__worker))'), res.output - assert res.output.contains('int* ret_ptr = (int*) malloc(sizeof(int));'), res.output + assert res.output.contains('malloc(sizeof(int))'), res.output assert res.output.contains('free(ret_ptr);'), res.output } diff --git a/vlib/v/util/check_dflags_test.v b/vlib/v/util/check_dflags_test.v index c3340fc98..5be522f88 100644 --- a/vlib/v/util/check_dflags_test.v +++ b/vlib/v/util/check_dflags_test.v @@ -32,20 +32,23 @@ fn test_if_compilation_with_custom_cflags_works_numbers_composed_arithmetic() { assert C.CNUMBERS6 == 123123 } -#flag -DFNAME0=$d('A1','"printf"') -#flag -DFNAME1=$d('A1','"print')$d('A2','f"') -#flag -DFNAME2=$d('A1', 'print')$d('A2','f') -#flag -DFNAME3=$d('A1','prin' )$d('A2','tf') -#flag -DFNAME4=$d('A1', 'pri' )$d('A2','ntf') -#flag -DFNAME5=$d('A1', 'pr' )$d('A2','intf') ## +@[export: 'check_dflags_fn'] +pub fn check_dflags_fn() {} + +#flag -DFNAME0=$d('A1','"check_dflags_fn"') +#flag -DFNAME1=$d('A1','"check_d')$d('A2','flags_fn"') +#flag -DFNAME2=$d('A1', 'check_d')$d('A2','flags_fn') +#flag -DFNAME3=$d('A1','check_dfl' )$d('A2','ags_fn') +#flag -DFNAME4=$d('A1', 'check_dfla' )$d('A2','gs_fn') +#flag -DFNAME5=$d('A1', 'check_dflag' )$d('A2','s_fn') ## fn test_custom_flags_with_composed_strings() { - assert voidptr(C.FNAME0) == voidptr(C.printf) - assert voidptr(C.FNAME1) == voidptr(C.printf) - assert voidptr(C.FNAME2) == voidptr(C.printf) - assert voidptr(C.FNAME3) == voidptr(C.printf) - assert voidptr(C.FNAME4) == voidptr(C.printf) - assert voidptr(C.FNAME5) == voidptr(C.printf) + assert voidptr(C.FNAME0) == voidptr(C.check_dflags_fn) + assert voidptr(C.FNAME1) == voidptr(C.check_dflags_fn) + assert voidptr(C.FNAME2) == voidptr(C.check_dflags_fn) + assert voidptr(C.FNAME3) == voidptr(C.check_dflags_fn) + assert voidptr(C.FNAME4) == voidptr(C.check_dflags_fn) + assert voidptr(C.FNAME5) == voidptr(C.check_dflags_fn) } #flag -DCMIXED1=$d('A1','mixed')_$d('A2',1) -- 2.39.5