From 76896993c25ad2143fbb0a1d7fbfcbdea30e41f0 Mon Sep 17 00:00:00 2001
From: Thomas Koenig <tkoenig@gcc.gnu.org>
Date: Thu, 13 Sep 2007 19:02:31 +0000
Subject: [PATCH] iresolve.c (resolve_mask_arg): If a mask is an array
 expression, convert it to kind=1.

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  |  5 +++++
 gcc/fortran/iresolve.c | 32 +++++++++++++++++++++++---------
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 04844601fe13..8760abea78a4 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c
index 38da76be71ae..3205bebccab6 100644
--- a/gcc/fortran/iresolve.c
+++ b/gcc/fortran/iresolve.c
@@ -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);
+	}
     }
 }
 
-- 
GitLab