Skip to content

Commit a831ec7

Browse files
authored
markused: fix generic method call mark (fix #24395) (#24399)
1 parent 2bd2d00 commit a831ec7

4 files changed

Lines changed: 42 additions & 4 deletions

File tree

‎vlib/v/markused/walker.v‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,8 @@ pub fn (mut w Walker) call_expr(mut node ast.CallExpr) {
705705
w.expr(node.left)
706706
w.or_block(node.or_block)
707707

708-
fn_name := node.fkey()
708+
mut fn_name := node.fkey()
709+
mut receiver_typ := node.receiver_type
709710
if w.used_fns[fn_name] {
710711
return
711712
}
@@ -735,12 +736,13 @@ pub fn (mut w Walker) call_expr(mut node ast.CallExpr) {
735736
&& !node.receiver_concrete_type.has_flag(.generic) {
736737
// if receiver is generic, then cgen requires `node.receiver_type` to be T.
737738
// We therefore need to get the concrete type from `node.receiver_concrete_type`.
738-
fkey := '${int(node.receiver_concrete_type)}.${node.name}'
739-
w.mark_fn_as_used(fkey)
739+
fn_name = '${int(node.receiver_concrete_type)}.${node.name}'
740+
receiver_typ = node.receiver_concrete_type
741+
w.mark_fn_as_used(fn_name)
740742
}
741743
stmt := w.all_fns[fn_name] or { return }
742744
if stmt.name == node.name {
743-
if !node.is_method || node.receiver_type == stmt.receiver.typ {
745+
if !node.is_method || receiver_typ == stmt.receiver.typ {
744746
w.stmts(stmt.stmts)
745747
}
746748
}

‎vlib/v/tests/skip_unused/generic_call_from_json.run.out‎

Whitespace-only changes.

‎vlib/v/tests/skip_unused/generic_call_from_json.skip_unused.run.out‎

Whitespace-only changes.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import veb
2+
import x.json2
3+
4+
pub struct Context {
5+
veb.Context
6+
}
7+
8+
pub struct App {
9+
veb.Middleware[Context]
10+
}
11+
12+
@['/'; POST]
13+
fn (app &App) index(mut ctx Context) veb.Result {
14+
j := json2.raw_decode(ctx.req.data) or { return ctx.request_error('error') }
15+
16+
m := j.as_map()
17+
myarr := m['myarr'] or { panic(error) }
18+
m2 := myarr.arr()
19+
20+
for mc in m2 {
21+
parts := mc.arr()
22+
23+
// Compiler error occurs here -->
24+
first := parts[0].str()
25+
second := parts[1].str()
26+
third := parts[2].str()
27+
28+
println('1. ${first}, 2. ${second}, 3. ${third}')
29+
}
30+
31+
return ctx.ok('ok')
32+
}
33+
34+
fn main() {
35+
_ := &App{}
36+
}

0 commit comments

Comments
 (0)