diff options
| author | SAJJA EASWAR <eshwarsajja20@gmail.com> | 2026-01-25 22:59:36 +0530 |
|---|---|---|
| committer | SAJJA EASWAR <eshwarsajja20@gmail.com> | 2026-01-25 22:59:36 +0530 |
| commit | ebc8b94baa6bc694cb4829e2eb2934a1f17fa6a1 (patch) | |
| tree | 71b952ad455bf17d5bdea01472f0e2297f25eabe /tests/memory/test_drop_flags.zc | |
| parent | 863118c95caac0d69a35f6ae4d2e83844734a8a1 (diff) | |
| parent | 489336b2101bf16edeec7bfc4379408eb19b936e (diff) | |
Merge branch 'main' into pr-109
Diffstat (limited to 'tests/memory/test_drop_flags.zc')
| -rw-r--r-- | tests/memory/test_drop_flags.zc | 42 |
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); + } +} |
