Skip to content

Commit 1d33747

Browse files
committed
fixes
1 parent 427c0cc commit 1d33747

29 files changed

Lines changed: 440 additions & 211 deletions

vlib/v/checker/check_types.v

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,10 @@ fn (mut c Checker) check_matching_function_symbols(got_type_sym &ast.TypeSymbol,
622622
continue
623623
}
624624
}
625+
if c.type_has_unresolved_generic_parts(got_arg_typ)
626+
|| c.type_has_unresolved_generic_parts(exp_arg_typ) {
627+
continue
628+
}
625629
if c.table.unaliased_type(got_arg_typ).idx() != c.table.unaliased_type(exp_arg_typ).idx() {
626630
return false
627631
}

vlib/v/checker/tests/assign_generic_fn_err.out

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,3 @@ vlib/v/checker/tests/assign_generic_fn_err.vv:2:9: error: cannot assign generic
44
| ~~~~~~~~~~~~~~~~~~~
55
3 | return value
66
4 | }
7-
vlib/v/checker/tests/assign_generic_fn_err.vv:6:13: error: a non generic function called like a generic one
8-
4 | }
9-
5 |
10-
6 | println(fun[int](100))
11-
| ~~~~~
12-
7 | }

vlib/v/checker/tests/check_err_msg_with_generics.out

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,46 @@ vlib/v/checker/tests/check_err_msg_with_generics.vv:15:10: error: cannot cast st
33
14 | typ := datatypes.BSTree[Result[[]Token, Err[string]]]{}
44
15 | println(int(typ))
55
| ~~~~~~~~
6-
16 | }
6+
16 | }
7+
vlib/datatypes/bstree.v:78:16: error: cannot use operator `<` with `Result[[]Token, Err[string]]`
8+
76 | // insert_helper walks the tree and inserts the given node.
9+
77 | fn (mut bst BSTree[T]) insert_helper(mut node BSTreeNode[T], value T) bool {
10+
78 | if node.value < value {
11+
| ^
12+
79 | if unsafe { node.right != 0 } && node.right.is_init {
13+
80 | return bst.insert_helper(mut node.right, value)
14+
vlib/datatypes/bstree.v:84:23: error: cannot use operator `>` with `Result[[]Token, Err[string]]`
15+
82 | node.right = new_node(node, value)
16+
83 | return true
17+
84 | } else if node.value > value {
18+
| ^
19+
85 | if unsafe { node.left != 0 } && node.left.is_init {
20+
86 | return bst.insert_helper(mut node.left, value)
21+
vlib/datatypes/bstree.v:105:16: error: cannot use operator `<` with `Result[[]Token, Err[string]]`
22+
103 | return false
23+
104 | }
24+
105 | if node.value < value {
25+
| ^
26+
106 | return bst.contains_helper(node.right, value)
27+
107 | } else if node.value > value {
28+
vlib/datatypes/bstree.v:107:23: error: cannot use operator `>` with `Result[[]Token, Err[string]]`
29+
105 | if node.value < value {
30+
106 | return bst.contains_helper(node.right, value)
31+
107 | } else if node.value > value {
32+
| ^
33+
108 | return bst.contains_helper(node.left, value)
34+
109 | }
35+
vlib/datatypes/bstree.v:148:16: error: cannot use operator `<` with `Result[[]Token, Err[string]]`
36+
146 | }
37+
147 |
38+
148 | if node.value < value {
39+
| ^
40+
149 | return bst.remove_helper(mut node.right, value, false)
41+
150 | }
42+
vlib/datatypes/bstree.v:246:16: error: cannot use operator `<` with `Result[[]Token, Err[string]]`
43+
244 | }
44+
245 |
45+
246 | if node.value < value {
46+
| ^
47+
247 | return bst.get_node(node.right, value)
48+
248 | }

vlib/v/checker/tests/comptime_selector_assign.out

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,3 @@
1-
vlib/x/json2/decode.v:685:47: notice: unused parameter: `val`
2-
683 | }
3-
684 |
4-
685 | fn (mut decoder Decoder) decode_string[T](mut val T) ! {
5-
| ~~~
6-
686 | string_info := decoder.current_node.value
7-
687 |
8-
vlib/x/json2/decode.v:1049:43: notice: unused parameter: `val`
9-
1047 | // use pointer instead of mut so enum cast works
10-
1048 | @[unsafe]
11-
1049 | fn (mut decoder Decoder) decode_number[T](val &T) ! {
12-
| ~~~
13-
1050 | number_info := decoder.current_node.value
14-
1051 | str := decoder.json[number_info.position..number_info.position + number_info.length]
151
vlib/v/checker/tests/comptime_selector_assign.vv:18:24: error: mismatched types: check field type with $if to avoid this problem
162
16 | typ.$(field.name) = 2
173
17 | }
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
vlib/v/checker/tests/fn_ref_arg_mismatch_err.vv:15:10: error: literal argument cannot be passed as reference parameter `&T`
1+
vlib/v/checker/tests/fn_ref_arg_mismatch_err.vv:15:10: error: literal argument cannot be passed as reference parameter `&int`
22
13 | fn main() {
33
14 | foo := Foo[int]{}
44
15 | foo.foo(12)
55
| ~~
6-
16 |
6+
16 |
77
17 | bar[int](12)
88
vlib/v/checker/tests/fn_ref_arg_mismatch_err.vv:17:11: error: literal argument cannot be passed as reference parameter `&T`
99
15 | foo.foo(12)
10-
16 |
10+
16 |
1111
17 | bar[int](12)
1212
| ~~
1313
18 | }

vlib/v/checker/tests/generic_closure_fn_decl_err_b.out

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,3 @@ vlib/v/checker/tests/generic_closure_fn_decl_err_b.vv:13:2: error: generic closu
55
| ~~~~~~~~~~~~~~~~~~~
66
14 | my_plugin.on_update()
77
15 | }()
8-
vlib/v/checker/tests/generic_closure_fn_decl_err_b.vv:14:13: error: unknown method or field: `T.on_update`
9-
12 |
10-
13 | fn [my_plugin] () {
11-
14 | my_plugin.on_update()
12-
| ~~~~~~~~~~~
13-
15 | }()
14-
16 | }

vlib/v/checker/tests/generic_fntype_err.out

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
11
vlib/v/checker/tests/generic_fntype_err.vv:3:21: notice: unused parameter: `sort_cb`
22
1 | type FnSort[T] = fn (const_a T, const_b T) int
3-
2 |
3+
2 |
44
3 | fn sort[T](arr []T, sort_cb FnSort) []T {
55
| ~~~~~~~
66
4 | return arr
77
5 | }
8-
vlib/v/checker/tests/generic_fntype_err.vv:19:15: error: cannot use `fn (int, int) int` as `fn (T, T) int` in argument 2 to `sort`
9-
17 | fn main() {
10-
18 | mut a := [123, 553, 223, 126, 883, 257]
11-
19 | x := sort(a, my_cmp)
12-
| ~~~~~~
13-
20 | println(x)
14-
21 | }
158
vlib/v/checker/tests/generic_fntype_err.vv:3:29: error: generic function `FnSort` in fn declaration must specify the generic type names, e.g. FnSort[T]
169
1 | type FnSort[T] = fn (const_a T, const_b T) int
17-
2 |
10+
2 |
1811
3 | fn sort[T](arr []T, sort_cb FnSort) []T {
1912
| ~~~~~~
2013
4 | return arr
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1-
vlib/v/checker/tests/generic_mut_struct_index_err.vv:7:3: error: type `mut Heap` does not support slicing
1+
vlib/v/checker/tests/generic_mut_struct_index_err.vv:7:3: error: type `mut Heap[int]` does not support slicing
22
5 |
33
6 | fn (mut h Heap[T]) insert(mut element T, pos int) {
44
7 | h[pos] = element
55
| ~~~~~
66
8 | }
77
9 |
8+
vlib/v/checker/tests/generic_mut_struct_index_err.vv:7:11: error: cannot assign to `h[pos]`: expected `Heap[int]`, not `&int`
9+
5 |
10+
6 | fn (mut h Heap[T]) insert(mut element T, pos int) {
11+
7 | h[pos] = element
12+
| ~~~~~~~
13+
8 | }
14+
9 |
Lines changed: 149 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,155 @@
11
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:56:13: error: cannot use `Maybe[string]` as `Maybe[int]` in argument 1 to `Maybe[int].or`
22
54 | b := some('abc')
3-
55 |
3+
55 |
44
56 | c := a.@or(b)
55
| ^
66
57 | println(c)
77
58 | }
8+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:9:10: error: cannot cast non-sum type `int` using `as`
9+
7 | pub fn (m Maybe[T]) str[T]() string {
10+
8 | return if m is T {
11+
9 | x := m as T
12+
| ~~
13+
10 | 'Some(${x})'
14+
11 | } else {
15+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:10:11: error: illegal format specifier `d` for type `string`
16+
8 | return if m is T {
17+
9 | x := m as T
18+
10 | 'Some(${x})'
19+
| ^
20+
11 | } else {
21+
12 | 'Noth'
22+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:27:3: error: `Maybe[int]` has no variant `T`.
23+
2 possibilities: `int`, `None`.
24+
25 | return match m {
25+
26 | None { false }
26+
27 | T { true }
27+
| ^
28+
28 | }
29+
29 | }
30+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:25:9: error: match must be exhaustive (add match branches for: `int` or `else {}` at the end)
31+
23 |
32+
24 | pub fn (m Maybe[T]) is_some[T]() bool {
33+
25 | return match m {
34+
| ~~~~~~~~~
35+
26 | None { false }
36+
27 | T { true }
37+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:27:3: error: `Maybe[string]` has no variant `T`.
38+
2 possibilities: `None`, `string`.
39+
25 | return match m {
40+
26 | None { false }
41+
27 | T { true }
42+
| ^
43+
28 | }
44+
29 | }
45+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:25:9: error: match must be exhaustive (add match branches for: `string` or `else {}` at the end)
46+
23 |
47+
24 | pub fn (m Maybe[T]) is_some[T]() bool {
48+
25 | return match m {
49+
| ~~~~~~~~~
50+
26 | None { false }
51+
27 | T { true }
52+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:34:3: error: `Maybe[int]` has no variant `T`.
53+
2 possibilities: `int`, `None`.
54+
32 | return match m {
55+
33 | None { true }
56+
34 | T { false }
57+
| ^
58+
35 | }
59+
36 | }
60+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:32:9: error: match must be exhaustive (add match branches for: `int` or `else {}` at the end)
61+
30 |
62+
31 | pub fn (m Maybe[T]) is_noth[T]() bool {
63+
32 | return match m {
64+
| ~~~~~~~~~
65+
33 | None { true }
66+
34 | T { false }
67+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:34:3: error: `Maybe[string]` has no variant `T`.
68+
2 possibilities: `None`, `string`.
69+
32 | return match m {
70+
33 | None { true }
71+
34 | T { false }
72+
| ^
73+
35 | }
74+
36 | }
75+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:32:9: error: match must be exhaustive (add match branches for: `string` or `else {}` at the end)
76+
30 |
77+
31 | pub fn (m Maybe[T]) is_noth[T]() bool {
78+
32 | return match m {
79+
| ~~~~~~~~~
80+
33 | None { true }
81+
34 | T { false }
82+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:46:3: error: `Maybe[int]` has no variant `T`.
83+
2 possibilities: `int`, `None`.
84+
44 | }
85+
45 | }
86+
46 | T {
87+
| ^
88+
47 | m
89+
48 | }
90+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:39:9: error: match must be exhaustive (add match branches for: `int` or `else {}` at the end)
91+
37 |
92+
38 | pub fn (m Maybe[T]) @or[T](m2 Maybe[T]) Maybe[T] {
93+
39 | return match m {
94+
| ~~~~~~~~~
95+
40 | None {
96+
41 | match m2 {
97+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:43:5: error: `Maybe[int]` has no variant `T`.
98+
2 possibilities: `int`, `None`.
99+
41 | match m2 {
100+
42 | None { None{} }
101+
43 | T { m2 }
102+
| ^
103+
44 | }
104+
45 | }
105+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:41:4: error: match must be exhaustive (add match branches for: `int` or `else {}` at the end)
106+
39 | return match m {
107+
40 | None {
108+
41 | match m2 {
109+
| ~~~~~~~~~~
110+
42 | None { None{} }
111+
43 | T { m2 }
112+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:46:3: error: `Maybe[string]` has no variant `T`.
113+
2 possibilities: `None`, `string`.
114+
44 | }
115+
45 | }
116+
46 | T {
117+
| ^
118+
47 | m
119+
48 | }
120+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:39:9: error: match must be exhaustive (add match branches for: `string` or `else {}` at the end)
121+
37 |
122+
38 | pub fn (m Maybe[T]) @or[T](m2 Maybe[T]) Maybe[T] {
123+
39 | return match m {
124+
| ~~~~~~~~~
125+
40 | None {
126+
41 | match m2 {
127+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:43:5: error: `Maybe[string]` has no variant `T`.
128+
2 possibilities: `None`, `string`.
129+
41 | match m2 {
130+
42 | None { None{} }
131+
43 | T { m2 }
132+
| ^
133+
44 | }
134+
45 | }
135+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:41:4: error: match must be exhaustive (add match branches for: `string` or `else {}` at the end)
136+
39 | return match m {
137+
40 | None {
138+
41 | match m2 {
139+
| ~~~~~~~~~~
140+
42 | None { None{} }
141+
43 | T { m2 }
142+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:43:9: error: return type mismatch, it should be `Maybe[string]`, but it is instead `Maybe[int]`
143+
41 | match m2 {
144+
42 | None { None{} }
145+
43 | T { m2 }
146+
| ~~
147+
44 | }
148+
45 | }
149+
vlib/v/checker/tests/generics_method_sumtype_arg_mismatch.vv:47:4: error: return type mismatch, it should be `Maybe[string]`, but it is instead `Maybe[int]`
150+
45 | }
151+
46 | T {
152+
47 | m
153+
| ^
154+
48 | }
155+
49 | }

vlib/v/checker/tests/generics_struct_init_with_inconsistent_generic_types_3_err.out

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
vlib/v/checker/tests/generics_struct_init_with_inconsistent_generic_types_3_err.vv:27:14: error: a non generic function called like a generic one
2+
25 | fn main() {
3+
26 | m := some[int](12)
4+
27 | ret := m.map[int, string](fn (i int) string {
5+
| ~~~~~~~~~~~~~
6+
28 | return i.str()
7+
29 | })
18
vlib/v/checker/tests/generics_struct_init_with_inconsistent_generic_types_3_err.vv:12:25: error: cannot assign `string` to struct field `val` with type `int`
29
10 | pub fn (me Maybe[T]) map[T, U](f fn (T) U) Maybe[U] {
310
11 | if me.present {

0 commit comments

Comments
 (0)