PR fortran/96890 - Wrong answer with intrinsic IALL
authorHarald Anlauf <anlauf@gmx.de>
Thu, 3 Sep 2020 18:33:14 +0000 (20:33 +0200)
committerHarald Anlauf <anlauf@gmx.de>
Thu, 3 Sep 2020 18:33:14 +0000 (20:33 +0200)
The IALL intrinsic would always return 0 when the DIM and MASK arguments
were present since the initial value of repeated BIT-AND operations was
set to 0 instead of -1.

libgfortran/ChangeLog:

* m4/iall.m4: Initial value for result should be -1.
* generated/iall_i1.c (miall_i1): Generated.
* generated/iall_i16.c (miall_i16): Likewise.
* generated/iall_i2.c (miall_i2): Likewise.
* generated/iall_i4.c (miall_i4): Likewise.
* generated/iall_i8.c (miall_i8): Likewise.

gcc/testsuite/ChangeLog:

* gfortran.dg/iall_masked.f90: New test.

gcc/testsuite/gfortran.dg/iall_masked.f90 [new file with mode: 0644]
libgfortran/generated/iall_i1.c
libgfortran/generated/iall_i16.c
libgfortran/generated/iall_i2.c
libgfortran/generated/iall_i4.c
libgfortran/generated/iall_i8.c
libgfortran/m4/iall.m4

diff --git a/gcc/testsuite/gfortran.dg/iall_masked.f90 b/gcc/testsuite/gfortran.dg/iall_masked.f90
new file mode 100644 (file)
index 0000000..33cc410
--- /dev/null
@@ -0,0 +1,22 @@
+! { dg-do run }
+! PR fortran/96890 - Wrong answer with intrinsic IALL
+program p
+  implicit none
+  integer :: iarr1(0), iarr2(2,2), iarr3(2,2,2)
+  logical :: mask1(0), mask2(2,2), mask3(2,2,2)
+
+  if (     iall(iarr1,    mask1) /=          -1                 ) stop 1
+  if (     iall(iarr1, 1, mask1) /=          -1                 ) stop 2
+
+  iarr2 = reshape ([  1,      2,       3,      4      ], shape (iarr2))
+  mask2 = reshape ([ .true., .false., .true., .false. ], shape (mask2))
+
+  if (any (iall(iarr2, 2, mask2) /=          [1,-1])            ) stop 3
+
+  iarr3 = reshape ([  1,      2,       3,      4,     &
+                      5,      6,       7,      8      ], shape (iarr3))
+  mask3 = reshape ([ .true., .false., .true., .false.,&
+                     .true., .false., .true., .false. ], shape (iarr3))
+
+  if (any (iall(iarr3, 2, mask3) /= reshape ([1,-1,5,-1],[2,2]))) stop 4
+end
index 3fe0a1698ada29201a60ab8ebb3a754abd6bfe24..086a5464aad35203dac6aa91cd20b4f5594941f1 100644 (file)
@@ -345,7 +345,7 @@ miall_i1 (gfc_array_i1 * const restrict retarray,
       msrc = mbase;
       {
 
-  result = 0;
+  result = (GFC_INTEGER_1) -1;
        for (n = 0; n < len; n++, src += delta, msrc += mdelta)
          {
 
index 35d9872c0e956d3ce3bcb680dbc8c6a185c697c0..c491414ca7c35e5b35db26a8aa842851d549ca67 100644 (file)
@@ -345,7 +345,7 @@ miall_i16 (gfc_array_i16 * const restrict retarray,
       msrc = mbase;
       {
 
-  result = 0;
+  result = (GFC_INTEGER_16) -1;
        for (n = 0; n < len; n++, src += delta, msrc += mdelta)
          {
 
index ef90119341fca9bdba7e2de2ed609123931cfb42..d43e5df1809f901b7da86d8afcd6ef155a0b4829 100644 (file)
@@ -345,7 +345,7 @@ miall_i2 (gfc_array_i2 * const restrict retarray,
       msrc = mbase;
       {
 
-  result = 0;
+  result = (GFC_INTEGER_2) -1;
        for (n = 0; n < len; n++, src += delta, msrc += mdelta)
          {
 
index 27140abeaa89f2688e3d461505765a2ed0c4ea92..039e796379868d951dd450fef6a43dfa4d5eee85 100644 (file)
@@ -345,7 +345,7 @@ miall_i4 (gfc_array_i4 * const restrict retarray,
       msrc = mbase;
       {
 
-  result = 0;
+  result = (GFC_INTEGER_4) -1;
        for (n = 0; n < len; n++, src += delta, msrc += mdelta)
          {
 
index 6047169c62e384ed5a58f6dd48819ff1e36203d8..d01f7aecaf83409e907f8a8cbf8b4a17c7ea6c4f 100644 (file)
@@ -345,7 +345,7 @@ miall_i8 (gfc_array_i8 * const restrict retarray,
       msrc = mbase;
       {
 
-  result = 0;
+  result = (GFC_INTEGER_8) -1;
        for (n = 0; n < len; n++, src += delta, msrc += mdelta)
          {
 
index df57367c100048f3ce14fb888d8fe23fd13d7989..8f3b77414868e3e4229ddcd8a0e2fe4df8c5c531 100644 (file)
@@ -35,7 +35,7 @@ ARRAY_FUNCTION(0,
 `  result &= *src;')
 
 MASKED_ARRAY_FUNCTION(0,
-`  result = 0;',
+`  result = ('rtype_name`) -1;',
 `  if (*msrc)
     result &= *src;')