From e6889aa3b6dfd3f3c3cb05c2002df6a1208cf493 Mon Sep 17 00:00:00 2001 From: Thierry Martinez <Thierry.Martinez@inria.fr> Date: Fri, 20 Jan 2023 21:57:27 +0100 Subject: [PATCH] Fix conversion to pointer arithmetic --- clangml-transforms/for_memcad.ml | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/clangml-transforms/for_memcad.ml b/clangml-transforms/for_memcad.ml index 6523591..3ef65ad 100644 --- a/clangml-transforms/for_memcad.ml +++ b/clangml-transforms/for_memcad.ml @@ -596,10 +596,17 @@ with type 'a Applicative.t = 'a Applicative.t = struct { record_decl with fields = name_anonymous_fields record_decl.fields }, Free_monoid.zero - let is_pointer_type (ty : Clang.Type.t) = - match ty.desc with - | Pointer _ -> true - | _ -> false + let is_array (expr : Clang.Expr.t) = + let cursor = Clang.Ast.cursor_of_node expr in + match Clang.ext_get_cursor_kind cursor with + | ImplicitCastExpr -> + let child = Option.get (Clang.first_child cursor) in + begin match Clang.get_type_kind (Clang.get_cursor_type child) with + | ConstantArray -> true + | _ -> false + end + | _ -> + false let hook : type a . a Refl.refl -> (a -> env -> a * accu) -> (a -> env -> a * accu) = @@ -632,7 +639,7 @@ with type 'a Applicative.t = 'a Applicative.t = struct | UnaryExpr { kind = SizeOf; argument } -> visit_unary_expr_size_of argument env | ArraySubscript { base; index } - when is_pointer_type (Clang.Type.of_node base) -> + when not (is_array base) -> let x' : Clang.Ast.expr_desc = UnaryOperator { kind = Deref; operand = { base with desc = BinaryOperator { -- GitLab