https://gcc.gnu.org/g:9f9ef0ebf25764537f6f879fb48df82589829619
commit r17-5281-g9f9ef0ebf25764537f6f879fb48df82589829619 Author: Jerry DeLisle <[email protected]> Date: Sat Oct 17 09:59:15 2026 -0700 fortran: Pass ERRMSG= of collective subroutines by reference With -fcoarray=lib, CO_BROADCAST, CO_MAX, CO_MIN, CO_REDUCE and CO_SUM passed the ERRMSG= variable by value instead of its address, so the library received the string length where it expected the pointer and crashed when it set ERRMSG=, e.g. when an image of the team had stopped. Convert it with gfc_conv_expr_reference, as the image control statements do. Assisted-by: Claude Opus 5.5 gcc/fortran/ChangeLog: * trans-intrinsic.cc (conv_co_collective): Pass errmsg by reference. gcc/testsuite/ChangeLog: * gfortran.dg/coarray_collectives_6.f90: Expect the address of errmsg. * gfortran.dg/coarray_collectives_12.f90: Likewise. * gfortran.dg/coarray_collectives_16.f90: Likewise. Diff: --- gcc/fortran/trans-intrinsic.cc | 2 +- gcc/testsuite/gfortran.dg/coarray_collectives_12.f90 | 6 +++--- gcc/testsuite/gfortran.dg/coarray_collectives_16.f90 | 6 +++--- gcc/testsuite/gfortran.dg/coarray_collectives_6.f90 | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc index fe271609671d..b39216f527e0 100644 --- a/gcc/fortran/trans-intrinsic.cc +++ b/gcc/fortran/trans-intrinsic.cc @@ -12606,7 +12606,7 @@ conv_co_collective (gfc_code *code) if (errmsg_expr) { gfc_init_se (&argse, NULL); - gfc_conv_expr (&argse, errmsg_expr); + gfc_conv_expr_reference (&argse, errmsg_expr); gfc_add_block_to_block (&block, &argse.pre); gfc_add_block_to_block (&post_block, &argse.post); errmsg = argse.expr; diff --git a/gcc/testsuite/gfortran.dg/coarray_collectives_12.f90 b/gcc/testsuite/gfortran.dg/coarray_collectives_12.f90 index 2d8a39a9084b..9fed35a3768f 100644 --- a/gcc/testsuite/gfortran.dg/coarray_collectives_12.f90 +++ b/gcc/testsuite/gfortran.dg/coarray_collectives_12.f90 @@ -20,6 +20,6 @@ program test call co_broadcast(val3, source_image=res,stat=stat3, errmsg=errmesg3) end program test -! { dg-final { scan-tree-dump-times "_gfortran_caf_co_broadcast \\(&desc.., _gfortran_caf_num_images \\(0B, 0B\\), &stat1, errmesg1, 6\\);" 1 "original" } } -! { dg-final { scan-tree-dump-times "_gfortran_caf_co_broadcast \\(&val2, 4, &stat2, errmesg2, 7\\);" 1 "original" } } -! { dg-final { scan-tree-dump-times "_gfortran_caf_co_broadcast \\(&desc.., res, &stat3, errmesg3, 8\\);" 1 "original" } } +! { dg-final { scan-tree-dump-times "_gfortran_caf_co_broadcast \\(&desc.., _gfortran_caf_num_images \\(0B, 0B\\), &stat1, &errmesg1, 6\\);" 1 "original" } } +! { dg-final { scan-tree-dump-times "_gfortran_caf_co_broadcast \\(&val2, 4, &stat2, &errmesg2, 7\\);" 1 "original" } } +! { dg-final { scan-tree-dump-times "_gfortran_caf_co_broadcast \\(&desc.., res, &stat3, &errmesg3, 8\\);" 1 "original" } } diff --git a/gcc/testsuite/gfortran.dg/coarray_collectives_16.f90 b/gcc/testsuite/gfortran.dg/coarray_collectives_16.f90 index 05a135012d8f..ad4041add326 100644 --- a/gcc/testsuite/gfortran.dg/coarray_collectives_16.f90 +++ b/gcc/testsuite/gfortran.dg/coarray_collectives_16.f90 @@ -33,6 +33,6 @@ contains end function hc end program test -! { dg-final { scan-tree-dump-times "_gfortran_caf_co_reduce \\(&desc.., fr, 4, _gfortran_caf_num_images \\(0B, 0B\\), &stat1, errmesg1, 0, 6\\);" 1 "original" } } -! { dg-final { scan-tree-dump-times "_gfortran_caf_co_reduce \\(&val2, gz, 0, 4, &stat2, errmesg2, 0, 7\\);" 1 "original" } } -! { dg-final { scan-tree-dump-times "_gfortran_caf_co_reduce \\(&desc.., hc, 1, res, &stat3, errmesg3, 99, 8\\);" 1 "original" } } +! { dg-final { scan-tree-dump-times "_gfortran_caf_co_reduce \\(&desc.., fr, 4, _gfortran_caf_num_images \\(0B, 0B\\), &stat1, &errmesg1, 0, 6\\);" 1 "original" } } +! { dg-final { scan-tree-dump-times "_gfortran_caf_co_reduce \\(&val2, gz, 0, 4, &stat2, &errmesg2, 0, 7\\);" 1 "original" } } +! { dg-final { scan-tree-dump-times "_gfortran_caf_co_reduce \\(&desc.., hc, 1, res, &stat3, &errmesg3, 99, 8\\);" 1 "original" } } diff --git a/gcc/testsuite/gfortran.dg/coarray_collectives_6.f90 b/gcc/testsuite/gfortran.dg/coarray_collectives_6.f90 index af728287242c..3119336125d6 100644 --- a/gcc/testsuite/gfortran.dg/coarray_collectives_6.f90 +++ b/gcc/testsuite/gfortran.dg/coarray_collectives_6.f90 @@ -20,6 +20,6 @@ program test call co_min(val3, result_image=res,stat=stat3, errmsg=errmesg3) end program test -! { dg-final { scan-tree-dump-times "_gfortran_caf_co_max \\(&desc.., 0, &stat1, errmesg1, 0, 6\\);" 1 "original" } } -! { dg-final { scan-tree-dump-times "_gfortran_caf_co_sum \\(&val2, 4, &stat2, errmesg2, 7\\);" 1 "original" } } -! { dg-final { scan-tree-dump-times "_gfortran_caf_co_min \\(&desc.., res, &stat3, errmesg3, 99, 8\\);" 1 "original" } } +! { dg-final { scan-tree-dump-times "_gfortran_caf_co_max \\(&desc.., 0, &stat1, &errmesg1, 0, 6\\);" 1 "original" } } +! { dg-final { scan-tree-dump-times "_gfortran_caf_co_sum \\(&val2, 4, &stat2, &errmesg2, 7\\);" 1 "original" } } +! { dg-final { scan-tree-dump-times "_gfortran_caf_co_min \\(&desc.., res, &stat3, &errmesg3, 99, 8\\);" 1 "original" } }
