Test case that requires 4 GB RAM that exercises eoshift0:
program main
implicit none
integer(1) :: line(2_8**31+10)
line = 42
line = eoshift(line, 2_8**31+7)
print *, line(1:4)
print *, line((ubound(line, 1, kind=8)-4):ubound(line, 1, kind=8))
end program main
Before patch:
❯ ./a.out
0 0 0 0
42 42 42 42 42
With patch:
❯ ./a.out
42 42 42 0
0 0 0 0 0
Regtested on x86_64-pc-linux-gnu.
libgfortran/ChangeLog:
2017-11-22 Janne Blomqvist <jb@gcc.gnu.org>
* intrinsics/eoshift0.c (eoshift0): Make shift an index_type.
* intrinsics/eoshift2.c (eoshift2): Make shift an index_type.
From-SVN: r255077
+2017-11-22 Janne Blomqvist <jb@gcc.gnu.org>
+
+ * intrinsics/eoshift0.c (eoshift0): Make shift an index_type.
+ * intrinsics/eoshift2.c (eoshift2): Make shift an index_type.
+
2017-11-22 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/83097
#include "libgfortran.h"
#include <string.h>
-/* TODO: make this work for large shifts when
- sizeof(int) < sizeof (index_type). */
static void
eoshift0 (gfc_array_char * ret, const gfc_array_char * array,
- int shift, const char * pbound, int which, index_type size,
+ index_type shift, const char * pbound, int which, index_type size,
const char *filler, index_type filler_len)
{
/* r.* indicates the return array. */
#include "libgfortran.h"
#include <string.h>
-/* TODO: make this work for large shifts when
- sizeof(int) < sizeof (index_type). */
static void
eoshift2 (gfc_array_char *ret, const gfc_array_char *array,
- int shift, const gfc_array_char *bound, int which,
+ index_type shift, const gfc_array_char *bound, int which,
const char *filler, index_type filler_len)
{
/* r.* indicates the return array. */