From 45096eb38f75203a910f65f979c1e7020d0634cb Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Wed, 18 Dec 2019 09:53:34 +0100 Subject: [PATCH] Fix/acsl/typing functions sets --- src/kernel_services/ast_queries/logic_typing.ml | 8 +++++++- tests/spec/logic_functions_sets.i | 11 +++++++++++ tests/spec/logic_functions_sets.ml | 16 ++++++++++++++++ .../spec/oracle/logic_functions_sets.res.oracle | 1 + 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/spec/logic_functions_sets.i create mode 100644 tests/spec/logic_functions_sets.ml create mode 100644 tests/spec/oracle/logic_functions_sets.res.oracle diff --git a/src/kernel_services/ast_queries/logic_typing.ml b/src/kernel_services/ast_queries/logic_typing.ml index 9a4e7782568..8a4be465d70 100644 --- a/src/kernel_services/ast_queries/logic_typing.ml +++ b/src/kernel_services/ast_queries/logic_typing.ml @@ -1447,7 +1447,13 @@ struct Ltype(t1,l),oterm | t1, Ltype ({lt_name = "set"},[t2]) -> let typ, term = implicit_conversion ~overloaded loc oterm t1 t2 in - make_set_type typ, term + let stype = make_set_type typ in + let term = + if not (Logic_const.is_set_type term.term_type) then + Logic_const.tlogic_coerce ~loc:term.term_loc term stype + else term + in + stype, term | Linteger, Linteger | Lreal, Lreal -> ot, oterm | Lvar s1, Lvar s2 when s1 = s2 -> ot, oterm | Larrow(args1,rt1), Larrow(args2,rt2) diff --git a/tests/spec/logic_functions_sets.i b/tests/spec/logic_functions_sets.i new file mode 100644 index 00000000000..60190e8cc24 --- /dev/null +++ b/tests/spec/logic_functions_sets.i @@ -0,0 +1,11 @@ +/* run.config + MODULE: @PTEST_DIR@/@PTEST_NAME@.cmxs + OPT: -no-autoload-plugins +*/ + +/*@ + logic set<integer> constant_1(integer n) = 1 ; + logic set<integer> constant_2(integer n) = { 1 } ; + logic set<integer> with_sub_1(integer n) = (n < 0) ? 1 : 2 ; + logic set<integer> with_sub_2(integer n) = (n < 0) ? 1 : { 2 } ; +*/ diff --git a/tests/spec/logic_functions_sets.ml b/tests/spec/logic_functions_sets.ml new file mode 100644 index 00000000000..0eb5f933fd7 --- /dev/null +++ b/tests/spec/logic_functions_sets.ml @@ -0,0 +1,16 @@ +open Cil_types + +let check = function + | Dfun_or_pred (li, _) -> + let decl_type = Extlib.the li.l_type in + let body_type = match li.l_body with + | LBterm t -> t.term_type + | _ -> assert false + in + if 0 <> Cil_datatype.Logic_type.compare decl_type body_type then begin + Kernel.failure "Bad type for: %a" Cil_datatype.Logic_info.pretty li + end + | _ -> () + +let () = + Db.Main.extend (fun () -> Annotations.iter_global (fun _ g -> check g)) \ No newline at end of file diff --git a/tests/spec/oracle/logic_functions_sets.res.oracle b/tests/spec/oracle/logic_functions_sets.res.oracle new file mode 100644 index 00000000000..d15532848e8 --- /dev/null +++ b/tests/spec/oracle/logic_functions_sets.res.oracle @@ -0,0 +1 @@ +[kernel] Parsing tests/spec/logic_functions_sets.i (no preprocessing) -- GitLab