aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-12-19 16:45:15 -0500
committerAndrew Kelley <superjoe30@gmail.com>2016-12-19 16:45:15 -0500
commit09d50e35a4555d9af2c794390a4375c7fc0e48f7 (patch)
tree14c3b6abf1c13eb763c31a0743a41b826e864e20 /test
parent14422e0312b3df271bfb60e8a6233afb128354fc (diff)
downloadzig-09d50e35a4555d9af2c794390a4375c7fc0e48f7.tar.gz
zig-09d50e35a4555d9af2c794390a4375c7fc0e48f7.zip
IR: support error defers
Diffstat (limited to 'test')
-rw-r--r--test/cases3/defer.zig35
-rw-r--r--test/self_hosted3.zig1
2 files changed, 36 insertions, 0 deletions
diff --git a/test/cases3/defer.zig b/test/cases3/defer.zig
new file mode 100644
index 0000000000..c6dcb586b1
--- /dev/null
+++ b/test/cases3/defer.zig
@@ -0,0 +1,35 @@
+var result: [3]u8 = undefined;
+var index: usize = undefined;
+
+error FalseNotAllowed;
+
+fn runSomeDefers(x: bool) -> %bool {
+ index = 0;
+ defer {result[index] = 'a'; index += 1;};
+ %defer {result[index] = 'b'; index += 1;};
+ defer {result[index] = 'c'; index += 1;};
+ return if (x) x else error.FalseNotAllowed;
+}
+
+fn mixingNormalAndErrorDefers() {
+ @setFnTest(this);
+
+ assert(%%runSomeDefers(true));
+ assert(result[0] == 'c');
+ assert(result[1] == 'a');
+
+ const ok = runSomeDefers(false) %% |err| {
+ assert(err == error.FalseNotAllowed);
+ true
+ };
+ assert(ok);
+ assert(result[0] == 'c');
+ assert(result[1] == 'b');
+ assert(result[2] == 'a');
+}
+
+// TODO const assert = @import("std").debug.assert;
+fn assert(ok: bool) {
+ if (!ok)
+ @unreachable();
+}
diff --git a/test/self_hosted3.zig b/test/self_hosted3.zig
index 8edc5ab5e9..329e8571c5 100644
--- a/test/self_hosted3.zig
+++ b/test/self_hosted3.zig
@@ -7,3 +7,4 @@ const test_atomics = @import("cases3/atomics.zig");
const test_for = @import("cases3/for.zig");
const test_math = @import("cases3/math.zig");
const test_generics = @import("cases3/generics.zig");
+const test_defer = @import("cases3/defer.zig");