Skip to content

Commit fb997eb

Browse files
authored
cgen: fix comptime for in field selector (#12457)
1 parent 61b99e1 commit fb997eb

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

vlib/v/gen/c/fn.v

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,16 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
810810
if rec_type.has_flag(.shared_f) {
811811
rec_type = rec_type.clear_flag(.shared_f).set_nr_muls(0)
812812
}
813+
if node.left is ast.ComptimeSelector {
814+
if node.left.field_expr is ast.SelectorExpr {
815+
if node.left.field_expr.expr is ast.Ident {
816+
key_str := '${node.left.field_expr.expr.name}.typ'
817+
rec_type = g.comptime_var_type_map[key_str] or { rec_type }
818+
g.gen_expr_to_string(node.left, rec_type)
819+
return
820+
}
821+
}
822+
}
813823
g.get_str_fn(rec_type)
814824
} else if node.name == 'free' {
815825
mut rec_type := node.receiver_type
@@ -1113,6 +1123,14 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
11131123
g.writeln('; ${c_name(print_method)}($tmp); string_free(&$tmp);')
11141124
} else {
11151125
g.write('${c_name(print_method)}(')
1126+
if expr is ast.ComptimeSelector {
1127+
if expr.field_expr is ast.SelectorExpr {
1128+
if expr.field_expr.expr is ast.Ident {
1129+
key_str := '${expr.field_expr.expr.name}.typ'
1130+
typ = g.comptime_var_type_map[key_str] or { typ }
1131+
}
1132+
}
1133+
}
11161134
g.gen_expr_to_string(expr, typ)
11171135
g.write(')')
11181136
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
fn print_field_values<T>(s T) {
2+
mut value_list := []string{}
3+
4+
$for field in T.fields {
5+
println(s.$(field.name))
6+
value_list << s.$(field.name).str()
7+
}
8+
assert value_list.len == 4
9+
assert value_list[0] == 'Simon'
10+
assert value_list[1] == 'simon1234'
11+
assert value_list[2] == 'simon@gmail.com'
12+
assert value_list[3] == '15'
13+
}
14+
15+
struct Foo {
16+
name string
17+
password string
18+
email string
19+
age int
20+
}
21+
22+
fn test_comptime_for_in_field_selector() {
23+
bar := Foo{
24+
name: 'Simon'
25+
password: 'simon1234'
26+
email: 'simon@gmail.com'
27+
age: 15
28+
}
29+
print_field_values<Foo>(bar)
30+
}

0 commit comments

Comments
 (0)