From 3215451422b7270a048b50da1834159c28716cb4 Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Sat, 20 Jun 2026 00:32:05 +0200 Subject: [PATCH 1/8] arg: try fixing test-args-parser randomly fails --- common/arg.cpp | 2 +- tests/test-arg-parser.cpp | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/common/arg.cpp b/common/arg.cpp index 6fd366d33bec..50602955041b 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -2861,7 +2861,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex params.server_tools = parse_csv_row(value); } ).set_examples({LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_TOOLS")); - add_opt(common_arg( + add_opt(common_arg( {"-ag", "--agent"}, {"-no-ag", "--no-agent"}, "whether to enable CORS proxy and all built-in tools - do not enable in untrusted environments (default: disabled)", diff --git a/tests/test-arg-parser.cpp b/tests/test-arg-parser.cpp index 0dd8422e7366..27b5db1e4c42 100644 --- a/tests/test-arg-parser.cpp +++ b/tests/test-arg-parser.cpp @@ -74,12 +74,14 @@ int main(void) { } } - auto list_str_to_char = [](std::vector & argv) -> std::vector { - std::vector res; + std::vector char_args; + auto list_str_to_char = [&char_args](std::vector & argv) -> std::vector { + char_args.clear(); for (auto & arg : argv) { - res.push_back(const_cast(arg.data())); + char_args.push_back(const_cast(arg.data())); } - return res; + char_args.push_back(nullptr); + return char_args; }; std::vector argv; From 754bd6b061a01b36c0af49214e633d55890de56b Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Sat, 20 Jun 2026 00:35:30 +0200 Subject: [PATCH 2/8] return ref --- tests/test-arg-parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-arg-parser.cpp b/tests/test-arg-parser.cpp index 27b5db1e4c42..45da9054060e 100644 --- a/tests/test-arg-parser.cpp +++ b/tests/test-arg-parser.cpp @@ -75,7 +75,7 @@ int main(void) { } std::vector char_args; - auto list_str_to_char = [&char_args](std::vector & argv) -> std::vector { + auto list_str_to_char = [&char_args](std::vector & argv) -> std::vector & { char_args.clear(); for (auto & arg : argv) { char_args.push_back(const_cast(arg.data())); From 30dbfa1b4835e699b9e340ff41b878e244216737 Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Sat, 20 Jun 2026 00:37:46 +0200 Subject: [PATCH 3/8] try triggering the workflow --- .github/workflows/build-openvino.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-openvino.yml b/.github/workflows/build-openvino.yml index 49ab13695cbf..04bc07c8c95d 100644 --- a/.github/workflows/build-openvino.yml +++ b/.github/workflows/build-openvino.yml @@ -17,10 +17,10 @@ on: pull_request: types: [opened, synchronize, reopened] - paths: [ - '.github/workflows/build-openvino.yml', - 'ggml/src/ggml-openvino/**' - ] + # paths: [ + # '.github/workflows/build-openvino.yml', + # 'ggml/src/ggml-openvino/**' + # ] concurrency: group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }} From 75830296c6ca68ed0328b397084bb2fb2d0552a5 Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Sat, 20 Jun 2026 00:46:19 +0200 Subject: [PATCH 4/8] exception wrapper --- tests/test-arg-parser.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/test-arg-parser.cpp b/tests/test-arg-parser.cpp index 45da9054060e..617aebd86339 100644 --- a/tests/test-arg-parser.cpp +++ b/tests/test-arg-parser.cpp @@ -10,7 +10,7 @@ #undef NDEBUG #include -int main(void) { +int test(void) { common_params params; printf("test-arg-parser: make sure there is no duplicated arguments in any examples\n\n"); @@ -212,3 +212,13 @@ int main(void) { printf("test-arg-parser: all tests OK\n\n"); } + +int main(void) { + try { + test(); + } catch (std::exception & e) { + fprintf(stderr, "test-arg-parser: exception: %s\n", e.what()); + return 1; + } + return 0; +} From 03679b541a83c59979e6d8a46a7b75b7a2a924de Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Sat, 20 Jun 2026 00:47:51 +0200 Subject: [PATCH 5/8] wip --- tests/test-arg-parser.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/test-arg-parser.cpp b/tests/test-arg-parser.cpp index 617aebd86339..e83ee85dd4ba 100644 --- a/tests/test-arg-parser.cpp +++ b/tests/test-arg-parser.cpp @@ -10,7 +10,7 @@ #undef NDEBUG #include -int test(void) { +static void test(void) { common_params params; printf("test-arg-parser: make sure there is no duplicated arguments in any examples\n\n"); @@ -74,14 +74,12 @@ int test(void) { } } - std::vector char_args; - auto list_str_to_char = [&char_args](std::vector & argv) -> std::vector & { - char_args.clear(); + auto list_str_to_char = [](std::vector & argv) -> std::vector { + std::vector res; for (auto & arg : argv) { - char_args.push_back(const_cast(arg.data())); + res.push_back(const_cast(arg.data())); } - char_args.push_back(nullptr); - return char_args; + return res; }; std::vector argv; From 1c17482127b87e2cb6e363f940f04318ac11692a Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Sat, 20 Jun 2026 01:01:54 +0200 Subject: [PATCH 6/8] test --- .github/workflows/build-openvino.yml | 8 ++++---- common/arg.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-openvino.yml b/.github/workflows/build-openvino.yml index 04bc07c8c95d..49ab13695cbf 100644 --- a/.github/workflows/build-openvino.yml +++ b/.github/workflows/build-openvino.yml @@ -17,10 +17,10 @@ on: pull_request: types: [opened, synchronize, reopened] - # paths: [ - # '.github/workflows/build-openvino.yml', - # 'ggml/src/ggml-openvino/**' - # ] + paths: [ + '.github/workflows/build-openvino.yml', + 'ggml/src/ggml-openvino/**' + ] concurrency: group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }} diff --git a/common/arg.cpp b/common/arg.cpp index 87045da6714f..9aedf99325a7 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -924,7 +924,7 @@ static utf8_argv make_utf8_argv() { #endif bool common_params_parse(int argc, char ** argv, common_params & params, llama_example ex, void(*print_usage)(int, char **)) { -#ifdef _WIN32 +#ifdef 0 //_WIN32 auto utf8 = make_utf8_argv(); if (!utf8.ptrs.empty()) { argc = static_cast(utf8.buf.size()); From e2f65b7af7cb1be4462d2335a5695e71779638c0 Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Sat, 20 Jun 2026 01:03:07 +0200 Subject: [PATCH 7/8] test 2 --- common/arg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/arg.cpp b/common/arg.cpp index 9aedf99325a7..988146f26132 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -924,7 +924,7 @@ static utf8_argv make_utf8_argv() { #endif bool common_params_parse(int argc, char ** argv, common_params & params, llama_example ex, void(*print_usage)(int, char **)) { -#ifdef 0 //_WIN32 +#if 0 //#ifdef _WIN32 auto utf8 = make_utf8_argv(); if (!utf8.ptrs.empty()) { argc = static_cast(utf8.buf.size()); From c7c0babd43cdb322ed491fb84badc5af66835049 Mon Sep 17 00:00:00 2001 From: Pascal Date: Sat, 20 Jun 2026 11:19:45 +0200 Subject: [PATCH 8/8] arg: guard win32 utf8 argv override make_utf8_argv rebuilds argv from GetCommandLineW to fix utf8 handling of non ascii arguments on windows. the override runs unconditionally inside common_params_parse, so it also clobbers a programmatic argv passed by a caller. test-arg-parser builds a synthetic argv but then sees the real process command line instead, the model argument is never parsed, and the assert that expects success aborts via fastfail (0xC0000409). this shows up as a random failure in the openvino windows workflow. only override argv when its length matches the caller argc, so the utf8 repair still applies to real binaries while a programmatic argv stays intact. --- common/arg.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/arg.cpp b/common/arg.cpp index 988146f26132..ebba19f92bf9 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -924,10 +924,10 @@ static utf8_argv make_utf8_argv() { #endif bool common_params_parse(int argc, char ** argv, common_params & params, llama_example ex, void(*print_usage)(int, char **)) { -#if 0 //#ifdef _WIN32 +#ifdef _WIN32 auto utf8 = make_utf8_argv(); - if (!utf8.ptrs.empty()) { - argc = static_cast(utf8.buf.size()); + // repair argv only when it matches the process command line + if (static_cast(utf8.buf.size()) == argc) { argv = utf8.ptrs.data(); } #endif