blob: 6448bd9b8bb36999c3464d35c015d41b97849d95 [file] [log] [blame]
! { dg-do compile }
module m
implicit none
integer x
real d
contains
real function foo (y, e, f)
integer :: y
real v, e
real(8) :: f
!$omp atomic compare compare ! { dg-error "Duplicated 'compare' clause" }
if (x == y) x = d
!$omp atomic compare fail(seq_cst) fail(seq_cst) ! { dg-error "Duplicated 'fail' clause" }
if (x == y) x = d
!$omp atomic compare,fail(seq_cst),fail(relaxed) ! { dg-error "Duplicated 'fail' clause" }
if (x == y) x = d
!$omp atomic compare weak weak ! { dg-error "Duplicated 'weak' clause" }
if (x == y) x = d
!$omp atomic read capture ! { dg-error "CAPTURE clause is incompatible with READ or WRITE" }
v = d
!$omp atomic capture, write ! { dg-error "CAPTURE clause is incompatible with READ or WRITE" }
d = v; v = v + 1 ! { dg-error "Unexpected ..OMP ATOMIC statement" "" { target *-*-* } .-1 }
foo = v
end
real function bar (y, e, f)
integer :: y
real v, e
real(8) :: f
!$omp atomic read compare ! { dg-error "COMPARE clause is incompatible with READ or WRITE" }
if (x == y) x = d
!$omp atomic compare, write ! { dg-error "COMPARE clause is incompatible with READ or WRITE" }
if (x == y) x = d
!$omp atomic read fail(seq_cst) ! { dg-error "FAIL clause is incompatible with READ or WRITE" }
v = d
!$omp atomic fail(relaxed), write ! { dg-error "FAIL clause is incompatible with READ or WRITE" }
d = v
!$omp atomic fail(relaxed) update ! { dg-error "FAIL clause requiries either the COMPARE clause or using the intrinsic MIN/MAX procedure" }
d = d + 3.0
!$omp atomic fail(relaxed) ! { dg-error "FAIL clause requiries either the COMPARE clause or using the intrinsic MIN/MAX procedure" }
d = d + 3.0
!$omp atomic capture fail(relaxed) ! { dg-error "FAIL clause requiries either the COMPARE clause or using the intrinsic MIN/MAX procedure" }
v = d; d = d + 3.0
!$omp atomic read weak ! { dg-error "WEAK clause requires COMPARE clause" }
v = d
!$omp atomic weak, write ! { dg-error "WEAK clause requires COMPARE clause" }
d = v
!$omp atomic weak update ! { dg-error "WEAK clause requires COMPARE clause" }
d = d + 3.0
!$omp atomic weak ! { dg-error "WEAK clause requires COMPARE clause" }
d = d + 3.0
!$omp atomic capture weak ! { dg-error "WEAK clause requires COMPARE clause" }
d = d + 3.0; v = d
!$omp atomic capture
d = d + 3.0; v = x ! { dg-error "capture statement reads from different variable than update statement writes" }
!$omp atomic compare fail ! { dg-error "Expected '\\\(' after 'fail'" }
if (x == y) x = d
!$omp atomic compare fail( ! { dg-error "Expected SEQ_CST, ACQUIRE or RELAXED" }
if (x == y) x = d
!$omp atomic compare fail() ! { dg-error "Expected SEQ_CST, ACQUIRE or RELAXED" }
if (x == y) x = d
!$omp atomic compare fail(foobar) ! { dg-error "Expected SEQ_CST, ACQUIRE or RELAXED" }
if (x == y) x = d
!$omp atomic compare fail(acq_rel) ! { dg-error "Expected SEQ_CST, ACQUIRE or RELAXED" }
if (x == y) x = d
!$omp atomic compare fail(release) ! { dg-error "Expected SEQ_CST, ACQUIRE or RELAXED" }
if (x == y) x = d
!$omp atomic compare fail(seq_cst ! { dg-error "Failed to match clause" }
if (x == y) x = d
bar = v
end
subroutine foobar
implicit none
integer :: i, j, k
!$omp atomic compare write ! { dg-error "COMPARE clause is incompatible with READ or WRITE" }
if (i == 1) i = 5
!$omp atomic compare
if (k == 5) i = 7 ! { dg-error "For !.OMP ATOMIC COMPARE, the first operand in comparison at .1. must be the variable 'i' that the update statement writes into at .2." }
!$omp atomic compare
if (j == i) i = 8 ! { dg-error "For !.OMP ATOMIC COMPARE, the first operand in comparison at .1. must be the variable 'i' that the update statement writes into at .2." }
!$omp atomic compare
if (i == 5) i = 8
!$omp atomic compare
if (5 == i) i = 8 ! { dg-error "Expected scalar intrinsic variable at .1. in atomic comparison" }
!$omp atomic compare
if (i == 5) i = i + 8 ! { dg-error "20: expr in !.OMP ATOMIC COMPARE assignment var = expr must be scalar and cannot reference var" }
end subroutine
end module