@@ -81,6 +81,7 @@ pub struct SpecCollector<'a, 'tcx> {
8181 /// Map from functions/loops/types to their specifications.
8282 procedure_specs : FxHashMap < LocalDefId , ProcedureSpecRefs > ,
8383 loop_specs : Vec < LocalDefId > ,
84+ loop_invariants : Vec < LocalDefId > ,
8485 loop_variants : Vec < LocalDefId > ,
8586 type_specs : FxHashMap < LocalDefId , TypeSpecRefs > ,
8687 prusti_assertions : Vec < LocalDefId > ,
@@ -98,6 +99,7 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> {
9899 spec_functions : FxHashMap :: default ( ) ,
99100 procedure_specs : FxHashMap :: default ( ) ,
100101 loop_specs : vec ! [ ] ,
102+ loop_invariants : vec ! [ ] ,
101103 loop_variants : vec ! [ ] ,
102104 type_specs : FxHashMap :: default ( ) ,
103105 prusti_assertions : vec ! [ ] ,
@@ -220,7 +222,13 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> {
220222 for local_id in self . loop_specs . iter ( ) {
221223 def_spec. loop_specs . insert (
222224 local_id. to_def_id ( ) ,
223- typed:: LoopSpecification :: Invariant ( * local_id) ,
225+ typed:: LoopSpecification :: BodyInvariant ( * local_id) ,
226+ ) ;
227+ }
228+ for local_id in self . loop_invariants . iter ( ) {
229+ def_spec. loop_specs . insert (
230+ local_id. to_def_id ( ) ,
231+ typed:: LoopSpecification :: LoopInvariant ( * local_id) ,
224232 ) ;
225233 }
226234 for local_id in self . loop_variants . iter ( ) {
@@ -487,6 +495,9 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> {
487495 if has_prusti_attr ( attrs, "loop_body_invariant_spec" ) {
488496 self . loop_specs . push ( local_id) ;
489497 }
498+ if has_prusti_attr ( attrs, "loop_invariant_spec" ) {
499+ self . loop_invariants . push ( local_id) ;
500+ }
490501 if has_prusti_attr ( attrs, "loop_body_variant_spec" ) {
491502 self . loop_variants . push ( local_id) ;
492503 }
0 commit comments