From 78bf3e039d77e3eb0d5e394273adb69b2b70a76d Mon Sep 17 00:00:00 2001
From: Kimplul <kimi.h.kuparinen@gmail.com>
Date: Mon, 17 Mar 2025 02:12:02 +0200
Subject: detect leaks

---
 examples/own.fwd | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 examples/own.fwd

(limited to 'examples/own.fwd')

diff --git a/examples/own.fwd b/examples/own.fwd
new file mode 100644
index 0000000..6634886
--- /dev/null
+++ b/examples/own.fwd
@@ -0,0 +1,33 @@
+do_something((auto) a);
+consume(auto a);
+
+main()
+{
+	do_something() => auto a;
+	do_something() => auto b;
+	!> e {
+		/* if do_something() fails, a is still alive, so we must kill
+		 * it. However, we might enter this error block after the
+		 * callback to do_something() was run, and a might've already
+		 * been moved. own just checks if we still own the resource and
+		 * executes the block.
+		 *
+		 * admittedly, purely syntactically it would look like b is
+		 * already alive at this point, but since it's actually within
+		 * the implicit closure, it is not. Might play around with ordering
+		 * the error block to come before implicit closures...
+		 */
+		own a {consume(a);}
+		error e
+	}
+
+	consume(a);
+	!> e {
+		/* if consume fails, b is still alive, but either this error
+		 * block runs (and throws an error) or the next consume is run,
+		 * so own is not necessary here */
+		consume(b);
+		error e
+	}
+	consume(b);
+}
-- 
cgit v1.2.3