@@ -3184,7 +3184,8 @@ genACCHostDataOp(Fortran::lower::AbstractConverter &converter,
31843184 Fortran::lower::pft::Evaluation &eval,
31853185 Fortran::semantics::SemanticsContext &semanticsContext,
31863186 Fortran::lower::StatementContext &stmtCtx,
3187- const Fortran::parser::AccClauseList &accClauseList) {
3187+ const Fortran::parser::AccClauseList &accClauseList,
3188+ Fortran::lower::SymMap &localSymbols) {
31883189 mlir::Value ifCond;
31893190 llvm::SmallVector<mlir::Value> dataOperands;
31903191 bool addIfPresentAttr = false ;
@@ -3199,6 +3200,18 @@ genACCHostDataOp(Fortran::lower::AbstractConverter &converter,
31993200 } else if (const auto *useDevice =
32003201 std::get_if<Fortran::parser::AccClause::UseDevice>(
32013202 &clause.u )) {
3203+ // When CUDA Fotran is en
3204+ if (semanticsContext.IsEnabled (Fortran::common::LanguageFeature::CUDA)) {
3205+
3206+ const Fortran::parser::AccObjectList &objectList{useDevice->v };
3207+ for (const auto &accObject : objectList.v ) {
3208+ Fortran::semantics::Symbol &symbol =
3209+ getSymbolFromAccObject (accObject);
3210+ const Fortran::semantics::Symbol *baseSym =
3211+ localSymbols.lookupSymbolByName (symbol.name ().ToString ());
3212+ localSymbols.copySymbolBinding (*baseSym, symbol);
3213+ }
3214+ }
32023215 genDataOperandOperations<mlir::acc::UseDeviceOp>(
32033216 useDevice->v , converter, semanticsContext, stmtCtx, dataOperands,
32043217 mlir::acc::DataClause::acc_use_device,
@@ -3239,11 +3252,11 @@ genACCHostDataOp(Fortran::lower::AbstractConverter &converter,
32393252 hostDataOp.setIfPresentAttr (builder.getUnitAttr ());
32403253}
32413254
3242- static void
3243- genACC ( Fortran::lower::AbstractConverter &converter ,
3244- Fortran::semantics::SemanticsContext &semanticsContext ,
3245- Fortran::lower::pft::Evaluation &eval ,
3246- const Fortran::parser::OpenACCBlockConstruct &blockConstruct ) {
3255+ static void genACC (Fortran::lower::AbstractConverter &converter,
3256+ Fortran::semantics::SemanticsContext &semanticsContext ,
3257+ Fortran::lower::pft::Evaluation &eval ,
3258+ const Fortran::parser::OpenACCBlockConstruct &blockConstruct ,
3259+ Fortran::lower::SymMap &localSymbols ) {
32473260 const auto &beginBlockDirective =
32483261 std::get<Fortran::parser::AccBeginBlockDirective>(blockConstruct.t );
32493262 const auto &blockDirective =
@@ -3273,7 +3286,7 @@ genACC(Fortran::lower::AbstractConverter &converter,
32733286 accClauseList);
32743287 } else if (blockDirective.v == llvm::acc::ACCD_host_data) {
32753288 genACCHostDataOp (converter, currentLocation, eval, semanticsContext,
3276- stmtCtx, accClauseList);
3289+ stmtCtx, accClauseList, localSymbols );
32773290 }
32783291}
32793292
@@ -4647,13 +4660,15 @@ mlir::Value Fortran::lower::genOpenACCConstruct(
46474660 Fortran::lower::AbstractConverter &converter,
46484661 Fortran::semantics::SemanticsContext &semanticsContext,
46494662 Fortran::lower::pft::Evaluation &eval,
4650- const Fortran::parser::OpenACCConstruct &accConstruct) {
4663+ const Fortran::parser::OpenACCConstruct &accConstruct,
4664+ Fortran::lower::SymMap &localSymbols) {
46514665
46524666 mlir::Value exitCond;
46534667 Fortran::common::visit (
46544668 common::visitors{
46554669 [&](const Fortran::parser::OpenACCBlockConstruct &blockConstruct) {
4656- genACC (converter, semanticsContext, eval, blockConstruct);
4670+ genACC (converter, semanticsContext, eval, blockConstruct,
4671+ localSymbols);
46574672 },
46584673 [&](const Fortran::parser::OpenACCCombinedConstruct
46594674 &combinedConstruct) {
0 commit comments