[Bug fortran/64137] Fortran FE builds invalid GENERIC

2014-12-02 Thread rguenth at gcc dot gnu.org
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

2014-12-02 Thread rguenth at gcc dot gnu.org
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

2014-12-01 Thread rguenth at gcc dot gnu.org
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

2014-12-01 Thread burnus at gcc dot gnu.org
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.