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 @@ -35,20 +35,30 @@ static void genObjectList(const Fortran::parser::AccObjectList &objectList, Fortran::lower::AbstractConverter &converter, llvm::SmallVectorImpl &operands) { + auto addOperands = [&](Fortran::lower::SymbolRef sym) { + const auto variable = converter.getSymbolAddress(sym); + // TODO: Might need revisiting to handle for non-shared clauses + if (variable) { + operands.push_back(variable); + } else { + if (const auto *details = + sym->detailsIf()) + operands.push_back(converter.getSymbolAddress(details->symbol())); + } + }; + for (const auto &accObject : objectList.v) { - std::visit( - Fortran::common::visitors{ - [&](const Fortran::parser::Designator &designator) { - if (const auto *name = getDesignatorNameIfDataRef(designator)) { - const auto variable = converter.getSymbolAddress(*name->symbol); - operands.push_back(variable); - } - }, - [&](const Fortran::parser::Name &name) { - const auto variable = converter.getSymbolAddress(*name.symbol); - operands.push_back(variable); - }}, - accObject.u); + std::visit(Fortran::common::visitors{ + [&](const Fortran::parser::Designator &designator) { + if (const auto *name = + getDesignatorNameIfDataRef(designator)) { + addOperands(*name->symbol); + } + }, + [&](const Fortran::parser::Name &name) { + addOperands(*name.symbol); + }}, + accObject.u); } }