Thread down if/is pattern assignment type down to code-generation.

This isn't sufficient however, as the 'assignment' helper handling
  code generation doesn't perform any check when patterns are vars. This
  is curious, and need to be investigated further.
This commit is contained in:
KtorZ 2024-07-25 16:36:09 +02:00 committed by Kasey
parent c4abf2e8f4
commit a6c5dbb5ad
3 changed files with 28 additions and 22 deletions

View File

@ -1833,7 +1833,7 @@ impl TypedClause {
pub struct UntypedClauseGuard {}
pub type TypedIfBranch = IfBranch<TypedExpr, TypedPattern>;
pub type TypedIfBranch = IfBranch<TypedExpr, (TypedPattern, Rc<Type>)>;
pub type UntypedIfBranch = IfBranch<UntypedExpr, AssignmentPattern>;
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]

View File

@ -637,7 +637,8 @@ impl<'a> CodeGenerator<'a> {
let body = self.build(&branch.body, module_build_name, &[]);
match &branch.is {
Some(pattern) => AirTree::let_assignment(
Some((pattern, tipo)) => {
AirTree::let_assignment(
"acc_var",
// use anon function as a delay to avoid evaluating the acc
AirTree::anon_func(vec![], acc, true),
@ -645,7 +646,7 @@ impl<'a> CodeGenerator<'a> {
pattern,
condition,
body,
&pattern.tipo(&branch.condition).unwrap(),
tipo,
AssignmentProperties {
value_type: branch.condition.tipo(),
kind: AssignmentKind::Expect { backpassing: () },
@ -654,7 +655,8 @@ impl<'a> CodeGenerator<'a> {
otherwise: AirTree::local_var("acc_var", void()),
},
),
),
)
}
None => AirTree::if_branch(tipo.clone(), condition, body, acc),
}
},

View File

@ -1548,7 +1548,12 @@ impl<'a, 'b> ExprTyper<'a, 'b> {
location,
} = is;
let TypedExpr::Assignment { value, pattern, .. } = typer.infer_assignment(
let TypedExpr::Assignment {
value,
pattern,
tipo,
..
} = typer.infer_assignment(
pattern,
branch.condition.clone(),
AssignmentKind::is(),
@ -1564,11 +1569,10 @@ impl<'a, 'b> ExprTyper<'a, 'b> {
location: branch.condition.location().union(location),
})
}
assert_no_assignment(&branch.body)?;
let body = typer.infer(branch.body.clone())?;
Ok((*value, body, Some(pattern)))
Ok((*value, body, Some((pattern, tipo))))
})?,
None => {
let condition = self.infer(branch.condition.clone())?;