[PATCH] fortran: [PR126777] Fix TEAM_NUMBER under -fcoarray=single, and lib
Jerry DeLisle <[email protected]>
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.fortran |
|---|---|
| Message-ID | <[email protected]> |
See attached patch. Assisted-by: Claude Pro Opus 5 I think this is fairly simple. Claude has identified some other issues not addressed here. I will submit a new PR once those are sorted out. Regression tested on x86_64. OK for mainline. --- fortran: [PR126777] Fix TEAM_NUMBER under -fcoarray=single and lib Assisted-by: Claude Opus 5 Two pre-existing defects found while fixing PR126777. conv_intrinsic_team_number returned the team handle itself as the team number under -fcoarray=single. FORM TEAM is a no-op there and GET_TEAM() folds to a null team_type, so the result was 0 rather than -1. Only the initial team exists, so always return -1. _gfortran_caf_team_number dereferenced its team handle unconditionally. The front end passes a null handle for the no-argument form, meaning the current team, so TEAM_NUMBER() segfaulted with -fcoarray=lib -lcaf_single. Handle null as shmem.c already does. intrinsic.texi documented IMAGE_INDEX as an inquiry function; it is registered CLASS_TRANSFORMATIONAL, like NUM_IMAGES and THIS_IMAGE. PR fortran/126777 gcc/fortran/ChangeLog: * intrinsic.texi (IMAGE_INDEX): Document as a transformational function, not an inquiry function. * trans-intrinsic.cc (conv_intrinsic_team_number): Always return -1 for -fcoarray=single, regardless of any TEAM argument. libgfortran/ChangeLog: * caf/single.c (_gfortran_caf_team_number): Treat a null team handle as the current team. gcc/testsuite/ChangeLog: * gfortran.dg/coarray/team_number_1.f90: New test. ---
PR126777-team-number-single-lib.patch
(text/x-patch, 4.6 KB)
From 09bc622a4276e2e68aa72d59652f158ed6f5fad0 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle <[email protected]> Date: Fri, 14 Aug 2026 15:53:28 -0700 Subject: [PATCH] fortran: [PR126777] Fix TEAM_NUMBER under -fcoarray=single and lib Assisted-by: Claude Opus 5 Two pre-existing defects found while fixing PR126777. conv_intrinsic_team_number returned the team handle itself as the team number under -fcoarray=single. FORM TEAM is a no-op there and GET_TEAM() folds to a null team_type, so the result was 0 rather than -1. Only the initial team exists, so always return -1. _gfortran_caf_team_number dereferenced its team handle unconditionally. The front end passes a null handle for the no-argument form, meaning the current team, so TEAM_NUMBER() segfaulted with -fcoarray=lib -lcaf_single. Handle null as shmem.c already does. intrinsic.texi documented IMAGE_INDEX as an inquiry function; it is registered CLASS_TRANSFORMATIONAL, like NUM_IMAGES and THIS_IMAGE. PR fortran/126777 gcc/fortran/ChangeLog: * intrinsic.texi (IMAGE_INDEX): Document as a transformational function, not an inquiry function. * trans-intrinsic.cc (conv_intrinsic_team_number): Always return -1 for -fcoarray=single, regardless of any TEAM argument. libgfortran/ChangeLog: * caf/single.c (_gfortran_caf_team_number): Treat a null team handle as the current team. gcc/testsuite/ChangeLog: * gfortran.dg/coarray/team_number_1.f90: New test. --- gcc/fortran/intrinsic.texi | 2 +- gcc/fortran/trans-intrinsic.cc | 17 +++++------------ .../gfortran.dg/coarray/team_number_1.f90 | 19 +++++++++++++++++++ libgfortran/caf/single.c | 2 +- 4 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/coarray/team_number_1.f90 diff --git a/gcc/fortran/intrinsic.texi b/gcc/fortran/intrinsic.texi index 36efaadda45..7fa08f4ed3b 100644 --- a/gcc/fortran/intrinsic.texi +++ b/gcc/fortran/intrinsic.texi @@ -8781,7 +8781,7 @@ GNU extension Returns the image index belonging to a cosubscript. @item @emph{Class}: -Inquiry function. +Transformational function @item @emph{Arguments}: @multitable @columnfractions .15 .70 diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc index 5e3681da467..78710db03f8 100644 --- a/gcc/fortran/trans-intrinsic.cc +++ b/gcc/fortran/trans-intrinsic.cc @@ -2099,20 +2099,13 @@ conv_intrinsic_team_number (gfc_se *se, gfc_expr *expr) args = XALLOCAVEC (tree, num_args); gfc_conv_intrinsic_function_args (se, expr, args, num_args); - if (flag_coarray == - GFC_FCOARRAY_SINGLE && expr->value.function.actual->expr) - tmp = gfc_evaluate_now (args[0], &se->pre); - else if (flag_coarray == GFC_FCOARRAY_SINGLE) - { - // the value -1 represents that no team has been created yet - tmp = build_int_cst (integer_type_node, -1); - } - else if (flag_coarray == GFC_FCOARRAY_LIB && expr->value.function.actual->expr) - tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_team_number, 1, - args[0]); + if (flag_coarray == GFC_FCOARRAY_SINGLE) + /* Only the initial team exists, and its team number is -1. */ + tmp = build_int_cst (integer_type_node, -1); else if (flag_coarray == GFC_FCOARRAY_LIB) tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_team_number, 1, - null_pointer_node); + expr->value.function.actual->expr + ? args[0] : null_pointer_node); else gcc_unreachable (); diff --git a/gcc/testsuite/gfortran.dg/coarray/team_number_1.f90 b/gcc/testsuite/gfortran.dg/coarray/team_number_1.f90 new file mode 100644 index 00000000000..c69ac1e676b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray/team_number_1.f90 @@ -0,0 +1,19 @@ +! { dg-do run } +! +! PR fortran/126777 +! +! TEAM_NUMBER() with no argument passes a null team handle, meaning the +! current team. libcaf_single dereferenced it and crashed. + +program team_number_1 + use iso_fortran_env, only : team_type + implicit none + + type(team_type) :: t + + if (team_number () /= -1) stop 1 + + t = get_team () + if (team_number (t) /= -1) stop 2 + if (team_number (get_team ()) /= -1) stop 3 +end program team_number_1 diff --git a/libgfortran/caf/single.c b/libgfortran/caf/single.c index e48aaec6f05..730ab2d8aba 100644 --- a/libgfortran/caf/single.c +++ b/libgfortran/caf/single.c @@ -1129,7 +1129,7 @@ _gfortran_caf_sync_team (caf_team_t team __attribute__ ((unused)), int *stat, int _gfortran_caf_team_number (caf_team_t team) { - return ((caf_single_team_t) team)->team_no; + return team ? ((caf_single_team_t) team)->team_no : caf_team_stack->team_no; } caf_team_t -- 2.55.0