From 1831eccd5e71bd3a13166d2f6742ecc69740f695 Mon Sep 17 00:00:00 2001 From: yuyi Date: Mon, 11 Oct 2021 07:46:44 +0800 Subject: [PATCH] checker: check generic struct using in non-generic fn (#12136) --- vlib/v/checker/checker.v | 3 +++ .../checker/tests/generics_struct_in_non_generic_fn_err.out | 6 ++++++ .../checker/tests/generics_struct_in_non_generic_fn_err.vv | 6 ++++++ 3 files changed, 15 insertions(+) create mode 100644 vlib/v/checker/tests/generics_struct_in_non_generic_fn_err.out create mode 100644 vlib/v/checker/tests/generics_struct_in_non_generic_fn_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index c5d31bfb2c..eeee14c1b6 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -4592,6 +4592,9 @@ pub fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type { c.ensure_sumtype_array_has_default_value(node) } c.ensure_type_exists(node.elem_type, node.elem_type_pos) or {} + if node.typ.has_flag(.generic) && c.table.cur_fn.generic_names.len == 0 { + c.error('generic struct cannot use in non-generic function', node.pos) + } return node.typ } if node.is_fixed { diff --git a/vlib/v/checker/tests/generics_struct_in_non_generic_fn_err.out b/vlib/v/checker/tests/generics_struct_in_non_generic_fn_err.out new file mode 100644 index 0000000000..6369d613bb --- /dev/null +++ b/vlib/v/checker/tests/generics_struct_in_non_generic_fn_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/generics_struct_in_non_generic_fn_err.vv:5:7: error: generic struct cannot use in non-generic function + 3 | + 4 | fn main() { + 5 | _ := []Example{} + | ~~~~~~~~~~~~~ + 6 | } diff --git a/vlib/v/checker/tests/generics_struct_in_non_generic_fn_err.vv b/vlib/v/checker/tests/generics_struct_in_non_generic_fn_err.vv new file mode 100644 index 0000000000..30933350fb --- /dev/null +++ b/vlib/v/checker/tests/generics_struct_in_non_generic_fn_err.vv @@ -0,0 +1,6 @@ +struct Example { +} + +fn main() { + _ := []Example{} +}