! { dg-do compile } ! { dg-options "-fmax-errors=1000 -fopenmp" } module m contains function fn1 (x, y) integer, intent(in) :: x, y integer :: fn1 fn1 = x + 2 * y end function subroutine sub1 (x, y) integer, intent(in) :: y integer, intent(out) :: x x = y end subroutine function fn2 (x) integer, intent(in) :: x integer :: fn2 fn2 = x end function subroutine sub2 (x, y) integer, intent(in) :: y integer, intent(inout) :: x x = x + y end subroutine function fn3 (x, y) integer, intent(in) :: x(:), y(:) integer :: fn3(lbound(x, 1):ubound(x, 1)) fn3 = x + 2 * y end function subroutine sub3 (x, y) integer, intent(in) :: y(:) integer, intent(out) :: x(:) x = y end subroutine function fn4 (x) integer, intent(in) :: x(:) integer :: fn4(lbound(x, 1):ubound(x, 1)) fn4 = x end function subroutine sub4 (x, y) integer, intent(in) :: y(:) integer, intent(inout) :: x(:) x = x + y end subroutine function fn5 (x, y) integer, intent(in) :: x(10), y(10) integer :: fn5(10) fn5 = x + 2 * y end function subroutine sub5 (x, y) integer, intent(in) :: y(10) integer, intent(out) :: x(10) x = y end subroutine function fn6 (x) integer, intent(in) :: x(10) integer :: fn6(10) fn6 = x end function subroutine sub6 (x, y) integer, intent(in) :: y(10) integer, intent(inout) :: x(10) x = x + y end subroutine function fn7 (x, y) integer, allocatable, intent(in) :: x(:), y(:) integer, allocatable :: fn7(:) fn7 = x + 2 * y end function subroutine sub7 (x, y) integer, allocatable, intent(in) :: y(:) integer, allocatable, intent(out) :: x(:) x = y end subroutine function fn8 (x) integer, allocatable, intent(in) :: x(:) integer, allocatable :: fn8(:) fn8 = x end function subroutine sub8 (x, y) integer, allocatable, intent(in) :: y(:) integer, allocatable, intent(inout) :: x(:) x = x + y end subroutine end module subroutine test1 use m !$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)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } !$omp & initializer (sub1 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } !$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } !$omp initializer (omp_priv = fn2 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } integer :: a(10) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test1 subroutine test2 use m !$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)) integer :: a !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test2 subroutine test3 use m !$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)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } !$omp & initializer (sub1 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } !$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } !$omp initializer (omp_priv = fn2 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" } integer, allocatable :: a(:) allocate (a(10)) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test3 subroutine test4 use m !$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)) integer, allocatable :: a allocate (a) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test4 subroutine test5 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) & !$omp & initializer (sub3 (omp_priv, omp_orig)) !$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) & !$omp initializer (omp_priv = fn4 (omp_orig)) integer :: a(10) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test5 subroutine test6 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } !$omp & initializer (sub3 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp initializer (omp_priv = fn4 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } integer :: a !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test6 subroutine test7 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) & !$omp & initializer (sub3 (omp_priv, omp_orig)) !$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) & !$omp initializer (omp_priv = fn4 (omp_orig)) integer, allocatable :: a(:) allocate (a(10)) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test7 subroutine test8 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } !$omp & initializer (sub3 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp initializer (omp_priv = fn4 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } integer, allocatable :: a allocate (a) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test8 subroutine test9 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) & !$omp & initializer (sub5 (omp_priv, omp_orig)) !$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & !$omp initializer (omp_priv = fn6 (omp_orig)) integer :: a(10) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test9 subroutine test10 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } !$omp & initializer (sub5 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp initializer (omp_priv = fn6 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } integer :: a !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test10 subroutine test11 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) & !$omp & initializer (sub5 (omp_priv, omp_orig)) !$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & !$omp initializer (omp_priv = fn6 (omp_orig)) integer, allocatable :: a(:) allocate (a(10)) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test11 subroutine test12 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } !$omp & initializer (sub5 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp initializer (omp_priv = fn6 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } integer, allocatable :: a allocate (a) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test12 subroutine test13 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = & ! { dg-error "Different shape for array assignment at \[^\n\r]* on dimension 1 .9 and 10" } !$omp & fn5 (omp_out, omp_in)) & ! { dg-error "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" } !$omp & initializer (sub5 (omp_priv, omp_orig)) ! { dg-error "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" } !$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & ! { dg-error "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" } !$omp initializer (omp_priv = & ! { dg-error "Different shape for array assignment at \[^\n\r]* on dimension 1 .9 and 10" } !$omp & fn6 (omp_orig)) ! { dg-error "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" } integer :: a(9) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test13 subroutine test14 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" } !$omp & initializer (sub7 (omp_priv, omp_orig)) ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" } !$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" } !$omp initializer (omp_priv = fn8 (omp_orig)) ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" } integer :: a(10) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test14 subroutine test15 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } !$omp & initializer (sub7 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp initializer (omp_priv = fn8 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } integer :: a !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test15 subroutine test16 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & !$omp & initializer (sub7 (omp_priv, omp_orig)) !$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & !$omp initializer (omp_priv = fn8 (omp_orig)) integer, allocatable :: a(:) allocate (a(10)) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test16 subroutine test17 use m !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0) !$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } !$omp & initializer (sub7 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" } !$omp initializer (omp_priv = fn8 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" } integer, allocatable :: a allocate (a) !$omp parallel reduction (foo : a) !$omp end parallel !$omp parallel reduction (bar : a) !$omp end parallel !$omp parallel reduction (baz : a) !$omp end parallel end subroutine test17