diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h index 774fc9873f7bc..e90e9c617805d 100644 --- a/flang/include/flang/Semantics/symbol.h +++ b/flang/include/flang/Semantics/symbol.h @@ -30,8 +30,7 @@ class raw_ostream; } namespace Fortran::parser { struct Expr; -struct OpenMPDeclareReductionConstruct; -struct OmpMetadirectiveDirective; +struct OpenMPDeclarativeConstruct; } namespace Fortran::semantics { @@ -736,9 +735,7 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &, const GenericDetails &); class UserReductionDetails { public: using TypeVector = std::vector; - using DeclInfo = std::variant; - using DeclVector = std::vector; + using DeclVector = std::vector; UserReductionDetails() = default; @@ -756,7 +753,9 @@ class UserReductionDetails { return false; } - void AddDecl(const DeclInfo &decl) { declList_.emplace_back(decl); } + void AddDecl(const parser::OpenMPDeclarativeConstruct *decl) { + declList_.emplace_back(decl); + } const DeclVector &GetDeclList() const { return declList_; } private: diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp index 9d73bcafa0e15..b06a8c1fa4374 100644 --- a/flang/lib/Parser/unparse.cpp +++ b/flang/lib/Parser/unparse.cpp @@ -3082,11 +3082,7 @@ template void Unparse(llvm::raw_ostream &, const Expr &, const common::LangOptions &, Encoding, bool, bool, preStatementType *, AnalyzedObjectsAsFortran *); -template void Unparse( - llvm::raw_ostream &, const parser::OpenMPDeclareReductionConstruct &, - const common::LangOptions &, Encoding, bool, bool, preStatementType *, - AnalyzedObjectsAsFortran *); -template void Unparse(llvm::raw_ostream &, - const parser::OmpMetadirectiveDirective &, const common::LangOptions &, +template void Unparse(llvm::raw_ostream &, + const parser::OpenMPDeclarativeConstruct &, const common::LangOptions &, Encoding, bool, bool, preStatementType *, AnalyzedObjectsAsFortran *); } // namespace Fortran::parser diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp index 82c8536902eb2..8074c94b41e1a 100644 --- a/flang/lib/Semantics/mod-file.cpp +++ b/flang/lib/Semantics/mod-file.cpp @@ -1056,19 +1056,8 @@ void ModFileWriter::PutUserReduction( // The module content for a OpenMP Declare Reduction is the OpenMP // declaration. There may be multiple declarations. // Decls are pointers, so do not use a reference. - for (const auto decl : details.GetDeclList()) { - common::visit( // - common::visitors{// - [&](const parser::OpenMPDeclareReductionConstruct *d) { - Unparse(os, *d, context_.langOptions()); - }, - [&](const parser::OmpMetadirectiveDirective *m) { - Unparse(os, *m, context_.langOptions()); - }, - [&](const auto &) { - DIE("Unknown OpenMP DECLARE REDUCTION content"); - }}, - decl); + for (const auto *decl : details.GetDeclList()) { + Unparse(os, *decl, context_.langOptions()); } } diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index cdd8d6ff2f60e..69b8a45e6ceaa 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -1480,12 +1480,10 @@ class OmpVisitor : public virtual DeclarationVisitor { static bool NeedsScope(const parser::OmpClause &); bool Pre(const parser::OmpMetadirectiveDirective &x) { // - metaDirective_ = &x; ++metaLevel_; return true; } void Post(const parser::OmpMetadirectiveDirective &) { // - metaDirective_ = nullptr; --metaLevel_; } @@ -1583,7 +1581,8 @@ class OmpVisitor : public virtual DeclarationVisitor { AddOmpSourceRange(x.source); ProcessReductionSpecifier( std::get>(x.t).value(), - std::get>(x.t), x); + std::get>(x.t), + declaratives_.back()); return false; } bool Pre(const parser::OmpMapClause &); @@ -1684,9 +1683,11 @@ class OmpVisitor : public virtual DeclarationVisitor { // can implicitly declare variables instead of only using the // ones already declared in the Fortran sources. SkipImplicitTyping(true); + declaratives_.push_back(&x); return true; } void Post(const parser::OpenMPDeclarativeConstruct &) { + declaratives_.pop_back(); SkipImplicitTyping(false); messageHandler().set_currStmtSource(std::nullopt); } @@ -1728,15 +1729,14 @@ class OmpVisitor : public virtual DeclarationVisitor { private: void ProcessMapperSpecifier(const parser::OmpMapperSpecifier &spec, const parser::OmpClauseList &clauses); - template void ProcessReductionSpecifier(const parser::OmpReductionSpecifier &spec, const std::optional &clauses, - const T &wholeConstruct); + const parser::OpenMPDeclarativeConstruct *wholeConstruct); void ResolveCriticalName(const parser::OmpArgument &arg); int metaLevel_{0}; - const parser::OmpMetadirectiveDirective *metaDirective_{nullptr}; + std::vector declaratives_; }; bool OmpVisitor::NeedsScope(const parser::OmpBlockConstruct &x) { @@ -1861,11 +1861,10 @@ std::string MangleDefinedOperator(const parser::CharBlock &name) { return "op" + name.ToString(); } -template void OmpVisitor::ProcessReductionSpecifier( const parser::OmpReductionSpecifier &spec, const std::optional &clauses, - const T &wholeOmpConstruct) { + const parser::OpenMPDeclarativeConstruct *construct) { const parser::Name *name{nullptr}; parser::CharBlock mangledName; UserReductionDetails reductionDetailsTemp; @@ -1952,7 +1951,7 @@ void OmpVisitor::ProcessReductionSpecifier( PopScope(); } - reductionDetails->AddDecl(&wholeOmpConstruct); + reductionDetails->AddDecl(construct); if (!symbol) { symbol = &MakeSymbol(mangledName, Attrs{}, std::move(*reductionDetails)); @@ -2017,8 +2016,7 @@ bool OmpVisitor::Pre(const parser::OmpDirectiveSpecification &x) { if (maybeArgs && maybeClauses) { const parser::OmpArgument &first{maybeArgs->v.front()}; if (auto *spec{std::get_if(&first.u)}) { - CHECK(metaDirective_); - ProcessReductionSpecifier(*spec, maybeClauses, *metaDirective_); + ProcessReductionSpecifier(*spec, maybeClauses, declaratives_.back()); } } break;