xref: /llvm-project/flang/include/flang/Parser/dump-parse-tree.h (revision 15ab7be2e049bc0f4ea6744ca037395686a923bc)
1 //===-- include/flang/Parser/dump-parse-tree.h ------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef FORTRAN_PARSER_DUMP_PARSE_TREE_H_
10 #define FORTRAN_PARSER_DUMP_PARSE_TREE_H_
11 
12 #include "format-specification.h"
13 #include "parse-tree-visitor.h"
14 #include "parse-tree.h"
15 #include "tools.h"
16 #include "unparse.h"
17 #include "flang/Common/Fortran.h"
18 #include "flang/Common/idioms.h"
19 #include "flang/Common/indirection.h"
20 #include "llvm/Support/raw_ostream.h"
21 #include <string>
22 #include <type_traits>
23 
24 namespace Fortran::parser {
25 
26 //
27 // Dump the Parse Tree hierarchy of any node 'x' of the parse tree.
28 //
29 
30 class ParseTreeDumper {
31 public:
32   explicit ParseTreeDumper(llvm::raw_ostream &out,
33       const AnalyzedObjectsAsFortran *asFortran = nullptr)
34       : out_(out), asFortran_{asFortran} {}
35 
36   static constexpr const char *GetNodeName(const char *) { return "char *"; }
37 #define NODE_NAME(T, N) \
38   static constexpr const char *GetNodeName(const T &) { return N; }
39 #define NODE_ENUM(T, E) \
40   static std::string GetNodeName(const T::E &x) { \
41     return #E " = "s + std::string{T::EnumToString(x)}; \
42   }
43 #define NODE(T1, T2) NODE_NAME(T1::T2, #T2)
44   NODE_NAME(bool, "bool")
45   NODE_NAME(int, "int")
46   NODE(std, string)
47   NODE(std, int64_t)
48   NODE(std, uint64_t)
49   NODE_ENUM(common, CUDADataAttr)
50   NODE_ENUM(common, CUDASubprogramAttrs)
51   NODE_ENUM(common, OpenACCDeviceType)
52   NODE(format, ControlEditDesc)
53   NODE(format::ControlEditDesc, Kind)
54   NODE(format, DerivedTypeDataEditDesc)
55   NODE(format, FormatItem)
56   NODE(format, FormatSpecification)
57   NODE(format, IntrinsicTypeDataEditDesc)
58   NODE(format::IntrinsicTypeDataEditDesc, Kind)
59   NODE(parser, Abstract)
60   NODE(parser, AccAtomicCapture)
61   NODE(AccAtomicCapture, Stmt1)
62   NODE(AccAtomicCapture, Stmt2)
63   NODE(parser, AccAtomicRead)
64   NODE(parser, AccAtomicUpdate)
65   NODE(parser, AccAtomicWrite)
66   NODE(parser, AccBeginBlockDirective)
67   NODE(parser, AccBeginCombinedDirective)
68   NODE(parser, AccBeginLoopDirective)
69   NODE(parser, AccBlockDirective)
70   NODE(parser, AccClause)
71 #define GEN_FLANG_DUMP_PARSE_TREE_CLAUSES
72 #include "llvm/Frontend/OpenACC/ACC.inc"
73   NODE(parser, AccBindClause)
74   NODE(parser, AccDefaultClause)
75   static std::string GetNodeName(const llvm::acc::DefaultValue &x) {
76     return llvm::Twine(
77         "llvm::acc::DefaultValue = ", llvm::acc::getOpenACCDefaultValueName(x))
78         .str();
79   }
80   NODE(parser, AccClauseList)
81   NODE(parser, AccCombinedDirective)
82   NODE(parser, AccDataModifier)
83   NODE_ENUM(parser::AccDataModifier, Modifier)
84   NODE(parser, AccDeclarativeDirective)
85   NODE(parser, AccEndAtomic)
86   NODE(parser, AccEndBlockDirective)
87   NODE(parser, AccEndCombinedDirective)
88   NODE(parser, AccCollapseArg)
89   NODE(parser, AccGangArg)
90   NODE(AccGangArg, Num)
91   NODE(AccGangArg, Dim)
92   NODE(AccGangArg, Static)
93   NODE(parser, AccGangArgList)
94   NODE(parser, AccObject)
95   NODE(parser, AccObjectList)
96   NODE(parser, AccObjectListWithModifier)
97   NODE(parser, AccObjectListWithReduction)
98   NODE(parser, AccSizeExpr)
99   NODE(parser, AccSizeExprList)
100   NODE(parser, AccSelfClause)
101   NODE(parser, AccStandaloneDirective)
102   NODE(parser, AccDeviceTypeExpr)
103 
104   NODE(parser, AccDeviceTypeExprList)
105   NODE(parser, AccTileExpr)
106   NODE(parser, AccTileExprList)
107   NODE(parser, AccLoopDirective)
108   NODE(parser, AccEndLoop)
109   NODE(parser, AccWaitArgument)
110   static std::string GetNodeName(const llvm::acc::Directive &x) {
111     return llvm::Twine(
112         "llvm::acc::Directive = ", llvm::acc::getOpenACCDirectiveName(x))
113         .str();
114   }
115   NODE(parser, AcImpliedDo)
116   NODE(parser, AcImpliedDoControl)
117   NODE(parser, AcValue)
118   NODE(parser, AccessStmt)
119   NODE(parser, AccessId)
120   NODE(parser, AccessSpec)
121   NODE_ENUM(AccessSpec, Kind)
122   NODE(parser, AcSpec)
123   NODE(parser, ActionStmt)
124   NODE(parser, ActualArg)
125   NODE(ActualArg, PercentRef)
126   NODE(ActualArg, PercentVal)
127   NODE(parser, ActualArgSpec)
128   NODE(AcValue, Triplet)
129   NODE(parser, AllocOpt)
130   NODE(AllocOpt, Mold)
131   NODE(AllocOpt, Source)
132   NODE(AllocOpt, Stream)
133   NODE(AllocOpt, Pinned)
134   NODE(parser, Allocatable)
135   NODE(parser, AllocatableStmt)
136   NODE(parser, AllocateCoarraySpec)
137   NODE(parser, AllocateObject)
138   NODE(parser, AllocateShapeSpec)
139   NODE(parser, AllocateStmt)
140   NODE(parser, Allocation)
141   NODE(parser, AltReturnSpec)
142   NODE(parser, ArithmeticIfStmt)
143   NODE(parser, ArrayConstructor)
144   NODE(parser, ArrayElement)
145   NODE(parser, ArraySpec)
146   NODE(parser, AssignStmt)
147   NODE(parser, AssignedGotoStmt)
148   NODE(parser, AssignmentStmt)
149   NODE(parser, AssociateConstruct)
150   NODE(parser, AssociateStmt)
151   NODE(parser, Association)
152   NODE(parser, AssumedImpliedSpec)
153   NODE(parser, AssumedRankSpec)
154   NODE(parser, AssumedShapeSpec)
155   NODE(parser, AssumedSizeSpec)
156   NODE(parser, Asynchronous)
157   NODE(parser, AsynchronousStmt)
158   NODE(parser, AttrSpec)
159   NODE(parser, BOZLiteralConstant)
160   NODE(parser, BackspaceStmt)
161   NODE(parser, BasedPointer)
162   NODE(parser, BasedPointerStmt)
163   NODE(parser, BindAttr)
164   NODE(BindAttr, Deferred)
165   NODE(BindAttr, Non_Overridable)
166   NODE(parser, BindEntity)
167   NODE_ENUM(BindEntity, Kind)
168   NODE(parser, BindStmt)
169   NODE(parser, Block)
170   NODE(parser, BlockConstruct)
171   NODE(parser, BlockData)
172   NODE(parser, BlockDataStmt)
173   NODE(parser, BlockSpecificationPart)
174   NODE(parser, BlockStmt)
175   NODE(parser, BoundsRemapping)
176   NODE(parser, BoundsSpec)
177   NODE(parser, Call)
178   NODE(parser, CallStmt)
179   NODE(CallStmt, Chevrons)
180   NODE(CallStmt, StarOrExpr)
181   NODE(parser, CaseConstruct)
182   NODE(CaseConstruct, Case)
183   NODE(parser, CaseSelector)
184   NODE(parser, CaseStmt)
185   NODE(parser, CaseValueRange)
186   NODE(CaseValueRange, Range)
187   NODE(parser, ChangeTeamConstruct)
188   NODE(parser, ChangeTeamStmt)
189   NODE(parser, CharLength)
190   NODE(parser, CharLiteralConstant)
191   NODE(parser, CharLiteralConstantSubstring)
192   NODE(parser, CharSelector)
193   NODE(CharSelector, LengthAndKind)
194   NODE(parser, CloseStmt)
195   NODE(CloseStmt, CloseSpec)
196   NODE(parser, CoarrayAssociation)
197   NODE(parser, CoarraySpec)
198   NODE(parser, CodimensionDecl)
199   NODE(parser, CodimensionStmt)
200   NODE(parser, CoindexedNamedObject)
201   NODE(parser, CommonBlockObject)
202   NODE(parser, CommonStmt)
203   NODE(CommonStmt, Block)
204   NODE(parser, CompilerDirective)
205   NODE(CompilerDirective, AssumeAligned)
206   NODE(CompilerDirective, IgnoreTKR)
207   NODE(CompilerDirective, LoopCount)
208   NODE(CompilerDirective, NameValue)
209   NODE(CompilerDirective, Unrecognized)
210   NODE(CompilerDirective, VectorAlways)
211   NODE(CompilerDirective, Unroll)
212   NODE(parser, ComplexLiteralConstant)
213   NODE(parser, ComplexPart)
214   NODE(parser, ComponentArraySpec)
215   NODE(parser, ComponentAttrSpec)
216   NODE(parser, ComponentDataSource)
217   NODE(parser, ComponentDecl)
218   NODE(parser, FillDecl)
219   NODE(parser, ComponentOrFill)
220   NODE(parser, ComponentDefStmt)
221   NODE(parser, ComponentSpec)
222   NODE(parser, ComputedGotoStmt)
223   NODE(parser, ConcurrentControl)
224   NODE(parser, ConcurrentHeader)
225   NODE(parser, ConnectSpec)
226   NODE(ConnectSpec, CharExpr)
227   NODE_ENUM(ConnectSpec::CharExpr, Kind)
228   NODE(ConnectSpec, Newunit)
229   NODE(ConnectSpec, Recl)
230   NODE(parser, ContainsStmt)
231   NODE(parser, Contiguous)
232   NODE(parser, ContiguousStmt)
233   NODE(parser, ContinueStmt)
234   NODE(parser, CriticalConstruct)
235   NODE(parser, CriticalStmt)
236   NODE(parser, CUDAAttributesStmt)
237   NODE(parser, CUFKernelDoConstruct)
238   NODE(CUFKernelDoConstruct, StarOrExpr)
239   NODE(CUFKernelDoConstruct, Directive)
240   NODE(CUFKernelDoConstruct, LaunchConfiguration)
241   NODE(parser, CUFReduction)
242   NODE(parser, CycleStmt)
243   NODE(parser, DataComponentDefStmt)
244   NODE(parser, DataIDoObject)
245   NODE(parser, DataImpliedDo)
246   NODE(parser, DataRef)
247   NODE(parser, DataStmt)
248   NODE(parser, DataStmtConstant)
249   NODE(parser, DataStmtObject)
250   NODE(parser, DataStmtRepeat)
251   NODE(parser, DataStmtSet)
252   NODE(parser, DataStmtValue)
253   NODE(parser, DeallocateStmt)
254   NODE(parser, DeclarationConstruct)
255   NODE(parser, DeclarationTypeSpec)
256   NODE(DeclarationTypeSpec, Class)
257   NODE(DeclarationTypeSpec, ClassStar)
258   NODE(DeclarationTypeSpec, Record)
259   NODE(DeclarationTypeSpec, Type)
260   NODE(DeclarationTypeSpec, TypeStar)
261   NODE(parser, Default)
262   NODE(parser, DeferredCoshapeSpecList)
263   NODE(parser, DeferredShapeSpecList)
264   NODE(parser, DefinedOpName)
265   NODE(parser, DefinedOperator)
266   NODE_ENUM(DefinedOperator, IntrinsicOperator)
267   NODE(parser, DerivedTypeDef)
268   NODE(parser, DerivedTypeSpec)
269   NODE(parser, DerivedTypeStmt)
270   NODE(parser, Designator)
271   NODE(parser, DimensionStmt)
272   NODE(DimensionStmt, Declaration)
273   NODE(parser, DoConstruct)
274   NODE(parser, DummyArg)
275   NODE(parser, ElseIfStmt)
276   NODE(parser, ElseStmt)
277   NODE(parser, ElsewhereStmt)
278   NODE(parser, EndAssociateStmt)
279   NODE(parser, EndBlockDataStmt)
280   NODE(parser, EndBlockStmt)
281   NODE(parser, EndChangeTeamStmt)
282   NODE(parser, EndCriticalStmt)
283   NODE(parser, EndDoStmt)
284   NODE(parser, EndEnumStmt)
285   NODE(parser, EndForallStmt)
286   NODE(parser, EndFunctionStmt)
287   NODE(parser, EndIfStmt)
288   NODE(parser, EndInterfaceStmt)
289   NODE(parser, EndLabel)
290   NODE(parser, EndModuleStmt)
291   NODE(parser, EndMpSubprogramStmt)
292   NODE(parser, EndProgramStmt)
293   NODE(parser, EndSelectStmt)
294   NODE(parser, EndSubmoduleStmt)
295   NODE(parser, EndSubroutineStmt)
296   NODE(parser, EndTypeStmt)
297   NODE(parser, EndWhereStmt)
298   NODE(parser, EndfileStmt)
299   NODE(parser, EntityDecl)
300   NODE(parser, EntryStmt)
301   NODE(parser, EnumDef)
302   NODE(parser, EnumDefStmt)
303   NODE(parser, Enumerator)
304   NODE(parser, EnumeratorDefStmt)
305   NODE(parser, EorLabel)
306   NODE(parser, EquivalenceObject)
307   NODE(parser, EquivalenceStmt)
308   NODE(parser, ErrLabel)
309   NODE(parser, ErrorRecovery)
310   NODE(parser, EventPostStmt)
311   NODE(parser, EventWaitSpec)
312   NODE(parser, EventWaitStmt)
313   NODE(parser, ExecutableConstruct)
314   NODE(parser, ExecutionPart)
315   NODE(parser, ExecutionPartConstruct)
316   NODE(parser, ExitStmt)
317   NODE(parser, ExplicitCoshapeSpec)
318   NODE(parser, ExplicitShapeSpec)
319   NODE(parser, Expr)
320   NODE(Expr, Parentheses)
321   NODE(Expr, UnaryPlus)
322   NODE(Expr, Negate)
323   NODE(Expr, NOT)
324   NODE(Expr, PercentLoc)
325   NODE(Expr, DefinedUnary)
326   NODE(Expr, Power)
327   NODE(Expr, Multiply)
328   NODE(Expr, Divide)
329   NODE(Expr, Add)
330   NODE(Expr, Subtract)
331   NODE(Expr, Concat)
332   NODE(Expr, LT)
333   NODE(Expr, LE)
334   NODE(Expr, EQ)
335   NODE(Expr, NE)
336   NODE(Expr, GE)
337   NODE(Expr, GT)
338   NODE(Expr, AND)
339   NODE(Expr, OR)
340   NODE(Expr, EQV)
341   NODE(Expr, NEQV)
342   NODE(Expr, DefinedBinary)
343   NODE(Expr, ComplexConstructor)
344   NODE(parser, External)
345   NODE(parser, ExternalStmt)
346   NODE(parser, FailImageStmt)
347   NODE(parser, FileUnitNumber)
348   NODE(parser, FinalProcedureStmt)
349   NODE(parser, FlushStmt)
350   NODE(parser, ForallAssignmentStmt)
351   NODE(parser, ForallBodyConstruct)
352   NODE(parser, ForallConstruct)
353   NODE(parser, ForallConstructStmt)
354   NODE(parser, ForallStmt)
355   NODE(parser, FormTeamStmt)
356   NODE(FormTeamStmt, FormTeamSpec)
357   NODE(parser, Format)
358   NODE(parser, FormatStmt)
359   NODE(parser, FunctionReference)
360   NODE(parser, FunctionStmt)
361   NODE(parser, FunctionSubprogram)
362   NODE(parser, GenericSpec)
363   NODE(GenericSpec, Assignment)
364   NODE(GenericSpec, ReadFormatted)
365   NODE(GenericSpec, ReadUnformatted)
366   NODE(GenericSpec, WriteFormatted)
367   NODE(GenericSpec, WriteUnformatted)
368   NODE(parser, GenericStmt)
369   NODE(parser, GotoStmt)
370   NODE(parser, HollerithLiteralConstant)
371   NODE(parser, IdExpr)
372   NODE(parser, IdVariable)
373   NODE(parser, IfConstruct)
374   NODE(IfConstruct, ElseBlock)
375   NODE(IfConstruct, ElseIfBlock)
376   NODE(parser, IfStmt)
377   NODE(parser, IfThenStmt)
378   NODE(parser, TeamValue)
379   NODE(parser, ImageSelector)
380   NODE(parser, ImageSelectorSpec)
381   NODE(ImageSelectorSpec, Stat)
382   NODE(ImageSelectorSpec, Team_Number)
383   NODE(parser, ImplicitPart)
384   NODE(parser, ImplicitPartStmt)
385   NODE(parser, ImplicitSpec)
386   NODE(parser, ImplicitStmt)
387   NODE_ENUM(ImplicitStmt, ImplicitNoneNameSpec)
388   NODE(parser, ImpliedShapeSpec)
389   NODE(parser, ImportStmt)
390   NODE(parser, Initialization)
391   NODE(parser, InputImpliedDo)
392   NODE(parser, InputItem)
393   NODE(parser, InquireSpec)
394   NODE(InquireSpec, CharVar)
395   NODE_ENUM(InquireSpec::CharVar, Kind)
396   NODE(InquireSpec, IntVar)
397   NODE_ENUM(InquireSpec::IntVar, Kind)
398   NODE(InquireSpec, LogVar)
399   NODE_ENUM(InquireSpec::LogVar, Kind)
400   NODE(parser, InquireStmt)
401   NODE(InquireStmt, Iolength)
402   NODE(parser, IntegerTypeSpec)
403   NODE(parser, IntentSpec)
404   NODE_ENUM(IntentSpec, Intent)
405   NODE(parser, IntentStmt)
406   NODE(parser, InterfaceBlock)
407   NODE(parser, InterfaceBody)
408   NODE(InterfaceBody, Function)
409   NODE(InterfaceBody, Subroutine)
410   NODE(parser, InterfaceSpecification)
411   NODE(parser, InterfaceStmt)
412   NODE(parser, InternalSubprogram)
413   NODE(parser, InternalSubprogramPart)
414   NODE(parser, Intrinsic)
415   NODE(parser, IntrinsicStmt)
416   NODE(parser, IntrinsicTypeSpec)
417   NODE(IntrinsicTypeSpec, Character)
418   NODE(IntrinsicTypeSpec, Complex)
419   NODE(IntrinsicTypeSpec, DoubleComplex)
420   NODE(IntrinsicTypeSpec, DoublePrecision)
421   NODE(IntrinsicTypeSpec, Logical)
422   NODE(IntrinsicTypeSpec, Real)
423   NODE(parser, IoControlSpec)
424   NODE(IoControlSpec, Asynchronous)
425   NODE(IoControlSpec, CharExpr)
426   NODE_ENUM(IoControlSpec::CharExpr, Kind)
427   NODE(IoControlSpec, Pos)
428   NODE(IoControlSpec, Rec)
429   NODE(IoControlSpec, Size)
430   NODE(parser, IoUnit)
431   NODE(parser, Keyword)
432   NODE(parser, KindParam)
433   NODE(parser, KindSelector)
434   NODE(KindSelector, StarSize)
435   NODE(parser, LabelDoStmt)
436   NODE(parser, LanguageBindingSpec)
437   NODE(parser, LengthSelector)
438   NODE(parser, LetterSpec)
439   NODE(parser, LiteralConstant)
440   NODE(parser, IntLiteralConstant)
441   NODE(parser, ReductionOperator)
442   NODE_ENUM(parser::ReductionOperator, Operator)
443   NODE(parser, LocalitySpec)
444   NODE(LocalitySpec, DefaultNone)
445   NODE(LocalitySpec, Local)
446   NODE(LocalitySpec, LocalInit)
447   NODE(LocalitySpec, Reduce)
448   NODE(LocalitySpec, Shared)
449   NODE(parser, LockStmt)
450   NODE(LockStmt, LockStat)
451   NODE(parser, LogicalLiteralConstant)
452   NODE_NAME(LoopControl::Bounds, "LoopBounds")
453   NODE_NAME(AcImpliedDoControl::Bounds, "LoopBounds")
454   NODE_NAME(DataImpliedDo::Bounds, "LoopBounds")
455   NODE(parser, LoopControl)
456   NODE(LoopControl, Concurrent)
457   NODE(parser, MainProgram)
458   NODE(parser, Map)
459   NODE(Map, EndMapStmt)
460   NODE(Map, MapStmt)
461   NODE(parser, MaskedElsewhereStmt)
462   NODE(parser, Module)
463   NODE(parser, ModuleStmt)
464   NODE(parser, ModuleSubprogram)
465   NODE(parser, ModuleSubprogramPart)
466   NODE(parser, MpSubprogramStmt)
467   NODE(parser, MsgVariable)
468   NODE(parser, Name)
469   NODE(parser, NamedConstant)
470   NODE(parser, NamedConstantDef)
471   NODE(parser, NamelistStmt)
472   NODE(NamelistStmt, Group)
473   NODE(parser, NonLabelDoStmt)
474   NODE(parser, NoPass)
475   NODE(parser, NotifyWaitStmt)
476   NODE(parser, NullifyStmt)
477   NODE(parser, NullInit)
478   NODE(parser, ObjectDecl)
479   NODE(parser, OldParameterStmt)
480   NODE(parser, OmpMetadirectiveDirective)
481   NODE(parser, OmpMatchClause)
482   NODE(parser, OmpOtherwiseClause)
483   NODE(parser, OmpWhenClause)
484   NODE(OmpWhenClause, Modifier)
485   NODE(parser, OmpDirectiveSpecification)
486   NODE(parser, OmpTraitPropertyName)
487   NODE(parser, OmpTraitScore)
488   NODE(parser, OmpTraitPropertyExtension)
489   NODE(OmpTraitPropertyExtension, Complex)
490   NODE(parser, OmpTraitProperty)
491   NODE(parser, OmpTraitSelectorName)
492   NODE_ENUM(OmpTraitSelectorName, Value)
493   NODE(parser, OmpTraitSelector)
494   NODE(OmpTraitSelector, Properties)
495   NODE(parser, OmpTraitSetSelectorName)
496   NODE_ENUM(OmpTraitSetSelectorName, Value)
497   NODE(parser, OmpTraitSetSelector)
498   NODE(parser, OmpContextSelectorSpecification)
499   NODE(parser, OmpMapper)
500   NODE(parser, OmpMapType)
501   NODE_ENUM(OmpMapType, Value)
502   NODE(parser, OmpMapTypeModifier)
503   NODE_ENUM(OmpMapTypeModifier, Value)
504   NODE(parser, OmpIteratorSpecifier)
505   NODE(parser, OmpIterator)
506   NODE(parser, OmpAffinityClause)
507   NODE(OmpAffinityClause, Modifier)
508   NODE(parser, OmpAlignment)
509   NODE(parser, OmpAlignClause)
510   NODE(parser, OmpAlignedClause)
511   NODE(OmpAlignedClause, Modifier)
512   NODE(parser, OmpAtClause)
513   NODE_ENUM(OmpAtClause, ActionTime)
514   NODE_ENUM(OmpSeverityClause, Severity)
515   NODE(parser, OmpAtomic)
516   NODE(parser, OmpAtomicCapture)
517   NODE(OmpAtomicCapture, Stmt1)
518   NODE(OmpAtomicCapture, Stmt2)
519   NODE(parser, OmpAtomicCompare)
520   NODE(parser, OmpAtomicCompareIfStmt)
521   NODE(parser, OmpAtomicRead)
522   NODE(parser, OmpAtomicUpdate)
523   NODE(parser, OmpAtomicWrite)
524   NODE(parser, OmpBeginBlockDirective)
525   NODE(parser, OmpBeginLoopDirective)
526   NODE(parser, OmpBeginSectionsDirective)
527   NODE(parser, OmpBlockDirective)
528   static std::string GetNodeName(const llvm::omp::Directive &x) {
529     return llvm::Twine(
530         "llvm::omp::Directive = ", llvm::omp::getOpenMPDirectiveName(x))
531         .str();
532   }
533   NODE(parser, OmpCancelType)
534   NODE_ENUM(OmpCancelType, Type)
535   NODE(parser, OmpClause)
536 #define GEN_FLANG_DUMP_PARSE_TREE_CLAUSES
537 #include "llvm/Frontend/OpenMP/OMP.inc"
538   NODE(parser, OmpClauseList)
539   NODE(parser, OmpCriticalDirective)
540   NODE(parser, OmpErrorDirective)
541   NODE(parser, OmpNothingDirective)
542   NODE(parser, OmpDeclareTargetSpecifier)
543   NODE(parser, OmpDeclareTargetWithClause)
544   NODE(parser, OmpDeclareTargetWithList)
545   NODE(parser, OmpDeclareMapperSpecifier)
546   NODE(parser, OmpDefaultClause)
547   NODE_ENUM(OmpDefaultClause, DataSharingAttribute)
548   NODE(parser, OmpVariableCategory)
549   NODE_ENUM(OmpVariableCategory, Value)
550   NODE(parser, OmpDefaultmapClause)
551   NODE_ENUM(OmpDefaultmapClause, ImplicitBehavior)
552   NODE(OmpDefaultmapClause, Modifier)
553   NODE(parser, OmpDependenceType)
554   NODE_ENUM(OmpDependenceType, Value)
555   NODE(parser, OmpTaskDependenceType)
556   NODE_ENUM(OmpTaskDependenceType, Value)
557   NODE(parser, OmpIterationOffset)
558   NODE(parser, OmpIteration)
559   NODE(parser, OmpIterationVector)
560   NODE(parser, OmpDoacross)
561   NODE(OmpDoacross, Sink)
562   NODE(OmpDoacross, Source)
563   NODE(parser, OmpDependClause)
564   NODE(OmpDependClause, TaskDep)
565   NODE(OmpDependClause::TaskDep, Modifier)
566   NODE(parser, OmpDetachClause)
567   NODE(parser, OmpDoacrossClause)
568   NODE(parser, OmpDestroyClause)
569   NODE(parser, OmpEndAllocators)
570   NODE(parser, OmpEndAtomic)
571   NODE(parser, OmpEndBlockDirective)
572   NODE(parser, OmpEndCriticalDirective)
573   NODE(parser, OmpEndLoopDirective)
574   NODE(parser, OmpEndSectionsDirective)
575   NODE(parser, OmpFailClause)
576   NODE(parser, OmpFromClause)
577   NODE(OmpFromClause, Modifier)
578   NODE(parser, OmpExpectation)
579   NODE_ENUM(OmpExpectation, Value)
580   NODE(parser, OmpDirectiveNameModifier)
581   NODE(parser, OmpIfClause)
582   NODE(OmpIfClause, Modifier)
583   NODE(parser, OmpLastprivateClause)
584   NODE(OmpLastprivateClause, Modifier)
585   NODE(parser, OmpLastprivateModifier)
586   NODE_ENUM(OmpLastprivateModifier, Value)
587   NODE(parser, OmpLinearClause)
588   NODE(OmpLinearClause, Modifier)
589   NODE(parser, OmpLinearModifier)
590   NODE_ENUM(OmpLinearModifier, Value)
591   NODE(parser, OmpStepComplexModifier)
592   NODE(parser, OmpStepSimpleModifier)
593   NODE(parser, OmpLoopDirective)
594   NODE(parser, OmpMapClause)
595   NODE(parser, OmpMessageClause)
596   NODE(OmpMapClause, Modifier)
597   static std::string GetNodeName(const llvm::omp::Clause &x) {
598     return llvm::Twine(
599         "llvm::omp::Clause = ", llvm::omp::getOpenMPClauseName(x))
600         .str();
601   }
602   NODE(parser, OmpObject)
603   NODE(parser, OmpObjectList)
604   NODE(parser, OmpOrderClause)
605   NODE(OmpOrderClause, Modifier)
606   NODE_ENUM(OmpOrderClause, Ordering)
607   NODE(parser, OmpOrderModifier)
608   NODE_ENUM(OmpOrderModifier, Value)
609   NODE(parser, OmpGrainsizeClause)
610   NODE(OmpGrainsizeClause, Modifier)
611   NODE(parser, OmpPrescriptiveness)
612   NODE_ENUM(OmpPrescriptiveness, Value)
613   NODE(parser, OmpNumTasksClause)
614   NODE(OmpNumTasksClause, Modifier)
615   NODE(parser, OmpBindClause)
616   NODE_ENUM(OmpBindClause, Binding)
617   NODE(parser, OmpProcBindClause)
618   NODE_ENUM(OmpProcBindClause, AffinityPolicy)
619   NODE(parser, OmpReductionModifier)
620   NODE_ENUM(OmpReductionModifier, Value)
621   NODE(parser, OmpReductionClause)
622   NODE(OmpReductionClause, Modifier)
623   NODE(parser, OmpInReductionClause)
624   NODE(OmpInReductionClause, Modifier)
625   NODE(parser, OmpReductionCombiner)
626   NODE(parser, OmpTaskReductionClause)
627   NODE(OmpTaskReductionClause, Modifier)
628   NODE(OmpReductionCombiner, FunctionCombiner)
629   NODE(parser, OmpReductionInitializerClause)
630   NODE(parser, OmpReductionIdentifier)
631   NODE(parser, OmpAllocateClause)
632   NODE(OmpAllocateClause, Modifier)
633   NODE(parser, OmpAlignModifier)
634   NODE(parser, OmpAllocatorComplexModifier)
635   NODE(parser, OmpAllocatorSimpleModifier)
636   NODE(parser, OmpScheduleClause)
637   NODE(OmpScheduleClause, Modifier)
638   NODE_ENUM(OmpScheduleClause, Kind)
639   NODE(parser, OmpSeverityClause)
640   NODE(parser, OmpDeviceClause)
641   NODE(OmpDeviceClause, Modifier)
642   NODE(parser, OmpDeviceModifier)
643   NODE_ENUM(OmpDeviceModifier, Value)
644   NODE(parser, OmpDeviceTypeClause)
645   NODE_ENUM(OmpDeviceTypeClause, DeviceTypeDescription)
646   NODE(parser, OmpUpdateClause)
647   NODE(parser, OmpChunkModifier)
648   NODE_ENUM(OmpChunkModifier, Value)
649   NODE(parser, OmpOrderingModifier)
650   NODE_ENUM(OmpOrderingModifier, Value)
651   NODE(parser, OmpSectionBlocks)
652   NODE(parser, OmpSectionsDirective)
653   NODE(parser, OmpSimpleStandaloneDirective)
654   NODE(parser, OmpToClause)
655   NODE(OmpToClause, Modifier)
656   NODE(parser, Only)
657   NODE(parser, OpenACCAtomicConstruct)
658   NODE(parser, OpenACCBlockConstruct)
659   NODE(parser, OpenACCCacheConstruct)
660   NODE(parser, OpenACCCombinedConstruct)
661   NODE(parser, OpenACCConstruct)
662   NODE(parser, OpenACCDeclarativeConstruct)
663   NODE(parser, OpenACCEndConstruct)
664   NODE(parser, OpenACCLoopConstruct)
665   NODE(parser, OpenACCRoutineConstruct)
666   NODE(parser, OpenACCStandaloneDeclarativeConstruct)
667   NODE(parser, OpenACCStandaloneConstruct)
668   NODE(parser, OpenACCWaitConstruct)
669   NODE(parser, OpenMPAtomicConstruct)
670   NODE(parser, OpenMPBlockConstruct)
671   NODE(parser, OpenMPCancelConstruct)
672   NODE(OpenMPCancelConstruct, If)
673   NODE(parser, OpenMPCancellationPointConstruct)
674   NODE(parser, OpenMPConstruct)
675   NODE(parser, OpenMPCriticalConstruct)
676   NODE(parser, OpenMPDeclarativeAllocate)
677   NODE(parser, OpenMPDeclarativeConstruct)
678   NODE(parser, OpenMPDeclareReductionConstruct)
679   NODE(parser, OpenMPDeclareSimdConstruct)
680   NODE(parser, OpenMPDeclareTargetConstruct)
681   NODE(parser, OpenMPDeclareMapperConstruct)
682   NODE(parser, OmpMemoryOrderClause)
683   NODE(parser, OmpAtomicClause)
684   NODE(parser, OmpAtomicClauseList)
685   NODE(parser, OmpAtomicDefaultMemOrderClause)
686   NODE_ENUM(common, OmpAtomicDefaultMemOrderType)
687   NODE(parser, OpenMPDepobjConstruct)
688   NODE(parser, OpenMPUtilityConstruct)
689   NODE(parser, OpenMPDispatchConstruct)
690   NODE(parser, OmpDispatchDirective)
691   NODE(parser, OmpEndDispatchDirective)
692   NODE(parser, OpenMPFlushConstruct)
693   NODE(parser, OpenMPLoopConstruct)
694   NODE(parser, OpenMPExecutableAllocate)
695   NODE(parser, OpenMPAllocatorsConstruct)
696   NODE(parser, OpenMPRequiresConstruct)
697   NODE(parser, OpenMPSimpleStandaloneConstruct)
698   NODE(parser, OpenMPStandaloneConstruct)
699   NODE(parser, OpenMPSectionConstruct)
700   NODE(parser, OpenMPSectionsConstruct)
701   NODE(parser, OpenMPThreadprivate)
702   NODE(parser, OpenStmt)
703   NODE(parser, Optional)
704   NODE(parser, OptionalStmt)
705   NODE(parser, OtherSpecificationStmt)
706   NODE(parser, OutputImpliedDo)
707   NODE(parser, OutputItem)
708   NODE(parser, Parameter)
709   NODE(parser, ParameterStmt)
710   NODE(parser, ParentIdentifier)
711   NODE(parser, Pass)
712   NODE(parser, PauseStmt)
713   NODE(parser, Pointer)
714   NODE(parser, PointerAssignmentStmt)
715   NODE(PointerAssignmentStmt, Bounds)
716   NODE(parser, PointerDecl)
717   NODE(parser, PointerObject)
718   NODE(parser, PointerStmt)
719   NODE(parser, PositionOrFlushSpec)
720   NODE(parser, PrefixSpec)
721   NODE(PrefixSpec, Elemental)
722   NODE(PrefixSpec, Impure)
723   NODE(PrefixSpec, Module)
724   NODE(PrefixSpec, Non_Recursive)
725   NODE(PrefixSpec, Pure)
726   NODE(PrefixSpec, Recursive)
727   NODE(PrefixSpec, Attributes)
728   NODE(PrefixSpec, Launch_Bounds)
729   NODE(PrefixSpec, Cluster_Dims)
730   NODE(parser, PrintStmt)
731   NODE(parser, PrivateStmt)
732   NODE(parser, PrivateOrSequence)
733   NODE(parser, ProcAttrSpec)
734   NODE(parser, ProcComponentAttrSpec)
735   NODE(parser, ProcComponentDefStmt)
736   NODE(parser, ProcComponentRef)
737   NODE(parser, ProcDecl)
738   NODE(parser, ProcInterface)
739   NODE(parser, ProcPointerInit)
740   NODE(parser, ProcedureDeclarationStmt)
741   NODE(parser, ProcedureDesignator)
742   NODE(parser, ProcedureStmt)
743   NODE_ENUM(ProcedureStmt, Kind)
744   NODE(parser, Program)
745   NODE(parser, ProgramStmt)
746   NODE(parser, ProgramUnit)
747   NODE(parser, Protected)
748   NODE(parser, ProtectedStmt)
749   NODE(parser, ReadStmt)
750   NODE(parser, RealLiteralConstant)
751   NODE(RealLiteralConstant, Real)
752   NODE(parser, Rename)
753   NODE(Rename, Names)
754   NODE(Rename, Operators)
755   NODE(parser, ReturnStmt)
756   NODE(parser, RewindStmt)
757   NODE(parser, Save)
758   NODE(parser, SaveStmt)
759   NODE(parser, SavedEntity)
760   NODE_ENUM(SavedEntity, Kind)
761   NODE(parser, SectionSubscript)
762   NODE(parser, SelectCaseStmt)
763   NODE(parser, SelectRankCaseStmt)
764   NODE(SelectRankCaseStmt, Rank)
765   NODE(parser, SelectRankConstruct)
766   NODE(SelectRankConstruct, RankCase)
767   NODE(parser, SelectRankStmt)
768   NODE(parser, SelectTypeConstruct)
769   NODE(SelectTypeConstruct, TypeCase)
770   NODE(parser, SelectTypeStmt)
771   NODE(parser, Selector)
772   NODE(parser, SeparateModuleSubprogram)
773   NODE(parser, SequenceStmt)
774   NODE(parser, Sign)
775   NODE(parser, SignedComplexLiteralConstant)
776   NODE(parser, SignedIntLiteralConstant)
777   NODE(parser, SignedRealLiteralConstant)
778   NODE(parser, SpecificationConstruct)
779   NODE(parser, SpecificationExpr)
780   NODE(parser, SpecificationPart)
781   NODE(parser, Star)
782   NODE(parser, StatOrErrmsg)
783   NODE(parser, StatVariable)
784   NODE(parser, StatusExpr)
785   NODE(parser, StmtFunctionStmt)
786   NODE(parser, StopCode)
787   NODE(parser, StopStmt)
788   NODE_ENUM(StopStmt, Kind)
789   NODE(parser, StructureComponent)
790   NODE(parser, StructureConstructor)
791   NODE(parser, StructureDef)
792   NODE(StructureDef, EndStructureStmt)
793   NODE(parser, StructureField)
794   NODE(parser, StructureStmt)
795   NODE(parser, Submodule)
796   NODE(parser, SubmoduleStmt)
797   NODE(parser, SubroutineStmt)
798   NODE(parser, SubroutineSubprogram)
799   NODE(parser, SubscriptTriplet)
800   NODE(parser, Substring)
801   NODE(parser, SubstringInquiry)
802   NODE(parser, SubstringRange)
803   NODE(parser, Suffix)
804   NODE(parser, SyncAllStmt)
805   NODE(parser, SyncImagesStmt)
806   NODE(SyncImagesStmt, ImageSet)
807   NODE(parser, SyncMemoryStmt)
808   NODE(parser, SyncTeamStmt)
809   NODE(parser, Target)
810   NODE(parser, TargetStmt)
811   NODE(parser, TypeAttrSpec)
812   NODE(TypeAttrSpec, BindC)
813   NODE(TypeAttrSpec, Extends)
814   NODE(parser, TypeBoundGenericStmt)
815   NODE(parser, TypeBoundProcBinding)
816   NODE(parser, TypeBoundProcDecl)
817   NODE(parser, TypeBoundProcedurePart)
818   NODE(parser, TypeBoundProcedureStmt)
819   NODE(TypeBoundProcedureStmt, WithInterface)
820   NODE(TypeBoundProcedureStmt, WithoutInterface)
821   NODE(parser, TypeDeclarationStmt)
822   NODE(parser, TypeGuardStmt)
823   NODE(TypeGuardStmt, Guard)
824   NODE(parser, TypeParamDecl)
825   NODE(parser, TypeParamDefStmt)
826   NODE(common, TypeParamAttr)
827   NODE(parser, TypeParamSpec)
828   NODE(parser, TypeParamValue)
829   NODE(TypeParamValue, Deferred)
830   NODE(parser, TypeSpec)
831   NODE(parser, Union)
832   NODE(Union, EndUnionStmt)
833   NODE(Union, UnionStmt)
834   NODE(parser, UnlockStmt)
835   NODE(parser, UnsignedLiteralConstant)
836   NODE(parser, UnsignedTypeSpec)
837   NODE(parser, UseStmt)
838   NODE_ENUM(UseStmt, ModuleNature)
839   NODE(parser, Value)
840   NODE(parser, ValueStmt)
841   NODE(parser, Variable)
842   NODE(parser, VectorTypeSpec)
843   NODE(VectorTypeSpec, PairVectorTypeSpec)
844   NODE(VectorTypeSpec, QuadVectorTypeSpec)
845   NODE(parser, IntrinsicVectorTypeSpec)
846   NODE(parser, VectorElementType)
847   NODE(parser, Verbatim)
848   NODE(parser, Volatile)
849   NODE(parser, VolatileStmt)
850   NODE(parser, WaitSpec)
851   NODE(parser, WaitStmt)
852   NODE(parser, WhereBodyConstruct)
853   NODE(parser, WhereConstruct)
854   NODE(WhereConstruct, Elsewhere)
855   NODE(WhereConstruct, MaskedElsewhere)
856   NODE(parser, WhereConstructStmt)
857   NODE(parser, WhereStmt)
858   NODE(parser, WriteStmt)
859 #undef NODE
860 #undef NODE_NAME
861 
862   template <typename T> bool Pre(const T &x) {
863     std::string fortran{AsFortran<T>(x)};
864     if (fortran.empty() && (UnionTrait<T> || WrapperTrait<T>)) {
865       Prefix(GetNodeName(x));
866     } else {
867       IndentEmptyLine();
868       out_ << GetNodeName(x);
869       if (!fortran.empty()) {
870         out_ << " = '" << fortran << '\'';
871       }
872       EndLine();
873       ++indent_;
874     }
875     return true;
876   }
877 
878   template <typename T> void Post(const T &x) {
879     if (AsFortran<T>(x).empty() && (UnionTrait<T> || WrapperTrait<T>)) {
880       EndLineIfNonempty();
881     } else {
882       --indent_;
883     }
884   }
885 
886   // A few types we want to ignore
887 
888   bool Pre(const CharBlock &) { return true; }
889   void Post(const CharBlock &) {}
890 
891   template <typename T> bool Pre(const Statement<T> &) { return true; }
892   template <typename T> void Post(const Statement<T> &) {}
893   template <typename T> bool Pre(const UnlabeledStatement<T> &) { return true; }
894   template <typename T> void Post(const UnlabeledStatement<T> &) {}
895 
896   template <typename T> bool Pre(const common::Indirection<T> &) {
897     return true;
898   }
899   template <typename T> void Post(const common::Indirection<T> &) {}
900 
901   template <typename A> bool Pre(const Scalar<A> &) {
902     Prefix("Scalar");
903     return true;
904   }
905   template <typename A> void Post(const Scalar<A> &) { EndLineIfNonempty(); }
906 
907   template <typename A> bool Pre(const Constant<A> &) {
908     Prefix("Constant");
909     return true;
910   }
911   template <typename A> void Post(const Constant<A> &) { EndLineIfNonempty(); }
912 
913   template <typename A> bool Pre(const Integer<A> &) {
914     Prefix("Integer");
915     return true;
916   }
917   template <typename A> void Post(const Integer<A> &) { EndLineIfNonempty(); }
918 
919   template <typename A> bool Pre(const Logical<A> &) {
920     Prefix("Logical");
921     return true;
922   }
923   template <typename A> void Post(const Logical<A> &) { EndLineIfNonempty(); }
924 
925   template <typename A> bool Pre(const DefaultChar<A> &) {
926     Prefix("DefaultChar");
927     return true;
928   }
929   template <typename A> void Post(const DefaultChar<A> &) {
930     EndLineIfNonempty();
931   }
932 
933   template <typename... A> bool Pre(const std::tuple<A...> &) { return true; }
934   template <typename... A> void Post(const std::tuple<A...> &) {}
935 
936   template <typename... A> bool Pre(const std::variant<A...> &) { return true; }
937   template <typename... A> void Post(const std::variant<A...> &) {}
938 
939 protected:
940   // Return a Fortran representation of this node to include in the dump
941   template <typename T> std::string AsFortran(const T &x) {
942     std::string buf;
943     llvm::raw_string_ostream ss{buf};
944     if constexpr (HasTypedExpr<T>::value) {
945       if (asFortran_ && x.typedExpr) {
946         asFortran_->expr(ss, *x.typedExpr);
947       }
948     } else if constexpr (std::is_same_v<T, AssignmentStmt> ||
949         std::is_same_v<T, PointerAssignmentStmt>) {
950       if (asFortran_ && x.typedAssignment) {
951         asFortran_->assignment(ss, *x.typedAssignment);
952       }
953     } else if constexpr (std::is_same_v<T, CallStmt>) {
954       if (asFortran_ && x.typedCall) {
955         asFortran_->call(ss, *x.typedCall);
956       }
957     } else if constexpr (std::is_same_v<T, IntLiteralConstant> ||
958         std::is_same_v<T, SignedIntLiteralConstant> ||
959         std::is_same_v<T, UnsignedLiteralConstant>) {
960       ss << std::get<CharBlock>(x.t);
961     } else if constexpr (std::is_same_v<T, RealLiteralConstant::Real>) {
962       ss << x.source;
963     } else if constexpr (std::is_same_v<T, std::string> ||
964         std::is_same_v<T, std::int64_t> || std::is_same_v<T, std::uint64_t>) {
965       ss << x;
966     }
967     if (ss.tell()) {
968       return buf;
969     }
970     if constexpr (std::is_same_v<T, Name>) {
971       return x.source.ToString();
972 #ifdef SHOW_ALL_SOURCE_MEMBERS
973     } else if constexpr (HasSource<T>::value) {
974       return x.source.ToString();
975 #endif
976     } else if constexpr (std::is_same_v<T, int>) {
977       return std::to_string(x);
978     } else if constexpr (std::is_same_v<T, bool>) {
979       return x ? "true" : "false";
980     } else {
981       return "";
982     }
983   }
984 
985   void IndentEmptyLine() {
986     if (emptyline_ && indent_ > 0) {
987       for (int i{0}; i < indent_; ++i) {
988         out_ << "| ";
989       }
990       emptyline_ = false;
991     }
992   }
993 
994   void Prefix(const char *str) {
995     IndentEmptyLine();
996     out_ << str << " -> ";
997     emptyline_ = false;
998   }
999 
1000   void Prefix(const std::string &str) {
1001     IndentEmptyLine();
1002     out_ << str << " -> ";
1003     emptyline_ = false;
1004   }
1005 
1006   void EndLine() {
1007     out_ << '\n';
1008     emptyline_ = true;
1009   }
1010 
1011   void EndLineIfNonempty() {
1012     if (!emptyline_) {
1013       EndLine();
1014     }
1015   }
1016 
1017 private:
1018   int indent_{0};
1019   llvm::raw_ostream &out_;
1020   const AnalyzedObjectsAsFortran *const asFortran_;
1021   bool emptyline_{false};
1022 };
1023 
1024 template <typename T>
1025 llvm::raw_ostream &DumpTree(llvm::raw_ostream &out, const T &x,
1026     const AnalyzedObjectsAsFortran *asFortran = nullptr) {
1027   ParseTreeDumper dumper{out, asFortran};
1028   Walk(x, dumper);
1029   return out;
1030 }
1031 
1032 } // namespace Fortran::parser
1033 #endif // FORTRAN_PARSER_DUMP_PARSE_TREE_H_
1034