summaryrefslogtreecommitdiff
path: root/tests/memory/test_drop_flags.zc
diff options
context:
space:
mode:
authorSAJJA EASWAR <eshwarsajja20@gmail.com>2026-01-25 22:59:36 +0530
committerSAJJA EASWAR <eshwarsajja20@gmail.com>2026-01-25 22:59:36 +0530
commitebc8b94baa6bc694cb4829e2eb2934a1f17fa6a1 (patch)
tree71b952ad455bf17d5bdea01472f0e2297f25eabe /tests/memory/test_drop_flags.zc
parent863118c95caac0d69a35f6ae4d2e83844734a8a1 (diff)
parent489336b2101bf16edeec7bfc4379408eb19b936e (diff)
Merge branch 'main' into pr-109
Diffstat (limited to 'tests/memory/test_drop_flags.zc')
-rw-r--r--tests/memory/test_drop_flags.zc42
1 files changed, 42 insertions, 0 deletions
diff --git a/tests/memory/test_drop_flags.zc b/tests/memory/test_drop_flags.zc
new file mode 100644
index 0000000..8a25d8d
--- /dev/null
+++ b/tests/memory/test_drop_flags.zc
@@ -0,0 +1,42 @@
+import "../../std/mem.zc"
+
+// Global to track destructor calls
+let DTOR_COUNT = 0;
+
+struct Buffer {
+ data: int*;
+}
+
+impl Drop for Buffer {
+ fn drop(self) {
+ // This should run exactly ONCE per unique allocation
+ println "Entering destructor";
+ DTOR_COUNT = DTOR_COUNT + 1;
+ if (self.data != NULL) {
+ free(self.data);
+ self.data = NULL;
+ }
+ }
+}
+
+test "drop_flags_variable_move" {
+ DTOR_COUNT = 0;
+ {
+ println "Init";
+ let buffer = Buffer { data: malloc(100) };
+ println "Moved";
+ let buf = buffer; // Move occurs
+ // buffer is moved-from. Flag should prevent destructor.
+ // buf owns data.
+ }
+ println "Left scope";
+
+ // Check count
+ // buffer dtor: SKIPPED (flag=0)
+ // buf dtor: CALLED (flag=1)
+ // Total: 1
+ if (DTOR_COUNT != 1) {
+ println "Error: Destructor called {DTOR_COUNT} times, expected 1";
+ exit(1);
+ }
+}