Issue 130533
Summary [Flang][OpenMP] Compile error of end single copyprivate statement written within parallel private construct within task construct
Labels flang:openmp
Assignees
Reporter ohno-fj
    ```
Version of flang : 21.0.0(8c7c791284877e36f73c41ffa56b52c13e613993)/AArch64
```

`end single statement` with `copyprivate clause` written in `parallel construct` with `private clause` in `task construct` results in compilation errors.  
The above program is `sngtomp028_21.f90`.  
When `task construct` is removed, the compilation succeeds.  
The above program is `sngtomp028_22.f90`.

The following are the test program, Flang, Gfortran and ifx compilation/execution result.

sngtomp028_21.f90:
```fortran
program main
  real, dimension(:), allocatable :: a
  real, dimension(:), pointer :: b
!$omp task
!$omp parallel private (a, b)
  allocate (a(5))
  allocate (b(10))
!$omp single
  a = 22
  b = 33
!$omp end single copyprivate (a, b)
  if(any(a/=(/(22,j=1,5)/))) print *,'err1'
 if(any(b/=(/(33,k=1,10)/))) print *,'err2'
!$omp end parallel
!$omp end task
  print *,'pass'
end program main
```

```
$ flang -fopenmp sngtomp028_21.f90
flang-20: warning: OpenMP support in flang is still experimental [-Wexperimental-option]
error: Semantic errors in sngtomp028_21.f90
./sngtomp028_21.f90:11:31: error: COPYPRIVATE variable 'a' is not PRIVATE or THREADPRIVATE in outer context
  !$omp end single copyprivate (a, b)
 ^
./sngtomp028_21.f90:11:34: error: COPYPRIVATE variable 'b' is not PRIVATE or THREADPRIVATE in outer context
  !$omp end single copyprivate (a, b)
 ^
$
```

```
$ export OMP_NUM_THREADS=2; gfortran -fopenmp sngtomp028_21.f90; ./a.out
 pass
$
```

```
$ export OMP_NUM_THREADS=2; ifx -qopenmp sngtomp028_21.f90; ./a.out
 pass
$
```

sngtomp028_22.f90:
```fortran
program main
  real, dimension(:), allocatable :: a
  real, dimension(:), pointer :: b
! !$omp task
!$omp parallel private (a, b)
  allocate (a(5))
  allocate (b(10))
!$omp single
  a = 22
  b = 33
!$omp end single copyprivate (a, b)
  if(any(a/=(/(22,j=1,5)/))) print *,'err1'
 if(any(b/=(/(33,k=1,10)/))) print *,'err2'
!$omp end parallel
! !$omp end task
  print *,'pass'
end program main
```

```
$ export OMP_NUM_THREADS=2; flang -fopenmp sngtomp028_21.f90; ./a.out
flang-20: warning: OpenMP support in flang is still experimental [-Wexperimental-option]
 pass
$
```


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

Reply via email to