Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support broadcast groups in traits #1442

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions dependencies/syn/src/gen/clone.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions dependencies/syn/src/gen/debug.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions dependencies/syn/src/gen/eq.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions dependencies/syn/src/gen/fold.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion dependencies/syn/src/gen/hash.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions dependencies/syn/src/gen/visit.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions dependencies/syn/src/gen/visit_mut.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 7 additions & 1 deletion dependencies/syn/src/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,9 @@ ast_enum_of_structs! {
/// A macro invocation within the definition of a trait.
Macro(TraitItemMacro),

/// A broadcast group
BroadcastGroup(ItemBroadcastGroup),

/// Tokens within the definition of a trait not interpreted by Syn.
Verbatim(TokenStream),

Expand Down Expand Up @@ -2531,7 +2534,9 @@ pub(crate) mod parsing {

let lookahead = ahead.lookahead1();
let allow_safe = false;
let mut item = if lookahead.peek(Token![fn]) || peek_signature(&ahead, allow_safe) {
let mut item = if lookahead.peek(Token![broadcast]) && input.peek2(Token![group]) {
input.parse().map(TraitItem::BroadcastGroup)
} else if lookahead.peek(Token![fn]) || peek_signature(&ahead, allow_safe) {
input.parse().map(TraitItem::Fn)
} else if lookahead.peek(Token![const]) {
let publish = input.parse()?;
Expand Down Expand Up @@ -2602,6 +2607,7 @@ pub(crate) mod parsing {
TraitItem::Fn(item) => &mut item.attrs,
TraitItem::Type(item) => &mut item.attrs,
TraitItem::Macro(item) => &mut item.attrs,
TraitItem::BroadcastGroup(item) => &mut item.attrs,
TraitItem::Verbatim(_) => unreachable!(),
};
attrs.append(item_attrs);
Expand Down
5 changes: 5 additions & 0 deletions dependencies/syn/syn.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions dependencies/syn/tests/debug/gen.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions source/builtin_macros/src/syntax.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1566,6 +1566,7 @@ impl Visitor {
fn visit_trait_items_prefilter(&mut self, items: &mut Vec<TraitItem>) {
if self.rustdoc {
for trait_item in items.iter_mut() {
let span = trait_item.span().clone();
match trait_item {
TraitItem::Fn(trait_item_method) => {
crate::rustdoc::process_trait_item_method(trait_item_method);
Expand All @@ -1581,6 +1582,7 @@ impl Visitor {
FnMode::Spec(_) | FnMode::SpecChecked(_) | FnMode::Proof(_) => false,
FnMode::Exec(_) | FnMode::Default => true,
},
TraitItem::BroadcastGroup(_) => false,
_ => true,
});
}
Expand All @@ -1591,6 +1593,7 @@ impl Visitor {
TraitItem::Fn(ref mut fun) => {
split_trait_method(&mut spec_items, fun, erase_ghost);
}
TraitItem::BroadcastGroup(item_broadcast_group) => {}
_ => {}
}
}
Expand Down Expand Up @@ -3612,6 +3615,17 @@ impl VisitMut for Visitor {
fn visit_item_trait_mut(&mut self, tr: &mut ItemTrait) {
tr.attrs.push(mk_verus_attr(tr.span(), quote! { verus_macro }));
self.visit_trait_items_prefilter(&mut tr.items);
for trait_item in &mut tr.items {
let span = trait_item.span();
match trait_item {
TraitItem::BroadcastGroup(item_broadcast_group) => {
*trait_item = TraitItem::Verbatim(
self.handle_broadcast_group(item_broadcast_group, span),
);
}
_ => (),
}
}
self.filter_attrs(&mut tr.attrs);
syn_verus::visit_mut::visit_item_trait_mut(self, tr);
}
Expand Down
23 changes: 23 additions & 0 deletions source/rust_verify_test/tests/broadcast_forall.rs
Original file line number Diff line number Diff line change
Expand Up @@ -627,3 +627,26 @@ test_verify_one_file! {
}
} => Err(err) => assert_vir_error_msg(err, "lemma_foo is not a broadcast proof fn")
}

test_verify_one_file! {
#[test] #[ignore] broadcast_group_in_trait verus_code! {
trait ATrait {
spec fn foo(i: int) -> bool;

broadcast proof fn lemma_foo(i: int)
ensures Self::foo(i)
{}

broadcast group group_foo {
// TODO see if we can auto-replace `Self` with the trait name
ATrait::lemma_foo,
}
}

proof fn lemma_bar<A: ATrait>() {
// broadcast use A::group_foo;

// assert(A::foo(0));
}
} => Ok(())
}