Skip to content

Commit 41d38d7

Browse files
authored
checker: fix type mismatch checking for assignments with generics (fix #20298) (#20327)
1 parent b1f64a3 commit 41d38d7

File tree

4 files changed

+38
-4
lines changed

4 files changed

+38
-4
lines changed

vlib/v/checker/assign.v

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -735,8 +735,7 @@ or use an explicit `unsafe{ a[..] }`, if you do not want a copy of the slice.',
735735
}
736736
}
737737
}
738-
if !is_blank_ident && right_sym.kind != .placeholder && left_sym.kind != .interface_
739-
&& !right_type.has_flag(.generic) && !left_type.has_flag(.generic) {
738+
if !is_blank_ident && right_sym.kind != .placeholder && left_sym.kind != .interface_ {
740739
// Dual sides check (compatibility check)
741740
c.check_expected(right_type_unwrapped, left_type_unwrapped) or {
742741
// allow literal values to auto deref var (e.g.`for mut v in values { v = 1.0 }`)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
vlib/v/checker/tests/assign_type_mismatch_with_generics_err.vv:13:9: error: cannot assign to `b`: expected `bool`, not `fn (Bar) bool`
2+
11 | mut b := false
3+
12 | if f.f != none {
4+
13 | b = f.f or { panic(err) }
5+
| ^
6+
14 | } else {
7+
15 | b = true
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
type Fn[T] = fn (arg T) bool
2+
3+
struct Foo[T] {
4+
f ?Fn[T]
5+
}
6+
7+
@[params]
8+
struct Bar {}
9+
10+
fn (mut f Foo[T]) method(arg T) {
11+
mut b := false
12+
if f.f != none {
13+
b = f.f or { panic(err) }
14+
} else {
15+
b = true
16+
}
17+
if b {
18+
}
19+
}
20+
21+
fn main() {
22+
mut foo := Foo[Bar]{
23+
f: fn (arg Bar) bool {
24+
return true
25+
}
26+
}
27+
foo.method(Bar{})
28+
}

vlib/v/tests/generics_chans_select_test.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ pub fn (mut ec EventController[T]) emit(e T, options EmitOptions) {
3535
for i, w in ec.wait_fors {
3636
mut b := false
3737
if w.check != none {
38-
b = (w.check or { panic(err) })
39-
e
38+
func := w.check or { panic(err) }
39+
b = func(e)
4040
} else {
4141
b = true
4242
}

0 commit comments

Comments
 (0)