aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/iresolve.c
diff options
context:
space:
mode:
authorThomas Koenig <Thomas.Koenig@online.de>2005-08-10 20:16:29 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2005-08-10 20:16:29 +0000
commitbf30222095f87487f17327279fe563dff47479df (patch)
tree192d52eb31c60fbe56e1909dc928b0c43d08c0ca /gcc/fortran/iresolve.c
parentbb8df8a62d346532834194e96b8d3970eb8cd6e0 (diff)
downloadgcc-bf30222095f87487f17327279fe563dff47479df.zip
gcc-bf30222095f87487f17327279fe563dff47479df.tar.gz
gcc-bf30222095f87487f17327279fe563dff47479df.tar.bz2
re PR libfortran/22143 (missing kinds 1 and 2 for eoshift and cshift)
2005-08-10 Thomas Koenig <Thomas.Koenig@online.de> PR libfortran/22143 gfortran.h: Declare new function gfc_resolve_dim_arg. resolve.c: New function gfc_resolve_dim_arg. iresolve.c (gfc_resolve_all): Use gfc_resolve_dim_arg. (gfc_resolve_any): Likewise. (gfc_resolve_count): Likewise. (gfc_resolve_cshift): Likewise. If the kind of shift is less gfc_default_integer_kind, convert it to default integer type. (gfc_resolve_eoshift): Likewise. (gfc_resolve_maxloc): Use gfc_resolve_dim_arg. (gfc_resolve_maxval): Likewise. (gfc_resolve_minloc): Likewise. (gfc_resolve_minval): Likewise. (gfc_resolve_product): Likewise. (gfc_resolve_spread): Likewise. (gfc_resolve_sum): Likewise. 2005-08-10 Thomas Koenig <Thomas.Koenig@online.de> PR libfortran/22143 gfortran.dg/shift-kind.f90: New testcase. From-SVN: r102957
Diffstat (limited to 'gcc/fortran/iresolve.c')
-rw-r--r--gcc/fortran/iresolve.c53
1 files changed, 38 insertions, 15 deletions
diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c
index a6f7f27..ef43946 100644
--- a/gcc/fortran/iresolve.c
+++ b/gcc/fortran/iresolve.c
@@ -129,7 +129,7 @@ gfc_resolve_all (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
if (dim != NULL)
{
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
f->rank = mask->rank - 1;
f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
}
@@ -167,7 +167,7 @@ gfc_resolve_any (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
if (dim != NULL)
{
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
f->rank = mask->rank - 1;
f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
}
@@ -359,7 +359,7 @@ gfc_resolve_count (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
if (dim != NULL)
{
f->rank = mask->rank - 1;
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
}
@@ -385,9 +385,19 @@ gfc_resolve_cshift (gfc_expr * f, gfc_expr * array,
else
n = 0;
+ /* Convert shift to at least gfc_default_integer_kind, so we don't need
+ kind=1 and kind=2 versions of the library functions. */
+ if (shift->ts.kind < gfc_default_integer_kind)
+ {
+ gfc_typespec ts;
+ ts.type = BT_INTEGER;
+ ts.kind = gfc_default_integer_kind;
+ gfc_convert_type_warn (shift, &ts, 2, 0);
+ }
+
if (dim != NULL)
{
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
/* Convert dim to shift's kind, so we don't need so many variations. */
if (dim->ts.kind != shift->ts.kind)
gfc_convert_type_warn (dim, &shift->ts, 2, 0);
@@ -474,10 +484,23 @@ gfc_resolve_eoshift (gfc_expr * f, gfc_expr * array,
if (boundary && boundary->rank > 0)
n = n | 2;
- /* Convert dim to the same type as shift, so we don't need quite so many
- variations. */
- if (dim != NULL && dim->ts.kind != shift->ts.kind)
- gfc_convert_type_warn (dim, &shift->ts, 2, 0);
+ /* Convert shift to at least gfc_default_integer_kind, so we don't need
+ kind=1 and kind=2 versions of the library functions. */
+ if (shift->ts.kind < gfc_default_integer_kind)
+ {
+ gfc_typespec ts;
+ ts.type = BT_INTEGER;
+ ts.kind = gfc_default_integer_kind;
+ gfc_convert_type_warn (shift, &ts, 2, 0);
+ }
+
+ if (dim != NULL)
+ {
+ gfc_resolve_dim_arg (dim);
+ /* Convert dim to shift's kind, so we don't need so many variations. */
+ if (dim->ts.kind != shift->ts.kind)
+ gfc_convert_type_warn (dim, &shift->ts, 2, 0);
+ }
f->value.function.name =
gfc_get_string (PREFIX("eoshift%d_%d"), n, shift->ts.kind);
@@ -921,7 +944,7 @@ gfc_resolve_maxloc (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
else
{
f->rank = array->rank - 1;
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
}
name = mask ? "mmaxloc" : "maxloc";
@@ -940,7 +963,7 @@ gfc_resolve_maxval (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
if (dim != NULL)
{
f->rank = array->rank - 1;
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
}
f->value.function.name =
@@ -982,7 +1005,7 @@ gfc_resolve_minloc (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
else
{
f->rank = array->rank - 1;
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
}
name = mask ? "mminloc" : "minloc";
@@ -1001,7 +1024,7 @@ gfc_resolve_minval (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
if (dim != NULL)
{
f->rank = array->rank - 1;
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
}
f->value.function.name =
@@ -1098,7 +1121,7 @@ gfc_resolve_product (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
if (dim != NULL)
{
f->rank = array->rank - 1;
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
}
f->value.function.name =
@@ -1341,7 +1364,7 @@ gfc_resolve_spread (gfc_expr * f, gfc_expr * source,
f->rank = source->rank + 1;
f->value.function.name = PREFIX("spread");
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
gfc_resolve_index (ncopies, 1);
}
@@ -1388,7 +1411,7 @@ gfc_resolve_sum (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
if (dim != NULL)
{
f->rank = array->rank - 1;
- gfc_resolve_index (dim, 1);
+ gfc_resolve_dim_arg (dim);
}
f->value.function.name =