mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Fortran
		
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Fortran
		
	
	
	
| ! { dg-do run }
 | |
| 
 | |
| program udr7
 | |
|   implicit none
 | |
|   interface
 | |
|     elemental subroutine omp_priv (x, y, z)
 | |
|       real, intent (in) :: x
 | |
|       real, intent (inout) :: y
 | |
|       real, intent (in) :: z
 | |
|     end subroutine omp_priv
 | |
|     elemental real function omp_orig (x)
 | |
|       real, intent (in) :: x
 | |
|     end function omp_orig
 | |
|   end interface
 | |
| !$omp declare reduction (omp_priv : real : &
 | |
| !$omp & omp_priv (omp_orig (omp_in), omp_out, 1.0)) &
 | |
| !$omp & initializer (omp_out (omp_priv, omp_in (omp_orig)))
 | |
|   real :: x (2:4, 1:1, -2:0)
 | |
|   integer :: i
 | |
|   x = 0
 | |
| !$omp parallel do reduction (omp_priv : x)
 | |
|   do i = 1, 64
 | |
|     x = x + i
 | |
|   end do
 | |
|   if (any (x /= 2080.0)) call abort
 | |
| contains
 | |
|   elemental subroutine omp_out (x, y)
 | |
|     real, intent (out) :: x
 | |
|     real, intent (in) :: y
 | |
|     x = y - 4.0
 | |
|   end subroutine omp_out
 | |
|   elemental real function omp_in (x)
 | |
|     real, intent (in) :: x
 | |
|     omp_in = x + 4.0
 | |
|   end function omp_in
 | |
| end program udr7
 | |
| elemental subroutine omp_priv (x, y, z)
 | |
|   real, intent (in) :: x
 | |
|   real, intent (inout) :: y
 | |
|   real, intent (in) :: z
 | |
|   y = y + (x - 4.0) + (z - 1.0)
 | |
| end subroutine omp_priv
 | |
| elemental real function omp_orig (x)
 | |
|   real, intent (in) :: x
 | |
|   omp_orig = x + 4.0
 | |
| end function omp_orig
 |