diff --git a/flang/lib/Parser/openacc-parsers.cpp b/flang/lib/Parser/openacc-parsers.cpp --- a/flang/lib/Parser/openacc-parsers.cpp +++ b/flang/lib/Parser/openacc-parsers.cpp @@ -139,10 +139,9 @@ // 2.9 (1607) gang-arg is one of: // [num:]int-expr // static:size-expr -TYPE_PARSER(construct(maybe(scalarIntExpr), - maybe(","_tok / "STATIC:" >> Parser{})) || - construct(maybe("NUM:" >> scalarIntExpr), - maybe(","_tok / "STATIC:" >> Parser{}))) +TYPE_PARSER(construct( + maybe(("NUM:"_tok >> scalarIntExpr || scalarIntExpr)), + maybe(","_tok / "STATIC:"_tok >> Parser{}))) // 2.5.13 Reduction // Operator for reduction diff --git a/flang/test/Semantics/acc-clause-validity.f90 b/flang/test/Semantics/acc-clause-validity.f90 --- a/flang/test/Semantics/acc-clause-validity.f90 +++ b/flang/test/Semantics/acc-clause-validity.f90 @@ -18,16 +18,18 @@ implicit none - integer :: i, j, b + integer :: i, j, b, gang_size, vector_size, worker_size integer, parameter :: N = 256 integer, dimension(N) :: c logical, dimension(N) :: d, e real :: reduction_r logical :: reduction_l + real(8), dimension(N, N) :: aa + !ERROR: At least one clause is required on the DECLARE directive !$acc declare - real(8) :: a(256) + real(8), dimension(N) :: a !ERROR: At least one of ATTACH, COPYIN, CREATE clause must appear on the ENTER DATA directive !$acc enter data @@ -90,6 +92,141 @@ end do !$acc end parallel + !$acc parallel + !$acc loop seq + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop independent + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop auto + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop vector + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop vector(10) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop vector(vector_size) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop vector(length: vector_size) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop worker + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop worker(10) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop worker(worker_size) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop worker(num: worker_size) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop gang(gang_size) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop gang(num: gang_size) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop gang(gang_size, static:*) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop gang(num: gang_size, static:*) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop gang(num: gang_size, static: gang_size) + do i = 1, N + a(i) = 3.14 + end do + !$acc end parallel + + !$acc parallel + !$acc loop private(b, a(:)) + do i = 1, N + a(i) = b + end do + !$acc end parallel + + !$acc parallel + !$acc loop tile(*) + do i = 1, N + a(i) = b + end do + !$acc end parallel + + !$acc parallel + !$acc loop tile(2, 2) + do i = 1, N + do j = 1, N + a(i) = b + end do + end do + !$acc end parallel + !$acc parallel !ERROR: The parameter of the COLLAPSE clause must be a constant positive integer expression !$acc loop collapse(-1)