164ab3302SCarolineConcatto //===-- lib/Parser/unparse.cpp --------------------------------------------===//
264ab3302SCarolineConcatto //
364ab3302SCarolineConcatto // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
464ab3302SCarolineConcatto // See https://llvm.org/LICENSE.txt for license information.
564ab3302SCarolineConcatto // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
664ab3302SCarolineConcatto //
764ab3302SCarolineConcatto //===----------------------------------------------------------------------===//
864ab3302SCarolineConcatto 
964ab3302SCarolineConcatto // Generates Fortran from the content of a parse tree, using the
1064ab3302SCarolineConcatto // traversal templates in parse-tree-visitor.h.
1164ab3302SCarolineConcatto 
1264ab3302SCarolineConcatto #include "flang/Parser/unparse.h"
1364ab3302SCarolineConcatto #include "flang/Common/Fortran.h"
1464ab3302SCarolineConcatto #include "flang/Common/idioms.h"
1564ab3302SCarolineConcatto #include "flang/Common/indirection.h"
1664ab3302SCarolineConcatto #include "flang/Parser/characters.h"
1764ab3302SCarolineConcatto #include "flang/Parser/parse-tree-visitor.h"
1864ab3302SCarolineConcatto #include "flang/Parser/parse-tree.h"
1992d27b96SJean Perier #include "flang/Parser/tools.h"
208670e499SCaroline Concatto #include "llvm/Support/raw_ostream.h"
2164ab3302SCarolineConcatto #include <algorithm>
2264ab3302SCarolineConcatto #include <cinttypes>
2364ab3302SCarolineConcatto #include <cstddef>
2464ab3302SCarolineConcatto #include <set>
2564ab3302SCarolineConcatto 
2664ab3302SCarolineConcatto namespace Fortran::parser {
2764ab3302SCarolineConcatto 
2864ab3302SCarolineConcatto class UnparseVisitor {
2964ab3302SCarolineConcatto public:
UnparseVisitor(llvm::raw_ostream & out,int indentationAmount,Encoding encoding,bool capitalize,bool backslashEscapes,preStatementType * preStatement,AnalyzedObjectsAsFortran * asFortran)308670e499SCaroline Concatto   UnparseVisitor(llvm::raw_ostream &out, int indentationAmount,
318670e499SCaroline Concatto       Encoding encoding, bool capitalize, bool backslashEscapes,
328670e499SCaroline Concatto       preStatementType *preStatement, AnalyzedObjectsAsFortran *asFortran)
3364ab3302SCarolineConcatto       : out_{out}, indentationAmount_{indentationAmount}, encoding_{encoding},
3464ab3302SCarolineConcatto         capitalizeKeywords_{capitalize}, backslashEscapes_{backslashEscapes},
3564ab3302SCarolineConcatto         preStatement_{preStatement}, asFortran_{asFortran} {}
3664ab3302SCarolineConcatto 
3764ab3302SCarolineConcatto   // In nearly all cases, this code avoids defining Boolean-valued Pre()
3864ab3302SCarolineConcatto   // callbacks for the parse tree walking framework in favor of two void
3964ab3302SCarolineConcatto   // functions, Before() and Unparse(), which imply true and false return
4064ab3302SCarolineConcatto   // values for Pre() respectively.
Before(const T &)4164ab3302SCarolineConcatto   template <typename T> void Before(const T &) {}
4264ab3302SCarolineConcatto   template <typename T> double Unparse(const T &); // not void, never used
4364ab3302SCarolineConcatto 
Pre(const T & x)4464ab3302SCarolineConcatto   template <typename T> bool Pre(const T &x) {
4564ab3302SCarolineConcatto     if constexpr (std::is_void_v<decltype(Unparse(x))>) {
4664ab3302SCarolineConcatto       // There is a local definition of Unparse() for this type.  It
4764ab3302SCarolineConcatto       // overrides the parse tree walker's default Walk() over the descendents.
4864ab3302SCarolineConcatto       Before(x);
4964ab3302SCarolineConcatto       Unparse(x);
5064ab3302SCarolineConcatto       Post(x);
5164ab3302SCarolineConcatto       return false; // Walk() does not visit descendents
5292d27b96SJean Perier     } else if constexpr (HasTypedExpr<T>::value) {
5392d27b96SJean Perier       // Format the expression representation from semantics
5492d27b96SJean Perier       if (asFortran_ && x.typedExpr) {
5592d27b96SJean Perier         asFortran_->expr(out_, *x.typedExpr);
5692d27b96SJean Perier         return false;
5792d27b96SJean Perier       } else {
5892d27b96SJean Perier         return true;
5992d27b96SJean Perier       }
6064ab3302SCarolineConcatto     } else {
6164ab3302SCarolineConcatto       Before(x);
6264ab3302SCarolineConcatto       return true; // there's no Unparse() defined here, Walk() the descendents
6364ab3302SCarolineConcatto     }
6464ab3302SCarolineConcatto   }
Post(const T &)6564ab3302SCarolineConcatto   template <typename T> void Post(const T &) {}
6664ab3302SCarolineConcatto 
6764ab3302SCarolineConcatto   // Emit simple types as-is.
Unparse(const std::string & x)6864ab3302SCarolineConcatto   void Unparse(const std::string &x) { Put(x); }
Unparse(int x)6964ab3302SCarolineConcatto   void Unparse(int x) { Put(std::to_string(x)); }
Unparse(unsigned int x)7064ab3302SCarolineConcatto   void Unparse(unsigned int x) { Put(std::to_string(x)); }
Unparse(long x)7164ab3302SCarolineConcatto   void Unparse(long x) { Put(std::to_string(x)); }
Unparse(unsigned long x)7264ab3302SCarolineConcatto   void Unparse(unsigned long x) { Put(std::to_string(x)); }
Unparse(long long x)7364ab3302SCarolineConcatto   void Unparse(long long x) { Put(std::to_string(x)); }
Unparse(unsigned long long x)7464ab3302SCarolineConcatto   void Unparse(unsigned long long x) { Put(std::to_string(x)); }
Unparse(char x)7564ab3302SCarolineConcatto   void Unparse(char x) { Put(x); }
7664ab3302SCarolineConcatto 
7764ab3302SCarolineConcatto   // Statement labels and ends of lines
Before(const Statement<T> & x)7864ab3302SCarolineConcatto   template <typename T> void Before(const Statement<T> &x) {
7964ab3302SCarolineConcatto     if (preStatement_) {
8064ab3302SCarolineConcatto       (*preStatement_)(x.source, out_, indent_);
8164ab3302SCarolineConcatto     }
8264ab3302SCarolineConcatto     Walk(x.label, " ");
8364ab3302SCarolineConcatto   }
Post(const Statement<T> &)8464ab3302SCarolineConcatto   template <typename T> void Post(const Statement<T> &) { Put('\n'); }
8564ab3302SCarolineConcatto 
8664ab3302SCarolineConcatto   // The special-case formatting functions for these productions are
8764ab3302SCarolineConcatto   // ordered to correspond roughly to their order of appearance in
8864ab3302SCarolineConcatto   // the Fortran 2018 standard (and parse-tree.h).
8964ab3302SCarolineConcatto 
Unparse(const Program & x)9064ab3302SCarolineConcatto   void Unparse(const Program &x) { // R501
9164ab3302SCarolineConcatto     Walk("", x.v, "\n"); // put blank lines between ProgramUnits
9264ab3302SCarolineConcatto   }
9364ab3302SCarolineConcatto 
Unparse(const Name & x)9464ab3302SCarolineConcatto   void Unparse(const Name &x) { // R603
9564ab3302SCarolineConcatto     Put(x.ToString());
9664ab3302SCarolineConcatto   }
Unparse(const DefinedOperator::IntrinsicOperator & x)9764ab3302SCarolineConcatto   void Unparse(const DefinedOperator::IntrinsicOperator &x) { // R608
9864ab3302SCarolineConcatto     switch (x) {
991f879005STim Keith     case DefinedOperator::IntrinsicOperator::Power:
1001f879005STim Keith       Put("**");
1011f879005STim Keith       break;
1021f879005STim Keith     case DefinedOperator::IntrinsicOperator::Multiply:
1031f879005STim Keith       Put('*');
1041f879005STim Keith       break;
1051f879005STim Keith     case DefinedOperator::IntrinsicOperator::Divide:
1061f879005STim Keith       Put('/');
1071f879005STim Keith       break;
1081f879005STim Keith     case DefinedOperator::IntrinsicOperator::Add:
1091f879005STim Keith       Put('+');
1101f879005STim Keith       break;
1111f879005STim Keith     case DefinedOperator::IntrinsicOperator::Subtract:
1121f879005STim Keith       Put('-');
1131f879005STim Keith       break;
1141f879005STim Keith     case DefinedOperator::IntrinsicOperator::Concat:
1151f879005STim Keith       Put("//");
1161f879005STim Keith       break;
1171f879005STim Keith     case DefinedOperator::IntrinsicOperator::LT:
1181f879005STim Keith       Put('<');
1191f879005STim Keith       break;
1201f879005STim Keith     case DefinedOperator::IntrinsicOperator::LE:
1211f879005STim Keith       Put("<=");
1221f879005STim Keith       break;
1231f879005STim Keith     case DefinedOperator::IntrinsicOperator::EQ:
1241f879005STim Keith       Put("==");
1251f879005STim Keith       break;
1261f879005STim Keith     case DefinedOperator::IntrinsicOperator::NE:
1271f879005STim Keith       Put("/=");
1281f879005STim Keith       break;
1291f879005STim Keith     case DefinedOperator::IntrinsicOperator::GE:
1301f879005STim Keith       Put(">=");
1311f879005STim Keith       break;
1321f879005STim Keith     case DefinedOperator::IntrinsicOperator::GT:
1331f879005STim Keith       Put('>');
1341f879005STim Keith       break;
1351f879005STim Keith     default:
1361f879005STim Keith       Put('.'), Word(DefinedOperator::EnumToString(x)), Put('.');
13764ab3302SCarolineConcatto     }
13864ab3302SCarolineConcatto   }
Post(const Star &)13964ab3302SCarolineConcatto   void Post(const Star &) { Put('*'); } // R701 &c.
Post(const TypeParamValue::Deferred &)14064ab3302SCarolineConcatto   void Post(const TypeParamValue::Deferred &) { Put(':'); } // R701
Unparse(const DeclarationTypeSpec::Type & x)14164ab3302SCarolineConcatto   void Unparse(const DeclarationTypeSpec::Type &x) { // R703
14264ab3302SCarolineConcatto     Word("TYPE("), Walk(x.derived), Put(')');
14364ab3302SCarolineConcatto   }
Unparse(const DeclarationTypeSpec::Class & x)14464ab3302SCarolineConcatto   void Unparse(const DeclarationTypeSpec::Class &x) {
14564ab3302SCarolineConcatto     Word("CLASS("), Walk(x.derived), Put(')');
14664ab3302SCarolineConcatto   }
Post(const DeclarationTypeSpec::ClassStar &)14764ab3302SCarolineConcatto   void Post(const DeclarationTypeSpec::ClassStar &) { Word("CLASS(*)"); }
Post(const DeclarationTypeSpec::TypeStar &)14864ab3302SCarolineConcatto   void Post(const DeclarationTypeSpec::TypeStar &) { Word("TYPE(*)"); }
Unparse(const DeclarationTypeSpec::Record & x)14964ab3302SCarolineConcatto   void Unparse(const DeclarationTypeSpec::Record &x) {
15064ab3302SCarolineConcatto     Word("RECORD/"), Walk(x.v), Put('/');
15164ab3302SCarolineConcatto   }
Before(const IntrinsicTypeSpec::Real &)15264ab3302SCarolineConcatto   void Before(const IntrinsicTypeSpec::Real &) { // R704
15364ab3302SCarolineConcatto     Word("REAL");
15464ab3302SCarolineConcatto   }
Before(const IntrinsicTypeSpec::Complex &)15564ab3302SCarolineConcatto   void Before(const IntrinsicTypeSpec::Complex &) { Word("COMPLEX"); }
Post(const IntrinsicTypeSpec::DoublePrecision &)15664ab3302SCarolineConcatto   void Post(const IntrinsicTypeSpec::DoublePrecision &) {
15764ab3302SCarolineConcatto     Word("DOUBLE PRECISION");
15864ab3302SCarolineConcatto   }
Before(const IntrinsicTypeSpec::Character &)15964ab3302SCarolineConcatto   void Before(const IntrinsicTypeSpec::Character &) { Word("CHARACTER"); }
Before(const IntrinsicTypeSpec::Logical &)16064ab3302SCarolineConcatto   void Before(const IntrinsicTypeSpec::Logical &) { Word("LOGICAL"); }
Post(const IntrinsicTypeSpec::DoubleComplex &)16164ab3302SCarolineConcatto   void Post(const IntrinsicTypeSpec::DoubleComplex &) {
16264ab3302SCarolineConcatto     Word("DOUBLE COMPLEX");
16364ab3302SCarolineConcatto   }
Before(const IntegerTypeSpec &)16464ab3302SCarolineConcatto   void Before(const IntegerTypeSpec &) { // R705
16564ab3302SCarolineConcatto     Word("INTEGER");
16664ab3302SCarolineConcatto   }
Unparse(const KindSelector & x)16764ab3302SCarolineConcatto   void Unparse(const KindSelector &x) { // R706
168cd03e96fSPeter Klausler     common::visit(
16964ab3302SCarolineConcatto         common::visitors{
17064ab3302SCarolineConcatto             [&](const ScalarIntConstantExpr &y) {
17164ab3302SCarolineConcatto               Put('('), Word("KIND="), Walk(y), Put(')');
17264ab3302SCarolineConcatto             },
17364ab3302SCarolineConcatto             [&](const KindSelector::StarSize &y) { Put('*'), Walk(y.v); },
17464ab3302SCarolineConcatto         },
17564ab3302SCarolineConcatto         x.u);
17664ab3302SCarolineConcatto   }
Unparse(const SignedIntLiteralConstant & x)17764ab3302SCarolineConcatto   void Unparse(const SignedIntLiteralConstant &x) { // R707
17864ab3302SCarolineConcatto     Put(std::get<CharBlock>(x.t).ToString());
17964ab3302SCarolineConcatto     Walk("_", std::get<std::optional<KindParam>>(x.t));
18064ab3302SCarolineConcatto   }
Unparse(const IntLiteralConstant & x)18164ab3302SCarolineConcatto   void Unparse(const IntLiteralConstant &x) { // R708
18264ab3302SCarolineConcatto     Put(std::get<CharBlock>(x.t).ToString());
18364ab3302SCarolineConcatto     Walk("_", std::get<std::optional<KindParam>>(x.t));
18464ab3302SCarolineConcatto   }
Unparse(const Sign & x)18564ab3302SCarolineConcatto   void Unparse(const Sign &x) { // R712
18664ab3302SCarolineConcatto     Put(x == Sign::Negative ? '-' : '+');
18764ab3302SCarolineConcatto   }
Unparse(const RealLiteralConstant & x)18864ab3302SCarolineConcatto   void Unparse(const RealLiteralConstant &x) { // R714, R715
18964ab3302SCarolineConcatto     Put(x.real.source.ToString()), Walk("_", x.kind);
19064ab3302SCarolineConcatto   }
Unparse(const ComplexLiteralConstant & x)19164ab3302SCarolineConcatto   void Unparse(const ComplexLiteralConstant &x) { // R718 - R720
19264ab3302SCarolineConcatto     Put('('), Walk(x.t, ","), Put(')');
19364ab3302SCarolineConcatto   }
Unparse(const CharSelector::LengthAndKind & x)19464ab3302SCarolineConcatto   void Unparse(const CharSelector::LengthAndKind &x) { // R721
19564ab3302SCarolineConcatto     Put('('), Word("KIND="), Walk(x.kind);
19664ab3302SCarolineConcatto     Walk(", LEN=", x.length), Put(')');
19764ab3302SCarolineConcatto   }
Unparse(const LengthSelector & x)19864ab3302SCarolineConcatto   void Unparse(const LengthSelector &x) { // R722
199cd03e96fSPeter Klausler     common::visit(common::visitors{
20064ab3302SCarolineConcatto                       [&](const TypeParamValue &y) {
20164ab3302SCarolineConcatto                         Put('('), Word("LEN="), Walk(y), Put(')');
20264ab3302SCarolineConcatto                       },
20364ab3302SCarolineConcatto                       [&](const CharLength &y) { Put('*'), Walk(y); },
20464ab3302SCarolineConcatto                   },
20564ab3302SCarolineConcatto         x.u);
20664ab3302SCarolineConcatto   }
Unparse(const CharLength & x)20764ab3302SCarolineConcatto   void Unparse(const CharLength &x) { // R723
208cd03e96fSPeter Klausler     common::visit(
20964ab3302SCarolineConcatto         common::visitors{
21064ab3302SCarolineConcatto             [&](const TypeParamValue &y) { Put('('), Walk(y), Put(')'); },
21164ab3302SCarolineConcatto             [&](const std::int64_t &y) { Walk(y); },
21264ab3302SCarolineConcatto         },
21364ab3302SCarolineConcatto         x.u);
21464ab3302SCarolineConcatto   }
Unparse(const CharLiteralConstant & x)21564ab3302SCarolineConcatto   void Unparse(const CharLiteralConstant &x) { // R724
21664ab3302SCarolineConcatto     const auto &str{std::get<std::string>(x.t)};
21764ab3302SCarolineConcatto     if (const auto &k{std::get<std::optional<KindParam>>(x.t)}) {
21864ab3302SCarolineConcatto       Walk(*k), Put('_');
21964ab3302SCarolineConcatto     }
22064ab3302SCarolineConcatto     PutNormalized(str);
22164ab3302SCarolineConcatto   }
Unparse(const HollerithLiteralConstant & x)22264ab3302SCarolineConcatto   void Unparse(const HollerithLiteralConstant &x) {
22364ab3302SCarolineConcatto     auto ucs{DecodeString<std::u32string, Encoding::UTF_8>(x.v, false)};
22464ab3302SCarolineConcatto     Unparse(ucs.size());
22564ab3302SCarolineConcatto     Put('H');
22664ab3302SCarolineConcatto     for (char32_t ch : ucs) {
22764ab3302SCarolineConcatto       EncodedCharacter encoded{EncodeCharacter(encoding_, ch)};
22864ab3302SCarolineConcatto       for (int j{0}; j < encoded.bytes; ++j) {
22964ab3302SCarolineConcatto         Put(encoded.buffer[j]);
23064ab3302SCarolineConcatto       }
23164ab3302SCarolineConcatto     }
23264ab3302SCarolineConcatto   }
Unparse(const LogicalLiteralConstant & x)23364ab3302SCarolineConcatto   void Unparse(const LogicalLiteralConstant &x) { // R725
23464ab3302SCarolineConcatto     Put(std::get<bool>(x.t) ? ".TRUE." : ".FALSE.");
23564ab3302SCarolineConcatto     Walk("_", std::get<std::optional<KindParam>>(x.t));
23664ab3302SCarolineConcatto   }
Unparse(const DerivedTypeStmt & x)23764ab3302SCarolineConcatto   void Unparse(const DerivedTypeStmt &x) { // R727
23864ab3302SCarolineConcatto     Word("TYPE"), Walk(", ", std::get<std::list<TypeAttrSpec>>(x.t), ", ");
23964ab3302SCarolineConcatto     Put(" :: "), Walk(std::get<Name>(x.t));
24064ab3302SCarolineConcatto     Walk("(", std::get<std::list<Name>>(x.t), ", ", ")");
24164ab3302SCarolineConcatto     Indent();
24264ab3302SCarolineConcatto   }
Unparse(const Abstract &)24364ab3302SCarolineConcatto   void Unparse(const Abstract &) { // R728, &c.
24464ab3302SCarolineConcatto     Word("ABSTRACT");
24564ab3302SCarolineConcatto   }
Post(const TypeAttrSpec::BindC &)24664ab3302SCarolineConcatto   void Post(const TypeAttrSpec::BindC &) { Word("BIND(C)"); }
Unparse(const TypeAttrSpec::Extends & x)24764ab3302SCarolineConcatto   void Unparse(const TypeAttrSpec::Extends &x) {
24864ab3302SCarolineConcatto     Word("EXTENDS("), Walk(x.v), Put(')');
24964ab3302SCarolineConcatto   }
Unparse(const EndTypeStmt & x)25064ab3302SCarolineConcatto   void Unparse(const EndTypeStmt &x) { // R730
25164ab3302SCarolineConcatto     Outdent(), Word("END TYPE"), Walk(" ", x.v);
25264ab3302SCarolineConcatto   }
Unparse(const SequenceStmt &)25364ab3302SCarolineConcatto   void Unparse(const SequenceStmt &) { // R731
25464ab3302SCarolineConcatto     Word("SEQUENCE");
25564ab3302SCarolineConcatto   }
Unparse(const TypeParamDefStmt & x)25664ab3302SCarolineConcatto   void Unparse(const TypeParamDefStmt &x) { // R732
25764ab3302SCarolineConcatto     Walk(std::get<IntegerTypeSpec>(x.t));
25864ab3302SCarolineConcatto     Put(", "), Walk(std::get<common::TypeParamAttr>(x.t));
25964ab3302SCarolineConcatto     Put(" :: "), Walk(std::get<std::list<TypeParamDecl>>(x.t), ", ");
26064ab3302SCarolineConcatto   }
Unparse(const TypeParamDecl & x)26164ab3302SCarolineConcatto   void Unparse(const TypeParamDecl &x) { // R733
26264ab3302SCarolineConcatto     Walk(std::get<Name>(x.t));
26364ab3302SCarolineConcatto     Walk("=", std::get<std::optional<ScalarIntConstantExpr>>(x.t));
26464ab3302SCarolineConcatto   }
Unparse(const DataComponentDefStmt & x)26564ab3302SCarolineConcatto   void Unparse(const DataComponentDefStmt &x) { // R737
26664ab3302SCarolineConcatto     const auto &dts{std::get<DeclarationTypeSpec>(x.t)};
26764ab3302SCarolineConcatto     const auto &attrs{std::get<std::list<ComponentAttrSpec>>(x.t)};
268c14cf92bSPeter Klausler     const auto &decls{std::get<std::list<ComponentOrFill>>(x.t)};
26964ab3302SCarolineConcatto     Walk(dts), Walk(", ", attrs, ", ");
27064ab3302SCarolineConcatto     if (!attrs.empty() ||
27164ab3302SCarolineConcatto         (!std::holds_alternative<DeclarationTypeSpec::Record>(dts.u) &&
27264ab3302SCarolineConcatto             std::none_of(
273c14cf92bSPeter Klausler                 decls.begin(), decls.end(), [](const ComponentOrFill &c) {
274cd03e96fSPeter Klausler                   return common::visit(
275c14cf92bSPeter Klausler                       common::visitors{
276c14cf92bSPeter Klausler                           [](const ComponentDecl &d) {
27764ab3302SCarolineConcatto                             const auto &init{
27864ab3302SCarolineConcatto                                 std::get<std::optional<Initialization>>(d.t)};
27964ab3302SCarolineConcatto                             return init &&
280c14cf92bSPeter Klausler                                 std::holds_alternative<std::list<
281c14cf92bSPeter Klausler                                     common::Indirection<DataStmtValue>>>(
28264ab3302SCarolineConcatto                                     init->u);
283c14cf92bSPeter Klausler                           },
284c14cf92bSPeter Klausler                           [](const FillDecl &) { return false; },
285c14cf92bSPeter Klausler                       },
286c14cf92bSPeter Klausler                       c.u);
28764ab3302SCarolineConcatto                 }))) {
28864ab3302SCarolineConcatto       Put(" ::");
28964ab3302SCarolineConcatto     }
29064ab3302SCarolineConcatto     Put(' '), Walk(decls, ", ");
29164ab3302SCarolineConcatto   }
Unparse(const Allocatable &)29264ab3302SCarolineConcatto   void Unparse(const Allocatable &) { // R738
29364ab3302SCarolineConcatto     Word("ALLOCATABLE");
29464ab3302SCarolineConcatto   }
Unparse(const Pointer &)29564ab3302SCarolineConcatto   void Unparse(const Pointer &) { Word("POINTER"); }
Unparse(const Contiguous &)29664ab3302SCarolineConcatto   void Unparse(const Contiguous &) { Word("CONTIGUOUS"); }
Before(const ComponentAttrSpec & x)29764ab3302SCarolineConcatto   void Before(const ComponentAttrSpec &x) {
298cd03e96fSPeter Klausler     common::visit(common::visitors{
29964ab3302SCarolineConcatto                       [&](const CoarraySpec &) { Word("CODIMENSION["); },
30064ab3302SCarolineConcatto                       [&](const ComponentArraySpec &) { Word("DIMENSION("); },
30164ab3302SCarolineConcatto                       [](const auto &) {},
30264ab3302SCarolineConcatto                   },
30364ab3302SCarolineConcatto         x.u);
30464ab3302SCarolineConcatto   }
Post(const ComponentAttrSpec & x)30564ab3302SCarolineConcatto   void Post(const ComponentAttrSpec &x) {
306cd03e96fSPeter Klausler     common::visit(common::visitors{
30764ab3302SCarolineConcatto                       [&](const CoarraySpec &) { Put(']'); },
30864ab3302SCarolineConcatto                       [&](const ComponentArraySpec &) { Put(')'); },
30964ab3302SCarolineConcatto                       [](const auto &) {},
31064ab3302SCarolineConcatto                   },
31164ab3302SCarolineConcatto         x.u);
31264ab3302SCarolineConcatto   }
Unparse(const ComponentDecl & x)31364ab3302SCarolineConcatto   void Unparse(const ComponentDecl &x) { // R739
31464ab3302SCarolineConcatto     Walk(std::get<ObjectName>(x.t));
31564ab3302SCarolineConcatto     Walk("(", std::get<std::optional<ComponentArraySpec>>(x.t), ")");
31664ab3302SCarolineConcatto     Walk("[", std::get<std::optional<CoarraySpec>>(x.t), "]");
31764ab3302SCarolineConcatto     Walk("*", std::get<std::optional<CharLength>>(x.t));
31864ab3302SCarolineConcatto     Walk(std::get<std::optional<Initialization>>(x.t));
31964ab3302SCarolineConcatto   }
Unparse(const FillDecl & x)320c14cf92bSPeter Klausler   void Unparse(const FillDecl &x) { // DEC extension
321c14cf92bSPeter Klausler     Put("%FILL");
322c14cf92bSPeter Klausler     Walk("(", std::get<std::optional<ComponentArraySpec>>(x.t), ")");
323c14cf92bSPeter Klausler     Walk("*", std::get<std::optional<CharLength>>(x.t));
324c14cf92bSPeter Klausler   }
Unparse(const ComponentArraySpec & x)32564ab3302SCarolineConcatto   void Unparse(const ComponentArraySpec &x) { // R740
326cd03e96fSPeter Klausler     common::visit(
327cd03e96fSPeter Klausler         common::visitors{
32864ab3302SCarolineConcatto             [&](const std::list<ExplicitShapeSpec> &y) { Walk(y, ","); },
32964ab3302SCarolineConcatto             [&](const DeferredShapeSpecList &y) { Walk(y); },
33064ab3302SCarolineConcatto         },
33164ab3302SCarolineConcatto         x.u);
33264ab3302SCarolineConcatto   }
Unparse(const ProcComponentDefStmt & x)33364ab3302SCarolineConcatto   void Unparse(const ProcComponentDefStmt &x) { // R741
33464ab3302SCarolineConcatto     Word("PROCEDURE(");
33564ab3302SCarolineConcatto     Walk(std::get<std::optional<ProcInterface>>(x.t)), Put(')');
33664ab3302SCarolineConcatto     Walk(", ", std::get<std::list<ProcComponentAttrSpec>>(x.t), ", ");
33764ab3302SCarolineConcatto     Put(" :: "), Walk(std::get<std::list<ProcDecl>>(x.t), ", ");
33864ab3302SCarolineConcatto   }
Unparse(const NoPass &)33964ab3302SCarolineConcatto   void Unparse(const NoPass &) { // R742
34064ab3302SCarolineConcatto     Word("NOPASS");
34164ab3302SCarolineConcatto   }
Unparse(const Pass & x)34264ab3302SCarolineConcatto   void Unparse(const Pass &x) { Word("PASS"), Walk("(", x.v, ")"); }
Unparse(const Initialization & x)34364ab3302SCarolineConcatto   void Unparse(const Initialization &x) { // R743 & R805
344cd03e96fSPeter Klausler     common::visit(
345cd03e96fSPeter Klausler         common::visitors{
34664ab3302SCarolineConcatto             [&](const ConstantExpr &y) { Put(" = "), Walk(y); },
34764ab3302SCarolineConcatto             [&](const NullInit &y) { Put(" => "), Walk(y); },
34864ab3302SCarolineConcatto             [&](const InitialDataTarget &y) { Put(" => "), Walk(y); },
34964ab3302SCarolineConcatto             [&](const std::list<common::Indirection<DataStmtValue>> &y) {
35064ab3302SCarolineConcatto               Walk("/", y, ", ", "/");
35164ab3302SCarolineConcatto             },
35264ab3302SCarolineConcatto         },
35364ab3302SCarolineConcatto         x.u);
35464ab3302SCarolineConcatto   }
Unparse(const PrivateStmt &)35564ab3302SCarolineConcatto   void Unparse(const PrivateStmt &) { // R745
35664ab3302SCarolineConcatto     Word("PRIVATE");
35764ab3302SCarolineConcatto   }
Unparse(const TypeBoundProcedureStmt::WithoutInterface & x)35864ab3302SCarolineConcatto   void Unparse(const TypeBoundProcedureStmt::WithoutInterface &x) { // R749
35964ab3302SCarolineConcatto     Word("PROCEDURE"), Walk(", ", x.attributes, ", ");
36064ab3302SCarolineConcatto     Put(" :: "), Walk(x.declarations, ", ");
36164ab3302SCarolineConcatto   }
Unparse(const TypeBoundProcedureStmt::WithInterface & x)36264ab3302SCarolineConcatto   void Unparse(const TypeBoundProcedureStmt::WithInterface &x) {
36364ab3302SCarolineConcatto     Word("PROCEDURE("), Walk(x.interfaceName), Put("), ");
36464ab3302SCarolineConcatto     Walk(x.attributes);
36564ab3302SCarolineConcatto     Put(" :: "), Walk(x.bindingNames, ", ");
36664ab3302SCarolineConcatto   }
Unparse(const TypeBoundProcDecl & x)36764ab3302SCarolineConcatto   void Unparse(const TypeBoundProcDecl &x) { // R750
36864ab3302SCarolineConcatto     Walk(std::get<Name>(x.t));
36964ab3302SCarolineConcatto     Walk(" => ", std::get<std::optional<Name>>(x.t));
37064ab3302SCarolineConcatto   }
Unparse(const TypeBoundGenericStmt & x)37164ab3302SCarolineConcatto   void Unparse(const TypeBoundGenericStmt &x) { // R751
37264ab3302SCarolineConcatto     Word("GENERIC"), Walk(", ", std::get<std::optional<AccessSpec>>(x.t));
37364ab3302SCarolineConcatto     Put(" :: "), Walk(std::get<common::Indirection<GenericSpec>>(x.t));
37464ab3302SCarolineConcatto     Put(" => "), Walk(std::get<std::list<Name>>(x.t), ", ");
37564ab3302SCarolineConcatto   }
Post(const BindAttr::Deferred &)37664ab3302SCarolineConcatto   void Post(const BindAttr::Deferred &) { Word("DEFERRED"); } // R752
Post(const BindAttr::Non_Overridable &)37764ab3302SCarolineConcatto   void Post(const BindAttr::Non_Overridable &) { Word("NON_OVERRIDABLE"); }
Unparse(const FinalProcedureStmt & x)37864ab3302SCarolineConcatto   void Unparse(const FinalProcedureStmt &x) { // R753
37964ab3302SCarolineConcatto     Word("FINAL :: "), Walk(x.v, ", ");
38064ab3302SCarolineConcatto   }
Unparse(const DerivedTypeSpec & x)38164ab3302SCarolineConcatto   void Unparse(const DerivedTypeSpec &x) { // R754
38264ab3302SCarolineConcatto     Walk(std::get<Name>(x.t));
38364ab3302SCarolineConcatto     Walk("(", std::get<std::list<TypeParamSpec>>(x.t), ",", ")");
38464ab3302SCarolineConcatto   }
Unparse(const TypeParamSpec & x)38564ab3302SCarolineConcatto   void Unparse(const TypeParamSpec &x) { // R755
38664ab3302SCarolineConcatto     Walk(std::get<std::optional<Keyword>>(x.t), "=");
38764ab3302SCarolineConcatto     Walk(std::get<TypeParamValue>(x.t));
38864ab3302SCarolineConcatto   }
Unparse(const StructureConstructor & x)38964ab3302SCarolineConcatto   void Unparse(const StructureConstructor &x) { // R756
39064ab3302SCarolineConcatto     Walk(std::get<DerivedTypeSpec>(x.t));
39164ab3302SCarolineConcatto     Put('('), Walk(std::get<std::list<ComponentSpec>>(x.t), ", "), Put(')');
39264ab3302SCarolineConcatto   }
Unparse(const ComponentSpec & x)39364ab3302SCarolineConcatto   void Unparse(const ComponentSpec &x) { // R757
39464ab3302SCarolineConcatto     Walk(std::get<std::optional<Keyword>>(x.t), "=");
39564ab3302SCarolineConcatto     Walk(std::get<ComponentDataSource>(x.t));
39664ab3302SCarolineConcatto   }
Unparse(const EnumDefStmt &)39764ab3302SCarolineConcatto   void Unparse(const EnumDefStmt &) { // R760
39864ab3302SCarolineConcatto     Word("ENUM, BIND(C)"), Indent();
39964ab3302SCarolineConcatto   }
Unparse(const EnumeratorDefStmt & x)40064ab3302SCarolineConcatto   void Unparse(const EnumeratorDefStmt &x) { // R761
40164ab3302SCarolineConcatto     Word("ENUMERATOR :: "), Walk(x.v, ", ");
40264ab3302SCarolineConcatto   }
Unparse(const Enumerator & x)40364ab3302SCarolineConcatto   void Unparse(const Enumerator &x) { // R762
40464ab3302SCarolineConcatto     Walk(std::get<NamedConstant>(x.t));
40564ab3302SCarolineConcatto     Walk(" = ", std::get<std::optional<ScalarIntConstantExpr>>(x.t));
40664ab3302SCarolineConcatto   }
Post(const EndEnumStmt &)40764ab3302SCarolineConcatto   void Post(const EndEnumStmt &) { // R763
40864ab3302SCarolineConcatto     Outdent(), Word("END ENUM");
40964ab3302SCarolineConcatto   }
Unparse(const BOZLiteralConstant & x)41064ab3302SCarolineConcatto   void Unparse(const BOZLiteralConstant &x) { // R764 - R767
41164ab3302SCarolineConcatto     Put(x.v);
41264ab3302SCarolineConcatto   }
Unparse(const AcValue::Triplet & x)41364ab3302SCarolineConcatto   void Unparse(const AcValue::Triplet &x) { // R773
41464ab3302SCarolineConcatto     Walk(std::get<0>(x.t)), Put(':'), Walk(std::get<1>(x.t));
41564ab3302SCarolineConcatto     Walk(":", std::get<std::optional<ScalarIntExpr>>(x.t));
41664ab3302SCarolineConcatto   }
Unparse(const ArrayConstructor & x)41764ab3302SCarolineConcatto   void Unparse(const ArrayConstructor &x) { // R769
41864ab3302SCarolineConcatto     Put('['), Walk(x.v), Put(']');
41964ab3302SCarolineConcatto   }
Unparse(const AcSpec & x)42064ab3302SCarolineConcatto   void Unparse(const AcSpec &x) { // R770
42164ab3302SCarolineConcatto     Walk(x.type, "::"), Walk(x.values, ", ");
42264ab3302SCarolineConcatto   }
Unparse(const LoopBounds<A,B> & x)42364ab3302SCarolineConcatto   template <typename A, typename B> void Unparse(const LoopBounds<A, B> &x) {
42464ab3302SCarolineConcatto     Walk(x.name), Put('='), Walk(x.lower), Put(','), Walk(x.upper);
42564ab3302SCarolineConcatto     Walk(",", x.step);
42664ab3302SCarolineConcatto   }
Unparse(const AcImpliedDo & x)42764ab3302SCarolineConcatto   void Unparse(const AcImpliedDo &x) { // R774
42864ab3302SCarolineConcatto     Put('('), Walk(std::get<std::list<AcValue>>(x.t), ", ");
42964ab3302SCarolineConcatto     Put(", "), Walk(std::get<AcImpliedDoControl>(x.t)), Put(')');
43064ab3302SCarolineConcatto   }
Unparse(const AcImpliedDoControl & x)43164ab3302SCarolineConcatto   void Unparse(const AcImpliedDoControl &x) { // R775
43264ab3302SCarolineConcatto     Walk(std::get<std::optional<IntegerTypeSpec>>(x.t), "::");
43364ab3302SCarolineConcatto     Walk(std::get<AcImpliedDoControl::Bounds>(x.t));
43464ab3302SCarolineConcatto   }
43564ab3302SCarolineConcatto 
Unparse(const TypeDeclarationStmt & x)43664ab3302SCarolineConcatto   void Unparse(const TypeDeclarationStmt &x) { // R801
43764ab3302SCarolineConcatto     const auto &dts{std::get<DeclarationTypeSpec>(x.t)};
43864ab3302SCarolineConcatto     const auto &attrs{std::get<std::list<AttrSpec>>(x.t)};
43964ab3302SCarolineConcatto     const auto &decls{std::get<std::list<EntityDecl>>(x.t)};
44064ab3302SCarolineConcatto     Walk(dts), Walk(", ", attrs, ", ");
44164ab3302SCarolineConcatto 
44264ab3302SCarolineConcatto     static const auto isInitializerOldStyle{[](const Initialization &i) {
44364ab3302SCarolineConcatto       return std::holds_alternative<
44464ab3302SCarolineConcatto           std::list<common::Indirection<DataStmtValue>>>(i.u);
44564ab3302SCarolineConcatto     }};
44664ab3302SCarolineConcatto     static const auto hasAssignmentInitializer{[](const EntityDecl &d) {
44764ab3302SCarolineConcatto       // Does a declaration have a new-style =x initializer?
44864ab3302SCarolineConcatto       const auto &init{std::get<std::optional<Initialization>>(d.t)};
44964ab3302SCarolineConcatto       return init && !isInitializerOldStyle(*init);
45064ab3302SCarolineConcatto     }};
45164ab3302SCarolineConcatto     static const auto hasSlashDelimitedInitializer{[](const EntityDecl &d) {
45264ab3302SCarolineConcatto       // Does a declaration have an old-style /x/ initializer?
45364ab3302SCarolineConcatto       const auto &init{std::get<std::optional<Initialization>>(d.t)};
45464ab3302SCarolineConcatto       return init && isInitializerOldStyle(*init);
45564ab3302SCarolineConcatto     }};
45664ab3302SCarolineConcatto     const auto useDoubledColons{[&]() {
45764ab3302SCarolineConcatto       bool isRecord{std::holds_alternative<DeclarationTypeSpec::Record>(dts.u)};
45864ab3302SCarolineConcatto       if (!attrs.empty()) {
45964ab3302SCarolineConcatto         // Attributes after the type require :: before the entities.
46064ab3302SCarolineConcatto         CHECK(!isRecord);
46164ab3302SCarolineConcatto         return true;
46264ab3302SCarolineConcatto       }
46364ab3302SCarolineConcatto       if (std::any_of(decls.begin(), decls.end(), hasAssignmentInitializer)) {
46464ab3302SCarolineConcatto         // Always use :: with new style standard initializers (=x),
46564ab3302SCarolineConcatto         // since the standard requires them to appear (even in free form,
46664ab3302SCarolineConcatto         // where mandatory spaces already disambiguate INTEGER J=666).
46764ab3302SCarolineConcatto         CHECK(!isRecord);
46864ab3302SCarolineConcatto         return true;
46964ab3302SCarolineConcatto       }
47064ab3302SCarolineConcatto       if (isRecord) {
47164ab3302SCarolineConcatto         // Never put :: in a legacy extension RECORD// statement.
47264ab3302SCarolineConcatto         return false;
47364ab3302SCarolineConcatto       }
47464ab3302SCarolineConcatto       // The :: is optional for this declaration.  Avoid usage that can
47564ab3302SCarolineConcatto       // crash the pgf90 compiler.
47664ab3302SCarolineConcatto       if (std::any_of(
47764ab3302SCarolineConcatto               decls.begin(), decls.end(), hasSlashDelimitedInitializer)) {
47864ab3302SCarolineConcatto         // Don't use :: when a declaration uses legacy DATA-statement-like
47964ab3302SCarolineConcatto         // /x/ initialization.
48064ab3302SCarolineConcatto         return false;
48164ab3302SCarolineConcatto       }
48264ab3302SCarolineConcatto       // Don't use :: with intrinsic types.  Otherwise, use it.
48364ab3302SCarolineConcatto       return !std::holds_alternative<IntrinsicTypeSpec>(dts.u);
48464ab3302SCarolineConcatto     }};
48564ab3302SCarolineConcatto 
48664ab3302SCarolineConcatto     if (useDoubledColons()) {
48764ab3302SCarolineConcatto       Put(" ::");
48864ab3302SCarolineConcatto     }
48964ab3302SCarolineConcatto     Put(' '), Walk(std::get<std::list<EntityDecl>>(x.t), ", ");
49064ab3302SCarolineConcatto   }
Before(const AttrSpec & x)49164ab3302SCarolineConcatto   void Before(const AttrSpec &x) { // R802
492cd03e96fSPeter Klausler     common::visit(common::visitors{
49364ab3302SCarolineConcatto                       [&](const CoarraySpec &) { Word("CODIMENSION["); },
49464ab3302SCarolineConcatto                       [&](const ArraySpec &) { Word("DIMENSION("); },
49564ab3302SCarolineConcatto                       [](const auto &) {},
49664ab3302SCarolineConcatto                   },
49764ab3302SCarolineConcatto         x.u);
49864ab3302SCarolineConcatto   }
Post(const AttrSpec & x)49964ab3302SCarolineConcatto   void Post(const AttrSpec &x) {
500cd03e96fSPeter Klausler     common::visit(common::visitors{
50164ab3302SCarolineConcatto                       [&](const CoarraySpec &) { Put(']'); },
50264ab3302SCarolineConcatto                       [&](const ArraySpec &) { Put(')'); },
50364ab3302SCarolineConcatto                       [](const auto &) {},
50464ab3302SCarolineConcatto                   },
50564ab3302SCarolineConcatto         x.u);
50664ab3302SCarolineConcatto   }
Unparse(const EntityDecl & x)50764ab3302SCarolineConcatto   void Unparse(const EntityDecl &x) { // R803
50864ab3302SCarolineConcatto     Walk(std::get<ObjectName>(x.t));
50964ab3302SCarolineConcatto     Walk("(", std::get<std::optional<ArraySpec>>(x.t), ")");
51064ab3302SCarolineConcatto     Walk("[", std::get<std::optional<CoarraySpec>>(x.t), "]");
51164ab3302SCarolineConcatto     Walk("*", std::get<std::optional<CharLength>>(x.t));
51264ab3302SCarolineConcatto     Walk(std::get<std::optional<Initialization>>(x.t));
51364ab3302SCarolineConcatto   }
Unparse(const NullInit &)51464ab3302SCarolineConcatto   void Unparse(const NullInit &) { // R806
51564ab3302SCarolineConcatto     Word("NULL()");
51664ab3302SCarolineConcatto   }
Unparse(const LanguageBindingSpec & x)51764ab3302SCarolineConcatto   void Unparse(const LanguageBindingSpec &x) { // R808 & R1528
51864ab3302SCarolineConcatto     Word("BIND(C"), Walk(", NAME=", x.v), Put(')');
51964ab3302SCarolineConcatto   }
Unparse(const CoarraySpec & x)52064ab3302SCarolineConcatto   void Unparse(const CoarraySpec &x) { // R809
521cd03e96fSPeter Klausler     common::visit(common::visitors{
52264ab3302SCarolineConcatto                       [&](const DeferredCoshapeSpecList &y) { Walk(y); },
52364ab3302SCarolineConcatto                       [&](const ExplicitCoshapeSpec &y) { Walk(y); },
52464ab3302SCarolineConcatto                   },
52564ab3302SCarolineConcatto         x.u);
52664ab3302SCarolineConcatto   }
Unparse(const DeferredCoshapeSpecList & x)52764ab3302SCarolineConcatto   void Unparse(const DeferredCoshapeSpecList &x) { // R810
52864ab3302SCarolineConcatto     for (auto j{x.v}; j > 0; --j) {
52964ab3302SCarolineConcatto       Put(':');
53064ab3302SCarolineConcatto       if (j > 1) {
53164ab3302SCarolineConcatto         Put(',');
53264ab3302SCarolineConcatto       }
53364ab3302SCarolineConcatto     }
53464ab3302SCarolineConcatto   }
Unparse(const ExplicitCoshapeSpec & x)53564ab3302SCarolineConcatto   void Unparse(const ExplicitCoshapeSpec &x) { // R811
53664ab3302SCarolineConcatto     Walk(std::get<std::list<ExplicitShapeSpec>>(x.t), ",", ",");
53764ab3302SCarolineConcatto     Walk(std::get<std::optional<SpecificationExpr>>(x.t), ":"), Put('*');
53864ab3302SCarolineConcatto   }
Unparse(const ExplicitShapeSpec & x)53964ab3302SCarolineConcatto   void Unparse(const ExplicitShapeSpec &x) { // R812 - R813 & R816 - R818
54064ab3302SCarolineConcatto     Walk(std::get<std::optional<SpecificationExpr>>(x.t), ":");
54164ab3302SCarolineConcatto     Walk(std::get<SpecificationExpr>(x.t));
54264ab3302SCarolineConcatto   }
Unparse(const ArraySpec & x)54364ab3302SCarolineConcatto   void Unparse(const ArraySpec &x) { // R815
544cd03e96fSPeter Klausler     common::visit(
545cd03e96fSPeter Klausler         common::visitors{
54664ab3302SCarolineConcatto             [&](const std::list<ExplicitShapeSpec> &y) { Walk(y, ","); },
54764ab3302SCarolineConcatto             [&](const std::list<AssumedShapeSpec> &y) { Walk(y, ","); },
54864ab3302SCarolineConcatto             [&](const DeferredShapeSpecList &y) { Walk(y); },
54964ab3302SCarolineConcatto             [&](const AssumedSizeSpec &y) { Walk(y); },
55064ab3302SCarolineConcatto             [&](const ImpliedShapeSpec &y) { Walk(y); },
55164ab3302SCarolineConcatto             [&](const AssumedRankSpec &y) { Walk(y); },
55264ab3302SCarolineConcatto         },
55364ab3302SCarolineConcatto         x.u);
55464ab3302SCarolineConcatto   }
Post(const AssumedShapeSpec &)55564ab3302SCarolineConcatto   void Post(const AssumedShapeSpec &) { Put(':'); } // R819
Unparse(const DeferredShapeSpecList & x)55664ab3302SCarolineConcatto   void Unparse(const DeferredShapeSpecList &x) { // R820
55764ab3302SCarolineConcatto     for (auto j{x.v}; j > 0; --j) {
55864ab3302SCarolineConcatto       Put(':');
55964ab3302SCarolineConcatto       if (j > 1) {
56064ab3302SCarolineConcatto         Put(',');
56164ab3302SCarolineConcatto       }
56264ab3302SCarolineConcatto     }
56364ab3302SCarolineConcatto   }
Unparse(const AssumedImpliedSpec & x)56464ab3302SCarolineConcatto   void Unparse(const AssumedImpliedSpec &x) { // R821
56564ab3302SCarolineConcatto     Walk(x.v, ":");
56664ab3302SCarolineConcatto     Put('*');
56764ab3302SCarolineConcatto   }
Unparse(const AssumedSizeSpec & x)56864ab3302SCarolineConcatto   void Unparse(const AssumedSizeSpec &x) { // R822
56964ab3302SCarolineConcatto     Walk(std::get<std::list<ExplicitShapeSpec>>(x.t), ",", ",");
57064ab3302SCarolineConcatto     Walk(std::get<AssumedImpliedSpec>(x.t));
57164ab3302SCarolineConcatto   }
Unparse(const ImpliedShapeSpec & x)57264ab3302SCarolineConcatto   void Unparse(const ImpliedShapeSpec &x) { // R823
57364ab3302SCarolineConcatto     Walk(x.v, ",");
57464ab3302SCarolineConcatto   }
Post(const AssumedRankSpec &)57564ab3302SCarolineConcatto   void Post(const AssumedRankSpec &) { Put(".."); } // R825
Post(const Asynchronous &)57664ab3302SCarolineConcatto   void Post(const Asynchronous &) { Word("ASYNCHRONOUS"); }
Post(const External &)57764ab3302SCarolineConcatto   void Post(const External &) { Word("EXTERNAL"); }
Post(const Intrinsic &)57864ab3302SCarolineConcatto   void Post(const Intrinsic &) { Word("INTRINSIC"); }
Post(const Optional &)57964ab3302SCarolineConcatto   void Post(const Optional &) { Word("OPTIONAL"); }
Post(const Parameter &)58064ab3302SCarolineConcatto   void Post(const Parameter &) { Word("PARAMETER"); }
Post(const Protected &)58164ab3302SCarolineConcatto   void Post(const Protected &) { Word("PROTECTED"); }
Post(const Save &)58264ab3302SCarolineConcatto   void Post(const Save &) { Word("SAVE"); }
Post(const Target &)58364ab3302SCarolineConcatto   void Post(const Target &) { Word("TARGET"); }
Post(const Value &)58464ab3302SCarolineConcatto   void Post(const Value &) { Word("VALUE"); }
Post(const Volatile &)58564ab3302SCarolineConcatto   void Post(const Volatile &) { Word("VOLATILE"); }
Unparse(const IntentSpec & x)58664ab3302SCarolineConcatto   void Unparse(const IntentSpec &x) { // R826
58764ab3302SCarolineConcatto     Word("INTENT("), Walk(x.v), Put(")");
58864ab3302SCarolineConcatto   }
Unparse(const AccessStmt & x)58964ab3302SCarolineConcatto   void Unparse(const AccessStmt &x) { // R827
59064ab3302SCarolineConcatto     Walk(std::get<AccessSpec>(x.t));
59164ab3302SCarolineConcatto     Walk(" :: ", std::get<std::list<AccessId>>(x.t), ", ");
59264ab3302SCarolineConcatto   }
Unparse(const AllocatableStmt & x)59364ab3302SCarolineConcatto   void Unparse(const AllocatableStmt &x) { // R829
59464ab3302SCarolineConcatto     Word("ALLOCATABLE :: "), Walk(x.v, ", ");
59564ab3302SCarolineConcatto   }
Unparse(const ObjectDecl & x)59664ab3302SCarolineConcatto   void Unparse(const ObjectDecl &x) { // R830 & R860
59764ab3302SCarolineConcatto     Walk(std::get<ObjectName>(x.t));
59864ab3302SCarolineConcatto     Walk("(", std::get<std::optional<ArraySpec>>(x.t), ")");
59964ab3302SCarolineConcatto     Walk("[", std::get<std::optional<CoarraySpec>>(x.t), "]");
60064ab3302SCarolineConcatto   }
Unparse(const AsynchronousStmt & x)60164ab3302SCarolineConcatto   void Unparse(const AsynchronousStmt &x) { // R831
60264ab3302SCarolineConcatto     Word("ASYNCHRONOUS :: "), Walk(x.v, ", ");
60364ab3302SCarolineConcatto   }
Unparse(const BindStmt & x)60464ab3302SCarolineConcatto   void Unparse(const BindStmt &x) { // R832
60564ab3302SCarolineConcatto     Walk(x.t, " :: ");
60664ab3302SCarolineConcatto   }
Unparse(const BindEntity & x)60764ab3302SCarolineConcatto   void Unparse(const BindEntity &x) { // R833
60864ab3302SCarolineConcatto     bool isCommon{std::get<BindEntity::Kind>(x.t) == BindEntity::Kind::Common};
60964ab3302SCarolineConcatto     const char *slash{isCommon ? "/" : ""};
61064ab3302SCarolineConcatto     Put(slash), Walk(std::get<Name>(x.t)), Put(slash);
61164ab3302SCarolineConcatto   }
Unparse(const CodimensionStmt & x)61264ab3302SCarolineConcatto   void Unparse(const CodimensionStmt &x) { // R834
61364ab3302SCarolineConcatto     Word("CODIMENSION :: "), Walk(x.v, ", ");
61464ab3302SCarolineConcatto   }
Unparse(const CodimensionDecl & x)61564ab3302SCarolineConcatto   void Unparse(const CodimensionDecl &x) { // R835
61664ab3302SCarolineConcatto     Walk(std::get<Name>(x.t));
61764ab3302SCarolineConcatto     Put('['), Walk(std::get<CoarraySpec>(x.t)), Put(']');
61864ab3302SCarolineConcatto   }
Unparse(const ContiguousStmt & x)61964ab3302SCarolineConcatto   void Unparse(const ContiguousStmt &x) { // R836
62064ab3302SCarolineConcatto     Word("CONTIGUOUS :: "), Walk(x.v, ", ");
62164ab3302SCarolineConcatto   }
Unparse(const DataStmt & x)62264ab3302SCarolineConcatto   void Unparse(const DataStmt &x) { // R837
62364ab3302SCarolineConcatto     Word("DATA "), Walk(x.v, ", ");
62464ab3302SCarolineConcatto   }
Unparse(const DataStmtSet & x)62564ab3302SCarolineConcatto   void Unparse(const DataStmtSet &x) { // R838
62664ab3302SCarolineConcatto     Walk(std::get<std::list<DataStmtObject>>(x.t), ", ");
62764ab3302SCarolineConcatto     Put('/'), Walk(std::get<std::list<DataStmtValue>>(x.t), ", "), Put('/');
62864ab3302SCarolineConcatto   }
Unparse(const DataImpliedDo & x)62964ab3302SCarolineConcatto   void Unparse(const DataImpliedDo &x) { // R840, R842
63064ab3302SCarolineConcatto     Put('('), Walk(std::get<std::list<DataIDoObject>>(x.t), ", "), Put(',');
63164ab3302SCarolineConcatto     Walk(std::get<std::optional<IntegerTypeSpec>>(x.t), "::");
63264ab3302SCarolineConcatto     Walk(std::get<DataImpliedDo::Bounds>(x.t)), Put(')');
63364ab3302SCarolineConcatto   }
Unparse(const DataStmtValue & x)63464ab3302SCarolineConcatto   void Unparse(const DataStmtValue &x) { // R843
63564ab3302SCarolineConcatto     Walk(std::get<std::optional<DataStmtRepeat>>(x.t), "*");
63664ab3302SCarolineConcatto     Walk(std::get<DataStmtConstant>(x.t));
63764ab3302SCarolineConcatto   }
Unparse(const DimensionStmt & x)63864ab3302SCarolineConcatto   void Unparse(const DimensionStmt &x) { // R848
63964ab3302SCarolineConcatto     Word("DIMENSION :: "), Walk(x.v, ", ");
64064ab3302SCarolineConcatto   }
Unparse(const DimensionStmt::Declaration & x)64164ab3302SCarolineConcatto   void Unparse(const DimensionStmt::Declaration &x) {
64264ab3302SCarolineConcatto     Walk(std::get<Name>(x.t));
64364ab3302SCarolineConcatto     Put('('), Walk(std::get<ArraySpec>(x.t)), Put(')');
64464ab3302SCarolineConcatto   }
Unparse(const IntentStmt & x)64564ab3302SCarolineConcatto   void Unparse(const IntentStmt &x) { // R849
64664ab3302SCarolineConcatto     Walk(x.t, " :: ");
64764ab3302SCarolineConcatto   }
Unparse(const OptionalStmt & x)64864ab3302SCarolineConcatto   void Unparse(const OptionalStmt &x) { // R850
64964ab3302SCarolineConcatto     Word("OPTIONAL :: "), Walk(x.v, ", ");
65064ab3302SCarolineConcatto   }
Unparse(const ParameterStmt & x)65164ab3302SCarolineConcatto   void Unparse(const ParameterStmt &x) { // R851
65264ab3302SCarolineConcatto     Word("PARAMETER("), Walk(x.v, ", "), Put(')');
65364ab3302SCarolineConcatto   }
Unparse(const NamedConstantDef & x)65464ab3302SCarolineConcatto   void Unparse(const NamedConstantDef &x) { // R852
65564ab3302SCarolineConcatto     Walk(x.t, "=");
65664ab3302SCarolineConcatto   }
Unparse(const PointerStmt & x)65764ab3302SCarolineConcatto   void Unparse(const PointerStmt &x) { // R853
65864ab3302SCarolineConcatto     Word("POINTER :: "), Walk(x.v, ", ");
65964ab3302SCarolineConcatto   }
Unparse(const PointerDecl & x)66064ab3302SCarolineConcatto   void Unparse(const PointerDecl &x) { // R854
66164ab3302SCarolineConcatto     Walk(std::get<Name>(x.t));
66264ab3302SCarolineConcatto     Walk("(", std::get<std::optional<DeferredShapeSpecList>>(x.t), ")");
66364ab3302SCarolineConcatto   }
Unparse(const ProtectedStmt & x)66464ab3302SCarolineConcatto   void Unparse(const ProtectedStmt &x) { // R855
66564ab3302SCarolineConcatto     Word("PROTECTED :: "), Walk(x.v, ", ");
66664ab3302SCarolineConcatto   }
Unparse(const SaveStmt & x)66764ab3302SCarolineConcatto   void Unparse(const SaveStmt &x) { // R856
66864ab3302SCarolineConcatto     Word("SAVE"), Walk(" :: ", x.v, ", ");
66964ab3302SCarolineConcatto   }
Unparse(const SavedEntity & x)67064ab3302SCarolineConcatto   void Unparse(const SavedEntity &x) { // R857, R858
67164ab3302SCarolineConcatto     bool isCommon{
67264ab3302SCarolineConcatto         std::get<SavedEntity::Kind>(x.t) == SavedEntity::Kind::Common};
67364ab3302SCarolineConcatto     const char *slash{isCommon ? "/" : ""};
67464ab3302SCarolineConcatto     Put(slash), Walk(std::get<Name>(x.t)), Put(slash);
67564ab3302SCarolineConcatto   }
Unparse(const TargetStmt & x)67664ab3302SCarolineConcatto   void Unparse(const TargetStmt &x) { // R859
67764ab3302SCarolineConcatto     Word("TARGET :: "), Walk(x.v, ", ");
67864ab3302SCarolineConcatto   }
Unparse(const ValueStmt & x)67964ab3302SCarolineConcatto   void Unparse(const ValueStmt &x) { // R861
68064ab3302SCarolineConcatto     Word("VALUE :: "), Walk(x.v, ", ");
68164ab3302SCarolineConcatto   }
Unparse(const VolatileStmt & x)68264ab3302SCarolineConcatto   void Unparse(const VolatileStmt &x) { // R862
68364ab3302SCarolineConcatto     Word("VOLATILE :: "), Walk(x.v, ", ");
68464ab3302SCarolineConcatto   }
Unparse(const ImplicitStmt & x)68564ab3302SCarolineConcatto   void Unparse(const ImplicitStmt &x) { // R863
68664ab3302SCarolineConcatto     Word("IMPLICIT ");
687cd03e96fSPeter Klausler     common::visit(
688cd03e96fSPeter Klausler         common::visitors{
68964ab3302SCarolineConcatto             [&](const std::list<ImplicitSpec> &y) { Walk(y, ", "); },
69064ab3302SCarolineConcatto             [&](const std::list<ImplicitStmt::ImplicitNoneNameSpec> &y) {
69164ab3302SCarolineConcatto               Word("NONE"), Walk(" (", y, ", ", ")");
69264ab3302SCarolineConcatto             },
69364ab3302SCarolineConcatto         },
69464ab3302SCarolineConcatto         x.u);
69564ab3302SCarolineConcatto   }
Unparse(const ImplicitSpec & x)69664ab3302SCarolineConcatto   void Unparse(const ImplicitSpec &x) { // R864
69764ab3302SCarolineConcatto     Walk(std::get<DeclarationTypeSpec>(x.t));
69864ab3302SCarolineConcatto     Put('('), Walk(std::get<std::list<LetterSpec>>(x.t), ", "), Put(')');
69964ab3302SCarolineConcatto   }
Unparse(const LetterSpec & x)70064ab3302SCarolineConcatto   void Unparse(const LetterSpec &x) { // R865
70164ab3302SCarolineConcatto     Put(*std::get<const char *>(x.t));
70264ab3302SCarolineConcatto     auto second{std::get<std::optional<const char *>>(x.t)};
70364ab3302SCarolineConcatto     if (second) {
70464ab3302SCarolineConcatto       Put('-'), Put(**second);
70564ab3302SCarolineConcatto     }
70664ab3302SCarolineConcatto   }
Unparse(const ImportStmt & x)70764ab3302SCarolineConcatto   void Unparse(const ImportStmt &x) { // R867
70864ab3302SCarolineConcatto     Word("IMPORT");
70964ab3302SCarolineConcatto     switch (x.kind) {
7101f879005STim Keith     case common::ImportKind::Default:
7111f879005STim Keith       Walk(" :: ", x.names, ", ");
7121f879005STim Keith       break;
71364ab3302SCarolineConcatto     case common::ImportKind::Only:
71464ab3302SCarolineConcatto       Put(", "), Word("ONLY: ");
71564ab3302SCarolineConcatto       Walk(x.names, ", ");
71664ab3302SCarolineConcatto       break;
7171f879005STim Keith     case common::ImportKind::None:
7181f879005STim Keith       Word(", NONE");
7191f879005STim Keith       break;
7201f879005STim Keith     case common::ImportKind::All:
7211f879005STim Keith       Word(", ALL");
7221f879005STim Keith       break;
72364ab3302SCarolineConcatto     }
72464ab3302SCarolineConcatto   }
Unparse(const NamelistStmt & x)72564ab3302SCarolineConcatto   void Unparse(const NamelistStmt &x) { // R868
72664ab3302SCarolineConcatto     Word("NAMELIST"), Walk(x.v, ", ");
72764ab3302SCarolineConcatto   }
Unparse(const NamelistStmt::Group & x)72864ab3302SCarolineConcatto   void Unparse(const NamelistStmt::Group &x) {
72964ab3302SCarolineConcatto     Put('/'), Walk(std::get<Name>(x.t)), Put('/');
73064ab3302SCarolineConcatto     Walk(std::get<std::list<Name>>(x.t), ", ");
73164ab3302SCarolineConcatto   }
Unparse(const EquivalenceStmt & x)73264ab3302SCarolineConcatto   void Unparse(const EquivalenceStmt &x) { // R870, R871
73364ab3302SCarolineConcatto     Word("EQUIVALENCE");
73464ab3302SCarolineConcatto     const char *separator{" "};
73564ab3302SCarolineConcatto     for (const std::list<EquivalenceObject> &y : x.v) {
73664ab3302SCarolineConcatto       Put(separator), Put('('), Walk(y), Put(')');
73764ab3302SCarolineConcatto       separator = ", ";
73864ab3302SCarolineConcatto     }
73964ab3302SCarolineConcatto   }
Unparse(const CommonStmt & x)74064ab3302SCarolineConcatto   void Unparse(const CommonStmt &x) { // R873
74164ab3302SCarolineConcatto     Word("COMMON ");
74264ab3302SCarolineConcatto     Walk(x.blocks);
74364ab3302SCarolineConcatto   }
Unparse(const CommonBlockObject & x)74464ab3302SCarolineConcatto   void Unparse(const CommonBlockObject &x) { // R874
74564ab3302SCarolineConcatto     Walk(std::get<Name>(x.t));
74664ab3302SCarolineConcatto     Walk("(", std::get<std::optional<ArraySpec>>(x.t), ")");
74764ab3302SCarolineConcatto   }
Unparse(const CommonStmt::Block & x)74864ab3302SCarolineConcatto   void Unparse(const CommonStmt::Block &x) {
74964ab3302SCarolineConcatto     Word("/"), Walk(std::get<std::optional<Name>>(x.t)), Word("/");
75064ab3302SCarolineConcatto     Walk(std::get<std::list<CommonBlockObject>>(x.t));
75164ab3302SCarolineConcatto   }
75264ab3302SCarolineConcatto 
Unparse(const Substring & x)75364ab3302SCarolineConcatto   void Unparse(const Substring &x) { // R908, R909
75464ab3302SCarolineConcatto     Walk(std::get<DataRef>(x.t));
75564ab3302SCarolineConcatto     Put('('), Walk(std::get<SubstringRange>(x.t)), Put(')');
75664ab3302SCarolineConcatto   }
Unparse(const CharLiteralConstantSubstring & x)75764ab3302SCarolineConcatto   void Unparse(const CharLiteralConstantSubstring &x) {
75864ab3302SCarolineConcatto     Walk(std::get<CharLiteralConstant>(x.t));
75964ab3302SCarolineConcatto     Put('('), Walk(std::get<SubstringRange>(x.t)), Put(')');
76064ab3302SCarolineConcatto   }
Unparse(const SubstringInquiry & x)761*e03664d4SPeter Klausler   void Unparse(const SubstringInquiry &x) {
762*e03664d4SPeter Klausler     Walk(x.v);
763*e03664d4SPeter Klausler     Put(x.source.end()[-1] == 'n' ? "%LEN" : "%KIND");
764*e03664d4SPeter Klausler   }
Unparse(const SubstringRange & x)76564ab3302SCarolineConcatto   void Unparse(const SubstringRange &x) { // R910
76664ab3302SCarolineConcatto     Walk(x.t, ":");
76764ab3302SCarolineConcatto   }
Unparse(const PartRef & x)76864ab3302SCarolineConcatto   void Unparse(const PartRef &x) { // R912
76964ab3302SCarolineConcatto     Walk(x.name);
77064ab3302SCarolineConcatto     Walk("(", x.subscripts, ",", ")");
77164ab3302SCarolineConcatto     Walk(x.imageSelector);
77264ab3302SCarolineConcatto   }
Unparse(const StructureComponent & x)77364ab3302SCarolineConcatto   void Unparse(const StructureComponent &x) { // R913
77464ab3302SCarolineConcatto     Walk(x.base);
77564ab3302SCarolineConcatto     if (structureComponents_.find(x.component.source) !=
77664ab3302SCarolineConcatto         structureComponents_.end()) {
77764ab3302SCarolineConcatto       Put('.');
77864ab3302SCarolineConcatto     } else {
77964ab3302SCarolineConcatto       Put('%');
78064ab3302SCarolineConcatto     }
78164ab3302SCarolineConcatto     Walk(x.component);
78264ab3302SCarolineConcatto   }
Unparse(const ArrayElement & x)78364ab3302SCarolineConcatto   void Unparse(const ArrayElement &x) { // R917
78464ab3302SCarolineConcatto     Walk(x.base);
78564ab3302SCarolineConcatto     Put('('), Walk(x.subscripts, ","), Put(')');
78664ab3302SCarolineConcatto   }
Unparse(const SubscriptTriplet & x)78764ab3302SCarolineConcatto   void Unparse(const SubscriptTriplet &x) { // R921
78864ab3302SCarolineConcatto     Walk(std::get<0>(x.t)), Put(':'), Walk(std::get<1>(x.t));
78964ab3302SCarolineConcatto     Walk(":", std::get<2>(x.t));
79064ab3302SCarolineConcatto   }
Unparse(const ImageSelector & x)79164ab3302SCarolineConcatto   void Unparse(const ImageSelector &x) { // R924
79264ab3302SCarolineConcatto     Put('['), Walk(std::get<std::list<Cosubscript>>(x.t), ",");
79364ab3302SCarolineConcatto     Walk(",", std::get<std::list<ImageSelectorSpec>>(x.t), ","), Put(']');
79464ab3302SCarolineConcatto   }
Before(const ImageSelectorSpec::Stat &)79564ab3302SCarolineConcatto   void Before(const ImageSelectorSpec::Stat &) { // R926
79664ab3302SCarolineConcatto     Word("STAT=");
79764ab3302SCarolineConcatto   }
Before(const ImageSelectorSpec::Team_Number &)79864ab3302SCarolineConcatto   void Before(const ImageSelectorSpec::Team_Number &) { Word("TEAM_NUMBER="); }
Before(const ImageSelectorSpec & x)79964ab3302SCarolineConcatto   void Before(const ImageSelectorSpec &x) {
80064ab3302SCarolineConcatto     if (std::holds_alternative<TeamValue>(x.u)) {
80164ab3302SCarolineConcatto       Word("TEAM=");
80264ab3302SCarolineConcatto     }
80364ab3302SCarolineConcatto   }
Unparse(const AllocateStmt & x)80464ab3302SCarolineConcatto   void Unparse(const AllocateStmt &x) { // R927
80564ab3302SCarolineConcatto     Word("ALLOCATE(");
80664ab3302SCarolineConcatto     Walk(std::get<std::optional<TypeSpec>>(x.t), "::");
80764ab3302SCarolineConcatto     Walk(std::get<std::list<Allocation>>(x.t), ", ");
80864ab3302SCarolineConcatto     Walk(", ", std::get<std::list<AllocOpt>>(x.t), ", "), Put(')');
80964ab3302SCarolineConcatto   }
Before(const AllocOpt & x)81064ab3302SCarolineConcatto   void Before(const AllocOpt &x) { // R928, R931
811cd03e96fSPeter Klausler     common::visit(common::visitors{
81264ab3302SCarolineConcatto                       [&](const AllocOpt::Mold &) { Word("MOLD="); },
81364ab3302SCarolineConcatto                       [&](const AllocOpt::Source &) { Word("SOURCE="); },
81464ab3302SCarolineConcatto                       [](const StatOrErrmsg &) {},
81564ab3302SCarolineConcatto                   },
81664ab3302SCarolineConcatto         x.u);
81764ab3302SCarolineConcatto   }
Unparse(const Allocation & x)81864ab3302SCarolineConcatto   void Unparse(const Allocation &x) { // R932
81964ab3302SCarolineConcatto     Walk(std::get<AllocateObject>(x.t));
82064ab3302SCarolineConcatto     Walk("(", std::get<std::list<AllocateShapeSpec>>(x.t), ",", ")");
82164ab3302SCarolineConcatto     Walk("[", std::get<std::optional<AllocateCoarraySpec>>(x.t), "]");
82264ab3302SCarolineConcatto   }
Unparse(const AllocateShapeSpec & x)82364ab3302SCarolineConcatto   void Unparse(const AllocateShapeSpec &x) { // R934 & R938
82464ab3302SCarolineConcatto     Walk(std::get<std::optional<BoundExpr>>(x.t), ":");
82564ab3302SCarolineConcatto     Walk(std::get<BoundExpr>(x.t));
82664ab3302SCarolineConcatto   }
Unparse(const AllocateCoarraySpec & x)82764ab3302SCarolineConcatto   void Unparse(const AllocateCoarraySpec &x) { // R937
82864ab3302SCarolineConcatto     Walk(std::get<std::list<AllocateCoshapeSpec>>(x.t), ",", ",");
82964ab3302SCarolineConcatto     Walk(std::get<std::optional<BoundExpr>>(x.t), ":"), Put('*');
83064ab3302SCarolineConcatto   }
Unparse(const NullifyStmt & x)83164ab3302SCarolineConcatto   void Unparse(const NullifyStmt &x) { // R939
83264ab3302SCarolineConcatto     Word("NULLIFY("), Walk(x.v, ", "), Put(')');
83364ab3302SCarolineConcatto   }
Unparse(const DeallocateStmt & x)83464ab3302SCarolineConcatto   void Unparse(const DeallocateStmt &x) { // R941
83564ab3302SCarolineConcatto     Word("DEALLOCATE(");
83664ab3302SCarolineConcatto     Walk(std::get<std::list<AllocateObject>>(x.t), ", ");
83764ab3302SCarolineConcatto     Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "), Put(')');
83864ab3302SCarolineConcatto   }
Before(const StatOrErrmsg & x)83964ab3302SCarolineConcatto   void Before(const StatOrErrmsg &x) { // R942 & R1165
840cd03e96fSPeter Klausler     common::visit(common::visitors{
84164ab3302SCarolineConcatto                       [&](const StatVariable &) { Word("STAT="); },
84264ab3302SCarolineConcatto                       [&](const MsgVariable &) { Word("ERRMSG="); },
84364ab3302SCarolineConcatto                   },
84464ab3302SCarolineConcatto         x.u);
84564ab3302SCarolineConcatto   }
84664ab3302SCarolineConcatto 
84764ab3302SCarolineConcatto   // R1001 - R1022
Unparse(const Expr::Parentheses & x)84864ab3302SCarolineConcatto   void Unparse(const Expr::Parentheses &x) { Put('('), Walk(x.v), Put(')'); }
Before(const Expr::UnaryPlus &)84964ab3302SCarolineConcatto   void Before(const Expr::UnaryPlus &) { Put("+"); }
Before(const Expr::Negate &)85064ab3302SCarolineConcatto   void Before(const Expr::Negate &) { Put("-"); }
Before(const Expr::NOT &)85164ab3302SCarolineConcatto   void Before(const Expr::NOT &) { Word(".NOT."); }
Unparse(const Expr::PercentLoc & x)85264ab3302SCarolineConcatto   void Unparse(const Expr::PercentLoc &x) {
85364ab3302SCarolineConcatto     Word("%LOC("), Walk(x.v), Put(')');
85464ab3302SCarolineConcatto   }
Unparse(const Expr::Power & x)85564ab3302SCarolineConcatto   void Unparse(const Expr::Power &x) { Walk(x.t, "**"); }
Unparse(const Expr::Multiply & x)85664ab3302SCarolineConcatto   void Unparse(const Expr::Multiply &x) { Walk(x.t, "*"); }
Unparse(const Expr::Divide & x)85764ab3302SCarolineConcatto   void Unparse(const Expr::Divide &x) { Walk(x.t, "/"); }
Unparse(const Expr::Add & x)85864ab3302SCarolineConcatto   void Unparse(const Expr::Add &x) { Walk(x.t, "+"); }
Unparse(const Expr::Subtract & x)85964ab3302SCarolineConcatto   void Unparse(const Expr::Subtract &x) { Walk(x.t, "-"); }
Unparse(const Expr::Concat & x)86064ab3302SCarolineConcatto   void Unparse(const Expr::Concat &x) { Walk(x.t, "//"); }
Unparse(const Expr::LT & x)86164ab3302SCarolineConcatto   void Unparse(const Expr::LT &x) { Walk(x.t, "<"); }
Unparse(const Expr::LE & x)86264ab3302SCarolineConcatto   void Unparse(const Expr::LE &x) { Walk(x.t, "<="); }
Unparse(const Expr::EQ & x)86364ab3302SCarolineConcatto   void Unparse(const Expr::EQ &x) { Walk(x.t, "=="); }
Unparse(const Expr::NE & x)86464ab3302SCarolineConcatto   void Unparse(const Expr::NE &x) { Walk(x.t, "/="); }
Unparse(const Expr::GE & x)86564ab3302SCarolineConcatto   void Unparse(const Expr::GE &x) { Walk(x.t, ">="); }
Unparse(const Expr::GT & x)86664ab3302SCarolineConcatto   void Unparse(const Expr::GT &x) { Walk(x.t, ">"); }
Unparse(const Expr::AND & x)86764ab3302SCarolineConcatto   void Unparse(const Expr::AND &x) { Walk(x.t, ".AND."); }
Unparse(const Expr::OR & x)86864ab3302SCarolineConcatto   void Unparse(const Expr::OR &x) { Walk(x.t, ".OR."); }
Unparse(const Expr::EQV & x)86964ab3302SCarolineConcatto   void Unparse(const Expr::EQV &x) { Walk(x.t, ".EQV."); }
Unparse(const Expr::NEQV & x)87064ab3302SCarolineConcatto   void Unparse(const Expr::NEQV &x) { Walk(x.t, ".NEQV."); }
Unparse(const Expr::ComplexConstructor & x)87164ab3302SCarolineConcatto   void Unparse(const Expr::ComplexConstructor &x) {
87264ab3302SCarolineConcatto     Put('('), Walk(x.t, ","), Put(')');
87364ab3302SCarolineConcatto   }
Unparse(const Expr::DefinedBinary & x)87464ab3302SCarolineConcatto   void Unparse(const Expr::DefinedBinary &x) {
87564ab3302SCarolineConcatto     Walk(std::get<1>(x.t)); // left
87664ab3302SCarolineConcatto     Walk(std::get<DefinedOpName>(x.t));
87764ab3302SCarolineConcatto     Walk(std::get<2>(x.t)); // right
87864ab3302SCarolineConcatto   }
Unparse(const DefinedOpName & x)87964ab3302SCarolineConcatto   void Unparse(const DefinedOpName &x) { // R1003, R1023, R1414, & R1415
88064ab3302SCarolineConcatto     Walk(x.v);
88164ab3302SCarolineConcatto   }
Unparse(const AssignmentStmt & x)88264ab3302SCarolineConcatto   void Unparse(const AssignmentStmt &x) { // R1032
88364ab3302SCarolineConcatto     if (asFortran_ && x.typedAssignment.get()) {
88464ab3302SCarolineConcatto       Put(' ');
88564ab3302SCarolineConcatto       asFortran_->assignment(out_, *x.typedAssignment);
88664ab3302SCarolineConcatto       Put('\n');
88764ab3302SCarolineConcatto     } else {
88864ab3302SCarolineConcatto       Walk(x.t, " = ");
88964ab3302SCarolineConcatto     }
89064ab3302SCarolineConcatto   }
Unparse(const PointerAssignmentStmt & x)89164ab3302SCarolineConcatto   void Unparse(const PointerAssignmentStmt &x) { // R1033, R1034, R1038
89264ab3302SCarolineConcatto     if (asFortran_ && x.typedAssignment.get()) {
89364ab3302SCarolineConcatto       Put(' ');
89464ab3302SCarolineConcatto       asFortran_->assignment(out_, *x.typedAssignment);
89564ab3302SCarolineConcatto       Put('\n');
89664ab3302SCarolineConcatto     } else {
89764ab3302SCarolineConcatto       Walk(std::get<DataRef>(x.t));
898cd03e96fSPeter Klausler       common::visit(
89964ab3302SCarolineConcatto           common::visitors{
90064ab3302SCarolineConcatto               [&](const std::list<BoundsRemapping> &y) {
90164ab3302SCarolineConcatto                 Put('('), Walk(y), Put(')');
90264ab3302SCarolineConcatto               },
90364ab3302SCarolineConcatto               [&](const std::list<BoundsSpec> &y) { Walk("(", y, ", ", ")"); },
90464ab3302SCarolineConcatto           },
90564ab3302SCarolineConcatto           std::get<PointerAssignmentStmt::Bounds>(x.t).u);
90664ab3302SCarolineConcatto       Put(" => "), Walk(std::get<Expr>(x.t));
90764ab3302SCarolineConcatto     }
90864ab3302SCarolineConcatto   }
Post(const BoundsSpec &)90964ab3302SCarolineConcatto   void Post(const BoundsSpec &) { // R1035
91064ab3302SCarolineConcatto     Put(':');
91164ab3302SCarolineConcatto   }
Unparse(const BoundsRemapping & x)91264ab3302SCarolineConcatto   void Unparse(const BoundsRemapping &x) { // R1036
91364ab3302SCarolineConcatto     Walk(x.t, ":");
91464ab3302SCarolineConcatto   }
Unparse(const WhereStmt & x)91564ab3302SCarolineConcatto   void Unparse(const WhereStmt &x) { // R1041, R1045, R1046
91664ab3302SCarolineConcatto     Word("WHERE ("), Walk(x.t, ") ");
91764ab3302SCarolineConcatto   }
Unparse(const WhereConstructStmt & x)91864ab3302SCarolineConcatto   void Unparse(const WhereConstructStmt &x) { // R1043
91964ab3302SCarolineConcatto     Walk(std::get<std::optional<Name>>(x.t), ": ");
92064ab3302SCarolineConcatto     Word("WHERE ("), Walk(std::get<LogicalExpr>(x.t)), Put(')');
92164ab3302SCarolineConcatto     Indent();
92264ab3302SCarolineConcatto   }
Unparse(const MaskedElsewhereStmt & x)92364ab3302SCarolineConcatto   void Unparse(const MaskedElsewhereStmt &x) { // R1047
92464ab3302SCarolineConcatto     Outdent();
92564ab3302SCarolineConcatto     Word("ELSEWHERE ("), Walk(std::get<LogicalExpr>(x.t)), Put(')');
92664ab3302SCarolineConcatto     Walk(" ", std::get<std::optional<Name>>(x.t));
92764ab3302SCarolineConcatto     Indent();
92864ab3302SCarolineConcatto   }
Unparse(const ElsewhereStmt & x)92964ab3302SCarolineConcatto   void Unparse(const ElsewhereStmt &x) { // R1048
93064ab3302SCarolineConcatto     Outdent(), Word("ELSEWHERE"), Walk(" ", x.v), Indent();
93164ab3302SCarolineConcatto   }
Unparse(const EndWhereStmt & x)93264ab3302SCarolineConcatto   void Unparse(const EndWhereStmt &x) { // R1049
93364ab3302SCarolineConcatto     Outdent(), Word("END WHERE"), Walk(" ", x.v);
93464ab3302SCarolineConcatto   }
Unparse(const ForallConstructStmt & x)93564ab3302SCarolineConcatto   void Unparse(const ForallConstructStmt &x) { // R1051
93664ab3302SCarolineConcatto     Walk(std::get<std::optional<Name>>(x.t), ": ");
93764ab3302SCarolineConcatto     Word("FORALL"), Walk(std::get<common::Indirection<ConcurrentHeader>>(x.t));
93864ab3302SCarolineConcatto     Indent();
93964ab3302SCarolineConcatto   }
Unparse(const EndForallStmt & x)94064ab3302SCarolineConcatto   void Unparse(const EndForallStmt &x) { // R1054
94164ab3302SCarolineConcatto     Outdent(), Word("END FORALL"), Walk(" ", x.v);
94264ab3302SCarolineConcatto   }
Before(const ForallStmt &)94364ab3302SCarolineConcatto   void Before(const ForallStmt &) { // R1055
94464ab3302SCarolineConcatto     Word("FORALL");
94564ab3302SCarolineConcatto   }
94664ab3302SCarolineConcatto 
Unparse(const AssociateStmt & x)94764ab3302SCarolineConcatto   void Unparse(const AssociateStmt &x) { // R1103
94864ab3302SCarolineConcatto     Walk(std::get<std::optional<Name>>(x.t), ": ");
94964ab3302SCarolineConcatto     Word("ASSOCIATE (");
95064ab3302SCarolineConcatto     Walk(std::get<std::list<Association>>(x.t), ", "), Put(')'), Indent();
95164ab3302SCarolineConcatto   }
Unparse(const Association & x)95264ab3302SCarolineConcatto   void Unparse(const Association &x) { // R1104
95364ab3302SCarolineConcatto     Walk(x.t, " => ");
95464ab3302SCarolineConcatto   }
Unparse(const EndAssociateStmt & x)95564ab3302SCarolineConcatto   void Unparse(const EndAssociateStmt &x) { // R1106
95664ab3302SCarolineConcatto     Outdent(), Word("END ASSOCIATE"), Walk(" ", x.v);
95764ab3302SCarolineConcatto   }
Unparse(const BlockStmt & x)95864ab3302SCarolineConcatto   void Unparse(const BlockStmt &x) { // R1108
95964ab3302SCarolineConcatto     Walk(x.v, ": "), Word("BLOCK"), Indent();
96064ab3302SCarolineConcatto   }
Unparse(const EndBlockStmt & x)96164ab3302SCarolineConcatto   void Unparse(const EndBlockStmt &x) { // R1110
96264ab3302SCarolineConcatto     Outdent(), Word("END BLOCK"), Walk(" ", x.v);
96364ab3302SCarolineConcatto   }
Unparse(const ChangeTeamStmt & x)96464ab3302SCarolineConcatto   void Unparse(const ChangeTeamStmt &x) { // R1112
96564ab3302SCarolineConcatto     Walk(std::get<std::optional<Name>>(x.t), ": ");
96664ab3302SCarolineConcatto     Word("CHANGE TEAM ("), Walk(std::get<TeamValue>(x.t));
96764ab3302SCarolineConcatto     Walk(", ", std::get<std::list<CoarrayAssociation>>(x.t), ", ");
96864ab3302SCarolineConcatto     Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "), Put(')');
96964ab3302SCarolineConcatto     Indent();
97064ab3302SCarolineConcatto   }
Unparse(const CoarrayAssociation & x)97164ab3302SCarolineConcatto   void Unparse(const CoarrayAssociation &x) { // R1113
97264ab3302SCarolineConcatto     Walk(x.t, " => ");
97364ab3302SCarolineConcatto   }
Unparse(const EndChangeTeamStmt & x)97464ab3302SCarolineConcatto   void Unparse(const EndChangeTeamStmt &x) { // R1114
97564ab3302SCarolineConcatto     Outdent(), Word("END TEAM (");
97664ab3302SCarolineConcatto     Walk(std::get<std::list<StatOrErrmsg>>(x.t), ", ");
97764ab3302SCarolineConcatto     Put(')'), Walk(" ", std::get<std::optional<Name>>(x.t));
97864ab3302SCarolineConcatto   }
Unparse(const CriticalStmt & x)97964ab3302SCarolineConcatto   void Unparse(const CriticalStmt &x) { // R1117
98064ab3302SCarolineConcatto     Walk(std::get<std::optional<Name>>(x.t), ": ");
98164ab3302SCarolineConcatto     Word("CRITICAL ("), Walk(std::get<std::list<StatOrErrmsg>>(x.t), ", ");
98264ab3302SCarolineConcatto     Put(')'), Indent();
98364ab3302SCarolineConcatto   }
Unparse(const EndCriticalStmt & x)98464ab3302SCarolineConcatto   void Unparse(const EndCriticalStmt &x) { // R1118
98564ab3302SCarolineConcatto     Outdent(), Word("END CRITICAL"), Walk(" ", x.v);
98664ab3302SCarolineConcatto   }
Unparse(const DoConstruct & x)98764ab3302SCarolineConcatto   void Unparse(const DoConstruct &x) { // R1119, R1120
98864ab3302SCarolineConcatto     Walk(std::get<Statement<NonLabelDoStmt>>(x.t));
98964ab3302SCarolineConcatto     Indent(), Walk(std::get<Block>(x.t), ""), Outdent();
99064ab3302SCarolineConcatto     Walk(std::get<Statement<EndDoStmt>>(x.t));
99164ab3302SCarolineConcatto   }
Unparse(const LabelDoStmt & x)99264ab3302SCarolineConcatto   void Unparse(const LabelDoStmt &x) { // R1121
99364ab3302SCarolineConcatto     Walk(std::get<std::optional<Name>>(x.t), ": ");
99464ab3302SCarolineConcatto     Word("DO "), Walk(std::get<Label>(x.t));
99564ab3302SCarolineConcatto     Walk(" ", std::get<std::optional<LoopControl>>(x.t));
99664ab3302SCarolineConcatto   }
Unparse(const NonLabelDoStmt & x)99764ab3302SCarolineConcatto   void Unparse(const NonLabelDoStmt &x) { // R1122
99864ab3302SCarolineConcatto     Walk(std::get<std::optional<Name>>(x.t), ": ");
99964ab3302SCarolineConcatto     Word("DO "), Walk(std::get<std::optional<LoopControl>>(x.t));
100064ab3302SCarolineConcatto   }
Unparse(const LoopControl & x)100164ab3302SCarolineConcatto   void Unparse(const LoopControl &x) { // R1123
1002cd03e96fSPeter Klausler     common::visit(common::visitors{
100364ab3302SCarolineConcatto                       [&](const ScalarLogicalExpr &y) {
100464ab3302SCarolineConcatto                         Word("WHILE ("), Walk(y), Put(')');
100564ab3302SCarolineConcatto                       },
100664ab3302SCarolineConcatto                       [&](const auto &y) { Walk(y); },
100764ab3302SCarolineConcatto                   },
100864ab3302SCarolineConcatto         x.u);
100964ab3302SCarolineConcatto   }
Unparse(const ConcurrentHeader & x)101064ab3302SCarolineConcatto   void Unparse(const ConcurrentHeader &x) { // R1125
101164ab3302SCarolineConcatto     Put('('), Walk(std::get<std::optional<IntegerTypeSpec>>(x.t), "::");
101264ab3302SCarolineConcatto     Walk(std::get<std::list<ConcurrentControl>>(x.t), ", ");
101364ab3302SCarolineConcatto     Walk(", ", std::get<std::optional<ScalarLogicalExpr>>(x.t)), Put(')');
101464ab3302SCarolineConcatto   }
Unparse(const ConcurrentControl & x)101564ab3302SCarolineConcatto   void Unparse(const ConcurrentControl &x) { // R1126 - R1128
101664ab3302SCarolineConcatto     Walk(std::get<Name>(x.t)), Put('='), Walk(std::get<1>(x.t));
101764ab3302SCarolineConcatto     Put(':'), Walk(std::get<2>(x.t));
101864ab3302SCarolineConcatto     Walk(":", std::get<std::optional<ScalarIntExpr>>(x.t));
101964ab3302SCarolineConcatto   }
Before(const LoopControl::Concurrent &)102064ab3302SCarolineConcatto   void Before(const LoopControl::Concurrent &) { // R1129
102164ab3302SCarolineConcatto     Word("CONCURRENT");
102264ab3302SCarolineConcatto   }
Unparse(const LocalitySpec::Local & x)102364ab3302SCarolineConcatto   void Unparse(const LocalitySpec::Local &x) {
102464ab3302SCarolineConcatto     Word("LOCAL("), Walk(x.v, ", "), Put(')');
102564ab3302SCarolineConcatto   }
Unparse(const LocalitySpec::LocalInit & x)102664ab3302SCarolineConcatto   void Unparse(const LocalitySpec::LocalInit &x) {
102764ab3302SCarolineConcatto     Word("LOCAL_INIT("), Walk(x.v, ", "), Put(')');
102864ab3302SCarolineConcatto   }
Unparse(const LocalitySpec::Shared & x)102964ab3302SCarolineConcatto   void Unparse(const LocalitySpec::Shared &x) {
103064ab3302SCarolineConcatto     Word("SHARED("), Walk(x.v, ", "), Put(')');
103164ab3302SCarolineConcatto   }
Post(const LocalitySpec::DefaultNone &)103264ab3302SCarolineConcatto   void Post(const LocalitySpec::DefaultNone &) { Word("DEFAULT(NONE)"); }
Unparse(const EndDoStmt & x)103364ab3302SCarolineConcatto   void Unparse(const EndDoStmt &x) { // R1132
103464ab3302SCarolineConcatto     Word("END DO"), Walk(" ", x.v);
103564ab3302SCarolineConcatto   }
Unparse(const CycleStmt & x)103664ab3302SCarolineConcatto   void Unparse(const CycleStmt &x) { // R1133
103764ab3302SCarolineConcatto     Word("CYCLE"), Walk(" ", x.v);
103864ab3302SCarolineConcatto   }
Unparse(const IfThenStmt & x)103964ab3302SCarolineConcatto   void Unparse(const IfThenStmt &x) { // R1135
104064ab3302SCarolineConcatto     Walk(std::get<std::optional<Name>>(x.t), ": ");
104164ab3302SCarolineConcatto     Word("IF ("), Walk(std::get<ScalarLogicalExpr>(x.t));
104264ab3302SCarolineConcatto     Put(") "), Word("THEN"), Indent();
104364ab3302SCarolineConcatto   }
Unparse(const ElseIfStmt & x)104464ab3302SCarolineConcatto   void Unparse(const ElseIfStmt &x) { // R1136
104564ab3302SCarolineConcatto     Outdent(), Word("ELSE IF (");
104664ab3302SCarolineConcatto     Walk(std::get<ScalarLogicalExpr>(x.t)), Put(") "), Word("THEN");
104764ab3302SCarolineConcatto     Walk(" ", std::get<std::optional<Name>>(x.t)), Indent();
104864ab3302SCarolineConcatto   }
Unparse(const ElseStmt & x)104964ab3302SCarolineConcatto   void Unparse(const ElseStmt &x) { // R1137
105064ab3302SCarolineConcatto     Outdent(), Word("ELSE"), Walk(" ", x.v), Indent();
105164ab3302SCarolineConcatto   }
Unparse(const EndIfStmt & x)105264ab3302SCarolineConcatto   void Unparse(const EndIfStmt &x) { // R1138
105364ab3302SCarolineConcatto     Outdent(), Word("END IF"), Walk(" ", x.v);
105464ab3302SCarolineConcatto   }
Unparse(const IfStmt & x)105564ab3302SCarolineConcatto   void Unparse(const IfStmt &x) { // R1139
105664ab3302SCarolineConcatto     Word("IF ("), Walk(x.t, ") ");
105764ab3302SCarolineConcatto   }
Unparse(const SelectCaseStmt & x)105864ab3302SCarolineConcatto   void Unparse(const SelectCaseStmt &x) { // R1141, R1144
105964ab3302SCarolineConcatto     Walk(std::get<std::optional<Name>>(x.t), ": ");
106064ab3302SCarolineConcatto     Word("SELECT CASE (");
106164ab3302SCarolineConcatto     Walk(std::get<Scalar<Expr>>(x.t)), Put(')'), Indent();
106264ab3302SCarolineConcatto   }
Unparse(const CaseStmt & x)106364ab3302SCarolineConcatto   void Unparse(const CaseStmt &x) { // R1142
106464ab3302SCarolineConcatto     Outdent(), Word("CASE "), Walk(std::get<CaseSelector>(x.t));
106564ab3302SCarolineConcatto     Walk(" ", std::get<std::optional<Name>>(x.t)), Indent();
106664ab3302SCarolineConcatto   }
Unparse(const EndSelectStmt & x)106764ab3302SCarolineConcatto   void Unparse(const EndSelectStmt &x) { // R1143 & R1151 & R1155
106864ab3302SCarolineConcatto     Outdent(), Word("END SELECT"), Walk(" ", x.v);
106964ab3302SCarolineConcatto   }
Unparse(const CaseSelector & x)107064ab3302SCarolineConcatto   void Unparse(const CaseSelector &x) { // R1145
1071cd03e96fSPeter Klausler     common::visit(common::visitors{
107264ab3302SCarolineConcatto                       [&](const std::list<CaseValueRange> &y) {
107364ab3302SCarolineConcatto                         Put('('), Walk(y), Put(')');
107464ab3302SCarolineConcatto                       },
107564ab3302SCarolineConcatto                       [&](const Default &) { Word("DEFAULT"); },
107664ab3302SCarolineConcatto                   },
107764ab3302SCarolineConcatto         x.u);
107864ab3302SCarolineConcatto   }
Unparse(const CaseValueRange::Range & x)107964ab3302SCarolineConcatto   void Unparse(const CaseValueRange::Range &x) { // R1146
108064ab3302SCarolineConcatto     Walk(x.lower), Put(':'), Walk(x.upper);
108164ab3302SCarolineConcatto   }
Unparse(const SelectRankStmt & x)108264ab3302SCarolineConcatto   void Unparse(const SelectRankStmt &x) { // R1149
108364ab3302SCarolineConcatto     Walk(std::get<0>(x.t), ": ");
108464ab3302SCarolineConcatto     Word("SELECT RANK ("), Walk(std::get<1>(x.t), " => ");
108564ab3302SCarolineConcatto     Walk(std::get<Selector>(x.t)), Put(')'), Indent();
108664ab3302SCarolineConcatto   }
Unparse(const SelectRankCaseStmt & x)108764ab3302SCarolineConcatto   void Unparse(const SelectRankCaseStmt &x) { // R1150
108864ab3302SCarolineConcatto     Outdent(), Word("RANK ");
1089cd03e96fSPeter Klausler     common::visit(common::visitors{
109064ab3302SCarolineConcatto                       [&](const ScalarIntConstantExpr &y) {
109164ab3302SCarolineConcatto                         Put('('), Walk(y), Put(')');
109264ab3302SCarolineConcatto                       },
109364ab3302SCarolineConcatto                       [&](const Star &) { Put("(*)"); },
109464ab3302SCarolineConcatto                       [&](const Default &) { Word("DEFAULT"); },
109564ab3302SCarolineConcatto                   },
109664ab3302SCarolineConcatto         std::get<SelectRankCaseStmt::Rank>(x.t).u);
109764ab3302SCarolineConcatto     Walk(" ", std::get<std::optional<Name>>(x.t)), Indent();
109864ab3302SCarolineConcatto   }
Unparse(const SelectTypeStmt & x)109964ab3302SCarolineConcatto   void Unparse(const SelectTypeStmt &x) { // R1153
110064ab3302SCarolineConcatto     Walk(std::get<0>(x.t), ": ");
110164ab3302SCarolineConcatto     Word("SELECT TYPE ("), Walk(std::get<1>(x.t), " => ");
110264ab3302SCarolineConcatto     Walk(std::get<Selector>(x.t)), Put(')'), Indent();
110364ab3302SCarolineConcatto   }
Unparse(const TypeGuardStmt & x)110464ab3302SCarolineConcatto   void Unparse(const TypeGuardStmt &x) { // R1154
110564ab3302SCarolineConcatto     Outdent(), Walk(std::get<TypeGuardStmt::Guard>(x.t));
110664ab3302SCarolineConcatto     Walk(" ", std::get<std::optional<Name>>(x.t)), Indent();
110764ab3302SCarolineConcatto   }
Unparse(const TypeGuardStmt::Guard & x)110864ab3302SCarolineConcatto   void Unparse(const TypeGuardStmt::Guard &x) {
1109cd03e96fSPeter Klausler     common::visit(
111064ab3302SCarolineConcatto         common::visitors{
111164ab3302SCarolineConcatto             [&](const TypeSpec &y) { Word("TYPE IS ("), Walk(y), Put(')'); },
111264ab3302SCarolineConcatto             [&](const DerivedTypeSpec &y) {
111364ab3302SCarolineConcatto               Word("CLASS IS ("), Walk(y), Put(')');
111464ab3302SCarolineConcatto             },
111564ab3302SCarolineConcatto             [&](const Default &) { Word("CLASS DEFAULT"); },
111664ab3302SCarolineConcatto         },
111764ab3302SCarolineConcatto         x.u);
111864ab3302SCarolineConcatto   }
Unparse(const ExitStmt & x)111964ab3302SCarolineConcatto   void Unparse(const ExitStmt &x) { // R1156
112064ab3302SCarolineConcatto     Word("EXIT"), Walk(" ", x.v);
112164ab3302SCarolineConcatto   }
Before(const GotoStmt &)112264ab3302SCarolineConcatto   void Before(const GotoStmt &) { // R1157
112364ab3302SCarolineConcatto     Word("GO TO ");
112464ab3302SCarolineConcatto   }
Unparse(const ComputedGotoStmt & x)112564ab3302SCarolineConcatto   void Unparse(const ComputedGotoStmt &x) { // R1158
112664ab3302SCarolineConcatto     Word("GO TO ("), Walk(x.t, "), ");
112764ab3302SCarolineConcatto   }
Unparse(const ContinueStmt &)112864ab3302SCarolineConcatto   void Unparse(const ContinueStmt &) { // R1159
112964ab3302SCarolineConcatto     Word("CONTINUE");
113064ab3302SCarolineConcatto   }
Unparse(const StopStmt & x)113164ab3302SCarolineConcatto   void Unparse(const StopStmt &x) { // R1160, R1161
113264ab3302SCarolineConcatto     if (std::get<StopStmt::Kind>(x.t) == StopStmt::Kind::ErrorStop) {
113364ab3302SCarolineConcatto       Word("ERROR ");
113464ab3302SCarolineConcatto     }
113564ab3302SCarolineConcatto     Word("STOP"), Walk(" ", std::get<std::optional<StopCode>>(x.t));
113664ab3302SCarolineConcatto     Walk(", QUIET=", std::get<std::optional<ScalarLogicalExpr>>(x.t));
113764ab3302SCarolineConcatto   }
Unparse(const FailImageStmt &)113864ab3302SCarolineConcatto   void Unparse(const FailImageStmt &) { // R1163
113964ab3302SCarolineConcatto     Word("FAIL IMAGE");
114064ab3302SCarolineConcatto   }
Unparse(const SyncAllStmt & x)114164ab3302SCarolineConcatto   void Unparse(const SyncAllStmt &x) { // R1164
114264ab3302SCarolineConcatto     Word("SYNC ALL ("), Walk(x.v, ", "), Put(')');
114364ab3302SCarolineConcatto   }
Unparse(const SyncImagesStmt & x)114464ab3302SCarolineConcatto   void Unparse(const SyncImagesStmt &x) { // R1166
114564ab3302SCarolineConcatto     Word("SYNC IMAGES (");
114664ab3302SCarolineConcatto     Walk(std::get<SyncImagesStmt::ImageSet>(x.t));
114764ab3302SCarolineConcatto     Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "), Put(')');
114864ab3302SCarolineConcatto   }
Unparse(const SyncMemoryStmt & x)114964ab3302SCarolineConcatto   void Unparse(const SyncMemoryStmt &x) { // R1168
115064ab3302SCarolineConcatto     Word("SYNC MEMORY ("), Walk(x.v, ", "), Put(')');
115164ab3302SCarolineConcatto   }
Unparse(const SyncTeamStmt & x)115264ab3302SCarolineConcatto   void Unparse(const SyncTeamStmt &x) { // R1169
115364ab3302SCarolineConcatto     Word("SYNC TEAM ("), Walk(std::get<TeamValue>(x.t));
115464ab3302SCarolineConcatto     Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "), Put(')');
115564ab3302SCarolineConcatto   }
Unparse(const EventPostStmt & x)115664ab3302SCarolineConcatto   void Unparse(const EventPostStmt &x) { // R1170
115764ab3302SCarolineConcatto     Word("EVENT POST ("), Walk(std::get<EventVariable>(x.t));
115864ab3302SCarolineConcatto     Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "), Put(')');
115964ab3302SCarolineConcatto   }
Before(const EventWaitStmt::EventWaitSpec & x)116064ab3302SCarolineConcatto   void Before(const EventWaitStmt::EventWaitSpec &x) { // R1173, R1174
1161cd03e96fSPeter Klausler     common::visit(common::visitors{
116264ab3302SCarolineConcatto                       [&](const ScalarIntExpr &) { Word("UNTIL_COUNT="); },
116364ab3302SCarolineConcatto                       [](const StatOrErrmsg &) {},
116464ab3302SCarolineConcatto                   },
116564ab3302SCarolineConcatto         x.u);
116664ab3302SCarolineConcatto   }
Unparse(const EventWaitStmt & x)116764ab3302SCarolineConcatto   void Unparse(const EventWaitStmt &x) { // R1170
116864ab3302SCarolineConcatto     Word("EVENT WAIT ("), Walk(std::get<EventVariable>(x.t));
116964ab3302SCarolineConcatto     Walk(", ", std::get<std::list<EventWaitStmt::EventWaitSpec>>(x.t), ", ");
117064ab3302SCarolineConcatto     Put(')');
117164ab3302SCarolineConcatto   }
Unparse(const FormTeamStmt & x)117264ab3302SCarolineConcatto   void Unparse(const FormTeamStmt &x) { // R1175, R1177
117364ab3302SCarolineConcatto     Word("FORM TEAM ("), Walk(std::get<ScalarIntExpr>(x.t));
117464ab3302SCarolineConcatto     Put(','), Walk(std::get<TeamVariable>(x.t));
117564ab3302SCarolineConcatto     Walk(", ", std::get<std::list<FormTeamStmt::FormTeamSpec>>(x.t), ", ");
117664ab3302SCarolineConcatto     Put(')');
117764ab3302SCarolineConcatto   }
Before(const FormTeamStmt::FormTeamSpec & x)117864ab3302SCarolineConcatto   void Before(const FormTeamStmt::FormTeamSpec &x) { // R1176, R1178
1179cd03e96fSPeter Klausler     common::visit(common::visitors{
118064ab3302SCarolineConcatto                       [&](const ScalarIntExpr &) { Word("NEW_INDEX="); },
118164ab3302SCarolineConcatto                       [](const StatOrErrmsg &) {},
118264ab3302SCarolineConcatto                   },
118364ab3302SCarolineConcatto         x.u);
118464ab3302SCarolineConcatto   }
Unparse(const LockStmt & x)118564ab3302SCarolineConcatto   void Unparse(const LockStmt &x) { // R1179
118664ab3302SCarolineConcatto     Word("LOCK ("), Walk(std::get<LockVariable>(x.t));
118764ab3302SCarolineConcatto     Walk(", ", std::get<std::list<LockStmt::LockStat>>(x.t), ", ");
118864ab3302SCarolineConcatto     Put(')');
118964ab3302SCarolineConcatto   }
Before(const LockStmt::LockStat & x)119064ab3302SCarolineConcatto   void Before(const LockStmt::LockStat &x) { // R1180
1191cd03e96fSPeter Klausler     common::visit(
119264ab3302SCarolineConcatto         common::visitors{
119364ab3302SCarolineConcatto             [&](const ScalarLogicalVariable &) { Word("ACQUIRED_LOCK="); },
119464ab3302SCarolineConcatto             [](const StatOrErrmsg &) {},
119564ab3302SCarolineConcatto         },
119664ab3302SCarolineConcatto         x.u);
119764ab3302SCarolineConcatto   }
Unparse(const UnlockStmt & x)119864ab3302SCarolineConcatto   void Unparse(const UnlockStmt &x) { // R1181
119964ab3302SCarolineConcatto     Word("UNLOCK ("), Walk(std::get<LockVariable>(x.t));
120064ab3302SCarolineConcatto     Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", ");
120164ab3302SCarolineConcatto     Put(')');
120264ab3302SCarolineConcatto   }
120364ab3302SCarolineConcatto 
Unparse(const OpenStmt & x)120464ab3302SCarolineConcatto   void Unparse(const OpenStmt &x) { // R1204
120564ab3302SCarolineConcatto     Word("OPEN ("), Walk(x.v, ", "), Put(')');
120664ab3302SCarolineConcatto   }
Pre(const ConnectSpec & x)120764ab3302SCarolineConcatto   bool Pre(const ConnectSpec &x) { // R1205
1208cd03e96fSPeter Klausler     return common::visit(common::visitors{
120964ab3302SCarolineConcatto                              [&](const FileUnitNumber &) {
121064ab3302SCarolineConcatto                                Word("UNIT=");
121164ab3302SCarolineConcatto                                return true;
121264ab3302SCarolineConcatto                              },
121364ab3302SCarolineConcatto                              [&](const FileNameExpr &) {
121464ab3302SCarolineConcatto                                Word("FILE=");
121564ab3302SCarolineConcatto                                return true;
121664ab3302SCarolineConcatto                              },
121764ab3302SCarolineConcatto                              [&](const ConnectSpec::CharExpr &y) {
121864ab3302SCarolineConcatto                                Walk(y.t, "=");
121964ab3302SCarolineConcatto                                return false;
122064ab3302SCarolineConcatto                              },
122164ab3302SCarolineConcatto                              [&](const MsgVariable &) {
122264ab3302SCarolineConcatto                                Word("IOMSG=");
122364ab3302SCarolineConcatto                                return true;
122464ab3302SCarolineConcatto                              },
122564ab3302SCarolineConcatto                              [&](const StatVariable &) {
122664ab3302SCarolineConcatto                                Word("IOSTAT=");
122764ab3302SCarolineConcatto                                return true;
122864ab3302SCarolineConcatto                              },
122964ab3302SCarolineConcatto                              [&](const ConnectSpec::Recl &) {
123064ab3302SCarolineConcatto                                Word("RECL=");
123164ab3302SCarolineConcatto                                return true;
123264ab3302SCarolineConcatto                              },
123364ab3302SCarolineConcatto                              [&](const ConnectSpec::Newunit &) {
123464ab3302SCarolineConcatto                                Word("NEWUNIT=");
123564ab3302SCarolineConcatto                                return true;
123664ab3302SCarolineConcatto                              },
123764ab3302SCarolineConcatto                              [&](const ErrLabel &) {
123864ab3302SCarolineConcatto                                Word("ERR=");
123964ab3302SCarolineConcatto                                return true;
124064ab3302SCarolineConcatto                              },
124164ab3302SCarolineConcatto                              [&](const StatusExpr &) {
124264ab3302SCarolineConcatto                                Word("STATUS=");
124364ab3302SCarolineConcatto                                return true;
124464ab3302SCarolineConcatto                              },
124564ab3302SCarolineConcatto                          },
124664ab3302SCarolineConcatto         x.u);
124764ab3302SCarolineConcatto   }
Unparse(const CloseStmt & x)124864ab3302SCarolineConcatto   void Unparse(const CloseStmt &x) { // R1208
124964ab3302SCarolineConcatto     Word("CLOSE ("), Walk(x.v, ", "), Put(')');
125064ab3302SCarolineConcatto   }
Before(const CloseStmt::CloseSpec & x)125164ab3302SCarolineConcatto   void Before(const CloseStmt::CloseSpec &x) { // R1209
1252cd03e96fSPeter Klausler     common::visit(common::visitors{
125364ab3302SCarolineConcatto                       [&](const FileUnitNumber &) { Word("UNIT="); },
125464ab3302SCarolineConcatto                       [&](const StatVariable &) { Word("IOSTAT="); },
125564ab3302SCarolineConcatto                       [&](const MsgVariable &) { Word("IOMSG="); },
125664ab3302SCarolineConcatto                       [&](const ErrLabel &) { Word("ERR="); },
125764ab3302SCarolineConcatto                       [&](const StatusExpr &) { Word("STATUS="); },
125864ab3302SCarolineConcatto                   },
125964ab3302SCarolineConcatto         x.u);
126064ab3302SCarolineConcatto   }
Unparse(const ReadStmt & x)126164ab3302SCarolineConcatto   void Unparse(const ReadStmt &x) { // R1210
126264ab3302SCarolineConcatto     Word("READ ");
126364ab3302SCarolineConcatto     if (x.iounit) {
126464ab3302SCarolineConcatto       Put('('), Walk(x.iounit);
126564ab3302SCarolineConcatto       if (x.format) {
126664ab3302SCarolineConcatto         Put(", "), Walk(x.format);
126764ab3302SCarolineConcatto       }
126864ab3302SCarolineConcatto       Walk(", ", x.controls, ", ");
126964ab3302SCarolineConcatto       Put(')');
127064ab3302SCarolineConcatto     } else if (x.format) {
127164ab3302SCarolineConcatto       Walk(x.format);
127264ab3302SCarolineConcatto       if (!x.items.empty()) {
127364ab3302SCarolineConcatto         Put(", ");
127464ab3302SCarolineConcatto       }
127564ab3302SCarolineConcatto     } else {
127664ab3302SCarolineConcatto       Put('('), Walk(x.controls, ", "), Put(')');
127764ab3302SCarolineConcatto     }
127864ab3302SCarolineConcatto     Walk(" ", x.items, ", ");
127964ab3302SCarolineConcatto   }
Unparse(const WriteStmt & x)128064ab3302SCarolineConcatto   void Unparse(const WriteStmt &x) { // R1211
128164ab3302SCarolineConcatto     Word("WRITE (");
128264ab3302SCarolineConcatto     if (x.iounit) {
128364ab3302SCarolineConcatto       Walk(x.iounit);
128464ab3302SCarolineConcatto       if (x.format) {
128564ab3302SCarolineConcatto         Put(", "), Walk(x.format);
128664ab3302SCarolineConcatto       }
128764ab3302SCarolineConcatto       Walk(", ", x.controls, ", ");
128864ab3302SCarolineConcatto     } else {
128964ab3302SCarolineConcatto       Walk(x.controls, ", ");
129064ab3302SCarolineConcatto     }
129164ab3302SCarolineConcatto     Put(')'), Walk(" ", x.items, ", ");
129264ab3302SCarolineConcatto   }
Unparse(const PrintStmt & x)129364ab3302SCarolineConcatto   void Unparse(const PrintStmt &x) { // R1212
129464ab3302SCarolineConcatto     Word("PRINT "), Walk(std::get<Format>(x.t));
129564ab3302SCarolineConcatto     Walk(", ", std::get<std::list<OutputItem>>(x.t), ", ");
129664ab3302SCarolineConcatto   }
Pre(const IoControlSpec & x)129764ab3302SCarolineConcatto   bool Pre(const IoControlSpec &x) { // R1213
1298cd03e96fSPeter Klausler     return common::visit(common::visitors{
129964ab3302SCarolineConcatto                              [&](const IoUnit &) {
130064ab3302SCarolineConcatto                                Word("UNIT=");
130164ab3302SCarolineConcatto                                return true;
130264ab3302SCarolineConcatto                              },
130364ab3302SCarolineConcatto                              [&](const Format &) {
130464ab3302SCarolineConcatto                                Word("FMT=");
130564ab3302SCarolineConcatto                                return true;
130664ab3302SCarolineConcatto                              },
130764ab3302SCarolineConcatto                              [&](const Name &) {
130864ab3302SCarolineConcatto                                Word("NML=");
130964ab3302SCarolineConcatto                                return true;
131064ab3302SCarolineConcatto                              },
131164ab3302SCarolineConcatto                              [&](const IoControlSpec::CharExpr &y) {
131264ab3302SCarolineConcatto                                Walk(y.t, "=");
131364ab3302SCarolineConcatto                                return false;
131464ab3302SCarolineConcatto                              },
131564ab3302SCarolineConcatto                              [&](const IoControlSpec::Asynchronous &) {
131664ab3302SCarolineConcatto                                Word("ASYNCHRONOUS=");
131764ab3302SCarolineConcatto                                return true;
131864ab3302SCarolineConcatto                              },
131964ab3302SCarolineConcatto                              [&](const EndLabel &) {
132064ab3302SCarolineConcatto                                Word("END=");
132164ab3302SCarolineConcatto                                return true;
132264ab3302SCarolineConcatto                              },
132364ab3302SCarolineConcatto                              [&](const EorLabel &) {
132464ab3302SCarolineConcatto                                Word("EOR=");
132564ab3302SCarolineConcatto                                return true;
132664ab3302SCarolineConcatto                              },
132764ab3302SCarolineConcatto                              [&](const ErrLabel &) {
132864ab3302SCarolineConcatto                                Word("ERR=");
132964ab3302SCarolineConcatto                                return true;
133064ab3302SCarolineConcatto                              },
133164ab3302SCarolineConcatto                              [&](const IdVariable &) {
133264ab3302SCarolineConcatto                                Word("ID=");
133364ab3302SCarolineConcatto                                return true;
133464ab3302SCarolineConcatto                              },
133564ab3302SCarolineConcatto                              [&](const MsgVariable &) {
133664ab3302SCarolineConcatto                                Word("IOMSG=");
133764ab3302SCarolineConcatto                                return true;
133864ab3302SCarolineConcatto                              },
133964ab3302SCarolineConcatto                              [&](const StatVariable &) {
134064ab3302SCarolineConcatto                                Word("IOSTAT=");
134164ab3302SCarolineConcatto                                return true;
134264ab3302SCarolineConcatto                              },
134364ab3302SCarolineConcatto                              [&](const IoControlSpec::Pos &) {
134464ab3302SCarolineConcatto                                Word("POS=");
134564ab3302SCarolineConcatto                                return true;
134664ab3302SCarolineConcatto                              },
134764ab3302SCarolineConcatto                              [&](const IoControlSpec::Rec &) {
134864ab3302SCarolineConcatto                                Word("REC=");
134964ab3302SCarolineConcatto                                return true;
135064ab3302SCarolineConcatto                              },
135164ab3302SCarolineConcatto                              [&](const IoControlSpec::Size &) {
135264ab3302SCarolineConcatto                                Word("SIZE=");
135364ab3302SCarolineConcatto                                return true;
135464ab3302SCarolineConcatto                              },
135564ab3302SCarolineConcatto                          },
135664ab3302SCarolineConcatto         x.u);
135764ab3302SCarolineConcatto   }
Unparse(const InputImpliedDo & x)135864ab3302SCarolineConcatto   void Unparse(const InputImpliedDo &x) { // R1218
135964ab3302SCarolineConcatto     Put('('), Walk(std::get<std::list<InputItem>>(x.t), ", "), Put(", ");
136064ab3302SCarolineConcatto     Walk(std::get<IoImpliedDoControl>(x.t)), Put(')');
136164ab3302SCarolineConcatto   }
Unparse(const OutputImpliedDo & x)136264ab3302SCarolineConcatto   void Unparse(const OutputImpliedDo &x) { // R1219
136364ab3302SCarolineConcatto     Put('('), Walk(std::get<std::list<OutputItem>>(x.t), ", "), Put(", ");
136464ab3302SCarolineConcatto     Walk(std::get<IoImpliedDoControl>(x.t)), Put(')');
136564ab3302SCarolineConcatto   }
Unparse(const WaitStmt & x)136664ab3302SCarolineConcatto   void Unparse(const WaitStmt &x) { // R1222
136764ab3302SCarolineConcatto     Word("WAIT ("), Walk(x.v, ", "), Put(')');
136864ab3302SCarolineConcatto   }
Before(const WaitSpec & x)136964ab3302SCarolineConcatto   void Before(const WaitSpec &x) { // R1223
1370cd03e96fSPeter Klausler     common::visit(common::visitors{
137164ab3302SCarolineConcatto                       [&](const FileUnitNumber &) { Word("UNIT="); },
137264ab3302SCarolineConcatto                       [&](const EndLabel &) { Word("END="); },
137364ab3302SCarolineConcatto                       [&](const EorLabel &) { Word("EOR="); },
137464ab3302SCarolineConcatto                       [&](const ErrLabel &) { Word("ERR="); },
137564ab3302SCarolineConcatto                       [&](const IdExpr &) { Word("ID="); },
137664ab3302SCarolineConcatto                       [&](const MsgVariable &) { Word("IOMSG="); },
137764ab3302SCarolineConcatto                       [&](const StatVariable &) { Word("IOSTAT="); },
137864ab3302SCarolineConcatto                   },
137964ab3302SCarolineConcatto         x.u);
138064ab3302SCarolineConcatto   }
Unparse(const BackspaceStmt & x)138164ab3302SCarolineConcatto   void Unparse(const BackspaceStmt &x) { // R1224
138264ab3302SCarolineConcatto     Word("BACKSPACE ("), Walk(x.v, ", "), Put(')');
138364ab3302SCarolineConcatto   }
Unparse(const EndfileStmt & x)138464ab3302SCarolineConcatto   void Unparse(const EndfileStmt &x) { // R1225
138564ab3302SCarolineConcatto     Word("ENDFILE ("), Walk(x.v, ", "), Put(')');
138664ab3302SCarolineConcatto   }
Unparse(const RewindStmt & x)138764ab3302SCarolineConcatto   void Unparse(const RewindStmt &x) { // R1226
138864ab3302SCarolineConcatto     Word("REWIND ("), Walk(x.v, ", "), Put(')');
138964ab3302SCarolineConcatto   }
Before(const PositionOrFlushSpec & x)139064ab3302SCarolineConcatto   void Before(const PositionOrFlushSpec &x) { // R1227 & R1229
1391cd03e96fSPeter Klausler     common::visit(common::visitors{
139264ab3302SCarolineConcatto                       [&](const FileUnitNumber &) { Word("UNIT="); },
139364ab3302SCarolineConcatto                       [&](const MsgVariable &) { Word("IOMSG="); },
139464ab3302SCarolineConcatto                       [&](const StatVariable &) { Word("IOSTAT="); },
139564ab3302SCarolineConcatto                       [&](const ErrLabel &) { Word("ERR="); },
139664ab3302SCarolineConcatto                   },
139764ab3302SCarolineConcatto         x.u);
139864ab3302SCarolineConcatto   }
Unparse(const FlushStmt & x)139964ab3302SCarolineConcatto   void Unparse(const FlushStmt &x) { // R1228
140064ab3302SCarolineConcatto     Word("FLUSH ("), Walk(x.v, ", "), Put(')');
140164ab3302SCarolineConcatto   }
Unparse(const InquireStmt & x)140264ab3302SCarolineConcatto   void Unparse(const InquireStmt &x) { // R1230
140364ab3302SCarolineConcatto     Word("INQUIRE (");
1404cd03e96fSPeter Klausler     common::visit(
140564ab3302SCarolineConcatto         common::visitors{
140664ab3302SCarolineConcatto             [&](const InquireStmt::Iolength &y) {
140764ab3302SCarolineConcatto               Word("IOLENGTH="), Walk(y.t, ") ");
140864ab3302SCarolineConcatto             },
140964ab3302SCarolineConcatto             [&](const std::list<InquireSpec> &y) { Walk(y, ", "), Put(')'); },
141064ab3302SCarolineConcatto         },
141164ab3302SCarolineConcatto         x.u);
141264ab3302SCarolineConcatto   }
Pre(const InquireSpec & x)141364ab3302SCarolineConcatto   bool Pre(const InquireSpec &x) { // R1231
1414cd03e96fSPeter Klausler     return common::visit(common::visitors{
141564ab3302SCarolineConcatto                              [&](const FileUnitNumber &) {
141664ab3302SCarolineConcatto                                Word("UNIT=");
141764ab3302SCarolineConcatto                                return true;
141864ab3302SCarolineConcatto                              },
141964ab3302SCarolineConcatto                              [&](const FileNameExpr &) {
142064ab3302SCarolineConcatto                                Word("FILE=");
142164ab3302SCarolineConcatto                                return true;
142264ab3302SCarolineConcatto                              },
142364ab3302SCarolineConcatto                              [&](const InquireSpec::CharVar &y) {
142464ab3302SCarolineConcatto                                Walk(y.t, "=");
142564ab3302SCarolineConcatto                                return false;
142664ab3302SCarolineConcatto                              },
142764ab3302SCarolineConcatto                              [&](const InquireSpec::IntVar &y) {
142864ab3302SCarolineConcatto                                Walk(y.t, "=");
142964ab3302SCarolineConcatto                                return false;
143064ab3302SCarolineConcatto                              },
143164ab3302SCarolineConcatto                              [&](const InquireSpec::LogVar &y) {
143264ab3302SCarolineConcatto                                Walk(y.t, "=");
143364ab3302SCarolineConcatto                                return false;
143464ab3302SCarolineConcatto                              },
143564ab3302SCarolineConcatto                              [&](const IdExpr &) {
143664ab3302SCarolineConcatto                                Word("ID=");
143764ab3302SCarolineConcatto                                return true;
143864ab3302SCarolineConcatto                              },
143964ab3302SCarolineConcatto                              [&](const ErrLabel &) {
144064ab3302SCarolineConcatto                                Word("ERR=");
144164ab3302SCarolineConcatto                                return true;
144264ab3302SCarolineConcatto                              },
144364ab3302SCarolineConcatto                          },
144464ab3302SCarolineConcatto         x.u);
144564ab3302SCarolineConcatto   }
144664ab3302SCarolineConcatto 
Before(const FormatStmt &)144764ab3302SCarolineConcatto   void Before(const FormatStmt &) { // R1301
144864ab3302SCarolineConcatto     Word("FORMAT");
144964ab3302SCarolineConcatto   }
Unparse(const format::FormatSpecification & x)145064ab3302SCarolineConcatto   void Unparse(const format::FormatSpecification &x) { // R1302, R1303, R1305
145164ab3302SCarolineConcatto     Put('('), Walk("", x.items, ",", x.unlimitedItems.empty() ? "" : ",");
145264ab3302SCarolineConcatto     Walk("*(", x.unlimitedItems, ",", ")"), Put(')');
145364ab3302SCarolineConcatto   }
Unparse(const format::FormatItem & x)145464ab3302SCarolineConcatto   void Unparse(const format::FormatItem &x) { // R1304, R1306, R1321
145564ab3302SCarolineConcatto     if (x.repeatCount) {
145664ab3302SCarolineConcatto       Walk(*x.repeatCount);
145764ab3302SCarolineConcatto     }
1458cd03e96fSPeter Klausler     common::visit(common::visitors{
145964ab3302SCarolineConcatto                       [&](const std::string &y) { PutNormalized(y); },
146064ab3302SCarolineConcatto                       [&](const std::list<format::FormatItem> &y) {
146164ab3302SCarolineConcatto                         Walk("(", y, ",", ")");
146264ab3302SCarolineConcatto                       },
146364ab3302SCarolineConcatto                       [&](const auto &y) { Walk(y); },
146464ab3302SCarolineConcatto                   },
146564ab3302SCarolineConcatto         x.u);
146664ab3302SCarolineConcatto   }
Unparse(const format::IntrinsicTypeDataEditDesc & x)146764ab3302SCarolineConcatto   void Unparse(
146864ab3302SCarolineConcatto       const format::IntrinsicTypeDataEditDesc &x) { // R1307(1/2) - R1311
146964ab3302SCarolineConcatto     switch (x.kind) {
147064ab3302SCarolineConcatto #define FMT(x) \
14711f879005STim Keith   case format::IntrinsicTypeDataEditDesc::Kind::x: \
14721f879005STim Keith     Put(#x); \
14731f879005STim Keith     break
147464ab3302SCarolineConcatto       FMT(I);
147564ab3302SCarolineConcatto       FMT(B);
147664ab3302SCarolineConcatto       FMT(O);
147764ab3302SCarolineConcatto       FMT(Z);
147864ab3302SCarolineConcatto       FMT(F);
147964ab3302SCarolineConcatto       FMT(E);
148064ab3302SCarolineConcatto       FMT(EN);
148164ab3302SCarolineConcatto       FMT(ES);
148264ab3302SCarolineConcatto       FMT(EX);
148364ab3302SCarolineConcatto       FMT(G);
148464ab3302SCarolineConcatto       FMT(L);
148564ab3302SCarolineConcatto       FMT(A);
148664ab3302SCarolineConcatto       FMT(D);
148764ab3302SCarolineConcatto #undef FMT
148864ab3302SCarolineConcatto     }
148964ab3302SCarolineConcatto     Walk(x.width), Walk(".", x.digits), Walk("E", x.exponentWidth);
149064ab3302SCarolineConcatto   }
Unparse(const format::DerivedTypeDataEditDesc & x)149164ab3302SCarolineConcatto   void Unparse(const format::DerivedTypeDataEditDesc &x) { // R1307(2/2), R1312
149264ab3302SCarolineConcatto     Word("DT");
149364ab3302SCarolineConcatto     if (!x.type.empty()) {
149464ab3302SCarolineConcatto       Put('"'), Put(x.type), Put('"');
149564ab3302SCarolineConcatto     }
149664ab3302SCarolineConcatto     Walk("(", x.parameters, ",", ")");
149764ab3302SCarolineConcatto   }
Unparse(const format::ControlEditDesc & x)149864ab3302SCarolineConcatto   void Unparse(const format::ControlEditDesc &x) { // R1313, R1315-R1320
149964ab3302SCarolineConcatto     switch (x.kind) {
150064ab3302SCarolineConcatto     case format::ControlEditDesc::Kind::T:
150164ab3302SCarolineConcatto       Word("T");
150264ab3302SCarolineConcatto       Walk(x.count);
150364ab3302SCarolineConcatto       break;
150464ab3302SCarolineConcatto     case format::ControlEditDesc::Kind::TL:
150564ab3302SCarolineConcatto       Word("TL");
150664ab3302SCarolineConcatto       Walk(x.count);
150764ab3302SCarolineConcatto       break;
150864ab3302SCarolineConcatto     case format::ControlEditDesc::Kind::TR:
150964ab3302SCarolineConcatto       Word("TR");
151064ab3302SCarolineConcatto       Walk(x.count);
151164ab3302SCarolineConcatto       break;
151264ab3302SCarolineConcatto     case format::ControlEditDesc::Kind::X:
151364ab3302SCarolineConcatto       if (x.count != 1) {
151464ab3302SCarolineConcatto         Walk(x.count);
151564ab3302SCarolineConcatto       }
151664ab3302SCarolineConcatto       Word("X");
151764ab3302SCarolineConcatto       break;
151864ab3302SCarolineConcatto     case format::ControlEditDesc::Kind::Slash:
151964ab3302SCarolineConcatto       if (x.count != 1) {
152064ab3302SCarolineConcatto         Walk(x.count);
152164ab3302SCarolineConcatto       }
152264ab3302SCarolineConcatto       Put('/');
152364ab3302SCarolineConcatto       break;
15241f879005STim Keith     case format::ControlEditDesc::Kind::Colon:
15251f879005STim Keith       Put(':');
15261f879005STim Keith       break;
152764ab3302SCarolineConcatto     case format::ControlEditDesc::Kind::P:
152864ab3302SCarolineConcatto       Walk(x.count);
152964ab3302SCarolineConcatto       Word("P");
153064ab3302SCarolineConcatto       break;
153164ab3302SCarolineConcatto #define FMT(x) \
15321f879005STim Keith   case format::ControlEditDesc::Kind::x: \
15331f879005STim Keith     Put(#x); \
15341f879005STim Keith     break
153564ab3302SCarolineConcatto       FMT(SS);
153664ab3302SCarolineConcatto       FMT(SP);
153764ab3302SCarolineConcatto       FMT(S);
153864ab3302SCarolineConcatto       FMT(BN);
153964ab3302SCarolineConcatto       FMT(BZ);
154064ab3302SCarolineConcatto       FMT(RU);
154164ab3302SCarolineConcatto       FMT(RD);
154264ab3302SCarolineConcatto       FMT(RZ);
154364ab3302SCarolineConcatto       FMT(RN);
154464ab3302SCarolineConcatto       FMT(RC);
154564ab3302SCarolineConcatto       FMT(RP);
154664ab3302SCarolineConcatto       FMT(DC);
154764ab3302SCarolineConcatto       FMT(DP);
154864ab3302SCarolineConcatto #undef FMT
15491f879005STim Keith     case format::ControlEditDesc::Kind::Dollar:
15501f879005STim Keith       Put('$');
15511f879005STim Keith       break;
15521f879005STim Keith     case format::ControlEditDesc::Kind::Backslash:
15531f879005STim Keith       Put('\\');
15541f879005STim Keith       break;
155564ab3302SCarolineConcatto     }
155664ab3302SCarolineConcatto   }
155764ab3302SCarolineConcatto 
Before(const MainProgram & x)155864ab3302SCarolineConcatto   void Before(const MainProgram &x) { // R1401
155964ab3302SCarolineConcatto     if (!std::get<std::optional<Statement<ProgramStmt>>>(x.t)) {
156064ab3302SCarolineConcatto       Indent();
156164ab3302SCarolineConcatto     }
156264ab3302SCarolineConcatto   }
Before(const ProgramStmt &)156364ab3302SCarolineConcatto   void Before(const ProgramStmt &) { // R1402
156464ab3302SCarolineConcatto     Word("PROGRAM "), Indent();
156564ab3302SCarolineConcatto   }
Unparse(const EndProgramStmt & x)156664ab3302SCarolineConcatto   void Unparse(const EndProgramStmt &x) { // R1403
156764ab3302SCarolineConcatto     EndSubprogram("PROGRAM", x.v);
156864ab3302SCarolineConcatto   }
Before(const ModuleStmt &)156964ab3302SCarolineConcatto   void Before(const ModuleStmt &) { // R1405
157064ab3302SCarolineConcatto     Word("MODULE "), Indent();
157164ab3302SCarolineConcatto   }
Unparse(const EndModuleStmt & x)157264ab3302SCarolineConcatto   void Unparse(const EndModuleStmt &x) { // R1406
157364ab3302SCarolineConcatto     EndSubprogram("MODULE", x.v);
157464ab3302SCarolineConcatto   }
Unparse(const UseStmt & x)157564ab3302SCarolineConcatto   void Unparse(const UseStmt &x) { // R1409
157664ab3302SCarolineConcatto     Word("USE"), Walk(", ", x.nature), Put(" :: "), Walk(x.moduleName);
1577cd03e96fSPeter Klausler     common::visit(
1578cd03e96fSPeter Klausler         common::visitors{
157964ab3302SCarolineConcatto             [&](const std::list<Rename> &y) { Walk(", ", y, ", "); },
158064ab3302SCarolineConcatto             [&](const std::list<Only> &y) { Walk(", ONLY: ", y, ", "); },
158164ab3302SCarolineConcatto         },
158264ab3302SCarolineConcatto         x.u);
158364ab3302SCarolineConcatto   }
Unparse(const Rename & x)158464ab3302SCarolineConcatto   void Unparse(const Rename &x) { // R1411
1585cd03e96fSPeter Klausler     common::visit(common::visitors{
158664ab3302SCarolineConcatto                       [&](const Rename::Names &y) { Walk(y.t, " => "); },
158764ab3302SCarolineConcatto                       [&](const Rename::Operators &y) {
1588cd03e96fSPeter Klausler                         Word("OPERATOR("), Walk(y.t, ") => OPERATOR("),
1589cd03e96fSPeter Klausler                             Put(")");
159064ab3302SCarolineConcatto                       },
159164ab3302SCarolineConcatto                   },
159264ab3302SCarolineConcatto         x.u);
159364ab3302SCarolineConcatto   }
Unparse(const SubmoduleStmt & x)159464ab3302SCarolineConcatto   void Unparse(const SubmoduleStmt &x) { // R1417
159564ab3302SCarolineConcatto     Word("SUBMODULE ("), WalkTupleElements(x.t, ")"), Indent();
159664ab3302SCarolineConcatto   }
Unparse(const ParentIdentifier & x)159764ab3302SCarolineConcatto   void Unparse(const ParentIdentifier &x) { // R1418
159864ab3302SCarolineConcatto     Walk(std::get<Name>(x.t)), Walk(":", std::get<std::optional<Name>>(x.t));
159964ab3302SCarolineConcatto   }
Unparse(const EndSubmoduleStmt & x)160064ab3302SCarolineConcatto   void Unparse(const EndSubmoduleStmt &x) { // R1419
160164ab3302SCarolineConcatto     EndSubprogram("SUBMODULE", x.v);
160264ab3302SCarolineConcatto   }
Unparse(const BlockDataStmt & x)160364ab3302SCarolineConcatto   void Unparse(const BlockDataStmt &x) { // R1421
160464ab3302SCarolineConcatto     Word("BLOCK DATA"), Walk(" ", x.v), Indent();
160564ab3302SCarolineConcatto   }
Unparse(const EndBlockDataStmt & x)160664ab3302SCarolineConcatto   void Unparse(const EndBlockDataStmt &x) { // R1422
160764ab3302SCarolineConcatto     EndSubprogram("BLOCK DATA", x.v);
160864ab3302SCarolineConcatto   }
160964ab3302SCarolineConcatto 
Unparse(const InterfaceStmt & x)161064ab3302SCarolineConcatto   void Unparse(const InterfaceStmt &x) { // R1503
1611cd03e96fSPeter Klausler     common::visit(common::visitors{
161264ab3302SCarolineConcatto                       [&](const std::optional<GenericSpec> &y) {
161364ab3302SCarolineConcatto                         Word("INTERFACE"), Walk(" ", y);
161464ab3302SCarolineConcatto                       },
161564ab3302SCarolineConcatto                       [&](const Abstract &) { Word("ABSTRACT INTERFACE"); },
161664ab3302SCarolineConcatto                   },
161764ab3302SCarolineConcatto         x.u);
161864ab3302SCarolineConcatto     Indent();
161964ab3302SCarolineConcatto   }
Unparse(const EndInterfaceStmt & x)162064ab3302SCarolineConcatto   void Unparse(const EndInterfaceStmt &x) { // R1504
162164ab3302SCarolineConcatto     Outdent(), Word("END INTERFACE"), Walk(" ", x.v);
162264ab3302SCarolineConcatto   }
Unparse(const ProcedureStmt & x)162364ab3302SCarolineConcatto   void Unparse(const ProcedureStmt &x) { // R1506
162464ab3302SCarolineConcatto     if (std::get<ProcedureStmt::Kind>(x.t) ==
162564ab3302SCarolineConcatto         ProcedureStmt::Kind::ModuleProcedure) {
162664ab3302SCarolineConcatto       Word("MODULE ");
162764ab3302SCarolineConcatto     }
162864ab3302SCarolineConcatto     Word("PROCEDURE :: ");
162964ab3302SCarolineConcatto     Walk(std::get<std::list<Name>>(x.t), ", ");
163064ab3302SCarolineConcatto   }
Before(const GenericSpec & x)163164ab3302SCarolineConcatto   void Before(const GenericSpec &x) { // R1508, R1509
1632cd03e96fSPeter Klausler     common::visit(
163364ab3302SCarolineConcatto         common::visitors{
163464ab3302SCarolineConcatto             [&](const DefinedOperator &) { Word("OPERATOR("); },
163564ab3302SCarolineConcatto             [&](const GenericSpec::Assignment &) { Word("ASSIGNMENT(=)"); },
163664ab3302SCarolineConcatto             [&](const GenericSpec::ReadFormatted &) {
163764ab3302SCarolineConcatto               Word("READ(FORMATTED)");
163864ab3302SCarolineConcatto             },
163964ab3302SCarolineConcatto             [&](const GenericSpec::ReadUnformatted &) {
164064ab3302SCarolineConcatto               Word("READ(UNFORMATTED)");
164164ab3302SCarolineConcatto             },
164264ab3302SCarolineConcatto             [&](const GenericSpec::WriteFormatted &) {
164364ab3302SCarolineConcatto               Word("WRITE(FORMATTED)");
164464ab3302SCarolineConcatto             },
164564ab3302SCarolineConcatto             [&](const GenericSpec::WriteUnformatted &) {
164664ab3302SCarolineConcatto               Word("WRITE(UNFORMATTED)");
164764ab3302SCarolineConcatto             },
164864ab3302SCarolineConcatto             [](const auto &) {},
164964ab3302SCarolineConcatto         },
165064ab3302SCarolineConcatto         x.u);
165164ab3302SCarolineConcatto   }
Post(const GenericSpec & x)165264ab3302SCarolineConcatto   void Post(const GenericSpec &x) {
1653cd03e96fSPeter Klausler     common::visit(common::visitors{
165464ab3302SCarolineConcatto                       [&](const DefinedOperator &) { Put(')'); },
165564ab3302SCarolineConcatto                       [](const auto &) {},
165664ab3302SCarolineConcatto                   },
165764ab3302SCarolineConcatto         x.u);
165864ab3302SCarolineConcatto   }
Unparse(const GenericStmt & x)165964ab3302SCarolineConcatto   void Unparse(const GenericStmt &x) { // R1510
166064ab3302SCarolineConcatto     Word("GENERIC"), Walk(", ", std::get<std::optional<AccessSpec>>(x.t));
166164ab3302SCarolineConcatto     Put(" :: "), Walk(std::get<GenericSpec>(x.t)), Put(" => ");
166264ab3302SCarolineConcatto     Walk(std::get<std::list<Name>>(x.t), ", ");
166364ab3302SCarolineConcatto   }
Unparse(const ExternalStmt & x)166464ab3302SCarolineConcatto   void Unparse(const ExternalStmt &x) { // R1511
166564ab3302SCarolineConcatto     Word("EXTERNAL :: "), Walk(x.v, ", ");
166664ab3302SCarolineConcatto   }
Unparse(const ProcedureDeclarationStmt & x)166764ab3302SCarolineConcatto   void Unparse(const ProcedureDeclarationStmt &x) { // R1512
166864ab3302SCarolineConcatto     Word("PROCEDURE("), Walk(std::get<std::optional<ProcInterface>>(x.t));
166964ab3302SCarolineConcatto     Put(')'), Walk(", ", std::get<std::list<ProcAttrSpec>>(x.t), ", ");
167064ab3302SCarolineConcatto     Put(" :: "), Walk(std::get<std::list<ProcDecl>>(x.t), ", ");
167164ab3302SCarolineConcatto   }
Unparse(const ProcDecl & x)167264ab3302SCarolineConcatto   void Unparse(const ProcDecl &x) { // R1515
167364ab3302SCarolineConcatto     Walk(std::get<Name>(x.t));
167464ab3302SCarolineConcatto     Walk(" => ", std::get<std::optional<ProcPointerInit>>(x.t));
167564ab3302SCarolineConcatto   }
Unparse(const IntrinsicStmt & x)167664ab3302SCarolineConcatto   void Unparse(const IntrinsicStmt &x) { // R1519
167764ab3302SCarolineConcatto     Word("INTRINSIC :: "), Walk(x.v, ", ");
167864ab3302SCarolineConcatto   }
Unparse(const FunctionReference & x)167964ab3302SCarolineConcatto   void Unparse(const FunctionReference &x) { // R1520
168064ab3302SCarolineConcatto     Walk(std::get<ProcedureDesignator>(x.v.t));
168164ab3302SCarolineConcatto     Put('('), Walk(std::get<std::list<ActualArgSpec>>(x.v.t), ", "), Put(')');
168264ab3302SCarolineConcatto   }
Unparse(const CallStmt & x)168364ab3302SCarolineConcatto   void Unparse(const CallStmt &x) { // R1521
168464ab3302SCarolineConcatto     if (asFortran_ && x.typedCall.get()) {
168564ab3302SCarolineConcatto       Put(' ');
168664ab3302SCarolineConcatto       asFortran_->call(out_, *x.typedCall);
168764ab3302SCarolineConcatto       Put('\n');
168864ab3302SCarolineConcatto     } else {
168964ab3302SCarolineConcatto       const auto &pd{std::get<ProcedureDesignator>(x.v.t)};
169064ab3302SCarolineConcatto       const auto &args{std::get<std::list<ActualArgSpec>>(x.v.t)};
169164ab3302SCarolineConcatto       Word("CALL "), Walk(pd);
169264ab3302SCarolineConcatto       if (args.empty()) {
169364ab3302SCarolineConcatto         if (std::holds_alternative<ProcComponentRef>(pd.u)) {
169464ab3302SCarolineConcatto           Put("()"); // pgf90 crashes on CALL to tbp without parentheses
169564ab3302SCarolineConcatto         }
169664ab3302SCarolineConcatto       } else {
169764ab3302SCarolineConcatto         Walk("(", args, ", ", ")");
169864ab3302SCarolineConcatto       }
169964ab3302SCarolineConcatto     }
170064ab3302SCarolineConcatto   }
Unparse(const ActualArgSpec & x)170164ab3302SCarolineConcatto   void Unparse(const ActualArgSpec &x) { // R1523
170264ab3302SCarolineConcatto     Walk(std::get<std::optional<Keyword>>(x.t), "=");
170364ab3302SCarolineConcatto     Walk(std::get<ActualArg>(x.t));
170464ab3302SCarolineConcatto   }
Unparse(const ActualArg::PercentRef & x)170564ab3302SCarolineConcatto   void Unparse(const ActualArg::PercentRef &x) { // R1524
170664ab3302SCarolineConcatto     Word("%REF("), Walk(x.v), Put(')');
170764ab3302SCarolineConcatto   }
Unparse(const ActualArg::PercentVal & x)170864ab3302SCarolineConcatto   void Unparse(const ActualArg::PercentVal &x) {
170964ab3302SCarolineConcatto     Word("%VAL("), Walk(x.v), Put(')');
171064ab3302SCarolineConcatto   }
Before(const AltReturnSpec &)171164ab3302SCarolineConcatto   void Before(const AltReturnSpec &) { // R1525
171264ab3302SCarolineConcatto     Put('*');
171364ab3302SCarolineConcatto   }
Post(const PrefixSpec::Elemental)171464ab3302SCarolineConcatto   void Post(const PrefixSpec::Elemental) { Word("ELEMENTAL"); } // R1527
Post(const PrefixSpec::Impure)171564ab3302SCarolineConcatto   void Post(const PrefixSpec::Impure) { Word("IMPURE"); }
Post(const PrefixSpec::Module)171664ab3302SCarolineConcatto   void Post(const PrefixSpec::Module) { Word("MODULE"); }
Post(const PrefixSpec::Non_Recursive)171764ab3302SCarolineConcatto   void Post(const PrefixSpec::Non_Recursive) { Word("NON_RECURSIVE"); }
Post(const PrefixSpec::Pure)171864ab3302SCarolineConcatto   void Post(const PrefixSpec::Pure) { Word("PURE"); }
Post(const PrefixSpec::Recursive)171964ab3302SCarolineConcatto   void Post(const PrefixSpec::Recursive) { Word("RECURSIVE"); }
Unparse(const FunctionStmt & x)172064ab3302SCarolineConcatto   void Unparse(const FunctionStmt &x) { // R1530
172164ab3302SCarolineConcatto     Walk("", std::get<std::list<PrefixSpec>>(x.t), " ", " ");
172264ab3302SCarolineConcatto     Word("FUNCTION "), Walk(std::get<Name>(x.t)), Put("(");
172364ab3302SCarolineConcatto     Walk(std::get<std::list<Name>>(x.t), ", "), Put(')');
172464ab3302SCarolineConcatto     Walk(" ", std::get<std::optional<Suffix>>(x.t)), Indent();
172564ab3302SCarolineConcatto   }
Unparse(const Suffix & x)172664ab3302SCarolineConcatto   void Unparse(const Suffix &x) { // R1532
172764ab3302SCarolineConcatto     if (x.resultName) {
172864ab3302SCarolineConcatto       Word("RESULT("), Walk(x.resultName), Put(')');
172964ab3302SCarolineConcatto       Walk(" ", x.binding);
173064ab3302SCarolineConcatto     } else {
173164ab3302SCarolineConcatto       Walk(x.binding);
173264ab3302SCarolineConcatto     }
173364ab3302SCarolineConcatto   }
Unparse(const EndFunctionStmt & x)173464ab3302SCarolineConcatto   void Unparse(const EndFunctionStmt &x) { // R1533
173564ab3302SCarolineConcatto     EndSubprogram("FUNCTION", x.v);
173664ab3302SCarolineConcatto   }
Unparse(const SubroutineStmt & x)173764ab3302SCarolineConcatto   void Unparse(const SubroutineStmt &x) { // R1535
173864ab3302SCarolineConcatto     Walk("", std::get<std::list<PrefixSpec>>(x.t), " ", " ");
173964ab3302SCarolineConcatto     Word("SUBROUTINE "), Walk(std::get<Name>(x.t));
174064ab3302SCarolineConcatto     const auto &args{std::get<std::list<DummyArg>>(x.t)};
174164ab3302SCarolineConcatto     const auto &bind{std::get<std::optional<LanguageBindingSpec>>(x.t)};
174264ab3302SCarolineConcatto     if (args.empty()) {
174364ab3302SCarolineConcatto       Walk(" () ", bind);
174464ab3302SCarolineConcatto     } else {
174564ab3302SCarolineConcatto       Walk(" (", args, ", ", ")");
174664ab3302SCarolineConcatto       Walk(" ", bind);
174764ab3302SCarolineConcatto     }
174864ab3302SCarolineConcatto     Indent();
174964ab3302SCarolineConcatto   }
Unparse(const EndSubroutineStmt & x)175064ab3302SCarolineConcatto   void Unparse(const EndSubroutineStmt &x) { // R1537
175164ab3302SCarolineConcatto     EndSubprogram("SUBROUTINE", x.v);
175264ab3302SCarolineConcatto   }
Before(const MpSubprogramStmt &)175364ab3302SCarolineConcatto   void Before(const MpSubprogramStmt &) { // R1539
175464ab3302SCarolineConcatto     Word("MODULE PROCEDURE "), Indent();
175564ab3302SCarolineConcatto   }
Unparse(const EndMpSubprogramStmt & x)175664ab3302SCarolineConcatto   void Unparse(const EndMpSubprogramStmt &x) { // R1540
175764ab3302SCarolineConcatto     EndSubprogram("PROCEDURE", x.v);
175864ab3302SCarolineConcatto   }
Unparse(const EntryStmt & x)175964ab3302SCarolineConcatto   void Unparse(const EntryStmt &x) { // R1541
176064ab3302SCarolineConcatto     Word("ENTRY "), Walk(std::get<Name>(x.t)), Put("(");
176164ab3302SCarolineConcatto     Walk(std::get<std::list<DummyArg>>(x.t), ", "), Put(")");
176264ab3302SCarolineConcatto     Walk(" ", std::get<std::optional<Suffix>>(x.t));
176364ab3302SCarolineConcatto   }
Unparse(const ReturnStmt & x)176464ab3302SCarolineConcatto   void Unparse(const ReturnStmt &x) { // R1542
176564ab3302SCarolineConcatto     Word("RETURN"), Walk(" ", x.v);
176664ab3302SCarolineConcatto   }
Unparse(const ContainsStmt &)176764ab3302SCarolineConcatto   void Unparse(const ContainsStmt &) { // R1543
176864ab3302SCarolineConcatto     Outdent();
176964ab3302SCarolineConcatto     Word("CONTAINS");
177064ab3302SCarolineConcatto     Indent();
177164ab3302SCarolineConcatto   }
Unparse(const StmtFunctionStmt & x)177264ab3302SCarolineConcatto   void Unparse(const StmtFunctionStmt &x) { // R1544
177364ab3302SCarolineConcatto     Walk(std::get<Name>(x.t)), Put('(');
177464ab3302SCarolineConcatto     Walk(std::get<std::list<Name>>(x.t), ", "), Put(") = ");
177564ab3302SCarolineConcatto     Walk(std::get<Scalar<Expr>>(x.t));
177664ab3302SCarolineConcatto   }
177764ab3302SCarolineConcatto 
177864ab3302SCarolineConcatto   // Directives, extensions, and deprecated constructs
Unparse(const CompilerDirective & x)177964ab3302SCarolineConcatto   void Unparse(const CompilerDirective &x) {
1780cd03e96fSPeter Klausler     common::visit(
178164ab3302SCarolineConcatto         common::visitors{
178264ab3302SCarolineConcatto             [&](const std::list<CompilerDirective::IgnoreTKR> &tkr) {
178364ab3302SCarolineConcatto               Word("!DIR$ IGNORE_TKR"); // emitted even if tkr list is empty
178464ab3302SCarolineConcatto               Walk(" ", tkr, ", ");
178564ab3302SCarolineConcatto             },
17868e2b4e50Speter klausler             [&](const std::list<CompilerDirective::NameValue> &names) {
17878e2b4e50Speter klausler               Walk("!DIR$ ", names, " ");
17888e2b4e50Speter klausler             },
178964ab3302SCarolineConcatto         },
179064ab3302SCarolineConcatto         x.u);
179164ab3302SCarolineConcatto     Put('\n');
179264ab3302SCarolineConcatto   }
Unparse(const CompilerDirective::IgnoreTKR & x)179364ab3302SCarolineConcatto   void Unparse(const CompilerDirective::IgnoreTKR &x) {
179464ab3302SCarolineConcatto     const auto &list{std::get<std::list<const char *>>(x.t)};
179564ab3302SCarolineConcatto     if (!list.empty()) {
179664ab3302SCarolineConcatto       Put("(");
179764ab3302SCarolineConcatto       for (const char *tkr : list) {
179864ab3302SCarolineConcatto         Put(*tkr);
179964ab3302SCarolineConcatto       }
180064ab3302SCarolineConcatto       Put(") ");
180164ab3302SCarolineConcatto     }
180264ab3302SCarolineConcatto     Walk(std::get<Name>(x.t));
180364ab3302SCarolineConcatto   }
Unparse(const CompilerDirective::NameValue & x)18048e2b4e50Speter klausler   void Unparse(const CompilerDirective::NameValue &x) {
18058e2b4e50Speter klausler     Walk(std::get<Name>(x.t));
18068e2b4e50Speter klausler     Walk("=", std::get<std::optional<std::uint64_t>>(x.t));
18078e2b4e50Speter klausler   }
18080a90ffa7SValentin Clement 
18090a90ffa7SValentin Clement   // OpenACC Directives & Clauses
Unparse(const AccAtomicCapture & x)18100a90ffa7SValentin Clement   void Unparse(const AccAtomicCapture &x) {
18110a90ffa7SValentin Clement     BeginOpenACC();
18120a90ffa7SValentin Clement     Word("!$ACC CAPTURE");
18130a90ffa7SValentin Clement     Put("\n");
18140a90ffa7SValentin Clement     EndOpenACC();
18150a90ffa7SValentin Clement     Walk(std::get<AccAtomicCapture::Stmt1>(x.t));
18160a90ffa7SValentin Clement     Put("\n");
18170a90ffa7SValentin Clement     Walk(std::get<AccAtomicCapture::Stmt2>(x.t));
18180a90ffa7SValentin Clement     BeginOpenACC();
18190a90ffa7SValentin Clement     Word("!$ACC END ATOMIC\n");
18200a90ffa7SValentin Clement     EndOpenACC();
18210a90ffa7SValentin Clement   }
Unparse(const AccAtomicRead & x)18220a90ffa7SValentin Clement   void Unparse(const AccAtomicRead &x) {
18230a90ffa7SValentin Clement     BeginOpenACC();
18240a90ffa7SValentin Clement     Word("!$ACC ATOMIC READ");
18250a90ffa7SValentin Clement     Put("\n");
18260a90ffa7SValentin Clement     EndOpenACC();
18270a90ffa7SValentin Clement     Walk(std::get<Statement<AssignmentStmt>>(x.t));
18280a90ffa7SValentin Clement     BeginOpenACC();
18290a90ffa7SValentin Clement     Walk(std::get<std::optional<AccEndAtomic>>(x.t), "!$ACC END ATOMIC\n");
18300a90ffa7SValentin Clement     EndOpenACC();
18310a90ffa7SValentin Clement   }
Unparse(const AccAtomicWrite & x)18320a90ffa7SValentin Clement   void Unparse(const AccAtomicWrite &x) {
18330a90ffa7SValentin Clement     BeginOpenACC();
18340a90ffa7SValentin Clement     Word("!$ACC ATOMIC WRITE");
18350a90ffa7SValentin Clement     Put("\n");
18360a90ffa7SValentin Clement     EndOpenACC();
18370a90ffa7SValentin Clement     Walk(std::get<Statement<AssignmentStmt>>(x.t));
18380a90ffa7SValentin Clement     BeginOpenACC();
18390a90ffa7SValentin Clement     Walk(std::get<std::optional<AccEndAtomic>>(x.t), "!$ACC END ATOMIC\n");
18400a90ffa7SValentin Clement     EndOpenACC();
18410a90ffa7SValentin Clement   }
Unparse(const AccAtomicUpdate & x)18420a90ffa7SValentin Clement   void Unparse(const AccAtomicUpdate &x) {
18430a90ffa7SValentin Clement     BeginOpenACC();
18440a90ffa7SValentin Clement     Word("!$ACC ATOMIC UPDATE");
18450a90ffa7SValentin Clement     Put("\n");
18460a90ffa7SValentin Clement     EndOpenACC();
18470a90ffa7SValentin Clement     Walk(std::get<Statement<AssignmentStmt>>(x.t));
18480a90ffa7SValentin Clement     BeginOpenACC();
18490a90ffa7SValentin Clement     Walk(std::get<std::optional<AccEndAtomic>>(x.t), "!$ACC END ATOMIC\n");
18500a90ffa7SValentin Clement     EndOpenACC();
18510a90ffa7SValentin Clement   }
Unparse(const llvm::acc::Directive & x)18520a90ffa7SValentin Clement   void Unparse(const llvm::acc::Directive &x) {
18530a90ffa7SValentin Clement     Word(llvm::acc::getOpenACCDirectiveName(x).str());
18540a90ffa7SValentin Clement   }
18553060894bSValentin Clement #define GEN_FLANG_CLAUSE_UNPARSE
1856ca98baa0SValentin Clement #include "llvm/Frontend/OpenACC/ACC.inc"
Unparse(const AccObjectListWithModifier & x)18570a90ffa7SValentin Clement   void Unparse(const AccObjectListWithModifier &x) {
18580a90ffa7SValentin Clement     Walk(std::get<std::optional<AccDataModifier>>(x.t), ":");
18590a90ffa7SValentin Clement     Walk(std::get<AccObjectList>(x.t));
18600a90ffa7SValentin Clement   }
Unparse(const AccDataModifier::Modifier & x)18610a90ffa7SValentin Clement   void Unparse(const AccDataModifier::Modifier &x) {
18620a90ffa7SValentin Clement     Word(AccDataModifier::EnumToString(x));
18630a90ffa7SValentin Clement   }
Unparse(const AccBindClause & x)186471699a99SValentin Clement   void Unparse(const AccBindClause &x) {
1865cd03e96fSPeter Klausler     common::visit(common::visitors{
186671699a99SValentin Clement                       [&](const Name &y) { Put('('), Walk(y), Put(')'); },
186771699a99SValentin Clement                       [&](const ScalarDefaultCharExpr &y) {
186871699a99SValentin Clement                         Put('('), Walk(y), Put(')');
186971699a99SValentin Clement                       },
187071699a99SValentin Clement                   },
187171699a99SValentin Clement         x.u);
187271699a99SValentin Clement   }
Unparse(const AccDefaultClause & x)18730a90ffa7SValentin Clement   void Unparse(const AccDefaultClause &x) {
18740a90ffa7SValentin Clement     switch (x.v) {
18758f933a4eSValentin Clement     case llvm::acc::DefaultValue::ACC_Default_none:
18760a90ffa7SValentin Clement       Put("NONE");
18770a90ffa7SValentin Clement       break;
18788f933a4eSValentin Clement     case llvm::acc::DefaultValue::ACC_Default_present:
18790a90ffa7SValentin Clement       Put("PRESENT");
18800a90ffa7SValentin Clement       break;
18810a90ffa7SValentin Clement     }
18820a90ffa7SValentin Clement   }
Unparse(const AccClauseList & x)18830a90ffa7SValentin Clement   void Unparse(const AccClauseList &x) { Walk(" ", x.v, " "); }
Unparse(const AccGangArgument & x)18840a90ffa7SValentin Clement   void Unparse(const AccGangArgument &x) {
18850a90ffa7SValentin Clement     Walk("NUM:", std::get<std::optional<ScalarIntExpr>>(x.t));
18860a90ffa7SValentin Clement     Walk(", STATIC:", std::get<std::optional<AccSizeExpr>>(x.t));
18870a90ffa7SValentin Clement   }
Unparse(const OpenACCBlockConstruct & x)18880a90ffa7SValentin Clement   void Unparse(const OpenACCBlockConstruct &x) {
18890a90ffa7SValentin Clement     BeginOpenACC();
18900a90ffa7SValentin Clement     Word("!$ACC ");
18910a90ffa7SValentin Clement     Walk(std::get<AccBeginBlockDirective>(x.t));
18920a90ffa7SValentin Clement     Put("\n");
18930a90ffa7SValentin Clement     EndOpenACC();
18940a90ffa7SValentin Clement     Walk(std::get<Block>(x.t), "");
18950a90ffa7SValentin Clement     BeginOpenACC();
18960a90ffa7SValentin Clement     Word("!$ACC END ");
18970a90ffa7SValentin Clement     Walk(std::get<AccEndBlockDirective>(x.t));
18980a90ffa7SValentin Clement     Put("\n");
18990a90ffa7SValentin Clement     EndOpenACC();
19000a90ffa7SValentin Clement   }
Unparse(const OpenACCLoopConstruct & x)19010a90ffa7SValentin Clement   void Unparse(const OpenACCLoopConstruct &x) {
19020a90ffa7SValentin Clement     BeginOpenACC();
19030a90ffa7SValentin Clement     Word("!$ACC ");
19040a90ffa7SValentin Clement     Walk(std::get<AccBeginLoopDirective>(x.t));
19050a90ffa7SValentin Clement     Put("\n");
19060a90ffa7SValentin Clement     EndOpenACC();
19070a90ffa7SValentin Clement     Walk(std::get<std::optional<DoConstruct>>(x.t));
19080a90ffa7SValentin Clement   }
Unparse(const AccBeginLoopDirective & x)19090a90ffa7SValentin Clement   void Unparse(const AccBeginLoopDirective &x) {
19100a90ffa7SValentin Clement     Walk(std::get<AccLoopDirective>(x.t));
19110a90ffa7SValentin Clement     Walk(std::get<AccClauseList>(x.t));
19120a90ffa7SValentin Clement   }
Unparse(const OpenACCStandaloneConstruct & x)19130a90ffa7SValentin Clement   void Unparse(const OpenACCStandaloneConstruct &x) {
19140a90ffa7SValentin Clement     BeginOpenACC();
19150a90ffa7SValentin Clement     Word("!$ACC ");
19160a90ffa7SValentin Clement     Walk(std::get<AccStandaloneDirective>(x.t));
19170a90ffa7SValentin Clement     Walk(std::get<AccClauseList>(x.t));
19180a90ffa7SValentin Clement     Put("\n");
19190a90ffa7SValentin Clement     EndOpenACC();
19200a90ffa7SValentin Clement   }
Unparse(const OpenACCStandaloneDeclarativeConstruct & x)19210a90ffa7SValentin Clement   void Unparse(const OpenACCStandaloneDeclarativeConstruct &x) {
19220a90ffa7SValentin Clement     BeginOpenACC();
19230a90ffa7SValentin Clement     Word("!$ACC ");
19240a90ffa7SValentin Clement     Walk(std::get<AccDeclarativeDirective>(x.t));
19250a90ffa7SValentin Clement     Walk(std::get<AccClauseList>(x.t));
19260a90ffa7SValentin Clement     Put("\n");
19270a90ffa7SValentin Clement     EndOpenACC();
19280a90ffa7SValentin Clement   }
Unparse(const OpenACCCombinedConstruct & x)19290a90ffa7SValentin Clement   void Unparse(const OpenACCCombinedConstruct &x) {
19300a90ffa7SValentin Clement     BeginOpenACC();
19310a90ffa7SValentin Clement     Word("!$ACC ");
19320a90ffa7SValentin Clement     Walk(std::get<AccBeginCombinedDirective>(x.t));
19330a90ffa7SValentin Clement     Put("\n");
19340a90ffa7SValentin Clement     EndOpenACC();
193505169af5SValentin Clement     Walk(std::get<std::optional<DoConstruct>>(x.t));
19360a90ffa7SValentin Clement     BeginOpenACC();
193791b49fc2SValentin Clement     Walk("!$ACC END ", std::get<std::optional<AccEndCombinedDirective>>(x.t),
193891b49fc2SValentin Clement         "\n");
19390a90ffa7SValentin Clement     EndOpenACC();
19400a90ffa7SValentin Clement   }
Unparse(const OpenACCRoutineConstruct & x)19410a90ffa7SValentin Clement   void Unparse(const OpenACCRoutineConstruct &x) {
19420a90ffa7SValentin Clement     BeginOpenACC();
19430a90ffa7SValentin Clement     Word("!$ACC ROUTINE");
19440a90ffa7SValentin Clement     Walk("(", std::get<std::optional<Name>>(x.t), ")");
19450a90ffa7SValentin Clement     Walk(std::get<AccClauseList>(x.t));
19460a90ffa7SValentin Clement     Put("\n");
19470a90ffa7SValentin Clement     EndOpenACC();
19480a90ffa7SValentin Clement   }
Unparse(const AccObject & x)19490a90ffa7SValentin Clement   void Unparse(const AccObject &x) {
1950cd03e96fSPeter Klausler     common::visit(common::visitors{
19510a90ffa7SValentin Clement                       [&](const Designator &y) { Walk(y); },
19520a90ffa7SValentin Clement                       [&](const Name &y) { Put("/"), Walk(y), Put("/"); },
19530a90ffa7SValentin Clement                   },
19540a90ffa7SValentin Clement         x.u);
19550a90ffa7SValentin Clement   }
Unparse(const AccObjectList & x)19560a90ffa7SValentin Clement   void Unparse(const AccObjectList &x) { Walk(x.v, ","); }
Unparse(const AccReductionOperator::Operator & x)1957d5557c6eSValentin Clement   void Unparse(const AccReductionOperator::Operator &x) {
1958d5557c6eSValentin Clement     Word(AccReductionOperator::EnumToString(x));
1959d5557c6eSValentin Clement   }
Unparse(const AccObjectListWithReduction & x)19600a90ffa7SValentin Clement   void Unparse(const AccObjectListWithReduction &x) {
19610a90ffa7SValentin Clement     Walk(std::get<AccReductionOperator>(x.t));
19620a90ffa7SValentin Clement     Put(":");
19630a90ffa7SValentin Clement     Walk(std::get<AccObjectList>(x.t));
19640a90ffa7SValentin Clement   }
Unparse(const OpenACCCacheConstruct & x)19650a90ffa7SValentin Clement   void Unparse(const OpenACCCacheConstruct &x) {
19660a90ffa7SValentin Clement     BeginOpenACC();
19670a90ffa7SValentin Clement     Word("!$ACC ");
19680a90ffa7SValentin Clement     Word("CACHE(");
19690a90ffa7SValentin Clement     Walk(std::get<AccObjectListWithModifier>(x.t));
19700a90ffa7SValentin Clement     Put(")");
19710a90ffa7SValentin Clement     Put("\n");
19720a90ffa7SValentin Clement     EndOpenACC();
19730a90ffa7SValentin Clement   }
Unparse(const AccWaitArgument & x)197486bbf8e6SValentin Clement   void Unparse(const AccWaitArgument &x) {
197586bbf8e6SValentin Clement     Walk("DEVNUM:", std::get<std::optional<ScalarIntExpr>>(x.t), ":");
197686bbf8e6SValentin Clement     Walk(std::get<std::list<ScalarIntExpr>>(x.t), ",");
197786bbf8e6SValentin Clement   }
Unparse(const OpenACCWaitConstruct & x)19780a90ffa7SValentin Clement   void Unparse(const OpenACCWaitConstruct &x) {
19790a90ffa7SValentin Clement     BeginOpenACC();
19800a90ffa7SValentin Clement     Word("!$ACC ");
19810a90ffa7SValentin Clement     Word("WAIT(");
19820a90ffa7SValentin Clement     Walk(std::get<std::optional<AccWaitArgument>>(x.t));
19830a90ffa7SValentin Clement     Walk(std::get<AccClauseList>(x.t));
19840a90ffa7SValentin Clement     Put(")");
19850a90ffa7SValentin Clement     Put("\n");
19860a90ffa7SValentin Clement     EndOpenACC();
19870a90ffa7SValentin Clement   }
19880a90ffa7SValentin Clement 
198964ab3302SCarolineConcatto   // OpenMP Clauses & Directives
Unparse(const OmpObject & x)199064ab3302SCarolineConcatto   void Unparse(const OmpObject &x) {
1991cd03e96fSPeter Klausler     common::visit(common::visitors{
199264ab3302SCarolineConcatto                       [&](const Designator &y) { Walk(y); },
199364ab3302SCarolineConcatto                       [&](const Name &y) { Put("/"), Walk(y), Put("/"); },
199464ab3302SCarolineConcatto                   },
199564ab3302SCarolineConcatto         x.u);
199664ab3302SCarolineConcatto   }
Unparse(const OmpMapType::Always &)199764ab3302SCarolineConcatto   void Unparse(const OmpMapType::Always &) { Word("ALWAYS,"); }
Unparse(const OmpMapClause & x)199864ab3302SCarolineConcatto   void Unparse(const OmpMapClause &x) {
199964ab3302SCarolineConcatto     Walk(std::get<std::optional<OmpMapType>>(x.t), ":");
200064ab3302SCarolineConcatto     Walk(std::get<OmpObjectList>(x.t));
200164ab3302SCarolineConcatto   }
Unparse(const OmpScheduleModifier & x)200264ab3302SCarolineConcatto   void Unparse(const OmpScheduleModifier &x) {
200364ab3302SCarolineConcatto     Walk(std::get<OmpScheduleModifier::Modifier1>(x.t));
200464ab3302SCarolineConcatto     Walk(",", std::get<std::optional<OmpScheduleModifier::Modifier2>>(x.t));
200564ab3302SCarolineConcatto   }
Unparse(const OmpScheduleClause & x)200664ab3302SCarolineConcatto   void Unparse(const OmpScheduleClause &x) {
200764ab3302SCarolineConcatto     Walk(std::get<std::optional<OmpScheduleModifier>>(x.t), ":");
200864ab3302SCarolineConcatto     Walk(std::get<OmpScheduleClause::ScheduleType>(x.t));
200964ab3302SCarolineConcatto     Walk(",", std::get<std::optional<ScalarIntExpr>>(x.t));
201064ab3302SCarolineConcatto   }
Unparse(const OmpAlignedClause & x)201164ab3302SCarolineConcatto   void Unparse(const OmpAlignedClause &x) {
20126bd0a445SValentin Clement     Walk(std::get<std::list<Name>>(x.t), ",");
201364ab3302SCarolineConcatto     Walk(std::get<std::optional<ScalarIntConstantExpr>>(x.t));
201464ab3302SCarolineConcatto   }
Unparse(const OmpIfClause & x)201564ab3302SCarolineConcatto   void Unparse(const OmpIfClause &x) {
20166bd0a445SValentin Clement     Walk(std::get<std::optional<OmpIfClause::DirectiveNameModifier>>(x.t), ":");
201764ab3302SCarolineConcatto     Walk(std::get<ScalarLogicalExpr>(x.t));
201864ab3302SCarolineConcatto   }
Unparse(const OmpLinearClause::WithoutModifier & x)201964ab3302SCarolineConcatto   void Unparse(const OmpLinearClause::WithoutModifier &x) {
20206bd0a445SValentin Clement     Walk(x.names, ", ");
202164ab3302SCarolineConcatto     Walk(":", x.step);
202264ab3302SCarolineConcatto   }
Unparse(const OmpLinearClause::WithModifier & x)202364ab3302SCarolineConcatto   void Unparse(const OmpLinearClause::WithModifier &x) {
20246bd0a445SValentin Clement     Walk(x.modifier), Put("("), Walk(x.names, ","), Put(")");
202564ab3302SCarolineConcatto     Walk(":", x.step);
202664ab3302SCarolineConcatto   }
Unparse(const OmpReductionClause & x)202764ab3302SCarolineConcatto   void Unparse(const OmpReductionClause &x) {
202864ab3302SCarolineConcatto     Walk(std::get<OmpReductionOperator>(x.t));
202964ab3302SCarolineConcatto     Put(":");
20306280bc1cSsameeran joshi     Walk(std::get<OmpObjectList>(x.t));
203164ab3302SCarolineConcatto   }
Unparse(const OmpInReductionClause & x)20326a3c4a40SNimish Mishra   void Unparse(const OmpInReductionClause &x) {
20336a3c4a40SNimish Mishra     Walk(std::get<OmpReductionOperator>(x.t));
20346a3c4a40SNimish Mishra     Put(":");
20356a3c4a40SNimish Mishra     Walk(std::get<OmpObjectList>(x.t));
20366a3c4a40SNimish Mishra   }
Unparse(const OmpAllocateClause & x)2037e355f85bSIrina Dobrescu   void Unparse(const OmpAllocateClause &x) {
2038442aac5dSsameeran joshi     Walk(std::get<std::optional<OmpAllocateClause::Allocator>>(x.t));
2039442aac5dSsameeran joshi     Put(":");
2040e355f85bSIrina Dobrescu     Walk(std::get<OmpObjectList>(x.t));
2041e355f85bSIrina Dobrescu   }
Unparse(const OmpDependSinkVecLength & x)204264ab3302SCarolineConcatto   void Unparse(const OmpDependSinkVecLength &x) {
204364ab3302SCarolineConcatto     Walk(std::get<DefinedOperator>(x.t));
204464ab3302SCarolineConcatto     Walk(std::get<ScalarIntConstantExpr>(x.t));
204564ab3302SCarolineConcatto   }
Unparse(const OmpDependSinkVec & x)204664ab3302SCarolineConcatto   void Unparse(const OmpDependSinkVec &x) {
204764ab3302SCarolineConcatto     Walk(std::get<Name>(x.t));
204864ab3302SCarolineConcatto     Walk(std::get<std::optional<OmpDependSinkVecLength>>(x.t));
204964ab3302SCarolineConcatto   }
Unparse(const OmpDependClause::InOut & x)205064ab3302SCarolineConcatto   void Unparse(const OmpDependClause::InOut &x) {
205164ab3302SCarolineConcatto     Put("(");
205264ab3302SCarolineConcatto     Walk(std::get<OmpDependenceType>(x.t));
205364ab3302SCarolineConcatto     Put(":");
205464ab3302SCarolineConcatto     Walk(std::get<std::list<Designator>>(x.t), ",");
205564ab3302SCarolineConcatto     Put(")");
205664ab3302SCarolineConcatto   }
Pre(const OmpDependClause & x)205764ab3302SCarolineConcatto   bool Pre(const OmpDependClause &x) {
2058cd03e96fSPeter Klausler     return common::visit(
2059cd03e96fSPeter Klausler         common::visitors{
206064ab3302SCarolineConcatto             [&](const OmpDependClause::Source &) {
20616bd0a445SValentin Clement               Word("SOURCE");
206264ab3302SCarolineConcatto               return false;
206364ab3302SCarolineConcatto             },
206464ab3302SCarolineConcatto             [&](const OmpDependClause::Sink &y) {
20656bd0a445SValentin Clement               Word("SINK:");
206664ab3302SCarolineConcatto               Walk(y.v);
206764ab3302SCarolineConcatto               Put(")");
206864ab3302SCarolineConcatto               return false;
206964ab3302SCarolineConcatto             },
20706bd0a445SValentin Clement             [&](const OmpDependClause::InOut &) { return true; },
207164ab3302SCarolineConcatto         },
207264ab3302SCarolineConcatto         x.u);
207364ab3302SCarolineConcatto   }
Unparse(const OmpDefaultmapClause & x)207464ab3302SCarolineConcatto   void Unparse(const OmpDefaultmapClause &x) {
207564ab3302SCarolineConcatto     Walk(std::get<OmpDefaultmapClause::ImplicitBehavior>(x.t));
207664ab3302SCarolineConcatto     Walk(":",
207764ab3302SCarolineConcatto         std::get<std::optional<OmpDefaultmapClause::VariableCategory>>(x.t));
207864ab3302SCarolineConcatto   }
20793060894bSValentin Clement #define GEN_FLANG_CLAUSE_UNPARSE
2080f4c8b803SValentin Clement #include "llvm/Frontend/OpenMP/OMP.inc"
Unparse(const OmpLoopDirective & x)208164ab3302SCarolineConcatto   void Unparse(const OmpLoopDirective &x) {
208264ab3302SCarolineConcatto     switch (x.v) {
20832ddba308SValentin Clement     case llvm::omp::Directive::OMPD_distribute:
20841f879005STim Keith       Word("DISTRIBUTE ");
20851f879005STim Keith       break;
20862ddba308SValentin Clement     case llvm::omp::Directive::OMPD_distribute_parallel_do:
208764ab3302SCarolineConcatto       Word("DISTRIBUTE PARALLEL DO ");
208864ab3302SCarolineConcatto       break;
20892ddba308SValentin Clement     case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
209064ab3302SCarolineConcatto       Word("DISTRIBUTE PARALLEL DO SIMD ");
209164ab3302SCarolineConcatto       break;
20922ddba308SValentin Clement     case llvm::omp::Directive::OMPD_distribute_simd:
209364ab3302SCarolineConcatto       Word("DISTRIBUTE SIMD ");
209464ab3302SCarolineConcatto       break;
20952ddba308SValentin Clement     case llvm::omp::Directive::OMPD_do:
20961f879005STim Keith       Word("DO ");
20971f879005STim Keith       break;
20982ddba308SValentin Clement     case llvm::omp::Directive::OMPD_do_simd:
20992ddba308SValentin Clement       Word("DO SIMD ");
21001f879005STim Keith       break;
21012ddba308SValentin Clement     case llvm::omp::Directive::OMPD_parallel_do:
21021f879005STim Keith       Word("PARALLEL DO ");
21031f879005STim Keith       break;
21042ddba308SValentin Clement     case llvm::omp::Directive::OMPD_parallel_do_simd:
210564ab3302SCarolineConcatto       Word("PARALLEL DO SIMD ");
210664ab3302SCarolineConcatto       break;
21072ddba308SValentin Clement     case llvm::omp::Directive::OMPD_simd:
21081f879005STim Keith       Word("SIMD ");
21091f879005STim Keith       break;
21102ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_parallel_do:
211164ab3302SCarolineConcatto       Word("TARGET PARALLEL DO ");
211264ab3302SCarolineConcatto       break;
21132ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_parallel_do_simd:
211464ab3302SCarolineConcatto       Word("TARGET PARALLEL DO SIMD ");
211564ab3302SCarolineConcatto       break;
21162ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_teams_distribute:
211764ab3302SCarolineConcatto       Word("TARGET TEAMS DISTRIBUTE ");
211864ab3302SCarolineConcatto       break;
21192ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_teams_distribute_parallel_do:
212064ab3302SCarolineConcatto       Word("TARGET TEAMS DISTRIBUTE PARALLEL DO ");
212164ab3302SCarolineConcatto       break;
21222ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_teams_distribute_parallel_do_simd:
212364ab3302SCarolineConcatto       Word("TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD ");
212464ab3302SCarolineConcatto       break;
21252ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_teams_distribute_simd:
212664ab3302SCarolineConcatto       Word("TARGET TEAMS DISTRIBUTE SIMD ");
212764ab3302SCarolineConcatto       break;
21282ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_simd:
21291f879005STim Keith       Word("TARGET SIMD ");
21301f879005STim Keith       break;
21312ddba308SValentin Clement     case llvm::omp::Directive::OMPD_taskloop:
21321f879005STim Keith       Word("TASKLOOP ");
21331f879005STim Keith       break;
21342ddba308SValentin Clement     case llvm::omp::Directive::OMPD_taskloop_simd:
213564ab3302SCarolineConcatto       Word("TASKLOOP SIMD ");
213664ab3302SCarolineConcatto       break;
21372ddba308SValentin Clement     case llvm::omp::Directive::OMPD_teams_distribute:
213864ab3302SCarolineConcatto       Word("TEAMS DISTRIBUTE ");
213964ab3302SCarolineConcatto       break;
21402ddba308SValentin Clement     case llvm::omp::Directive::OMPD_teams_distribute_parallel_do:
214164ab3302SCarolineConcatto       Word("TEAMS DISTRIBUTE PARALLEL DO ");
214264ab3302SCarolineConcatto       break;
21432ddba308SValentin Clement     case llvm::omp::Directive::OMPD_teams_distribute_parallel_do_simd:
214464ab3302SCarolineConcatto       Word("TEAMS DISTRIBUTE PARALLEL DO SIMD ");
214564ab3302SCarolineConcatto       break;
21462ddba308SValentin Clement     case llvm::omp::Directive::OMPD_teams_distribute_simd:
214764ab3302SCarolineConcatto       Word("TEAMS DISTRIBUTE SIMD ");
214864ab3302SCarolineConcatto       break;
21492ddba308SValentin Clement     default:
21502ddba308SValentin Clement       break;
215164ab3302SCarolineConcatto     }
215264ab3302SCarolineConcatto   }
Unparse(const OmpObjectList & x)215364ab3302SCarolineConcatto   void Unparse(const OmpObjectList &x) { Walk(x.v, ","); }
Unparse(const OmpSimpleStandaloneDirective & x)215464ab3302SCarolineConcatto   void Unparse(const OmpSimpleStandaloneDirective &x) {
215564ab3302SCarolineConcatto     switch (x.v) {
21562ddba308SValentin Clement     case llvm::omp::Directive::OMPD_barrier:
215764ab3302SCarolineConcatto       Word("BARRIER ");
215864ab3302SCarolineConcatto       break;
21592ddba308SValentin Clement     case llvm::omp::Directive::OMPD_taskwait:
216064ab3302SCarolineConcatto       Word("TASKWAIT ");
216164ab3302SCarolineConcatto       break;
21622ddba308SValentin Clement     case llvm::omp::Directive::OMPD_taskyield:
216364ab3302SCarolineConcatto       Word("TASKYIELD ");
216464ab3302SCarolineConcatto       break;
21652ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_enter_data:
216664ab3302SCarolineConcatto       Word("TARGET ENTER DATA ");
216764ab3302SCarolineConcatto       break;
21682ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_exit_data:
216964ab3302SCarolineConcatto       Word("TARGET EXIT DATA ");
217064ab3302SCarolineConcatto       break;
21712ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_update:
217264ab3302SCarolineConcatto       Word("TARGET UPDATE ");
217364ab3302SCarolineConcatto       break;
21742ddba308SValentin Clement     case llvm::omp::Directive::OMPD_ordered:
217564ab3302SCarolineConcatto       Word("ORDERED ");
217664ab3302SCarolineConcatto       break;
21772ddba308SValentin Clement     default:
21782ddba308SValentin Clement       // Nothing to be done
21792ddba308SValentin Clement       break;
218064ab3302SCarolineConcatto     }
218164ab3302SCarolineConcatto   }
Unparse(const OmpBlockDirective & x)218264ab3302SCarolineConcatto   void Unparse(const OmpBlockDirective &x) {
218364ab3302SCarolineConcatto     switch (x.v) {
21842ddba308SValentin Clement     case llvm::omp::Directive::OMPD_master:
21851f879005STim Keith       Word("MASTER");
21861f879005STim Keith       break;
21872ddba308SValentin Clement     case llvm::omp::Directive::OMPD_ordered:
21881f879005STim Keith       Word("ORDERED ");
21891f879005STim Keith       break;
21902ddba308SValentin Clement     case llvm::omp::Directive::OMPD_parallel_workshare:
219164ab3302SCarolineConcatto       Word("PARALLEL WORKSHARE ");
219264ab3302SCarolineConcatto       break;
21932ddba308SValentin Clement     case llvm::omp::Directive::OMPD_parallel:
21941f879005STim Keith       Word("PARALLEL ");
21951f879005STim Keith       break;
21962ddba308SValentin Clement     case llvm::omp::Directive::OMPD_single:
21971f879005STim Keith       Word("SINGLE ");
21981f879005STim Keith       break;
21992ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_data:
22001f879005STim Keith       Word("TARGET DATA ");
22011f879005STim Keith       break;
22022ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_parallel:
220364ab3302SCarolineConcatto       Word("TARGET PARALLEL ");
220464ab3302SCarolineConcatto       break;
22052ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target_teams:
220664ab3302SCarolineConcatto       Word("TARGET TEAMS ");
220764ab3302SCarolineConcatto       break;
22082ddba308SValentin Clement     case llvm::omp::Directive::OMPD_target:
22091f879005STim Keith       Word("TARGET ");
22101f879005STim Keith       break;
22112ddba308SValentin Clement     case llvm::omp::Directive::OMPD_taskgroup:
22121f879005STim Keith       Word("TASKGROUP ");
22131f879005STim Keith       break;
22142ddba308SValentin Clement     case llvm::omp::Directive::OMPD_task:
22151f879005STim Keith       Word("TASK ");
22161f879005STim Keith       break;
22172ddba308SValentin Clement     case llvm::omp::Directive::OMPD_teams:
22181f879005STim Keith       Word("TEAMS ");
22191f879005STim Keith       break;
22202ddba308SValentin Clement     case llvm::omp::Directive::OMPD_workshare:
22211f879005STim Keith       Word("WORKSHARE ");
22221f879005STim Keith       break;
22232ddba308SValentin Clement     default:
22242ddba308SValentin Clement       // Nothing to be done
22252ddba308SValentin Clement       break;
222664ab3302SCarolineConcatto     }
222764ab3302SCarolineConcatto   }
Unparse(const OmpAtomicClauseList & x)2228e43b3b08Ssameeran joshi   void Unparse(const OmpAtomicClauseList &x) { Walk(" ", x.v, " "); }
2229e43b3b08Ssameeran joshi 
Unparse(const OmpAtomic & x)223064ab3302SCarolineConcatto   void Unparse(const OmpAtomic &x) {
223164ab3302SCarolineConcatto     BeginOpenMP();
223264ab3302SCarolineConcatto     Word("!$OMP ATOMIC");
2233e43b3b08Ssameeran joshi     Walk(std::get<OmpAtomicClauseList>(x.t));
223464ab3302SCarolineConcatto     Put("\n");
223564ab3302SCarolineConcatto     EndOpenMP();
223664ab3302SCarolineConcatto     Walk(std::get<Statement<AssignmentStmt>>(x.t));
223764ab3302SCarolineConcatto     BeginOpenMP();
223864ab3302SCarolineConcatto     Walk(std::get<std::optional<OmpEndAtomic>>(x.t), "!$OMP END ATOMIC\n");
223964ab3302SCarolineConcatto     EndOpenMP();
224064ab3302SCarolineConcatto   }
Unparse(const OmpAtomicCapture & x)224164ab3302SCarolineConcatto   void Unparse(const OmpAtomicCapture &x) {
224264ab3302SCarolineConcatto     BeginOpenMP();
224364ab3302SCarolineConcatto     Word("!$OMP ATOMIC");
2244d95d3d2aSsameeran joshi     Walk(std::get<0>(x.t));
224564ab3302SCarolineConcatto     Word(" CAPTURE");
2246d95d3d2aSsameeran joshi     Walk(std::get<2>(x.t));
224764ab3302SCarolineConcatto     Put("\n");
224864ab3302SCarolineConcatto     EndOpenMP();
224964ab3302SCarolineConcatto     Walk(std::get<OmpAtomicCapture::Stmt1>(x.t));
225064ab3302SCarolineConcatto     Put("\n");
225164ab3302SCarolineConcatto     Walk(std::get<OmpAtomicCapture::Stmt2>(x.t));
225264ab3302SCarolineConcatto     BeginOpenMP();
225364ab3302SCarolineConcatto     Word("!$OMP END ATOMIC\n");
225464ab3302SCarolineConcatto     EndOpenMP();
225564ab3302SCarolineConcatto   }
Unparse(const OmpAtomicRead & x)225664ab3302SCarolineConcatto   void Unparse(const OmpAtomicRead &x) {
225764ab3302SCarolineConcatto     BeginOpenMP();
225864ab3302SCarolineConcatto     Word("!$OMP ATOMIC");
2259d95d3d2aSsameeran joshi     Walk(std::get<0>(x.t));
226064ab3302SCarolineConcatto     Word(" READ");
2261d95d3d2aSsameeran joshi     Walk(std::get<2>(x.t));
226264ab3302SCarolineConcatto     Put("\n");
226364ab3302SCarolineConcatto     EndOpenMP();
226464ab3302SCarolineConcatto     Walk(std::get<Statement<AssignmentStmt>>(x.t));
226564ab3302SCarolineConcatto     BeginOpenMP();
226664ab3302SCarolineConcatto     Walk(std::get<std::optional<OmpEndAtomic>>(x.t), "!$OMP END ATOMIC\n");
226764ab3302SCarolineConcatto     EndOpenMP();
226864ab3302SCarolineConcatto   }
Unparse(const OmpAtomicUpdate & x)226964ab3302SCarolineConcatto   void Unparse(const OmpAtomicUpdate &x) {
227064ab3302SCarolineConcatto     BeginOpenMP();
227164ab3302SCarolineConcatto     Word("!$OMP ATOMIC");
2272d95d3d2aSsameeran joshi     Walk(std::get<0>(x.t));
227364ab3302SCarolineConcatto     Word(" UPDATE");
2274d95d3d2aSsameeran joshi     Walk(std::get<2>(x.t));
227564ab3302SCarolineConcatto     Put("\n");
227664ab3302SCarolineConcatto     EndOpenMP();
227764ab3302SCarolineConcatto     Walk(std::get<Statement<AssignmentStmt>>(x.t));
227864ab3302SCarolineConcatto     BeginOpenMP();
227964ab3302SCarolineConcatto     Walk(std::get<std::optional<OmpEndAtomic>>(x.t), "!$OMP END ATOMIC\n");
228064ab3302SCarolineConcatto     EndOpenMP();
228164ab3302SCarolineConcatto   }
Unparse(const OmpAtomicWrite & x)228264ab3302SCarolineConcatto   void Unparse(const OmpAtomicWrite &x) {
228364ab3302SCarolineConcatto     BeginOpenMP();
228464ab3302SCarolineConcatto     Word("!$OMP ATOMIC");
2285d95d3d2aSsameeran joshi     Walk(std::get<0>(x.t));
228664ab3302SCarolineConcatto     Word(" WRITE");
2287d95d3d2aSsameeran joshi     Walk(std::get<2>(x.t));
228864ab3302SCarolineConcatto     Put("\n");
228964ab3302SCarolineConcatto     EndOpenMP();
229064ab3302SCarolineConcatto     Walk(std::get<Statement<AssignmentStmt>>(x.t));
229164ab3302SCarolineConcatto     BeginOpenMP();
229264ab3302SCarolineConcatto     Walk(std::get<std::optional<OmpEndAtomic>>(x.t), "!$OMP END ATOMIC\n");
229364ab3302SCarolineConcatto     EndOpenMP();
229464ab3302SCarolineConcatto   }
Unparse(const OpenMPExecutableAllocate & x)2295c9e967afSIrina Dobrescu   void Unparse(const OpenMPExecutableAllocate &x) {
2296c9e967afSIrina Dobrescu     BeginOpenMP();
2297c9e967afSIrina Dobrescu     Word("!$OMP ALLOCATE");
2298c9e967afSIrina Dobrescu     Walk(" (", std::get<std::optional<OmpObjectList>>(x.t), ")");
2299c9e967afSIrina Dobrescu     Walk(std::get<OmpClauseList>(x.t));
2300c9e967afSIrina Dobrescu     Put("\n");
2301c9e967afSIrina Dobrescu     EndOpenMP();
2302c9e967afSIrina Dobrescu     Walk(std::get<Statement<AllocateStmt>>(x.t));
2303c9e967afSIrina Dobrescu   }
Unparse(const OpenMPDeclarativeAllocate & x)2304c9e967afSIrina Dobrescu   void Unparse(const OpenMPDeclarativeAllocate &x) {
2305c9e967afSIrina Dobrescu     BeginOpenMP();
2306c9e967afSIrina Dobrescu     Word("!$OMP ALLOCATE");
2307c9e967afSIrina Dobrescu     Put(" (");
2308c9e967afSIrina Dobrescu     Walk(std::get<OmpObjectList>(x.t));
2309c9e967afSIrina Dobrescu     Put(")");
2310c9e967afSIrina Dobrescu     Walk(std::get<OmpClauseList>(x.t));
2311c9e967afSIrina Dobrescu     Put("\n");
2312c9e967afSIrina Dobrescu     EndOpenMP();
2313c9e967afSIrina Dobrescu   }
Unparse(const OmpCriticalDirective & x)231464ab3302SCarolineConcatto   void Unparse(const OmpCriticalDirective &x) {
231564ab3302SCarolineConcatto     BeginOpenMP();
231664ab3302SCarolineConcatto     Word("!$OMP CRITICAL");
231764ab3302SCarolineConcatto     Walk(" (", std::get<std::optional<Name>>(x.t), ")");
2318fe2d053cSNimish Mishra     Walk(std::get<OmpClauseList>(x.t));
231964ab3302SCarolineConcatto     Put("\n");
232064ab3302SCarolineConcatto     EndOpenMP();
232164ab3302SCarolineConcatto   }
Unparse(const OmpEndCriticalDirective & x)232264ab3302SCarolineConcatto   void Unparse(const OmpEndCriticalDirective &x) {
232364ab3302SCarolineConcatto     BeginOpenMP();
232464ab3302SCarolineConcatto     Word("!$OMP END CRITICAL");
232564ab3302SCarolineConcatto     Walk(" (", std::get<std::optional<Name>>(x.t), ")");
232664ab3302SCarolineConcatto     Put("\n");
232764ab3302SCarolineConcatto     EndOpenMP();
232864ab3302SCarolineConcatto   }
Unparse(const OpenMPCriticalConstruct & x)232964ab3302SCarolineConcatto   void Unparse(const OpenMPCriticalConstruct &x) {
233064ab3302SCarolineConcatto     Walk(std::get<OmpCriticalDirective>(x.t));
233164ab3302SCarolineConcatto     Walk(std::get<Block>(x.t), "");
233264ab3302SCarolineConcatto     Walk(std::get<OmpEndCriticalDirective>(x.t));
233364ab3302SCarolineConcatto   }
Unparse(const OmpDeclareTargetWithList & x)233464ab3302SCarolineConcatto   void Unparse(const OmpDeclareTargetWithList &x) {
233564ab3302SCarolineConcatto     Put("("), Walk(x.v), Put(")");
233664ab3302SCarolineConcatto   }
Unparse(const OmpReductionInitializerClause & x)233764ab3302SCarolineConcatto   void Unparse(const OmpReductionInitializerClause &x) {
233864ab3302SCarolineConcatto     Word(" INITIALIZER(OMP_PRIV = ");
233964ab3302SCarolineConcatto     Walk(x.v);
234064ab3302SCarolineConcatto     Put(")");
234164ab3302SCarolineConcatto   }
Unparse(const OmpReductionCombiner::FunctionCombiner & x)234264ab3302SCarolineConcatto   void Unparse(const OmpReductionCombiner::FunctionCombiner &x) {
234364ab3302SCarolineConcatto     const auto &pd = std::get<ProcedureDesignator>(x.v.t);
234464ab3302SCarolineConcatto     const auto &args = std::get<std::list<ActualArgSpec>>(x.v.t);
234564ab3302SCarolineConcatto     Walk(pd);
234664ab3302SCarolineConcatto     if (args.empty()) {
234764ab3302SCarolineConcatto       if (std::holds_alternative<ProcComponentRef>(pd.u)) {
234864ab3302SCarolineConcatto         Put("()");
234964ab3302SCarolineConcatto       }
235064ab3302SCarolineConcatto     } else {
235164ab3302SCarolineConcatto       Walk("(", args, ", ", ")");
235264ab3302SCarolineConcatto     }
235364ab3302SCarolineConcatto   }
Unparse(const OpenMPDeclareReductionConstruct & x)235464ab3302SCarolineConcatto   void Unparse(const OpenMPDeclareReductionConstruct &x) {
235564ab3302SCarolineConcatto     Put("(");
235664ab3302SCarolineConcatto     Walk(std::get<OmpReductionOperator>(x.t)), Put(" : ");
235764ab3302SCarolineConcatto     Walk(std::get<std::list<DeclarationTypeSpec>>(x.t), ","), Put(" : ");
235864ab3302SCarolineConcatto     Walk(std::get<OmpReductionCombiner>(x.t));
235964ab3302SCarolineConcatto     Put(")");
236064ab3302SCarolineConcatto     Walk(std::get<std::optional<OmpReductionInitializerClause>>(x.t));
236164ab3302SCarolineConcatto   }
Pre(const OpenMPDeclarativeConstruct & x)236264ab3302SCarolineConcatto   bool Pre(const OpenMPDeclarativeConstruct &x) {
236364ab3302SCarolineConcatto     BeginOpenMP();
236464ab3302SCarolineConcatto     Word("!$OMP ");
2365cd03e96fSPeter Klausler     return common::visit(
2366cd03e96fSPeter Klausler         common::visitors{
2367c9e967afSIrina Dobrescu             [&](const OpenMPDeclarativeAllocate &z) {
2368c9e967afSIrina Dobrescu               Word("ALLOCATE (");
2369c9e967afSIrina Dobrescu               Walk(std::get<OmpObjectList>(z.t));
2370c9e967afSIrina Dobrescu               Put(")");
2371c9e967afSIrina Dobrescu               Walk(std::get<OmpClauseList>(z.t));
2372c9e967afSIrina Dobrescu               Put("\n");
2373c9e967afSIrina Dobrescu               EndOpenMP();
2374c9e967afSIrina Dobrescu               return false;
2375c9e967afSIrina Dobrescu             },
237664ab3302SCarolineConcatto             [&](const OpenMPDeclareReductionConstruct &) {
237764ab3302SCarolineConcatto               Word("DECLARE REDUCTION ");
237864ab3302SCarolineConcatto               return true;
237964ab3302SCarolineConcatto             },
238064ab3302SCarolineConcatto             [&](const OpenMPDeclareSimdConstruct &y) {
238164ab3302SCarolineConcatto               Word("DECLARE SIMD ");
238264ab3302SCarolineConcatto               Walk("(", std::get<std::optional<Name>>(y.t), ")");
238364ab3302SCarolineConcatto               Walk(std::get<OmpClauseList>(y.t));
238464ab3302SCarolineConcatto               Put("\n");
238564ab3302SCarolineConcatto               EndOpenMP();
238664ab3302SCarolineConcatto               return false;
238764ab3302SCarolineConcatto             },
238864ab3302SCarolineConcatto             [&](const OpenMPDeclareTargetConstruct &) {
238964ab3302SCarolineConcatto               Word("DECLARE TARGET ");
239064ab3302SCarolineConcatto               return true;
239164ab3302SCarolineConcatto             },
239264ab3302SCarolineConcatto             [&](const OpenMPThreadprivate &) {
239364ab3302SCarolineConcatto               Word("THREADPRIVATE (");
239464ab3302SCarolineConcatto               return true;
239564ab3302SCarolineConcatto             },
239664ab3302SCarolineConcatto         },
239764ab3302SCarolineConcatto         x.u);
239864ab3302SCarolineConcatto   }
Post(const OpenMPDeclarativeConstruct &)239964ab3302SCarolineConcatto   void Post(const OpenMPDeclarativeConstruct &) {
240064ab3302SCarolineConcatto     Put("\n");
240164ab3302SCarolineConcatto     EndOpenMP();
240264ab3302SCarolineConcatto   }
Post(const OpenMPThreadprivate &)240364ab3302SCarolineConcatto   void Post(const OpenMPThreadprivate &) {
240464ab3302SCarolineConcatto     Put(")\n");
240564ab3302SCarolineConcatto     EndOpenMP();
240664ab3302SCarolineConcatto   }
Unparse(const OmpSectionsDirective & x)240764ab3302SCarolineConcatto   void Unparse(const OmpSectionsDirective &x) {
240864ab3302SCarolineConcatto     switch (x.v) {
24092ddba308SValentin Clement     case llvm::omp::Directive::OMPD_sections:
24101f879005STim Keith       Word("SECTIONS ");
24111f879005STim Keith       break;
24122ddba308SValentin Clement     case llvm::omp::Directive::OMPD_parallel_sections:
241364ab3302SCarolineConcatto       Word("PARALLEL SECTIONS ");
241464ab3302SCarolineConcatto       break;
24152ddba308SValentin Clement     default:
24162ddba308SValentin Clement       break;
241764ab3302SCarolineConcatto     }
241864ab3302SCarolineConcatto   }
Unparse(const OmpSectionBlocks & x)241964ab3302SCarolineConcatto   void Unparse(const OmpSectionBlocks &x) {
242064ab3302SCarolineConcatto     for (const auto &y : x.v) {
242164ab3302SCarolineConcatto       BeginOpenMP();
242264ab3302SCarolineConcatto       Word("!$OMP SECTION");
242364ab3302SCarolineConcatto       Put("\n");
242464ab3302SCarolineConcatto       EndOpenMP();
2425ae1623b3SShraiysh Vaishay       // y.u is an OpenMPSectionConstruct
2426ae1623b3SShraiysh Vaishay       // (y.u).v is Block
2427ae1623b3SShraiysh Vaishay       Walk(std::get<OpenMPSectionConstruct>(y.u).v, "");
242864ab3302SCarolineConcatto     }
242964ab3302SCarolineConcatto   }
Unparse(const OpenMPSectionsConstruct & x)243064ab3302SCarolineConcatto   void Unparse(const OpenMPSectionsConstruct &x) {
243164ab3302SCarolineConcatto     BeginOpenMP();
243264ab3302SCarolineConcatto     Word("!$OMP ");
243364ab3302SCarolineConcatto     Walk(std::get<OmpBeginSectionsDirective>(x.t));
243464ab3302SCarolineConcatto     Put("\n");
243564ab3302SCarolineConcatto     EndOpenMP();
243664ab3302SCarolineConcatto     Walk(std::get<OmpSectionBlocks>(x.t));
243764ab3302SCarolineConcatto     BeginOpenMP();
243864ab3302SCarolineConcatto     Word("!$OMP END ");
243964ab3302SCarolineConcatto     Walk(std::get<OmpEndSectionsDirective>(x.t));
244064ab3302SCarolineConcatto     Put("\n");
244164ab3302SCarolineConcatto     EndOpenMP();
244264ab3302SCarolineConcatto   }
Unparse(const OpenMPCancellationPointConstruct & x)244364ab3302SCarolineConcatto   void Unparse(const OpenMPCancellationPointConstruct &x) {
244464ab3302SCarolineConcatto     BeginOpenMP();
244564ab3302SCarolineConcatto     Word("!$OMP CANCELLATION POINT ");
244664ab3302SCarolineConcatto     Walk(std::get<OmpCancelType>(x.t));
244764ab3302SCarolineConcatto     Put("\n");
244864ab3302SCarolineConcatto     EndOpenMP();
244964ab3302SCarolineConcatto   }
Unparse(const OpenMPCancelConstruct & x)245064ab3302SCarolineConcatto   void Unparse(const OpenMPCancelConstruct &x) {
245164ab3302SCarolineConcatto     BeginOpenMP();
245264ab3302SCarolineConcatto     Word("!$OMP CANCEL ");
245364ab3302SCarolineConcatto     Walk(std::get<OmpCancelType>(x.t));
245464ab3302SCarolineConcatto     Walk(std::get<std::optional<OpenMPCancelConstruct::If>>(x.t));
245564ab3302SCarolineConcatto     Put("\n");
245664ab3302SCarolineConcatto     EndOpenMP();
245764ab3302SCarolineConcatto   }
Unparse(const OmpMemoryOrderClause & x)2458aa179d80SValentin Clement   void Unparse(const OmpMemoryOrderClause &x) { Walk(x.v); }
Unparse(const OmpAtomicClause & x)2459e43b3b08Ssameeran joshi   void Unparse(const OmpAtomicClause &x) {
2460cd03e96fSPeter Klausler     common::visit(common::visitors{
2461e43b3b08Ssameeran joshi                       [&](const OmpMemoryOrderClause &y) { Walk(y); },
2462e43b3b08Ssameeran joshi                       [&](const OmpClause &z) { Walk(z); },
2463e43b3b08Ssameeran joshi                   },
2464e43b3b08Ssameeran joshi         x.u);
2465e43b3b08Ssameeran joshi   }
Unparse(const OpenMPFlushConstruct & x)246664ab3302SCarolineConcatto   void Unparse(const OpenMPFlushConstruct &x) {
246764ab3302SCarolineConcatto     BeginOpenMP();
246864ab3302SCarolineConcatto     Word("!$OMP FLUSH ");
2469f1569b1eSsameeran joshi     Walk(std::get<std::optional<std::list<OmpMemoryOrderClause>>>(x.t));
247064ab3302SCarolineConcatto     Walk(" (", std::get<std::optional<OmpObjectList>>(x.t), ")");
247164ab3302SCarolineConcatto     Put("\n");
247264ab3302SCarolineConcatto     EndOpenMP();
247364ab3302SCarolineConcatto   }
Unparse(const OmpEndLoopDirective & x)247464ab3302SCarolineConcatto   void Unparse(const OmpEndLoopDirective &x) {
247564ab3302SCarolineConcatto     BeginOpenMP();
247664ab3302SCarolineConcatto     Word("!$OMP END ");
247764ab3302SCarolineConcatto     Walk(std::get<OmpLoopDirective>(x.t));
247864ab3302SCarolineConcatto     Walk(std::get<OmpClauseList>(x.t));
247964ab3302SCarolineConcatto     Put("\n");
248064ab3302SCarolineConcatto     EndOpenMP();
248164ab3302SCarolineConcatto   }
Unparse(const OmpClauseList & x)248264ab3302SCarolineConcatto   void Unparse(const OmpClauseList &x) { Walk(" ", x.v, " "); }
Unparse(const OpenMPSimpleStandaloneConstruct & x)248364ab3302SCarolineConcatto   void Unparse(const OpenMPSimpleStandaloneConstruct &x) {
248464ab3302SCarolineConcatto     BeginOpenMP();
248564ab3302SCarolineConcatto     Word("!$OMP ");
248664ab3302SCarolineConcatto     Walk(std::get<OmpSimpleStandaloneDirective>(x.t));
248764ab3302SCarolineConcatto     Walk(std::get<OmpClauseList>(x.t));
248864ab3302SCarolineConcatto     Put("\n");
248964ab3302SCarolineConcatto     EndOpenMP();
249064ab3302SCarolineConcatto   }
Unparse(const OpenMPBlockConstruct & x)249164ab3302SCarolineConcatto   void Unparse(const OpenMPBlockConstruct &x) {
249264ab3302SCarolineConcatto     BeginOpenMP();
249364ab3302SCarolineConcatto     Word("!$OMP ");
249464ab3302SCarolineConcatto     Walk(std::get<OmpBeginBlockDirective>(x.t));
249564ab3302SCarolineConcatto     Put("\n");
249664ab3302SCarolineConcatto     EndOpenMP();
249764ab3302SCarolineConcatto     Walk(std::get<Block>(x.t), "");
249864ab3302SCarolineConcatto     BeginOpenMP();
249964ab3302SCarolineConcatto     Word("!$OMP END ");
250064ab3302SCarolineConcatto     Walk(std::get<OmpEndBlockDirective>(x.t));
250164ab3302SCarolineConcatto     Put("\n");
250264ab3302SCarolineConcatto     EndOpenMP();
250364ab3302SCarolineConcatto   }
Unparse(const OpenMPLoopConstruct & x)250464ab3302SCarolineConcatto   void Unparse(const OpenMPLoopConstruct &x) {
250564ab3302SCarolineConcatto     BeginOpenMP();
250664ab3302SCarolineConcatto     Word("!$OMP ");
250764ab3302SCarolineConcatto     Walk(std::get<OmpBeginLoopDirective>(x.t));
250864ab3302SCarolineConcatto     Put("\n");
250964ab3302SCarolineConcatto     EndOpenMP();
251064ab3302SCarolineConcatto     Walk(std::get<std::optional<DoConstruct>>(x.t));
251164ab3302SCarolineConcatto     Walk(std::get<std::optional<OmpEndLoopDirective>>(x.t));
251264ab3302SCarolineConcatto   }
Unparse(const BasedPointer & x)251364ab3302SCarolineConcatto   void Unparse(const BasedPointer &x) {
251464ab3302SCarolineConcatto     Put('('), Walk(std::get<0>(x.t)), Put(","), Walk(std::get<1>(x.t));
251564ab3302SCarolineConcatto     Walk("(", std::get<std::optional<ArraySpec>>(x.t), ")"), Put(')');
251664ab3302SCarolineConcatto   }
Unparse(const BasedPointerStmt & x)251764ab3302SCarolineConcatto   void Unparse(const BasedPointerStmt &x) { Walk("POINTER ", x.v, ","); }
Post(const StructureField & x)251864ab3302SCarolineConcatto   void Post(const StructureField &x) {
251964ab3302SCarolineConcatto     if (const auto *def{std::get_if<Statement<DataComponentDefStmt>>(&x.u)}) {
2520c14cf92bSPeter Klausler       for (const auto &item :
2521c14cf92bSPeter Klausler           std::get<std::list<ComponentOrFill>>(def->statement.t)) {
2522c14cf92bSPeter Klausler         if (const auto *comp{std::get_if<ComponentDecl>(&item.u)}) {
2523c14cf92bSPeter Klausler           structureComponents_.insert(std::get<Name>(comp->t).source);
2524c14cf92bSPeter Klausler         }
252564ab3302SCarolineConcatto       }
252664ab3302SCarolineConcatto     }
252764ab3302SCarolineConcatto   }
Unparse(const StructureStmt & x)252864ab3302SCarolineConcatto   void Unparse(const StructureStmt &x) {
252964ab3302SCarolineConcatto     Word("STRUCTURE ");
2530c14cf92bSPeter Klausler     // The name, if present, includes the /slashes/
2531c14cf92bSPeter Klausler     Walk(std::get<std::optional<Name>>(x.t));
253264ab3302SCarolineConcatto     Walk(" ", std::get<std::list<EntityDecl>>(x.t), ", ");
253364ab3302SCarolineConcatto     Indent();
253464ab3302SCarolineConcatto   }
Post(const Union::UnionStmt &)253564ab3302SCarolineConcatto   void Post(const Union::UnionStmt &) { Word("UNION"), Indent(); }
Post(const Union::EndUnionStmt &)253664ab3302SCarolineConcatto   void Post(const Union::EndUnionStmt &) { Outdent(), Word("END UNION"); }
Post(const Map::MapStmt &)253764ab3302SCarolineConcatto   void Post(const Map::MapStmt &) { Word("MAP"), Indent(); }
Post(const Map::EndMapStmt &)253864ab3302SCarolineConcatto   void Post(const Map::EndMapStmt &) { Outdent(), Word("END MAP"); }
Post(const StructureDef::EndStructureStmt &)253964ab3302SCarolineConcatto   void Post(const StructureDef::EndStructureStmt &) {
254064ab3302SCarolineConcatto     Outdent(), Word("END STRUCTURE");
254164ab3302SCarolineConcatto   }
Unparse(const OldParameterStmt & x)254264ab3302SCarolineConcatto   void Unparse(const OldParameterStmt &x) {
254364ab3302SCarolineConcatto     Word("PARAMETER "), Walk(x.v, ", ");
254464ab3302SCarolineConcatto   }
Unparse(const ArithmeticIfStmt & x)254564ab3302SCarolineConcatto   void Unparse(const ArithmeticIfStmt &x) {
254664ab3302SCarolineConcatto     Word("IF ("), Walk(std::get<Expr>(x.t)), Put(") ");
254764ab3302SCarolineConcatto     Walk(std::get<1>(x.t)), Put(", ");
254864ab3302SCarolineConcatto     Walk(std::get<2>(x.t)), Put(", ");
254964ab3302SCarolineConcatto     Walk(std::get<3>(x.t));
255064ab3302SCarolineConcatto   }
Unparse(const AssignStmt & x)255164ab3302SCarolineConcatto   void Unparse(const AssignStmt &x) {
255264ab3302SCarolineConcatto     Word("ASSIGN "), Walk(std::get<Label>(x.t));
255364ab3302SCarolineConcatto     Word(" TO "), Walk(std::get<Name>(x.t));
255464ab3302SCarolineConcatto   }
Unparse(const AssignedGotoStmt & x)255564ab3302SCarolineConcatto   void Unparse(const AssignedGotoStmt &x) {
255664ab3302SCarolineConcatto     Word("GO TO "), Walk(std::get<Name>(x.t));
255764ab3302SCarolineConcatto     Walk(", (", std::get<std::list<Label>>(x.t), ", ", ")");
255864ab3302SCarolineConcatto   }
Unparse(const PauseStmt & x)255964ab3302SCarolineConcatto   void Unparse(const PauseStmt &x) { Word("PAUSE"), Walk(" ", x.v); }
256064ab3302SCarolineConcatto 
256164ab3302SCarolineConcatto #define WALK_NESTED_ENUM(CLASS, ENUM) \
256264ab3302SCarolineConcatto   void Unparse(const CLASS::ENUM &x) { Word(CLASS::EnumToString(x)); }
WALK_NESTED_ENUM(AccessSpec,Kind)256364ab3302SCarolineConcatto   WALK_NESTED_ENUM(AccessSpec, Kind) // R807
256464ab3302SCarolineConcatto   WALK_NESTED_ENUM(common, TypeParamAttr) // R734
256564ab3302SCarolineConcatto   WALK_NESTED_ENUM(IntentSpec, Intent) // R826
256664ab3302SCarolineConcatto   WALK_NESTED_ENUM(ImplicitStmt, ImplicitNoneNameSpec) // R866
256764ab3302SCarolineConcatto   WALK_NESTED_ENUM(ConnectSpec::CharExpr, Kind) // R1205
256864ab3302SCarolineConcatto   WALK_NESTED_ENUM(IoControlSpec::CharExpr, Kind)
256964ab3302SCarolineConcatto   WALK_NESTED_ENUM(InquireSpec::CharVar, Kind)
257064ab3302SCarolineConcatto   WALK_NESTED_ENUM(InquireSpec::IntVar, Kind)
257164ab3302SCarolineConcatto   WALK_NESTED_ENUM(InquireSpec::LogVar, Kind)
257264ab3302SCarolineConcatto   WALK_NESTED_ENUM(ProcedureStmt, Kind) // R1506
257364ab3302SCarolineConcatto   WALK_NESTED_ENUM(UseStmt, ModuleNature) // R1410
257464ab3302SCarolineConcatto   WALK_NESTED_ENUM(OmpProcBindClause, Type) // OMP PROC_BIND
257564ab3302SCarolineConcatto   WALK_NESTED_ENUM(OmpDefaultClause, Type) // OMP DEFAULT
257664ab3302SCarolineConcatto   WALK_NESTED_ENUM(OmpDefaultmapClause, ImplicitBehavior) // OMP DEFAULTMAP
257764ab3302SCarolineConcatto   WALK_NESTED_ENUM(OmpDefaultmapClause, VariableCategory) // OMP DEFAULTMAP
257864ab3302SCarolineConcatto   WALK_NESTED_ENUM(OmpScheduleModifierType, ModType) // OMP schedule-modifier
257964ab3302SCarolineConcatto   WALK_NESTED_ENUM(OmpLinearModifier, Type) // OMP linear-modifier
258064ab3302SCarolineConcatto   WALK_NESTED_ENUM(OmpDependenceType, Type) // OMP dependence-type
258164ab3302SCarolineConcatto   WALK_NESTED_ENUM(OmpMapType, Type) // OMP map-type
258264ab3302SCarolineConcatto   WALK_NESTED_ENUM(OmpScheduleClause, ScheduleType) // OMP schedule-type
25831f879005STim Keith   WALK_NESTED_ENUM(OmpIfClause, DirectiveNameModifier) // OMP directive-modifier
258464ab3302SCarolineConcatto   WALK_NESTED_ENUM(OmpCancelType, Type) // OMP cancel-type
258564ab3302SCarolineConcatto #undef WALK_NESTED_ENUM
258664ab3302SCarolineConcatto 
258764ab3302SCarolineConcatto   void Done() const { CHECK(indent_ == 0); }
258864ab3302SCarolineConcatto 
258964ab3302SCarolineConcatto private:
259064ab3302SCarolineConcatto   void Put(char);
259164ab3302SCarolineConcatto   void Put(const char *);
259264ab3302SCarolineConcatto   void Put(const std::string &);
259364ab3302SCarolineConcatto   void PutNormalized(const std::string &);
259464ab3302SCarolineConcatto   void PutKeywordLetter(char);
259564ab3302SCarolineConcatto   void Word(const char *);
259664ab3302SCarolineConcatto   void Word(const std::string &);
Indent()259764ab3302SCarolineConcatto   void Indent() { indent_ += indentationAmount_; }
Outdent()259864ab3302SCarolineConcatto   void Outdent() {
259964ab3302SCarolineConcatto     CHECK(indent_ >= indentationAmount_);
260064ab3302SCarolineConcatto     indent_ -= indentationAmount_;
260164ab3302SCarolineConcatto   }
BeginOpenMP()260264ab3302SCarolineConcatto   void BeginOpenMP() { openmpDirective_ = true; }
EndOpenMP()260364ab3302SCarolineConcatto   void EndOpenMP() { openmpDirective_ = false; }
BeginOpenACC()26040a90ffa7SValentin Clement   void BeginOpenACC() { openaccDirective_ = true; }
EndOpenACC()26050a90ffa7SValentin Clement   void EndOpenACC() { openaccDirective_ = false; }
260664ab3302SCarolineConcatto 
260764ab3302SCarolineConcatto   // Call back to the traversal framework.
Walk(const T & x)260864ab3302SCarolineConcatto   template <typename T> void Walk(const T &x) {
260964ab3302SCarolineConcatto     Fortran::parser::Walk(x, *this);
261064ab3302SCarolineConcatto   }
261164ab3302SCarolineConcatto 
261264ab3302SCarolineConcatto   // Traverse a std::optional<> value.  Emit a prefix and/or a suffix string
261364ab3302SCarolineConcatto   // only when it contains a value.
261464ab3302SCarolineConcatto   template <typename A>
Walk(const char * prefix,const std::optional<A> & x,const char * suffix="")261564ab3302SCarolineConcatto   void Walk(
261664ab3302SCarolineConcatto       const char *prefix, const std::optional<A> &x, const char *suffix = "") {
261764ab3302SCarolineConcatto     if (x) {
261864ab3302SCarolineConcatto       Word(prefix), Walk(*x), Word(suffix);
261964ab3302SCarolineConcatto     }
262064ab3302SCarolineConcatto   }
262164ab3302SCarolineConcatto   template <typename A>
Walk(const std::optional<A> & x,const char * suffix="")262264ab3302SCarolineConcatto   void Walk(const std::optional<A> &x, const char *suffix = "") {
262364ab3302SCarolineConcatto     return Walk("", x, suffix);
262464ab3302SCarolineConcatto   }
262564ab3302SCarolineConcatto 
262664ab3302SCarolineConcatto   // Traverse a std::list<>.  Separate the elements with an optional string.
262764ab3302SCarolineConcatto   // Emit a prefix and/or a suffix string only when the list is not empty.
262864ab3302SCarolineConcatto   template <typename A>
Walk(const char * prefix,const std::list<A> & list,const char * comma=", ",const char * suffix="")262964ab3302SCarolineConcatto   void Walk(const char *prefix, const std::list<A> &list,
263064ab3302SCarolineConcatto       const char *comma = ", ", const char *suffix = "") {
263164ab3302SCarolineConcatto     if (!list.empty()) {
263264ab3302SCarolineConcatto       const char *str{prefix};
263364ab3302SCarolineConcatto       for (const auto &x : list) {
263464ab3302SCarolineConcatto         Word(str), Walk(x);
263564ab3302SCarolineConcatto         str = comma;
263664ab3302SCarolineConcatto       }
263764ab3302SCarolineConcatto       Word(suffix);
263864ab3302SCarolineConcatto     }
263964ab3302SCarolineConcatto   }
264064ab3302SCarolineConcatto   template <typename A>
Walk(const std::list<A> & list,const char * comma=", ",const char * suffix="")264164ab3302SCarolineConcatto   void Walk(const std::list<A> &list, const char *comma = ", ",
264264ab3302SCarolineConcatto       const char *suffix = "") {
264364ab3302SCarolineConcatto     return Walk("", list, comma, suffix);
264464ab3302SCarolineConcatto   }
264564ab3302SCarolineConcatto 
264664ab3302SCarolineConcatto   // Traverse a std::tuple<>, with an optional separator.
264764ab3302SCarolineConcatto   template <std::size_t J = 0, typename T>
WalkTupleElements(const T & tuple,const char * separator)264864ab3302SCarolineConcatto   void WalkTupleElements(const T &tuple, const char *separator) {
264964ab3302SCarolineConcatto     if (J > 0 && J < std::tuple_size_v<T>) {
265064ab3302SCarolineConcatto       Word(separator); // this usage dodges "unused parameter" warning
265164ab3302SCarolineConcatto     }
265264ab3302SCarolineConcatto     if constexpr (J < std::tuple_size_v<T>) {
265364ab3302SCarolineConcatto       Walk(std::get<J>(tuple));
265464ab3302SCarolineConcatto       WalkTupleElements<J + 1>(tuple, separator);
265564ab3302SCarolineConcatto     }
265664ab3302SCarolineConcatto   }
265764ab3302SCarolineConcatto   template <typename... A>
Walk(const std::tuple<A...> & tuple,const char * separator="")265864ab3302SCarolineConcatto   void Walk(const std::tuple<A...> &tuple, const char *separator = "") {
265964ab3302SCarolineConcatto     WalkTupleElements(tuple, separator);
266064ab3302SCarolineConcatto   }
266164ab3302SCarolineConcatto 
EndSubprogram(const char * kind,const std::optional<Name> & name)266264ab3302SCarolineConcatto   void EndSubprogram(const char *kind, const std::optional<Name> &name) {
266364ab3302SCarolineConcatto     Outdent(), Word("END "), Word(kind), Walk(" ", name);
266464ab3302SCarolineConcatto     structureComponents_.clear();
266564ab3302SCarolineConcatto   }
266664ab3302SCarolineConcatto 
26678670e499SCaroline Concatto   llvm::raw_ostream &out_;
266864ab3302SCarolineConcatto   int indent_{0};
266964ab3302SCarolineConcatto   const int indentationAmount_{1};
267064ab3302SCarolineConcatto   int column_{1};
267164ab3302SCarolineConcatto   const int maxColumns_{80};
267264ab3302SCarolineConcatto   std::set<CharBlock> structureComponents_;
267364ab3302SCarolineConcatto   Encoding encoding_{Encoding::UTF_8};
267464ab3302SCarolineConcatto   bool capitalizeKeywords_{true};
26750a90ffa7SValentin Clement   bool openaccDirective_{false};
267664ab3302SCarolineConcatto   bool openmpDirective_{false};
267764ab3302SCarolineConcatto   bool backslashEscapes_{false};
267864ab3302SCarolineConcatto   preStatementType *preStatement_{nullptr};
267964ab3302SCarolineConcatto   AnalyzedObjectsAsFortran *asFortran_{nullptr};
268064ab3302SCarolineConcatto };
268164ab3302SCarolineConcatto 
Put(char ch)268264ab3302SCarolineConcatto void UnparseVisitor::Put(char ch) {
268364ab3302SCarolineConcatto   int sav = indent_;
26840a90ffa7SValentin Clement   if (openmpDirective_ || openaccDirective_) {
268564ab3302SCarolineConcatto     indent_ = 0;
268664ab3302SCarolineConcatto   }
268764ab3302SCarolineConcatto   if (column_ <= 1) {
268864ab3302SCarolineConcatto     if (ch == '\n') {
268964ab3302SCarolineConcatto       return;
269064ab3302SCarolineConcatto     }
269164ab3302SCarolineConcatto     for (int j{0}; j < indent_; ++j) {
269264ab3302SCarolineConcatto       out_ << ' ';
269364ab3302SCarolineConcatto     }
269464ab3302SCarolineConcatto     column_ = indent_ + 2;
269564ab3302SCarolineConcatto   } else if (ch == '\n') {
269664ab3302SCarolineConcatto     column_ = 1;
269764ab3302SCarolineConcatto   } else if (++column_ >= maxColumns_) {
269864ab3302SCarolineConcatto     out_ << "&\n";
269964ab3302SCarolineConcatto     for (int j{0}; j < indent_; ++j) {
270064ab3302SCarolineConcatto       out_ << ' ';
270164ab3302SCarolineConcatto     }
270264ab3302SCarolineConcatto     if (openmpDirective_) {
270364ab3302SCarolineConcatto       out_ << "!$OMP&";
270464ab3302SCarolineConcatto       column_ = 8;
27050a90ffa7SValentin Clement     } else if (openaccDirective_) {
27060a90ffa7SValentin Clement       out_ << "!$ACC&";
27070a90ffa7SValentin Clement       column_ = 8;
270864ab3302SCarolineConcatto     } else {
270964ab3302SCarolineConcatto       out_ << '&';
271064ab3302SCarolineConcatto       column_ = indent_ + 3;
271164ab3302SCarolineConcatto     }
271264ab3302SCarolineConcatto   }
271364ab3302SCarolineConcatto   out_ << ch;
27140a90ffa7SValentin Clement   if (openmpDirective_ || openaccDirective_) {
271564ab3302SCarolineConcatto     indent_ = sav;
271664ab3302SCarolineConcatto   }
271764ab3302SCarolineConcatto }
271864ab3302SCarolineConcatto 
Put(const char * str)271964ab3302SCarolineConcatto void UnparseVisitor::Put(const char *str) {
272064ab3302SCarolineConcatto   for (; *str != '\0'; ++str) {
272164ab3302SCarolineConcatto     Put(*str);
272264ab3302SCarolineConcatto   }
272364ab3302SCarolineConcatto }
272464ab3302SCarolineConcatto 
Put(const std::string & str)272564ab3302SCarolineConcatto void UnparseVisitor::Put(const std::string &str) {
272664ab3302SCarolineConcatto   for (char ch : str) {
272764ab3302SCarolineConcatto     Put(ch);
272864ab3302SCarolineConcatto   }
272964ab3302SCarolineConcatto }
273064ab3302SCarolineConcatto 
PutNormalized(const std::string & str)273164ab3302SCarolineConcatto void UnparseVisitor::PutNormalized(const std::string &str) {
273264ab3302SCarolineConcatto   auto decoded{DecodeString<std::string, Encoding::LATIN_1>(str, true)};
273364ab3302SCarolineConcatto   std::string encoded{EncodeString<Encoding::LATIN_1>(decoded)};
273464ab3302SCarolineConcatto   Put(QuoteCharacterLiteral(encoded, backslashEscapes_));
273564ab3302SCarolineConcatto }
273664ab3302SCarolineConcatto 
PutKeywordLetter(char ch)273764ab3302SCarolineConcatto void UnparseVisitor::PutKeywordLetter(char ch) {
273864ab3302SCarolineConcatto   if (capitalizeKeywords_) {
273964ab3302SCarolineConcatto     Put(ToUpperCaseLetter(ch));
274064ab3302SCarolineConcatto   } else {
274164ab3302SCarolineConcatto     Put(ToLowerCaseLetter(ch));
274264ab3302SCarolineConcatto   }
274364ab3302SCarolineConcatto }
274464ab3302SCarolineConcatto 
Word(const char * str)274564ab3302SCarolineConcatto void UnparseVisitor::Word(const char *str) {
274664ab3302SCarolineConcatto   for (; *str != '\0'; ++str) {
274764ab3302SCarolineConcatto     PutKeywordLetter(*str);
274864ab3302SCarolineConcatto   }
274964ab3302SCarolineConcatto }
275064ab3302SCarolineConcatto 
Word(const std::string & str)275164ab3302SCarolineConcatto void UnparseVisitor::Word(const std::string &str) { Word(str.c_str()); }
275264ab3302SCarolineConcatto 
27539e7eef99SPeter Klausler template <typename A>
Unparse(llvm::raw_ostream & out,const A & root,Encoding encoding,bool capitalizeKeywords,bool backslashEscapes,preStatementType * preStatement,AnalyzedObjectsAsFortran * asFortran)27549e7eef99SPeter Klausler void Unparse(llvm::raw_ostream &out, const A &root, Encoding encoding,
275564ab3302SCarolineConcatto     bool capitalizeKeywords, bool backslashEscapes,
275664ab3302SCarolineConcatto     preStatementType *preStatement, AnalyzedObjectsAsFortran *asFortran) {
275764ab3302SCarolineConcatto   UnparseVisitor visitor{out, 1, encoding, capitalizeKeywords, backslashEscapes,
275864ab3302SCarolineConcatto       preStatement, asFortran};
27599e7eef99SPeter Klausler   Walk(root, visitor);
276064ab3302SCarolineConcatto   visitor.Done();
276164ab3302SCarolineConcatto }
27629e7eef99SPeter Klausler 
27639e7eef99SPeter Klausler template void Unparse<Program>(llvm::raw_ostream &, const Program &, Encoding,
27649e7eef99SPeter Klausler     bool, bool, preStatementType *, AnalyzedObjectsAsFortran *);
27659e7eef99SPeter Klausler template void Unparse<Expr>(llvm::raw_ostream &, const Expr &, Encoding, bool,
27669e7eef99SPeter Klausler     bool, preStatementType *, AnalyzedObjectsAsFortran *);
27671f879005STim Keith } // namespace Fortran::parser
2768