cgen: fix generic fn return mut parameter (#10662)
parent
2752833a27
commit
f246d73d6e
|
@ -2280,6 +2280,9 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
|||
g.write('*')
|
||||
}
|
||||
}
|
||||
if lx.is_auto_deref_var() {
|
||||
g.write('*')
|
||||
}
|
||||
g.expr(lx)
|
||||
noscan := if is_auto_heap { g.check_noscan(return_type) } else { '' }
|
||||
if is_opt {
|
||||
|
@ -4622,6 +4625,9 @@ fn (mut g Gen) return_stmt(node ast.Return) {
|
|||
continue
|
||||
}
|
||||
g.write('.arg$arg_idx=')
|
||||
if expr.is_auto_deref_var() {
|
||||
g.write('*')
|
||||
}
|
||||
g.expr(expr)
|
||||
arg_idx++
|
||||
if i < node.exprs.len - 1 {
|
||||
|
|
|
@ -138,6 +138,9 @@ fn (mut g Gen) gen_expr_to_string(expr ast.Expr, etype ast.Type) {
|
|||
} else {
|
||||
str_fn_name := g.gen_str_for_type(typ)
|
||||
g.write('${str_fn_name}(')
|
||||
if expr.is_auto_deref_var() {
|
||||
g.write('*')
|
||||
}
|
||||
if sym.kind != .function {
|
||||
g.expr_with_cast(expr, typ, typ)
|
||||
}
|
||||
|
|
|
@ -1,28 +1,38 @@
|
|||
pub struct Two_data {
|
||||
pub mut:
|
||||
title string
|
||||
content string
|
||||
}
|
||||
|
||||
pub struct Page {
|
||||
pub mut:
|
||||
lang string
|
||||
page string
|
||||
var_one string
|
||||
var_two string
|
||||
var_three Two_data
|
||||
}
|
||||
|
||||
fn get_keys_and_values<T>(mut keys []string, mut values []string, mut data T) {
|
||||
fn get_keys_and_values<T>(mut keys []string, mut values []string, mut data T) ([]string, []string, T) {
|
||||
$for field in T.fields {
|
||||
$if field.typ is string {
|
||||
keys << field.name
|
||||
values << data.$(field.name)
|
||||
}
|
||||
}
|
||||
return keys, values, data
|
||||
}
|
||||
|
||||
fn awesome<T>(mut data T) {
|
||||
mut keys := []string{}
|
||||
mut values := []string{}
|
||||
get_keys_and_values(mut keys, mut values, mut data)
|
||||
keys, values, data = get_keys_and_values(mut keys, mut values, mut data)
|
||||
println(keys)
|
||||
assert keys == ['lang', 'page', 'var_one', 'var_two']
|
||||
println(values)
|
||||
assert values == ['vlang', 'one', 'variable one', 'variable two']
|
||||
println(data)
|
||||
assert '$data'.contains("title: 'what a title'")
|
||||
}
|
||||
|
||||
fn test_generic_fn_infer_multi_paras() {
|
||||
|
@ -31,6 +41,10 @@ fn test_generic_fn_infer_multi_paras() {
|
|||
page: 'one'
|
||||
var_one: 'variable one'
|
||||
var_two: 'variable two'
|
||||
var_three: {
|
||||
title: 'what a title'
|
||||
content: 'what a content'
|
||||
}
|
||||
}
|
||||
awesome(mut page)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue