diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2013-12-30 16:37:05 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2013-12-30 16:37:05 +0000 |
commit | 51e8bc524d570439f868ec0bdbf718cb53ca7669 (patch) | |
tree | 5211b1971bdc1df4bc231dfef90cd15e3758a7e3 /cfrontend/Cexec.v | |
parent | 98089fdf4880b46a57aafa96ea00578e396bb58b (diff) |
Ctypes.sizeof ty = 0 for empty types ty (zero-sized array, empty struct/union).
__builtin_memcpy_aligned now supports the case sz = 0.
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2392 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'cfrontend/Cexec.v')
-rw-r--r-- | cfrontend/Cexec.v | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/cfrontend/Cexec.v b/cfrontend/Cexec.v index 9593afd..d585760 100644 --- a/cfrontend/Cexec.v +++ b/cfrontend/Cexec.v @@ -465,8 +465,9 @@ Definition do_ef_free Definition memcpy_args_ok (sz al: Z) (bdst: block) (odst: Z) (bsrc: block) (osrc: Z) : Prop := (al = 1 \/ al = 2 \/ al = 4 \/ al = 8) - /\ sz > 0 - /\ (al | sz) /\ (al | osrc) /\ (al | odst) + /\ sz >= 0 /\ (al | sz) + /\ (sz > 0 -> (al | osrc)) + /\ (sz > 0 -> (al | odst)) /\ (bsrc <> bdst \/ osrc = odst \/ osrc + sz <= odst \/ odst + sz <= osrc). Remark memcpy_check_args: @@ -479,10 +480,14 @@ Proof with try (right; intuition omega). destruct (zeq al 4); auto. destruct (zeq al 8); auto... unfold memcpy_args_ok. destruct X... assert (al > 0) by (intuition omega). - destruct (zlt 0 sz)... + destruct (zle 0 sz)... destruct (Zdivide_dec al sz); auto... - destruct (Zdivide_dec al osrc); auto... - destruct (Zdivide_dec al odst); auto... + assert(U: forall x, {sz > 0 -> (al | x)} + {~(sz > 0 -> (al | x))}). + intros. destruct (zeq sz 0). + left; intros; omegaContradiction. + destruct (Zdivide_dec al x); auto. right; red; intros. elim n0. apply H0. omega. + destruct (U osrc); auto... + destruct (U odst); auto... assert (Y: {bsrc <> bdst \/ osrc = odst \/ osrc + sz <= odst \/ odst + sz <= osrc} +{~(bsrc <> bdst \/ osrc = odst \/ osrc + sz <= odst \/ odst + sz <= osrc)}). destruct (eq_block bsrc bdst); auto. |