https://gcc.gnu.org/g:6d5b905aad35802eec1b5676dbc21c2d5dbd3ac7

commit 6d5b905aad35802eec1b5676dbc21c2d5dbd3ac7
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Aug 20 21:24:42 2025 +0200

    Correction régressions cshift_1, cshift_large_1, simplify_cshift_4

Diff:
---
 libgfortran/generated/cshift0_c10.c | 9 +++++----
 libgfortran/generated/cshift0_c16.c | 9 +++++----
 libgfortran/generated/cshift0_c17.c | 9 +++++----
 libgfortran/generated/cshift0_c4.c  | 9 +++++----
 libgfortran/generated/cshift0_c8.c  | 9 +++++----
 libgfortran/generated/cshift0_i1.c  | 9 +++++----
 libgfortran/generated/cshift0_i16.c | 9 +++++----
 libgfortran/generated/cshift0_i2.c  | 9 +++++----
 libgfortran/generated/cshift0_i4.c  | 9 +++++----
 libgfortran/generated/cshift0_i8.c  | 9 +++++----
 libgfortran/generated/cshift0_r10.c | 9 +++++----
 libgfortran/generated/cshift0_r16.c | 9 +++++----
 libgfortran/generated/cshift0_r17.c | 9 +++++----
 libgfortran/generated/cshift0_r4.c  | 9 +++++----
 libgfortran/generated/cshift0_r8.c  | 9 +++++----
 libgfortran/m4/cshift0.m4           | 9 +++++----
 16 files changed, 80 insertions(+), 64 deletions(-)

diff --git a/libgfortran/generated/cshift0_c10.c 
b/libgfortran/generated/cshift0_c10.c
index a4cf3df20e03..a1dd7ad7495e 100644
--- a/libgfortran/generated/cshift0_c10.c
+++ b/libgfortran/generated/cshift0_c10.c
@@ -116,8 +116,9 @@ cshift0_c10 (gfc_array_c10 *ret, const gfc_array_c10 
*array, ptrdiff_t shift,
       roffset = sizeof (GFC_COMPLEX_10);
       soffset = sizeof (GFC_COMPLEX_10);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_COMPLEX_10);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_COMPLEX_10);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_c10 (gfc_array_c10 *ret, const gfc_array_c10 
*array, ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_COMPLEX_10);
          size_t len2 = (len - shift) * sizeof (GFC_COMPLEX_10);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_c16.c 
b/libgfortran/generated/cshift0_c16.c
index bd7140d06708..def7bd22f73d 100644
--- a/libgfortran/generated/cshift0_c16.c
+++ b/libgfortran/generated/cshift0_c16.c
@@ -116,8 +116,9 @@ cshift0_c16 (gfc_array_c16 *ret, const gfc_array_c16 
*array, ptrdiff_t shift,
       roffset = sizeof (GFC_COMPLEX_16);
       soffset = sizeof (GFC_COMPLEX_16);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_COMPLEX_16);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_COMPLEX_16);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_c16 (gfc_array_c16 *ret, const gfc_array_c16 
*array, ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_COMPLEX_16);
          size_t len2 = (len - shift) * sizeof (GFC_COMPLEX_16);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_c17.c 
b/libgfortran/generated/cshift0_c17.c
index dd3e888d7831..b459194aea1e 100644
--- a/libgfortran/generated/cshift0_c17.c
+++ b/libgfortran/generated/cshift0_c17.c
@@ -116,8 +116,9 @@ cshift0_c17 (gfc_array_c17 *ret, const gfc_array_c17 
*array, ptrdiff_t shift,
       roffset = sizeof (GFC_COMPLEX_17);
       soffset = sizeof (GFC_COMPLEX_17);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_COMPLEX_17);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_COMPLEX_17);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_c17 (gfc_array_c17 *ret, const gfc_array_c17 
*array, ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_COMPLEX_17);
          size_t len2 = (len - shift) * sizeof (GFC_COMPLEX_17);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_c4.c 
b/libgfortran/generated/cshift0_c4.c
index 086abceec2c4..6a50e253a7f3 100644
--- a/libgfortran/generated/cshift0_c4.c
+++ b/libgfortran/generated/cshift0_c4.c
@@ -116,8 +116,9 @@ cshift0_c4 (gfc_array_c4 *ret, const gfc_array_c4 *array, 
ptrdiff_t shift,
       roffset = sizeof (GFC_COMPLEX_4);
       soffset = sizeof (GFC_COMPLEX_4);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_COMPLEX_4);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_COMPLEX_4);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_c4 (gfc_array_c4 *ret, const gfc_array_c4 *array, 
ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_COMPLEX_4);
          size_t len2 = (len - shift) * sizeof (GFC_COMPLEX_4);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_c8.c 
b/libgfortran/generated/cshift0_c8.c
index ec1da6753f26..87fe4049d427 100644
--- a/libgfortran/generated/cshift0_c8.c
+++ b/libgfortran/generated/cshift0_c8.c
@@ -116,8 +116,9 @@ cshift0_c8 (gfc_array_c8 *ret, const gfc_array_c8 *array, 
ptrdiff_t shift,
       roffset = sizeof (GFC_COMPLEX_8);
       soffset = sizeof (GFC_COMPLEX_8);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_COMPLEX_8);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_COMPLEX_8);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_c8 (gfc_array_c8 *ret, const gfc_array_c8 *array, 
ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_COMPLEX_8);
          size_t len2 = (len - shift) * sizeof (GFC_COMPLEX_8);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_i1.c 
b/libgfortran/generated/cshift0_i1.c
index 120096bd6901..8b00cd1eb4a1 100644
--- a/libgfortran/generated/cshift0_i1.c
+++ b/libgfortran/generated/cshift0_i1.c
@@ -116,8 +116,9 @@ cshift0_i1 (gfc_array_i1 *ret, const gfc_array_i1 *array, 
ptrdiff_t shift,
       roffset = sizeof (GFC_INTEGER_1);
       soffset = sizeof (GFC_INTEGER_1);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_INTEGER_1);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_INTEGER_1);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_i1 (gfc_array_i1 *ret, const gfc_array_i1 *array, 
ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_INTEGER_1);
          size_t len2 = (len - shift) * sizeof (GFC_INTEGER_1);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_i16.c 
b/libgfortran/generated/cshift0_i16.c
index 92ffea9e315d..f47aeefae997 100644
--- a/libgfortran/generated/cshift0_i16.c
+++ b/libgfortran/generated/cshift0_i16.c
@@ -116,8 +116,9 @@ cshift0_i16 (gfc_array_i16 *ret, const gfc_array_i16 
*array, ptrdiff_t shift,
       roffset = sizeof (GFC_INTEGER_16);
       soffset = sizeof (GFC_INTEGER_16);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_INTEGER_16);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_INTEGER_16);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_i16 (gfc_array_i16 *ret, const gfc_array_i16 
*array, ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_INTEGER_16);
          size_t len2 = (len - shift) * sizeof (GFC_INTEGER_16);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_i2.c 
b/libgfortran/generated/cshift0_i2.c
index 44d4e54654c5..f5c8a8909383 100644
--- a/libgfortran/generated/cshift0_i2.c
+++ b/libgfortran/generated/cshift0_i2.c
@@ -116,8 +116,9 @@ cshift0_i2 (gfc_array_i2 *ret, const gfc_array_i2 *array, 
ptrdiff_t shift,
       roffset = sizeof (GFC_INTEGER_2);
       soffset = sizeof (GFC_INTEGER_2);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_INTEGER_2);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_INTEGER_2);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_i2 (gfc_array_i2 *ret, const gfc_array_i2 *array, 
ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_INTEGER_2);
          size_t len2 = (len - shift) * sizeof (GFC_INTEGER_2);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_i4.c 
b/libgfortran/generated/cshift0_i4.c
index f63bba884d4e..eedfbfa6ce44 100644
--- a/libgfortran/generated/cshift0_i4.c
+++ b/libgfortran/generated/cshift0_i4.c
@@ -116,8 +116,9 @@ cshift0_i4 (gfc_array_i4 *ret, const gfc_array_i4 *array, 
ptrdiff_t shift,
       roffset = sizeof (GFC_INTEGER_4);
       soffset = sizeof (GFC_INTEGER_4);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_INTEGER_4);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_INTEGER_4);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_i4 (gfc_array_i4 *ret, const gfc_array_i4 *array, 
ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_INTEGER_4);
          size_t len2 = (len - shift) * sizeof (GFC_INTEGER_4);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_i8.c 
b/libgfortran/generated/cshift0_i8.c
index 2083779755d7..5042cc54b847 100644
--- a/libgfortran/generated/cshift0_i8.c
+++ b/libgfortran/generated/cshift0_i8.c
@@ -116,8 +116,9 @@ cshift0_i8 (gfc_array_i8 *ret, const gfc_array_i8 *array, 
ptrdiff_t shift,
       roffset = sizeof (GFC_INTEGER_8);
       soffset = sizeof (GFC_INTEGER_8);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_INTEGER_8);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_INTEGER_8);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_i8 (gfc_array_i8 *ret, const gfc_array_i8 *array, 
ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_INTEGER_8);
          size_t len2 = (len - shift) * sizeof (GFC_INTEGER_8);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_r10.c 
b/libgfortran/generated/cshift0_r10.c
index b3794fa78951..8fd8bd6ba33d 100644
--- a/libgfortran/generated/cshift0_r10.c
+++ b/libgfortran/generated/cshift0_r10.c
@@ -116,8 +116,9 @@ cshift0_r10 (gfc_array_r10 *ret, const gfc_array_r10 
*array, ptrdiff_t shift,
       roffset = sizeof (GFC_REAL_10);
       soffset = sizeof (GFC_REAL_10);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_REAL_10);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_REAL_10);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_r10 (gfc_array_r10 *ret, const gfc_array_r10 
*array, ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_REAL_10);
          size_t len2 = (len - shift) * sizeof (GFC_REAL_10);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_r16.c 
b/libgfortran/generated/cshift0_r16.c
index 19d6699b0869..9793bf1d1020 100644
--- a/libgfortran/generated/cshift0_r16.c
+++ b/libgfortran/generated/cshift0_r16.c
@@ -116,8 +116,9 @@ cshift0_r16 (gfc_array_r16 *ret, const gfc_array_r16 
*array, ptrdiff_t shift,
       roffset = sizeof (GFC_REAL_16);
       soffset = sizeof (GFC_REAL_16);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_REAL_16);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_REAL_16);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_r16 (gfc_array_r16 *ret, const gfc_array_r16 
*array, ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_REAL_16);
          size_t len2 = (len - shift) * sizeof (GFC_REAL_16);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_r17.c 
b/libgfortran/generated/cshift0_r17.c
index 20162fa609e5..cdbc455b795e 100644
--- a/libgfortran/generated/cshift0_r17.c
+++ b/libgfortran/generated/cshift0_r17.c
@@ -116,8 +116,9 @@ cshift0_r17 (gfc_array_r17 *ret, const gfc_array_r17 
*array, ptrdiff_t shift,
       roffset = sizeof (GFC_REAL_17);
       soffset = sizeof (GFC_REAL_17);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_REAL_17);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_REAL_17);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_r17 (gfc_array_r17 *ret, const gfc_array_r17 
*array, ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_REAL_17);
          size_t len2 = (len - shift) * sizeof (GFC_REAL_17);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_r4.c 
b/libgfortran/generated/cshift0_r4.c
index 3619bb56887c..e78cc0b0679e 100644
--- a/libgfortran/generated/cshift0_r4.c
+++ b/libgfortran/generated/cshift0_r4.c
@@ -116,8 +116,9 @@ cshift0_r4 (gfc_array_r4 *ret, const gfc_array_r4 *array, 
ptrdiff_t shift,
       roffset = sizeof (GFC_REAL_4);
       soffset = sizeof (GFC_REAL_4);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_REAL_4);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_REAL_4);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_r4 (gfc_array_r4 *ret, const gfc_array_r4 *array, 
ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_REAL_4);
          size_t len2 = (len - shift) * sizeof (GFC_REAL_4);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/generated/cshift0_r8.c 
b/libgfortran/generated/cshift0_r8.c
index b54ff8f35da8..fdde84f452e2 100644
--- a/libgfortran/generated/cshift0_r8.c
+++ b/libgfortran/generated/cshift0_r8.c
@@ -116,8 +116,9 @@ cshift0_r8 (gfc_array_r8 *ret, const gfc_array_r8 *array, 
ptrdiff_t shift,
       roffset = sizeof (GFC_REAL_8);
       soffset = sizeof (GFC_REAL_8);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof (GFC_REAL_8);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof (GFC_REAL_8);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -175,8 +176,8 @@ cshift0_r8 (gfc_array_r8 *ret, const gfc_array_r8 *array, 
ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof (GFC_REAL_8);
          size_t len2 = (len - shift) * sizeof (GFC_REAL_8);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {
diff --git a/libgfortran/m4/cshift0.m4 b/libgfortran/m4/cshift0.m4
index 02c551c40cf9..9c43590f32ee 100644
--- a/libgfortran/m4/cshift0.m4
+++ b/libgfortran/m4/cshift0.m4
@@ -117,8 +117,9 @@ cshift0_'rtype_code` ('rtype` *ret, const 'rtype` *array, 
ptrdiff_t shift,
       roffset = sizeof ('rtype_name`);
       soffset = sizeof ('rtype_name`);
       len = GFC_DESCRIPTOR_SPACING(array, which)
-       * GFC_DESCRIPTOR_EXTENT(array, which);      
-      shift *= GFC_DESCRIPTOR_SPACING(array, which);
+       * GFC_DESCRIPTOR_EXTENT(array, which)
+       / sizeof ('rtype_name`);      
+      shift *= GFC_DESCRIPTOR_SPACING(array, which) / sizeof ('rtype_name`);
       for (dim = which + 1; dim < GFC_DESCRIPTOR_RANK (array); dim++)
        {
          count[n] = 0;
@@ -176,8 +177,8 @@ cshift0_'rtype_code` ('rtype` *ret, const 'rtype` *array, 
ptrdiff_t shift,
        {
          size_t len1 = shift * sizeof ('rtype_name`);
          size_t len2 = (len - shift) * sizeof ('rtype_name`);
-         memcpy (rptr, sptr + shift, len2);
-         memcpy (rptr + (len - shift), sptr, len1);
+         memcpy (rptr, ((char*) sptr) + len1, len2);
+         memcpy (((char*) rptr) + len2, sptr, len1);
        }
       else
        {

Reply via email to