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-Tag: upstream/12.2.0~34963 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b01fff4882f0c5d35a52e7001832e31c708fffd9;p=platform%2Fupstream%2Fgcc.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 b48bac4..a2be75a 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 3c75895..2673067 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 9c623a4..db042cc 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 c7b7e1a..f11ea42 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 cd6c927..99842f0 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 0000000..5af344d --- /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