Skip to content

Commit f7ecc0c

Browse files
authored
Merge pull request #1351 from cryspen/fixes-assume
fix(hax-lib/assume): fixes assume and assert_prop
2 parents 032cf32 + f70358b commit f7ecc0c

File tree

5 files changed

+45
-9
lines changed

5 files changed

+45
-9
lines changed

engine/lib/phases/phase_specialize.ml

+22-1
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,25 @@ module Make (F : Features.T) =
291291

292292
module Attrs = Attr_payloads.Make (F) (Error)
293293

294+
(** Drop `from` or `into` when they are of type `T -> T`, for any `T`. *)
295+
let remove_from_into_identity =
296+
object
297+
inherit [_] Visitors.map as super
298+
299+
method! visit_expr () e =
300+
let e =
301+
match e.e with
302+
| App { f = { e = GlobalVar f; _ }; args = [ x ]; _ }
303+
when [%equal: ty] e.typ x.typ
304+
&& (Ast.Global_ident.eq_name Core__convert__Into__into f
305+
|| Ast.Global_ident.eq_name Core__convert__From__from f
306+
) ->
307+
x
308+
| _ -> e
309+
in
310+
super#visit_expr () e
311+
end
312+
294313
let visitor =
295314
object (self)
296315
inherit [_] Visitors.map as super
@@ -354,5 +373,7 @@ module Make (F : Features.T) =
354373
end
355374

356375
let ditems (l : A.item list) : B.item list =
357-
List.map ~f:(visitor#visit_item ()) l
376+
List.map
377+
~f:(visitor#visit_item () >> remove_from_into_identity#visit_item ())
378+
l
358379
end)

hax-lib/macros/src/implementation.rs

+10-6
Original file line numberDiff line numberDiff line change
@@ -817,37 +817,41 @@ macro_rules! make_quoting_proc_macro {
817817
#[proc_macro]
818818
pub fn [<$backend _expr>](payload: pm::TokenStream) -> pm::TokenStream {
819819
let ts: TokenStream = quote::expression(quote::InlineExprType::Unit, payload).into();
820-
quote!{
820+
quote!{{
821821
#[cfg([< hax_backend_ $backend >])]
822822
{
823823
#ts
824824
}
825-
}.into()
825+
}}.into()
826826
}
827827

828828
#[doc = concat!("The `Prop` version of `", stringify!($backend), "_expr`.")]
829829
#[proc_macro]
830830
pub fn [<$backend _prop_expr>](payload: pm::TokenStream) -> pm::TokenStream {
831831
let ts: TokenStream = quote::expression(quote::InlineExprType::Prop, payload).into();
832-
quote!{
832+
quote!{{
833833
#[cfg([< hax_backend_ $backend >])]
834834
{
835835
#ts
836836
}
837-
}.into()
837+
#[cfg(not([< hax_backend_ $backend >]))]
838+
{
839+
::hax_lib::Prop::from_bool(true)
840+
}
841+
}}.into()
838842
}
839843

840844
#[doc = concat!("The unsafe (because polymorphic: even computationally relevant code can be inlined!) version of `", stringify!($backend), "_expr`.")]
841845
#[proc_macro]
842846
#[doc(hidden)]
843847
pub fn [<$backend _unsafe_expr>](payload: pm::TokenStream) -> pm::TokenStream {
844848
let ts: TokenStream = quote::expression(quote::InlineExprType::Anything, payload).into();
845-
quote!{
849+
quote!{{
846850
#[cfg([< hax_backend_ $backend >])]
847851
{
848852
#ts
849853
}
850-
}.into()
854+
}}.into()
851855
}
852856

853857
make_quoting_item_proc_macro!($backend, [< $backend _before >], ItemQuotePosition::Before, [< hax_backend_ $backend >]);

hax-lib/src/implementation.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ macro_rules! assert_prop {
7373
{
7474
#[cfg(hax)]
7575
{
76-
$crate::assert_prop($crate::Prop::from($($arg)*));
76+
$crate::assert_prop(::hax_lib::Prop::from($($arg)*));
7777
}
7878
}
7979
};
@@ -97,7 +97,7 @@ pub fn assume(_formula: Prop) {}
9797
#[macro_export]
9898
macro_rules! assume {
9999
($formula:expr) => {
100-
$crate::assume(Prop::from($formula))
100+
$crate::assume(::hax_lib::Prop::from($formula))
101101
};
102102
}
103103

test-harness/src/snapshots/toolchain__attributes into-fstar.snap

+6
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,12 @@ type t_Foo = {
576576
f_z:f_z: u32{b2t (((f_y +! f_x <: u32) +! f_z <: u32) >. mk_u32 3 <: bool)}
577577
}
578578

579+
let props (_: Prims.unit) : Prims.unit =
580+
let _:Prims.unit = Hax_lib.v_assume True in
581+
let _:Prims.unit = Hax_lib.assert_prop True in
582+
let _:Prims.unit = () in
583+
()
584+
579585
let inlined_code__v_V: u8 = mk_u8 12
580586

581587
let before_inlined_code = "example before"

tests/attributes/src/lib.rs

+5
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ impl Foo {
7575
fn h(&self) {}
7676
}
7777

78+
fn props() {
79+
hax_lib::assume!(hax_lib::fstar::prop!("True"));
80+
hax_lib::assert_prop!(hax_lib::fstar::prop!("True"));
81+
}
82+
7883
#[hax::attributes]
7984
mod refined_arithmetic {
8085
use core::ops::{Add, Mul};

0 commit comments

Comments
 (0)