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('*')
 | 
											g.write('*')
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									if lx.is_auto_deref_var() {
 | 
				
			||||||
 | 
										g.write('*')
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				g.expr(lx)
 | 
									g.expr(lx)
 | 
				
			||||||
				noscan := if is_auto_heap { g.check_noscan(return_type) } else { '' }
 | 
									noscan := if is_auto_heap { g.check_noscan(return_type) } else { '' }
 | 
				
			||||||
				if is_opt {
 | 
									if is_opt {
 | 
				
			||||||
| 
						 | 
					@ -4622,6 +4625,9 @@ fn (mut g Gen) return_stmt(node ast.Return) {
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			g.write('.arg$arg_idx=')
 | 
								g.write('.arg$arg_idx=')
 | 
				
			||||||
 | 
								if expr.is_auto_deref_var() {
 | 
				
			||||||
 | 
									g.write('*')
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			g.expr(expr)
 | 
								g.expr(expr)
 | 
				
			||||||
			arg_idx++
 | 
								arg_idx++
 | 
				
			||||||
			if i < node.exprs.len - 1 {
 | 
								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 {
 | 
						} else {
 | 
				
			||||||
		str_fn_name := g.gen_str_for_type(typ)
 | 
							str_fn_name := g.gen_str_for_type(typ)
 | 
				
			||||||
		g.write('${str_fn_name}(')
 | 
							g.write('${str_fn_name}(')
 | 
				
			||||||
 | 
							if expr.is_auto_deref_var() {
 | 
				
			||||||
 | 
								g.write('*')
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if sym.kind != .function {
 | 
							if sym.kind != .function {
 | 
				
			||||||
			g.expr_with_cast(expr, typ, typ)
 | 
								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 struct Page {
 | 
				
			||||||
pub mut:
 | 
					pub mut:
 | 
				
			||||||
	lang      string
 | 
						lang      string
 | 
				
			||||||
	page      string
 | 
						page      string
 | 
				
			||||||
	var_one   string
 | 
						var_one   string
 | 
				
			||||||
	var_two   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 {
 | 
						$for field in T.fields {
 | 
				
			||||||
		$if field.typ is string {
 | 
							$if field.typ is string {
 | 
				
			||||||
			keys << field.name
 | 
								keys << field.name
 | 
				
			||||||
			values << data.$(field.name)
 | 
								values << data.$(field.name)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return keys, values, data
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn awesome<T>(mut data T) {
 | 
					fn awesome<T>(mut data T) {
 | 
				
			||||||
	mut keys := []string{}
 | 
						mut keys := []string{}
 | 
				
			||||||
	mut values := []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)
 | 
						println(keys)
 | 
				
			||||||
	assert keys == ['lang', 'page', 'var_one', 'var_two']
 | 
						assert keys == ['lang', 'page', 'var_one', 'var_two']
 | 
				
			||||||
	println(values)
 | 
						println(values)
 | 
				
			||||||
	assert values == ['vlang', 'one', 'variable one', 'variable two']
 | 
						assert values == ['vlang', 'one', 'variable one', 'variable two']
 | 
				
			||||||
 | 
						println(data)
 | 
				
			||||||
 | 
						assert '$data'.contains("title: 'what a title'")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_generic_fn_infer_multi_paras() {
 | 
					fn test_generic_fn_infer_multi_paras() {
 | 
				
			||||||
| 
						 | 
					@ -31,6 +41,10 @@ fn test_generic_fn_infer_multi_paras() {
 | 
				
			||||||
		page: 'one'
 | 
							page: 'one'
 | 
				
			||||||
		var_one: 'variable one'
 | 
							var_one: 'variable one'
 | 
				
			||||||
		var_two: 'variable two'
 | 
							var_two: 'variable two'
 | 
				
			||||||
 | 
							var_three: {
 | 
				
			||||||
 | 
								title: 'what a title'
 | 
				
			||||||
 | 
								content: 'what a content'
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	awesome(mut page)
 | 
						awesome(mut page)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue