fix bug in constraint gen for If

the condition expression wasn't actually constrained
This commit is contained in:
Folkert 2020-03-13 00:16:40 +01:00
parent 7f358cd14c
commit aeeaf99c17

View file

@ -328,16 +328,27 @@ pub fn constrain_expr(
} => { } => {
let bool_type = Type::Variable(Variable::BOOL); let bool_type = Type::Variable(Variable::BOOL);
let expect_bool = Expected::ForReason(Reason::IfCondition, bool_type, region); let expect_bool = Expected::ForReason(Reason::IfCondition, bool_type, region);
let mut branch_cons = Vec::with_capacity(2 * branches.len() + 2); let mut branch_cons = Vec::with_capacity(2 * branches.len() + 3);
// TODO why does this cond var exist? is it for error messages?
let cond_var_is_bool_con = Eq(
Type::Variable(*cond_var),
expect_bool.clone(),
Region::zero(),
);
branch_cons.push(cond_var_is_bool_con);
match expected { match expected {
FromAnnotation(name, arity, _, tipe) => { FromAnnotation(name, arity, _, tipe) => {
for (index, (loc_cond, loc_body)) in branches.iter().enumerate() { for (index, (loc_cond, loc_body)) in branches.iter().enumerate() {
let cond_con = Eq( let cond_con = constrain_expr(
Type::Variable(*cond_var), env,
expect_bool.clone(),
loc_cond.region, loc_cond.region,
&loc_cond.value,
expect_bool.clone(),
); );
let then_con = constrain_expr( let then_con = constrain_expr(
env, env,
loc_body.region, loc_body.region,
@ -374,11 +385,13 @@ pub fn constrain_expr(
} }
_ => { _ => {
for (index, (loc_cond, loc_body)) in branches.iter().enumerate() { for (index, (loc_cond, loc_body)) in branches.iter().enumerate() {
let cond_con = Eq( let cond_con = constrain_expr(
Type::Variable(*cond_var), env,
expect_bool.clone(),
loc_cond.region, loc_cond.region,
&loc_cond.value,
expect_bool.clone(),
); );
let then_con = constrain_expr( let then_con = constrain_expr(
env, env,
loc_body.region, loc_body.region,