From c9c5d089e46d7a9e3cf998ab9c6f9bd69913da5e Mon Sep 17 00:00:00 2001 From: Thibaut Benjamin <thibaut.benjamin@gmail.com> Date: Thu, 9 Jun 2022 09:54:45 +0200 Subject: [PATCH] [e-acsl] typing specific types moved to analyses_types --- .../e-acsl/src/analyses/analyses_datatype.ml | 54 ++++++++++++++++ .../e-acsl/src/analyses/analyses_datatype.mli | 3 + .../e-acsl/src/analyses/analyses_types.mli | 9 ++- src/plugins/e-acsl/src/analyses/typing.ml | 62 +------------------ src/plugins/e-acsl/src/analyses/typing.mli | 11 +--- src/plugins/e-acsl/src/code_generator/gmp.ml | 36 +++++------ src/plugins/e-acsl/src/code_generator/libc.ml | 14 ++--- .../src/code_generator/logic_functions.ml | 13 ++-- .../e-acsl/src/code_generator/loops.ml | 6 +- .../src/code_generator/memory_translate.ml | 8 +-- .../src/code_generator/translate_ats.ml | 18 +++--- .../src/code_generator/translate_terms.ml | 21 +++---- .../src/code_generator/translate_utils.ml | 22 +++---- .../src/code_generator/translate_utils.mli | 3 +- 14 files changed, 131 insertions(+), 149 deletions(-) diff --git a/src/plugins/e-acsl/src/analyses/analyses_datatype.ml b/src/plugins/e-acsl/src/analyses/analyses_datatype.ml index 0a28d7a5467..449c92e448b 100644 --- a/src/plugins/e-acsl/src/analyses/analyses_datatype.ml +++ b/src/plugins/e-acsl/src/analyses/analyses_datatype.ml @@ -429,3 +429,57 @@ module LF_env let replace li args_ival ival = LFProf.Hashtbl.replace tbl (li, args_ival) ival end + +module Number_ty = + Datatype.Make_with_collections + (struct + type t = number_ty + let name = "E_ACSL.Typing.t" + let reprs = [ Gmpz; Real; Nan; C_integer IInt ] + include Datatype.Undefined + + let compare ty1 ty2 = + if ty1 == ty2 then 0 + else + match ty1, ty2 with + | C_integer i1, C_integer i2 -> + if i1 = i2 then 0 + else if Cil.intTypeIncluded i1 i2 then -1 else 1 + | C_float f1, C_float f2 -> + Stdlib.compare f1 f2 + | (C_integer _ | C_float _ | Gmpz | Rational | Real), Nan + | (C_integer _ | C_float _ | Gmpz | Rational ), Real + | (C_integer _ | C_float _ | Gmpz), Rational + | (C_integer _ | C_float _), Gmpz + | C_integer _, C_float _ -> + -1 + | (C_float _ | Gmpz | Rational | Real | Nan), C_integer _ + | (Gmpz | Rational | Real | Nan), C_float _ + | (Rational | Real | Nan), Gmpz + | (Real | Nan), Rational + | Nan, Real -> + 1 + | Gmpz, Gmpz + | Rational, Rational + | Real, Real + | Nan, Nan -> + assert false + + let equal = Datatype.from_compare + + let hash = function + | C_integer ik -> 7 * Hashtbl.hash ik + | C_float fk -> 97 * Hashtbl.hash fk + | Gmpz -> 787 + | Rational -> 907 + | Real -> 1011 + | Nan -> 1277 + + let pretty fmt = function + | C_integer k -> Printer.pp_ikind fmt k + | C_float k -> Printer.pp_fkind fmt k + | Gmpz -> Format.pp_print_string fmt "Gmpz" + | Rational -> Format.pp_print_string fmt "Rational" + | Real -> Format.pp_print_string fmt "Real" + | Nan -> Format.pp_print_string fmt "Nan" + end) diff --git a/src/plugins/e-acsl/src/analyses/analyses_datatype.mli b/src/plugins/e-acsl/src/analyses/analyses_datatype.mli index 48feedf5ee0..19a8ffa8033 100644 --- a/src/plugins/e-acsl/src/analyses/analyses_datatype.mli +++ b/src/plugins/e-acsl/src/analyses/analyses_datatype.mli @@ -101,3 +101,6 @@ module LF_env : sig val replace : logic_info -> Profile.t -> ival -> unit end + +module Number_ty: Datatype.S_with_collections + with type t = number_ty diff --git a/src/plugins/e-acsl/src/analyses/analyses_types.mli b/src/plugins/e-acsl/src/analyses/analyses_types.mli index 148dff16a51..01fc71a0b64 100644 --- a/src/plugins/e-acsl/src/analyses/analyses_types.mli +++ b/src/plugins/e-acsl/src/analyses/analyses_types.mli @@ -68,10 +68,17 @@ type annotation_kind = | Variant | RTE - type ival = | Ival of Ival.t | Float of fkind * float option (* a float constant, if any *) | Rational | Real | Nan + +type number_ty = + | C_integer of ikind + | C_float of fkind + | Gmpz + | Rational + | Real + | Nan diff --git a/src/plugins/e-acsl/src/analyses/typing.ml b/src/plugins/e-acsl/src/analyses/typing.ml index 038254859b1..954ca8c4c84 100644 --- a/src/plugins/e-acsl/src/analyses/typing.ml +++ b/src/plugins/e-acsl/src/analyses/typing.ml @@ -43,13 +43,7 @@ let pending_typing : (unit -> unit) Stack.t = Stack.create () (** Datatype and constructor *) (******************************************************************************) -type number_ty = - | C_integer of ikind - | C_float of fkind - | Gmpz - | Rational - | Real - | Nan +module D = Number_ty let ikind ik = C_integer ik let c_int = ikind IInt @@ -58,60 +52,6 @@ let fkind fk = C_float fk let rational = Rational let nan = Nan -module D = - Datatype.Make_with_collections - (struct - type t = number_ty - let name = "E_ACSL.Typing.t" - let reprs = [ Gmpz; Real; Nan; c_int ] - include Datatype.Undefined - - let compare ty1 ty2 = - if ty1 == ty2 then 0 - else - match ty1, ty2 with - | C_integer i1, C_integer i2 -> - if i1 = i2 then 0 - else if Cil.intTypeIncluded i1 i2 then -1 else 1 - | C_float f1, C_float f2 -> - Stdlib.compare f1 f2 - | (C_integer _ | C_float _ | Gmpz | Rational | Real), Nan - | (C_integer _ | C_float _ | Gmpz | Rational ), Real - | (C_integer _ | C_float _ | Gmpz), Rational - | (C_integer _ | C_float _), Gmpz - | C_integer _, C_float _ -> - -1 - | (C_float _ | Gmpz | Rational | Real | Nan), C_integer _ - | (Gmpz | Rational | Real | Nan), C_float _ - | (Rational | Real | Nan), Gmpz - | (Real | Nan), Rational - | Nan, Real -> - 1 - | Gmpz, Gmpz - | Rational, Rational - | Real, Real - | Nan, Nan -> - assert false - - let equal = Datatype.from_compare - - let hash = function - | C_integer ik -> 7 * Hashtbl.hash ik - | C_float fk -> 97 * Hashtbl.hash fk - | Gmpz -> 787 - | Rational -> 907 - | Real -> 1011 - | Nan -> 1277 - - let pretty fmt = function - | C_integer k -> Printer.pp_ikind fmt k - | C_float k -> Printer.pp_fkind fmt k - | Gmpz -> Format.pp_print_string fmt "Gmpz" - | Rational -> Format.pp_print_string fmt "Rational" - | Real -> Format.pp_print_string fmt "Real" - | Nan -> Format.pp_print_string fmt "Nan" - end) - (******************************************************************************) (** Basic operations *) (******************************************************************************) diff --git a/src/plugins/e-acsl/src/analyses/typing.mli b/src/plugins/e-acsl/src/analyses/typing.mli index a9be9966bbb..2fbf5e238a5 100644 --- a/src/plugins/e-acsl/src/analyses/typing.mli +++ b/src/plugins/e-acsl/src/analyses/typing.mli @@ -45,22 +45,13 @@ safely be computed in [int]: its result belongs to [[-2;4]]. *) open Cil_types +open Analyses_types open Analyses_datatype (******************************************************************************) (** {2 Datatypes} *) (******************************************************************************) -(** Possible types infered by the system. *) - -type number_ty = private - | C_integer of ikind - | C_float of fkind - | Gmpz - | Rational - | Real - | Nan - (** {3 Smart constructors} *) val c_int: number_ty diff --git a/src/plugins/e-acsl/src/code_generator/gmp.ml b/src/plugins/e-acsl/src/code_generator/gmp.ml index b2eec285b37..efc72c375b0 100644 --- a/src/plugins/e-acsl/src/code_generator/gmp.ml +++ b/src/plugins/e-acsl/src/code_generator/gmp.ml @@ -21,6 +21,7 @@ (**************************************************************************) open Cil_types +open Analyses_types module Error = Translation_error (**************************************************************************) @@ -70,31 +71,24 @@ let get_set_suffix_and_arg res_ty e = end in match (exp_number_ty, res_number_ty) with - | Typing.Gmpz, Typing.Gmpz | Typing.Rational, Typing.Rational -> - "", [ e ] - | Typing.Gmpz, Typing.Rational -> - "_z", [ e ] - | Typing.Rational, Typing.Gmpz -> - "_q", [ e ] - | Typing.C_integer IChar, _ -> + | Gmpz, Gmpz | Rational, Rational -> "", [ e ] + | Gmpz, Rational -> "_z", [ e ] + | Rational, Gmpz -> "_q", [ e ] + | C_integer IChar, _ -> (if Cil.theMachine.Cil.theMachine.char_is_unsigned then "_ui" else "_si"), args_uisi e - | Typing.C_integer (IBool | IUChar | IUInt | IUShort | IULong), _ -> + | C_integer (IBool | IUChar | IUInt | IUShort | IULong), _ -> "_ui", args_uisi e - | Typing.C_integer (ISChar | IShort | IInt | ILong), _ -> - "_si", args_uisi e - | Typing.C_integer (ILongLong | IULongLong as ikind), _ -> - raise (Longlong ikind) - | Typing.C_float (FDouble | FFloat), _ -> - (* FFloat is a strict subset of FDouble (modulo exceptional numbers) - Hence, calling [set_d] for both of them is sound. - HOWEVER: the machdep MUST NOT be vulnerable to double rounding - [TODO] check the statement above *) - "_d", [ e ] - | Typing.C_float FLongDouble, _ -> - Error.not_yet "creating gmp from long double" - | Typing.Gmpz, _ | Typing.Rational, _ | Typing.Real, _ | Typing.Nan, _ -> ( + | C_integer (ISChar | IShort | IInt | ILong), _ -> "_si", args_uisi e + | C_integer (ILongLong | IULongLong as ikind), _ -> raise (Longlong ikind) + | C_float (FDouble | FFloat), _ -> "_d", [ e ] + (* FFloat is a strict subset of FDouble (modulo exceptional numbers) + Hence, calling [set_d] for both of them is sound. + HOWEVER: the machdep MUST NOT be vulnerable to double rounding + [TODO] check the statement above *) + | C_float FLongDouble, _ -> Error.not_yet "creating gmp from long double" + | Gmpz, _ | Rational, _ | Real, _ | Nan, _ -> ( match Cil.unrollType ty with | TPtr(TInt(IChar, _), _) -> "_str", diff --git a/src/plugins/e-acsl/src/code_generator/libc.ml b/src/plugins/e-acsl/src/code_generator/libc.ml index 43f43ce4b77..9738f961d1d 100644 --- a/src/plugins/e-acsl/src/code_generator/libc.ml +++ b/src/plugins/e-acsl/src/code_generator/libc.ml @@ -190,7 +190,7 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = let logic_env = Env.Logic_env.get env in Typing.preprocess_term ~use_gmp_opt:false ~logic_env t; match Typing.get_number_ty ~logic_env t with - | Typing.Gmpz -> + | Gmpz -> let e, _, env = Translate_utils.gmp_to_sizet ~adata:Assert.no_data @@ -202,7 +202,7 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = t in e, env - | Typing.(C_integer _ | C_float _) as nty -> + | C_integer _ | C_float _ as nty -> (* We know that [t] can be translated to a C type, so we start with that *) let e, _, env = Translate_terms.to_exp ~adata:Assert.no_data kf env t in (* Then we can check if the expression will fit in a [size_t] *) @@ -211,9 +211,8 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = let check_lower_bound, check_upper_bound = let lower, upper = match nty with - | Typing.C_integer t_kind -> - check_integer_bounds ~from:t_kind sizet_kind - | Typing.C_float _ -> true, true + | C_integer t_kind -> check_integer_bounds ~from:t_kind sizet_kind + | C_float _ -> true, true | _ -> assert false in lower && check_lower_bound, upper @@ -285,9 +284,8 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = List.rev (assigns :: stmts)) in e, env - | Typing.(Rational | Real) -> - Env.not_yet env "cast of rational or real to size_t" - | Typing.Nan -> + | Rational | Real -> Env.not_yet env "cast of rational or real to size_t" + | Nan -> Options.fatal "Trying to translate a term that is not an integer or a C type: %a" Printer.pp_term t diff --git a/src/plugins/e-acsl/src/code_generator/logic_functions.ml b/src/plugins/e-acsl/src/code_generator/logic_functions.ml index bd64174a3f0..331ec21a4ea 100644 --- a/src/plugins/e-acsl/src/code_generator/logic_functions.ml +++ b/src/plugins/e-acsl/src/code_generator/logic_functions.ml @@ -22,6 +22,7 @@ open Cil_types open Cil_datatype +open Analyses_types open Analyses_datatype module Error = Translation_error @@ -129,16 +130,16 @@ let generate_kf ~loc fname env ret_ty params_ty params_ival li = List.fold_right2 (fun lvi pty (params, params_ty) -> let ty = match pty with - | Typing.Gmpz -> + | Gmpz -> (* GMP's integer are arrays: consider them as pointers in function's parameters *) Gmp_types.Z.t_as_ptr () - | Typing.C_integer ik -> TInt(ik, []) - | Typing.C_float ik -> TFloat(ik, []) + | C_integer ik -> TInt(ik, []) + | C_float ik -> TFloat(ik, []) (* for the time being, no reals but rationals instead *) - | Typing.Rational -> Gmp_types.Q.t () - | Typing.Real -> Error.not_yet "real number" - | Typing.Nan -> Typing.typ_of_lty lvi.lv_type + | Rational -> Gmp_types.Q.t () + | Real -> Error.not_yet "real number" + | Nan -> Typing.typ_of_lty lvi.lv_type in (* build the formals: cannot use [Cil.makeFormal] since the function does not exist yet *) diff --git a/src/plugins/e-acsl/src/code_generator/loops.ml b/src/plugins/e-acsl/src/code_generator/loops.ml index f7f52b781ff..0f25543b66d 100644 --- a/src/plugins/e-acsl/src/code_generator/loops.ml +++ b/src/plugins/e-acsl/src/code_generator/loops.ml @@ -309,9 +309,9 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars = let var_x, x, env = Env.Logic_binding.add ~ty env kf logic_x in let lv_x = var var_x in let env = match ctx with - | Typing.C_integer _ -> env - | Typing.Gmpz -> Env.add_stmt env (Gmp.init ~loc x) - | Typing.(C_float _ | Rational | Real | Nan) -> assert false + | C_integer _ -> env + | Gmpz -> Env.add_stmt env (Gmp.init ~loc x) + | C_float _ | Rational | Real | Nan -> assert false in (* build the inner loops and loop body *) let body, env = diff --git a/src/plugins/e-acsl/src/code_generator/memory_translate.ml b/src/plugins/e-acsl/src/code_generator/memory_translate.ml index edfcedde465..db07104aa2d 100644 --- a/src/plugins/e-acsl/src/code_generator/memory_translate.ml +++ b/src/plugins/e-acsl/src/code_generator/memory_translate.ml @@ -269,7 +269,7 @@ let range_to_ptr_and_size ~adata ~loc kf env ptr r p = Typing.preprocess_term ~use_gmp_opt:false ~logic_env size_term; let size, adata, env = match Typing.get_number_ty size_term ~logic_env with - | Typing.Gmpz -> + | Gmpz -> (* Start by translating [size_term] to an expression so that the full term with [\let] is not passed around. *) let size_e, adata, env = !term_to_exp_ref ~adata kf env size_term in @@ -283,10 +283,8 @@ let range_to_ptr_and_size ~adata ~loc kf env ptr r p = "translation to GMP code should always return a C variable" in gmp_to_sizet ~adata ~loc ~pp:size_term kf env cvar_term p - | Typing.(C_integer _ | C_float _) -> - !term_to_exp_ref ~adata kf env size_term - | Typing.(Rational | Real | Nan) -> - assert false + | C_integer _ | C_float _ -> !term_to_exp_ref ~adata kf env size_term + | Rational | Real | Nan -> assert false in ptr, size, adata, env diff --git a/src/plugins/e-acsl/src/code_generator/translate_ats.ml b/src/plugins/e-acsl/src/code_generator/translate_ats.ml index 718ff8816a1..cf14ab17aa8 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_ats.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_ats.ml @@ -330,11 +330,11 @@ let pretranslate_to_exp_with_lscope ~loc ~lscope kf env pot = Cil.intType | PoT_term t -> begin match Typing.get_number_ty ~logic_env t with - | Typing.(C_integer _ | C_float _ | Nan) -> + | C_integer _ | C_float _ | Nan -> Typing.get_typ ~logic_env t - | Typing.(Rational | Real) -> + | Rational | Real -> Error.not_yet "\\at on purely logic variables and over real type" - | Typing.Gmpz -> + | Gmpz -> Error.not_yet "\\at on purely logic variables and over gmp type" end in @@ -357,7 +357,7 @@ let pretranslate_to_exp_with_lscope ~loc ~lscope kf env pot = in Typing.preprocess_term ~use_gmp_opt:false ~logic_env t_size; let malloc_stmt = match Typing.get_number_ty ~logic_env t_size with - | Typing.C_integer IInt -> + | C_integer IInt -> let e_size, _, _ = term_to_exp ~adata:Assert.no_data kf env t_size in @@ -369,11 +369,11 @@ let pretranslate_to_exp_with_lscope ~loc ~lscope kf env pot = [ e_size ] in malloc_stmt - | Typing.(C_integer _ | C_float _ | Gmpz) -> + | C_integer _ | C_float _ | Gmpz -> Error.not_yet "\\at on purely logic variables that needs to allocate \ too much memory (bigger than int_max bytes)" - | Typing.(Rational | Real | Nan) -> + | Rational | Real | Nan -> Error.not_yet "quantification over non-integer type" in let free_stmt = Smart_stmt.call ~loc "free" [e] in @@ -411,7 +411,7 @@ let pretranslate_to_exp_with_lscope ~loc ~lscope kf env pot = [ Smart_stmt.block_stmt block ], env | PoT_term t -> begin match Typing.get_number_ty ~logic_env t with - | Typing.(C_integer _ | C_float _ | Nan) -> + | C_integer _ | C_float _ | Nan -> let env = Env.push env in let lval, env = lval_at_index ~loc kf env (e_at, t_index) in let e, _, env = term_to_exp kf env t in @@ -425,9 +425,9 @@ let pretranslate_to_exp_with_lscope ~loc ~lscope kf env pot = (* We CANNOT return [block.bstmts] because it does NOT contain variable declarations. *) [ Smart_stmt.block_stmt block ], env - | Typing.(Rational | Real) -> + | Rational | Real -> Error.not_yet "\\at on purely logic variables and over real type" - | Typing.Gmpz -> + | Gmpz -> Error.not_yet "\\at on purely logic variables and over gmp type" end in diff --git a/src/plugins/e-acsl/src/code_generator/translate_terms.ml b/src/plugins/e-acsl/src/code_generator/translate_terms.ml index bfa0d27b5ff..12965127c73 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_terms.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_terms.ml @@ -55,15 +55,14 @@ let constant_to_exp ~loc env t c = let logic_env = Env.Logic_env.get env in let ity = Typing.get_number_ty ~logic_env t in (match ity with - | Typing.Nan -> assert false - | Typing.Real -> Error.not_yet "real number constant" - | Typing.Rational -> mk_real (Integer.to_string n) - | Typing.Gmpz -> - (* too large integer *) - Cil.mkString ~loc (Integer.to_string n), Typed_number.Str_Z - | Typing.C_float fkind -> + | Nan -> assert false + | Real -> Error.not_yet "real number constant" + | Rational -> mk_real (Integer.to_string n) + | Gmpz -> Cil.mkString ~loc (Integer.to_string n), Typed_number.Str_Z + (* too large integer *) + | C_float fkind -> Cil.kfloat ~loc fkind (Int64.to_float (Integer.to_int64_exn n)), C_number - | Typing.C_integer kind -> + | C_integer kind -> let cast = Typing.get_cast ~logic_env t in match cast, kind with | Some ty, (ILongLong | IULongLong) when Gmp_types.Z.is_t ty -> @@ -716,15 +715,15 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = e, adata, env, Typed_number.C_number, "" | TBinOp(MinusPP, t1, t2) -> begin match Typing.get_number_ty ~logic_env t with - | Typing.C_integer _ -> + | C_integer _ -> let e1, adata, env = to_exp ~adata kf env t1 in let e2, adata, env = to_exp ~adata kf env t2 in let ty = Typing.get_typ ~logic_env t in let e = Cil.new_exp ~loc (BinOp(MinusPP, e1, e2, ty)) in e, adata, env, Typed_number.C_number, "" - | Typing.Gmpz -> + | Gmpz -> Env.not_yet env "pointer subtraction resulting in gmp" - | Typing.(C_float _ | Rational | Real | Nan) -> + | C_float _ | Rational | Real | Nan -> assert false end | TCastE(ty, t') -> diff --git a/src/plugins/e-acsl/src/code_generator/translate_utils.ml b/src/plugins/e-acsl/src/code_generator/translate_utils.ml index e66907b425b..5b6f157fc6c 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_utils.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_utils.ml @@ -23,6 +23,7 @@ (** Utility functions for generating C implementations. *) open Cil_types +open Analyses_types module Error = Translation_error (**************************************************************************) @@ -202,9 +203,9 @@ let comparison_to_exp Env.not_yet env "comparison between two structs or unions" | Logic_aggr.NotAggregate, Logic_aggr.NotAggregate -> begin match ity with - | Typing.C_integer _ | Typing.C_float _ | Typing.Nan -> + | C_integer _ | C_float _ | Nan -> Cil.mkBinOp ~loc bop e1 e2, env - | Typing.Gmpz -> + | Gmpz -> let _, e, env = Env.new_var ~loc env @@ -220,10 +221,8 @@ let comparison_to_exp [ e1; e2 ] ]) in Cil.new_exp ~loc (BinOp(bop, e, Cil.zero ~loc, Cil.intType)), env - | Typing.Rational -> - Rational.cmp ~loc bop e1 e2 env kf t_opt - | Typing.Real -> - Error.not_yet "comparison involving real numbers" + | Rational -> Rational.cmp ~loc bop e1 e2 env kf t_opt + | Real -> Error.not_yet "comparison involving real numbers" end | _, _ -> Options.fatal @@ -283,14 +282,11 @@ let env_of_li ~adata ~loc kf env li = let vi, vi_e, env = Env.Logic_binding.add ~ty env kf li.l_var_info in let e, adata, env = !term_to_exp_ref ~adata kf env t in let stmt = match Typing.get_number_ty ~logic_env t with - | Typing.(C_integer _ | C_float _ | Nan) -> + | C_integer _ | C_float _ | Nan -> Smart_stmt.assigns ~loc ~result:(Cil.var vi) e - | Typing.Gmpz -> - Gmp.init_set ~loc (Cil.var vi) vi_e e - | Typing.Rational -> - Rational.init_set ~loc (Cil.var vi) vi_e e - | Typing.Real -> - Error.not_yet "real number" + | Gmpz -> Gmp.init_set ~loc (Cil.var vi) vi_e e + | Rational -> Rational.init_set ~loc (Cil.var vi) vi_e e + | Real -> Error.not_yet "real number" in adata, Env.add_stmt env stmt | Ltype _ -> diff --git a/src/plugins/e-acsl/src/code_generator/translate_utils.mli b/src/plugins/e-acsl/src/code_generator/translate_utils.mli index 2932dd4db85..ba8841aa2f4 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_utils.mli +++ b/src/plugins/e-acsl/src/code_generator/translate_utils.mli @@ -21,6 +21,7 @@ (**************************************************************************) open Cil_types +open Analyses_types (** Utility functions for generating C implementations. *) @@ -55,7 +56,7 @@ val comparison_to_exp: loc:location -> kernel_function -> Env.t -> - Typing.number_ty -> + number_ty -> ?e1:exp -> binop -> term -> -- GitLab