From 42c0bae9ce0440e62f8d23fa7c5e3fab9c043687 Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 23 Aug 2022 16:15:25 +0800 Subject: [PATCH] checker: check unknown array of fn type in struct field (#15502) --- vlib/v/checker/checker.v | 7 +++++++ vlib/v/checker/struct.v | 10 ---------- .../tests/unknown_array_fn_type_in_struct_field.out | 7 +++++++ .../tests/unknown_array_fn_type_in_struct_field.vv | 10 ++++++++++ 4 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 vlib/v/checker/tests/unknown_array_fn_type_in_struct_field.out create mode 100644 vlib/v/checker/tests/unknown_array_fn_type_in_struct_field.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 33fa3d900..0ae4eb963 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3827,6 +3827,13 @@ fn (mut c Checker) ensure_type_exists(typ ast.Type, pos token.Pos) ? { return } } + .function { + fn_info := sym.info as ast.FnType + c.ensure_type_exists(fn_info.func.return_type, fn_info.func.return_type_pos)? + for param in fn_info.func.params { + c.ensure_type_exists(param.typ, param.type_pos)? + } + } .array { c.ensure_type_exists((sym.info as ast.Array).elem_type, pos)? } diff --git a/vlib/v/checker/struct.v b/vlib/v/checker/struct.v index 44f6dd687..e97571fde 100644 --- a/vlib/v/checker/struct.v +++ b/vlib/v/checker/struct.v @@ -68,16 +68,6 @@ pub fn (mut c Checker) struct_decl(mut node ast.StructDecl) { field.type_pos) } } - field_sym := c.table.sym(field.typ) - if field_sym.kind == .function { - fn_info := field_sym.info as ast.FnType - c.ensure_type_exists(fn_info.func.return_type, fn_info.func.return_type_pos) or { - return - } - for param in fn_info.func.params { - c.ensure_type_exists(param.typ, param.type_pos) or { return } - } - } } if sym.kind == .struct_ { info := sym.info as ast.Struct diff --git a/vlib/v/checker/tests/unknown_array_fn_type_in_struct_field.out b/vlib/v/checker/tests/unknown_array_fn_type_in_struct_field.out new file mode 100644 index 000000000..6ed81f7f9 --- /dev/null +++ b/vlib/v/checker/tests/unknown_array_fn_type_in_struct_field.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/unknown_array_fn_type_in_struct_field.vv:2:22: error: unknown type `UnknownThing`. +Did you mean `[2]fn (u32) UnknownThing`? + 1 | struct Virt { + 2 | fns [2]fn (num u32) UnknownThing + | ~~~~~~~~~~~~ + 3 | } + 4 | diff --git a/vlib/v/checker/tests/unknown_array_fn_type_in_struct_field.vv b/vlib/v/checker/tests/unknown_array_fn_type_in_struct_field.vv new file mode 100644 index 000000000..50bf1332d --- /dev/null +++ b/vlib/v/checker/tests/unknown_array_fn_type_in_struct_field.vv @@ -0,0 +1,10 @@ +struct Virt { + fns [2]fn (num u32) UnknownThing +} + +fn (virt Virt) caller() { + func := virt.fns[0] + func(5) +} + +fn main() {} -- 2.39.5