| ... | @@ -774,3 +774,46 @@ test "return from suspend block" { | ... | @@ -774,3 +774,46 @@ test "return from suspend block" { |
| 774 | }; | 774 | }; |
| 775 | _ = async S.doTheTest(); | 775 | _ = async S.doTheTest(); |
| 776 | } | 776 | } |
| | 777 | |
| | 778 | test "struct parameter to async function is copied to the frame" { |
| | 779 | const S = struct { |
| | 780 | const Point = struct { |
| | 781 | x: i32, |
| | 782 | y: i32, |
| | 783 | }; |
| | 784 | |
| | 785 | var frame: anyframe = undefined; |
| | 786 | |
| | 787 | fn doTheTest() void { |
| | 788 | _ = async atest(); |
| | 789 | resume frame; |
| | 790 | } |
| | 791 | |
| | 792 | fn atest() void { |
| | 793 | var f: @Frame(foo) = undefined; |
| | 794 | bar(&f); |
| | 795 | clobberStack(10); |
| | 796 | } |
| | 797 | |
| | 798 | fn clobberStack(x: i32) void { |
| | 799 | if (x == 0) return; |
| | 800 | clobberStack(x - 1); |
| | 801 | var y: i32 = x; |
| | 802 | } |
| | 803 | |
| | 804 | fn bar(f: *@Frame(foo)) void { |
| | 805 | var pt = Point{ .x = 1, .y = 2 }; |
| | 806 | f.* = async foo(pt); |
| | 807 | var result = await f; |
| | 808 | expect(result == 1); |
| | 809 | } |
| | 810 | |
| | 811 | fn foo(point: Point) i32 { |
| | 812 | suspend { |
| | 813 | frame = @frame(); |
| | 814 | } |
| | 815 | return point.x; |
| | 816 | } |
| | 817 | }; |
| | 818 | S.doTheTest(); |
| | 819 | } |