Issue 122216
Summary [Flang] `transfer` of a derived type with a pointer component
Labels flang:runtime
Assignees
Reporter kawashima-fj
    When an object of a derived type with a pointer component is used as source of the `transfer` function, the result object has a size of the pointee but contains the pointer address .

```fortran
    type :: box
        type(data), pointer :: ptr
    end type

    type(box) :: box1

    dest = transfer(box1, dest)
```

Full reproducer:

```fortran
program main

 use, intrinsic :: iso_c_binding
    use, intrinsic :: iso_fortran_env
 implicit none

    type :: data
        integer(kind=4), dimension(10) :: array
    end type

    type :: box
        type(data), pointer :: ptr
 end type

    integer :: i, len
    integer(kind=4), pointer :: ptr1
 type(data), target :: data1
    type(box) :: box1
    integer(kind=4), dimension(:), allocatable :: dest

    do i = 1, 10
        data1%array(i) = i
    end do
    box1%ptr => data1
    len = size(transfer(box1, dest))
    allocate(dest(len))
    dest = transfer(box1, dest)

 write(6, *) '# len'
    write(6, '(I4)') len
    write(6, *) '# ptr1 data1 box1'
    write(6, '(I4)') storage_size(ptr1)
    write(6, '(I4)') storage_size(data1)
    write(6, '(I4)') storage_size(box1)
    write(6, *) '# transfer'
    write(6, '(I4)') storage_size(transfer(box1, dest))
 write(6, '(I4)') size(transfer(box1, dest))
    write(6, *) '# dest'
 write(6, '(I4)') storage_size(dest)
    write(6, '(I4)') size(dest)
 write(6, *) '# data1'
    write(*, '(Z17.16)') transfer(c_loc(data1), 0_int64)
    write(6, *) '# array'
    do i = 1, len
        write(*, '(Z9.8)') dest(i)
    end do

end program
```

Output of Flang (20.0.0git f4230b4332262dffb0bd3b7a2f8d6deb2e96488e) on AArch64:

```
 # len                 
  10                   
 # ptr1 data1 box1     
 32
 320
 320  **(3)**
 # transfer
  32
  10
 # dest
  32
  10 **(1)**
 # data1
 0000AAAACC920580
 # array
 CC920580  **(2)**
 0000AAAA **(2)**
 00000028
 00000000
 0134D94F
 01012A00
 CC91E7D0
 0000AAAA
 00000000
 00000000
```

Please see (1) and (2). (1) `size(transfer(box1, dest))` is 10, which is the size of the pointee array. (2) `dest(1)`+`dest(2)` is an address.

Output of GFortran (13.2.0) on AArch64:

```
 # len
   2
 # ptr1 data1 box1
  32
 320
  64 **(3)**
 # transfer
  32
   2  **(1)**
 # dest
  32
   2
 # data1
 0000FFFFF67F9728
 # array
 F67F9728  **(2)**
 0000FFFF  **(2)**
```

In GFortran, (1) `size(transfer(box1, dest))` is 64, which is the size of an address.

The Fortran standards defines:

> **Result Value.** If the physical representation of the result has the same length as that of SOURCE, the physical representation of the result is that of SOURCE.

Though I don't know what "physical representation" exactly means, the result of GFortran seems correct. At least, the current result of Flang is inconsistent (size is that of pointee but content is a pointer).

Also, (3) `storage_size(box1)` differs. Flang includes the pointee but GFortran includes only the pointer itself.

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to