https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126776

            Bug ID: 126776
           Summary: CO_MIN/CO_MAX intrinsics not implemented for character
                    arguments
           Product: gcc
           Version: 16.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libfortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dobonachea at lbl dot gov
                CC: damian at archaeologic dot codes
  Target Milestone: ---

Created attachment 65286
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=65286&action=edit
Fortran source code testing CO_MIN and CO_MAX for character arg

The CO_MIN and CO_MAX intrinsics are not implemented for character-typed
arguments.

F2023 16.9.55 and 16.9.56 specifies the A argument for CO_MAX and CO_MIN:

> Arguments
>    A     shall be of type integer, real, or character. ...

Demonstration:

---------------------------------------------------------

cgpu$ cat co_char3.F90 
program test_co_char
  implicit none
  character(len=10) :: val_min, val_max

  ! Assign a unique character to each image
  ! char(65) is 'A' in ASCII.
  val_min = repeat(char(65 + (num_images() - this_image())), len(val_min))
  write (*,'(I2,A,A)') this_image(), ": initial val_min: ", val_min

  val_max = repeat(char(65 + this_image()), len(val_min))
  write (*,'(I2,A,A)') this_image(), ": initial val_max: ", val_max


  ! Find the minimum character across all images
  call co_min(val_min)

  ! Find the maximum character across all images
  call co_max(val_max)

  sync all
  ! Print the results from image 1
  if (this_image() == 1) then
    print *, "co_min result:    ", val_min
    print *, "co_max result:    ", val_max
  end if

end program


cgpu$ gfortran --version
GNU Fortran (GCC) 16.2.0
Copyright (C) 2026 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


cgpu$ gfortran -fcoarray=lib co_char.F90 -lcaf_shmem && env
GFORTRAN_NUM_IMAGES=1 ./a.out 
Fortran runtime error: min not available for type/kind combination
ERROR: Image 1(pid: 3759195) failed with signal 0, exitstatus 1.

cgpu$ gfortran -fcoarray=lib co_char.F90 -lcaf_shmem && env
GFORTRAN_NUM_IMAGES=4 ./a.out 
Fortran runtime error: min not available for type/kind combination
Fortran runtime error: Fortran runtime error: Fortran runtime error: min not
available for type/kind combinationmin not available for type/kind
combinationmin not available for type/kind combination


ERROR: Image 3(pid: 3759204) failed with signal 0, exitstatus 1.
ERROR: Image 2(pid: 3759203) failed with signal 0, exitstatus 1.
ERROR: Image 1(pid: 3759202) failed with signal 0, exitstatus 1.
ERROR: Image 4(pid: 3759205) failed with signal 0, exitstatus 1.


---------------------------------------------------------

Here is the correct answer, from flang version 23.1.0-rc2:

cgpu$ flang -fcoarray co_char3.F90 -L <redacted>/lib -lcaffeine-smp-seq
-lgasnet-smp-seq && env GASNET_PSHM_NODES=4 a.out 
warning: Support for multi image Fortran features is still experimental and in
development.
 2: initial val_min: CCCCCCCCCC
 3: initial val_min: BBBBBBBBBB
 2: initial val_max: CCCCCCCCCC
 3: initial val_max: DDDDDDDDDD
 1: initial val_min: DDDDDDDDDD
 1: initial val_max: BBBBBBBBBB
 4: initial val_min: AAAAAAAAAA
 4: initial val_max: EEEEEEEEEE
 co_min result:    AAAAAAAAAA
 co_max result:    EEEEEEEEEE

And from NAG 7.2:

headroom$ nagfor -coarray co_char3.F90 && env NAGFORTRAN_NUM_IMAGES=4 a.out 
NAG Fortran Compiler Release 7.2(Shin-Urayasu) Build 7238
[NAG Fortran Compiler normal termination]
 1: initial val_min: DDDDDDDDDD
 1: initial val_max: BBBBBBBBBB
 3: initial val_min: BBBBBBBBBB
 3: initial val_max: DDDDDDDDDD
 4: initial val_min: AAAAAAAAAA
 4: initial val_max: EEEEEEEEEE
 2: initial val_min: CCCCCCCCCC
 2: initial val_max: CCCCCCCCCC
 co_min result:    AAAAAAAAAA
 co_max result:    EEEEEEEEEE

Reply via email to