diff --git a/reid/examples/reid/fibonacci.reid b/reid/examples/reid/fibonacci.reid index 2c0224a..546e636 100644 --- a/reid/examples/reid/fibonacci.reid +++ b/reid/examples/reid/fibonacci.reid @@ -7,7 +7,6 @@ fn main() -> bool { fn fibonacci(value: u16) -> u16 { if value <= 2 { return 1; - } else { - return fibonacci(value - 1) + fibonacci(value - 2); - }; + } + fibonacci(value - 1) + fibonacci(value - 2) } diff --git a/reid/src/mir/typecheck.rs b/reid/src/mir/typecheck.rs index aff931d..791ca96 100644 --- a/reid/src/mir/typecheck.rs +++ b/reid/src/mir/typecheck.rs @@ -271,6 +271,7 @@ impl Expression { let res = else_block.typecheck(state, hint_t); state.or_else(res, Vague(Unknown), else_block.meta) } else { + // TODO assert that then_ret_t is Void Vague(Unknown) }; diff --git a/reid/src/mir/types.rs b/reid/src/mir/types.rs index 9b4f377..b0f6fb6 100644 --- a/reid/src/mir/types.rs +++ b/reid/src/mir/types.rs @@ -40,11 +40,12 @@ impl ReturnType for Expression { Variable(var) => var.return_type(), BinOp(_, then_e, else_e) => { let then_r = then_e.return_type()?; - let else_e = else_e.return_type()?; - let kind = if then_r.0 == ReturnKind::Hard && else_e.0 == ReturnKind::Hard { + let else_r = else_e.return_type()?; + + let kind = if then_r.0 == ReturnKind::Hard && else_r.0 == ReturnKind::Hard { ReturnKind::Hard } else { - ReturnKind::Hard + ReturnKind::Soft }; Ok((kind, then_r.1)) } @@ -57,7 +58,20 @@ impl ReturnType for Expression { impl ReturnType for IfExpression { fn return_type(&self) -> Result<(ReturnKind, TypeKind), ReturnTypeOther> { - self.1.return_type() + let then_r = self.1.return_type()?; + if let Some(else_b) = &self.2 { + let else_r = else_b.return_type()?; + dbg!(&then_r, &else_r); + + let kind = if then_r.0 == ReturnKind::Hard && else_r.0 == ReturnKind::Hard { + ReturnKind::Hard + } else { + ReturnKind::Soft + }; + Ok((kind, then_r.1)) + } else { + Ok((ReturnKind::Soft, then_r.1)) + } } }