[–] jordan_bonecut 4 days ago
[–] nicce 4 days ago
How are you going to solve the problem with other means? Lifetimes basically guarantee, that there are no use-after-free bugs.
[–] jordan_bonecut 4 days ago
Each “where” is called a plane, which is a tree. The stack plane contains all your function calls memory, a structure allocated on the stack has a child plane for each field. The compiler tags which plane something is from at compile time and tracks when it dies.
Things do get complicated in scenarios like:
fn max(a: &usize, b: &usize) -> &usize {
if *a > *b { a } else { b }
}In such a scenario the compiler tags the result with both of the input planes. However, you cannot define add a postcondition ensures clause to make it more precise
[–] tancop 3 days ago
[–] 0c3ca83 3 days ago
[–] jordan_bonecut 3 days ago
[–] 0c3ca83 3 days ago
[–] jordan_bonecut 3 days ago
[–] jordan_bonecut 3 days ago
[–] throwaway17_17 4 days ago
In a sibling comment I said the types seem more likely to be refinement (or Liquid) types instead of being full-spectrum dependent types. Is this correct? I certainly haven’t been through enough of the docs to be confident, but I took a swing when I posted my comment.
[–] jordan_bonecut 3 days ago
[–] throwaway17_17 4 days ago
[–] jordan_bonecut 4 days ago
[–] ch4s3 4 days ago
[–] jordan_bonecut 3 days ago
[–] ch4s3 3 days ago
How are you doing resolution of your dependent(refined?) types? I've been using Z3, but you're clearly doing something else here.
let x = vec![1,2,3]; let a = &mut x[0]; let b = &mut x[1]; swap(a, b);
This is not allowed. And actually in the compiler’s mind it’s for the same reason as this:
let x = vec![1,2]; let a = &mut x[0]; x.push(3); a = a + 1;
Which is definitely not safe and should be rejected. But the compiler cannot reason that the above case is actually safe, because they both fail to compile for lifetime reasons.
Another thing I’m working on are “patterns” which are like enums on steroids. In Rust you cannot define how an enum is laid out, thus requiring optimizations for types like Option<&T> to be in the compiler. In evergreen this will be in the language via a similar process to trait implementation.