diff --git a/crates/aiken-lang/src/tests/check.rs b/crates/aiken-lang/src/tests/check.rs index 68fd3b7d..e4d60b6c 100644 --- a/crates/aiken-lang/src/tests/check.rs +++ b/crates/aiken-lang/src/tests/check.rs @@ -323,6 +323,29 @@ fn mark_constructors_as_used_via_field_access() { assert_eq!(warnings.len(), 1) } +#[test] +fn expect_multi_patterns() { + let source_code = r#" + fn fold(list: List, initial: b, apply: fn(a, b) -> b) { + when list is { + [] -> initial + + [x, ..xs] -> fold(xs, apply(x, initial), apply) + } + } + + pub fn foo() { + expect Some(x), acc <- fold([Some(1), None], 0) + + x + acc + } + "#; + + let (warnings, _) = check(parse(source_code)).unwrap(); + + assert_eq!(warnings.len(), 0) +} + #[test] fn validator_correct_form() { let source_code = r#" diff --git a/crates/aiken-lang/src/tipo/expr.rs b/crates/aiken-lang/src/tipo/expr.rs index 5e1fb612..a3c8c93e 100644 --- a/crates/aiken-lang/src/tipo/expr.rs +++ b/crates/aiken-lang/src/tipo/expr.rs @@ -1992,6 +1992,8 @@ impl<'a, 'b> ExprTyper<'a, 'b> { is_validator_param: false, }; + let pattern_is_var = pattern.is_var(); + continuation.insert( 0, UntypedExpr::Assignment { @@ -2010,6 +2012,11 @@ impl<'a, 'b> ExprTyper<'a, 'b> { // erase backpassing while preserving assignment kind. kind: match kind { AssignmentKind::Let { .. } => AssignmentKind::let_(), + AssignmentKind::Expect { .. } + if pattern_is_var && annotation.is_none() => + { + AssignmentKind::let_() + } AssignmentKind::Expect { .. } => AssignmentKind::expect(), }, },