Hello world, the attached patch fixes a case where simplification wasn't done correctly for maxval and minval with character variables.
Regression-tested. OK for trunk? Regards Thomas 2017-12-08 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/83316 * arith.c (gfc_character2character): New function. * arith.h: Add prototype. * simplify.c (gfc_convert_constant): Handle character type. 2017-12-08 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/83316 * gfortran.dg/minval_char_5.f90: New test.
Index: arith.c =================================================================== --- arith.c (Revision 255181) +++ arith.c (Arbeitskopie) @@ -2514,7 +2514,19 @@ gfc_int2log (gfc_expr *src, int kind) return result; } +/* Convert character to character. We only use wide strings internally, + so we only set the kind. */ +gfc_expr * +gfc_character2character (gfc_expr *src, int kind) +{ + gfc_expr *result; + result = gfc_copy_expr (src); + result->ts.kind = kind; + + return result; +} + /* Helper function to set the representation in a Hollerith conversion. This assumes that the ts.type and ts.kind of the result have already been set. */ Index: arith.h =================================================================== --- arith.h (Revision 255181) +++ arith.h (Arbeitskopie) @@ -82,6 +82,7 @@ gfc_expr *gfc_hollerith2real (gfc_expr *, int); gfc_expr *gfc_hollerith2complex (gfc_expr *, int); gfc_expr *gfc_hollerith2character (gfc_expr *, int); gfc_expr *gfc_hollerith2logical (gfc_expr *, int); +gfc_expr *gfc_character2character (gfc_expr *, int); #endif /* GFC_ARITH_H */ Index: simplify.c =================================================================== --- simplify.c (Revision 255181) +++ simplify.c (Arbeitskopie) @@ -7130,6 +7130,13 @@ gfc_convert_constant (gfc_expr *e, bt type, int ki } break; + case BT_CHARACTER: + if (type == BT_CHARACTER) + f = gfc_character2character; + else + goto oops; + break; + default: oops: gfc_internal_error ("gfc_convert_constant(): Unexpected type");
! { dg-do run } ! PR fortran/83316 - this used to ICE program tminmaxval implicit none character(len=*), parameter :: b = "a" character(len=*), parameter :: e = "c" character(len=*), parameter :: s(3) = (/"a", "b", "c"/) if (minval(s) /= b) then call abort end if if (maxval(s) /= e) then call abort end if end program tminmaxval