verus-lang / verus

Verified Rust for low-level systems code
MIT License
1.06k stars 58 forks source link

Broadcast not in scope during loop #1166

Open jaylorch opened 2 weeks ago

jaylorch commented 2 weeks ago

The following code fails verification because the broadcast use is somehow not in scope during the loop.

pub spec fn map_contains_key_opaque<Key, Value>(m: Map<Key, Value>, k: Key) -> bool;

pub broadcast proof fn axiom_map_contains_key_opaque<Key, Value>(m: Map<Key, Value>, k: Key)
    ensures
        #[trigger] map_contains_key_opaque::<Key, Value>(m, k) <==> m.contains_key(k)
{
    admit();
}

fn test_axiom(m: Map<u64, u32>, k: u64)
    requires
        map_contains_key_opaque(m, k)
{
    broadcast use axiom_map_contains_key_opaque;
    for i in 0..10
        invariant
            map_contains_key_opaque(m, k)
    {
        assert(m.contains_key(k)) by {
//            broadcast use axiom_map_contains_key_opaque; // <== needs this to verify
        }
    }
}
utaal commented 2 weeks ago

@Chris-Hawblitzel I can also take a look at this if you'd like.