aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-04-08 16:40:59 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-04-08 16:40:59 -0400
commit9e98ea552dcf03a4a05a920c8f027d09130dd688 (patch)
treefa726bca66597c3734038ab2cb41cfd6990f5a97 /test
parentada441157f4a388950946e7f4db65c273f23c063 (diff)
downloadzig-9e98ea552dcf03a4a05a920c8f027d09130dd688.tar.gz
zig-9e98ea552dcf03a4a05a920c8f027d09130dd688.zip
fix calling convention at callsite of zig-generated fns
Diffstat (limited to 'test')
-rw-r--r--test/cases/coroutines.zig28
1 files changed, 28 insertions, 0 deletions
diff --git a/test/cases/coroutines.zig b/test/cases/coroutines.zig
index 922c1a7e58..5537323734 100644
--- a/test/cases/coroutines.zig
+++ b/test/cases/coroutines.zig
@@ -1,4 +1,5 @@
const std = @import("std");
+const builtin = @import("builtin");
const assert = std.debug.assert;
var x: i32 = 1;
@@ -189,3 +190,30 @@ async fn failing() !void {
suspend;
return error.Fail;
}
+
+test "error return trace across suspend points" {
+ const p = nonFailing();
+ resume p;
+ const p2 = try async<std.debug.global_allocator> printTrace(p);
+ cancel p2;
+}
+
+fn nonFailing() promise->error!void {
+ return async<std.debug.global_allocator> suspendThenFail() catch unreachable;
+}
+
+async fn suspendThenFail() error!void {
+ suspend;
+ return error.Fail;
+}
+
+async fn printTrace(p: promise->error!void) void {
+ (await p) catch |e| {
+ std.debug.assert(e == error.Fail);
+ if (@errorReturnTrace()) |trace| {
+ assert(trace.index == 1);
+ } else if (builtin.mode != builtin.Mode.ReleaseFast) {
+ @panic("expected return trace");
+ }
+ };
+}