From fe7949c350bb3c5e2b9990ab3594b256194c3f0b Mon Sep 17 00:00:00 2001 From: Sidney Congard Date: Mon, 25 Jul 2022 14:22:52 +0200 Subject: Apply minor changes from PR comments --- src/FunsAnalysis.ml | 9 +-------- src/LlbcAst.ml | 8 ++++---- src/PureToExtract.ml | 4 ++-- src/PureTypeCheck.ml | 7 ++++++- src/SymbolicToPure.ml | 12 ++++++++++-- 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/FunsAnalysis.ml b/src/FunsAnalysis.ml index 034575c0..427175de 100644 --- a/src/FunsAnalysis.ml +++ b/src/FunsAnalysis.ml @@ -56,12 +56,6 @@ let analyze_module (m : llbc_module) (funs_map : fun_decl FunDeclId.Map.t) inherit [_] iter_statement as super method may_fail b = - (* The fail flag is disabled for globals : the global body is - * normalised into its declaration, which is always successful. - * (we check that it is successful in the extracted code: if it is - * not, it leads to a type-checking error in the generated files) - *) - if f.is_global_body then () else can_fail := !can_fail || b method! visit_Assert env a = @@ -104,11 +98,10 @@ let analyze_module (m : llbc_module) (funs_map : fun_decl FunDeclId.Map.t) (* Opaque function *) obj#may_fail true; stateful := use_state - | Some body -> obj#visit_statement () body.body); + | Some body -> obj#visit_statement () body.body) (* We ignore on purpose functions that cannot fail: the result of the analysis * is not used yet to adjust the translation so that the functions which * syntactically can't fail don't use an error monad. *) - can_fail := not f.is_global_body in List.iter visit_fun d; { can_fail = !can_fail; stateful = !stateful; divergent = !divergent } diff --git a/src/LlbcAst.ml b/src/LlbcAst.ml index aa9b0665..94566f9b 100644 --- a/src/LlbcAst.ml +++ b/src/LlbcAst.ml @@ -37,7 +37,7 @@ type assumed_fun_id = type fun_id = Regular of FunDeclId.id | Assumed of assumed_fun_id [@@deriving show, ord] -type assign_global = { +type global_assignment = { dst : VarId.id; global : GlobalDeclId.id; } @@ -84,7 +84,7 @@ class ['self] iter_statement_base = object (_self : 'self) inherit [_] VisitorsRuntime.iter - method visit_assign_global : 'env -> assign_global -> unit = fun _ _ -> () + method visit_global_assignment : 'env -> global_assignment -> unit = fun _ _ -> () method visit_place : 'env -> place -> unit = fun _ _ -> () @@ -108,7 +108,7 @@ class ['self] map_statement_base = object (_self : 'self) inherit [_] VisitorsRuntime.map - method visit_assign_global : 'env -> assign_global -> assign_global = fun _ x -> x + method visit_global_assignment : 'env -> global_assignment -> global_assignment = fun _ x -> x method visit_place : 'env -> place -> place = fun _ x -> x @@ -131,7 +131,7 @@ class ['self] map_statement_base = type statement = | Assign of place * rvalue - | AssignGlobal of assign_global + | AssignGlobal of global_assignment | FakeRead of place | SetDiscriminant of place * VariantId.id | Drop of place diff --git a/src/PureToExtract.ml b/src/PureToExtract.ml index 7a10bb6b..2d76f348 100644 --- a/src/PureToExtract.ml +++ b/src/PureToExtract.ml @@ -671,7 +671,7 @@ let compute_type_decl_name (fmt : formatter) (def : type_decl) : string = TODO: move all those helpers. *) let default_fun_suffix - (is_global : bool) + (is_global_body : bool) (num_region_groups : int) (rg : region_group_info option) ((keep_fwd, num_backs) : bool * int) @@ -691,7 +691,7 @@ let default_fun_suffix we could not add the "_fwd" suffix) to prevent name clashes between definitions (in particular between type and function definitions). *) - if is_global then "_c" else + if is_global_body then "_body" else match rg with | None -> "_fwd" | Some rg -> diff --git a/src/PureTypeCheck.ml b/src/PureTypeCheck.ml index 90b9ab09..c63814eb 100644 --- a/src/PureTypeCheck.ml +++ b/src/PureTypeCheck.ml @@ -40,6 +40,7 @@ let get_adt_field_types (type_decls : type_decl TypeDeclId.Map.t) type tc_ctx = { type_decls : type_decl TypeDeclId.Map.t; (** The type declarations *) + global_decls : A.global_decl A.GlobalDeclId.Map.t; (** The global declarations *) env : ty VarId.Map.t; (** Environment from variables to types *) } @@ -111,7 +112,11 @@ let rec check_texpression (ctx : tc_ctx) (e : texpression) : unit = check_texpression ctx body | Qualif qualif -> ( match qualif.id with - | Func _ | Global _ -> () (* TODO *) + | Func _ -> () (* TODO *) + | Global id -> + let global = A.GlobalDeclId.Map.find id ctx.global_decls in + (* TODO: something like assert (global.ty = e.ty) *) + failwith "PureTypeCheck.ml:118" | Proj { adt_id = proj_adt_id; field_id } -> (* Note we can only project fields of structures (not enumerations) *) (* Deconstruct the projector type *) diff --git a/src/SymbolicToPure.ml b/src/SymbolicToPure.ml index 7d9e2906..83cce3e9 100644 --- a/src/SymbolicToPure.ml +++ b/src/SymbolicToPure.ml @@ -127,13 +127,21 @@ type bs_ctx = { let type_check_pattern (ctx : bs_ctx) (v : typed_pattern) : unit = let env = VarId.Map.empty in - let ctx = { PureTypeCheck.type_decls = ctx.type_context.type_decls; env } in + let ctx = { + PureTypeCheck.type_decls = ctx.type_context.type_decls; + global_decls = ctx.global_context.llbc_global_decls; + env + } in let _ = PureTypeCheck.check_typed_pattern ctx v in () let type_check_texpression (ctx : bs_ctx) (e : texpression) : unit = let env = VarId.Map.empty in - let ctx = { PureTypeCheck.type_decls = ctx.type_context.type_decls; env } in + let ctx = { + PureTypeCheck.type_decls = ctx.type_context.type_decls; + global_decls = ctx.global_context.llbc_global_decls; + env + } in PureTypeCheck.check_texpression ctx e (* TODO: move *) -- cgit v1.2.3