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 @@ -111,7 +111,7 @@ construct(construct(maybe( parenthesized(("LENGTH:" >> scalarIntExpr || scalarIntExpr))))) || "WAIT" >> construct(construct( - maybe(Parser{}))) || + maybe(parenthesized(Parser{})))) || "WORKER" >> construct(construct(maybe( parenthesized(("NUM:" >> scalarIntExpr || scalarIntExpr))))) || @@ -125,8 +125,10 @@ TYPE_PARSER(construct( maybe(Parser{}), Parser{})) -TYPE_PARSER(construct( - maybe("DEVNUM:" >> scalarIntExpr / ":"), nonemptyList(scalarIntExpr))) +// 2.16.3 (2485) wait-argument is: +// [devnum : int-expr :] [queues :] int-expr-list +TYPE_PARSER(construct(maybe("DEVNUM:" >> scalarIntExpr / ":"), + "QUEUES:" >> nonemptyList(scalarIntExpr) || nonemptyList(scalarIntExpr))) // 2.9 (1609) size-expr is one of: // int-expr diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp --- a/flang/lib/Parser/unparse.cpp +++ b/flang/lib/Parser/unparse.cpp @@ -1937,6 +1937,10 @@ Put("\n"); EndOpenACC(); } + void Unparse(const AccWaitArgument &x) { + Walk("DEVNUM:", std::get>(x.t), ":"); + Walk(std::get>(x.t), ","); + } void Unparse(const OpenACCWaitConstruct &x) { BeginOpenACC(); Word("!$ACC "); 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 @@ -187,6 +187,30 @@ !ERROR: Unmatched END PARALLEL LOOP directive !$acc end parallel loop + !$acc kernels wait(1, 2) async(3) + !$acc end kernels + + !$acc kernels wait(queues: 1, 2) async(3) + !$acc end kernels + + !$acc kernels wait(devnum: 1: 1, 2) async(3) + !$acc end kernels + + !$acc kernels wait(devnum: 1: queues: 1, 2) async(3) + !$acc end kernels + + !$acc wait(1) + !$acc wait(1, 2) + + !$acc wait(queues: 1) + !$acc wait(queues: 1, 2) + + !$acc wait(devnum: 1: 3) + !$acc wait(devnum: 1: 3, 4) + + !$acc wait(devnum: 1: queues: 3) + !$acc wait(devnum: 1: queues: 3, 4) + contains subroutine sub1(a)