diff --git a/clangml-transforms/for_memcad.ml b/clangml-transforms/for_memcad.ml
index d69146edea0fab50e948b659e684848c577bf77a..652359116b1f16e75981bfd26f4346e0d49b3da2 100644
--- a/clangml-transforms/for_memcad.ml
+++ b/clangml-transforms/for_memcad.ml
@@ -596,6 +596,11 @@ 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 hook :
     type a . a Refl.refl -> (a -> env -> a * accu) -> (a -> env -> a * accu) =
   fun refl super x env ->
@@ -624,9 +629,18 @@ with type 'a Applicative.t = 'a Applicative.t = struct
                 Visit.visit [%refl: Clang.Ast.expr] []
                   cond { env with in_condition = true } in
               Call { callee; args = [cond] }, cond_stmts
-          | UnaryExpr { kind = SizeOf; argument } ->
-              visit_unary_expr_size_of argument env
-          | _ -> super x env
+        | UnaryExpr { kind = SizeOf; argument } ->
+            visit_unary_expr_size_of argument env
+        | ArraySubscript { base; index }
+             when is_pointer_type (Clang.Type.of_node base) ->
+            let x' : Clang.Ast.expr_desc = UnaryOperator {
+              kind = Deref;
+              operand = { base with desc = BinaryOperator {
+                lhs = base;
+                kind = Add;
+                rhs = index; }}} in
+            super x' env
+        | _ -> super x env
         end
     | Clang.Ast.Refl_decl_desc ->
         begin match x with