[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:05 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;
+        }
----------------
jeanPerier wrote:

I think `getSymbolFromAccObject` is doing the same thing and can be reused here.

https://github.com/llvm/llvm-project/pull/186844


More information about the flang-commits mailing list