[flang-commits] [flang] [flang][cuda] Only apply the implicit data attribute on the component for use_device (PR #192146)
via flang-commits
flang-commits at lists.llvm.org
Mon Apr 20 07:33:47 PDT 2026
================
@@ -1520,44 +1627,59 @@ void AccVisitor::CopySymbolWithDevice(const parser::Name *name) {
}
}
-bool AccVisitor::Pre(const parser::AccClause::UseDevice &x) {
- for (const auto &accObject : x.v.v) {
- Walk(accObject);
- common::visit(
- common::visitors{
- [&](const parser::Designator &designator) {
- if (const auto *name{
- parser::GetDesignatorNameIfDataRef(designator)}) {
- CopySymbolWithDevice(name);
- } else if (const auto *dataRef{
- std::get_if<parser::DataRef>(&designator.u)}) {
- using ElementIndirection =
- common::Indirection<parser::ArrayElement>;
- using ComponentIndirection =
- common::Indirection<parser::StructureComponent>;
- if (auto *ind{std::get_if<ElementIndirection>(&dataRef->u)}) {
- const parser::ArrayElement &arrayElement{ind->value()};
- const parser::DataRef &base{arrayElement.Base()};
- if (auto *name{std::get_if<parser::Name>(&base.u)}) {
- CopySymbolWithDevice(name);
- }
- } else if (auto *ind{std::get_if<ComponentIndirection>(
- &dataRef->u)}) {
- const parser::StructureComponent &comp{ind->value()};
- const parser::DataRef &base{comp.Base()};
- if (auto *name{std::get_if<parser::Name>(&base.u)}) {
- CopySymbolWithDevice(name);
- }
- }
- }
- },
- [&](const parser::Name &name) {
- // TODO: common block in use_device?
- },
- },
+void AccVisitor::CopySymbolWithDeviceStructurePath(const parser::Name *baseName,
+ llvm::ArrayRef<SourceName> componentPath, parser::Designator &designator) {
+ if (!context_.languageFeatures().IsEnabled(common::LanguageFeature::CUDA) ||
+ !baseName || !baseName->symbol || componentPath.empty()) {
+ return;
+ }
+ const Symbol &orig{*baseName->symbol};
+ Symbol *copy{currScope().CopySymbol(orig)};
+ if (!copy) {
+ copy = FindInScope(currScope(), baseName->symbol->name());
----------------
jeanPerier wrote:
Do you know when the copy can fail and the code falls here? Wouldn't this risk modifying `orig` symbol?
https://github.com/llvm/llvm-project/pull/192146
More information about the flang-commits
mailing list