From c3f1646274f1c21f62b391feeefb5df25e4a13c8 Mon Sep 17 00:00:00 2001 From: Ayaz Hafiz Date: Thu, 12 Jan 2023 15:05:54 -0600 Subject: [PATCH] Weaken ability members behind let-bindings --- crates/compiler/constrain/src/expr.rs | 5 ++- crates/compiler/solve/tests/solve_expr.rs | 46 ++++++++++++++++++++--- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/crates/compiler/constrain/src/expr.rs b/crates/compiler/constrain/src/expr.rs index 2d9dcd8f71..e9e168ed9e 100644 --- a/crates/compiler/constrain/src/expr.rs +++ b/crates/compiler/constrain/src/expr.rs @@ -3860,9 +3860,10 @@ fn is_generalizable_expr(mut expr: &Expr) -> bool { | TypedHole(_) | RuntimeError(..) | ZeroArgumentTag { .. } - | Tag { .. } => return false, + | Tag { .. } + | AbilityMember(_, _, _) => return false, // TODO(weakening) - Var(_, _) | AbilityMember(_, _, _) => return true, + Var(_, _) => return true, } } } diff --git a/crates/compiler/solve/tests/solve_expr.rs b/crates/compiler/solve/tests/solve_expr.rs index c78dc4b153..9079a055c7 100644 --- a/crates/compiler/solve/tests/solve_expr.rs +++ b/crates/compiler/solve/tests/solve_expr.rs @@ -6599,6 +6599,42 @@ mod solve_expr { #^^{-1} main = + alias1 = \x -> id x + # ^^ + alias2 = \x -> alias1 x + # ^^^^^^ + + a : A + a = alias2 (@A {}) + # ^^^^^^ + + a + "# + ), + @r###" + A#id(4) : A -[[id(4)]]-> A + Id#id(2) : a -[[] + a:id(2):1]-> a | a has Id + alias1 : a -[[alias1(6)]]-> a | a has Id + alias2 : A -[[alias2(7)]]-> A + "### + ) + } + + #[test] + fn resolve_lambda_set_weakened_ability_alias() { + infer_queries!( + indoc!( + r#" + app "test" provides [main] to "./platform" + + Id has id : a -> a | a has Id + + A := {} has [Id {id}] + id = \@A {} -> @A {} + #^^{-1} + + main = + # Both alias1, alias2 should get weakened alias1 = id # ^^ alias2 = alias1 @@ -6613,8 +6649,8 @@ mod solve_expr { ), @r###" A#id(4) : A -[[id(4)]]-> A - Id#id(2) : a -[[] + a:id(2):1]-> a | a has Id - alias1 : a -[[] + a:id(2):1]-> a | a has Id + Id#id(2) : A -[[id(4)]]-> A + alias1 : A -[[id(4)]]-> A alias2 : A -[[id(4)]]-> A "### ) @@ -6744,8 +6780,8 @@ mod solve_expr { #^^{-1} main = - alias = id - # ^^ + alias = \x -> id x + # ^^ a : A a = (alias (@A {})) {} @@ -6757,7 +6793,7 @@ mod solve_expr { @r#" A#id(5) : {} -[[id(5)]]-> ({} -[[8]]-> {}) Id#id(3) : a -[[] + a:id(3):1]-> ({} -[[] + a:id(3):2]-> a) | a has Id - alias : {} -[[id(5)]]-> ({} -[[8]]-> {}) + alias : {} -[[alias(9)]]-> ({} -[[8]]-> {}) "# print_only_under_alias: true )