From 2157fdbaca0b80e488c4f77ad5c0d04b051175cf Mon Sep 17 00:00:00 2001 From: Kimplul Date: Mon, 12 Aug 2024 18:55:46 +0300 Subject: make defer work better with generic code --- tests/defer.ek | 23 +++++++++++++++++++++++ tests/defer_shadow.ek | 28 ++++++++++++++++++++++++++++ tests/generic_defer.ek | 17 +++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 tests/defer.ek create mode 100644 tests/defer_shadow.ek create mode 100644 tests/generic_defer.ek (limited to 'tests') diff --git a/tests/defer.ek b/tests/defer.ek new file mode 100644 index 0000000..839cc4d --- /dev/null +++ b/tests/defer.ek @@ -0,0 +1,23 @@ +typedef i27 {}; +typedef i9 {}; +typedef bool {}; + +extern _putchar(i9 c); + +main() +{ + defer _putchar('S'); + for i9 i = 0 as i9; i < 10 as i9; i = i + 1 as i9 { + defer _putchar('0' + i); + + if i == 5 as i9 { continue; } + if i == 9 as i9 { defer _putchar('b'); break; } + } + + { + defer _putchar('g'); + goto end; + } + + end: +} diff --git a/tests/defer_shadow.ek b/tests/defer_shadow.ek new file mode 100644 index 0000000..0e890a2 --- /dev/null +++ b/tests/defer_shadow.ek @@ -0,0 +1,28 @@ +typedef i9 {} +typedef i27 {} + +define any[] {} + +extern _putchar(i9 c); + +typedef some_struct[any T] { + test() + { + i9 a = 'a' as i9; + { + /* at this point, only a is defined */ + defer _putchar(a); + + /* a gets shadowed */ + i9 a = 'b' as i9; + + /* defer should still point to the outer 'a' */ + } + } +} + +main() +{ + some_struct![i9] test = some_struct![i9]{}; + test.test(); +} diff --git a/tests/generic_defer.ek b/tests/generic_defer.ek new file mode 100644 index 0000000..11c099c --- /dev/null +++ b/tests/generic_defer.ek @@ -0,0 +1,17 @@ +define any[] {} + +typedef i27 {} +typedef i9 {} + +typedef a[any T] { + T b; + do_stuff() { + defer do_stuff(); + } +} + +main() +{ + a![i27] a = a![i27]{.b = 10}; + a![i9] b = a![i9]{.b = 20 as i9}; +} -- cgit v1.3