Hi Jerry, hi all,

sorry for the slow patch review. I also still want to review your other inquire patch.

Jerry DeLisle wrote:
The fundamental problem: if the variable containing the unit number in an INQUIRE statement is of type KIND greater than 4 and the value is outside the range of a KIND=4 we cannot test for it within the run-time library. Unit numbers are passed to the run-time in the IOPARM structures as a KIND=4. KIND=8 are cast into the KIND=4. The test case gfortran.dg/negative_unit_int8.f illustrates a case where a bogus unit number can get passed to the library.


Regression tested on x86-64 and Joost's case in the PR now works as expected.
OK for trunk?

Mostly OK, however, some remarks are below.

2015-01-18  Jerry DeLisle <jvdeli...@gcc.gnu.org>

    PR fortran/61933
    * trans-io.c (set_parameter_value): Delete use of has_iostat.
    Redefine to not generate any runtime error check calls.
    (set_parameter_value_chk): Rename of the former
    set_parameter_value with the runtimr error checks and fix
    whitespace. (gfc_trans_io_inquire_check): New function that
    builds a runtime conditional block to set the INQUIRE
    common parameter block unit number to -2 when unit numbers
    exceed positive KIND=4 limits. (set_parameter_value_inquire):
    New function that builds the conditional expressions and calls
    gfc_trans_io_inquire_check. (gfc_trans_open): Whitespace. For
    unit, use the renamed set_parameter_value_chk.
    (gfc_trans_close): Likewise use renamed function.
    (build_filepos): Whitespace and use renamed function.
    (gfc_trans_inquire): Whitespace and for unit use
    set_parameter_value and set_parameter_value_inquire.
    (gfc_trans_wait): Remove p->iostat from call to
    set_parameter_value. Use new set_parameter_value_chk for unit.
    (build_dt): Use the new set_parameter_value without p->iostat
    and fix whitespace. Use set_parameter_value_chk for unit.

2015-01-18  Jerry DeLisle <jvdeli...@gcc.gnu.org>

    PR libgfortran/61933
    * io/inquire.c (inquire_via_unit): Set existing to true for
    any negative unit that is currently connected and any positive
    units within range of KIND=4 value.  The unit value for any out
    of range case that may occur if the user is using a KIND=8 will
    have been set to -2 which is reserved and can never be opened,
    and therefore the unit does not exist.
[...]
+  /* The unit number -2 is reserved.  No units can ever have this
+     value.  It is used here to signal to the runtime library that the
+     inquire unit number is outside the allowable range and so cannot
+     exist.  It is needed when -fdefault-integer-8 is uesed.  */

I don't know where this number is used, but I really should be a #define; if it is shared with libgfortran, it belongs to libgfortran.h. You wrote that -1 is also reserved and used; is the -1 somewhere defined? [Disclaimer: I have only browsed the other patch and do not recall whether it add, handles or #defines -1 - or whether -1 is already defined somewhere.]

+      /* UNIT numbers should be greater than zero.  */
+      i = gfc_validate_kind (BT_INTEGER, 4, false);
+      cond = build2_loc (input_location, LT_EXPR, boolean_type_node,
+                             se.expr,
+                             fold_convert (TREE_TYPE (se.expr),
+                             integer_zero_node));
+      gfc_trans_io_inquire_check (cond, var, &se.pre);
+
+      /* UNIT numbers should be less than the max.  */
+      val = gfc_conv_mpz_to_tree (gfc_integer_kinds[i].huge, 4);
+      cond = build2_loc (input_location, GT_EXPR, boolean_type_node,
+                             se.expr,
+                             fold_convert (TREE_TYPE (se.expr), val));
+      gfc_trans_io_inquire_check (cond, var, &se.pre);

The conditions could be combined with a fold_build2_loc(...,TRUTH_AND_EXPR,...).

Thanks for the patch!

Cheers,

Tobias

Reply via email to