@@ -222,47 +222,77 @@ static void SetAssignment(parser::AssignmentStmt::TypedAssignment &assign,
222222 }
223223}
224224
225- static parser::OpenMPAtomicConstruct::Analysis::Op MakeAtomicAnalysisOp (
226- int what,
227- const std::optional<evaluate::Assignment> &maybeAssign = std::nullopt ) {
228- parser::OpenMPAtomicConstruct::Analysis::Op operation;
229- operation.what = what;
230- SetAssignment (operation.assign , maybeAssign);
231- return operation;
232- }
225+ namespace {
226+ struct AtomicAnalysis {
227+ AtomicAnalysis (const SomeExpr &atom, const MaybeExpr &cond = std::nullopt )
228+ : atom_(atom), cond_(cond) {}
229+
230+ AtomicAnalysis &addOp0 (int what,
231+ const std::optional<evaluate::Assignment> &maybeAssign = std::nullopt ) {
232+ return addOp (op0_, what, maybeAssign);
233+ }
234+ AtomicAnalysis &addOp1 (int what,
235+ const std::optional<evaluate::Assignment> &maybeAssign = std::nullopt ) {
236+ return addOp (op1_, what, maybeAssign);
237+ }
233238
234- static parser::OpenMPAtomicConstruct::Analysis MakeAtomicAnalysis (
235- const SomeExpr &atom, const MaybeExpr &cond,
236- parser::OpenMPAtomicConstruct::Analysis::Op &&op0,
237- parser::OpenMPAtomicConstruct::Analysis::Op &&op1) {
238- // Defined in flang/include/flang/Parser/parse-tree.h
239- //
240- // struct Analysis {
241- // struct Kind {
242- // static constexpr int None = 0;
243- // static constexpr int Read = 1;
244- // static constexpr int Write = 2;
245- // static constexpr int Update = Read | Write;
246- // static constexpr int Action = 3; // Bits containing N, R, W, U
247- // static constexpr int IfTrue = 4;
248- // static constexpr int IfFalse = 8;
249- // static constexpr int Condition = 12; // Bits containing IfTrue, IfFalse
250- // };
251- // struct Op {
252- // int what;
253- // TypedAssignment assign;
254- // };
255- // TypedExpr atom, cond;
256- // Op op0, op1;
257- // };
258-
259- parser::OpenMPAtomicConstruct::Analysis an;
260- SetExpr (an.atom , atom);
261- SetExpr (an.cond , cond);
262- an.op0 = std::move (op0);
263- an.op1 = std::move (op1);
264- return an;
265- }
239+ operator parser::OpenMPAtomicConstruct::Analysis () const {
240+ // Defined in flang/include/flang/Parser/parse-tree.h
241+ //
242+ // struct Analysis {
243+ // struct Kind {
244+ // static constexpr int None = 0;
245+ // static constexpr int Read = 1;
246+ // static constexpr int Write = 2;
247+ // static constexpr int Update = Read | Write;
248+ // static constexpr int Action = 3; // Bits containing None, Read,
249+ // // Write, Update
250+ // static constexpr int IfTrue = 4;
251+ // static constexpr int IfFalse = 8;
252+ // static constexpr int Condition = 12; // Bits containing IfTrue,
253+ // // IfFalse
254+ // };
255+ // struct Op {
256+ // int what;
257+ // TypedAssignment assign;
258+ // };
259+ // TypedExpr atom, cond;
260+ // Op op0, op1;
261+ // };
262+
263+ parser::OpenMPAtomicConstruct::Analysis an;
264+ SetExpr (an.atom , atom_);
265+ SetExpr (an.cond , cond_);
266+ an.op0 = std::move (op0_);
267+ an.op1 = std::move (op1_);
268+ return an;
269+ }
270+
271+ private:
272+ struct Op {
273+ operator parser::OpenMPAtomicConstruct::Analysis::Op () const {
274+ parser::OpenMPAtomicConstruct::Analysis::Op op;
275+ op.what = what;
276+ SetAssignment (op.assign , assign);
277+ return op;
278+ }
279+
280+ int what;
281+ std::optional<evaluate::Assignment> assign;
282+ };
283+
284+ AtomicAnalysis &addOp (Op &op, int what,
285+ const std::optional<evaluate::Assignment> &maybeAssign) {
286+ op.what = what;
287+ op.assign = maybeAssign;
288+ return *this ;
289+ }
290+
291+ const SomeExpr &atom_;
292+ const MaybeExpr &cond_;
293+ Op op0_, op1_;
294+ };
295+ } // namespace
266296
267297// / Check if `expr` satisfies the following conditions for x and v:
268298// /
@@ -805,9 +835,9 @@ void OmpStructureChecker::CheckAtomicUpdateOnly(
805835 CheckAtomicUpdateAssignment (*maybeUpdate, action.source );
806836
807837 using Analysis = parser::OpenMPAtomicConstruct::Analysis;
808- x.analysis = MakeAtomicAnalysis (atom, std:: nullopt ,
809- MakeAtomicAnalysisOp (Analysis::Update, maybeUpdate),
810- MakeAtomicAnalysisOp (Analysis::None) );
838+ x.analysis = AtomicAnalysis (atom)
839+ . addOp0 (Analysis::Update, maybeUpdate)
840+ . addOp1 (Analysis::None);
811841 } else if (!IsAssignment (action.stmt )) {
812842 context_.Say (
813843 source, " ATOMIC UPDATE operation should be an assignment" _err_en_US);
@@ -889,9 +919,11 @@ void OmpStructureChecker::CheckAtomicConditionalUpdate(
889919 }
890920
891921 using Analysis = parser::OpenMPAtomicConstruct::Analysis;
892- x.analysis = MakeAtomicAnalysis (assign.lhs , update.cond ,
893- MakeAtomicAnalysisOp (Analysis::Update | Analysis::IfTrue, assign),
894- MakeAtomicAnalysisOp (Analysis::None));
922+ const SomeExpr &atom{assign.lhs };
923+
924+ x.analysis = AtomicAnalysis (atom, update.cond )
925+ .addOp0 (Analysis::Update | Analysis::IfTrue, assign)
926+ .addOp1 (Analysis::None);
895927}
896928
897929void OmpStructureChecker::CheckAtomicUpdateCapture (
@@ -936,13 +968,13 @@ void OmpStructureChecker::CheckAtomicUpdateCapture(
936968 }
937969
938970 if (GetActionStmt (&body.front ()).stmt == uact.stmt ) {
939- x.analysis = MakeAtomicAnalysis (atom, std:: nullopt ,
940- MakeAtomicAnalysisOp (action, update),
941- MakeAtomicAnalysisOp (Analysis::Read, capture) );
971+ x.analysis = AtomicAnalysis (atom)
972+ . addOp0 (action, update)
973+ . addOp1 (Analysis::Read, capture);
942974 } else {
943- x.analysis = MakeAtomicAnalysis (atom, std:: nullopt ,
944- MakeAtomicAnalysisOp (Analysis::Read, capture),
945- MakeAtomicAnalysisOp (action, update) );
975+ x.analysis = AtomicAnalysis (atom)
976+ . addOp0 (Analysis::Read, capture)
977+ . addOp1 (action, update);
946978 }
947979}
948980
@@ -1087,15 +1119,16 @@ void OmpStructureChecker::CheckAtomicConditionalUpdateCapture(
10871119
10881120 evaluate::Assignment updAssign{*GetEvaluateAssignment (update.ift .stmt )};
10891121 evaluate::Assignment capAssign{*GetEvaluateAssignment (capture.stmt )};
1122+ const SomeExpr &atom{updAssign.lhs };
10901123
10911124 if (captureFirst) {
1092- x.analysis = MakeAtomicAnalysis (updAssign. lhs , update.cond ,
1093- MakeAtomicAnalysisOp (Analysis::Read | captureWhen, capAssign),
1094- MakeAtomicAnalysisOp (Analysis::Write | updateWhen, updAssign) );
1125+ x.analysis = AtomicAnalysis (atom , update.cond )
1126+ . addOp0 (Analysis::Read | captureWhen, capAssign)
1127+ . addOp1 (Analysis::Write | updateWhen, updAssign);
10951128 } else {
1096- x.analysis = MakeAtomicAnalysis (updAssign. lhs , update.cond ,
1097- MakeAtomicAnalysisOp (Analysis::Write | updateWhen, updAssign),
1098- MakeAtomicAnalysisOp (Analysis::Read | captureWhen, capAssign) );
1129+ x.analysis = AtomicAnalysis (atom , update.cond )
1130+ . addOp0 (Analysis::Write | updateWhen, updAssign)
1131+ . addOp1 (Analysis::Read | captureWhen, capAssign);
10991132 }
11001133}
11011134
@@ -1125,9 +1158,9 @@ void OmpStructureChecker::CheckAtomicRead(
11251158 if (auto maybe{GetConvertInput (maybeRead->rhs )}) {
11261159 const SomeExpr &atom{*maybe};
11271160 using Analysis = parser::OpenMPAtomicConstruct::Analysis;
1128- x.analysis = MakeAtomicAnalysis (atom, std:: nullopt ,
1129- MakeAtomicAnalysisOp (Analysis::Read, maybeRead),
1130- MakeAtomicAnalysisOp (Analysis::None) );
1161+ x.analysis = AtomicAnalysis (atom)
1162+ . addOp0 (Analysis::Read, maybeRead)
1163+ . addOp1 (Analysis::None);
11311164 }
11321165 } else if (!IsAssignment (action.stmt )) {
11331166 context_.Say (
@@ -1159,9 +1192,9 @@ void OmpStructureChecker::CheckAtomicWrite(
11591192 CheckAtomicWriteAssignment (*maybeWrite, action.source );
11601193
11611194 using Analysis = parser::OpenMPAtomicConstruct::Analysis;
1162- x.analysis = MakeAtomicAnalysis (atom, std:: nullopt ,
1163- MakeAtomicAnalysisOp (Analysis::Write, maybeWrite),
1164- MakeAtomicAnalysisOp (Analysis::None) );
1195+ x.analysis = AtomicAnalysis (atom)
1196+ . addOp0 (Analysis::Write, maybeWrite)
1197+ . addOp1 (Analysis::None);
11651198 } else if (!IsAssignment (action.stmt )) {
11661199 context_.Say (
11671200 x.source , " ATOMIC WRITE operation should be an assignment" _err_en_US);
0 commit comments