diff --git a/crates/aiken-lang/src/tests/check.rs b/crates/aiken-lang/src/tests/check.rs index 7e48abe3..bac51a06 100644 --- a/crates/aiken-lang/src/tests/check.rs +++ b/crates/aiken-lang/src/tests/check.rs @@ -1847,6 +1847,44 @@ fn allow_expect_into_type_from_data() { assert!(check(parse(source_code)).is_ok()) } +#[test] +fn forbid_partial_down_casting() { + let source_code = r#" + type Foo { + x: Int + } + + fn bar(n: List) { + expect a: List = n + a + } + "#; + + assert!(matches!( + dbg!(check(parse(source_code))), + Err((_, Error::CouldNotUnify { .. })) + )) +} + +#[test] +fn forbid_partial_up_casting() { + let source_code = r#" + type Foo { + x: Int + } + + fn bar(n: List) { + expect a: List = n + a + } + "#; + + assert!(matches!( + dbg!(check(parse(source_code))), + Err((_, Error::CouldNotUnify { .. })) + )) +} + #[test] fn allow_expect_into_type_from_data_2() { let source_code = r#" diff --git a/crates/aiken-lang/src/tipo/environment.rs b/crates/aiken-lang/src/tipo/environment.rs index 481eda1b..430b6754 100644 --- a/crates/aiken-lang/src/tipo/environment.rs +++ b/crates/aiken-lang/src/tipo/environment.rs @@ -1431,7 +1431,7 @@ impl<'a> Environment<'a> { lhs, Type::with_alias(tipo.clone(), alias.clone()), location, - allow_cast, + false, ); } } @@ -1470,7 +1470,7 @@ impl<'a> Environment<'a> { Ok(()) } - Action::Unify(t) => self.unify(t, rhs, location, allow_cast), + Action::Unify(t) => self.unify(t, rhs, location, false), Action::CouldNotUnify => Err(Error::CouldNotUnify { location, @@ -1484,7 +1484,7 @@ impl<'a> Environment<'a> { if let Type::Var { .. } = rhs.deref() { return self - .unify(rhs, lhs, location, allow_cast) + .unify(rhs, lhs, location, false) .map_err(|e| e.flip_unify()); } @@ -1511,7 +1511,7 @@ impl<'a> Environment<'a> { unify_enclosed_type( lhs.clone(), rhs.clone(), - self.unify(a.clone(), b.clone(), location, allow_cast), + self.unify(a.clone(), b.clone(), location, false), )?; } Ok(()) @@ -1531,7 +1531,7 @@ impl<'a> Environment<'a> { unify_enclosed_type( lhs.clone(), rhs.clone(), - self.unify(a.clone(), b.clone(), location, allow_cast), + self.unify(a.clone(), b.clone(), location, false), )?; } Ok(()) @@ -1550,7 +1550,7 @@ impl<'a> Environment<'a> { }, ) if args1.len() == args2.len() => { for (a, b) in args1.iter().zip(args2) { - self.unify(a.clone(), b.clone(), location, allow_cast) + self.unify(a.clone(), b.clone(), location, false) .map_err(|_| Error::CouldNotUnify { location, expected: lhs.clone(), @@ -1559,7 +1559,7 @@ impl<'a> Environment<'a> { rigid_type_names: HashMap::new(), })?; } - self.unify(retrn1.clone(), retrn2.clone(), location, allow_cast) + self.unify(retrn1.clone(), retrn2.clone(), location, false) .map_err(|_| Error::CouldNotUnify { location, expected: lhs.clone(),