diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 73a4fc4091f5d..396025ff0a007 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -1479,14 +1479,6 @@ class OmpVisitor : public virtual DeclarationVisitor { static bool NeedsScope(const parser::OmpBlockConstruct &); static bool NeedsScope(const parser::OmpClause &); - bool Pre(const parser::OmpMetadirectiveDirective &x) { // - ++metaLevel_; - return true; - } - void Post(const parser::OmpMetadirectiveDirective &) { // - --metaLevel_; - } - bool Pre(const parser::OpenMPRequiresConstruct &x) { AddOmpSourceRange(x.source); return true; @@ -1579,10 +1571,11 @@ class OmpVisitor : public virtual DeclarationVisitor { bool Pre(const parser::OpenMPDeclareReductionConstruct &x) { AddOmpSourceRange(x.source); + parser::OmpClauseList empty(std::list{}); + auto &maybeClauses{std::get>(x.t)}; ProcessReductionSpecifier( std::get>(x.t).value(), - std::get>(x.t), - declaratives_.back()); + maybeClauses ? *maybeClauses : empty, declaratives_.back()); return false; } bool Pre(const parser::OmpMapClause &); @@ -1738,12 +1731,11 @@ class OmpVisitor : public virtual DeclarationVisitor { void ProcessMapperSpecifier(const parser::OmpMapperSpecifier &spec, const parser::OmpClauseList &clauses); void ProcessReductionSpecifier(const parser::OmpReductionSpecifier &spec, - const std::optional &clauses, + const parser::OmpClauseList &clauses, const parser::OpenMPDeclarativeConstruct *wholeConstruct); void ResolveCriticalName(const parser::OmpArgument &arg); - int metaLevel_{0}; std::vector declaratives_; }; @@ -1871,7 +1863,7 @@ std::string MangleDefinedOperator(const parser::CharBlock &name) { void OmpVisitor::ProcessReductionSpecifier( const parser::OmpReductionSpecifier &spec, - const std::optional &clauses, + const parser::OmpClauseList &clauses, const parser::OpenMPDeclarativeConstruct *construct) { const parser::Name *name{nullptr}; parser::CharBlock mangledName; @@ -1999,39 +1991,31 @@ void OmpVisitor::ResolveCriticalName(const parser::OmpArgument &arg) { bool OmpVisitor::Pre(const parser::OmpDirectiveSpecification &x) { AddOmpSourceRange(x.source); - if (metaLevel_ == 0) { - // Not in METADIRECTIVE. - return true; - } - // If OmpDirectiveSpecification (which contains clauses) is a part of - // METADIRECTIVE, some semantic checks may not be applicable. - // Disable the semantic analysis for it in such cases to allow the compiler - // to parse METADIRECTIVE without flagging errors. - auto &maybeArgs{std::get>(x.t)}; - auto &maybeClauses{std::get>(x.t)}; + const parser::OmpArgumentList &args{x.Arguments()}; + const parser::OmpClauseList &clauses{x.Clauses()}; switch (x.DirId()) { case llvm::omp::Directive::OMPD_declare_mapper: - if (maybeArgs && maybeClauses) { - const parser::OmpArgument &first{maybeArgs->v.front()}; + if (!args.v.empty()) { + const parser::OmpArgument &first{args.v.front()}; if (auto *spec{std::get_if(&first.u)}) { - ProcessMapperSpecifier(*spec, *maybeClauses); + ProcessMapperSpecifier(*spec, clauses); } } break; case llvm::omp::Directive::OMPD_declare_reduction: - if (maybeArgs && maybeClauses) { - const parser::OmpArgument &first{maybeArgs->v.front()}; + if (!args.v.empty()) { + const parser::OmpArgument &first{args.v.front()}; if (auto *spec{std::get_if(&first.u)}) { - ProcessReductionSpecifier(*spec, maybeClauses, declaratives_.back()); + ProcessReductionSpecifier(*spec, clauses, declaratives_.back()); } } break; default: // Default processing. - Walk(maybeArgs); - Walk(maybeClauses); + Walk(args); + Walk(clauses); break; } return false;