From aa9bd1dc255f995050e8d862b1ec1fe0caa00aa3 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Tue, 21 Jan 2025 20:05:04 +0800 Subject: [PATCH 1/2] checker: fix private type --- vlib/builtin/cfns_wrapper.c.v | 2 ++ vlib/v/checker/checker.v | 27 ++++++++++++++++--- .../tests/type_alias_decl_private_err.out | 15 +++++++++++ .../tests/type_alias_decl_private_err.vv | 13 +++++++++ 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 vlib/v/checker/tests/type_alias_decl_private_err.out create mode 100644 vlib/v/checker/tests/type_alias_decl_private_err.vv diff --git a/vlib/builtin/cfns_wrapper.c.v b/vlib/builtin/cfns_wrapper.c.v index c56792b3ee00bb..25b1a56db7c297 100644 --- a/vlib/builtin/cfns_wrapper.c.v +++ b/vlib/builtin/cfns_wrapper.c.v @@ -82,3 +82,5 @@ type FnSortCB = fn (const_a voidptr, const_b voidptr) int fn vqsort(base voidptr, nmemb usize, size usize, sort_cb FnSortCB) { C.qsort(base, nmemb, size, voidptr(sort_cb)) } + +type MyPrivateType = u32 diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 532bede4f36e9a..182d839d3a2fbe 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -5293,10 +5293,29 @@ fn (mut c Checker) ensure_type_exists(typ ast.Type, pos token.Pos) bool { return false } sym := c.table.sym(typ) - if !c.is_builtin_mod && sym.kind == .struct && !sym.is_pub && sym.mod != c.mod { - c.error('struct `${sym.name}` was declared as private to module `${sym.mod}`, so it can not be used inside module `${c.mod}`', - pos) - return false + if !c.is_builtin_mod && !sym.is_pub && sym.mod != c.mod { + if sym.kind == .struct { + c.error('struct `${sym.name}` was declared as private to module `${sym.mod}`, so it can not be used inside module `${c.mod}`', + pos) + return false + } + if sym.kind == .alias || sym.kind == .sum_type { + c.error('module `${sym.mod}` type `${sym.name}` is private', pos) + return false + } + if sym.kind == .function { + fn_info := sym.info as ast.FnType + // hack: recover fn mod from func name + mut fn_mod := fn_info.func.name.all_before('.') + if fn_mod == fn_info.func.name { + fn_mod = 'builtin' + } + if fn_mod != '' && fn_mod != c.mod && fn_info.func.name != '' { + c.error('module `${fn_mod}` function type `${fn_info.func.name}` is private', + pos) + return false + } + } } match sym.kind { .placeholder { diff --git a/vlib/v/checker/tests/type_alias_decl_private_err.out b/vlib/v/checker/tests/type_alias_decl_private_err.out new file mode 100644 index 00000000000000..dd8983f9d4e3e5 --- /dev/null +++ b/vlib/v/checker/tests/type_alias_decl_private_err.out @@ -0,0 +1,15 @@ +type_alias_decl_private_err.vv:7:15: error: module `builtin` function type `FnSortCB` is private + 5 | } + 6 | + 7 | fn hello(func FnSortCB) { + | ~~~~~~~~ + 8 | } + 9 | +type_alias_decl_private_err.vv:11:11: error: module `cli` type `cli.Defaults` is private + 9 | + 10 | fn main() { + 11 | _ := cli.Defaults(true) + | ~~~~~~~~~~~~~~ + 12 | hello(my_sort) + 13 | } + diff --git a/vlib/v/checker/tests/type_alias_decl_private_err.vv b/vlib/v/checker/tests/type_alias_decl_private_err.vv new file mode 100644 index 00000000000000..70b5a42ca447c5 --- /dev/null +++ b/vlib/v/checker/tests/type_alias_decl_private_err.vv @@ -0,0 +1,13 @@ +import cli + +fn my_sort(a voidptr, b voidptr) int { + return 1 +} + +fn hello(func FnSortCB) { +} + +fn main() { + _ := cli.Defaults(true) + hello(my_sort) +} From 8db36f8f41d6ceb358e614fcc2fd6a2f72f222b3 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Tue, 21 Jan 2025 20:19:54 +0800 Subject: [PATCH 2/2] fix --- vlib/v/checker/checker.v | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 182d839d3a2fbe..83e5dc58758b9a 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -5306,7 +5306,7 @@ fn (mut c Checker) ensure_type_exists(typ ast.Type, pos token.Pos) bool { if sym.kind == .function { fn_info := sym.info as ast.FnType // hack: recover fn mod from func name - mut fn_mod := fn_info.func.name.all_before('.') + mut fn_mod := fn_info.func.name.all_before_last('.') if fn_mod == fn_info.func.name { fn_mod = 'builtin' }