@@ -624,11 +624,9 @@ void OmpStructureChecker::CheckMultListItems() {
624624
625625 // Linear clause
626626 for (auto [_, clause] : FindClauses (llvm::omp::Clause::OMPC_linear)) {
627- auto &linearClause{std::get<parser::OmpClause::Linear>(clause->u )};
628627 std::list<parser::Name> nameList;
629628 SymbolSourceMap symbols;
630- GetSymbolsInObjectList (
631- std::get<parser::OmpObjectList>(linearClause.v .t ), symbols);
629+ GetSymbolsInObjectList (*GetOmpObjectList (*clause), symbols);
632630 llvm::transform (symbols, std::back_inserter (nameList), [&](auto &&pair) {
633631 return parser::Name{pair.second , const_cast <Symbol *>(pair.first )};
634632 });
@@ -2101,29 +2099,29 @@ void OmpStructureChecker::Leave(const parser::OpenMPDeclareTargetConstruct &x) {
21012099 }
21022100 }
21032101
2104- bool toClauseFound{false }, deviceTypeClauseFound{false },
2105- enterClauseFound{false };
2102+ bool toClauseFound{false };
2103+ bool deviceTypeClauseFound{false };
2104+ bool enterClauseFound{false };
21062105 for (const parser::OmpClause &clause : x.v .Clauses ().v ) {
21072106 common::visit (
21082107 common::visitors{
2109- [&](const parser::OmpClause::To &toClause) {
2110- toClauseFound = true ;
2111- auto &objList{std::get<parser::OmpObjectList>(toClause.v .t )};
2112- CheckSymbolNames (dirName.source , objList);
2113- CheckVarIsNotPartOfAnotherVar (dirName.source , objList);
2114- CheckThreadprivateOrDeclareTargetVar (objList);
2115- },
2116- [&](const parser::OmpClause::Link &linkClause) {
2117- CheckSymbolNames (dirName.source , linkClause.v );
2118- CheckVarIsNotPartOfAnotherVar (dirName.source , linkClause.v );
2119- CheckThreadprivateOrDeclareTargetVar (linkClause.v );
2120- },
2121- [&](const parser::OmpClause::Enter &enterClause) {
2122- enterClauseFound = true ;
2123- auto &objList{std::get<parser::OmpObjectList>(enterClause.v .t )};
2124- CheckSymbolNames (dirName.source , objList);
2125- CheckVarIsNotPartOfAnotherVar (dirName.source , objList);
2126- CheckThreadprivateOrDeclareTargetVar (objList);
2108+ [&](const auto &c) {
2109+ using TypeC = llvm::remove_cvref_t <decltype (c)>;
2110+ if constexpr ( //
2111+ std::is_same_v<TypeC, parser::OmpClause::Enter> ||
2112+ std::is_same_v<TypeC, parser::OmpClause::Link> ||
2113+ std::is_same_v<TypeC, parser::OmpClause::To>) {
2114+ auto &objList{*GetOmpObjectList (c)};
2115+ CheckSymbolNames (dirName.source , objList);
2116+ CheckVarIsNotPartOfAnotherVar (dirName.source , objList);
2117+ CheckThreadprivateOrDeclareTargetVar (objList);
2118+ }
2119+ if constexpr (std::is_same_v<TypeC, parser::OmpClause::Enter>) {
2120+ enterClauseFound = true ;
2121+ }
2122+ if constexpr (std::is_same_v<TypeC, parser::OmpClause::To>) {
2123+ toClauseFound = true ;
2124+ }
21272125 },
21282126 [&](const parser::OmpClause::DeviceType &deviceTypeClause) {
21292127 deviceTypeClauseFound = true ;
@@ -2134,7 +2132,6 @@ void OmpStructureChecker::Leave(const parser::OpenMPDeclareTargetConstruct &x) {
21342132 deviceConstructFound_ = true ;
21352133 }
21362134 },
2137- [&](const auto &) {},
21382135 },
21392136 clause.u );
21402137
@@ -2424,12 +2421,8 @@ void OmpStructureChecker::CheckTargetUpdate() {
24242421 }
24252422 if (toWrapper && fromWrapper) {
24262423 SymbolSourceMap toSymbols, fromSymbols;
2427- auto &fromClause{std::get<parser::OmpClause::From>(fromWrapper->u ).v };
2428- auto &toClause{std::get<parser::OmpClause::To>(toWrapper->u ).v };
2429- GetSymbolsInObjectList (
2430- std::get<parser::OmpObjectList>(fromClause.t ), fromSymbols);
2431- GetSymbolsInObjectList (
2432- std::get<parser::OmpObjectList>(toClause.t ), toSymbols);
2424+ GetSymbolsInObjectList (*GetOmpObjectList (*fromWrapper), fromSymbols);
2425+ GetSymbolsInObjectList (*GetOmpObjectList (*toWrapper), toSymbols);
24332426
24342427 for (auto &[symbol, source] : toSymbols) {
24352428 auto fromSymbol{fromSymbols.find (symbol)};
@@ -3269,7 +3262,7 @@ void OmpStructureChecker::Leave(const parser::OmpClauseList &) {
32693262 const auto &irClause{
32703263 std::get<parser::OmpClause::InReduction>(dataEnvClause->u )};
32713264 checkVarAppearsInDataEnvClause (
3272- std::get<parser::OmpObjectList> (irClause. v . t ), " IN_REDUCTION" );
3265+ * GetOmpObjectList (irClause), " IN_REDUCTION" );
32733266 }
32743267 }
32753268 }
@@ -3421,7 +3414,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Destroy &x) {
34213414
34223415void OmpStructureChecker::Enter (const parser::OmpClause::Reduction &x) {
34233416 CheckAllowedClause (llvm::omp::Clause::OMPC_reduction);
3424- auto &objects{std::get<parser::OmpObjectList>(x. v . t )};
3417+ auto &objects{* GetOmpObjectList (x )};
34253418
34263419 if (OmpVerifyModifiers (x.v , llvm::omp::OMPC_reduction,
34273420 GetContext ().clauseSource , context_)) {
@@ -3461,7 +3454,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Reduction &x) {
34613454
34623455void OmpStructureChecker::Enter (const parser::OmpClause::InReduction &x) {
34633456 CheckAllowedClause (llvm::omp::Clause::OMPC_in_reduction);
3464- auto &objects{std::get<parser::OmpObjectList>(x. v . t )};
3457+ auto &objects{* GetOmpObjectList (x )};
34653458
34663459 if (OmpVerifyModifiers (x.v , llvm::omp::OMPC_in_reduction,
34673460 GetContext ().clauseSource , context_)) {
@@ -3479,7 +3472,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::InReduction &x) {
34793472
34803473void OmpStructureChecker::Enter (const parser::OmpClause::TaskReduction &x) {
34813474 CheckAllowedClause (llvm::omp::Clause::OMPC_task_reduction);
3482- auto &objects{std::get<parser::OmpObjectList>(x. v . t )};
3475+ auto &objects{* GetOmpObjectList (x )};
34833476
34843477 if (OmpVerifyModifiers (x.v , llvm::omp::OMPC_task_reduction,
34853478 GetContext ().clauseSource , context_)) {
@@ -4332,8 +4325,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Map &x) {
43324325 }};
43334326
43344327 evaluate::ExpressionAnalyzer ea{context_};
4335- const auto &objects{std::get<parser::OmpObjectList>(x.v .t )};
4336- for (auto &object : objects.v ) {
4328+ for (auto &object : GetOmpObjectList (x)->v ) {
43374329 if (const parser::Designator *d{GetDesignatorFromObj (object)}) {
43384330 if (auto &&expr{ea.Analyze (*d)}) {
43394331 if (hasBasePointer (*expr)) {
@@ -4486,7 +4478,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Depend &x) {
44864478 }
44874479 }
44884480 if (taskDep) {
4489- auto &objList{std::get<parser::OmpObjectList>( taskDep-> t )};
4481+ auto &objList{* GetOmpObjectList (* taskDep)};
44904482 if (dir == llvm::omp::OMPD_depobj) {
44914483 // [5.0:255:13], [5.1:288:6], [5.2:322:26]
44924484 // A depend clause on a depobj construct must only specify one locator.
@@ -4632,7 +4624,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Copyprivate &x) {
46324624void OmpStructureChecker::Enter (const parser::OmpClause::Lastprivate &x) {
46334625 CheckAllowedClause (llvm::omp::Clause::OMPC_lastprivate);
46344626
4635- const auto &objectList{std::get<parser::OmpObjectList>(x. v . t )};
4627+ const auto &objectList{* GetOmpObjectList (x )};
46364628 CheckVarIsNotPartOfAnotherVar (
46374629 GetContext ().clauseSource , objectList, " LASTPRIVATE" );
46384630 CheckCrayPointee (objectList, " LASTPRIVATE" );
@@ -4874,9 +4866,8 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Enter &x) {
48744866 x.v , llvm::omp::OMPC_enter, GetContext ().clauseSource , context_)) {
48754867 return ;
48764868 }
4877- const parser::OmpObjectList &objList{std::get<parser::OmpObjectList>(x.v .t )};
48784869 SymbolSourceMap symbols;
4879- GetSymbolsInObjectList (objList , symbols);
4870+ GetSymbolsInObjectList (* GetOmpObjectList (x) , symbols);
48804871 for (const auto &[symbol, source] : symbols) {
48814872 if (!IsExtendedListItem (*symbol)) {
48824873 context_.SayWithDecl (*symbol, source,
@@ -4899,7 +4890,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::From &x) {
48994890 CheckIteratorModifier (*iter);
49004891 }
49014892
4902- const auto &objList{std::get<parser::OmpObjectList>(x. v . t )};
4893+ const auto &objList{* GetOmpObjectList (x )};
49034894 SymbolSourceMap symbols;
49044895 GetSymbolsInObjectList (objList, symbols);
49054896 CheckVariableListItem (symbols);
@@ -4939,7 +4930,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::To &x) {
49394930 CheckIteratorModifier (*iter);
49404931 }
49414932
4942- const auto &objList{std::get<parser::OmpObjectList>(x. v . t )};
4933+ const auto &objList{* GetOmpObjectList (x )};
49434934 SymbolSourceMap symbols;
49444935 GetSymbolsInObjectList (objList, symbols);
49454936 CheckVariableListItem (symbols);
0 commit comments