From 206864165524c9e2dc93ef0f70f032c60045406a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Inf=C3=BChr?= Date: Sat, 25 Jan 2025 13:53:10 +0100 Subject: [PATCH] frontend: Remove register in visit_expr_is --- dora-frontend/src/generator.rs | 2 ++ tests/trait/trait-object3.dora | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 tests/trait/trait-object3.dora diff --git a/dora-frontend/src/generator.rs b/dora-frontend/src/generator.rs index 6e9ac0427..616cfe7d7 100644 --- a/dora-frontend/src/generator.rs +++ b/dora-frontend/src/generator.rs @@ -1243,6 +1243,8 @@ impl<'a> AstBytecodeGen<'a> { self.builder.bind_label(merge_lbl); self.pop_scope(); + self.free_if_temp(value_reg); + dest } diff --git a/tests/trait/trait-object3.dora b/tests/trait/trait-object3.dora new file mode 100644 index 000000000..941757d47 --- /dev/null +++ b/tests/trait/trait-object3.dora @@ -0,0 +1,26 @@ +use std::traits::Iterator; + +class Range { + value: Int +} + +impl Iterator for Range { + type Item = Int; + + fn next(): Option[Int] { + if self.value <= 0 { + None[Int] + } else { + let result = self.value; + self.value -= 1; + Some[Int](result) + } + } +} + +fn main() { + let r = Range(2); + assert(r.next() is Some(x) && x == 2); + assert(r.next() is Some(x) && x == 1); + assert(r.next() is None); +}