Skip to content

Commit c2e4365

Browse files
authored
checker: fix private symbol visibility checking (fix #23518) (#23543)
1 parent 1eaa7c8 commit c2e4365

13 files changed

Lines changed: 148 additions & 51 deletions

File tree

‎vlib/builtin/cfns.c.v‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ fn C.sysctl(name &int, namelen u32, oldp voidptr, oldlenp voidptr, newp voidptr,
236236
@[trusted]
237237
fn C._fileno(int) int
238238

239-
type C.intptr_t = voidptr
239+
pub type C.intptr_t = voidptr
240240

241241
fn C._get_osfhandle(fd int) C.intptr_t
242242

‎vlib/builtin/int.v‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub struct VContext {
77
allocator int
88
}
99

10-
type byte = u8
10+
pub type byte = u8
1111

1212
// ptr_str returns the address of `ptr` as a `string`.
1313
pub fn ptr_str(ptr voidptr) string {

‎vlib/builtin/js/int.js.v‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module builtin
22

3-
type byte = u8
3+
pub type byte = u8
44

55
pub const min_i8 = i8(-128)
66
pub const max_i8 = i8(127)

‎vlib/builtin/wasm/wasi/int.v‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module builtin
22

3-
type byte = u8
3+
pub type byte = u8
44

55
// type i32 = int
66

‎vlib/compress/szip/szip.c.v‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub:
1414
pub struct C.zip_t {
1515
}
1616

17-
type Zip = C.zip_t
17+
pub type Zip = C.zip_t
1818

1919
pub type Fn_on_extract_entry = fn (&&char, &&char) int
2020

‎vlib/encoding/csv/csv_reader_random_access.v‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ pub fn (mut cr RandomAccessReader) get_cell(cfg GetCellConfig) !string {
421421
return cr.default_cell
422422
}
423423

424-
type CellValue = f32 | int | string
424+
pub type CellValue = f32 | int | string
425425

426426
// get_cellt read a single cell and return a sum type CellValue
427427
pub fn (mut cr RandomAccessReader) get_cellt(cfg GetCellConfig) !CellValue {

‎vlib/v/ast/table.v‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,6 +1337,7 @@ pub fn (mut t Table) add_placeholder_type(name string, language Language) int {
13371337
cname: util.no_dots(name).replace_each(['&', ''])
13381338
language: language
13391339
mod: modname
1340+
is_pub: true
13401341
is_builtin: name in builtins
13411342
}
13421343
return t.register_sym(ph_type)

‎vlib/v/ast/types.v‎

Lines changed: 65 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,61 +1051,86 @@ pub fn (mut t Table) register_builtin_type_symbols() {
10511051
// save index check, 0 will mean not found
10521052
// THE ORDER MUST BE THE SAME AS xxx_type_idx CONSTS EARLIER IN THIS FILE
10531053
t.register_sym(kind: .placeholder, name: 'reserved_0')
1054-
t.register_sym(kind: .void, name: 'void', cname: 'void', mod: 'builtin') // 1
1055-
t.register_sym(kind: .voidptr, name: 'voidptr', cname: 'voidptr', mod: 'builtin') // 2
1056-
t.register_sym(kind: .byteptr, name: 'byteptr', cname: 'byteptr', mod: 'builtin') // 3
1057-
t.register_sym(kind: .charptr, name: 'charptr', cname: 'charptr', mod: 'builtin') // 4
1058-
t.register_sym(kind: .i8, name: 'i8', cname: 'i8', mod: 'builtin') // 5
1059-
t.register_sym(kind: .i16, name: 'i16', cname: 'i16', mod: 'builtin') // 6
1060-
t.register_sym(kind: .i32, name: 'i32', cname: 'i32', mod: 'builtin') // 7
1061-
t.register_sym(kind: .int, name: 'int', cname: int_type_name, mod: 'builtin') // 8
1062-
t.register_sym(kind: .i64, name: 'i64', cname: 'i64', mod: 'builtin') // 9
1063-
t.register_sym(kind: .isize, name: 'isize', cname: 'isize', mod: 'builtin') // 10
1064-
t.register_sym(kind: .u8, name: 'u8', cname: 'u8', mod: 'builtin') // 11
1065-
t.register_sym(kind: .u16, name: 'u16', cname: 'u16', mod: 'builtin') // 12
1066-
t.register_sym(kind: .u32, name: 'u32', cname: 'u32', mod: 'builtin') // 13
1067-
t.register_sym(kind: .u64, name: 'u64', cname: 'u64', mod: 'builtin') // 14
1068-
t.register_sym(kind: .usize, name: 'usize', cname: 'usize', mod: 'builtin') // 15
1069-
t.register_sym(kind: .f32, name: 'f32', cname: 'f32', mod: 'builtin') // 16
1070-
t.register_sym(kind: .f64, name: 'f64', cname: 'f64', mod: 'builtin') // 17
1071-
t.register_sym(kind: .char, name: 'char', cname: 'char', mod: 'builtin') // 18
1072-
t.register_sym(kind: .bool, name: 'bool', cname: 'bool', mod: 'builtin') // 19
1073-
t.register_sym(kind: .none, name: 'none', cname: 'none', mod: 'builtin') // 20
1074-
t.register_sym(kind: .string, name: 'string', cname: 'string', mod: 'builtin', is_builtin: true) // 21
1075-
t.register_sym(kind: .rune, name: 'rune', cname: 'rune', mod: 'builtin') // 22
1076-
t.register_sym(kind: .array, name: 'array', cname: 'array', mod: 'builtin', is_builtin: true) // 23
1077-
t.register_sym(kind: .map, name: 'map', cname: 'map', mod: 'builtin', is_builtin: true) // 24
1078-
t.register_sym(kind: .chan, name: 'chan', cname: 'chan', mod: 'builtin') // 25
1079-
t.register_sym(kind: .any, name: 'any', cname: 'any', mod: 'builtin') // 26
1054+
t.register_sym(kind: .void, name: 'void', cname: 'void', mod: 'builtin', is_pub: true) // 1
1055+
t.register_sym(kind: .voidptr, name: 'voidptr', cname: 'voidptr', mod: 'builtin', is_pub: true) // 2
1056+
t.register_sym(kind: .byteptr, name: 'byteptr', cname: 'byteptr', mod: 'builtin', is_pub: true) // 3
1057+
t.register_sym(kind: .charptr, name: 'charptr', cname: 'charptr', mod: 'builtin', is_pub: true) // 4
1058+
t.register_sym(kind: .i8, name: 'i8', cname: 'i8', mod: 'builtin', is_pub: true) // 5
1059+
t.register_sym(kind: .i16, name: 'i16', cname: 'i16', mod: 'builtin', is_pub: true) // 6
1060+
t.register_sym(kind: .i32, name: 'i32', cname: 'i32', mod: 'builtin', is_pub: true) // 7
1061+
t.register_sym(kind: .int, name: 'int', cname: int_type_name, mod: 'builtin', is_pub: true) // 8
1062+
t.register_sym(kind: .i64, name: 'i64', cname: 'i64', mod: 'builtin', is_pub: true) // 9
1063+
t.register_sym(kind: .isize, name: 'isize', cname: 'isize', mod: 'builtin', is_pub: true) // 10
1064+
t.register_sym(kind: .u8, name: 'u8', cname: 'u8', mod: 'builtin', is_pub: true) // 11
1065+
t.register_sym(kind: .u16, name: 'u16', cname: 'u16', mod: 'builtin', is_pub: true) // 12
1066+
t.register_sym(kind: .u32, name: 'u32', cname: 'u32', mod: 'builtin', is_pub: true) // 13
1067+
t.register_sym(kind: .u64, name: 'u64', cname: 'u64', mod: 'builtin', is_pub: true) // 14
1068+
t.register_sym(kind: .usize, name: 'usize', cname: 'usize', mod: 'builtin', is_pub: true) // 15
1069+
t.register_sym(kind: .f32, name: 'f32', cname: 'f32', mod: 'builtin', is_pub: true) // 16
1070+
t.register_sym(kind: .f64, name: 'f64', cname: 'f64', mod: 'builtin', is_pub: true) // 17
1071+
t.register_sym(kind: .char, name: 'char', cname: 'char', mod: 'builtin', is_pub: true) // 18
1072+
t.register_sym(kind: .bool, name: 'bool', cname: 'bool', mod: 'builtin', is_pub: true) // 19
1073+
t.register_sym(kind: .none, name: 'none', cname: 'none', mod: 'builtin', is_pub: true) // 20
10801074
t.register_sym(
1081-
kind: .float_literal
1082-
name: 'float literal'
1083-
cname: 'float_literal'
1084-
mod: 'builtin'
1075+
kind: .string
1076+
name: 'string'
1077+
cname: 'string'
1078+
mod: 'builtin'
1079+
is_builtin: true
1080+
is_pub: true
1081+
) // 21
1082+
t.register_sym(kind: .rune, name: 'rune', cname: 'rune', mod: 'builtin', is_pub: true) // 22
1083+
t.register_sym(
1084+
kind: .array
1085+
name: 'array'
1086+
cname: 'array'
1087+
mod: 'builtin'
1088+
is_builtin: true
1089+
is_pub: true
1090+
) // 23
1091+
t.register_sym(
1092+
kind: .map
1093+
name: 'map'
1094+
cname: 'map'
1095+
mod: 'builtin'
1096+
is_builtin: true
1097+
is_pub: true
1098+
) // 24
1099+
t.register_sym(kind: .chan, name: 'chan', cname: 'chan', mod: 'builtin', is_pub: true) // 25
1100+
t.register_sym(kind: .any, name: 'any', cname: 'any', mod: 'builtin', is_pub: true) // 26
1101+
t.register_sym(
1102+
kind: .float_literal
1103+
name: 'float literal'
1104+
cname: 'float_literal'
1105+
mod: 'builtin'
1106+
is_pub: true
10851107
) // 27
10861108
t.register_sym(
1087-
kind: .int_literal
1088-
name: 'int literal'
1089-
cname: 'int_literal'
1090-
mod: 'builtin'
1109+
kind: .int_literal
1110+
name: 'int literal'
1111+
cname: 'int_literal'
1112+
mod: 'builtin'
1113+
is_pub: true
10911114
) // 28
10921115
t.register_sym(
1093-
kind: .thread
1094-
name: 'thread'
1095-
cname: '__v_thread'
1096-
mod: 'builtin'
1097-
info: Thread{
1116+
kind: .thread
1117+
name: 'thread'
1118+
cname: '__v_thread'
1119+
mod: 'builtin'
1120+
info: Thread{
10981121
return_type: void_type
10991122
}
1123+
is_pub: true
11001124
) // 29
11011125
t.register_sym(
11021126
kind: .interface
11031127
name: 'IError'
11041128
cname: 'IError'
11051129
mod: 'builtin'
11061130
is_builtin: true
1131+
is_pub: true
11071132
) // 30
1108-
t.register_sym(kind: .voidptr, name: 'nil', cname: 'voidptr', mod: 'builtin') // 31
1133+
t.register_sym(kind: .voidptr, name: 'nil', cname: 'voidptr', mod: 'builtin', is_pub: true) // 31
11091134
}
11101135

11111136
@[inline]

‎vlib/v/checker/checker.v‎

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5293,10 +5293,27 @@ fn (mut c Checker) ensure_type_exists(typ ast.Type, pos token.Pos) bool {
52935293
return false
52945294
}
52955295
sym := c.table.sym(typ)
5296-
if !c.is_builtin_mod && sym.kind == .struct && !sym.is_pub && sym.mod != c.mod {
5297-
c.error('struct `${sym.name}` was declared as private to module `${sym.mod}`, so it can not be used inside module `${c.mod}`',
5298-
pos)
5299-
return false
5296+
if !c.is_builtin_mod && !sym.is_pub && sym.mod != c.mod && sym.mod != 'main' {
5297+
if sym.kind == .function {
5298+
fn_info := sym.info as ast.FnType
5299+
// hack: recover fn mod from func name
5300+
mut fn_mod := sym.mod
5301+
if fn_mod == '' {
5302+
fn_mod = fn_info.func.name.all_before_last('.')
5303+
if fn_mod == fn_info.func.name {
5304+
fn_mod = 'builtin'
5305+
}
5306+
}
5307+
if fn_mod != '' && fn_mod != c.mod && fn_info.func.name != '' && !fn_info.is_anon {
5308+
c.error('function type `${fn_info.func.name}` was declared as private to module `${fn_mod}`, so it can not be used inside module `${c.mod}`',
5309+
pos)
5310+
return false
5311+
}
5312+
} else if sym.mod != '' {
5313+
c.error('${sym.kind} `${sym.name}` was declared as private to module `${sym.mod}`, so it can not be used inside module `${c.mod}`',
5314+
pos)
5315+
return false
5316+
}
53005317
}
53015318
match sym.kind {
53025319
.placeholder {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
vlib/v/checker/tests/modules/private_symbol/main.v:10:11: error: function `priv_sym.priv` is private
2+
8 |
3+
9 | fn main() {
4+
10 | priv_sym.priv()
5+
| ~~~~~~
6+
11 | a := priv_sym.Foo(0)
7+
12 | dump(a)
8+
vlib/v/checker/tests/modules/private_symbol/main.v:11:16: error: unknown type `priv_sym.Foo`.
9+
Did you mean `priv_sym.PubFoo`?
10+
9 | fn main() {
11+
10 | priv_sym.priv()
12+
11 | a := priv_sym.Foo(0)
13+
| ~~~~~~
14+
12 | dump(a)
15+
13 | b := priv_sym.BarFn(t)
16+
vlib/v/checker/tests/modules/private_symbol/main.v:13:16: error: unknown type `priv_sym.BarFn`.
17+
Did you mean `priv_sym.PubFoo`?
18+
11 | a := priv_sym.Foo(0)
19+
12 | dump(a)
20+
13 | b := priv_sym.BarFn(t)
21+
| ~~~~~~~~
22+
14 | dump(b)
23+
15 | c := priv_sym.PubFoo(0)

0 commit comments

Comments
 (0)