Positive coverage: prove_wc / forall
forall| Line | Coverage | Source |
|---|---|---|
| 35 | N/A | (let (env, subst) = env.universal_substitution(binder)) |
| 36 | N/A | (let p1 = binder.instantiate_with(&subst).unwrap()) |
| 37 | 8 | (prove_wc(decls, env, assumptions, p1) => c) |
| ──────── ("forall") | ||
| 39 | 12 | (prove_wc(decls, env, assumptions, WcData::ForAll(binder)) => c.pop_subst(&subst)) |
12 tests exercised this rule:
Source location: crates/formality-rust/src/prove/prove/test/eq_assumptions.rs:15
#[test]
fn test_a() {
test_prove(
Program::empty(),
term("{} => {for<T, U> if {T = u32, U = Vec<T>} U = Vec<u32>}"),
)
.assert_ok(expect!["{Constraints { env: Env { variables: [], bias: Soundness, pending: [], allow_pending_outlives: false }, known_true: true, substitution: {} }}"]);
}
Proof tree
prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (implies)prove_wc.rs:44prove_wc (eq)prove_wc.rs:128prove_eq (normalize-l)prove_eq.rs:72prove_normalize (normalize-via-assumption)prove_normalize.rs:34prove_normalize_via (axiom-l)prove_normalize.rs:98
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (rigid)prove_eq.rs:50prove_wc_list (some)prove_wc_list.rs:31prove_wc (assumption - relation)prove_wc.rs:57prove_via (relation-axiom)prove_via.rs:41
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
Source location: crates/formality-rust/src/prove/prove/test/eq_assumptions.rs:24
#[test]
fn test_b() {
test_prove(
Program::empty(),
term("exists<A> {} => {for<T, U> if {T = u32, U = Vec<T>} A = U}"),
)
.assert_ok(expect!["{Constraints { env: Env { variables: [?ty_2, ?ty_1], bias: Soundness, pending: [], allow_pending_outlives: false }, known_true: true, substitution: {?ty_1 => Vec<u32>, ?ty_2 => u32} }}"]);
}
Proof tree
prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (implies)prove_wc.rs:44prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (normalize-l)prove_eq.rs:72prove_normalize (normalize-via-assumption)prove_normalize.rs:34prove_normalize_via (axiom-l)prove_normalize.rs:98
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-nonvar)prove_eq.rs:98prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (normalize-l)prove_eq.rs:72prove_normalize (normalize-via-assumption)prove_normalize.rs:34prove_normalize_via (axiom-l)prove_normalize.rs:98
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-nonvar)prove_eq.rs:98prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
Source location: crates/formality-rust/src/prove/prove/test/eq_assumptions.rs:33
#[test]
fn test_normalize_assoc_ty() {
test_prove(
Program::empty(),
term("{} => {for<T> if { <T as Iterator>::Item = u32 } <T as Iterator>::Item = u32}"),
)
.assert_ok(expect!["{Constraints { env: Env { variables: [], bias: Soundness, pending: [], allow_pending_outlives: false }, known_true: true, substitution: {} }}"]);
}
Proof tree
prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (implies)prove_wc.rs:44prove_wc (assumption - relation)prove_wc.rs:57prove_via (relation-axiom)prove_via.rs:41
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
Source location: crates/formality-rust/src/prove/prove/test/eq_partial_eq.rs:25
#[test]
fn eq_implies_partial_eq() {
let assumptions: Wcs = Wcs::t();
let goal: Wc = term("for<T> if {Eq(T)} PartialEq(T)");
let constraints = prove(decls(), (), assumptions, goal);
constraints.assert_ok(
expect!["{Constraints { env: Env { variables: [], bias: Soundness, pending: [], allow_pending_outlives: false }, known_true: true, substitution: {} }}"]);
}
Proof tree
prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (implies)prove_wc.rs:44prove_wc (trait implied bound)prove_wc.rs:122prove_via (predicate-congruence-axiom)prove_via.rs:32prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (assumption - predicate)prove_wc.rs:51prove_via (predicate-congruence-axiom)prove_via.rs:32prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
Source location: crates/formality-rust/src/prove/prove/test/universes.rs:37
#[test]
fn for_t_exists_u() {
let decls = Program {
crates: Arc::new(Program::program_from_items(vec![
term("trait Test<T> where {}"),
term("impl<X> Test<X> for X {}"),
])),
..Program::empty()
};
test_prove(decls, term("{} => {for<T> Test(T, T)}")).assert_ok(expect!["{Constraints { env: Env { variables: [], bias: Soundness, pending: [], allow_pending_outlives: false }, known_true: true, substitution: {} }}"]);
}
Proof tree
prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
Source location: tests/basic_tests.rs:74
#[test]
fn basic_where_clauses_pass() {
FormalityTest::new(crates![crate core {
#![feature(non_lifetime_binders)]
trait A<T> where T: B { }
trait B { }
trait WellFormed where for<T> u32: A<T> { }
impl <T> B for T {}
}])
.skip_execute()
.ok()
}
Proof tree
check_all_crates (check all prefixes)mod.rs:54for_allmod.rs:41for_allmod.rs:51check_crate (check crate)mod.rs:75for_allmod.rs:60for_allmod.rs:72check_crate_item (feature gate)mod.rs:209
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait well formed)prove_wc.rs:143for_allcombinators.rs:69prove_wf (universal variables)prove_wf.rs:30
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (trait well formed)prove_wc.rs:143for_allcombinators.rs:69prove_wf (integers and booleans)prove_wf.rs:59for_allcombinators.rs:69prove_wf (universal variables)prove_wf.rs:30
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (trait impl)mod.rs:180check_trait_impl (check_trait_impl)impls.rs:39prove_wc_list (none)prove_wc_list.rs:24prove_wc_list (some)prove_wc_list.rs:31prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
check_safety_matches (safety matches)impls.rs:79
check_drop_impl_always_applicable (not a Drop impl)impls.rs:295
check_coherence (check_coherence)coherence.rs:24for_allcoherence.rs:8for_allcoherence.rs:17for_allcoherence.rs:8for_allcoherence.rs:18overlap_check (skip_same_impl)coherence.rs:75
for_allcoherence.rs:8for_allcoherence.rs:20orphan_check (orphan_check)coherence.rs:39prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait ref is local)prove_wc.rs:149is_local_trait_ref (local trait)is_local.rs:212
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
Source location: tests/basic_tests.rs:121
fn foo() -> () where for<T> u32: A<T> { trusted }
impl <T> B for T {}
}])
p_execute()
)
}
#[test]
ifetime_binder_in_fn_where_clause_fail() {
alityTest::new(crates![crate core {
trait A<T> where T: B { }
trait B { }
fn foo() -> () where for<T> u32: A<T> { trusted }
}])
(expect_test::expect![[r#"
the rule "check crate" at (mod.rs) failed because
non lifetime binders require #![feature(non_lifetime_binders)]"#]])
}
#[test]
ifetime_binder_in_trait_impl_where_clause_pass() {
alityTest::new(crates![crate core {
#![feature(non_lifetime_binders)]
trait A<T> where T: B { }
trait B { }
impl<T> B for T where for<U> u32: A<U> { }
}])
p_execute()
)
}
#[test]
ifetime_binder_in_trait_impl_where_clause_fail() {
alityTest::new(crates![crate core {
trait A<T> where T: B { }
trait B { }
impl<T> B for T where for<U> u32: A<U> { }
}])
(expect_test::expect![[r#"
the rule "check crate" at (mod.rs) failed because
non lifetime binders require #![feature(non_lifetime_binders)]"#]])
}
#[test]
ifetime_binder_in_neg_trait_impl_where_clause_pass() {
alityTest::new(crates![crate core {
#![feature(non_lifetime_binders)]
trait A<T> where T: B { }
trait B { }
impl<T> !A<T> for u32 where for<U> u32: A<U> { }
impl <T> B for T {}
}])
p_execute()
)
}
#[test]
ifetime_binder_in_neg_trait_impl_where_clause_fail() {
alityTest::new(crates![crate core {
trait A<T> where T: B { }
trait B { }
impl<T> !A<T> for u32 where for<U> u32: A<U> { }
}])
(expect_test::expect![[r#"
the rule "check crate" at (mod.rs) failed because
non lifetime binders require #![feature(non_lifetime_binders)]"#]])
}
#[test]
ifetime_binder_in_enum_where_clause_pass() {
alityTest::new(crates![crate core {
#![feature(non_lifetime_binders)]
trait A<T> where T: B { }
trait B { }
enum E where for<U> u32: A<U> { }
impl <T> B for T {}
}])
p_execute()
)
}
#[test]
ifetime_binder_in_enum_where_clause_fail() {
alityTest::new(crates![crate core {
trait A<T> where T: B { }
trait B { }
enum E where for<U> u32: A<U> { }
}])
(expect_test::expect![[r#"
the rule "check crate" at (mod.rs) failed because
non lifetime binders require #![feature(non_lifetime_binders)]"#]])
}
#[test]
ifetime_binder_in_struct_where_clause_pass() {
alityTest::new(crates![crate core {
#![feature(non_lifetime_binders)]
trait A<T> where T: B { }
trait B { }
struct S<T> where for<U> u32: A<U> { }
impl <T> B for T {}
}])
p_execute()
)
}
#[test]
ifetime_binder_in_struct_where_clause_fail() {
alityTest::new(crates![crate core {
trait A<T> where T: B { }
trait B { }
struct S<T> where for<U> u32: A<U> { }
}])
(expect_test::expect![[r#"
the rule "check crate" at (mod.rs) failed because
non lifetime binders require #![feature(non_lifetime_binders)]"#]])
}
#[test]
ime_binder_in_where_clause_without_feature_pass() {
alityTest::new(crates![crate core {
trait A<'b> { }
impl<'b> A<'b> for u32 { }
trait WellFormed where for<'b> u32: A<'b> { }
}])
p_execute()
)
}
#[test]
_adt_variant_dup() {
alityTest::new(crates![crate Foo {
enum Bar {
Baz{},
Baz{},
}
Proof tree
check_all_crates (check all prefixes)mod.rs:54for_allmod.rs:41for_allmod.rs:51check_crate (check crate)mod.rs:75for_allmod.rs:60for_allmod.rs:72check_crate_item (feature gate)mod.rs:209
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait well formed)prove_wc.rs:143for_allcombinators.rs:69prove_wf (universal variables)prove_wf.rs:30
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (free fn)mod.rs:192check_free_fn (check free fn)fns.rs:25check_fn (check fn)fns.rs:56prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (trait well formed)prove_wc.rs:143for_allcombinators.rs:69prove_wf (integers and booleans)prove_wf.rs:59for_allcombinators.rs:69prove_wf (universal variables)prove_wf.rs:30
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_wc_list (some)prove_wc_list.rs:31prove_wc (parameter well formed)prove_wc.rs:162prove_wf (tuples)prove_wf.rs:53
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
check_fn_body (trusted fn body)fns.rs:82
for_allmod.rs:72check_crate_item (trait impl)mod.rs:180check_trait_impl (check_trait_impl)impls.rs:39prove_wc_list (none)prove_wc_list.rs:24prove_wc_list (some)prove_wc_list.rs:31prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
check_safety_matches (safety matches)impls.rs:79
check_drop_impl_always_applicable (not a Drop impl)impls.rs:295
check_coherence (check_coherence)coherence.rs:24for_allcoherence.rs:8for_allcoherence.rs:17for_allcoherence.rs:8for_allcoherence.rs:18overlap_check (skip_same_impl)coherence.rs:75
for_allcoherence.rs:8for_allcoherence.rs:20orphan_check (orphan_check)coherence.rs:39prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait ref is local)prove_wc.rs:149is_local_trait_ref (local trait)is_local.rs:212
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
Source location: tests/basic_tests.rs:149
#[test]
fn non_lifetime_binder_in_trait_impl_where_clause_pass() {
FormalityTest::new(crates![crate core {
#![feature(non_lifetime_binders)]
trait A<T> where T: B { }
trait B { }
impl<T> B for T where for<U> u32: A<U> { }
}])
.skip_execute()
.ok()
}
Proof tree
check_all_crates (check all prefixes)mod.rs:54for_allmod.rs:41for_allmod.rs:51check_crate (check crate)mod.rs:75for_allmod.rs:60for_allmod.rs:72check_crate_item (feature gate)mod.rs:209
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait well formed)prove_wc.rs:143for_allcombinators.rs:69prove_wf (universal variables)prove_wf.rs:30
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (trait impl)mod.rs:180check_trait_impl (check_trait_impl)impls.rs:39prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (trait well formed)prove_wc.rs:143for_allcombinators.rs:69prove_wf (integers and booleans)prove_wf.rs:59for_allcombinators.rs:69prove_wf (universal variables)prove_wf.rs:30
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (assumption - predicate)prove_wc.rs:51prove_via (forall)prove_via.rs:51prove_via (predicate-congruence-axiom)prove_via.rs:32prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_wc_list (some)prove_wc_list.rs:31prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (assumption - predicate)prove_wc.rs:51prove_via (forall)prove_via.rs:51prove_via (predicate-congruence-axiom)prove_via.rs:32prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
check_safety_matches (safety matches)impls.rs:79
check_drop_impl_always_applicable (not a Drop impl)impls.rs:295
check_coherence (check_coherence)coherence.rs:24for_allcoherence.rs:8for_allcoherence.rs:17for_allcoherence.rs:8for_allcoherence.rs:18overlap_check (skip_same_impl)coherence.rs:75
for_allcoherence.rs:8for_allcoherence.rs:20orphan_check (orphan_check)coherence.rs:39prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait ref is local)prove_wc.rs:149is_local_trait_ref (local trait)is_local.rs:212
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
Source location: tests/basic_tests.rs:179
#[test]
fn non_lifetime_binder_in_neg_trait_impl_where_clause_pass() {
FormalityTest::new(crates![crate core {
#![feature(non_lifetime_binders)]
trait A<T> where T: B { }
trait B { }
impl<T> !A<T> for u32 where for<U> u32: A<U> { }
impl <T> B for T {}
}])
.skip_execute()
.ok()
}
Proof tree
check_all_crates (check all prefixes)mod.rs:54for_allmod.rs:41for_allmod.rs:51check_crate (check crate)mod.rs:75for_allmod.rs:60for_allmod.rs:72check_crate_item (feature gate)mod.rs:209
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait well formed)prove_wc.rs:143for_allcombinators.rs:69prove_wf (universal variables)prove_wf.rs:30
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (neg trait impl)mod.rs:198check_neg_trait_impl (check_neg_trait_impl)impls.rs:64prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (trait well formed)prove_wc.rs:143for_allcombinators.rs:69prove_wf (integers and booleans)prove_wf.rs:59for_allcombinators.rs:69prove_wf (universal variables)prove_wf.rs:30
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_wc_list (some)prove_wc_list.rs:31prove_wc (negative impl)prove_wc.rs:106prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (assumption - predicate)prove_wc.rs:51prove_via (forall)prove_via.rs:51prove_via (predicate-congruence-axiom)prove_via.rs:32prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (trait impl)mod.rs:180check_trait_impl (check_trait_impl)impls.rs:39prove_wc_list (none)prove_wc_list.rs:24prove_wc_list (some)prove_wc_list.rs:31prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
check_safety_matches (safety matches)impls.rs:79
check_drop_impl_always_applicable (not a Drop impl)impls.rs:295
check_coherence (check_coherence)coherence.rs:24for_allcoherence.rs:8for_allcoherence.rs:17for_allcoherence.rs:8for_allcoherence.rs:18overlap_check (skip_same_impl)coherence.rs:75
for_allcoherence.rs:8for_allcoherence.rs:20orphan_check (orphan_check)coherence.rs:39prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait ref is local)prove_wc.rs:149is_local_trait_ref (local trait)is_local.rs:212
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
for_allcoherence.rs:8for_allcoherence.rs:22orphan_check_neg (orphan_check_neg)coherence.rs:59prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait ref is local)prove_wc.rs:149is_local_trait_ref (local trait)is_local.rs:212
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
Source location: tests/basic_tests.rs:209
#[test]
fn non_lifetime_binder_in_enum_where_clause_pass() {
FormalityTest::new(crates![crate core {
#![feature(non_lifetime_binders)]
trait A<T> where T: B { }
trait B { }
enum E where for<U> u32: A<U> { }
impl <T> B for T {}
}])
.skip_execute()
.ok()
}
Proof tree
check_all_crates (check all prefixes)mod.rs:54for_allmod.rs:41for_allmod.rs:51check_crate (check crate)mod.rs:75for_allmod.rs:60for_allmod.rs:72check_crate_item (feature gate)mod.rs:209
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait well formed)prove_wc.rs:143for_allcombinators.rs:69prove_wf (universal variables)prove_wf.rs:30
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (trait)mod.rs:173check_trait (check trait)traits.rs:26prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (adt)mod.rs:186check_adt (check adt)adts.rs:27prove_wc_list (some)prove_wc_list.rs:31prove_wc (forall)prove_wc.rs:38prove_wc (trait well formed)prove_wc.rs:143for_allcombinators.rs:69prove_wf (integers and booleans)prove_wf.rs:59for_allcombinators.rs:69prove_wf (universal variables)prove_wf.rs:30
prove_after (prove_after)prove_after.rs:20prove_wc_list (some)prove_wc_list.rs:31prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
for_allmod.rs:72check_crate_item (trait impl)mod.rs:180check_trait_impl (check_trait_impl)impls.rs:39prove_wc_list (none)prove_wc_list.rs:24prove_wc_list (some)prove_wc_list.rs:31prove_wc (positive impl)prove_wc.rs:89prove_wc_list (some)prove_wc_list.rs:31prove_wc (eq)prove_wc.rs:128prove_eq (symmetric)prove_eq.rs:41prove_eq (existential)prove_eq.rs:65prove_existential_var_eq (existential-universal)prove_eq.rs:143
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
check_safety_matches (safety matches)impls.rs:79
check_drop_impl_always_applicable (not a Drop impl)impls.rs:295
check_coherence (check_coherence)coherence.rs:24for_allcoherence.rs:8for_allcoherence.rs:17for_allcoherence.rs:8for_allcoherence.rs:18overlap_check (skip_same_impl)coherence.rs:75
for_allcoherence.rs:8for_allcoherence.rs:20orphan_check (orphan_check)coherence.rs:39prove_wc_list (some)prove_wc_list.rs:31prove_wc (trait ref is local)prove_wc.rs:149is_local_trait_ref (local trait)is_local.rs:212
prove_after (prove_after)prove_after.rs:20prove_wc_list (none)prove_wc_list.rs:24
Source location: tests/basic_tests.rs:239
#[test]
fn non_lifetime_binder_in_struct_where_clause_pass() {
FormalityTest::new(crates![crate core {
#![feature(non_lifetime_binders)]
trait A<T> where T: B { }
trait B { }
struct S<T> where for<U> u32: A<U> { }
impl <T> B for T {}
}])
.skip_execute()
.ok()
}
Proof trees omitted for the remaining 2 tests.
Source location: tests/basic_tests.rs:266
#[test]
fn lifetime_binder_in_where_clause_without_feature_pass() {
FormalityTest::new(crates![crate core {
trait A<'b> { }
impl<'b> A<'b> for u32 { }
trait WellFormed where for<'b> u32: A<'b> { }
}])
.skip_execute()
.ok()
}