[flang-commits] [flang] [flang] Check for inappropriate symbols in ACC PRESENT (PR #169500)

Eugene Epshteyn via flang-commits flang-commits at lists.llvm.org
Tue Nov 25 06:57:01 PST 2025


https://github.com/eugeneepshteyn updated https://github.com/llvm/llvm-project/pull/169500

>From 3120021689a2a989c9b8f0f1b923b5d9585bd31b Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Tue, 25 Nov 2025 09:49:37 -0500
Subject: [PATCH 1/2] [flang] Check for inappropriate symbols in ACC PRESENT

Fixes #169487
---
 flang/lib/Semantics/check-acc-structure.cpp | 46 ++++++++++++---------
 1 file changed, 27 insertions(+), 19 deletions(-)

diff --git a/flang/lib/Semantics/check-acc-structure.cpp b/flang/lib/Semantics/check-acc-structure.cpp
index 5e87b834edf7e..c47f3359c0ea2 100644
--- a/flang/lib/Semantics/check-acc-structure.cpp
+++ b/flang/lib/Semantics/check-acc-structure.cpp
@@ -712,28 +712,36 @@ void AccStructureChecker::CheckMultipleOccurrenceInDeclare(
             [&](const parser::Designator &designator) {
               if (const auto *name =
                       parser::GetDesignatorNameIfDataRef(designator)) {
-                if (declareSymbols.contains(&name->symbol->GetUltimate())) {
-                  if (declareSymbols[&name->symbol->GetUltimate()] == clause) {
-                    context_.Warn(common::UsageWarning::OpenAccUsage,
-                        GetContext().clauseSource,
-                        "'%s' in the %s clause is already present in the same clause in this module"_warn_en_US,
-                        name->symbol->name(),
-                        parser::ToUpperCaseLetters(
+                if (!name->symbol) {
+                  context_.Say(GetContext().clauseSource,
+                    "'%s' is not an appropriate symbol for %s clause"_err_en_US,
+                    name->ToString().c_str(),
+                    parser::ToUpperCaseLetters(
                             llvm::acc::getOpenACCClauseName(clause).str()));
-                  } else {
-                    context_.Say(GetContext().clauseSource,
-                        "'%s' in the %s clause is already present in another "
-                        "%s clause in this module"_err_en_US,
-                        name->symbol->name(),
-                        parser::ToUpperCaseLetters(
-                            llvm::acc::getOpenACCClauseName(clause).str()),
-                        parser::ToUpperCaseLetters(
-                            llvm::acc::getOpenACCClauseName(
-                                declareSymbols[&name->symbol->GetUltimate()])
-                                .str()));
+                } else {
+                  if (declareSymbols.contains(&name->symbol->GetUltimate())) {
+                    if (declareSymbols[&name->symbol->GetUltimate()] == clause) {
+                      context_.Warn(common::UsageWarning::OpenAccUsage,
+                          GetContext().clauseSource,
+                          "'%s' in the %s clause is already present in the same clause in this module"_warn_en_US,
+                          name->symbol->name(),
+                          parser::ToUpperCaseLetters(
+                              llvm::acc::getOpenACCClauseName(clause).str()));
+                    } else {
+                      context_.Say(GetContext().clauseSource,
+                          "'%s' in the %s clause is already present in another "
+                          "%s clause in this module"_err_en_US,
+                          name->symbol->name(),
+                          parser::ToUpperCaseLetters(
+                              llvm::acc::getOpenACCClauseName(clause).str()),
+                          parser::ToUpperCaseLetters(
+                              llvm::acc::getOpenACCClauseName(
+                                  declareSymbols[&name->symbol->GetUltimate()])
+                                  .str()));
+                    }
                   }
+                  declareSymbols.insert({&name->symbol->GetUltimate(), clause});
                 }
-                declareSymbols.insert({&name->symbol->GetUltimate(), clause});
               }
             },
             [&](const parser::Name &name) {

>From 4fac9ec3c5a8958090d3af8a6db6bffb139c704c Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Tue, 25 Nov 2025 09:56:51 -0500
Subject: [PATCH 2/2] clang-format

---
 flang/lib/Semantics/check-acc-structure.cpp | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/flang/lib/Semantics/check-acc-structure.cpp b/flang/lib/Semantics/check-acc-structure.cpp
index c47f3359c0ea2..eda824f08e6e5 100644
--- a/flang/lib/Semantics/check-acc-structure.cpp
+++ b/flang/lib/Semantics/check-acc-structure.cpp
@@ -714,13 +714,14 @@ void AccStructureChecker::CheckMultipleOccurrenceInDeclare(
                       parser::GetDesignatorNameIfDataRef(designator)) {
                 if (!name->symbol) {
                   context_.Say(GetContext().clauseSource,
-                    "'%s' is not an appropriate symbol for %s clause"_err_en_US,
-                    name->ToString().c_str(),
-                    parser::ToUpperCaseLetters(
-                            llvm::acc::getOpenACCClauseName(clause).str()));
+                      "'%s' is not an appropriate symbol for %s clause"_err_en_US,
+                      name->ToString().c_str(),
+                      parser::ToUpperCaseLetters(
+                          llvm::acc::getOpenACCClauseName(clause).str()));
                 } else {
                   if (declareSymbols.contains(&name->symbol->GetUltimate())) {
-                    if (declareSymbols[&name->symbol->GetUltimate()] == clause) {
+                    if (declareSymbols[&name->symbol->GetUltimate()] ==
+                        clause) {
                       context_.Warn(common::UsageWarning::OpenAccUsage,
                           GetContext().clauseSource,
                           "'%s' in the %s clause is already present in the same clause in this module"_warn_en_US,



More information about the flang-commits mailing list