From efc0ca6b9e9687bbc48d3189af6818ee043d44b5 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Sun, 30 Oct 2011 12:11:42 +0100 Subject: [PATCH] COPY-SUBARRAY (and REPLACE for that matter) did not always work when arrays overlapped. --- src/c/array.d | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/c/array.d b/src/c/array.d index 4ff06509d..79c0efe2d 100644 --- a/src/c/array.d +++ b/src/c/array.d @@ -1123,29 +1123,27 @@ ecl_copy_subarray(cl_object dest, cl_index i0, cl_object orig, if (i1 + l > orig->array.dim) { l = orig->array.dim - i1; } - if (dest == orig && i0 > i1) { - if (t != ecl_array_elttype(orig) || t == aet_bit) { + if (t != ecl_array_elttype(orig) || t == aet_bit) { + if (dest == orig && i0 > i1) { for (i0 += l, i1 += l; l--; ) { ecl_aset_unsafe(dest, --i0, ecl_aref_unsafe(orig, --i1)); } } else { - cl_index elt_size = ecl_aet_size[t]; - memmove(dest->array.self.bc + i0 * elt_size, - orig->array.self.bc + i1 * elt_size, - l * elt_size); - } - } else if (t != ecl_array_elttype(orig) || t == aet_bit) { - while (l--) { - ecl_aset_unsafe(dest, i0++, - ecl_aref_unsafe(orig, i1++)); + while (l--) { + ecl_aset_unsafe(dest, i0++, + ecl_aref_unsafe(orig, i1++)); + } } } else { - cl_index elt_size = ecl_aet_size[t]; - memcpy(dest->array.self.bc + i0 * elt_size, - orig->array.self.bc + i1 * elt_size, - l * elt_size); - } + /* We could have singled out also dest == orig and used memcpy + * but gcc-4.6 breaks this code even when i0 < i1 if the regions + * overlap sufficiently. */ + cl_index elt_size = ecl_aet_size[t]; + memmove(dest->array.self.bc + i0 * elt_size, + orig->array.self.bc + i1 * elt_size, + l * elt_size); + } } void