| Issue |
113843
|
| Summary |
[Flang] Execution error when merge intrinsic function is specified as an argument to merge intrinsic function and its component is referenced after the result is assigned to `entity-decl`
|
| Labels |
flang
|
| Assignees |
|
| Reporter |
ohno-fj
|
```
Version of flang-new : 20.0.0(c2717a89b8437d041d532c7b2c535ca4f4b35872)/AArch64
```
When `merge` intrinsic function is specified as an argument to `merge` intrinsic function and its component is referenced after the result is assigned to `entity-decl (w)`, `segmentation fault` occurs.
The above program is `sngg735a_2221.f90`
When `merge` intrinsic function is not specified as an argument to `merge` intrinsic function, execution succeeds.
The above program is `sngg735a_2222.f90`
The following are the test program, Flang-new, Gfortran and ifx compilation/execution result.
sngg735a_2221.f90:
```fortran
subroutine s1
type :: x
integer, allocatable :: z(:)
end type x
TYPE(x) :: v(1),w(1)
allocate(w(1)%z(1),source=1)
allocate(v(1)%z(1),source=1)
w= merge( merge(v, v, .true.), merge(v, v, .true.), .true.) ! ng
! w= merge( v, v, .true.) ! ok
write(6,*) "w(1)%z(1) = ", w(1)%z(1)
! if (w(1)%z(1)/=1 ) print *,101
end subroutine s1
program main
call s1
print *,'pass'
end program main
```
```
$ flang-new sngg735a_2221.f90; ./a.out
Segmentation fault (core dumped)
$
```
```
$ gfortran sngg735a_2221.f90; ./a.out
w(1)%z(1) = 1
free(): double free detected in tcache 2
Program received signal SIGABRT: Process abort signal.
Backtrace for this error:
#0 0x4000177fa917 in ???
#1 0x4000177f99a7 in ???
#2 0x4000177c079f in ???
#3 0x400017a96274 in ???
#4 0x400017a80a2b in ???
#5 0x400017acfb07 in ???
#6 0x400017ad6d13 in ???
#7 0x400017ad8e3f in ???
#8 0x400f37 in ???
#9 0x400f7b in ???
#10 0x401007 in ???
#11 0x400017a84383 in ???
#12 0x400a9b in ???
Aborted (core dumped)
$
```
```
$ ifx sngg735a_2221.f90; ./a.out
w(1)%z(1) = 1
pass
$
```
sngg735a_2222.f90:
```fortran
subroutine s1
type :: x
integer, allocatable :: z(:)
end type x
TYPE(x) :: v(1),w(1)
allocate(w(1)%z(1),source=1)
allocate(v(1)%z(1),source=1)
! w= merge( merge(v, v, .true.), merge(v, v, .true.), .true.) ! ng
w= merge( v, v, .true.) ! ok
write(6,*) "w(1)%z(1) = ", w(1)%z(1)
! if (w(1)%z(1)/=1 ) print *,101
end subroutine s1
program main
call s1
print *,'pass'
end program main
```
```
$ flang-new sngg735a_2222.f90; ./a.out
w(1)%z(1) = 1
pass
$
```
```
$ gfortran sngg735a_2222.f90; ./a.out
w(1)%z(1) = 1
free(): double free detected in tcache 2
Program received signal SIGABRT: Process abort signal.
Backtrace for this error:
#0 0x40002f0da917 in ???
#1 0x40002f0d99a7 in ???
#2 0x40002f0a079f in ???
#3 0x40002f376274 in ???
#4 0x40002f360a2b in ???
#5 0x40002f3afb07 in ???
#6 0x40002f3b6d13 in ???
#7 0x40002f3b8e3f in ???
#8 0x400f9b in ???
#9 0x400fdf in ???
#10 0x40106b in ???
#11 0x40002f364383 in ???
#12 0x400a9b in ???
Aborted (core dumped)
$
```
```
$ ifx sngg735a_2222.f90; ./a.out
w(1)%z(1) = 1
pass
$
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs