From 476486007164a36917687b6c6d195faba990c93f Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Mon, 11 May 2026 04:26:40 +0300 Subject: [PATCH] ast: detect C aliases by name prefix in rewrite_already_registered_symbol, instead of marking every C alias TypeSymbol with language=.c --- vlib/v/ast/table.v | 6 ++++-- .../gen/c/testdata/c_alias_redeclaration.c.must_have | 2 ++ vlib/v/gen/c/testdata/c_alias_redeclaration.vv | 11 +++++++++++ vlib/v/parser/parser.v | 1 - 4 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 vlib/v/gen/c/testdata/c_alias_redeclaration.c.must_have create mode 100644 vlib/v/gen/c/testdata/c_alias_redeclaration.vv diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index cbdb72aea..ccebd507b 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -1158,8 +1158,10 @@ fn (mut t Table) rewrite_already_registered_symbol(typ TypeSymbol, existing_idx return existing_idx } // Allow C type aliases to override existing C types (e.g. `type C.WCHAR = u16` - // on Windows where WCHAR is already registered from system headers): - if typ.kind == .alias && typ.language == .c && existing_symbol.language == .c { + // on Windows where WCHAR is already registered from system headers). + // Detect C aliases by the `C.` name prefix, since alias TypeSymbols + // themselves don't carry .language == .c (only Alias.info.language does): + if typ.kind == .alias && typ.name.starts_with('C.') && existing_symbol.name.starts_with('C.') { t.type_symbols[existing_idx] = &TypeSymbol{ ...typ idx: existing_idx diff --git a/vlib/v/gen/c/testdata/c_alias_redeclaration.c.must_have b/vlib/v/gen/c/testdata/c_alias_redeclaration.c.must_have new file mode 100644 index 000000000..6b6743bb6 --- /dev/null +++ b/vlib/v/gen/c/testdata/c_alias_redeclaration.c.must_have @@ -0,0 +1,2 @@ +#define C__RedeclareLong RedeclareLong +VV_LOC C__RedeclareLong main__use_redeclare_long(C__RedeclareLong x); diff --git a/vlib/v/gen/c/testdata/c_alias_redeclaration.vv b/vlib/v/gen/c/testdata/c_alias_redeclaration.vv new file mode 100644 index 000000000..4a0143071 --- /dev/null +++ b/vlib/v/gen/c/testdata/c_alias_redeclaration.vv @@ -0,0 +1,11 @@ +// Regression: redeclaring a C alias must not set the alias TypeSymbol's +// language to .c. If it does, the C backend emits the raw C name instead of +// the `C__Name` cname for any later use of the alias. + +type C.RedeclareLong = int +type C.RedeclareLong = int + +@[markused] +fn use_redeclare_long(x C.RedeclareLong) C.RedeclareLong { + return x +} diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 41bd55a8d..c1a6c23bf 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -3278,7 +3278,6 @@ fn (mut p Parser) type_decl() ast.TypeDecl { cname: util.no_dots(prepend_mod_name) mod: p.mod parent_idx: pidx - language: language info: ast.Alias{ parent_type: parent_type language: parent_language -- 2.39.5