aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2017-12-03 20:14:05 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2017-12-03 20:14:05 +0000
commit0ac7425470a37554aa4dd017afb5f90b7328c9b0 (patch)
treeb31908b5003acf7307242caf1ae5698a3d2a3fb9 /gcc/fortran
parentaf5ad1e2e56a91db15c1f714f5f513ad54a07eeb (diff)
downloadgcc-0ac7425470a37554aa4dd017afb5f90b7328c9b0.zip
gcc-0ac7425470a37554aa4dd017afb5f90b7328c9b0.tar.gz
gcc-0ac7425470a37554aa4dd017afb5f90b7328c9b0.tar.bz2
re PR fortran/36313 ([F03] {MIN,MAX}{LOC,VAL} should accept character arguments)
2017-12-03 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/36313 * check.c (gfc_check_minval_maxval): Use int_orLreal_or_char_check_f2003 for array argument. * iresolve.c (gfc_resolve_maxval): Insert number in function name for character arguments. (gfc_resolve_minval): Likewise. * trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc): Fix comment. (gfc_conv_intrinsic_minmaxval): Resort arguments and call library function if dealing with a character function. 2017-12-03 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/36313 * Makefile.am: Add new files for character-valued maxval and minval. * Makefile.in: Regenerated. * gfortran.map: Add new functions. * m4/iforeach-s2.m4: New file. * m4/ifunction-s2.m4: New file. * m4/iparm.m4: Add intitval for minval and maxval. * m4/maxval0s.m4: New file. * m4/maxval1s.m4: New file. * m4/minval0s.m4: New file. * m4/minval1s.m4: New file. * generated/maxval0_s1.c: New file. * generated/maxval0_s4.c: New file. * generated/maxval1_s1.c: New file. * generated/maxval1_s4.c: New file. * generated/minval0_s1.c: New file. * generated/minval0_s4.c: New file. * generated/minval1_s1.c: New file. * generated/minval1_s4.c: New file. 2017-12-03 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/36313 * gfortran.dg/maxval_char_1.f90: New test. * gfortran.dg/maxval_char_2.f90: New test. * gfortran.dg/maxval_char_3.f90: New test. * gfortran.dg/maxval_char_4.f90: New test. * gfortran.dg/minval_char_1.f90: New test. * gfortran.dg/minval_char_2.f90: New test. * gfortran.dg/minval_char_3.f90: New test. * gfortran.dg/minval_char_4.f90: New test. From-SVN: r255367
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog13
-rw-r--r--gcc/fortran/check.c2
-rw-r--r--gcc/fortran/iresolve.c22
-rw-r--r--gcc/fortran/trans-intrinsic.c32
4 files changed, 59 insertions, 10 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index e5865dc..e0dd795 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,16 @@
+2017-12-03 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/36313
+ * check.c (gfc_check_minval_maxval): Use
+ int_orLreal_or_char_check_f2003 for array argument.
+ * iresolve.c (gfc_resolve_maxval): Insert number in
+ function name for character arguments.
+ (gfc_resolve_minval): Likewise.
+ * trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc):
+ Fix comment.
+ (gfc_conv_intrinsic_minmaxval): Resort arguments and call library
+ function if dealing with a character function.
+
2017-12-01 Qing Zhao <qing.zhao@oracle.com>
* decl.c (gfc_get_pdt_instance): Adjust the call to sprintf
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index 2928172..eda7407 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -3317,7 +3317,7 @@ check_reduction (gfc_actual_arglist *ap)
bool
gfc_check_minval_maxval (gfc_actual_arglist *ap)
{
- if (!int_or_real_check (ap->expr, 0)
+ if (!int_or_real_or_char_check_f2003 (ap->expr, 0)
|| !array_check (ap->expr, 0))
return false;
diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c
index be1c35b..3226a88 100644
--- a/gcc/fortran/iresolve.c
+++ b/gcc/fortran/iresolve.c
@@ -1823,9 +1823,14 @@ gfc_resolve_maxval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
else
name = "maxval";
- f->value.function.name
- = gfc_get_string (PREFIX ("%s_%c%d"), name,
- gfc_type_letter (array->ts.type), array->ts.kind);
+ if (array->ts.type != BT_CHARACTER)
+ f->value.function.name
+ = gfc_get_string (PREFIX ("%s_%c%d"), name,
+ gfc_type_letter (array->ts.type), array->ts.kind);
+ else
+ f->value.function.name
+ = gfc_get_string (PREFIX ("%s%d_%c%d"), name, f->rank != 0,
+ gfc_type_letter (array->ts.type), array->ts.kind);
}
@@ -2023,9 +2028,14 @@ gfc_resolve_minval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
else
name = "minval";
- f->value.function.name
- = gfc_get_string (PREFIX ("%s_%c%d"), name,
- gfc_type_letter (array->ts.type), array->ts.kind);
+ if (array->ts.type != BT_CHARACTER)
+ f->value.function.name
+ = gfc_get_string (PREFIX ("%s_%c%d"), name,
+ gfc_type_letter (array->ts.type), array->ts.kind);
+ else
+ f->value.function.name
+ = gfc_get_string (PREFIX ("%s%d_%c%d"), name, f->rank != 0,
+ gfc_type_letter (array->ts.type), array->ts.kind);
}
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 90d5e59..c4aad1d 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -4571,7 +4571,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, enum tree_code op)
actual = expr->value.function.actual;
arrayexpr = actual->expr;
- /* Special case for character maxval. Remove unneeded actual
+ /* Special case for character maxloc. Remove unneeded actual
arguments, then call a library function. */
if (arrayexpr->ts.type == BT_CHARACTER)
@@ -5039,6 +5039,34 @@ gfc_conv_intrinsic_minmaxval (gfc_se * se, gfc_expr * expr, enum tree_code op)
return;
}
+ actual = expr->value.function.actual;
+ arrayexpr = actual->expr;
+
+ if (arrayexpr->ts.type == BT_CHARACTER)
+ {
+ gfc_actual_arglist *a2, *a3;
+ a2 = actual->next; /* dim */
+ a3 = a2->next; /* mask */
+ if (a2->expr == NULL || expr->rank == 0)
+ {
+ if (a3->expr == NULL)
+ actual->next = NULL;
+ else
+ {
+ actual->next = a3;
+ a2->next = NULL;
+ }
+ gfc_free_actual_arglist (a2);
+ }
+ else
+ if (a3->expr == NULL)
+ {
+ a2->next = NULL;
+ gfc_free_actual_arglist (a3);
+ }
+ gfc_conv_intrinsic_funcall (se, expr);
+ return;
+ }
type = gfc_typenode_for_spec (&expr->ts);
/* Initialize the result. */
limit = gfc_create_var (type, "limit");
@@ -5087,8 +5115,6 @@ gfc_conv_intrinsic_minmaxval (gfc_se * se, gfc_expr * expr, enum tree_code op)
gfc_add_modify (&se->pre, limit, tmp);
/* Walk the arguments. */
- actual = expr->value.function.actual;
- arrayexpr = actual->expr;
arrayss = gfc_walk_expr (arrayexpr);
gcc_assert (arrayss != gfc_ss_terminator);