diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index c66ed425d0..7bcb33675f 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -960,7 +960,7 @@ pub fn (mut c Checker) struct_init(mut node ast.StructInit) ast.Type { unwrapped_struct_type := c.unwrap_generic_type(node.typ, c.table.cur_fn.generic_names, c.table.cur_concrete_types) c.ensure_type_exists(unwrapped_struct_type, node.pos) or {} - type_sym := c.table.get_type_symbol(unwrapped_struct_type) + type_sym := c.table.get_type_symbol(node.typ) if !c.inside_unsafe && type_sym.kind == .sum_type { c.note('direct sum type init (`x := SumType{}`) will be removed soon', node.pos) } @@ -1091,7 +1091,7 @@ pub fn (mut c Checker) struct_init(mut node ast.StructInit) ast.Type { if is_embed { expected_type = embed_type c.expected_type = expected_type - expr_type = c.unwrap_generic(c.expr(field.expr)) + expr_type = c.expr(field.expr) expr_type_sym := c.table.get_type_symbol(expr_type) if expr_type != ast.void_type && expr_type_sym.kind != .placeholder { c.check_expected(expr_type, embed_type) or { @@ -1106,7 +1106,7 @@ pub fn (mut c Checker) struct_init(mut node ast.StructInit) ast.Type { field_type_sym := c.table.get_type_symbol(field_info.typ) expected_type = field_info.typ c.expected_type = expected_type - expr_type = c.unwrap_generic(c.expr(field.expr)) + expr_type = c.expr(field.expr) if !field_info.typ.has_flag(.optional) { expr_type = c.check_expr_opt_call(field.expr, expr_type) } @@ -1228,7 +1228,7 @@ pub fn (mut c Checker) struct_init(mut node ast.StructInit) ast.Type { c.error('expression is not an lvalue', node.update_expr.position()) } } - return unwrapped_struct_type + return node.typ } fn (mut c Checker) check_div_mod_by_zero(expr ast.Expr, op_kind token.Kind) { diff --git a/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.out b/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.out index 502f2b816a..70150abf0e 100644 --- a/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.out +++ b/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.out @@ -12,3 +12,10 @@ vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv:32:1: error: g | ~~~~~~~~~~~~~~ 33 | println("hi") 34 | } +vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv:23:9: error: cannot use `Generic` as type `Generic` in return argument + 21 | go g_worker(g) + 22 | + 23 | return g + | ^ + 24 | } + 25 | diff --git a/vlib/v/checker/tests/generics_fn_return_generic_struct_err.out b/vlib/v/checker/tests/generics_fn_return_generic_struct_err.out index b6efe4555b..12a579c300 100644 --- a/vlib/v/checker/tests/generics_fn_return_generic_struct_err.out +++ b/vlib/v/checker/tests/generics_fn_return_generic_struct_err.out @@ -5,9 +5,3 @@ vlib/v/checker/tests/generics_fn_return_generic_struct_err.vv:13:32: error: retu | ~~~~~~~~~~~~~~~~~~~~ 14 | d := GenericChannelStruct{ 15 | ch: chan T{} -vlib/v/checker/tests/generics_fn_return_generic_struct_err.vv:17:9: error: cannot use `GenericChannelStruct` as type `GenericChannelStruct` in return argument - 15 | ch: chan T{} - 16 | } - 17 | return d - | ^ - 18 | } diff --git a/vlib/v/checker/tests/generics_struct_declaration_err.vv b/vlib/v/checker/tests/generics_struct_declaration_err.vv index 4828ea315f..ef8fe6be2f 100644 --- a/vlib/v/checker/tests/generics_struct_declaration_err.vv +++ b/vlib/v/checker/tests/generics_struct_declaration_err.vv @@ -16,7 +16,7 @@ fn main() { } pub fn new_channel_struct() GenericChannelStruct { - d := GenericChannelStruct{ + d := GenericChannelStruct{ ch: chan T{} } diff --git a/vlib/v/tests/generic_fn_assign_generics_struct_test.v b/vlib/v/tests/generic_fn_assign_generics_struct_test.v index ef007aaf40..a27ee1a758 100644 --- a/vlib/v/tests/generic_fn_assign_generics_struct_test.v +++ b/vlib/v/tests/generic_fn_assign_generics_struct_test.v @@ -3,7 +3,7 @@ struct Test { } fn get_test(v T) Test { - return Test{ + return Test{ v: v } } diff --git a/vlib/v/tests/generics_return_generics_struct_test.v b/vlib/v/tests/generics_return_generics_struct_test.v index 18f9f853d7..756ca5447c 100644 --- a/vlib/v/tests/generics_return_generics_struct_test.v +++ b/vlib/v/tests/generics_return_generics_struct_test.v @@ -6,7 +6,7 @@ mut: } pub fn new_some(value T) Optional { - return Optional{ + return Optional{ value: value some: true } @@ -40,7 +40,7 @@ pub struct Foo { } pub fn (f Foo) new_some(value T) Optional { - return Optional{ + return Optional{ value: value some: true } @@ -77,7 +77,7 @@ mut: } pub fn iter(arr []T) ArrayIterator { - return ArrayIterator{ + return ArrayIterator{ data: arr index: 11 } @@ -114,7 +114,7 @@ pub fn (mut i Iterator) next() ?T { } pub fn iter_data(data []T) Iterator { - return Iterator{ + return Iterator{ data: data } } diff --git a/vlib/v/tests/generics_return_inconsistent_types_generics_struct_test.v b/vlib/v/tests/generics_return_inconsistent_types_generics_struct_test.v index ce742ae3d4..7bb64023f2 100644 --- a/vlib/v/tests/generics_return_inconsistent_types_generics_struct_test.v +++ b/vlib/v/tests/generics_return_inconsistent_types_generics_struct_test.v @@ -7,7 +7,7 @@ mut: } pub fn new_some(value T, b B) Optional { - return Optional{ + return Optional{ value: value some: true typ: typeof(b).name @@ -54,7 +54,7 @@ pub struct Foo { } pub fn (f Foo) new_some(value T, b B) Optional { - return Optional{ + return Optional{ value: value some: true typ: typeof(b).name diff --git a/vlib/v/tests/generics_return_multiple_generics_struct_test.v b/vlib/v/tests/generics_return_multiple_generics_struct_test.v index f8e876039b..f143d86398 100644 --- a/vlib/v/tests/generics_return_multiple_generics_struct_test.v +++ b/vlib/v/tests/generics_return_multiple_generics_struct_test.v @@ -5,7 +5,7 @@ mut: } fn new_foo(a A, b B) Foo { - return Foo{ + return Foo{ a: a b: b } diff --git a/vlib/v/tests/generics_return_recursive_generics_struct_test.v b/vlib/v/tests/generics_return_recursive_generics_struct_test.v index 9c78d289b8..ab0f723d3f 100644 --- a/vlib/v/tests/generics_return_recursive_generics_struct_test.v +++ b/vlib/v/tests/generics_return_recursive_generics_struct_test.v @@ -5,7 +5,7 @@ mut: } fn make_node(val []T) Node { - return Node{ + return Node{ val: val[0] next: 0 } diff --git a/vlib/v/tests/generics_return_reference_generics_struct_test.v b/vlib/v/tests/generics_return_reference_generics_struct_test.v index 0b4e9b5322..35717777a2 100644 --- a/vlib/v/tests/generics_return_reference_generics_struct_test.v +++ b/vlib/v/tests/generics_return_reference_generics_struct_test.v @@ -3,7 +3,7 @@ struct Foo { } fn new_foo(len int) &Foo { - return &Foo{ + return &Foo{ data: []T{len: len} } } diff --git a/vlib/v/tests/generics_with_embed_generics_test.v b/vlib/v/tests/generics_with_embed_generics_test.v index 3ccc0db162..d7d15fae5c 100644 --- a/vlib/v/tests/generics_with_embed_generics_test.v +++ b/vlib/v/tests/generics_with_embed_generics_test.v @@ -10,7 +10,7 @@ fn group_new(val ...T) Group { for i in val { arr << i } - mut g := Group{ + mut g := Group{ len: val.len val: arr } diff --git a/vlib/v/tests/generics_with_generics_struct_init_test.v b/vlib/v/tests/generics_with_generics_struct_init_test.v index 039fd4d971..9225ffdbc9 100644 --- a/vlib/v/tests/generics_with_generics_struct_init_test.v +++ b/vlib/v/tests/generics_with_generics_struct_init_test.v @@ -13,11 +13,11 @@ mut: fn create(arr []T) &List { assert arr.len > 0 - mut n := &ListNode{ + mut n := &ListNode{ val: arr[0] next: 0 } - mut l := &List{ + mut l := &List{ first: n last: n count: 1 @@ -26,7 +26,23 @@ fn create(arr []T) &List { } fn test_generics_with_generic_structs_init() { - n := create([1, 2, 3]) - println(n) - assert n.count == 1 + list1 := create([1, 2, 3]) + println(list1) + assert list1.count == 1 + assert list1.first.val == 1 + + list2 := create(['a', 'b', 'c']) + println(list2) + assert list2.count == 1 + assert list2.first.val == 'a' + + list3 := create([1.1, 2.2, 3.3]) + println(list3) + assert list3.count == 1 + assert list3.first.val == 1.1 + + list4 := create([true, false, true]) + println(list4) + assert list4.count == 1 + assert list4.first.val == true } diff --git a/vlib/v/tests/generics_with_variadic_generic_args_test.v b/vlib/v/tests/generics_with_variadic_generic_args_test.v index 1023451ab6..21eacf1967 100644 --- a/vlib/v/tests/generics_with_variadic_generic_args_test.v +++ b/vlib/v/tests/generics_with_variadic_generic_args_test.v @@ -17,7 +17,7 @@ fn init_singlylinkedlist(nodes ...Node) SinglyLinkedList { current_node.next = &nodes[i + 1] } - return SinglyLinkedList{&nodes[0]} + return SinglyLinkedList{&nodes[0]} } fn test_generic_with_variadic_generic_args() {