From 27a427d17fc35ea774f2d881efee4686f2d0180d Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 21 Apr 2026 17:03:34 +0300 Subject: [PATCH] builder: fix import vsl.la failing (fixes #17389) --- vlib/v/builder/rebuilding.v | 6 +++ vlib/v/slow_tests/repl/enum.repl | 21 +------- .../repl/import_vmodules_submodule_test.v | 52 +++++++++++++++++++ 3 files changed, 60 insertions(+), 19 deletions(-) diff --git a/vlib/v/builder/rebuilding.v b/vlib/v/builder/rebuilding.v index 3bdbedf9d..6246dae14 100644 --- a/vlib/v/builder/rebuilding.v +++ b/vlib/v/builder/rebuilding.v @@ -17,6 +17,12 @@ pub fn (mut b Builder) rebuild_modules() { if !b.pref.use_cache || b.pref.build_mode == .build_module { return } + if b.pref.check_only || b.pref.only_check_syntax { + // Check-only flows should not trigger side-effecting cache rebuilds. + // In the REPL import path that can compile imported `.c.v` modules + // and surface irrelevant missing-header errors for declaration-only checks. + return + } all_files := b.parsed_files.map(it.path) $if trace_invalidations ? { eprintln('> rebuild_modules all_files: ${all_files}') diff --git a/vlib/v/slow_tests/repl/enum.repl b/vlib/v/slow_tests/repl/enum.repl index d34a0d8b2..659e2cbf5 100644 --- a/vlib/v/slow_tests/repl/enum.repl +++ b/vlib/v/slow_tests/repl/enum.repl @@ -2,22 +2,5 @@ enum Info { young old } fn get_info(age int) Info { if age < 25 { return .young } else { return .old } } mut age := 20; println(get_info(age)); age = 45; println(get_info(age)) ===output=== -warning: module 'os' is imported but never used. Use `import os as _`, to silence this warning, or just remove the unused import line - 1 | import os - | ~~ - 2 | - 3 | import time -warning: module 'time' is imported but never used. Use `import time as _`, to silence this warning, or just remove the unused import line - 1 | import os - 2 | - 3 | import time - | ~~~~ - 4 | - 5 | import math -warning: module 'math' is imported but never used. Use `import math as _`, to silence this warning, or just remove the unused import line - 3 | import time - 4 | - 5 | import math - | ~~~~ - 6 | - 7 | enum Info { +young +old diff --git a/vlib/v/slow_tests/repl/import_vmodules_submodule_test.v b/vlib/v/slow_tests/repl/import_vmodules_submodule_test.v index ff0f0a8db..0d5ade41c 100644 --- a/vlib/v/slow_tests/repl/import_vmodules_submodule_test.v +++ b/vlib/v/slow_tests/repl/import_vmodules_submodule_test.v @@ -48,3 +48,55 @@ pub fn testme() int { assert p.code == 0, 'stdout: ${output}\nstderr: ${errors}' assert output.trim_space() == '1', 'stdout: ${output}\nstderr: ${errors}' } + +fn test_repl_import_does_not_rebuild_c_headers_during_check_only() { + old_vmodules := os.getenv('VMODULES') + temp_dir := os.join_path(os.vtmp_dir(), 'v_repl_import_vmodules_c_header_${os.getpid()}') + vmodules_dir := os.join_path(temp_dir, '.vmodules') + module_root := os.join_path(vmodules_dir, 'importc') + submodule_dir := os.join_path(module_root, 'la') + repl_dir := os.join_path(temp_dir, 'repl') + defer { + if old_vmodules == '' { + os.unsetenv('VMODULES') + } else { + os.setenv('VMODULES', old_vmodules, true) + } + os.rmdir_all(temp_dir) or {} + } + os.rmdir_all(temp_dir) or {} + os.mkdir_all(submodule_dir) or { panic(err) } + os.mkdir_all(repl_dir) or { panic(err) } + os.write_file(os.join_path(submodule_dir, 'la.v'), 'module la + +pub fn ping() int { + return 1 +} +') or { + panic(err) + } + os.write_file(os.join_path(submodule_dir, 'ffi.c.v'), 'module la + +#include "missing_header_17389.h" + +fn C.importc_test_missing_header() int +') or { + panic(err) + } + os.setenv('VMODULES', vmodules_dir, true) + vexec := runner.full_path_to_v(5) + mut p := os.new_process(vexec) + p.set_args(['repl', '-replfolder', repl_dir, '-replprefix', 'import_vmodules_c_header.']) + p.set_work_folder(module_root) + p.set_redirect_stdio() + p.run() + p.stdin_write('import importc.la\nexit\n') + p.wait() + output := p.stdout_slurp() + errors := p.stderr_slurp() + p.close() + combined := output + errors + assert p.code == 0, 'stdout: ${output}\nstderr: ${errors}' + assert !combined.contains('builder error:'), 'stdout: ${output}\nstderr: ${errors}' + assert !combined.contains('missing_header_17389.h'), 'stdout: ${output}\nstderr: ${errors}' +} -- 2.39.5