| ... | ... | @@ -774,3 +774,46 @@ test "return from suspend block" { |
| 774 | 774 | }; |
| 775 | 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 | } |