Skip to content

Commit f23ae9a

Browse files
authored
cgen: fix codegen for indexing generic map (fix #23376) (#23402)
1 parent ca48d7d commit f23ae9a

File tree

3 files changed

+34
-30
lines changed

3 files changed

+34
-30
lines changed

vlib/v/gen/c/assign.v

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -341,15 +341,13 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
341341
}
342342
g.assign_ct_type = var_type
343343
}
344-
} else if val is ast.IndexExpr {
345-
if val.left is ast.Ident && g.type_resolver.is_generic_param_var(val.left) {
346-
ctyp := g.unwrap_generic(g.get_gn_var_type(val.left))
347-
if ctyp != ast.void_type {
348-
var_type = ctyp
349-
val_type = var_type
350-
left.obj.typ = var_type
351-
g.assign_ct_type = var_type
352-
}
344+
} else if val is ast.IndexExpr && (val.left is ast.Ident && val.left.ct_expr) {
345+
ctyp := g.unwrap_generic(g.type_resolver.get_type(val))
346+
if ctyp != ast.void_type {
347+
var_type = ctyp
348+
val_type = var_type
349+
left.obj.typ = var_type
350+
g.assign_ct_type = var_type
353351
}
354352
} else if left.obj.ct_type_var == .generic_var && val is ast.CallExpr {
355353
if val.return_type_generic != 0 && val.return_type_generic.has_flag(.generic) {

vlib/v/gen/c/fn.v

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,27 +1353,6 @@ fn (mut g Gen) gen_to_str_method_call(node ast.CallExpr) bool {
13531353
return false
13541354
}
13551355

1356-
fn (mut g Gen) get_gn_var_type(var ast.Ident) ast.Type {
1357-
if g.cur_fn != unsafe { nil } && g.cur_fn.generic_names.len > 0 {
1358-
for k, cur_param in g.cur_fn.params {
1359-
if (k == 0 && g.cur_fn.is_method) || !cur_param.typ.has_flag(.generic)
1360-
|| var.name != cur_param.name {
1361-
continue
1362-
}
1363-
mut typ := cur_param.typ
1364-
mut cparam_type_sym := g.table.sym(g.unwrap_generic(typ))
1365-
1366-
if cparam_type_sym.kind == .array {
1367-
typ = g.unwrap_generic((cparam_type_sym.info as ast.Array).elem_type)
1368-
} else if cparam_type_sym.kind == .array_fixed {
1369-
typ = g.unwrap_generic((cparam_type_sym.info as ast.ArrayFixed).elem_type)
1370-
}
1371-
return typ
1372-
}
1373-
}
1374-
return ast.void_type
1375-
}
1376-
13771356
// resolve_return_type resolves the generic return type of CallExpr
13781357
fn (mut g Gen) resolve_return_type(node ast.CallExpr) ast.Type {
13791358
if node.is_method {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
module main
2+
3+
fn validate[T](values map[string]T, rules map[string][]string) ! {
4+
for key, _ in rules {
5+
value := values[key]!
6+
assert typeof(value).name == T.name
7+
}
8+
}
9+
10+
fn test_main() {
11+
validate({
12+
'age': 31
13+
}, {
14+
'age': [
15+
'required',
16+
]
17+
}) or { assert false }
18+
19+
validate({
20+
'foo': 'bar'
21+
}, {
22+
'foo': [
23+
'required',
24+
]
25+
}) or { assert false }
26+
assert true
27+
}

0 commit comments

Comments
 (0)