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 @@ -1357,6 +1357,9 @@ llvm::SmallVector attachEntryOperands, createEntryOperands, copyEntryOperands, copyoutEntryOperands, dataClauseOperands; + bool hasDefaultNone = false; + bool hasDefaultPresent = false; + fir::FirOpBuilder &builder = converter.getFirOpBuilder(); // Lower clauses values mapped to operands. @@ -1437,6 +1440,14 @@ /*structured=*/true); attachEntryOperands.append(dataClauseOperands.begin() + crtDataStart, dataClauseOperands.end()); + } 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; } } @@ -1449,6 +1460,11 @@ auto dataOp = createRegionOp( builder, currentLocation, operands, operandSegments); + 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 @@ -144,5 +144,19 @@ ! 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 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