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

            Bug ID: 126478
           Summary: Bogus error for coarray ALLOCATE with MOLD= or SOURCE=
                    specifier
           Product: gcc
           Version: 16.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dobonachea at lbl dot gov
                CC: damian at archaeologic dot codes
  Target Milestone: ---

Created attachment 65164
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=65164&action=edit
ALLOCATE statement for an allocatable array coarray with a SOURCE= specifier

The ALLOCATE statement for an allocatable array coarray is not correctly parsed
with a MOLD= or SOURCE= specifier by GFortran 16.1.0.

The two demonstration programs below both compile and execute correctly with
NAG Fortran 7.2:

---------------------------------------------------------
cgpu$ cat coarrays_31.f90

program coarrays_31
    implicit none

    ! Declare an allocatable array coarray
    integer, allocatable, save :: arr_coarray(:)[:]
    integer :: i

    ! Allocate the coarray using a SOURCE= specifier.
    ! The array dimensions and values are taken from the array constructor.
    ! The explicit [*] defines the co-dimensions.
    allocate(arr_coarray[*], source=[(i * 10, i = 1, 5)])

    ! Verify the allocation state
    if (.not. allocated(arr_coarray)) then
        error stop "Error: arr_coarray was not allocated."
    end if

    ! Verify the inherited size and values
    if (size(arr_coarray) /= 5) then
        error stop "Error: array size does not match SOURCE."
    end if

    if (any(arr_coarray /= [10, 20, 30, 40, 50])) then
        error stop "Error: array values do not match SOURCE."
    end if

end program coarrays_31

cgpu$ gfortran -fcoarray=lib -c coarrays_31.f90    

coarrays_31.f90:11:25:

   11 |     allocate(arr_coarray[*], source=[(i * 10, i = 1, 5)])
      |                         1
Error: Array section designator, e.g. '(:)', is required besides the coarray
designator '[...]' at (1)

cgpu$ cat coarrays_32.f90     

program coarrays_32
    implicit none

    real, allocatable :: prototype(:,:)
    real, allocatable :: target_arr(:,:)[:]

    allocate(prototype(10:12, 20:23))

    allocate(target_arr[*], mold=prototype)

    if (.not. allocated(target_arr)) error stop "Allocation failed"

    deallocate(target_arr)
    deallocate(prototype)

end program coarrays_32

cgpu$ gfortran -fcoarray=lib -c coarrays_32.f90 

coarrays_32.f90:9:24:

    9 |     allocate(target_arr[*], mold=prototype)
      |                        1
Error: Array section designator, e.g. '(:)', is required besides the coarray
designator '[...]' at (1)

cgpu$ gfortran --version

GNU Fortran (GCC) 16.1.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.

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

The error messages asking for an "Array section designator" (grammatically, an
allocate-shape-spec-list) are incorrect. Redundantly providing the *optional*
explicit array bounds is an effective workaround to the defect, but that is
*not* required by Fortran specification.

The relevant specification text from Fortran 2023, subclause 9.7.1.1: (where
R933 is corrected as per J3/25-167)

R929 allocate-stmt is ALLOCATE ( [ type-spec :: ] allocation-list \
                                 [ , alloc-opt-list ] )

R930 alloc-opt is ERRMSG = errmsg-variable
               or MOLD = source-expr
               or SOURCE = source-expr
               or STAT = stat-variable

R933 allocation is allocate-object [ ( allocate-shape-spec-list ) ] \
                                   [ lbracket allocate-coarray-spec rbracket ]
            or allocate-object ( [ lower-bounds-expr : ] upper-bounds-expr ) \
                                   [ lbracket allocate-coarray-spec rbracket ]

C943 (R929) If an allocate-object is an array, either allocate-shape-spec-list
            or upper-bounds-expr shall appear in its allocation, 
            or source-expr shall appear in the ALLOCATE statement and 
            have the same rank as the allocate-object.

The final clause of C943 specifies that neither allocate-shape-spec-list nor
upper-bounds-expr is required when the SOURCE= or MOLD= specifiers are
provided. That is, in fact, the sole purpose of the MOLD= specifier.

Reply via email to