[Bug fortran/64137] Fortran FE builds invalid GENERIC
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64137 --- Comment #3 from Richard Biener rguenth at gcc dot gnu.org --- Author: rguenth Date: Tue Dec 2 08:50:57 2014 New Revision: 218259 URL: https://gcc.gnu.org/viewcvs?rev=218259root=gccview=rev Log: 2014-12-02 Richard Biener rguent...@suse.de PR fortran/64137 * trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc): Check proper expressions type, use proper type for computing -Huge - 1. Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/trans-intrinsic.c
[Bug fortran/64137] Fortran FE builds invalid GENERIC
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64137 Richard Biener rguenth at gcc dot gnu.org changed: What|Removed |Added Status|ASSIGNED|RESOLVED Resolution|--- |FIXED --- Comment #4 from Richard Biener rguenth at gcc dot gnu.org --- Fixed on trunk.
[Bug fortran/64137] Fortran FE builds invalid GENERIC
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64137 Richard Biener rguenth at gcc dot gnu.org changed: What|Removed |Added Status|UNCONFIRMED |ASSIGNED Last reconfirmed||2014-12-01 Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #1 from Richard Biener rguenth at gcc dot gnu.org --- Index: gcc/fortran/trans-intrinsic.c === --- gcc/fortran/trans-intrinsic.c (revision 218211) +++ gcc/fortran/trans-intrinsic.c (working copy) @@ -3729,7 +3729,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * s possible value is HUGE in both cases. */ if (op == GT_EXPR) tmp = fold_build1_loc (input_location, NEGATE_EXPR, TREE_TYPE (tmp), tmp); - if (op == GT_EXPR expr-ts.type == BT_INTEGER) + if (op == GT_EXPR arrayexpr-ts.type == BT_INTEGER) tmp = fold_build2_loc (input_location, MINUS_EXPR, TREE_TYPE (tmp), tmp, build_int_cst (type, 1)); works for me. So I suppose this is a wrong-code bug as we shouldn't have subtracted 1 off -Huge (what's that anyway?) But then is integer -Huge C INT_MIN + 1? Anyway, testing the above.
[Bug fortran/64137] Fortran FE builds invalid GENERIC
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64137 Tobias Burnus burnus at gcc dot gnu.org changed: What|Removed |Added CC||burnus at gcc dot gnu.org --- Comment #2 from Tobias Burnus burnus at gcc dot gnu.org --- (In reply to Richard Biener from comment #1) - if (op == GT_EXPR expr-ts.type == BT_INTEGER) + if (op == GT_EXPR arrayexpr-ts.type == BT_INTEGER) works for me. Looks good to me. Thanks for the patch and debugging! [Seems to be a copy'n'paste error from gfc_conv_intrinsic_minmaxval, which returns the value (= int or float) such that expr-ts.type works; the code in gfc_conv_intrinsic_minmaxloc return a location which is always an int.] So I suppose this is a wrong-code bug as we shouldn't have subtracted 1 off -Huge (what's that anyway?) But then is integer -Huge C INT_MIN + 1? HUGE(variable) is a function which returns the largest possible value for that variable, i.e. MAX_INT for a default-kind integer or FLT_MAX for a default-kind real variable. For MAXLOC, one starts with val = smallest possible value, which is MIN_INT == -MAX_INT - 1 == -HUGE() - 1 for int or FLT_MIN == -HUGE() for real with -ffinite-math or otherwise -INF for reals.