From 2693935066b9c80172fe5c06045bb5c043d79cd6 Mon Sep 17 00:00:00 2001 From: yuyi Date: Wed, 7 Sep 2022 19:53:43 +0800 Subject: [PATCH] checker: check non generic struct used like a generic one (#15690) --- vlib/v/checker/struct.v | 4 ++++ ...on_generic_struct_used_like_a_generic_one.out | 14 ++++++++++++++ ...non_generic_struct_used_like_a_generic_one.vv | 16 ++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 vlib/v/checker/tests/generics_non_generic_struct_used_like_a_generic_one.out create mode 100644 vlib/v/checker/tests/generics_non_generic_struct_used_like_a_generic_one.vv diff --git a/vlib/v/checker/struct.v b/vlib/v/checker/struct.v index 266fb40770..b013f87f44 100644 --- a/vlib/v/checker/struct.v +++ b/vlib/v/checker/struct.v @@ -256,6 +256,10 @@ pub fn (mut c Checker) struct_init(mut node ast.StructInit) ast.Type { } } } + if node.generic_types.len > 0 && struct_sym.info.generic_types.len == 0 { + c.error('a non generic struct `$node.typ_str` used like a generic struct', + node.name_pos) + } if node.generic_types.len > 0 && struct_sym.info.generic_types.len == node.generic_types.len && struct_sym.info.generic_types != node.generic_types { c.table.replace_generic_type(node.typ, node.generic_types) diff --git a/vlib/v/checker/tests/generics_non_generic_struct_used_like_a_generic_one.out b/vlib/v/checker/tests/generics_non_generic_struct_used_like_a_generic_one.out new file mode 100644 index 0000000000..00dcab85dc --- /dev/null +++ b/vlib/v/checker/tests/generics_non_generic_struct_used_like_a_generic_one.out @@ -0,0 +1,14 @@ +vlib/v/checker/tests/generics_non_generic_struct_used_like_a_generic_one.vv:6:9: error: a non generic struct `Toy` used like a generic struct + 4 | + 5 | fn get_toy1(toy Toy) Toy{ + 6 | return Toy{toy.toy_name} + | ~~~ + 7 | } + 8 | +vlib/v/checker/tests/generics_non_generic_struct_used_like_a_generic_one.vv:10:9: error: a non generic struct `Toy` used like a generic struct + 8 | + 9 | fn get_toy2(toy Toy) Toy{ + 10 | return Toy{toy.toy_name} + | ~~~ + 11 | } + 12 | diff --git a/vlib/v/checker/tests/generics_non_generic_struct_used_like_a_generic_one.vv b/vlib/v/checker/tests/generics_non_generic_struct_used_like_a_generic_one.vv new file mode 100644 index 0000000000..cb2785567f --- /dev/null +++ b/vlib/v/checker/tests/generics_non_generic_struct_used_like_a_generic_one.vv @@ -0,0 +1,16 @@ +struct Toy{ + toy_name string +} + +fn get_toy1(toy Toy) Toy{ + return Toy{toy.toy_name} +} + +fn get_toy2(toy Toy) Toy{ + return Toy{toy.toy_name} +} + +fn main() { + println(get_toy1(Toy{'Fire Truck'})) + println(get_toy2(Toy{'Police Car'})) +}