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)1172