iresolve.c (resolve_mask_arg): If a mask is an array expression, convert it to kind=1.
authorThomas Koenig <tkoenig@gcc.gnu.org>
Thu, 13 Sep 2007 19:02:31 +0000 (19:02 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Thu, 13 Sep 2007 19:02:31 +0000 (19:02 +0000)
2007-09-13  Thomas Koenig  <tkoenig@gcc.gnu.org>

* iresolve.c (resolve_mask_arg): If a mask is an array
expression, convert it to kind=1.

From-SVN: r128477

gcc/fortran/ChangeLog
gcc/fortran/iresolve.c

index 04844601fe13acd2dcdea96ea92bc5d44a85e895..8760abea78a4767c1820610b0e248ca653dce6dd 100644 (file)
@@ -1,3 +1,8 @@
+2007-09-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       * iresolve.c (resolve_mask_arg): If a mask is an array
+       expression, convert it to kind=1.
+
 2007-09-13  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/33343
index 38da76be71aed0daf4e036f5dd85f67b1a16b375..3205bebccab62ac60de7e7812742e8e71054f757 100644 (file)
@@ -78,18 +78,32 @@ static void
 resolve_mask_arg (gfc_expr *mask)
 {
 
-  /* The mask can be any kind for an array.
-     For the scalar case, coerce it to kind=4 unconditionally
-     (because this is the only kind we have a library function
-     for).  */
+  gfc_typespec ts;
 
-  if (mask->rank == 0 && mask->ts.kind != 4)
+  if (mask->rank == 0)
     {
-      gfc_typespec ts;
+      /* For the scalar case, coerce the mask to kind=4 unconditionally
+        (because this is the only kind we have a library function
+        for).  */
 
-      ts.type = BT_LOGICAL;
-      ts.kind = 4;
-      gfc_convert_type (mask, &ts, 2);
+      if (mask->ts.kind != 4)
+       {
+         ts.type = BT_LOGICAL;
+         ts.kind = 4;
+         gfc_convert_type (mask, &ts, 2);
+       }
+    }
+  else
+    {
+      /* In the library, we access the mask with a GFC_LOGICAL_1
+        argument.  No need to waste memory if we are about to create
+        a temporary array.  */
+      if (mask->expr_type == EXPR_OP)
+       {
+         ts.type = BT_LOGICAL;
+         ts.kind = 1;
+         gfc_convert_type (mask, &ts, 2);
+       }
     }
 }