diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2017-12-03 20:14:05 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2017-12-03 20:14:05 +0000 |
commit | 0ac7425470a37554aa4dd017afb5f90b7328c9b0 (patch) | |
tree | b31908b5003acf7307242caf1ae5698a3d2a3fb9 /gcc/fortran | |
parent | af5ad1e2e56a91db15c1f714f5f513ad54a07eeb (diff) | |
download | gcc-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/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/fortran/check.c | 2 | ||||
-rw-r--r-- | gcc/fortran/iresolve.c | 22 | ||||
-rw-r--r-- | gcc/fortran/trans-intrinsic.c | 32 |
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); |