@@ -4099,12 +4099,18 @@ fn (mut g Gen) stmts_with_tmp_var(stmts []ast.Stmt, tmp_var string) bool {
40994099 inside_assign_context := g.inside_struct_init
41004100 || g.inside_assign
41014101 || (!g.inside_return && g.inside_match_option)
4102- ret_expr_typ := if inside_assign_context {
4102+ expected_if_option_type := g.unwrap_generic(g.last_if_option_type)
4103+ has_expected_if_option_type := expected_if_option_type.has_flag(.option)
4104+ ret_expr_typ := if has_expected_if_option_type {
4105+ expected_if_option_type
4106+ } else if inside_assign_context {
41034107 stmt.typ
41044108 } else {
41054109 g.fn_decl.return_type
41064110 }
4107- ret_typ := if inside_assign_context {
4111+ ret_typ := if has_expected_if_option_type {
4112+ expected_if_option_type.clear_flag(.option)
4113+ } else if inside_assign_context {
41084114 stmt.typ
41094115 } else {
41104116 g.fn_decl.return_type.clear_flag(.option)
@@ -8330,6 +8336,7 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
83308336 }
83318337 // struct embedding
83328338 mut has_embed := false
8339+ mut last_embed_is_ptr := false
83338340 if sym.info in [ast.Alias, ast.Struct, ast.Aggregate] {
83348341 if selector_embed_types.len > 0 && sym.info is ast.Aggregate {
83358342 // For aggregate types, check per-variant whether the field is
@@ -8339,18 +8346,18 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
83398346 agg_sym := g.table.sym(sym.info.types[g.aggregate_type_idx])
83408347 if !g.table.struct_has_field(agg_sym, field_name) {
83418348 has_embed = node.from_embed_types.len > 0
8342- g.write_selector_expr_embed_name(node, node.from_embed_types)
8349+ last_embed_is_ptr = g.write_selector_expr_embed_name(node, node.from_embed_types)
83438350 }
83448351 } else if selector_embed_types.len > 0 {
83458352 has_embed = true
8346- g.write_selector_expr_embed_name(node, selector_embed_types)
8353+ last_embed_is_ptr = g.write_selector_expr_embed_name(node, selector_embed_types)
83478354 } else if node.generic_from_embed_types.len > 0 && sym.info is ast.Struct {
83488355 if sym.info.embeds.len > 0 {
83498356 mut is_find := false
83508357 for arr_val in node.generic_from_embed_types {
83518358 if arr_val.len > 0 {
83528359 if arr_val[0] == sym.info.embeds[0] {
8353- g.write_selector_expr_embed_name(node, arr_val)
8360+ last_embed_is_ptr = g.write_selector_expr_embed_name(node, arr_val)
83548361 is_find = true
83558362 has_embed = true
83568363 break
@@ -8359,21 +8366,22 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
83598366 }
83608367 if !is_find {
83618368 has_embed = node.from_embed_types.len > 0
8362- g.write_selector_expr_embed_name(node, node.from_embed_types)
8369+ last_embed_is_ptr = g.write_selector_expr_embed_name(node,
8370+ node.from_embed_types)
83638371 }
83648372 } else {
83658373 has_embed = node.from_embed_types.len > 0
8366- g.write_selector_expr_embed_name(node, node.from_embed_types)
8374+ last_embed_is_ptr = g.write_selector_expr_embed_name(node, node.from_embed_types)
83678375 }
83688376 } else if sym.info is ast.Aggregate {
83698377 agg_sym := g.table.sym(sym.info.types[g.aggregate_type_idx])
83708378 if !g.table.struct_has_field(agg_sym, field_name) {
83718379 has_embed = node.from_embed_types.len > 0
8372- g.write_selector_expr_embed_name(node, node.from_embed_types)
8380+ last_embed_is_ptr = g.write_selector_expr_embed_name(node, node.from_embed_types)
83738381 }
83748382 } else {
83758383 has_embed = node.from_embed_types.len > 0
8376- g.write_selector_expr_embed_name(node, node.from_embed_types)
8384+ last_embed_is_ptr = g.write_selector_expr_embed_name(node, node.from_embed_types)
83778385 }
83788386 }
83798387 alias_to_ptr := sym.info is ast.Alias && sym.info.parent_type.is_ptr()
@@ -8440,7 +8448,7 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
84408448 || (!opt_ptr_already_deref && unwrapped_expr_type.is_ptr()
84418449 && !is_interface_smartcast_lhs && !smartcast_ident_already_dereferenced)
84428450 }
8443- if !has_embed && left_is_ptr {
8451+ if ( !has_embed && left_is_ptr) || (has_embed && last_embed_is_ptr) {
84448452 g.write('->')
84458453 } else {
84468454 g.write('.')
@@ -8645,7 +8653,7 @@ fn (mut g Gen) gen_closure_fn(expr_styp string, m ast.Fn, name string) {
86458653 g.nr_closures++
86468654}
86478655
8648- fn (mut g Gen) write_selector_expr_embed_name(node ast.SelectorExpr, embed_types []ast.Type) {
8656+ fn (mut g Gen) write_selector_expr_embed_name(node ast.SelectorExpr, embed_types []ast.Type) bool {
86498657 mut is_shared := g.type_resolves_to_shared(node.expr_type)
86508658 mut lhs_expr_type := node.expr_type
86518659 if node.expr is ast.Ident && node.expr.obj is ast.Var && (node.expr.obj.typ.has_flag(.generic)
@@ -8676,7 +8684,7 @@ fn (mut g Gen) write_selector_expr_embed_name(node ast.SelectorExpr, embed_types
86768684 is_left_ptr := if i == 0 {
86778685 (resolved_selector_expr_type.is_ptr() || is_auto_heap) && !is_shared
86788686 } else {
8679- embed_types[i - 1].is_ptr()
8687+ g.table.fully_unaliased_type( embed_types[i - 1]) .is_ptr()
86808688 }
86818689 if i == 0 && is_shared {
86828690 g.write('->val')
@@ -8688,6 +8696,7 @@ fn (mut g Gen) write_selector_expr_embed_name(node ast.SelectorExpr, embed_types
86888696 }
86898697 g.write(embed_name)
86908698 }
8699+ return embed_types.len > 0 && g.table.fully_unaliased_type(embed_types.last()).is_ptr()
86918700}
86928701
86938702// check_var_scope checks if the variable has its value known from the node position
0 commit comments