This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch, fortran] Fix PR 83316
- From: Thomas Koenig <tkoenig at netcologne dot de>
- To: "fortran at gcc dot gnu dot org" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 8 Dec 2017 19:42:21 +0100
- Subject: [patch, fortran] Fix PR 83316
- Authentication-results: sourceware.org; auth=none
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 <tkoenig@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 <tkoenig@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