Hi all, To facilitate more complete Fortran 2018 failed images support, I'm particularly interested in interested in seeing PR 87939 eventually resolved (i.e., allow STAT= and ERRMSG= specifiers in FORM TEAM, CHANGE TEAM, SYNC TEAM, END TEAM, and CRITICAL statements). To get the ball rolling (I realize that the boat has been missed for this kind of change in GCC 9 trunk), I've attempted the following patch (which, since it was convenient to do while modifying FORM TEAM-related code, also adds the NEW_INDEX= specifier to the FORM TEAM statement as desired in PR 87326).
This is the first gfortran patch I've attempted, and I certainly could have made some noob mistakes, so verbose feedback would be appreciated. A few comments: * In resolve.c, the newly-added functions that type check STAT= and ERRMSG= arguments for FORM TEAM, CHANGE TEAM, and SYNC TEAM also add (previously-absent) type checking for their TEAM_TYPE arguments. If it's more appropriate, I could separate this change into its own PR. * The existing -fcoarray=lib implementation of CRITICAL acquires a LOCK on a lock variable on image 1 (in the current team). However, a CRITICAL statement stat-value of STAT_FAILED_IMAGE (i.e., the image that enter the CRITICAL construct failed) is analogous to the LOCK stat-value of STAT_UNLOCKED_FAILED_IMAGE (i.e., the image that acquired the lock failed---see section 11.6.11 (7 & 10) in Fortran 2018 draft N2146), whereas a LOCK STAT_FAILED_IMAGE means the image on which the lock variable resides has failed (no analog in the CRITICAL statement, which is oblivious to this underlying implementation). So in addition to adding the stat value STAT_UNLOCKED_FAILED_IMAGE to libgfortran.h & libcaf.h, I had CRITICAL swap a LOCK STAT_UNLOCKED_FAILED_IMAGE for STAT_FAILED_IMAGE, and (perhaps unimaginatively) a LOCK STAT_FAILED_IMAGE for STAT_UNLOCKED_FAILED_IMAGE (which, while it has no defined meaning for a CRITICAL statement, fits the definition of a "processor-dependent value other than STAT_FAILED_IMAGE"). * A couple negative tests for syntax errors (coarray_critical_2.f90 & team_end_2.f90) fail due to spurious "Error: Expecting END PROGRAM statement at (1)" errors that are also emitted by gfortran 8.2.0 as well. Thanks, -- Nathan frontend: 2019-01-16 Nathan Weeks <we...@iastate.edu> PR fortran/87939 PR fortran/87326 * gfortran.h: Add an additional gfc_expr member to struct gfc_code. * libcaf.h: Add support for STAT_UNLOCKED_FAILED_IMAGE. * match.c (gfc_match_critical): Add STAT= and ERRMSG=. (gfc_match_change_team): Likewise. (gfc_match_end_team): Likewise. (gfc_match_sync_team): Likewise. (gfc_match_form_team): Add STAT=, ERRMSG=, and NEW_INDEX=. * resolve.c (resolve_form_team): New. Type check team-variable argument in addition to new STAT= and ERRMSG= arguments. (resolve_change_sync_team): New. Adds type checking for team-value argument. (resolve_end_team): New. (resolve_critical): Add STAT= and ERRMSG=. * trans-decl.c (gfc_build_builtin_function_decls): Additional stat, errmsg, and errmsg_len arguments to _gfortran_caf_form_team(), _gfortran_caf_change_team(), _gfortran_caf_end_team(), and _gfortran_caf_sync_team(), and additional new_index argument to _gfortran_caf_form_team(). * trans-stmt.c (gfc_trans_form_team): Support STAT=, ERRMSG=, and NEW_INDEX=. (gfc_trans_change_team): Support STAT= and ERRMSG=. (gfc_trans_end_team): Likewise. (gfc_trans_sync_team): Likewise. (gfc_trans_critical): Likewise. Also support assigning STAT_FAILED_IMAGE to a stat-variable. libgfortran: 2019-01-16 Nathan Weeks <we...@iastate.edu> PR fortran/87939 * libgfortran.h: Add support for STAT_UNLOCKED_FAILED_IMAGE testsuite: 2019-01-16 Nathan Weeks <we...@iastate.edu> PR fortran/87939 PR fortran/87326 * gfortran.dg/coarray_critical_2.f90: New test * gfortran.dg/coarray_critical_3.f90: New test * gfortran.dg/coarray_critical_4.f90: New test * gfortran.dg/team_change_2.f90: New test * gfortran.dg/team_change_3.f90: New test * gfortran.dg/team_end_2.f90: New test * gfortran.dg/team_end_3.f90: New test * gfortran.dg/team_form_2.f90: New test * gfortran.dg/team_form_3.f90: New test * gfortran.dg/team_sync_1.f90: New test * gfortran.dg/team_sync_2.f90: New test
stat-errmsg-new_index.diff
Description: Binary data