Skip to content

Commit 6d40bb8

Browse files
authored
cgen: fix interface casting in anon fn (fix #23530) (#23533)
1 parent 839d526 commit 6d40bb8

3 files changed

Lines changed: 27 additions & 1 deletion

File tree

‎vlib/v/gen/c/auto_eq_methods.v‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,6 @@ fn (mut g Gen) gen_interface_equality_fn(left_type ast.Type) string {
605605
left_arg := g.read_field(left_type, '_typ', 'a')
606606
right_arg := g.read_field(left_type, '_typ', 'b')
607607

608-
fn_builder.writeln('${g.static_non_parallel}int v_typeof_interface_idx_${idx_fn}(int sidx); // for auto eq method')
609608
fn_builder.writeln('${g.static_non_parallel}inline bool ${fn_name}_interface_eq(${ptr_styp} a, ${ptr_styp} b) {')
610609
fn_builder.writeln('\tif (${left_arg} == ${right_arg}) {')
611610
fn_builder.writeln('\t\tint idx = v_typeof_interface_idx_${idx_fn}(${left_arg});')

‎vlib/v/gen/c/cgen.v‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,7 @@ pub fn (mut g Gen) write_typeof_functions() {
11571157
g.writeln('\tif (sidx == _${sym.cname}_${sub_sym.cname}_index) return "${util.strip_main_name(sub_sym.name)}";')
11581158
}
11591159
g.writeln2('\treturn "unknown ${util.strip_main_name(sym.name)}";', '}')
1160+
g.definitions.writeln('int v_typeof_interface_idx_${sym.cname}(int sidx);')
11601161
g.writeln2('', 'int v_typeof_interface_idx_${sym.cname}(int sidx) {')
11611162
if g.pref.parallel_cc {
11621163
g.extern_out.writeln('extern int v_typeof_interface_idx_${sym.cname}(int sidx);')
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
@[heap]
2+
struct Foo {
3+
mut:
4+
val int
5+
}
6+
7+
@[heap]
8+
struct Bar {
9+
mut:
10+
val int
11+
}
12+
13+
interface FooBar {
14+
mut:
15+
val int
16+
}
17+
18+
fn test_interface_as_cast_in_anon_fn() {
19+
mut fbs := []&FooBar{}
20+
fbs << &Foo{1}
21+
do_something := fn [mut fbs] () {
22+
_ := fbs.last() as Foo // this line works outside of anon fn
23+
}
24+
do_something()
25+
assert true
26+
}

0 commit comments

Comments
 (0)