diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -1459,6 +1459,13 @@ /*structured=*/true); attachEntryOperands.append(dataClauseOperands.begin() + crtDataStart, dataClauseOperands.end()); + } else if (const auto *asyncClause = + std::get_if(&clause.u)) { + genAsyncClause(converter, asyncClause, async, addAsyncAttr, stmtCtx); + } else if (const auto *waitClause = + std::get_if(&clause.u)) { + genWaitClause(converter, waitClause, waitOperands, waitDevnum, + addWaitAttr, stmtCtx); } } @@ -1475,7 +1482,7 @@ builder, currentLocation, operands, operandSegments); dataOp.setAsyncAttr(addAsyncAttr); - dataOp.setAsyncAttr(addWaitAttr); + dataOp.setWaitAttr(addWaitAttr); auto insPt = builder.saveInsertionPoint(); builder.setInsertionPointAfter(dataOp); diff --git a/flang/test/Lower/OpenACC/acc-data.f90 b/flang/test/Lower/OpenACC/acc-data.f90 --- a/flang/test/Lower/OpenACC/acc-data.f90 +++ b/flang/test/Lower/OpenACC/acc-data.f90 @@ -144,5 +144,35 @@ ! CHECK: acc.detach accPtr(%[[ATTACH_D]] : !fir.ptr) {dataClause = 10 : i64, name = "d"} ! CHECK: acc.detach accPtr(%[[ATTACH_E]] : !fir.ptr) {dataClause = 10 : i64, name = "e"} + !$acc data present(a) async + !$acc end data + +! CHECK: acc.data dataOperands(%{{.*}}) { +! CHECK: } attributes {asyncAttr} + + !$acc data present(a) async(1) + !$acc end data + +! CHECK: acc.data async(%{{.*}} : i32) dataOperands(%{{.*}}) { +! CHECK: }{{$}} + + !$acc data present(a) wait + !$acc end data + +! CHECK: acc.data dataOperands(%{{.*}}) { +! CHECK: } attributes {waitAttr} + + !$acc data present(a) wait(1) + !$acc end data + +! CHECK: acc.data dataOperands(%{{.*}}) wait(%{{.*}} : i32) { +! CHECK: }{{$}} + + !$acc data present(a) wait(devnum: 0: 1) + !$acc end data + +! CHECK: acc.data dataOperands(%{{.*}}) wait_devnum(%{{.*}} : i32) wait(%{{.*}} : i32) { +! CHECK: }{{$}} + end subroutine acc_data