Skip to content

Commit c41673a

Browse files
committed
cgen: keep comptime temp types concrete
1 parent 2c73296 commit c41673a

4 files changed

Lines changed: 64 additions & 36 deletions

File tree

vlib/v/gen/c/assign.v

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
434434
var_type = val_type.clear_flag(.option)
435435
}
436436
left.obj.typ = var_type
437+
g.type_resolver.update_ct_type(left.name, var_type)
437438
}
438439
} else if val is ast.ComptimeSelector {
439440
if val.typ_key != '' {
@@ -442,6 +443,7 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
442443
var_type)
443444
val_type = var_type
444445
left.obj.typ = var_type
446+
g.type_resolver.update_ct_type(left.name, var_type)
445447
} else {
446448
val_type = g.type_resolver.get_ct_type_or_default(val.typ_key,
447449
var_type)
@@ -451,6 +453,7 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
451453
key_str := '${val.method_name}.return_type'
452454
var_type = g.type_resolver.get_ct_type_or_default(key_str, var_type)
453455
left.obj.typ = var_type
456+
g.type_resolver.update_ct_type(left.name, var_type)
454457
g.assign_ct_type[val.pos.pos] = var_type
455458
} else if val is ast.Ident && val.info is ast.IdentVar {
456459
val_info := val.info as ast.IdentVar
@@ -466,6 +469,7 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
466469
var_type)
467470
val_type = var_type
468471
left.obj.typ = var_type
472+
g.type_resolver.update_ct_type(left.name, var_type)
469473
}
470474
}
471475
} else if val is ast.IndexExpr && (val.left is ast.Ident && val.left.ct_expr) {
@@ -474,6 +478,7 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
474478
var_type = ctyp
475479
val_type = var_type
476480
left.obj.typ = var_type
481+
g.type_resolver.update_ct_type(left.name, var_type)
477482
}
478483
} else if left.obj.ct_type_var == .generic_var && val is ast.CallExpr {
479484
fn_ret_type := g.resolve_return_type(val)

vlib/v/gen/c/cgen.v

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6386,7 +6386,15 @@ fn (mut g Gen) ident(node ast.Ident) {
63866386
if !g.is_assign_lhs
63876387
&& node.obj.ct_type_var !in [.smartcast, .generic_param, .no_comptime, .aggregate] {
63886388
comptime_type := g.type_resolver.get_type(node)
6389-
orig_has_option := node.obj.typ.has_flag(.option)
6389+
mut runtime_type := node.obj.typ
6390+
if node.name in g.type_resolver.type_map {
6391+
resolved_runtime_type := g.type_resolver.get_ct_type_or_default(node.name,
6392+
runtime_type)
6393+
if resolved_runtime_type != 0 && resolved_runtime_type != ast.void_type {
6394+
runtime_type = resolved_runtime_type
6395+
}
6396+
}
6397+
orig_has_option := runtime_type.has_flag(.option)
63906398
if orig_has_option && !comptime_type.has_flag(.option) {
63916399
styp := g.base_type(comptime_type)
63926400
ptr := if is_auto_heap { '->' } else { '.' }

vlib/v/gen/c/fn.v

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4308,6 +4308,51 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
43084308
}
43094309
if typ != ast.string_type || g.comptime.comptime_for_method != unsafe { nil } {
43104310
expr := node.args[0].expr
4311+
if expr is ast.ComptimeSelector {
4312+
if expr.typ_key != '' {
4313+
typ = g.type_resolver.get_ct_type_or_default(expr.typ_key, typ)
4314+
}
4315+
} else if expr is ast.ComptimeCall {
4316+
if expr.kind == .method {
4317+
sym := g.table.sym(g.unwrap_generic(expr.left_type))
4318+
if m := sym.find_method(g.comptime.comptime_for_method.name) {
4319+
typ = m.return_type
4320+
}
4321+
}
4322+
} else if expr is ast.Ident && expr.obj is ast.Var {
4323+
typ = expr.obj.typ
4324+
if expr.name in g.type_resolver.type_map {
4325+
resolved := g.type_resolver.get_ct_type_or_default(expr.name, typ)
4326+
if resolved != 0 && resolved != ast.void_type {
4327+
typ = resolved
4328+
}
4329+
}
4330+
if expr.ct_expr || expr.obj.ct_type_var != .no_comptime {
4331+
resolved := g.type_resolver.get_type_or_default(ast.Expr(expr), typ)
4332+
if resolved != 0 && resolved != ast.void_type {
4333+
typ = resolved
4334+
}
4335+
} else if g.cur_fn != unsafe { nil } && g.cur_concrete_types.len > 0 {
4336+
// In generic contexts, scope var types may be stale.
4337+
resolved := g.resolved_expr_type(expr, expr.obj.typ)
4338+
if resolved != 0 {
4339+
typ = resolved
4340+
}
4341+
}
4342+
if expr.obj.smartcasts.len > 0 {
4343+
typ = g.unwrap_generic(expr.obj.smartcasts.last())
4344+
cast_sym := g.table.sym(typ)
4345+
if cast_sym.info is ast.Aggregate {
4346+
typ = cast_sym.info.types[g.aggregate_type_idx]
4347+
} else if expr.obj.ct_type_var == .smartcast {
4348+
typ = g.unwrap_generic(g.type_resolver.get_type(expr))
4349+
}
4350+
}
4351+
// handling println(var or { ... })
4352+
if typ.has_flag(.option) && expr.or_expr.kind != .absent {
4353+
typ = typ.clear_flag(.option)
4354+
}
4355+
}
43114356
typ_sym := g.table.sym(typ)
43124357
needs_tmp_string := !typ.has_option_or_result()
43134358
&& (g.is_autofree || g.pref.gc_mode == .boehm_leak)
@@ -4341,40 +4386,6 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
43414386
g.writeln('; builtin__${c_fn_name(print_method)}(${tmp}); builtin__string_free(&${tmp});')
43424387
} else {
43434388
g.write('builtin__${c_fn_name(print_method)}(')
4344-
if expr is ast.ComptimeSelector {
4345-
if expr.typ_key != '' {
4346-
typ = g.type_resolver.get_ct_type_or_default(expr.typ_key, typ)
4347-
}
4348-
} else if expr is ast.ComptimeCall {
4349-
if expr.kind == .method {
4350-
sym := g.table.sym(g.unwrap_generic(expr.left_type))
4351-
if m := sym.find_method(g.comptime.comptime_for_method.name) {
4352-
typ = m.return_type
4353-
}
4354-
}
4355-
} else if expr is ast.Ident && expr.obj is ast.Var {
4356-
typ = expr.obj.typ
4357-
// In generic contexts, scope var types may be stale
4358-
if g.cur_fn != unsafe { nil } && g.cur_concrete_types.len > 0 {
4359-
resolved := g.resolved_expr_type(expr, expr.obj.typ)
4360-
if resolved != 0 {
4361-
typ = resolved
4362-
}
4363-
}
4364-
if expr.obj.smartcasts.len > 0 {
4365-
typ = g.unwrap_generic(expr.obj.smartcasts.last())
4366-
cast_sym := g.table.sym(typ)
4367-
if cast_sym.info is ast.Aggregate {
4368-
typ = cast_sym.info.types[g.aggregate_type_idx]
4369-
} else if expr.obj.ct_type_var == .smartcast {
4370-
typ = g.unwrap_generic(g.type_resolver.get_type(expr))
4371-
}
4372-
}
4373-
// handling println( var or { ... })
4374-
if typ.has_flag(.option) && expr.or_expr.kind != .absent {
4375-
typ = typ.clear_flag(.option)
4376-
}
4377-
}
43784389
g.gen_expr_to_string(expr, typ)
43794390
g.write(')')
43804391
}

vlib/v/gen/c/index.v

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,11 @@ fn (mut g Gen) index_of_map(node ast.IndexExpr, sym ast.TypeSymbol) {
494494
|| g.unwrap_generic(resolved_left_type) != g.unwrap_generic(map_left_type)) {
495495
map_left_type = resolved_left_type
496496
}
497-
left_is_ptr := map_left_type.is_ptr()
497+
mut left_is_ptr := map_left_type.is_ptr()
498+
if !left_is_ptr && g.is_assign_lhs && node.left is ast.Ident
499+
&& g.resolved_ident_is_auto_heap(node.left) {
500+
left_is_ptr = true
501+
}
498502
left_sym := if map_left_type != 0 {
499503
*g.table.final_sym(g.unwrap_generic(map_left_type))
500504
} else {

0 commit comments

Comments
 (0)