summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ast_util.ml35
-rw-r--r--src/constant_fold.ml2
2 files changed, 29 insertions, 8 deletions
diff --git a/src/ast_util.ml b/src/ast_util.ml
index 11873690..fcfa619e 100644
--- a/src/ast_util.ml
+++ b/src/ast_util.ml
@@ -1862,6 +1862,12 @@ let rec find_annot_exp sl (E_aux (aux, (l, annot)) as exp) =
option_chain (find_annot_lexp sl lexp) (find_annot_exp sl exp)
| E_var (lexp, exp1, exp2) ->
option_chain (find_annot_lexp sl lexp) (option_mapm (find_annot_exp sl) [exp1; exp2])
+ | E_if (cond_exp, then_exp, else_exp) ->
+ option_mapm (find_annot_exp sl) [cond_exp; then_exp; else_exp]
+ | E_case (exp, cases) | E_try (exp, cases) ->
+ option_chain (find_annot_exp sl exp) (option_mapm (find_annot_pexp sl) cases)
+ | E_return exp | E_cast (_, exp) ->
+ find_annot_exp sl exp
| _ -> None
in
match result with
@@ -1888,6 +1894,8 @@ and find_annot_lexp sl (LEXP_aux (aux, (l, annot))) =
and find_annot_pat sl (P_aux (aux, (l, annot))) =
if not (subloc sl l) then None else
let result = match aux with
+ | P_vector_concat pats ->
+ option_mapm (find_annot_pat sl) pats
| _ -> None
in
match result with
@@ -1898,32 +1906,43 @@ and find_annot_pexp sl (Pat_aux (aux, (l, annot))) =
if not (subloc sl l) then None else
match aux with
| Pat_exp (pat, exp) ->
- find_annot_exp sl exp
+ option_chain (find_annot_pat sl pat) (find_annot_exp sl exp)
| Pat_when (pat, guard, exp) ->
- None
+ option_chain (find_annot_pat sl pat) (option_mapm (find_annot_exp sl) [guard; exp])
let find_annot_funcl sl (FCL_aux (FCL_Funcl (id, pexp), (l, annot))) =
- if not (subloc sl l) then
- None
- else
+ if not (subloc sl l) then None else
match find_annot_pexp sl pexp with
| None -> Some (l, annot)
| result -> result
let find_annot_fundef sl (FD_aux (FD_function (_, _, _, funcls), (l, annot))) =
- if not (subloc sl l) then
- None
- else
+ if not (subloc sl l) then None else
match option_mapm (find_annot_funcl sl) funcls with
| None -> Some (l, annot)
| result -> result
+let find_annot_scattered sl (SD_aux (aux, (l, annot))) =
+ if not (subloc sl l) then None else
+ let result = match aux with
+ | SD_funcl fcl -> find_annot_funcl sl fcl
+ | _ -> None
+ in
+ match result with
+ | None -> Some (l, annot)
+ | _ -> result
+
let rec find_annot_defs sl = function
| DEF_fundef fdef :: defs ->
begin match find_annot_fundef sl fdef with
| None -> find_annot_defs sl defs
| result -> result
end
+ | DEF_scattered sdef :: defs ->
+ begin match find_annot_scattered sl sdef with
+ | None -> find_annot_defs sl defs
+ | result -> result
+ end
| _ :: defs ->
find_annot_defs sl defs
| [] -> None
diff --git a/src/constant_fold.ml b/src/constant_fold.ml
index 7321a801..6ad1f663 100644
--- a/src/constant_fold.ml
+++ b/src/constant_fold.ml
@@ -180,6 +180,8 @@ let rec rewrite_constant_function_calls' ast =
| E_app (id, args) when List.for_all is_constant args ->
evaluate e_aux annot
+ | E_cast (typ, (E_aux (E_lit _, _) as lit)) -> ok (); lit
+
| E_field (exp, id) when is_constant exp ->
evaluate e_aux annot