From 7b212b2e737e9d59655a6ed5e0c344bc9254ba38 Mon Sep 17 00:00:00 2001 From: Jose Mendoza <56417208+StunxFS@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:07:06 -0400 Subject: [PATCH] checker: disallow C/JS functions and structs to be declared as generic (#22533) --- vlib/v/checker/fn.v | 4 +++ vlib/v/checker/struct.v | 4 +++ .../c_js_struct_and_fn_as_generics_error.out | 26 +++++++++++++++++++ .../c_js_struct_and_fn_as_generics_error.vv | 13 ++++++++++ 4 files changed, 47 insertions(+) create mode 100644 vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.out create mode 100644 vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.vv diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 0d04e189c..738a152cc 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -13,6 +13,10 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) { eprintln('>>> post processing node.name: ${node.name:-30} | ${node.generic_names} <=> ${c.table.cur_concrete_types}') } } + if node.language in [.c, .js] && node.generic_names.len > 0 { + lang := if node.language == .c { 'C' } else { 'JS' } + c.error('${lang} functions cannot be declared as generic', node.pos) + } // record the veb route methods (public non-generic methods): if node.generic_names.len > 0 && node.is_pub { typ_vweb_result := c.table.find_type_idx('veb.Result') diff --git a/vlib/v/checker/struct.v b/vlib/v/checker/struct.v index 613a56514..22dc5d334 100644 --- a/vlib/v/checker/struct.v +++ b/vlib/v/checker/struct.v @@ -11,6 +11,10 @@ fn (mut c Checker) struct_decl(mut node ast.StructDecl) { defer { util.timing_measure_cumulative(@METHOD) } + if node.language in [.c, .js] && node.generic_types.len > 0 { + lang := if node.language == .c { 'C' } else { 'JS' } + c.error('${lang} structs cannot be declared as generic', node.pos) + } node_name := if node.scoped_name != '' { node.scoped_name } else { node.name } mut struct_sym, struct_typ_idx := c.table.find_sym_and_type_idx(node_name) mut has_generic_types := false diff --git a/vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.out b/vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.out new file mode 100644 index 000000000..510aa255f --- /dev/null +++ b/vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.out @@ -0,0 +1,26 @@ +vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.vv:1:1: error: C structs cannot be declared as generic + 1 | struct C.Ptr[T] { + | ~~~~~~~~~~~~ + 2 | ptr &T + 3 | } +vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.vv:5:1: error: C functions cannot be declared as generic + 3 | } + 4 | + 5 | fn C.alloc[T]() &T + | ~~~~~~~~~~~~~~~~~~ + 6 | + 7 | fn JS.encode[T](data string) T +vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.vv:7:1: error: JS functions cannot be declared as generic + 5 | fn C.alloc[T]() &T + 6 | + 7 | fn JS.encode[T](data string) T + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 8 | + 9 | struct JS.Some[T] { +vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.vv:9:1: error: JS structs cannot be declared as generic + 7 | fn JS.encode[T](data string) T + 8 | + 9 | struct JS.Some[T] { + | ~~~~~~~~~~~~~~ + 10 | i T + 11 | } diff --git a/vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.vv b/vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.vv new file mode 100644 index 000000000..910d99225 --- /dev/null +++ b/vlib/v/checker/tests/c_js_struct_and_fn_as_generics_error.vv @@ -0,0 +1,13 @@ +struct C.Ptr[T] { + ptr &T +} + +fn C.alloc[T]() &T + +fn JS.encode[T](data string) T + +struct JS.Some[T] { + i T +} + +fn main() {} -- 2.39.5