From: Thomas Koenig Date: Sat, 9 Dec 2017 08:37:17 +0000 (+0000) Subject: re PR fortran/83316 (ICE: minval/maxval and characters) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b01fff4882f0c5d35a52e7001832e31c708fffd9;p=gcc.git re PR fortran/83316 (ICE: minval/maxval and characters) 2017-12-09 Thomas Koenig PR fortran/83316 * arith.c (gfc_character2character): New function. * arith.h: Add prototype. * simplify.c (gfc_convert_constant): Handle character type. 2017-12-09 Thomas Koenig PR fortran/83316 * gfortran.dg/minval_char_5.f90: New test. From-SVN: r255522 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b48bac45e16..a2be75ab4b3 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2017-12-09 Thomas Koenig + + PR fortran/83316 + * arith.c (gfc_character2character): New function. + * arith.h: Add prototype. + * simplify.c (gfc_convert_constant): Handle character type. + 2017-12-07 Martin Sebor PR c/81544 diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c index 3c75895e2ef..267306713f9 100644 --- a/gcc/fortran/arith.c +++ b/gcc/fortran/arith.c @@ -2514,6 +2514,18 @@ 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 diff --git a/gcc/fortran/arith.h b/gcc/fortran/arith.h index 9c623a42ab5..db042cc7651 100644 --- a/gcc/fortran/arith.h +++ b/gcc/fortran/arith.h @@ -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 */ diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index c7b7e1a8297..f11ea42c292 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -7130,6 +7130,13 @@ gfc_convert_constant (gfc_expr *e, bt type, int kind) } 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"); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cd6c927138b..99842f0622a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-12-09 Thomas Koenig + + PR fortran/83316 + * gfortran.dg/minval_char_5.f90: New test. + 2017-12-08 Jakub Jelinek PR rtl-optimization/83317 diff --git a/gcc/testsuite/gfortran.dg/minval_char_5.f90 b/gcc/testsuite/gfortran.dg/minval_char_5.f90 new file mode 100644 index 00000000000..5af344dc803 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/minval_char_5.f90 @@ -0,0 +1,18 @@ +! { 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