From 76896993c25ad2143fbb0a1d7fbfcbdea30e41f0 Mon Sep 17 00:00:00 2001 From: Thomas Koenig 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 * 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 04844601fe1..8760abea78a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2007-09-13 Thomas Koenig + + * iresolve.c (resolve_mask_arg): If a mask is an array + expression, convert it to kind=1. + 2007-09-13 Tobias Burnus PR fortran/33343 diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c index 38da76be71a..3205bebccab 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); + } } }