Bug 125534 - ALLOCATE of parameterized derived-type array initializes only first element
Summary: ALLOCATE of parameterized derived-type array initializes only first element
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 16.0
: P3 normal
Target Milestone: ---
Assignee: Jerry DeLisle
URL:
Keywords: wrong-code
Depends on:
Blocks: PDT 125515
  Show dependency tree / graph
 
Reported: 2026-05-31 20:17 UTC by Jerry DeLisle
Modified: 2026-06-21 02:50 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2026-06-07 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jerry DeLisle 2026-05-31 20:17:09 UTC
When allocating an array of a parameterized derived type (PDT) that has allocatable components, gfortran initializes only the first element.  Accessing the allocatable components of any other element uses garbage pointers and crashes.

  module m
    implicit none
    integer, parameter :: default_real = kind(0.)
    type :: tensor_t(k)
      integer, kind :: k = default_real
      real(k), allocatable :: values_(:)
    end type
  end module

  program test
    use m
    implicit none
    integer, parameter :: n = 5
    type(tensor_t), allocatable :: a(:)
    integer :: i

    allocate (a(n))
    do i = 1, n
      a(i)%values_ = [real(i), real(i*2)]
    end do

    if (any (a(3)%values_ /= [3., 6.])) stop 1
  end program

  $ gfortran pdt_array_alloc_1.f90 && ./a.out

  The program crashes because a(2) through a(n) have
  uninitialized allocatable component pointers.  The
  program should run and exit cleanly.

An ugly one for sure.
Comment 1 GCC Commits 2026-06-07 19:30:30 UTC
The master branch has been updated by Jerry DeLisle <jvdelisle@gcc.gnu.org>:

https://gcc.gnu.org/g:81a0bec12189136350dbb43969743fab8b87a212

commit r17-1409-g81a0bec12189136350dbb43969743fab8b87a212
Author: Jerry DeLisle <jvdelisle@gcc.gnu.org>
Date:   Fri Jun 5 13:19:58 2026 -0700

    fortran: ALLOCATE of parameterized derived-type array initializes only first element
    
    gfc_trans_allocate passed expr->rank to gfc_allocate_pdt_comp and
    gfc_deallocate_pdt_comp for array allocations of parameterized derived
    types.  For an allocate-shape-spec expression (e.g. "allocate(a(n))"),
    expr->rank is 0 even though the symbol is an array; the rank is carried on
    the symbol rather than on the allocate expression.  With rank 0 the loop
    that initialises each element's allocatable components ran zero times, so
    only element zero was initialised.  Subsequent accesses to elements 1..N-1
    used garbage pointers and crashed.
    
    Fix: when se.expr is a GFC array descriptor, take the rank from the
    descriptor via GFC_TYPE_ARRAY_RANK instead of from expr->rank.  Apply the
    same correction to the CLASS path and to the matching deallocate calls in
    gfc_trans_deallocate.
    
    Assisted by: Claude Sonnet 4.6
    
            PR fortran/125534
    
    gcc/fortran/ChangeLog:
    
            * trans-stmt.cc (gfc_trans_allocate): Use GFC_TYPE_ARRAY_RANK from
            the GFC descriptor type when se.expr is a descriptor, rather than
            expr->rank, for the rank passed to gfc_allocate_pdt_comp.  Apply
            the same fix to the CLASS path.
            (gfc_trans_deallocate): Likewise for gfc_deallocate_pdt_comp.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/pdt_array_alloc_1.f90: New test.
Comment 2 GCC Commits 2026-06-15 16:30:43 UTC
The releases/gcc-16 branch has been updated by Jerry DeLisle <jvdelisle@gcc.gnu.org>:

https://gcc.gnu.org/g:5598624357ff22cdf28769550049732f3b7bb000

commit r16-9102-g5598624357ff22cdf28769550049732f3b7bb000
Author: Jerry DeLisle <jvdelisle@gcc.gnu.org>
Date:   Fri Jun 5 13:19:58 2026 -0700

    fortran: ALLOCATE of parameterized derived-type array initializes only first element
    
    gfc_trans_allocate passed expr->rank to gfc_allocate_pdt_comp and
    gfc_deallocate_pdt_comp for array allocations of parameterized derived
    types.  For an allocate-shape-spec expression (e.g. "allocate(a(n))"),
    expr->rank is 0 even though the symbol is an array; the rank is carried on
    the symbol rather than on the allocate expression.  With rank 0 the loop
    that initialises each element's allocatable components ran zero times, so
    only element zero was initialised.  Subsequent accesses to elements 1..N-1
    used garbage pointers and crashed.
    
    Fix: when se.expr is a GFC array descriptor, take the rank from the
    descriptor via GFC_TYPE_ARRAY_RANK instead of from expr->rank.  Apply the
    same correction to the CLASS path and to the matching deallocate calls in
    gfc_trans_deallocate.
    
    Assisted-by: Claude Sonnet 4.6
    
            PR fortran/125534
    
    gcc/fortran/ChangeLog:
    
            * trans-stmt.cc (gfc_trans_allocate): Use GFC_TYPE_ARRAY_RANK from
            the GFC descriptor type when se.expr is a descriptor, rather than
            expr->rank, for the rank passed to gfc_allocate_pdt_comp.  Apply
            the same fix to the CLASS path.
            (gfc_trans_deallocate): Likewise for gfc_deallocate_pdt_comp.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/pdt_array_alloc_1.f90: New test.
    
    (cherry picked from commit 5f12403a8ff7d2e8a62703aa33496b514cf6af3e)
Comment 3 Jerry DeLisle 2026-06-21 02:50:24 UTC
Closing