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 @@ -1379,6 +1379,9 @@ bool addAsyncAttr = false; bool addWaitAttr = false; + bool hasDefaultNone = false; + bool hasDefaultPresent = false; + fir::FirOpBuilder &builder = converter.getFirOpBuilder(); // Lower clauses values mapped to operands. @@ -1466,6 +1469,12 @@ std::get_if(&clause.u)) { genWaitClause(converter, waitClause, waitOperands, waitDevnum, addWaitAttr, stmtCtx); + } else if(const auto *defaultClause = + std::get_if(&clause.u)) { + if ((defaultClause->v).v == llvm::acc::DefaultValue::ACC_Default_none) + hasDefaultNone = true; + else if ((defaultClause->v).v == llvm::acc::DefaultValue::ACC_Default_present) + hasDefaultPresent = true; } } @@ -1484,6 +1493,11 @@ dataOp.setAsyncAttr(addAsyncAttr); dataOp.setWaitAttr(addWaitAttr); + if (hasDefaultNone) + dataOp.setDefaultAttr(mlir::acc::ClauseDefaultValue::None); + if (hasDefaultPresent) + dataOp.setDefaultAttr(mlir::acc::ClauseDefaultValue::Present); + 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 @@ -174,5 +174,19 @@ ! CHECK: acc.data dataOperands(%{{.*}}) wait_devnum(%{{.*}} : i32) wait(%{{.*}} : i32) { ! CHECK: }{{$}} + !$acc data default(none) + !$acc end data + +! CHECK: acc.data { +! CHECK: acc.terminator +! CHECK: } attributes {defaultAttr = #acc} + + !$acc data default(present) + !$acc end data + +! CHECK: acc.data { +! CHECK: acc.terminator +! CHECK: } attributes {defaultAttr = #acc} + end subroutine acc_data