File tree Expand file tree Collapse file tree 3 files changed +42
-4
lines changed Expand file tree Collapse file tree 3 files changed +42
-4
lines changed Original file line number Diff line number Diff line change @@ -634,8 +634,13 @@ fn (mut c Checker) anon_fn(mut node ast.AnonFn) ast.Type {
634
634
c.error ('original `${parent_var.name} ` is immutable, declare it with `mut` to make it mutable' ,
635
635
var.pos)
636
636
}
637
+ ptyp := if parent_var.smartcasts.len > 0 {
638
+ parent_var.smartcasts.last ()
639
+ } else {
640
+ parent_var.typ
641
+ }
637
642
if parent_var.typ != ast.no_type {
638
- parent_var_sym := c.table.final_sym (parent_var.typ )
643
+ parent_var_sym := c.table.final_sym (ptyp )
639
644
if parent_var_sym.info is ast.FnType {
640
645
ret_typ := c.unwrap_generic (parent_var_sym.info.func.return_type)
641
646
if ret_typ.has_flag (.generic) {
@@ -663,7 +668,7 @@ fn (mut c Checker) anon_fn(mut node ast.AnonFn) ast.Type {
663
668
var.typ = parent_var.expr.expr_type.clear_option_and_result ()
664
669
}
665
670
} else {
666
- var.typ = parent_var.typ
671
+ var.typ = ptyp
667
672
}
668
673
if var.typ.has_flag (.generic) {
669
674
has_generic = true
Original file line number Diff line number Diff line change @@ -662,13 +662,20 @@ fn (mut g Gen) gen_anon_fn(mut node ast.AnonFn) {
662
662
g.writeln ('.${var_name} = string_clone(${var_name} ),' )
663
663
} else {
664
664
mut is_auto_heap := false
665
+ mut field_name := ''
665
666
if obj := node.decl.scope.parent.find (var.name) {
666
667
if obj is ast.Var {
667
668
is_auto_heap = ! obj.is_stack_obj && obj.is_auto_heap
669
+ if obj.smartcasts.len > 0 {
670
+ if g.table.type_kind (obj.typ) == .sum_type {
671
+ cast_sym := g.table.sym (obj.smartcasts.last ())
672
+ field_name + = '._${cast_sym.cname} '
673
+ }
674
+ }
668
675
}
669
676
}
670
- if is_auto_heap && ! is_ptr {
671
- g.writeln ('.${var_name} = *${var_name} ,' )
677
+ if ( is_auto_heap && ! is_ptr) || field_name != '' {
678
+ g.writeln ('.${var_name} = *${var_name}${field_name} ,' )
672
679
} else {
673
680
g.writeln ('.${var_name} = ${var_name} ,' )
674
681
}
Original file line number Diff line number Diff line change
1
+ struct Aa {
2
+ a int
3
+ }
4
+
5
+ struct Bb {
6
+ b int
7
+ }
8
+
9
+ type Type = Aa | Bb
10
+
11
+ fn test_main () {
12
+ t := Type (Aa{
13
+ a: 2
14
+ })
15
+ match t {
16
+ Aa {
17
+ assert t.a == 2
18
+ func := fn [t] () {
19
+ assert typeof (t).name == 'Aa'
20
+ assert t.a == 2
21
+ }
22
+ func ()
23
+ }
24
+ Bb {}
25
+ }
26
+ }
You can’t perform that action at this time.
0 commit comments