Fixes are available
APAR status
Closed as program error.
Error description
The following test case should produce same outputs for each referenced memory address. But if the following condition meets, the last call references a different memory address. a) The variable x is of a derived type which contains components that have the attribute 'allocatable'. b) The value returned by c_loc(x) is used directly (without being saved in a variable) as an actual argument to a C function (or subroutine) with a Fortran interface. -bash-4.1$ cat a.f90 module c type :: t1 integer :: i end type type :: t2 integer, allocatable :: i !!===> this fails!! ! integer, pointer :: i !!===> this works around!! end type end module program a use, intrinsic :: iso_c_binding use b use c implicit none type(c_ptr) :: p1, p2 type(t1), target :: x1 type(t2), target :: x2 print *, "Using t1 (without allocatable component):" call s(x1) p1 = c_loc(x1) call s_f(p1) call s_f(c_loc(x1)) print *, "Using t2 (with allocatable component):" call s(x2) p2 = c_loc(x2) call s_f(p2) call s_f(c_loc(x2)) !!====> incorrect output for this call end program -bash-4.1$ cat b_f.f90 module b implicit none interface subroutine s_f(p) bind(C, name='s_f') use, intrinsic :: iso_c_binding implicit none type(c_ptr), intent(in), value :: p end subroutine end interface end module -bash-4.1$ cat b_c.c #include <stdio.h> void s_f(void* p) { printf("%p\n", p); } void s(void *p) { printf("%p\n", p); } #!/bin/sh export CC=xlc_r exportFC=xlf2008_r $CC -c b_c.c $FC -c b_f.f90 $FC -c a.f90 $FC -o a b_c.o b_f.o a.o ===== ACTUAL OUTPUT: -bash-4.1$ ./a Using t1 (without allocatable component): 0xfff843c8 0xfff843c8 0xfff843c8 Using t2 (with allocatable component): 0xfff843b8 0xfff843b8 0xfff843dc ========> different address for the last call ===== EXPECTED OUTPUT: Same addresses, such as: -bash-4.1$ ./a Using t1 (without allocatable component): 0xfff9de98 0xfff9de98 0xfff9de98 Using t2 (with allocatable component): 0xfff9de88 0xfff9de88 0xfff9de88
Local fix
Change type :: t2 integer, allocatable :: i end type To type :: t2 integer, pointer :: i end type
Problem summary
PROBLEM DESCRIPTION: When the result of C_LOC is passed by value to a procedure, the compiler may pass incorect value to the callee resulting in functional failure. USERS AFFECTED: Users of applications that pass result of C_LOC by value to a procedure may experience this problem.
Problem conclusion
The problem has been fixed. Apply provided service.
Temporary fix
Comments
APAR Information
APAR number
LI77685
Reported component name
XL FORTRAN LINU
Reported component ID
5725C7500
Reported release
E10
Status
CLOSED PER
PE
NoPE
HIPER
NoHIPER
Special Attention
NoSpecatt
Submitted date
2013-10-28
Closed date
2013-10-28
Last modified date
2013-10-28
APAR is sysrouted FROM one or more of the following:
APAR is sysrouted TO one or more of the following:
Fix information
Fixed component name
XL FORTRAN LINU
Fixed component ID
5725C7500
Applicable component levels
RE10 PSN LI77271
UP06/09/13
[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSAT4T","label":"XL Fortran for Linux"},"Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"14.1","Line of Business":{"code":"LOB57","label":"Power"}}]
Document Information
Modified date:
14 October 2021