patx/relay-lang

Fix non-exhaustive BinOp match in eval_bin

Commit 8088212 · Harrison Erd · 2026-02-10T17:09:54-05:00

Changeset
8088212abd7435b5d759302f0f65788d01f75ada
Parents
9ff747d3c140dcf566198850d73fac2e6390a5f3

View source at this commit

Comments

No comments yet.

Log in to comment

Diff

diff --git a/src/main.rs b/src/main.rs
index baf32e2..f78f5cb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2027,33 +2027,31 @@ impl Evaluator {
                 self.call_value(c, a, kw).await
             }
 
-            Expr::BinOp { left, op, right } => {
-                match op {
-                    BinOp::And => {
-                        let l = self.resolve_if_needed(self.eval_expr(left).await?).await?;
-                        if !l.truthy() {
-                            Ok(Value::Bool(false))
-                        } else {
-                            let r = self.resolve_if_needed(self.eval_expr(right).await?).await?;
-                            Ok(Value::Bool(r.truthy()))
-                        }
-                    }
-                    BinOp::Or => {
-                        let l = self.resolve_if_needed(self.eval_expr(left).await?).await?;
-                        if l.truthy() {
-                            Ok(Value::Bool(true))
-                        } else {
-                            let r = self.resolve_if_needed(self.eval_expr(right).await?).await?;
-                            Ok(Value::Bool(r.truthy()))
-                        }
+            Expr::BinOp { left, op, right } => match op {
+                BinOp::And => {
+                    let l = self.resolve_if_needed(self.eval_expr(left).await?).await?;
+                    if !l.truthy() {
+                        Ok(Value::Bool(false))
+                    } else {
+                        let r = self.resolve_if_needed(self.eval_expr(right).await?).await?;
+                        Ok(Value::Bool(r.truthy()))
                     }
-                    _ => {
-                        let l = self.resolve_if_needed(self.eval_expr(left).await?).await?;
+                }
+                BinOp::Or => {
+                    let l = self.resolve_if_needed(self.eval_expr(left).await?).await?;
+                    if l.truthy() {
+                        Ok(Value::Bool(true))
+                    } else {
                         let r = self.resolve_if_needed(self.eval_expr(right).await?).await?;
-                        eval_bin(*op, l, r)
+                        Ok(Value::Bool(r.truthy()))
                     }
                 }
-            }
+                _ => {
+                    let l = self.resolve_if_needed(self.eval_expr(left).await?).await?;
+                    let r = self.resolve_if_needed(self.eval_expr(right).await?).await?;
+                    eval_bin(*op, l, r)
+                }
+            },
 
             Expr::Unary { op, expr } => {
                 let v = self.resolve_if_needed(self.eval_expr(expr).await?).await?;
@@ -2297,6 +2295,8 @@ fn coerce_param_type(ty: &str, v: Value) -> RResult<Value> {
 fn eval_bin(op: BinOp, l: Value, r: Value) -> RResult<Value> {
     use BinOp::*;
     Ok(match op {
+        And => Value::Bool(l.truthy() && r.truthy()),
+        Or => Value::Bool(l.truthy() || r.truthy()),
         Add => bin_add(l, r)?,
         Sub => bin_sub(l, r)?,
         Mul => bin_mul(l, r)?,