diff options
Diffstat (limited to 'flang/lib/Semantics/mod-file.cpp')
-rw-r--r-- | flang/lib/Semantics/mod-file.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp index a1ec956..a726418 100644 --- a/flang/lib/Semantics/mod-file.cpp +++ b/flang/lib/Semantics/mod-file.cpp @@ -894,6 +894,7 @@ void ModFileWriter::PutEntity(llvm::raw_ostream &os, const Symbol &symbol) { [&](const ObjectEntityDetails &) { PutObjectEntity(os, symbol); }, [&](const ProcEntityDetails &) { PutProcEntity(os, symbol); }, [&](const TypeParamDetails &) { PutTypeParam(os, symbol); }, + [&](const UserReductionDetails &) { PutUserReduction(os, symbol); }, [&](const auto &) { common::die("PutEntity: unexpected details: %s", DetailsToString(symbol.details()).c_str()); @@ -1043,6 +1044,28 @@ void ModFileWriter::PutTypeParam(llvm::raw_ostream &os, const Symbol &symbol) { os << '\n'; } +void ModFileWriter::PutUserReduction( + llvm::raw_ostream &os, const Symbol &symbol) { + const auto &details{symbol.get<UserReductionDetails>()}; + // 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); + } +} + void PutInit(llvm::raw_ostream &os, const Symbol &symbol, const MaybeExpr &init, const parser::Expr *unanalyzed, SemanticsContext &context) { if (IsNamedConstant(symbol) || symbol.owner().IsDerivedType()) { |