[flang-commits] [flang] [flang][openacc][cuda] Add implicit device attribute for use_device unconditionally (PR #186844)
via flang-commits
flang-commits at lists.llvm.org
Wed Mar 18 03:17:07 PDT 2026
================
@@ -2857,41 +2857,40 @@ genACCHostDataOp(Fortran::lower::AbstractConverter &converter,
for (const Fortran::parser::AccClause &clause : accClauseList.v) {
if (const auto *useDevice =
std::get_if<Fortran::parser::AccClause::UseDevice>(&clause.u)) {
- // When CUDA Fortran is enabled, extra symbols are used in the host_data
- // region. Look for them and bind their values with the symbols in the
- // outer scope.
- if (semanticsContext.IsEnabled(Fortran::common::LanguageFeature::CUDA)) {
- const Fortran::parser::AccObjectList &objectList{useDevice->v};
- for (const auto &accObject : objectList.v) {
- const Fortran::semantics::Symbol *newSym = nullptr;
- if (const auto *designator =
- std::get_if<Fortran::parser::Designator>(&accObject.u)) {
+ // For CUDA Fortran interoperability, extra symbols are used in the
+ // host_data region. Look for them and bind their values with the symbols
+ // in the outer scope.
+ const Fortran::parser::AccObjectList &objectList{useDevice->v};
+ for (const auto &accObject : objectList.v) {
+ const Fortran::semantics::Symbol *newSym = nullptr;
+ if (const auto *designator =
+ std::get_if<Fortran::parser::Designator>(&accObject.u)) {
+ if (const auto *name =
+ Fortran::parser::GetDesignatorNameIfDataRef(*designator)) {
+ newSym = name->symbol;
+ } else if (const auto *arrayElement =
+ Fortran::parser::Unwrap<Fortran::parser::ArrayElement>(
+ *designator)) {
+ const Fortran::parser::Name &name =
+ Fortran::parser::GetLastName(arrayElement->Base());
+ newSym = name.symbol;
+ } else if (const auto *component = Fortran::parser::Unwrap<
+ Fortran::parser::StructureComponent>(*designator)) {
+ const Fortran::parser::DataRef &base{component->Base()};
if (const auto *name =
- Fortran::parser::GetDesignatorNameIfDataRef(*designator)) {
+ std::get_if<Fortran::parser::Name>(&base.u)) {
newSym = name->symbol;
- } else if (const auto *arrayElement = Fortran::parser::Unwrap<
- Fortran::parser::ArrayElement>(*designator)) {
- const Fortran::parser::Name &name =
- Fortran::parser::GetLastName(arrayElement->Base());
- newSym = name.symbol;
- } else if (const auto *component = Fortran::parser::Unwrap<
- Fortran::parser::StructureComponent>(*designator)) {
- const Fortran::parser::DataRef &base{component->Base()};
- if (const auto *name =
- std::get_if<Fortran::parser::Name>(&base.u)) {
- newSym = name->symbol;
- }
}
- } else if (const auto *name =
- std::get_if<Fortran::parser::Name>(&accObject.u)) {
- newSym = name->symbol;
- }
- if (newSym) {
- const Fortran::semantics::Symbol *origSym =
- localSymbols.lookupSymbolByName(newSym->name().ToString());
- if (origSym)
- localSymbols.copySymbolBinding(*origSym, *newSym);
}
+ } else if (const auto *name =
+ std::get_if<Fortran::parser::Name>(&accObject.u)) {
+ newSym = name->symbol;
+ }
+ if (newSym) {
+ const Fortran::semantics::Symbol *origSym =
+ localSymbols.lookupSymbolByName(newSym->name().ToString());
+ if (origSym)
----------------
jeanPerier wrote:
You may want to do `origSym != newSym` too (also copySymbolBinding should be a no-op, it is clearer to me to only call it if you actually have a new symbol).
https://github.com/llvm/llvm-project/pull/186844
More information about the flang-commits
mailing list