[flang-commits] [flang] early feedback commit (PR #149579)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Fri Jul 18 14:08:37 PDT 2025
================
@@ -342,21 +347,149 @@ void AccStructureChecker::Leave(const parser::OpenACCAtomicConstruct &x) {
dirContext_.pop_back();
}
-void AccStructureChecker::Enter(const parser::AccAtomicUpdate &x) {
- const parser::AssignmentStmt &assignment{
- std::get<parser::Statement<parser::AssignmentStmt>>(x.t).statement};
- const auto &var{std::get<parser::Variable>(assignment.t)};
- const auto &expr{std::get<parser::Expr>(assignment.t)};
+void AccStructureChecker::CheckAtomicStmt(
+ const parser::AssignmentStmt &assign, std::string &construct) {
+ const auto &var{std::get<parser::Variable>(assign.t)};
+ const auto &expr{std::get<parser::Expr>(assign.t)};
const auto *rhs{GetExpr(context_, expr)};
const auto *lhs{GetExpr(context_, var)};
- if (lhs && rhs) {
- if (lhs->Rank() != 0)
+
+ if (lhs) {
+ if (lhs->Rank() != 0) {
context_.Say(expr.source,
- "LHS of atomic update statement must be scalar"_err_en_US);
- if (rhs->Rank() != 0)
+ "LHS of atomic %s statement must be scalar"_err_en_US, construct);
+ }
+ // TODO: Check if lhs is intrinsic type
+ }
+ if (rhs) {
+ if (rhs->Rank() != 0) {
context_.Say(var.GetSource(),
- "RHS of atomic update statement must be scalar"_err_en_US);
+ "RHS of atomic %s statement must be scalar"_err_en_US, construct);
+ }
+ // TODO: Check if lhs is intrinsic type
+ }
+}
+
+void AccStructureChecker::CheckAtomicUpdateStmt(
+ const parser::AssignmentStmt &assign) {
+ static std::string construct{"update"};
+ CheckAtomicStmt(assign, construct);
+}
+
+void AccStructureChecker::CheckAtomicWriteStmt(
+ const parser::AssignmentStmt &assign) {
+ static std::string construct{"write"};
+ CheckAtomicStmt(assign, construct);
+}
+
+void AccStructureChecker::CheckAtomicCaptureStmt(
+ const parser::AssignmentStmt &assign) {
+ static std::string construct{"capture"};
+ CheckAtomicStmt(assign, construct);
+}
+
+const parser::Variable *AccStructureChecker::GetIfAtomicUpdateVar(
+ const parser::AssignmentStmt &assign) const {
+ // OpenACC 3.4, 2893-2898
+ const auto &updatedVar{std::get<parser::Variable>(assign.t)};
+ const auto &rhs{std::get<parser::Expr>(assign.t)};
+
+ // Is the rhs something a valid operations that references the updatedVar?
+ const auto expr{GetExpr(context_, rhs)};
+ if (!expr) {
+ llvm::errs() << "IsAtomicUpdateStmt: no expr\n";
+ return nullptr;
+ }
+ const auto [op, args] = evaluate::GetTopLevelOperation(*expr);
----------------
klausler wrote:
should there be braces here?
https://github.com/llvm/llvm-project/pull/149579
More information about the flang-commits
mailing list