From 59c881ff2f0d5cff4dee0577ac4dbc109a6a5f77 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 21 Apr 2026 17:15:47 +0300 Subject: [PATCH] cgen: fix $embed_file not compiling on win10 with microsoft compiler (fixes #12035) --- .gitignore | 5 +++++ vlib/v/gen/c/embed.v | 4 +++- .../c/testdata/embed_issue_12035.c.must_have | 3 +++ vlib/v/gen/c/testdata/embed_issue_12035.out | 1 + vlib/v/gen/c/testdata/embed_issue_12035.vv | 18 ++++++++++++++++++ 5 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 vlib/v/gen/c/testdata/embed_issue_12035.c.must_have create mode 100644 vlib/v/gen/c/testdata/embed_issue_12035.out create mode 100644 vlib/v/gen/c/testdata/embed_issue_12035.vv diff --git a/.gitignore b/.gitignore index 51d04b1eb..1243de1a5 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,11 @@ !vlib/v/gen/c/testdata/nested_unary_minus_regression.vv !vlib/v/gen/c/testdata/nested_unary_minus_regression.out +# unignore c codegen testdata files +!vlib/v/gen/c/testdata/*.vv +!vlib/v/gen/c/testdata/*.out +!vlib/v/gen/c/testdata/*.c.must_have + # unignore vlib/x/markdown !vlib/x/markdown/** diff --git a/vlib/v/gen/c/embed.v b/vlib/v/gen/c/embed.v index e3ed4560a..26fb33da2 100644 --- a/vlib/v/gen/c/embed.v +++ b/vlib/v/gen/c/embed.v @@ -142,6 +142,8 @@ fn (mut g Gen) gen_embedded_data() { // maybe we need to write to separate files or have an external tool for large files // like the `rcc` tool in Qt? */ + // Declare the index before any generated helper references it, to keep MSVC happy. + g.embedded_data.writeln('static const v__embed_file__EmbedFileIndexEntry _v_embed_file_index[];') for i, emfile in g.embedded_files { g.embedded_data.write_string('static const unsigned char _v_embed_blob_${i}[${emfile.bytes.len}] = {\n ') for j := 0; j < emfile.bytes.len; j++ { @@ -158,7 +160,7 @@ fn (mut g Gen) gen_embedded_data() { g.embedded_data.writeln('\n};') } g.embedded_data.writeln('') - g.embedded_data.writeln('const v__embed_file__EmbedFileIndexEntry _v_embed_file_index[] = {') + g.embedded_data.writeln('static const v__embed_file__EmbedFileIndexEntry _v_embed_file_index[] = {') for i, emfile in g.embedded_files { g.embedded_data.writeln('\t{${i}, { .str=(byteptr)("${cestring(emfile.rpath)}"), .len=${emfile.rpath.len}, .is_lit=1 }, { .str=(byteptr)("${cestring(emfile.compression_type)}"), .len=${emfile.compression_type.len}, .is_lit=1 }, (byteptr)_v_embed_blob_${i}},') } diff --git a/vlib/v/gen/c/testdata/embed_issue_12035.c.must_have b/vlib/v/gen/c/testdata/embed_issue_12035.c.must_have new file mode 100644 index 000000000..98f362eab --- /dev/null +++ b/vlib/v/gen/c/testdata/embed_issue_12035.c.must_have @@ -0,0 +1,3 @@ +static const v__embed_file__EmbedFileIndexEntry _v_embed_file_index[]; +static const v__embed_file__EmbedFileIndexEntry _v_embed_file_index[] = { +v__embed_file__EmbedFileData _v_embed_file_metadata(u64 ef_hash) { diff --git a/vlib/v/gen/c/testdata/embed_issue_12035.out b/vlib/v/gen/c/testdata/embed_issue_12035.out new file mode 100644 index 000000000..665d1524f --- /dev/null +++ b/vlib/v/gen/c/testdata/embed_issue_12035.out @@ -0,0 +1 @@ +issue-12035 diff --git a/vlib/v/gen/c/testdata/embed_issue_12035.vv b/vlib/v/gen/c/testdata/embed_issue_12035.vv new file mode 100644 index 000000000..7036e8032 --- /dev/null +++ b/vlib/v/gen/c/testdata/embed_issue_12035.vv @@ -0,0 +1,18 @@ +// vtest vflags: -prod -no-skip-unused +const embedded_version = get_version() + +fn get_version() string { + data := $embed_file('embed_issue_12035.vv') + for line in data.to_string().split_into_lines() { + x := line.trim_space() + if x.starts_with('// version:') { + return x.all_after("'").all_before("'") + } + } + return '' +} + +// version: 'issue-12035' +fn main() { + println(embedded_version) +} -- 2.39.5