mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Fortran
		
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Fortran
		
	
	
	
| ! { dg-do run }
 | |
| 
 | |
|   interface
 | |
|     elemental subroutine sub1 (x, y)
 | |
|       integer, intent(in) :: y
 | |
|       integer, intent(out) :: x
 | |
|     end subroutine
 | |
|     elemental function fn2 (x)
 | |
|       integer, intent(in) :: x
 | |
|       integer :: fn2
 | |
|     end function
 | |
|   end interface
 | |
| !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
 | |
| !$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) &
 | |
| !$omp & initializer (sub1 (omp_priv, omp_orig))
 | |
| !$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) &
 | |
| !$omp initializer (omp_priv = fn2 (omp_orig))
 | |
|   interface
 | |
|     elemental function fn1 (x, y)
 | |
|       integer, intent(in) :: x, y
 | |
|       integer :: fn1
 | |
|     end function
 | |
|     elemental subroutine sub2 (x, y)
 | |
|       integer, intent(in) :: y
 | |
|       integer, intent(inout) :: x
 | |
|     end subroutine
 | |
|   end interface
 | |
|   integer :: a(10), b, r
 | |
|   a(:) = 0
 | |
|   b = 0
 | |
|   r = 0
 | |
| !$omp parallel reduction (foo : a, b) reduction (+: r)
 | |
|   a = a + 2
 | |
|   b = b + 3
 | |
|   r = r + 1
 | |
| !$omp end parallel
 | |
|   if (any (a /= 2 * r) .or. b /= 3 * r) call abort
 | |
|   a(:) = 0
 | |
|   b = 0
 | |
|   r = 0
 | |
| !$omp parallel reduction (bar : a, b) reduction (+: r)
 | |
|   a = a + 2
 | |
|   b = b + 3
 | |
|   r = r + 1
 | |
| !$omp end parallel
 | |
|   if (any (a /= 4 * r) .or. b /= 6 * r) call abort
 | |
|   a(:) = 0
 | |
|   b = 0
 | |
|   r = 0
 | |
| !$omp parallel reduction (baz : a, b) reduction (+: r)
 | |
|   a = a + 2
 | |
|   b = b + 3
 | |
|   r = r + 1
 | |
| !$omp end parallel
 | |
|   if (any (a /= 2 * r) .or. b /= 3 * r) call abort
 | |
| end
 | |
| elemental function fn1 (x, y)
 | |
|   integer, intent(in) :: x, y
 | |
|   integer :: fn1
 | |
|   fn1 = x + 2 * y
 | |
| end function
 | |
| elemental subroutine sub1 (x, y)
 | |
|   integer, intent(in) :: y
 | |
|   integer, intent(out) :: x
 | |
|   x = 0
 | |
| end subroutine
 | |
| elemental function fn2 (x)
 | |
|   integer, intent(in) :: x
 | |
|   integer :: fn2
 | |
|   fn2 = x
 | |
| end function
 | |
| elemental subroutine sub2 (x, y)
 | |
|   integer, intent(inout) :: x
 | |
|   integer, intent(in) :: y
 | |
|   x = x + y
 | |
| end subroutine
 |