]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/clang/include/clang/AST/Stmt.h
Merge ^/vendor/llvm-libunwind/dist up to its last change, and resolve conflicts.
[FreeBSD/FreeBSD.git] / contrib / llvm-project / clang / include / clang / AST / Stmt.h
1 //===- Stmt.h - Classes for representing statements -------------*- 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 //  This file defines the Stmt interface and subclasses.
10 //
11 //===----------------------------------------------------------------------===//
12
13 #ifndef LLVM_CLANG_AST_STMT_H
14 #define LLVM_CLANG_AST_STMT_H
15
16 #include "clang/AST/DeclGroup.h"
17 #include "clang/AST/StmtIterator.h"
18 #include "clang/Basic/CapturedStmt.h"
19 #include "clang/Basic/IdentifierTable.h"
20 #include "clang/Basic/LLVM.h"
21 #include "clang/Basic/SourceLocation.h"
22 #include "llvm/ADT/ArrayRef.h"
23 #include "llvm/ADT/PointerIntPair.h"
24 #include "llvm/ADT/StringRef.h"
25 #include "llvm/ADT/iterator.h"
26 #include "llvm/ADT/iterator_range.h"
27 #include "llvm/Support/Casting.h"
28 #include "llvm/Support/Compiler.h"
29 #include "llvm/Support/ErrorHandling.h"
30 #include <algorithm>
31 #include <cassert>
32 #include <cstddef>
33 #include <iterator>
34 #include <string>
35
36 namespace llvm {
37
38 class FoldingSetNodeID;
39
40 } // namespace llvm
41
42 namespace clang {
43
44 class ASTContext;
45 class Attr;
46 class CapturedDecl;
47 class Decl;
48 class Expr;
49 class AddrLabelExpr;
50 class LabelDecl;
51 class ODRHash;
52 class PrinterHelper;
53 struct PrintingPolicy;
54 class RecordDecl;
55 class SourceManager;
56 class StringLiteral;
57 class Token;
58 class VarDecl;
59
60 //===----------------------------------------------------------------------===//
61 // AST classes for statements.
62 //===----------------------------------------------------------------------===//
63
64 /// Stmt - This represents one statement.
65 ///
66 class alignas(void *) Stmt {
67 public:
68   enum StmtClass {
69     NoStmtClass = 0,
70 #define STMT(CLASS, PARENT) CLASS##Class,
71 #define STMT_RANGE(BASE, FIRST, LAST) \
72         first##BASE##Constant=FIRST##Class, last##BASE##Constant=LAST##Class,
73 #define LAST_STMT_RANGE(BASE, FIRST, LAST) \
74         first##BASE##Constant=FIRST##Class, last##BASE##Constant=LAST##Class
75 #define ABSTRACT_STMT(STMT)
76 #include "clang/AST/StmtNodes.inc"
77   };
78
79   // Make vanilla 'new' and 'delete' illegal for Stmts.
80 protected:
81   friend class ASTStmtReader;
82   friend class ASTStmtWriter;
83
84   void *operator new(size_t bytes) noexcept {
85     llvm_unreachable("Stmts cannot be allocated with regular 'new'.");
86   }
87
88   void operator delete(void *data) noexcept {
89     llvm_unreachable("Stmts cannot be released with regular 'delete'.");
90   }
91
92   //===--- Statement bitfields classes ---===//
93
94   class StmtBitfields {
95     friend class ASTStmtReader;
96     friend class ASTStmtWriter;
97     friend class Stmt;
98
99     /// The statement class.
100     unsigned sClass : 8;
101
102     /// This bit is set only for the Stmts that are the structured-block of
103     /// OpenMP executable directives. Directives that have a structured block
104     /// are called "non-standalone" directives.
105     /// I.e. those returned by OMPExecutableDirective::getStructuredBlock().
106     unsigned IsOMPStructuredBlock : 1;
107   };
108   enum { NumStmtBits = 9 };
109
110   class NullStmtBitfields {
111     friend class ASTStmtReader;
112     friend class ASTStmtWriter;
113     friend class NullStmt;
114
115     unsigned : NumStmtBits;
116
117     /// True if the null statement was preceded by an empty macro, e.g:
118     /// @code
119     ///   #define CALL(x)
120     ///   CALL(0);
121     /// @endcode
122     unsigned HasLeadingEmptyMacro : 1;
123
124     /// The location of the semi-colon.
125     SourceLocation SemiLoc;
126   };
127
128   class CompoundStmtBitfields {
129     friend class ASTStmtReader;
130     friend class CompoundStmt;
131
132     unsigned : NumStmtBits;
133
134     unsigned NumStmts : 32 - NumStmtBits;
135
136     /// The location of the opening "{".
137     SourceLocation LBraceLoc;
138   };
139
140   class LabelStmtBitfields {
141     friend class LabelStmt;
142
143     unsigned : NumStmtBits;
144
145     SourceLocation IdentLoc;
146   };
147
148   class AttributedStmtBitfields {
149     friend class ASTStmtReader;
150     friend class AttributedStmt;
151
152     unsigned : NumStmtBits;
153
154     /// Number of attributes.
155     unsigned NumAttrs : 32 - NumStmtBits;
156
157     /// The location of the attribute.
158     SourceLocation AttrLoc;
159   };
160
161   class IfStmtBitfields {
162     friend class ASTStmtReader;
163     friend class IfStmt;
164
165     unsigned : NumStmtBits;
166
167     /// True if this if statement is a constexpr if.
168     unsigned IsConstexpr : 1;
169
170     /// True if this if statement has storage for an else statement.
171     unsigned HasElse : 1;
172
173     /// True if this if statement has storage for a variable declaration.
174     unsigned HasVar : 1;
175
176     /// True if this if statement has storage for an init statement.
177     unsigned HasInit : 1;
178
179     /// The location of the "if".
180     SourceLocation IfLoc;
181   };
182
183   class SwitchStmtBitfields {
184     friend class SwitchStmt;
185
186     unsigned : NumStmtBits;
187
188     /// True if the SwitchStmt has storage for an init statement.
189     unsigned HasInit : 1;
190
191     /// True if the SwitchStmt has storage for a condition variable.
192     unsigned HasVar : 1;
193
194     /// If the SwitchStmt is a switch on an enum value, records whether all
195     /// the enum values were covered by CaseStmts.  The coverage information
196     /// value is meant to be a hint for possible clients.
197     unsigned AllEnumCasesCovered : 1;
198
199     /// The location of the "switch".
200     SourceLocation SwitchLoc;
201   };
202
203   class WhileStmtBitfields {
204     friend class ASTStmtReader;
205     friend class WhileStmt;
206
207     unsigned : NumStmtBits;
208
209     /// True if the WhileStmt has storage for a condition variable.
210     unsigned HasVar : 1;
211
212     /// The location of the "while".
213     SourceLocation WhileLoc;
214   };
215
216   class DoStmtBitfields {
217     friend class DoStmt;
218
219     unsigned : NumStmtBits;
220
221     /// The location of the "do".
222     SourceLocation DoLoc;
223   };
224
225   class ForStmtBitfields {
226     friend class ForStmt;
227
228     unsigned : NumStmtBits;
229
230     /// The location of the "for".
231     SourceLocation ForLoc;
232   };
233
234   class GotoStmtBitfields {
235     friend class GotoStmt;
236     friend class IndirectGotoStmt;
237
238     unsigned : NumStmtBits;
239
240     /// The location of the "goto".
241     SourceLocation GotoLoc;
242   };
243
244   class ContinueStmtBitfields {
245     friend class ContinueStmt;
246
247     unsigned : NumStmtBits;
248
249     /// The location of the "continue".
250     SourceLocation ContinueLoc;
251   };
252
253   class BreakStmtBitfields {
254     friend class BreakStmt;
255
256     unsigned : NumStmtBits;
257
258     /// The location of the "break".
259     SourceLocation BreakLoc;
260   };
261
262   class ReturnStmtBitfields {
263     friend class ReturnStmt;
264
265     unsigned : NumStmtBits;
266
267     /// True if this ReturnStmt has storage for an NRVO candidate.
268     unsigned HasNRVOCandidate : 1;
269
270     /// The location of the "return".
271     SourceLocation RetLoc;
272   };
273
274   class SwitchCaseBitfields {
275     friend class SwitchCase;
276     friend class CaseStmt;
277
278     unsigned : NumStmtBits;
279
280     /// Used by CaseStmt to store whether it is a case statement
281     /// of the form case LHS ... RHS (a GNU extension).
282     unsigned CaseStmtIsGNURange : 1;
283
284     /// The location of the "case" or "default" keyword.
285     SourceLocation KeywordLoc;
286   };
287
288   //===--- Expression bitfields classes ---===//
289
290   class ExprBitfields {
291     friend class ASTStmtReader; // deserialization
292     friend class AtomicExpr; // ctor
293     friend class BlockDeclRefExpr; // ctor
294     friend class CallExpr; // ctor
295     friend class CXXConstructExpr; // ctor
296     friend class CXXDependentScopeMemberExpr; // ctor
297     friend class CXXNewExpr; // ctor
298     friend class CXXUnresolvedConstructExpr; // ctor
299     friend class DeclRefExpr; // computeDependence
300     friend class DependentScopeDeclRefExpr; // ctor
301     friend class DesignatedInitExpr; // ctor
302     friend class Expr;
303     friend class InitListExpr; // ctor
304     friend class ObjCArrayLiteral; // ctor
305     friend class ObjCDictionaryLiteral; // ctor
306     friend class ObjCMessageExpr; // ctor
307     friend class OffsetOfExpr; // ctor
308     friend class OpaqueValueExpr; // ctor
309     friend class OverloadExpr; // ctor
310     friend class ParenListExpr; // ctor
311     friend class PseudoObjectExpr; // ctor
312     friend class ShuffleVectorExpr; // ctor
313
314     unsigned : NumStmtBits;
315
316     unsigned ValueKind : 2;
317     unsigned ObjectKind : 3;
318     unsigned TypeDependent : 1;
319     unsigned ValueDependent : 1;
320     unsigned InstantiationDependent : 1;
321     unsigned ContainsUnexpandedParameterPack : 1;
322   };
323   enum { NumExprBits = NumStmtBits + 9 };
324
325   class ConstantExprBitfields {
326     friend class ASTStmtReader;
327     friend class ASTStmtWriter;
328     friend class ConstantExpr;
329
330     unsigned : NumExprBits;
331
332     /// The kind of result that is trail-allocated.
333     unsigned ResultKind : 2;
334
335     /// Kind of Result as defined by APValue::Kind
336     unsigned APValueKind : 4;
337
338     /// When ResultKind == RSK_Int64. whether the trail-allocated integer is
339     /// signed.
340     unsigned IsUnsigned : 1;
341
342     /// When ResultKind == RSK_Int64. the BitWidth of the trail-allocated
343     /// integer. 7 bits because it is the minimal number of bit to represent a
344     /// value from 0 to 64 (the size of the trail-allocated number).
345     unsigned BitWidth : 7;
346
347     /// When ResultKind == RSK_APValue. Wether the ASTContext will cleanup the
348     /// destructor on the trail-allocated APValue.
349     unsigned HasCleanup : 1;
350   };
351
352   class PredefinedExprBitfields {
353     friend class ASTStmtReader;
354     friend class PredefinedExpr;
355
356     unsigned : NumExprBits;
357
358     /// The kind of this PredefinedExpr. One of the enumeration values
359     /// in PredefinedExpr::IdentKind.
360     unsigned Kind : 4;
361
362     /// True if this PredefinedExpr has a trailing "StringLiteral *"
363     /// for the predefined identifier.
364     unsigned HasFunctionName : 1;
365
366     /// The location of this PredefinedExpr.
367     SourceLocation Loc;
368   };
369
370   class DeclRefExprBitfields {
371     friend class ASTStmtReader; // deserialization
372     friend class DeclRefExpr;
373
374     unsigned : NumExprBits;
375
376     unsigned HasQualifier : 1;
377     unsigned HasTemplateKWAndArgsInfo : 1;
378     unsigned HasFoundDecl : 1;
379     unsigned HadMultipleCandidates : 1;
380     unsigned RefersToEnclosingVariableOrCapture : 1;
381     unsigned NonOdrUseReason : 2;
382
383     /// The location of the declaration name itself.
384     SourceLocation Loc;
385   };
386
387
388   class FloatingLiteralBitfields {
389     friend class FloatingLiteral;
390
391     unsigned : NumExprBits;
392
393     unsigned Semantics : 3; // Provides semantics for APFloat construction
394     unsigned IsExact : 1;
395   };
396
397   class StringLiteralBitfields {
398     friend class ASTStmtReader;
399     friend class StringLiteral;
400
401     unsigned : NumExprBits;
402
403     /// The kind of this string literal.
404     /// One of the enumeration values of StringLiteral::StringKind.
405     unsigned Kind : 3;
406
407     /// The width of a single character in bytes. Only values of 1, 2,
408     /// and 4 bytes are supported. StringLiteral::mapCharByteWidth maps
409     /// the target + string kind to the appropriate CharByteWidth.
410     unsigned CharByteWidth : 3;
411
412     unsigned IsPascal : 1;
413
414     /// The number of concatenated token this string is made of.
415     /// This is the number of trailing SourceLocation.
416     unsigned NumConcatenated;
417   };
418
419   class CharacterLiteralBitfields {
420     friend class CharacterLiteral;
421
422     unsigned : NumExprBits;
423
424     unsigned Kind : 3;
425   };
426
427   class UnaryOperatorBitfields {
428     friend class UnaryOperator;
429
430     unsigned : NumExprBits;
431
432     unsigned Opc : 5;
433     unsigned CanOverflow : 1;
434
435     SourceLocation Loc;
436   };
437
438   class UnaryExprOrTypeTraitExprBitfields {
439     friend class UnaryExprOrTypeTraitExpr;
440
441     unsigned : NumExprBits;
442
443     unsigned Kind : 3;
444     unsigned IsType : 1; // true if operand is a type, false if an expression.
445   };
446
447   class ArraySubscriptExprBitfields {
448     friend class ArraySubscriptExpr;
449
450     unsigned : NumExprBits;
451
452     SourceLocation RBracketLoc;
453   };
454
455   class CallExprBitfields {
456     friend class CallExpr;
457
458     unsigned : NumExprBits;
459
460     unsigned NumPreArgs : 1;
461
462     /// True if the callee of the call expression was found using ADL.
463     unsigned UsesADL : 1;
464
465     /// Padding used to align OffsetToTrailingObjects to a byte multiple.
466     unsigned : 24 - 2 - NumExprBits;
467
468     /// The offset in bytes from the this pointer to the start of the
469     /// trailing objects belonging to CallExpr. Intentionally byte sized
470     /// for faster access.
471     unsigned OffsetToTrailingObjects : 8;
472   };
473   enum { NumCallExprBits = 32 };
474
475   class MemberExprBitfields {
476     friend class ASTStmtReader;
477     friend class MemberExpr;
478
479     unsigned : NumExprBits;
480
481     /// IsArrow - True if this is "X->F", false if this is "X.F".
482     unsigned IsArrow : 1;
483
484     /// True if this member expression used a nested-name-specifier to
485     /// refer to the member, e.g., "x->Base::f", or found its member via
486     /// a using declaration.  When true, a MemberExprNameQualifier
487     /// structure is allocated immediately after the MemberExpr.
488     unsigned HasQualifierOrFoundDecl : 1;
489
490     /// True if this member expression specified a template keyword
491     /// and/or a template argument list explicitly, e.g., x->f<int>,
492     /// x->template f, x->template f<int>.
493     /// When true, an ASTTemplateKWAndArgsInfo structure and its
494     /// TemplateArguments (if any) are present.
495     unsigned HasTemplateKWAndArgsInfo : 1;
496
497     /// True if this member expression refers to a method that
498     /// was resolved from an overloaded set having size greater than 1.
499     unsigned HadMultipleCandidates : 1;
500
501     /// Value of type NonOdrUseReason indicating why this MemberExpr does
502     /// not constitute an odr-use of the named declaration. Meaningful only
503     /// when naming a static member.
504     unsigned NonOdrUseReason : 2;
505
506     /// This is the location of the -> or . in the expression.
507     SourceLocation OperatorLoc;
508   };
509
510   class CastExprBitfields {
511     friend class CastExpr;
512     friend class ImplicitCastExpr;
513
514     unsigned : NumExprBits;
515
516     unsigned Kind : 6;
517     unsigned PartOfExplicitCast : 1; // Only set for ImplicitCastExpr.
518
519     /// The number of CXXBaseSpecifiers in the cast. 14 bits would be enough
520     /// here. ([implimits] Direct and indirect base classes [16384]).
521     unsigned BasePathSize;
522   };
523
524   class BinaryOperatorBitfields {
525     friend class BinaryOperator;
526
527     unsigned : NumExprBits;
528
529     unsigned Opc : 6;
530
531     /// This is only meaningful for operations on floating point
532     /// types and 0 otherwise.
533     unsigned FPFeatures : 3;
534
535     SourceLocation OpLoc;
536   };
537
538   class InitListExprBitfields {
539     friend class InitListExpr;
540
541     unsigned : NumExprBits;
542
543     /// Whether this initializer list originally had a GNU array-range
544     /// designator in it. This is a temporary marker used by CodeGen.
545     unsigned HadArrayRangeDesignator : 1;
546   };
547
548   class ParenListExprBitfields {
549     friend class ASTStmtReader;
550     friend class ParenListExpr;
551
552     unsigned : NumExprBits;
553
554     /// The number of expressions in the paren list.
555     unsigned NumExprs;
556   };
557
558   class GenericSelectionExprBitfields {
559     friend class ASTStmtReader;
560     friend class GenericSelectionExpr;
561
562     unsigned : NumExprBits;
563
564     /// The location of the "_Generic".
565     SourceLocation GenericLoc;
566   };
567
568   class PseudoObjectExprBitfields {
569     friend class ASTStmtReader; // deserialization
570     friend class PseudoObjectExpr;
571
572     unsigned : NumExprBits;
573
574     // These don't need to be particularly wide, because they're
575     // strictly limited by the forms of expressions we permit.
576     unsigned NumSubExprs : 8;
577     unsigned ResultIndex : 32 - 8 - NumExprBits;
578   };
579
580   class SourceLocExprBitfields {
581     friend class ASTStmtReader;
582     friend class SourceLocExpr;
583
584     unsigned : NumExprBits;
585
586     /// The kind of source location builtin represented by the SourceLocExpr.
587     /// Ex. __builtin_LINE, __builtin_FUNCTION, ect.
588     unsigned Kind : 2;
589   };
590
591   //===--- C++ Expression bitfields classes ---===//
592
593   class CXXOperatorCallExprBitfields {
594     friend class ASTStmtReader;
595     friend class CXXOperatorCallExpr;
596
597     unsigned : NumCallExprBits;
598
599     /// The kind of this overloaded operator. One of the enumerator
600     /// value of OverloadedOperatorKind.
601     unsigned OperatorKind : 6;
602
603     // Only meaningful for floating point types.
604     unsigned FPFeatures : 3;
605   };
606
607   class CXXRewrittenBinaryOperatorBitfields {
608     friend class ASTStmtReader;
609     friend class CXXRewrittenBinaryOperator;
610
611     unsigned : NumCallExprBits;
612
613     unsigned IsReversed : 1;
614   };
615
616   class CXXBoolLiteralExprBitfields {
617     friend class CXXBoolLiteralExpr;
618
619     unsigned : NumExprBits;
620
621     /// The value of the boolean literal.
622     unsigned Value : 1;
623
624     /// The location of the boolean literal.
625     SourceLocation Loc;
626   };
627
628   class CXXNullPtrLiteralExprBitfields {
629     friend class CXXNullPtrLiteralExpr;
630
631     unsigned : NumExprBits;
632
633     /// The location of the null pointer literal.
634     SourceLocation Loc;
635   };
636
637   class CXXThisExprBitfields {
638     friend class CXXThisExpr;
639
640     unsigned : NumExprBits;
641
642     /// Whether this is an implicit "this".
643     unsigned IsImplicit : 1;
644
645     /// The location of the "this".
646     SourceLocation Loc;
647   };
648
649   class CXXThrowExprBitfields {
650     friend class ASTStmtReader;
651     friend class CXXThrowExpr;
652
653     unsigned : NumExprBits;
654
655     /// Whether the thrown variable (if any) is in scope.
656     unsigned IsThrownVariableInScope : 1;
657
658     /// The location of the "throw".
659     SourceLocation ThrowLoc;
660   };
661
662   class CXXDefaultArgExprBitfields {
663     friend class ASTStmtReader;
664     friend class CXXDefaultArgExpr;
665
666     unsigned : NumExprBits;
667
668     /// The location where the default argument expression was used.
669     SourceLocation Loc;
670   };
671
672   class CXXDefaultInitExprBitfields {
673     friend class ASTStmtReader;
674     friend class CXXDefaultInitExpr;
675
676     unsigned : NumExprBits;
677
678     /// The location where the default initializer expression was used.
679     SourceLocation Loc;
680   };
681
682   class CXXScalarValueInitExprBitfields {
683     friend class ASTStmtReader;
684     friend class CXXScalarValueInitExpr;
685
686     unsigned : NumExprBits;
687
688     SourceLocation RParenLoc;
689   };
690
691   class CXXNewExprBitfields {
692     friend class ASTStmtReader;
693     friend class ASTStmtWriter;
694     friend class CXXNewExpr;
695
696     unsigned : NumExprBits;
697
698     /// Was the usage ::new, i.e. is the global new to be used?
699     unsigned IsGlobalNew : 1;
700
701     /// Do we allocate an array? If so, the first trailing "Stmt *" is the
702     /// size expression.
703     unsigned IsArray : 1;
704
705     /// Should the alignment be passed to the allocation function?
706     unsigned ShouldPassAlignment : 1;
707
708     /// If this is an array allocation, does the usual deallocation
709     /// function for the allocated type want to know the allocated size?
710     unsigned UsualArrayDeleteWantsSize : 1;
711
712     /// What kind of initializer do we have? Could be none, parens, or braces.
713     /// In storage, we distinguish between "none, and no initializer expr", and
714     /// "none, but an implicit initializer expr".
715     unsigned StoredInitializationStyle : 2;
716
717     /// True if the allocated type was expressed as a parenthesized type-id.
718     unsigned IsParenTypeId : 1;
719
720     /// The number of placement new arguments.
721     unsigned NumPlacementArgs;
722   };
723
724   class CXXDeleteExprBitfields {
725     friend class ASTStmtReader;
726     friend class CXXDeleteExpr;
727
728     unsigned : NumExprBits;
729
730     /// Is this a forced global delete, i.e. "::delete"?
731     unsigned GlobalDelete : 1;
732
733     /// Is this the array form of delete, i.e. "delete[]"?
734     unsigned ArrayForm : 1;
735
736     /// ArrayFormAsWritten can be different from ArrayForm if 'delete' is
737     /// applied to pointer-to-array type (ArrayFormAsWritten will be false
738     /// while ArrayForm will be true).
739     unsigned ArrayFormAsWritten : 1;
740
741     /// Does the usual deallocation function for the element type require
742     /// a size_t argument?
743     unsigned UsualArrayDeleteWantsSize : 1;
744
745     /// Location of the expression.
746     SourceLocation Loc;
747   };
748
749   class TypeTraitExprBitfields {
750     friend class ASTStmtReader;
751     friend class ASTStmtWriter;
752     friend class TypeTraitExpr;
753
754     unsigned : NumExprBits;
755
756     /// The kind of type trait, which is a value of a TypeTrait enumerator.
757     unsigned Kind : 8;
758
759     /// If this expression is not value-dependent, this indicates whether
760     /// the trait evaluated true or false.
761     unsigned Value : 1;
762
763     /// The number of arguments to this type trait.
764     unsigned NumArgs : 32 - 8 - 1 - NumExprBits;
765   };
766
767   class DependentScopeDeclRefExprBitfields {
768     friend class ASTStmtReader;
769     friend class ASTStmtWriter;
770     friend class DependentScopeDeclRefExpr;
771
772     unsigned : NumExprBits;
773
774     /// Whether the name includes info for explicit template
775     /// keyword and arguments.
776     unsigned HasTemplateKWAndArgsInfo : 1;
777   };
778
779   class CXXConstructExprBitfields {
780     friend class ASTStmtReader;
781     friend class CXXConstructExpr;
782
783     unsigned : NumExprBits;
784
785     unsigned Elidable : 1;
786     unsigned HadMultipleCandidates : 1;
787     unsigned ListInitialization : 1;
788     unsigned StdInitListInitialization : 1;
789     unsigned ZeroInitialization : 1;
790     unsigned ConstructionKind : 3;
791
792     SourceLocation Loc;
793   };
794
795   class ExprWithCleanupsBitfields {
796     friend class ASTStmtReader; // deserialization
797     friend class ExprWithCleanups;
798
799     unsigned : NumExprBits;
800
801     // When false, it must not have side effects.
802     unsigned CleanupsHaveSideEffects : 1;
803
804     unsigned NumObjects : 32 - 1 - NumExprBits;
805   };
806
807   class CXXUnresolvedConstructExprBitfields {
808     friend class ASTStmtReader;
809     friend class CXXUnresolvedConstructExpr;
810
811     unsigned : NumExprBits;
812
813     /// The number of arguments used to construct the type.
814     unsigned NumArgs;
815   };
816
817   class CXXDependentScopeMemberExprBitfields {
818     friend class ASTStmtReader;
819     friend class CXXDependentScopeMemberExpr;
820
821     unsigned : NumExprBits;
822
823     /// Whether this member expression used the '->' operator or
824     /// the '.' operator.
825     unsigned IsArrow : 1;
826
827     /// Whether this member expression has info for explicit template
828     /// keyword and arguments.
829     unsigned HasTemplateKWAndArgsInfo : 1;
830
831     /// See getFirstQualifierFoundInScope() and the comment listing
832     /// the trailing objects.
833     unsigned HasFirstQualifierFoundInScope : 1;
834
835     /// The location of the '->' or '.' operator.
836     SourceLocation OperatorLoc;
837   };
838
839   class OverloadExprBitfields {
840     friend class ASTStmtReader;
841     friend class OverloadExpr;
842
843     unsigned : NumExprBits;
844
845     /// Whether the name includes info for explicit template
846     /// keyword and arguments.
847     unsigned HasTemplateKWAndArgsInfo : 1;
848
849     /// Padding used by the derived classes to store various bits. If you
850     /// need to add some data here, shrink this padding and add your data
851     /// above. NumOverloadExprBits also needs to be updated.
852     unsigned : 32 - NumExprBits - 1;
853
854     /// The number of results.
855     unsigned NumResults;
856   };
857   enum { NumOverloadExprBits = NumExprBits + 1 };
858
859   class UnresolvedLookupExprBitfields {
860     friend class ASTStmtReader;
861     friend class UnresolvedLookupExpr;
862
863     unsigned : NumOverloadExprBits;
864
865     /// True if these lookup results should be extended by
866     /// argument-dependent lookup if this is the operand of a function call.
867     unsigned RequiresADL : 1;
868
869     /// True if these lookup results are overloaded.  This is pretty trivially
870     /// rederivable if we urgently need to kill this field.
871     unsigned Overloaded : 1;
872   };
873   static_assert(sizeof(UnresolvedLookupExprBitfields) <= 4,
874                 "UnresolvedLookupExprBitfields must be <= than 4 bytes to"
875                 "avoid trashing OverloadExprBitfields::NumResults!");
876
877   class UnresolvedMemberExprBitfields {
878     friend class ASTStmtReader;
879     friend class UnresolvedMemberExpr;
880
881     unsigned : NumOverloadExprBits;
882
883     /// Whether this member expression used the '->' operator or
884     /// the '.' operator.
885     unsigned IsArrow : 1;
886
887     /// Whether the lookup results contain an unresolved using declaration.
888     unsigned HasUnresolvedUsing : 1;
889   };
890   static_assert(sizeof(UnresolvedMemberExprBitfields) <= 4,
891                 "UnresolvedMemberExprBitfields must be <= than 4 bytes to"
892                 "avoid trashing OverloadExprBitfields::NumResults!");
893
894   class CXXNoexceptExprBitfields {
895     friend class ASTStmtReader;
896     friend class CXXNoexceptExpr;
897
898     unsigned : NumExprBits;
899
900     unsigned Value : 1;
901   };
902
903   class SubstNonTypeTemplateParmExprBitfields {
904     friend class ASTStmtReader;
905     friend class SubstNonTypeTemplateParmExpr;
906
907     unsigned : NumExprBits;
908
909     /// The location of the non-type template parameter reference.
910     SourceLocation NameLoc;
911   };
912
913   //===--- C++ Coroutines TS bitfields classes ---===//
914
915   class CoawaitExprBitfields {
916     friend class CoawaitExpr;
917
918     unsigned : NumExprBits;
919
920     unsigned IsImplicit : 1;
921   };
922
923   //===--- Obj-C Expression bitfields classes ---===//
924
925   class ObjCIndirectCopyRestoreExprBitfields {
926     friend class ObjCIndirectCopyRestoreExpr;
927
928     unsigned : NumExprBits;
929
930     unsigned ShouldCopy : 1;
931   };
932
933   //===--- Clang Extensions bitfields classes ---===//
934
935   class OpaqueValueExprBitfields {
936     friend class ASTStmtReader;
937     friend class OpaqueValueExpr;
938
939     unsigned : NumExprBits;
940
941     /// The OVE is a unique semantic reference to its source expression if this
942     /// bit is set to true.
943     unsigned IsUnique : 1;
944
945     SourceLocation Loc;
946   };
947
948   union {
949     // Same order as in StmtNodes.td.
950     // Statements
951     StmtBitfields StmtBits;
952     NullStmtBitfields NullStmtBits;
953     CompoundStmtBitfields CompoundStmtBits;
954     LabelStmtBitfields LabelStmtBits;
955     AttributedStmtBitfields AttributedStmtBits;
956     IfStmtBitfields IfStmtBits;
957     SwitchStmtBitfields SwitchStmtBits;
958     WhileStmtBitfields WhileStmtBits;
959     DoStmtBitfields DoStmtBits;
960     ForStmtBitfields ForStmtBits;
961     GotoStmtBitfields GotoStmtBits;
962     ContinueStmtBitfields ContinueStmtBits;
963     BreakStmtBitfields BreakStmtBits;
964     ReturnStmtBitfields ReturnStmtBits;
965     SwitchCaseBitfields SwitchCaseBits;
966
967     // Expressions
968     ExprBitfields ExprBits;
969     ConstantExprBitfields ConstantExprBits;
970     PredefinedExprBitfields PredefinedExprBits;
971     DeclRefExprBitfields DeclRefExprBits;
972     FloatingLiteralBitfields FloatingLiteralBits;
973     StringLiteralBitfields StringLiteralBits;
974     CharacterLiteralBitfields CharacterLiteralBits;
975     UnaryOperatorBitfields UnaryOperatorBits;
976     UnaryExprOrTypeTraitExprBitfields UnaryExprOrTypeTraitExprBits;
977     ArraySubscriptExprBitfields ArraySubscriptExprBits;
978     CallExprBitfields CallExprBits;
979     MemberExprBitfields MemberExprBits;
980     CastExprBitfields CastExprBits;
981     BinaryOperatorBitfields BinaryOperatorBits;
982     InitListExprBitfields InitListExprBits;
983     ParenListExprBitfields ParenListExprBits;
984     GenericSelectionExprBitfields GenericSelectionExprBits;
985     PseudoObjectExprBitfields PseudoObjectExprBits;
986     SourceLocExprBitfields SourceLocExprBits;
987
988     // C++ Expressions
989     CXXOperatorCallExprBitfields CXXOperatorCallExprBits;
990     CXXRewrittenBinaryOperatorBitfields CXXRewrittenBinaryOperatorBits;
991     CXXBoolLiteralExprBitfields CXXBoolLiteralExprBits;
992     CXXNullPtrLiteralExprBitfields CXXNullPtrLiteralExprBits;
993     CXXThisExprBitfields CXXThisExprBits;
994     CXXThrowExprBitfields CXXThrowExprBits;
995     CXXDefaultArgExprBitfields CXXDefaultArgExprBits;
996     CXXDefaultInitExprBitfields CXXDefaultInitExprBits;
997     CXXScalarValueInitExprBitfields CXXScalarValueInitExprBits;
998     CXXNewExprBitfields CXXNewExprBits;
999     CXXDeleteExprBitfields CXXDeleteExprBits;
1000     TypeTraitExprBitfields TypeTraitExprBits;
1001     DependentScopeDeclRefExprBitfields DependentScopeDeclRefExprBits;
1002     CXXConstructExprBitfields CXXConstructExprBits;
1003     ExprWithCleanupsBitfields ExprWithCleanupsBits;
1004     CXXUnresolvedConstructExprBitfields CXXUnresolvedConstructExprBits;
1005     CXXDependentScopeMemberExprBitfields CXXDependentScopeMemberExprBits;
1006     OverloadExprBitfields OverloadExprBits;
1007     UnresolvedLookupExprBitfields UnresolvedLookupExprBits;
1008     UnresolvedMemberExprBitfields UnresolvedMemberExprBits;
1009     CXXNoexceptExprBitfields CXXNoexceptExprBits;
1010     SubstNonTypeTemplateParmExprBitfields SubstNonTypeTemplateParmExprBits;
1011
1012     // C++ Coroutines TS expressions
1013     CoawaitExprBitfields CoawaitBits;
1014
1015     // Obj-C Expressions
1016     ObjCIndirectCopyRestoreExprBitfields ObjCIndirectCopyRestoreExprBits;
1017
1018     // Clang Extensions
1019     OpaqueValueExprBitfields OpaqueValueExprBits;
1020   };
1021
1022 public:
1023   // Only allow allocation of Stmts using the allocator in ASTContext
1024   // or by doing a placement new.
1025   void* operator new(size_t bytes, const ASTContext& C,
1026                      unsigned alignment = 8);
1027
1028   void* operator new(size_t bytes, const ASTContext* C,
1029                      unsigned alignment = 8) {
1030     return operator new(bytes, *C, alignment);
1031   }
1032
1033   void *operator new(size_t bytes, void *mem) noexcept { return mem; }
1034
1035   void operator delete(void *, const ASTContext &, unsigned) noexcept {}
1036   void operator delete(void *, const ASTContext *, unsigned) noexcept {}
1037   void operator delete(void *, size_t) noexcept {}
1038   void operator delete(void *, void *) noexcept {}
1039
1040 public:
1041   /// A placeholder type used to construct an empty shell of a
1042   /// type, that will be filled in later (e.g., by some
1043   /// de-serialization).
1044   struct EmptyShell {};
1045
1046 protected:
1047   /// Iterator for iterating over Stmt * arrays that contain only T *.
1048   ///
1049   /// This is needed because AST nodes use Stmt* arrays to store
1050   /// references to children (to be compatible with StmtIterator).
1051   template<typename T, typename TPtr = T *, typename StmtPtr = Stmt *>
1052   struct CastIterator
1053       : llvm::iterator_adaptor_base<CastIterator<T, TPtr, StmtPtr>, StmtPtr *,
1054                                     std::random_access_iterator_tag, TPtr> {
1055     using Base = typename CastIterator::iterator_adaptor_base;
1056
1057     CastIterator() : Base(nullptr) {}
1058     CastIterator(StmtPtr *I) : Base(I) {}
1059
1060     typename Base::value_type operator*() const {
1061       return cast_or_null<T>(*this->I);
1062     }
1063   };
1064
1065   /// Const iterator for iterating over Stmt * arrays that contain only T *.
1066   template <typename T>
1067   using ConstCastIterator = CastIterator<T, const T *const, const Stmt *const>;
1068
1069   using ExprIterator = CastIterator<Expr>;
1070   using ConstExprIterator = ConstCastIterator<Expr>;
1071
1072 private:
1073   /// Whether statistic collection is enabled.
1074   static bool StatisticsEnabled;
1075
1076 protected:
1077   /// Construct an empty statement.
1078   explicit Stmt(StmtClass SC, EmptyShell) : Stmt(SC) {}
1079
1080 public:
1081   Stmt() = delete;
1082   Stmt(const Stmt &) = delete;
1083   Stmt(Stmt &&) = delete;
1084   Stmt &operator=(const Stmt &) = delete;
1085   Stmt &operator=(Stmt &&) = delete;
1086
1087   Stmt(StmtClass SC) {
1088     static_assert(sizeof(*this) <= 8,
1089                   "changing bitfields changed sizeof(Stmt)");
1090     static_assert(sizeof(*this) % alignof(void *) == 0,
1091                   "Insufficient alignment!");
1092     StmtBits.sClass = SC;
1093     StmtBits.IsOMPStructuredBlock = false;
1094     if (StatisticsEnabled) Stmt::addStmtClass(SC);
1095   }
1096
1097   StmtClass getStmtClass() const {
1098     return static_cast<StmtClass>(StmtBits.sClass);
1099   }
1100
1101   const char *getStmtClassName() const;
1102
1103   bool isOMPStructuredBlock() const { return StmtBits.IsOMPStructuredBlock; }
1104   void setIsOMPStructuredBlock(bool IsOMPStructuredBlock) {
1105     StmtBits.IsOMPStructuredBlock = IsOMPStructuredBlock;
1106   }
1107
1108   /// SourceLocation tokens are not useful in isolation - they are low level
1109   /// value objects created/interpreted by SourceManager. We assume AST
1110   /// clients will have a pointer to the respective SourceManager.
1111   SourceRange getSourceRange() const LLVM_READONLY;
1112   SourceLocation getBeginLoc() const LLVM_READONLY;
1113   SourceLocation getEndLoc() const LLVM_READONLY;
1114
1115   // global temp stats (until we have a per-module visitor)
1116   static void addStmtClass(const StmtClass s);
1117   static void EnableStatistics();
1118   static void PrintStats();
1119
1120   /// Dumps the specified AST fragment and all subtrees to
1121   /// \c llvm::errs().
1122   void dump() const;
1123   void dump(SourceManager &SM) const;
1124   void dump(raw_ostream &OS, SourceManager &SM) const;
1125   void dump(raw_ostream &OS) const;
1126
1127   /// \return Unique reproducible object identifier
1128   int64_t getID(const ASTContext &Context) const;
1129
1130   /// dumpColor - same as dump(), but forces color highlighting.
1131   void dumpColor() const;
1132
1133   /// dumpPretty/printPretty - These two methods do a "pretty print" of the AST
1134   /// back to its original source language syntax.
1135   void dumpPretty(const ASTContext &Context) const;
1136   void printPretty(raw_ostream &OS, PrinterHelper *Helper,
1137                    const PrintingPolicy &Policy, unsigned Indentation = 0,
1138                    StringRef NewlineSymbol = "\n",
1139                    const ASTContext *Context = nullptr) const;
1140
1141   /// Pretty-prints in JSON format.
1142   void printJson(raw_ostream &Out, PrinterHelper *Helper,
1143                  const PrintingPolicy &Policy, bool AddQuotes) const;
1144
1145   /// viewAST - Visualize an AST rooted at this Stmt* using GraphViz.  Only
1146   ///   works on systems with GraphViz (Mac OS X) or dot+gv installed.
1147   void viewAST() const;
1148
1149   /// Skip no-op (attributed, compound) container stmts and skip captured
1150   /// stmt at the top, if \a IgnoreCaptured is true.
1151   Stmt *IgnoreContainers(bool IgnoreCaptured = false);
1152   const Stmt *IgnoreContainers(bool IgnoreCaptured = false) const {
1153     return const_cast<Stmt *>(this)->IgnoreContainers(IgnoreCaptured);
1154   }
1155
1156   const Stmt *stripLabelLikeStatements() const;
1157   Stmt *stripLabelLikeStatements() {
1158     return const_cast<Stmt*>(
1159       const_cast<const Stmt*>(this)->stripLabelLikeStatements());
1160   }
1161
1162   /// Child Iterators: All subclasses must implement 'children'
1163   /// to permit easy iteration over the substatements/subexpessions of an
1164   /// AST node.  This permits easy iteration over all nodes in the AST.
1165   using child_iterator = StmtIterator;
1166   using const_child_iterator = ConstStmtIterator;
1167
1168   using child_range = llvm::iterator_range<child_iterator>;
1169   using const_child_range = llvm::iterator_range<const_child_iterator>;
1170
1171   child_range children();
1172
1173   const_child_range children() const {
1174     auto Children = const_cast<Stmt *>(this)->children();
1175     return const_child_range(Children.begin(), Children.end());
1176   }
1177
1178   child_iterator child_begin() { return children().begin(); }
1179   child_iterator child_end() { return children().end(); }
1180
1181   const_child_iterator child_begin() const { return children().begin(); }
1182   const_child_iterator child_end() const { return children().end(); }
1183
1184   /// Produce a unique representation of the given statement.
1185   ///
1186   /// \param ID once the profiling operation is complete, will contain
1187   /// the unique representation of the given statement.
1188   ///
1189   /// \param Context the AST context in which the statement resides
1190   ///
1191   /// \param Canonical whether the profile should be based on the canonical
1192   /// representation of this statement (e.g., where non-type template
1193   /// parameters are identified by index/level rather than their
1194   /// declaration pointers) or the exact representation of the statement as
1195   /// written in the source.
1196   void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
1197                bool Canonical) const;
1198
1199   /// Calculate a unique representation for a statement that is
1200   /// stable across compiler invocations.
1201   ///
1202   /// \param ID profile information will be stored in ID.
1203   ///
1204   /// \param Hash an ODRHash object which will be called where pointers would
1205   /// have been used in the Profile function.
1206   void ProcessODRHash(llvm::FoldingSetNodeID &ID, ODRHash& Hash) const;
1207 };
1208
1209 /// DeclStmt - Adaptor class for mixing declarations with statements and
1210 /// expressions. For example, CompoundStmt mixes statements, expressions
1211 /// and declarations (variables, types). Another example is ForStmt, where
1212 /// the first statement can be an expression or a declaration.
1213 class DeclStmt : public Stmt {
1214   DeclGroupRef DG;
1215   SourceLocation StartLoc, EndLoc;
1216
1217 public:
1218   DeclStmt(DeclGroupRef dg, SourceLocation startLoc, SourceLocation endLoc)
1219       : Stmt(DeclStmtClass), DG(dg), StartLoc(startLoc), EndLoc(endLoc) {}
1220
1221   /// Build an empty declaration statement.
1222   explicit DeclStmt(EmptyShell Empty) : Stmt(DeclStmtClass, Empty) {}
1223
1224   /// isSingleDecl - This method returns true if this DeclStmt refers
1225   /// to a single Decl.
1226   bool isSingleDecl() const { return DG.isSingleDecl(); }
1227
1228   const Decl *getSingleDecl() const { return DG.getSingleDecl(); }
1229   Decl *getSingleDecl() { return DG.getSingleDecl(); }
1230
1231   const DeclGroupRef getDeclGroup() const { return DG; }
1232   DeclGroupRef getDeclGroup() { return DG; }
1233   void setDeclGroup(DeclGroupRef DGR) { DG = DGR; }
1234
1235   void setStartLoc(SourceLocation L) { StartLoc = L; }
1236   SourceLocation getEndLoc() const { return EndLoc; }
1237   void setEndLoc(SourceLocation L) { EndLoc = L; }
1238
1239   SourceLocation getBeginLoc() const LLVM_READONLY { return StartLoc; }
1240
1241   static bool classof(const Stmt *T) {
1242     return T->getStmtClass() == DeclStmtClass;
1243   }
1244
1245   // Iterators over subexpressions.
1246   child_range children() {
1247     return child_range(child_iterator(DG.begin(), DG.end()),
1248                        child_iterator(DG.end(), DG.end()));
1249   }
1250
1251   const_child_range children() const {
1252     auto Children = const_cast<DeclStmt *>(this)->children();
1253     return const_child_range(Children);
1254   }
1255
1256   using decl_iterator = DeclGroupRef::iterator;
1257   using const_decl_iterator = DeclGroupRef::const_iterator;
1258   using decl_range = llvm::iterator_range<decl_iterator>;
1259   using decl_const_range = llvm::iterator_range<const_decl_iterator>;
1260
1261   decl_range decls() { return decl_range(decl_begin(), decl_end()); }
1262
1263   decl_const_range decls() const {
1264     return decl_const_range(decl_begin(), decl_end());
1265   }
1266
1267   decl_iterator decl_begin() { return DG.begin(); }
1268   decl_iterator decl_end() { return DG.end(); }
1269   const_decl_iterator decl_begin() const { return DG.begin(); }
1270   const_decl_iterator decl_end() const { return DG.end(); }
1271
1272   using reverse_decl_iterator = std::reverse_iterator<decl_iterator>;
1273
1274   reverse_decl_iterator decl_rbegin() {
1275     return reverse_decl_iterator(decl_end());
1276   }
1277
1278   reverse_decl_iterator decl_rend() {
1279     return reverse_decl_iterator(decl_begin());
1280   }
1281 };
1282
1283 /// NullStmt - This is the null statement ";": C99 6.8.3p3.
1284 ///
1285 class NullStmt : public Stmt {
1286 public:
1287   NullStmt(SourceLocation L, bool hasLeadingEmptyMacro = false)
1288       : Stmt(NullStmtClass) {
1289     NullStmtBits.HasLeadingEmptyMacro = hasLeadingEmptyMacro;
1290     setSemiLoc(L);
1291   }
1292
1293   /// Build an empty null statement.
1294   explicit NullStmt(EmptyShell Empty) : Stmt(NullStmtClass, Empty) {}
1295
1296   SourceLocation getSemiLoc() const { return NullStmtBits.SemiLoc; }
1297   void setSemiLoc(SourceLocation L) { NullStmtBits.SemiLoc = L; }
1298
1299   bool hasLeadingEmptyMacro() const {
1300     return NullStmtBits.HasLeadingEmptyMacro;
1301   }
1302
1303   SourceLocation getBeginLoc() const { return getSemiLoc(); }
1304   SourceLocation getEndLoc() const { return getSemiLoc(); }
1305
1306   static bool classof(const Stmt *T) {
1307     return T->getStmtClass() == NullStmtClass;
1308   }
1309
1310   child_range children() {
1311     return child_range(child_iterator(), child_iterator());
1312   }
1313
1314   const_child_range children() const {
1315     return const_child_range(const_child_iterator(), const_child_iterator());
1316   }
1317 };
1318
1319 /// CompoundStmt - This represents a group of statements like { stmt stmt }.
1320 class CompoundStmt final : public Stmt,
1321                            private llvm::TrailingObjects<CompoundStmt, Stmt *> {
1322   friend class ASTStmtReader;
1323   friend TrailingObjects;
1324
1325   /// The location of the closing "}". LBraceLoc is stored in CompoundStmtBits.
1326   SourceLocation RBraceLoc;
1327
1328   CompoundStmt(ArrayRef<Stmt *> Stmts, SourceLocation LB, SourceLocation RB);
1329   explicit CompoundStmt(EmptyShell Empty) : Stmt(CompoundStmtClass, Empty) {}
1330
1331   void setStmts(ArrayRef<Stmt *> Stmts);
1332
1333 public:
1334   static CompoundStmt *Create(const ASTContext &C, ArrayRef<Stmt *> Stmts,
1335                               SourceLocation LB, SourceLocation RB);
1336
1337   // Build an empty compound statement with a location.
1338   explicit CompoundStmt(SourceLocation Loc)
1339       : Stmt(CompoundStmtClass), RBraceLoc(Loc) {
1340     CompoundStmtBits.NumStmts = 0;
1341     CompoundStmtBits.LBraceLoc = Loc;
1342   }
1343
1344   // Build an empty compound statement.
1345   static CompoundStmt *CreateEmpty(const ASTContext &C, unsigned NumStmts);
1346
1347   bool body_empty() const { return CompoundStmtBits.NumStmts == 0; }
1348   unsigned size() const { return CompoundStmtBits.NumStmts; }
1349
1350   using body_iterator = Stmt **;
1351   using body_range = llvm::iterator_range<body_iterator>;
1352
1353   body_range body() { return body_range(body_begin(), body_end()); }
1354   body_iterator body_begin() { return getTrailingObjects<Stmt *>(); }
1355   body_iterator body_end() { return body_begin() + size(); }
1356   Stmt *body_front() { return !body_empty() ? body_begin()[0] : nullptr; }
1357
1358   Stmt *body_back() {
1359     return !body_empty() ? body_begin()[size() - 1] : nullptr;
1360   }
1361
1362   using const_body_iterator = Stmt *const *;
1363   using body_const_range = llvm::iterator_range<const_body_iterator>;
1364
1365   body_const_range body() const {
1366     return body_const_range(body_begin(), body_end());
1367   }
1368
1369   const_body_iterator body_begin() const {
1370     return getTrailingObjects<Stmt *>();
1371   }
1372
1373   const_body_iterator body_end() const { return body_begin() + size(); }
1374
1375   const Stmt *body_front() const {
1376     return !body_empty() ? body_begin()[0] : nullptr;
1377   }
1378
1379   const Stmt *body_back() const {
1380     return !body_empty() ? body_begin()[size() - 1] : nullptr;
1381   }
1382
1383   using reverse_body_iterator = std::reverse_iterator<body_iterator>;
1384
1385   reverse_body_iterator body_rbegin() {
1386     return reverse_body_iterator(body_end());
1387   }
1388
1389   reverse_body_iterator body_rend() {
1390     return reverse_body_iterator(body_begin());
1391   }
1392
1393   using const_reverse_body_iterator =
1394       std::reverse_iterator<const_body_iterator>;
1395
1396   const_reverse_body_iterator body_rbegin() const {
1397     return const_reverse_body_iterator(body_end());
1398   }
1399
1400   const_reverse_body_iterator body_rend() const {
1401     return const_reverse_body_iterator(body_begin());
1402   }
1403
1404   // Get the Stmt that StmtExpr would consider to be the result of this
1405   // compound statement. This is used by StmtExpr to properly emulate the GCC
1406   // compound expression extension, which ignores trailing NullStmts when
1407   // getting the result of the expression.
1408   // i.e. ({ 5;;; })
1409   //           ^^ ignored
1410   // If we don't find something that isn't a NullStmt, just return the last
1411   // Stmt.
1412   Stmt *getStmtExprResult() {
1413     for (auto *B : llvm::reverse(body())) {
1414       if (!isa<NullStmt>(B))
1415         return B;
1416     }
1417     return body_back();
1418   }
1419
1420   const Stmt *getStmtExprResult() const {
1421     return const_cast<CompoundStmt *>(this)->getStmtExprResult();
1422   }
1423
1424   SourceLocation getBeginLoc() const { return CompoundStmtBits.LBraceLoc; }
1425   SourceLocation getEndLoc() const { return RBraceLoc; }
1426
1427   SourceLocation getLBracLoc() const { return CompoundStmtBits.LBraceLoc; }
1428   SourceLocation getRBracLoc() const { return RBraceLoc; }
1429
1430   static bool classof(const Stmt *T) {
1431     return T->getStmtClass() == CompoundStmtClass;
1432   }
1433
1434   // Iterators
1435   child_range children() { return child_range(body_begin(), body_end()); }
1436
1437   const_child_range children() const {
1438     return const_child_range(body_begin(), body_end());
1439   }
1440 };
1441
1442 // SwitchCase is the base class for CaseStmt and DefaultStmt,
1443 class SwitchCase : public Stmt {
1444 protected:
1445   /// The location of the ":".
1446   SourceLocation ColonLoc;
1447
1448   // The location of the "case" or "default" keyword. Stored in SwitchCaseBits.
1449   // SourceLocation KeywordLoc;
1450
1451   /// A pointer to the following CaseStmt or DefaultStmt class,
1452   /// used by SwitchStmt.
1453   SwitchCase *NextSwitchCase = nullptr;
1454
1455   SwitchCase(StmtClass SC, SourceLocation KWLoc, SourceLocation ColonLoc)
1456       : Stmt(SC), ColonLoc(ColonLoc) {
1457     setKeywordLoc(KWLoc);
1458   }
1459
1460   SwitchCase(StmtClass SC, EmptyShell) : Stmt(SC) {}
1461
1462 public:
1463   const SwitchCase *getNextSwitchCase() const { return NextSwitchCase; }
1464   SwitchCase *getNextSwitchCase() { return NextSwitchCase; }
1465   void setNextSwitchCase(SwitchCase *SC) { NextSwitchCase = SC; }
1466
1467   SourceLocation getKeywordLoc() const { return SwitchCaseBits.KeywordLoc; }
1468   void setKeywordLoc(SourceLocation L) { SwitchCaseBits.KeywordLoc = L; }
1469   SourceLocation getColonLoc() const { return ColonLoc; }
1470   void setColonLoc(SourceLocation L) { ColonLoc = L; }
1471
1472   inline Stmt *getSubStmt();
1473   const Stmt *getSubStmt() const {
1474     return const_cast<SwitchCase *>(this)->getSubStmt();
1475   }
1476
1477   SourceLocation getBeginLoc() const { return getKeywordLoc(); }
1478   inline SourceLocation getEndLoc() const LLVM_READONLY;
1479
1480   static bool classof(const Stmt *T) {
1481     return T->getStmtClass() == CaseStmtClass ||
1482            T->getStmtClass() == DefaultStmtClass;
1483   }
1484 };
1485
1486 /// CaseStmt - Represent a case statement. It can optionally be a GNU case
1487 /// statement of the form LHS ... RHS representing a range of cases.
1488 class CaseStmt final
1489     : public SwitchCase,
1490       private llvm::TrailingObjects<CaseStmt, Stmt *, SourceLocation> {
1491   friend TrailingObjects;
1492
1493   // CaseStmt is followed by several trailing objects, some of which optional.
1494   // Note that it would be more convenient to put the optional trailing objects
1495   // at the end but this would impact children().
1496   // The trailing objects are in order:
1497   //
1498   // * A "Stmt *" for the LHS of the case statement. Always present.
1499   //
1500   // * A "Stmt *" for the RHS of the case statement. This is a GNU extension
1501   //   which allow ranges in cases statement of the form LHS ... RHS.
1502   //   Present if and only if caseStmtIsGNURange() is true.
1503   //
1504   // * A "Stmt *" for the substatement of the case statement. Always present.
1505   //
1506   // * A SourceLocation for the location of the ... if this is a case statement
1507   //   with a range. Present if and only if caseStmtIsGNURange() is true.
1508   enum { LhsOffset = 0, SubStmtOffsetFromRhs = 1 };
1509   enum { NumMandatoryStmtPtr = 2 };
1510
1511   unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
1512     return NumMandatoryStmtPtr + caseStmtIsGNURange();
1513   }
1514
1515   unsigned numTrailingObjects(OverloadToken<SourceLocation>) const {
1516     return caseStmtIsGNURange();
1517   }
1518
1519   unsigned lhsOffset() const { return LhsOffset; }
1520   unsigned rhsOffset() const { return LhsOffset + caseStmtIsGNURange(); }
1521   unsigned subStmtOffset() const { return rhsOffset() + SubStmtOffsetFromRhs; }
1522
1523   /// Build a case statement assuming that the storage for the
1524   /// trailing objects has been properly allocated.
1525   CaseStmt(Expr *lhs, Expr *rhs, SourceLocation caseLoc,
1526            SourceLocation ellipsisLoc, SourceLocation colonLoc)
1527       : SwitchCase(CaseStmtClass, caseLoc, colonLoc) {
1528     // Handle GNU case statements of the form LHS ... RHS.
1529     bool IsGNURange = rhs != nullptr;
1530     SwitchCaseBits.CaseStmtIsGNURange = IsGNURange;
1531     setLHS(lhs);
1532     setSubStmt(nullptr);
1533     if (IsGNURange) {
1534       setRHS(rhs);
1535       setEllipsisLoc(ellipsisLoc);
1536     }
1537   }
1538
1539   /// Build an empty switch case statement.
1540   explicit CaseStmt(EmptyShell Empty, bool CaseStmtIsGNURange)
1541       : SwitchCase(CaseStmtClass, Empty) {
1542     SwitchCaseBits.CaseStmtIsGNURange = CaseStmtIsGNURange;
1543   }
1544
1545 public:
1546   /// Build a case statement.
1547   static CaseStmt *Create(const ASTContext &Ctx, Expr *lhs, Expr *rhs,
1548                           SourceLocation caseLoc, SourceLocation ellipsisLoc,
1549                           SourceLocation colonLoc);
1550
1551   /// Build an empty case statement.
1552   static CaseStmt *CreateEmpty(const ASTContext &Ctx, bool CaseStmtIsGNURange);
1553
1554   /// True if this case statement is of the form case LHS ... RHS, which
1555   /// is a GNU extension. In this case the RHS can be obtained with getRHS()
1556   /// and the location of the ellipsis can be obtained with getEllipsisLoc().
1557   bool caseStmtIsGNURange() const { return SwitchCaseBits.CaseStmtIsGNURange; }
1558
1559   SourceLocation getCaseLoc() const { return getKeywordLoc(); }
1560   void setCaseLoc(SourceLocation L) { setKeywordLoc(L); }
1561
1562   /// Get the location of the ... in a case statement of the form LHS ... RHS.
1563   SourceLocation getEllipsisLoc() const {
1564     return caseStmtIsGNURange() ? *getTrailingObjects<SourceLocation>()
1565                                 : SourceLocation();
1566   }
1567
1568   /// Set the location of the ... in a case statement of the form LHS ... RHS.
1569   /// Assert that this case statement is of this form.
1570   void setEllipsisLoc(SourceLocation L) {
1571     assert(
1572         caseStmtIsGNURange() &&
1573         "setEllipsisLoc but this is not a case stmt of the form LHS ... RHS!");
1574     *getTrailingObjects<SourceLocation>() = L;
1575   }
1576
1577   Expr *getLHS() {
1578     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[lhsOffset()]);
1579   }
1580
1581   const Expr *getLHS() const {
1582     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[lhsOffset()]);
1583   }
1584
1585   void setLHS(Expr *Val) {
1586     getTrailingObjects<Stmt *>()[lhsOffset()] = reinterpret_cast<Stmt *>(Val);
1587   }
1588
1589   Expr *getRHS() {
1590     return caseStmtIsGNURange() ? reinterpret_cast<Expr *>(
1591                                       getTrailingObjects<Stmt *>()[rhsOffset()])
1592                                 : nullptr;
1593   }
1594
1595   const Expr *getRHS() const {
1596     return caseStmtIsGNURange() ? reinterpret_cast<Expr *>(
1597                                       getTrailingObjects<Stmt *>()[rhsOffset()])
1598                                 : nullptr;
1599   }
1600
1601   void setRHS(Expr *Val) {
1602     assert(caseStmtIsGNURange() &&
1603            "setRHS but this is not a case stmt of the form LHS ... RHS!");
1604     getTrailingObjects<Stmt *>()[rhsOffset()] = reinterpret_cast<Stmt *>(Val);
1605   }
1606
1607   Stmt *getSubStmt() { return getTrailingObjects<Stmt *>()[subStmtOffset()]; }
1608   const Stmt *getSubStmt() const {
1609     return getTrailingObjects<Stmt *>()[subStmtOffset()];
1610   }
1611
1612   void setSubStmt(Stmt *S) {
1613     getTrailingObjects<Stmt *>()[subStmtOffset()] = S;
1614   }
1615
1616   SourceLocation getBeginLoc() const { return getKeywordLoc(); }
1617   SourceLocation getEndLoc() const LLVM_READONLY {
1618     // Handle deeply nested case statements with iteration instead of recursion.
1619     const CaseStmt *CS = this;
1620     while (const auto *CS2 = dyn_cast<CaseStmt>(CS->getSubStmt()))
1621       CS = CS2;
1622
1623     return CS->getSubStmt()->getEndLoc();
1624   }
1625
1626   static bool classof(const Stmt *T) {
1627     return T->getStmtClass() == CaseStmtClass;
1628   }
1629
1630   // Iterators
1631   child_range children() {
1632     return child_range(getTrailingObjects<Stmt *>(),
1633                        getTrailingObjects<Stmt *>() +
1634                            numTrailingObjects(OverloadToken<Stmt *>()));
1635   }
1636
1637   const_child_range children() const {
1638     return const_child_range(getTrailingObjects<Stmt *>(),
1639                              getTrailingObjects<Stmt *>() +
1640                                  numTrailingObjects(OverloadToken<Stmt *>()));
1641   }
1642 };
1643
1644 class DefaultStmt : public SwitchCase {
1645   Stmt *SubStmt;
1646
1647 public:
1648   DefaultStmt(SourceLocation DL, SourceLocation CL, Stmt *substmt)
1649       : SwitchCase(DefaultStmtClass, DL, CL), SubStmt(substmt) {}
1650
1651   /// Build an empty default statement.
1652   explicit DefaultStmt(EmptyShell Empty)
1653       : SwitchCase(DefaultStmtClass, Empty) {}
1654
1655   Stmt *getSubStmt() { return SubStmt; }
1656   const Stmt *getSubStmt() const { return SubStmt; }
1657   void setSubStmt(Stmt *S) { SubStmt = S; }
1658
1659   SourceLocation getDefaultLoc() const { return getKeywordLoc(); }
1660   void setDefaultLoc(SourceLocation L) { setKeywordLoc(L); }
1661
1662   SourceLocation getBeginLoc() const { return getKeywordLoc(); }
1663   SourceLocation getEndLoc() const LLVM_READONLY {
1664     return SubStmt->getEndLoc();
1665   }
1666
1667   static bool classof(const Stmt *T) {
1668     return T->getStmtClass() == DefaultStmtClass;
1669   }
1670
1671   // Iterators
1672   child_range children() { return child_range(&SubStmt, &SubStmt + 1); }
1673
1674   const_child_range children() const {
1675     return const_child_range(&SubStmt, &SubStmt + 1);
1676   }
1677 };
1678
1679 SourceLocation SwitchCase::getEndLoc() const {
1680   if (const auto *CS = dyn_cast<CaseStmt>(this))
1681     return CS->getEndLoc();
1682   else if (const auto *DS = dyn_cast<DefaultStmt>(this))
1683     return DS->getEndLoc();
1684   llvm_unreachable("SwitchCase is neither a CaseStmt nor a DefaultStmt!");
1685 }
1686
1687 Stmt *SwitchCase::getSubStmt() {
1688   if (auto *CS = dyn_cast<CaseStmt>(this))
1689     return CS->getSubStmt();
1690   else if (auto *DS = dyn_cast<DefaultStmt>(this))
1691     return DS->getSubStmt();
1692   llvm_unreachable("SwitchCase is neither a CaseStmt nor a DefaultStmt!");
1693 }
1694
1695 /// Represents a statement that could possibly have a value and type. This
1696 /// covers expression-statements, as well as labels and attributed statements.
1697 ///
1698 /// Value statements have a special meaning when they are the last non-null
1699 /// statement in a GNU statement expression, where they determine the value
1700 /// of the statement expression.
1701 class ValueStmt : public Stmt {
1702 protected:
1703   using Stmt::Stmt;
1704
1705 public:
1706   const Expr *getExprStmt() const;
1707   Expr *getExprStmt() {
1708     const ValueStmt *ConstThis = this;
1709     return const_cast<Expr*>(ConstThis->getExprStmt());
1710   }
1711
1712   static bool classof(const Stmt *T) {
1713     return T->getStmtClass() >= firstValueStmtConstant &&
1714            T->getStmtClass() <= lastValueStmtConstant;
1715   }
1716 };
1717
1718 /// LabelStmt - Represents a label, which has a substatement.  For example:
1719 ///    foo: return;
1720 class LabelStmt : public ValueStmt {
1721   LabelDecl *TheDecl;
1722   Stmt *SubStmt;
1723
1724 public:
1725   /// Build a label statement.
1726   LabelStmt(SourceLocation IL, LabelDecl *D, Stmt *substmt)
1727       : ValueStmt(LabelStmtClass), TheDecl(D), SubStmt(substmt) {
1728     setIdentLoc(IL);
1729   }
1730
1731   /// Build an empty label statement.
1732   explicit LabelStmt(EmptyShell Empty) : ValueStmt(LabelStmtClass, Empty) {}
1733
1734   SourceLocation getIdentLoc() const { return LabelStmtBits.IdentLoc; }
1735   void setIdentLoc(SourceLocation L) { LabelStmtBits.IdentLoc = L; }
1736
1737   LabelDecl *getDecl() const { return TheDecl; }
1738   void setDecl(LabelDecl *D) { TheDecl = D; }
1739
1740   const char *getName() const;
1741   Stmt *getSubStmt() { return SubStmt; }
1742
1743   const Stmt *getSubStmt() const { return SubStmt; }
1744   void setSubStmt(Stmt *SS) { SubStmt = SS; }
1745
1746   SourceLocation getBeginLoc() const { return getIdentLoc(); }
1747   SourceLocation getEndLoc() const LLVM_READONLY { return SubStmt->getEndLoc();}
1748
1749   child_range children() { return child_range(&SubStmt, &SubStmt + 1); }
1750
1751   const_child_range children() const {
1752     return const_child_range(&SubStmt, &SubStmt + 1);
1753   }
1754
1755   static bool classof(const Stmt *T) {
1756     return T->getStmtClass() == LabelStmtClass;
1757   }
1758 };
1759
1760 /// Represents an attribute applied to a statement.
1761 ///
1762 /// Represents an attribute applied to a statement. For example:
1763 ///   [[omp::for(...)]] for (...) { ... }
1764 class AttributedStmt final
1765     : public ValueStmt,
1766       private llvm::TrailingObjects<AttributedStmt, const Attr *> {
1767   friend class ASTStmtReader;
1768   friend TrailingObjects;
1769
1770   Stmt *SubStmt;
1771
1772   AttributedStmt(SourceLocation Loc, ArrayRef<const Attr *> Attrs,
1773                  Stmt *SubStmt)
1774       : ValueStmt(AttributedStmtClass), SubStmt(SubStmt) {
1775     AttributedStmtBits.NumAttrs = Attrs.size();
1776     AttributedStmtBits.AttrLoc = Loc;
1777     std::copy(Attrs.begin(), Attrs.end(), getAttrArrayPtr());
1778   }
1779
1780   explicit AttributedStmt(EmptyShell Empty, unsigned NumAttrs)
1781       : ValueStmt(AttributedStmtClass, Empty) {
1782     AttributedStmtBits.NumAttrs = NumAttrs;
1783     AttributedStmtBits.AttrLoc = SourceLocation{};
1784     std::fill_n(getAttrArrayPtr(), NumAttrs, nullptr);
1785   }
1786
1787   const Attr *const *getAttrArrayPtr() const {
1788     return getTrailingObjects<const Attr *>();
1789   }
1790   const Attr **getAttrArrayPtr() { return getTrailingObjects<const Attr *>(); }
1791
1792 public:
1793   static AttributedStmt *Create(const ASTContext &C, SourceLocation Loc,
1794                                 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
1795
1796   // Build an empty attributed statement.
1797   static AttributedStmt *CreateEmpty(const ASTContext &C, unsigned NumAttrs);
1798
1799   SourceLocation getAttrLoc() const { return AttributedStmtBits.AttrLoc; }
1800   ArrayRef<const Attr *> getAttrs() const {
1801     return llvm::makeArrayRef(getAttrArrayPtr(), AttributedStmtBits.NumAttrs);
1802   }
1803
1804   Stmt *getSubStmt() { return SubStmt; }
1805   const Stmt *getSubStmt() const { return SubStmt; }
1806
1807   SourceLocation getBeginLoc() const { return getAttrLoc(); }
1808   SourceLocation getEndLoc() const LLVM_READONLY { return SubStmt->getEndLoc();}
1809
1810   child_range children() { return child_range(&SubStmt, &SubStmt + 1); }
1811
1812   const_child_range children() const {
1813     return const_child_range(&SubStmt, &SubStmt + 1);
1814   }
1815
1816   static bool classof(const Stmt *T) {
1817     return T->getStmtClass() == AttributedStmtClass;
1818   }
1819 };
1820
1821 /// IfStmt - This represents an if/then/else.
1822 class IfStmt final
1823     : public Stmt,
1824       private llvm::TrailingObjects<IfStmt, Stmt *, SourceLocation> {
1825   friend TrailingObjects;
1826
1827   // IfStmt is followed by several trailing objects, some of which optional.
1828   // Note that it would be more convenient to put the optional trailing
1829   // objects at then end but this would change the order of the children.
1830   // The trailing objects are in order:
1831   //
1832   // * A "Stmt *" for the init statement.
1833   //    Present if and only if hasInitStorage().
1834   //
1835   // * A "Stmt *" for the condition variable.
1836   //    Present if and only if hasVarStorage(). This is in fact a "DeclStmt *".
1837   //
1838   // * A "Stmt *" for the condition.
1839   //    Always present. This is in fact a "Expr *".
1840   //
1841   // * A "Stmt *" for the then statement.
1842   //    Always present.
1843   //
1844   // * A "Stmt *" for the else statement.
1845   //    Present if and only if hasElseStorage().
1846   //
1847   // * A "SourceLocation" for the location of the "else".
1848   //    Present if and only if hasElseStorage().
1849   enum { InitOffset = 0, ThenOffsetFromCond = 1, ElseOffsetFromCond = 2 };
1850   enum { NumMandatoryStmtPtr = 2 };
1851
1852   unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
1853     return NumMandatoryStmtPtr + hasElseStorage() + hasVarStorage() +
1854            hasInitStorage();
1855   }
1856
1857   unsigned numTrailingObjects(OverloadToken<SourceLocation>) const {
1858     return hasElseStorage();
1859   }
1860
1861   unsigned initOffset() const { return InitOffset; }
1862   unsigned varOffset() const { return InitOffset + hasInitStorage(); }
1863   unsigned condOffset() const {
1864     return InitOffset + hasInitStorage() + hasVarStorage();
1865   }
1866   unsigned thenOffset() const { return condOffset() + ThenOffsetFromCond; }
1867   unsigned elseOffset() const { return condOffset() + ElseOffsetFromCond; }
1868
1869   /// Build an if/then/else statement.
1870   IfStmt(const ASTContext &Ctx, SourceLocation IL, bool IsConstexpr, Stmt *Init,
1871          VarDecl *Var, Expr *Cond, Stmt *Then, SourceLocation EL, Stmt *Else);
1872
1873   /// Build an empty if/then/else statement.
1874   explicit IfStmt(EmptyShell Empty, bool HasElse, bool HasVar, bool HasInit);
1875
1876 public:
1877   /// Create an IfStmt.
1878   static IfStmt *Create(const ASTContext &Ctx, SourceLocation IL,
1879                         bool IsConstexpr, Stmt *Init, VarDecl *Var, Expr *Cond,
1880                         Stmt *Then, SourceLocation EL = SourceLocation(),
1881                         Stmt *Else = nullptr);
1882
1883   /// Create an empty IfStmt optionally with storage for an else statement,
1884   /// condition variable and init expression.
1885   static IfStmt *CreateEmpty(const ASTContext &Ctx, bool HasElse, bool HasVar,
1886                              bool HasInit);
1887
1888   /// True if this IfStmt has the storage for an init statement.
1889   bool hasInitStorage() const { return IfStmtBits.HasInit; }
1890
1891   /// True if this IfStmt has storage for a variable declaration.
1892   bool hasVarStorage() const { return IfStmtBits.HasVar; }
1893
1894   /// True if this IfStmt has storage for an else statement.
1895   bool hasElseStorage() const { return IfStmtBits.HasElse; }
1896
1897   Expr *getCond() {
1898     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
1899   }
1900
1901   const Expr *getCond() const {
1902     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
1903   }
1904
1905   void setCond(Expr *Cond) {
1906     getTrailingObjects<Stmt *>()[condOffset()] = reinterpret_cast<Stmt *>(Cond);
1907   }
1908
1909   Stmt *getThen() { return getTrailingObjects<Stmt *>()[thenOffset()]; }
1910   const Stmt *getThen() const {
1911     return getTrailingObjects<Stmt *>()[thenOffset()];
1912   }
1913
1914   void setThen(Stmt *Then) {
1915     getTrailingObjects<Stmt *>()[thenOffset()] = Then;
1916   }
1917
1918   Stmt *getElse() {
1919     return hasElseStorage() ? getTrailingObjects<Stmt *>()[elseOffset()]
1920                             : nullptr;
1921   }
1922
1923   const Stmt *getElse() const {
1924     return hasElseStorage() ? getTrailingObjects<Stmt *>()[elseOffset()]
1925                             : nullptr;
1926   }
1927
1928   void setElse(Stmt *Else) {
1929     assert(hasElseStorage() &&
1930            "This if statement has no storage for an else statement!");
1931     getTrailingObjects<Stmt *>()[elseOffset()] = Else;
1932   }
1933
1934   /// Retrieve the variable declared in this "if" statement, if any.
1935   ///
1936   /// In the following example, "x" is the condition variable.
1937   /// \code
1938   /// if (int x = foo()) {
1939   ///   printf("x is %d", x);
1940   /// }
1941   /// \endcode
1942   VarDecl *getConditionVariable();
1943   const VarDecl *getConditionVariable() const {
1944     return const_cast<IfStmt *>(this)->getConditionVariable();
1945   }
1946
1947   /// Set the condition variable for this if statement.
1948   /// The if statement must have storage for the condition variable.
1949   void setConditionVariable(const ASTContext &Ctx, VarDecl *V);
1950
1951   /// If this IfStmt has a condition variable, return the faux DeclStmt
1952   /// associated with the creation of that condition variable.
1953   DeclStmt *getConditionVariableDeclStmt() {
1954     return hasVarStorage() ? static_cast<DeclStmt *>(
1955                                  getTrailingObjects<Stmt *>()[varOffset()])
1956                            : nullptr;
1957   }
1958
1959   const DeclStmt *getConditionVariableDeclStmt() const {
1960     return hasVarStorage() ? static_cast<DeclStmt *>(
1961                                  getTrailingObjects<Stmt *>()[varOffset()])
1962                            : nullptr;
1963   }
1964
1965   Stmt *getInit() {
1966     return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
1967                             : nullptr;
1968   }
1969
1970   const Stmt *getInit() const {
1971     return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
1972                             : nullptr;
1973   }
1974
1975   void setInit(Stmt *Init) {
1976     assert(hasInitStorage() &&
1977            "This if statement has no storage for an init statement!");
1978     getTrailingObjects<Stmt *>()[initOffset()] = Init;
1979   }
1980
1981   SourceLocation getIfLoc() const { return IfStmtBits.IfLoc; }
1982   void setIfLoc(SourceLocation IfLoc) { IfStmtBits.IfLoc = IfLoc; }
1983
1984   SourceLocation getElseLoc() const {
1985     return hasElseStorage() ? *getTrailingObjects<SourceLocation>()
1986                             : SourceLocation();
1987   }
1988
1989   void setElseLoc(SourceLocation ElseLoc) {
1990     assert(hasElseStorage() &&
1991            "This if statement has no storage for an else statement!");
1992     *getTrailingObjects<SourceLocation>() = ElseLoc;
1993   }
1994
1995   bool isConstexpr() const { return IfStmtBits.IsConstexpr; }
1996   void setConstexpr(bool C) { IfStmtBits.IsConstexpr = C; }
1997
1998   bool isObjCAvailabilityCheck() const;
1999
2000   SourceLocation getBeginLoc() const { return getIfLoc(); }
2001   SourceLocation getEndLoc() const LLVM_READONLY {
2002     if (getElse())
2003       return getElse()->getEndLoc();
2004     return getThen()->getEndLoc();
2005   }
2006
2007   // Iterators over subexpressions.  The iterators will include iterating
2008   // over the initialization expression referenced by the condition variable.
2009   child_range children() {
2010     return child_range(getTrailingObjects<Stmt *>(),
2011                        getTrailingObjects<Stmt *>() +
2012                            numTrailingObjects(OverloadToken<Stmt *>()));
2013   }
2014
2015   const_child_range children() const {
2016     return const_child_range(getTrailingObjects<Stmt *>(),
2017                              getTrailingObjects<Stmt *>() +
2018                                  numTrailingObjects(OverloadToken<Stmt *>()));
2019   }
2020
2021   static bool classof(const Stmt *T) {
2022     return T->getStmtClass() == IfStmtClass;
2023   }
2024 };
2025
2026 /// SwitchStmt - This represents a 'switch' stmt.
2027 class SwitchStmt final : public Stmt,
2028                          private llvm::TrailingObjects<SwitchStmt, Stmt *> {
2029   friend TrailingObjects;
2030
2031   /// Points to a linked list of case and default statements.
2032   SwitchCase *FirstCase;
2033
2034   // SwitchStmt is followed by several trailing objects,
2035   // some of which optional. Note that it would be more convenient to
2036   // put the optional trailing objects at the end but this would change
2037   // the order in children().
2038   // The trailing objects are in order:
2039   //
2040   // * A "Stmt *" for the init statement.
2041   //    Present if and only if hasInitStorage().
2042   //
2043   // * A "Stmt *" for the condition variable.
2044   //    Present if and only if hasVarStorage(). This is in fact a "DeclStmt *".
2045   //
2046   // * A "Stmt *" for the condition.
2047   //    Always present. This is in fact an "Expr *".
2048   //
2049   // * A "Stmt *" for the body.
2050   //    Always present.
2051   enum { InitOffset = 0, BodyOffsetFromCond = 1 };
2052   enum { NumMandatoryStmtPtr = 2 };
2053
2054   unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
2055     return NumMandatoryStmtPtr + hasInitStorage() + hasVarStorage();
2056   }
2057
2058   unsigned initOffset() const { return InitOffset; }
2059   unsigned varOffset() const { return InitOffset + hasInitStorage(); }
2060   unsigned condOffset() const {
2061     return InitOffset + hasInitStorage() + hasVarStorage();
2062   }
2063   unsigned bodyOffset() const { return condOffset() + BodyOffsetFromCond; }
2064
2065   /// Build a switch statement.
2066   SwitchStmt(const ASTContext &Ctx, Stmt *Init, VarDecl *Var, Expr *Cond);
2067
2068   /// Build a empty switch statement.
2069   explicit SwitchStmt(EmptyShell Empty, bool HasInit, bool HasVar);
2070
2071 public:
2072   /// Create a switch statement.
2073   static SwitchStmt *Create(const ASTContext &Ctx, Stmt *Init, VarDecl *Var,
2074                             Expr *Cond);
2075
2076   /// Create an empty switch statement optionally with storage for
2077   /// an init expression and a condition variable.
2078   static SwitchStmt *CreateEmpty(const ASTContext &Ctx, bool HasInit,
2079                                  bool HasVar);
2080
2081   /// True if this SwitchStmt has storage for an init statement.
2082   bool hasInitStorage() const { return SwitchStmtBits.HasInit; }
2083
2084   /// True if this SwitchStmt has storage for a condition variable.
2085   bool hasVarStorage() const { return SwitchStmtBits.HasVar; }
2086
2087   Expr *getCond() {
2088     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
2089   }
2090
2091   const Expr *getCond() const {
2092     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
2093   }
2094
2095   void setCond(Expr *Cond) {
2096     getTrailingObjects<Stmt *>()[condOffset()] = reinterpret_cast<Stmt *>(Cond);
2097   }
2098
2099   Stmt *getBody() { return getTrailingObjects<Stmt *>()[bodyOffset()]; }
2100   const Stmt *getBody() const {
2101     return getTrailingObjects<Stmt *>()[bodyOffset()];
2102   }
2103
2104   void setBody(Stmt *Body) {
2105     getTrailingObjects<Stmt *>()[bodyOffset()] = Body;
2106   }
2107
2108   Stmt *getInit() {
2109     return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
2110                             : nullptr;
2111   }
2112
2113   const Stmt *getInit() const {
2114     return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
2115                             : nullptr;
2116   }
2117
2118   void setInit(Stmt *Init) {
2119     assert(hasInitStorage() &&
2120            "This switch statement has no storage for an init statement!");
2121     getTrailingObjects<Stmt *>()[initOffset()] = Init;
2122   }
2123
2124   /// Retrieve the variable declared in this "switch" statement, if any.
2125   ///
2126   /// In the following example, "x" is the condition variable.
2127   /// \code
2128   /// switch (int x = foo()) {
2129   ///   case 0: break;
2130   ///   // ...
2131   /// }
2132   /// \endcode
2133   VarDecl *getConditionVariable();
2134   const VarDecl *getConditionVariable() const {
2135     return const_cast<SwitchStmt *>(this)->getConditionVariable();
2136   }
2137
2138   /// Set the condition variable in this switch statement.
2139   /// The switch statement must have storage for it.
2140   void setConditionVariable(const ASTContext &Ctx, VarDecl *VD);
2141
2142   /// If this SwitchStmt has a condition variable, return the faux DeclStmt
2143   /// associated with the creation of that condition variable.
2144   DeclStmt *getConditionVariableDeclStmt() {
2145     return hasVarStorage() ? static_cast<DeclStmt *>(
2146                                  getTrailingObjects<Stmt *>()[varOffset()])
2147                            : nullptr;
2148   }
2149
2150   const DeclStmt *getConditionVariableDeclStmt() const {
2151     return hasVarStorage() ? static_cast<DeclStmt *>(
2152                                  getTrailingObjects<Stmt *>()[varOffset()])
2153                            : nullptr;
2154   }
2155
2156   SwitchCase *getSwitchCaseList() { return FirstCase; }
2157   const SwitchCase *getSwitchCaseList() const { return FirstCase; }
2158   void setSwitchCaseList(SwitchCase *SC) { FirstCase = SC; }
2159
2160   SourceLocation getSwitchLoc() const { return SwitchStmtBits.SwitchLoc; }
2161   void setSwitchLoc(SourceLocation L) { SwitchStmtBits.SwitchLoc = L; }
2162
2163   void setBody(Stmt *S, SourceLocation SL) {
2164     setBody(S);
2165     setSwitchLoc(SL);
2166   }
2167
2168   void addSwitchCase(SwitchCase *SC) {
2169     assert(!SC->getNextSwitchCase() &&
2170            "case/default already added to a switch");
2171     SC->setNextSwitchCase(FirstCase);
2172     FirstCase = SC;
2173   }
2174
2175   /// Set a flag in the SwitchStmt indicating that if the 'switch (X)' is a
2176   /// switch over an enum value then all cases have been explicitly covered.
2177   void setAllEnumCasesCovered() { SwitchStmtBits.AllEnumCasesCovered = true; }
2178
2179   /// Returns true if the SwitchStmt is a switch of an enum value and all cases
2180   /// have been explicitly covered.
2181   bool isAllEnumCasesCovered() const {
2182     return SwitchStmtBits.AllEnumCasesCovered;
2183   }
2184
2185   SourceLocation getBeginLoc() const { return getSwitchLoc(); }
2186   SourceLocation getEndLoc() const LLVM_READONLY {
2187     return getBody() ? getBody()->getEndLoc()
2188                      : reinterpret_cast<const Stmt *>(getCond())->getEndLoc();
2189   }
2190
2191   // Iterators
2192   child_range children() {
2193     return child_range(getTrailingObjects<Stmt *>(),
2194                        getTrailingObjects<Stmt *>() +
2195                            numTrailingObjects(OverloadToken<Stmt *>()));
2196   }
2197
2198   const_child_range children() const {
2199     return const_child_range(getTrailingObjects<Stmt *>(),
2200                              getTrailingObjects<Stmt *>() +
2201                                  numTrailingObjects(OverloadToken<Stmt *>()));
2202   }
2203
2204   static bool classof(const Stmt *T) {
2205     return T->getStmtClass() == SwitchStmtClass;
2206   }
2207 };
2208
2209 /// WhileStmt - This represents a 'while' stmt.
2210 class WhileStmt final : public Stmt,
2211                         private llvm::TrailingObjects<WhileStmt, Stmt *> {
2212   friend TrailingObjects;
2213
2214   // WhileStmt is followed by several trailing objects,
2215   // some of which optional. Note that it would be more
2216   // convenient to put the optional trailing object at the end
2217   // but this would affect children().
2218   // The trailing objects are in order:
2219   //
2220   // * A "Stmt *" for the condition variable.
2221   //    Present if and only if hasVarStorage(). This is in fact a "DeclStmt *".
2222   //
2223   // * A "Stmt *" for the condition.
2224   //    Always present. This is in fact an "Expr *".
2225   //
2226   // * A "Stmt *" for the body.
2227   //    Always present.
2228   //
2229   enum { VarOffset = 0, BodyOffsetFromCond = 1 };
2230   enum { NumMandatoryStmtPtr = 2 };
2231
2232   unsigned varOffset() const { return VarOffset; }
2233   unsigned condOffset() const { return VarOffset + hasVarStorage(); }
2234   unsigned bodyOffset() const { return condOffset() + BodyOffsetFromCond; }
2235
2236   unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
2237     return NumMandatoryStmtPtr + hasVarStorage();
2238   }
2239
2240   /// Build a while statement.
2241   WhileStmt(const ASTContext &Ctx, VarDecl *Var, Expr *Cond, Stmt *Body,
2242             SourceLocation WL);
2243
2244   /// Build an empty while statement.
2245   explicit WhileStmt(EmptyShell Empty, bool HasVar);
2246
2247 public:
2248   /// Create a while statement.
2249   static WhileStmt *Create(const ASTContext &Ctx, VarDecl *Var, Expr *Cond,
2250                            Stmt *Body, SourceLocation WL);
2251
2252   /// Create an empty while statement optionally with storage for
2253   /// a condition variable.
2254   static WhileStmt *CreateEmpty(const ASTContext &Ctx, bool HasVar);
2255
2256   /// True if this WhileStmt has storage for a condition variable.
2257   bool hasVarStorage() const { return WhileStmtBits.HasVar; }
2258
2259   Expr *getCond() {
2260     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
2261   }
2262
2263   const Expr *getCond() const {
2264     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
2265   }
2266
2267   void setCond(Expr *Cond) {
2268     getTrailingObjects<Stmt *>()[condOffset()] = reinterpret_cast<Stmt *>(Cond);
2269   }
2270
2271   Stmt *getBody() { return getTrailingObjects<Stmt *>()[bodyOffset()]; }
2272   const Stmt *getBody() const {
2273     return getTrailingObjects<Stmt *>()[bodyOffset()];
2274   }
2275
2276   void setBody(Stmt *Body) {
2277     getTrailingObjects<Stmt *>()[bodyOffset()] = Body;
2278   }
2279
2280   /// Retrieve the variable declared in this "while" statement, if any.
2281   ///
2282   /// In the following example, "x" is the condition variable.
2283   /// \code
2284   /// while (int x = random()) {
2285   ///   // ...
2286   /// }
2287   /// \endcode
2288   VarDecl *getConditionVariable();
2289   const VarDecl *getConditionVariable() const {
2290     return const_cast<WhileStmt *>(this)->getConditionVariable();
2291   }
2292
2293   /// Set the condition variable of this while statement.
2294   /// The while statement must have storage for it.
2295   void setConditionVariable(const ASTContext &Ctx, VarDecl *V);
2296
2297   /// If this WhileStmt has a condition variable, return the faux DeclStmt
2298   /// associated with the creation of that condition variable.
2299   DeclStmt *getConditionVariableDeclStmt() {
2300     return hasVarStorage() ? static_cast<DeclStmt *>(
2301                                  getTrailingObjects<Stmt *>()[varOffset()])
2302                            : nullptr;
2303   }
2304
2305   const DeclStmt *getConditionVariableDeclStmt() const {
2306     return hasVarStorage() ? static_cast<DeclStmt *>(
2307                                  getTrailingObjects<Stmt *>()[varOffset()])
2308                            : nullptr;
2309   }
2310
2311   SourceLocation getWhileLoc() const { return WhileStmtBits.WhileLoc; }
2312   void setWhileLoc(SourceLocation L) { WhileStmtBits.WhileLoc = L; }
2313
2314   SourceLocation getBeginLoc() const { return getWhileLoc(); }
2315   SourceLocation getEndLoc() const LLVM_READONLY {
2316     return getBody()->getEndLoc();
2317   }
2318
2319   static bool classof(const Stmt *T) {
2320     return T->getStmtClass() == WhileStmtClass;
2321   }
2322
2323   // Iterators
2324   child_range children() {
2325     return child_range(getTrailingObjects<Stmt *>(),
2326                        getTrailingObjects<Stmt *>() +
2327                            numTrailingObjects(OverloadToken<Stmt *>()));
2328   }
2329
2330   const_child_range children() const {
2331     return const_child_range(getTrailingObjects<Stmt *>(),
2332                              getTrailingObjects<Stmt *>() +
2333                                  numTrailingObjects(OverloadToken<Stmt *>()));
2334   }
2335 };
2336
2337 /// DoStmt - This represents a 'do/while' stmt.
2338 class DoStmt : public Stmt {
2339   enum { BODY, COND, END_EXPR };
2340   Stmt *SubExprs[END_EXPR];
2341   SourceLocation WhileLoc;
2342   SourceLocation RParenLoc; // Location of final ')' in do stmt condition.
2343
2344 public:
2345   DoStmt(Stmt *Body, Expr *Cond, SourceLocation DL, SourceLocation WL,
2346          SourceLocation RP)
2347       : Stmt(DoStmtClass), WhileLoc(WL), RParenLoc(RP) {
2348     setCond(Cond);
2349     setBody(Body);
2350     setDoLoc(DL);
2351   }
2352
2353   /// Build an empty do-while statement.
2354   explicit DoStmt(EmptyShell Empty) : Stmt(DoStmtClass, Empty) {}
2355
2356   Expr *getCond() { return reinterpret_cast<Expr *>(SubExprs[COND]); }
2357   const Expr *getCond() const {
2358     return reinterpret_cast<Expr *>(SubExprs[COND]);
2359   }
2360
2361   void setCond(Expr *Cond) { SubExprs[COND] = reinterpret_cast<Stmt *>(Cond); }
2362
2363   Stmt *getBody() { return SubExprs[BODY]; }
2364   const Stmt *getBody() const { return SubExprs[BODY]; }
2365   void setBody(Stmt *Body) { SubExprs[BODY] = Body; }
2366
2367   SourceLocation getDoLoc() const { return DoStmtBits.DoLoc; }
2368   void setDoLoc(SourceLocation L) { DoStmtBits.DoLoc = L; }
2369   SourceLocation getWhileLoc() const { return WhileLoc; }
2370   void setWhileLoc(SourceLocation L) { WhileLoc = L; }
2371   SourceLocation getRParenLoc() const { return RParenLoc; }
2372   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
2373
2374   SourceLocation getBeginLoc() const { return getDoLoc(); }
2375   SourceLocation getEndLoc() const { return getRParenLoc(); }
2376
2377   static bool classof(const Stmt *T) {
2378     return T->getStmtClass() == DoStmtClass;
2379   }
2380
2381   // Iterators
2382   child_range children() {
2383     return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2384   }
2385
2386   const_child_range children() const {
2387     return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2388   }
2389 };
2390
2391 /// ForStmt - This represents a 'for (init;cond;inc)' stmt.  Note that any of
2392 /// the init/cond/inc parts of the ForStmt will be null if they were not
2393 /// specified in the source.
2394 class ForStmt : public Stmt {
2395   enum { INIT, CONDVAR, COND, INC, BODY, END_EXPR };
2396   Stmt* SubExprs[END_EXPR]; // SubExprs[INIT] is an expression or declstmt.
2397   SourceLocation LParenLoc, RParenLoc;
2398
2399 public:
2400   ForStmt(const ASTContext &C, Stmt *Init, Expr *Cond, VarDecl *condVar,
2401           Expr *Inc, Stmt *Body, SourceLocation FL, SourceLocation LP,
2402           SourceLocation RP);
2403
2404   /// Build an empty for statement.
2405   explicit ForStmt(EmptyShell Empty) : Stmt(ForStmtClass, Empty) {}
2406
2407   Stmt *getInit() { return SubExprs[INIT]; }
2408
2409   /// Retrieve the variable declared in this "for" statement, if any.
2410   ///
2411   /// In the following example, "y" is the condition variable.
2412   /// \code
2413   /// for (int x = random(); int y = mangle(x); ++x) {
2414   ///   // ...
2415   /// }
2416   /// \endcode
2417   VarDecl *getConditionVariable() const;
2418   void setConditionVariable(const ASTContext &C, VarDecl *V);
2419
2420   /// If this ForStmt has a condition variable, return the faux DeclStmt
2421   /// associated with the creation of that condition variable.
2422   const DeclStmt *getConditionVariableDeclStmt() const {
2423     return reinterpret_cast<DeclStmt*>(SubExprs[CONDVAR]);
2424   }
2425
2426   Expr *getCond() { return reinterpret_cast<Expr*>(SubExprs[COND]); }
2427   Expr *getInc()  { return reinterpret_cast<Expr*>(SubExprs[INC]); }
2428   Stmt *getBody() { return SubExprs[BODY]; }
2429
2430   const Stmt *getInit() const { return SubExprs[INIT]; }
2431   const Expr *getCond() const { return reinterpret_cast<Expr*>(SubExprs[COND]);}
2432   const Expr *getInc()  const { return reinterpret_cast<Expr*>(SubExprs[INC]); }
2433   const Stmt *getBody() const { return SubExprs[BODY]; }
2434
2435   void setInit(Stmt *S) { SubExprs[INIT] = S; }
2436   void setCond(Expr *E) { SubExprs[COND] = reinterpret_cast<Stmt*>(E); }
2437   void setInc(Expr *E) { SubExprs[INC] = reinterpret_cast<Stmt*>(E); }
2438   void setBody(Stmt *S) { SubExprs[BODY] = S; }
2439
2440   SourceLocation getForLoc() const { return ForStmtBits.ForLoc; }
2441   void setForLoc(SourceLocation L) { ForStmtBits.ForLoc = L; }
2442   SourceLocation getLParenLoc() const { return LParenLoc; }
2443   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
2444   SourceLocation getRParenLoc() const { return RParenLoc; }
2445   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
2446
2447   SourceLocation getBeginLoc() const { return getForLoc(); }
2448   SourceLocation getEndLoc() const { return getBody()->getEndLoc(); }
2449
2450   static bool classof(const Stmt *T) {
2451     return T->getStmtClass() == ForStmtClass;
2452   }
2453
2454   // Iterators
2455   child_range children() {
2456     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
2457   }
2458
2459   const_child_range children() const {
2460     return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2461   }
2462 };
2463
2464 /// GotoStmt - This represents a direct goto.
2465 class GotoStmt : public Stmt {
2466   LabelDecl *Label;
2467   SourceLocation LabelLoc;
2468
2469 public:
2470   GotoStmt(LabelDecl *label, SourceLocation GL, SourceLocation LL)
2471       : Stmt(GotoStmtClass), Label(label), LabelLoc(LL) {
2472     setGotoLoc(GL);
2473   }
2474
2475   /// Build an empty goto statement.
2476   explicit GotoStmt(EmptyShell Empty) : Stmt(GotoStmtClass, Empty) {}
2477
2478   LabelDecl *getLabel() const { return Label; }
2479   void setLabel(LabelDecl *D) { Label = D; }
2480
2481   SourceLocation getGotoLoc() const { return GotoStmtBits.GotoLoc; }
2482   void setGotoLoc(SourceLocation L) { GotoStmtBits.GotoLoc = L; }
2483   SourceLocation getLabelLoc() const { return LabelLoc; }
2484   void setLabelLoc(SourceLocation L) { LabelLoc = L; }
2485
2486   SourceLocation getBeginLoc() const { return getGotoLoc(); }
2487   SourceLocation getEndLoc() const { return getLabelLoc(); }
2488
2489   static bool classof(const Stmt *T) {
2490     return T->getStmtClass() == GotoStmtClass;
2491   }
2492
2493   // Iterators
2494   child_range children() {
2495     return child_range(child_iterator(), child_iterator());
2496   }
2497
2498   const_child_range children() const {
2499     return const_child_range(const_child_iterator(), const_child_iterator());
2500   }
2501 };
2502
2503 /// IndirectGotoStmt - This represents an indirect goto.
2504 class IndirectGotoStmt : public Stmt {
2505   SourceLocation StarLoc;
2506   Stmt *Target;
2507
2508 public:
2509   IndirectGotoStmt(SourceLocation gotoLoc, SourceLocation starLoc, Expr *target)
2510       : Stmt(IndirectGotoStmtClass), StarLoc(starLoc) {
2511     setTarget(target);
2512     setGotoLoc(gotoLoc);
2513   }
2514
2515   /// Build an empty indirect goto statement.
2516   explicit IndirectGotoStmt(EmptyShell Empty)
2517       : Stmt(IndirectGotoStmtClass, Empty) {}
2518
2519   void setGotoLoc(SourceLocation L) { GotoStmtBits.GotoLoc = L; }
2520   SourceLocation getGotoLoc() const { return GotoStmtBits.GotoLoc; }
2521   void setStarLoc(SourceLocation L) { StarLoc = L; }
2522   SourceLocation getStarLoc() const { return StarLoc; }
2523
2524   Expr *getTarget() { return reinterpret_cast<Expr *>(Target); }
2525   const Expr *getTarget() const {
2526     return reinterpret_cast<const Expr *>(Target);
2527   }
2528   void setTarget(Expr *E) { Target = reinterpret_cast<Stmt *>(E); }
2529
2530   /// getConstantTarget - Returns the fixed target of this indirect
2531   /// goto, if one exists.
2532   LabelDecl *getConstantTarget();
2533   const LabelDecl *getConstantTarget() const {
2534     return const_cast<IndirectGotoStmt *>(this)->getConstantTarget();
2535   }
2536
2537   SourceLocation getBeginLoc() const { return getGotoLoc(); }
2538   SourceLocation getEndLoc() const LLVM_READONLY { return Target->getEndLoc(); }
2539
2540   static bool classof(const Stmt *T) {
2541     return T->getStmtClass() == IndirectGotoStmtClass;
2542   }
2543
2544   // Iterators
2545   child_range children() { return child_range(&Target, &Target + 1); }
2546
2547   const_child_range children() const {
2548     return const_child_range(&Target, &Target + 1);
2549   }
2550 };
2551
2552 /// ContinueStmt - This represents a continue.
2553 class ContinueStmt : public Stmt {
2554 public:
2555   ContinueStmt(SourceLocation CL) : Stmt(ContinueStmtClass) {
2556     setContinueLoc(CL);
2557   }
2558
2559   /// Build an empty continue statement.
2560   explicit ContinueStmt(EmptyShell Empty) : Stmt(ContinueStmtClass, Empty) {}
2561
2562   SourceLocation getContinueLoc() const { return ContinueStmtBits.ContinueLoc; }
2563   void setContinueLoc(SourceLocation L) { ContinueStmtBits.ContinueLoc = L; }
2564
2565   SourceLocation getBeginLoc() const { return getContinueLoc(); }
2566   SourceLocation getEndLoc() const { return getContinueLoc(); }
2567
2568   static bool classof(const Stmt *T) {
2569     return T->getStmtClass() == ContinueStmtClass;
2570   }
2571
2572   // Iterators
2573   child_range children() {
2574     return child_range(child_iterator(), child_iterator());
2575   }
2576
2577   const_child_range children() const {
2578     return const_child_range(const_child_iterator(), const_child_iterator());
2579   }
2580 };
2581
2582 /// BreakStmt - This represents a break.
2583 class BreakStmt : public Stmt {
2584 public:
2585   BreakStmt(SourceLocation BL) : Stmt(BreakStmtClass) {
2586     setBreakLoc(BL);
2587   }
2588
2589   /// Build an empty break statement.
2590   explicit BreakStmt(EmptyShell Empty) : Stmt(BreakStmtClass, Empty) {}
2591
2592   SourceLocation getBreakLoc() const { return BreakStmtBits.BreakLoc; }
2593   void setBreakLoc(SourceLocation L) { BreakStmtBits.BreakLoc = L; }
2594
2595   SourceLocation getBeginLoc() const { return getBreakLoc(); }
2596   SourceLocation getEndLoc() const { return getBreakLoc(); }
2597
2598   static bool classof(const Stmt *T) {
2599     return T->getStmtClass() == BreakStmtClass;
2600   }
2601
2602   // Iterators
2603   child_range children() {
2604     return child_range(child_iterator(), child_iterator());
2605   }
2606
2607   const_child_range children() const {
2608     return const_child_range(const_child_iterator(), const_child_iterator());
2609   }
2610 };
2611
2612 /// ReturnStmt - This represents a return, optionally of an expression:
2613 ///   return;
2614 ///   return 4;
2615 ///
2616 /// Note that GCC allows return with no argument in a function declared to
2617 /// return a value, and it allows returning a value in functions declared to
2618 /// return void.  We explicitly model this in the AST, which means you can't
2619 /// depend on the return type of the function and the presence of an argument.
2620 class ReturnStmt final
2621     : public Stmt,
2622       private llvm::TrailingObjects<ReturnStmt, const VarDecl *> {
2623   friend TrailingObjects;
2624
2625   /// The return expression.
2626   Stmt *RetExpr;
2627
2628   // ReturnStmt is followed optionally by a trailing "const VarDecl *"
2629   // for the NRVO candidate. Present if and only if hasNRVOCandidate().
2630
2631   /// True if this ReturnStmt has storage for an NRVO candidate.
2632   bool hasNRVOCandidate() const { return ReturnStmtBits.HasNRVOCandidate; }
2633
2634   unsigned numTrailingObjects(OverloadToken<const VarDecl *>) const {
2635     return hasNRVOCandidate();
2636   }
2637
2638   /// Build a return statement.
2639   ReturnStmt(SourceLocation RL, Expr *E, const VarDecl *NRVOCandidate);
2640
2641   /// Build an empty return statement.
2642   explicit ReturnStmt(EmptyShell Empty, bool HasNRVOCandidate);
2643
2644 public:
2645   /// Create a return statement.
2646   static ReturnStmt *Create(const ASTContext &Ctx, SourceLocation RL, Expr *E,
2647                             const VarDecl *NRVOCandidate);
2648
2649   /// Create an empty return statement, optionally with
2650   /// storage for an NRVO candidate.
2651   static ReturnStmt *CreateEmpty(const ASTContext &Ctx, bool HasNRVOCandidate);
2652
2653   Expr *getRetValue() { return reinterpret_cast<Expr *>(RetExpr); }
2654   const Expr *getRetValue() const { return reinterpret_cast<Expr *>(RetExpr); }
2655   void setRetValue(Expr *E) { RetExpr = reinterpret_cast<Stmt *>(E); }
2656
2657   /// Retrieve the variable that might be used for the named return
2658   /// value optimization.
2659   ///
2660   /// The optimization itself can only be performed if the variable is
2661   /// also marked as an NRVO object.
2662   const VarDecl *getNRVOCandidate() const {
2663     return hasNRVOCandidate() ? *getTrailingObjects<const VarDecl *>()
2664                               : nullptr;
2665   }
2666
2667   /// Set the variable that might be used for the named return value
2668   /// optimization. The return statement must have storage for it,
2669   /// which is the case if and only if hasNRVOCandidate() is true.
2670   void setNRVOCandidate(const VarDecl *Var) {
2671     assert(hasNRVOCandidate() &&
2672            "This return statement has no storage for an NRVO candidate!");
2673     *getTrailingObjects<const VarDecl *>() = Var;
2674   }
2675
2676   SourceLocation getReturnLoc() const { return ReturnStmtBits.RetLoc; }
2677   void setReturnLoc(SourceLocation L) { ReturnStmtBits.RetLoc = L; }
2678
2679   SourceLocation getBeginLoc() const { return getReturnLoc(); }
2680   SourceLocation getEndLoc() const LLVM_READONLY {
2681     return RetExpr ? RetExpr->getEndLoc() : getReturnLoc();
2682   }
2683
2684   static bool classof(const Stmt *T) {
2685     return T->getStmtClass() == ReturnStmtClass;
2686   }
2687
2688   // Iterators
2689   child_range children() {
2690     if (RetExpr)
2691       return child_range(&RetExpr, &RetExpr + 1);
2692     return child_range(child_iterator(), child_iterator());
2693   }
2694
2695   const_child_range children() const {
2696     if (RetExpr)
2697       return const_child_range(&RetExpr, &RetExpr + 1);
2698     return const_child_range(const_child_iterator(), const_child_iterator());
2699   }
2700 };
2701
2702 /// AsmStmt is the base class for GCCAsmStmt and MSAsmStmt.
2703 class AsmStmt : public Stmt {
2704 protected:
2705   friend class ASTStmtReader;
2706
2707   SourceLocation AsmLoc;
2708
2709   /// True if the assembly statement does not have any input or output
2710   /// operands.
2711   bool IsSimple;
2712
2713   /// If true, treat this inline assembly as having side effects.
2714   /// This assembly statement should not be optimized, deleted or moved.
2715   bool IsVolatile;
2716
2717   unsigned NumOutputs;
2718   unsigned NumInputs;
2719   unsigned NumClobbers;
2720
2721   Stmt **Exprs = nullptr;
2722
2723   AsmStmt(StmtClass SC, SourceLocation asmloc, bool issimple, bool isvolatile,
2724           unsigned numoutputs, unsigned numinputs, unsigned numclobbers)
2725       : Stmt (SC), AsmLoc(asmloc), IsSimple(issimple), IsVolatile(isvolatile),
2726         NumOutputs(numoutputs), NumInputs(numinputs),
2727         NumClobbers(numclobbers) {}
2728
2729 public:
2730   /// Build an empty inline-assembly statement.
2731   explicit AsmStmt(StmtClass SC, EmptyShell Empty) : Stmt(SC, Empty) {}
2732
2733   SourceLocation getAsmLoc() const { return AsmLoc; }
2734   void setAsmLoc(SourceLocation L) { AsmLoc = L; }
2735
2736   bool isSimple() const { return IsSimple; }
2737   void setSimple(bool V) { IsSimple = V; }
2738
2739   bool isVolatile() const { return IsVolatile; }
2740   void setVolatile(bool V) { IsVolatile = V; }
2741
2742   SourceLocation getBeginLoc() const LLVM_READONLY { return {}; }
2743   SourceLocation getEndLoc() const LLVM_READONLY { return {}; }
2744
2745   //===--- Asm String Analysis ---===//
2746
2747   /// Assemble final IR asm string.
2748   std::string generateAsmString(const ASTContext &C) const;
2749
2750   //===--- Output operands ---===//
2751
2752   unsigned getNumOutputs() const { return NumOutputs; }
2753
2754   /// getOutputConstraint - Return the constraint string for the specified
2755   /// output operand.  All output constraints are known to be non-empty (either
2756   /// '=' or '+').
2757   StringRef getOutputConstraint(unsigned i) const;
2758
2759   /// isOutputPlusConstraint - Return true if the specified output constraint
2760   /// is a "+" constraint (which is both an input and an output) or false if it
2761   /// is an "=" constraint (just an output).
2762   bool isOutputPlusConstraint(unsigned i) const {
2763     return getOutputConstraint(i)[0] == '+';
2764   }
2765
2766   const Expr *getOutputExpr(unsigned i) const;
2767
2768   /// getNumPlusOperands - Return the number of output operands that have a "+"
2769   /// constraint.
2770   unsigned getNumPlusOperands() const;
2771
2772   //===--- Input operands ---===//
2773
2774   unsigned getNumInputs() const { return NumInputs; }
2775
2776   /// getInputConstraint - Return the specified input constraint.  Unlike output
2777   /// constraints, these can be empty.
2778   StringRef getInputConstraint(unsigned i) const;
2779
2780   const Expr *getInputExpr(unsigned i) const;
2781
2782   //===--- Other ---===//
2783
2784   unsigned getNumClobbers() const { return NumClobbers; }
2785   StringRef getClobber(unsigned i) const;
2786
2787   static bool classof(const Stmt *T) {
2788     return T->getStmtClass() == GCCAsmStmtClass ||
2789       T->getStmtClass() == MSAsmStmtClass;
2790   }
2791
2792   // Input expr iterators.
2793
2794   using inputs_iterator = ExprIterator;
2795   using const_inputs_iterator = ConstExprIterator;
2796   using inputs_range = llvm::iterator_range<inputs_iterator>;
2797   using inputs_const_range = llvm::iterator_range<const_inputs_iterator>;
2798
2799   inputs_iterator begin_inputs() {
2800     return &Exprs[0] + NumOutputs;
2801   }
2802
2803   inputs_iterator end_inputs() {
2804     return &Exprs[0] + NumOutputs + NumInputs;
2805   }
2806
2807   inputs_range inputs() { return inputs_range(begin_inputs(), end_inputs()); }
2808
2809   const_inputs_iterator begin_inputs() const {
2810     return &Exprs[0] + NumOutputs;
2811   }
2812
2813   const_inputs_iterator end_inputs() const {
2814     return &Exprs[0] + NumOutputs + NumInputs;
2815   }
2816
2817   inputs_const_range inputs() const {
2818     return inputs_const_range(begin_inputs(), end_inputs());
2819   }
2820
2821   // Output expr iterators.
2822
2823   using outputs_iterator = ExprIterator;
2824   using const_outputs_iterator = ConstExprIterator;
2825   using outputs_range = llvm::iterator_range<outputs_iterator>;
2826   using outputs_const_range = llvm::iterator_range<const_outputs_iterator>;
2827
2828   outputs_iterator begin_outputs() {
2829     return &Exprs[0];
2830   }
2831
2832   outputs_iterator end_outputs() {
2833     return &Exprs[0] + NumOutputs;
2834   }
2835
2836   outputs_range outputs() {
2837     return outputs_range(begin_outputs(), end_outputs());
2838   }
2839
2840   const_outputs_iterator begin_outputs() const {
2841     return &Exprs[0];
2842   }
2843
2844   const_outputs_iterator end_outputs() const {
2845     return &Exprs[0] + NumOutputs;
2846   }
2847
2848   outputs_const_range outputs() const {
2849     return outputs_const_range(begin_outputs(), end_outputs());
2850   }
2851
2852   child_range children() {
2853     return child_range(&Exprs[0], &Exprs[0] + NumOutputs + NumInputs);
2854   }
2855
2856   const_child_range children() const {
2857     return const_child_range(&Exprs[0], &Exprs[0] + NumOutputs + NumInputs);
2858   }
2859 };
2860
2861 /// This represents a GCC inline-assembly statement extension.
2862 class GCCAsmStmt : public AsmStmt {
2863   friend class ASTStmtReader;
2864
2865   SourceLocation RParenLoc;
2866   StringLiteral *AsmStr;
2867
2868   // FIXME: If we wanted to, we could allocate all of these in one big array.
2869   StringLiteral **Constraints = nullptr;
2870   StringLiteral **Clobbers = nullptr;
2871   IdentifierInfo **Names = nullptr;
2872   unsigned NumLabels = 0;
2873
2874 public:
2875   GCCAsmStmt(const ASTContext &C, SourceLocation asmloc, bool issimple,
2876              bool isvolatile, unsigned numoutputs, unsigned numinputs,
2877              IdentifierInfo **names, StringLiteral **constraints, Expr **exprs,
2878              StringLiteral *asmstr, unsigned numclobbers,
2879              StringLiteral **clobbers, unsigned numlabels,
2880              SourceLocation rparenloc);
2881
2882   /// Build an empty inline-assembly statement.
2883   explicit GCCAsmStmt(EmptyShell Empty) : AsmStmt(GCCAsmStmtClass, Empty) {}
2884
2885   SourceLocation getRParenLoc() const { return RParenLoc; }
2886   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
2887
2888   //===--- Asm String Analysis ---===//
2889
2890   const StringLiteral *getAsmString() const { return AsmStr; }
2891   StringLiteral *getAsmString() { return AsmStr; }
2892   void setAsmString(StringLiteral *E) { AsmStr = E; }
2893
2894   /// AsmStringPiece - this is part of a decomposed asm string specification
2895   /// (for use with the AnalyzeAsmString function below).  An asm string is
2896   /// considered to be a concatenation of these parts.
2897   class AsmStringPiece {
2898   public:
2899     enum Kind {
2900       String,  // String in .ll asm string form, "$" -> "$$" and "%%" -> "%".
2901       Operand  // Operand reference, with optional modifier %c4.
2902     };
2903
2904   private:
2905     Kind MyKind;
2906     std::string Str;
2907     unsigned OperandNo;
2908
2909     // Source range for operand references.
2910     CharSourceRange Range;
2911
2912   public:
2913     AsmStringPiece(const std::string &S) : MyKind(String), Str(S) {}
2914     AsmStringPiece(unsigned OpNo, const std::string &S, SourceLocation Begin,
2915                    SourceLocation End)
2916         : MyKind(Operand), Str(S), OperandNo(OpNo),
2917           Range(CharSourceRange::getCharRange(Begin, End)) {}
2918
2919     bool isString() const { return MyKind == String; }
2920     bool isOperand() const { return MyKind == Operand; }
2921
2922     const std::string &getString() const { return Str; }
2923
2924     unsigned getOperandNo() const {
2925       assert(isOperand());
2926       return OperandNo;
2927     }
2928
2929     CharSourceRange getRange() const {
2930       assert(isOperand() && "Range is currently used only for Operands.");
2931       return Range;
2932     }
2933
2934     /// getModifier - Get the modifier for this operand, if present.  This
2935     /// returns '\0' if there was no modifier.
2936     char getModifier() const;
2937   };
2938
2939   /// AnalyzeAsmString - Analyze the asm string of the current asm, decomposing
2940   /// it into pieces.  If the asm string is erroneous, emit errors and return
2941   /// true, otherwise return false.  This handles canonicalization and
2942   /// translation of strings from GCC syntax to LLVM IR syntax, and handles
2943   //// flattening of named references like %[foo] to Operand AsmStringPiece's.
2944   unsigned AnalyzeAsmString(SmallVectorImpl<AsmStringPiece> &Pieces,
2945                             const ASTContext &C, unsigned &DiagOffs) const;
2946
2947   /// Assemble final IR asm string.
2948   std::string generateAsmString(const ASTContext &C) const;
2949
2950   //===--- Output operands ---===//
2951
2952   IdentifierInfo *getOutputIdentifier(unsigned i) const { return Names[i]; }
2953
2954   StringRef getOutputName(unsigned i) const {
2955     if (IdentifierInfo *II = getOutputIdentifier(i))
2956       return II->getName();
2957
2958     return {};
2959   }
2960
2961   StringRef getOutputConstraint(unsigned i) const;
2962
2963   const StringLiteral *getOutputConstraintLiteral(unsigned i) const {
2964     return Constraints[i];
2965   }
2966   StringLiteral *getOutputConstraintLiteral(unsigned i) {
2967     return Constraints[i];
2968   }
2969
2970   Expr *getOutputExpr(unsigned i);
2971
2972   const Expr *getOutputExpr(unsigned i) const {
2973     return const_cast<GCCAsmStmt*>(this)->getOutputExpr(i);
2974   }
2975
2976   //===--- Input operands ---===//
2977
2978   IdentifierInfo *getInputIdentifier(unsigned i) const {
2979     return Names[i + NumOutputs];
2980   }
2981
2982   StringRef getInputName(unsigned i) const {
2983     if (IdentifierInfo *II = getInputIdentifier(i))
2984       return II->getName();
2985
2986     return {};
2987   }
2988
2989   StringRef getInputConstraint(unsigned i) const;
2990
2991   const StringLiteral *getInputConstraintLiteral(unsigned i) const {
2992     return Constraints[i + NumOutputs];
2993   }
2994   StringLiteral *getInputConstraintLiteral(unsigned i) {
2995     return Constraints[i + NumOutputs];
2996   }
2997
2998   Expr *getInputExpr(unsigned i);
2999   void setInputExpr(unsigned i, Expr *E);
3000
3001   const Expr *getInputExpr(unsigned i) const {
3002     return const_cast<GCCAsmStmt*>(this)->getInputExpr(i);
3003   }
3004
3005   //===--- Labels ---===//
3006
3007   bool isAsmGoto() const {
3008     return NumLabels > 0;
3009   }
3010
3011   unsigned getNumLabels() const {
3012     return NumLabels;
3013   }
3014
3015   IdentifierInfo *getLabelIdentifier(unsigned i) const {
3016     return Names[i + NumInputs];
3017   }
3018
3019   AddrLabelExpr *getLabelExpr(unsigned i) const;
3020   StringRef getLabelName(unsigned i) const;
3021   using labels_iterator = CastIterator<AddrLabelExpr>;
3022   using const_labels_iterator = ConstCastIterator<AddrLabelExpr>;
3023   using labels_range = llvm::iterator_range<labels_iterator>;
3024   using labels_const_range = llvm::iterator_range<const_labels_iterator>;
3025
3026   labels_iterator begin_labels() {
3027     return &Exprs[0] + NumInputs;
3028   }
3029
3030   labels_iterator end_labels() {
3031     return &Exprs[0] + NumInputs + NumLabels;
3032   }
3033
3034   labels_range labels() {
3035     return labels_range(begin_labels(), end_labels());
3036   }
3037
3038   const_labels_iterator begin_labels() const {
3039     return &Exprs[0] + NumInputs;
3040   }
3041
3042   const_labels_iterator end_labels() const {
3043     return &Exprs[0] + NumInputs + NumLabels;
3044   }
3045
3046   labels_const_range labels() const {
3047     return labels_const_range(begin_labels(), end_labels());
3048   }
3049
3050 private:
3051   void setOutputsAndInputsAndClobbers(const ASTContext &C,
3052                                       IdentifierInfo **Names,
3053                                       StringLiteral **Constraints,
3054                                       Stmt **Exprs,
3055                                       unsigned NumOutputs,
3056                                       unsigned NumInputs,
3057                                       unsigned NumLabels,
3058                                       StringLiteral **Clobbers,
3059                                       unsigned NumClobbers);
3060
3061 public:
3062   //===--- Other ---===//
3063
3064   /// getNamedOperand - Given a symbolic operand reference like %[foo],
3065   /// translate this into a numeric value needed to reference the same operand.
3066   /// This returns -1 if the operand name is invalid.
3067   int getNamedOperand(StringRef SymbolicName) const;
3068
3069   StringRef getClobber(unsigned i) const;
3070
3071   StringLiteral *getClobberStringLiteral(unsigned i) { return Clobbers[i]; }
3072   const StringLiteral *getClobberStringLiteral(unsigned i) const {
3073     return Clobbers[i];
3074   }
3075
3076   SourceLocation getBeginLoc() const LLVM_READONLY { return AsmLoc; }
3077   SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
3078
3079   static bool classof(const Stmt *T) {
3080     return T->getStmtClass() == GCCAsmStmtClass;
3081   }
3082 };
3083
3084 /// This represents a Microsoft inline-assembly statement extension.
3085 class MSAsmStmt : public AsmStmt {
3086   friend class ASTStmtReader;
3087
3088   SourceLocation LBraceLoc, EndLoc;
3089   StringRef AsmStr;
3090
3091   unsigned NumAsmToks = 0;
3092
3093   Token *AsmToks = nullptr;
3094   StringRef *Constraints = nullptr;
3095   StringRef *Clobbers = nullptr;
3096
3097 public:
3098   MSAsmStmt(const ASTContext &C, SourceLocation asmloc,
3099             SourceLocation lbraceloc, bool issimple, bool isvolatile,
3100             ArrayRef<Token> asmtoks, unsigned numoutputs, unsigned numinputs,
3101             ArrayRef<StringRef> constraints,
3102             ArrayRef<Expr*> exprs, StringRef asmstr,
3103             ArrayRef<StringRef> clobbers, SourceLocation endloc);
3104
3105   /// Build an empty MS-style inline-assembly statement.
3106   explicit MSAsmStmt(EmptyShell Empty) : AsmStmt(MSAsmStmtClass, Empty) {}
3107
3108   SourceLocation getLBraceLoc() const { return LBraceLoc; }
3109   void setLBraceLoc(SourceLocation L) { LBraceLoc = L; }
3110   SourceLocation getEndLoc() const { return EndLoc; }
3111   void setEndLoc(SourceLocation L) { EndLoc = L; }
3112
3113   bool hasBraces() const { return LBraceLoc.isValid(); }
3114
3115   unsigned getNumAsmToks() { return NumAsmToks; }
3116   Token *getAsmToks() { return AsmToks; }
3117
3118   //===--- Asm String Analysis ---===//
3119   StringRef getAsmString() const { return AsmStr; }
3120
3121   /// Assemble final IR asm string.
3122   std::string generateAsmString(const ASTContext &C) const;
3123
3124   //===--- Output operands ---===//
3125
3126   StringRef getOutputConstraint(unsigned i) const {
3127     assert(i < NumOutputs);
3128     return Constraints[i];
3129   }
3130
3131   Expr *getOutputExpr(unsigned i);
3132
3133   const Expr *getOutputExpr(unsigned i) const {
3134     return const_cast<MSAsmStmt*>(this)->getOutputExpr(i);
3135   }
3136
3137   //===--- Input operands ---===//
3138
3139   StringRef getInputConstraint(unsigned i) const {
3140     assert(i < NumInputs);
3141     return Constraints[i + NumOutputs];
3142   }
3143
3144   Expr *getInputExpr(unsigned i);
3145   void setInputExpr(unsigned i, Expr *E);
3146
3147   const Expr *getInputExpr(unsigned i) const {
3148     return const_cast<MSAsmStmt*>(this)->getInputExpr(i);
3149   }
3150
3151   //===--- Other ---===//
3152
3153   ArrayRef<StringRef> getAllConstraints() const {
3154     return llvm::makeArrayRef(Constraints, NumInputs + NumOutputs);
3155   }
3156
3157   ArrayRef<StringRef> getClobbers() const {
3158     return llvm::makeArrayRef(Clobbers, NumClobbers);
3159   }
3160
3161   ArrayRef<Expr*> getAllExprs() const {
3162     return llvm::makeArrayRef(reinterpret_cast<Expr**>(Exprs),
3163                               NumInputs + NumOutputs);
3164   }
3165
3166   StringRef getClobber(unsigned i) const { return getClobbers()[i]; }
3167
3168 private:
3169   void initialize(const ASTContext &C, StringRef AsmString,
3170                   ArrayRef<Token> AsmToks, ArrayRef<StringRef> Constraints,
3171                   ArrayRef<Expr*> Exprs, ArrayRef<StringRef> Clobbers);
3172
3173 public:
3174   SourceLocation getBeginLoc() const LLVM_READONLY { return AsmLoc; }
3175
3176   static bool classof(const Stmt *T) {
3177     return T->getStmtClass() == MSAsmStmtClass;
3178   }
3179
3180   child_range children() {
3181     return child_range(&Exprs[0], &Exprs[NumInputs + NumOutputs]);
3182   }
3183
3184   const_child_range children() const {
3185     return const_child_range(&Exprs[0], &Exprs[NumInputs + NumOutputs]);
3186   }
3187 };
3188
3189 class SEHExceptStmt : public Stmt {
3190   friend class ASTReader;
3191   friend class ASTStmtReader;
3192
3193   SourceLocation  Loc;
3194   Stmt *Children[2];
3195
3196   enum { FILTER_EXPR, BLOCK };
3197
3198   SEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, Stmt *Block);
3199   explicit SEHExceptStmt(EmptyShell E) : Stmt(SEHExceptStmtClass, E) {}
3200
3201 public:
3202   static SEHExceptStmt* Create(const ASTContext &C,
3203                                SourceLocation ExceptLoc,
3204                                Expr *FilterExpr,
3205                                Stmt *Block);
3206
3207   SourceLocation getBeginLoc() const LLVM_READONLY { return getExceptLoc(); }
3208
3209   SourceLocation getExceptLoc() const { return Loc; }
3210   SourceLocation getEndLoc() const { return getBlock()->getEndLoc(); }
3211
3212   Expr *getFilterExpr() const {
3213     return reinterpret_cast<Expr*>(Children[FILTER_EXPR]);
3214   }
3215
3216   CompoundStmt *getBlock() const {
3217     return cast<CompoundStmt>(Children[BLOCK]);
3218   }
3219
3220   child_range children() {
3221     return child_range(Children, Children+2);
3222   }
3223
3224   const_child_range children() const {
3225     return const_child_range(Children, Children + 2);
3226   }
3227
3228   static bool classof(const Stmt *T) {
3229     return T->getStmtClass() == SEHExceptStmtClass;
3230   }
3231 };
3232
3233 class SEHFinallyStmt : public Stmt {
3234   friend class ASTReader;
3235   friend class ASTStmtReader;
3236
3237   SourceLocation  Loc;
3238   Stmt *Block;
3239
3240   SEHFinallyStmt(SourceLocation Loc, Stmt *Block);
3241   explicit SEHFinallyStmt(EmptyShell E) : Stmt(SEHFinallyStmtClass, E) {}
3242
3243 public:
3244   static SEHFinallyStmt* Create(const ASTContext &C,
3245                                 SourceLocation FinallyLoc,
3246                                 Stmt *Block);
3247
3248   SourceLocation getBeginLoc() const LLVM_READONLY { return getFinallyLoc(); }
3249
3250   SourceLocation getFinallyLoc() const { return Loc; }
3251   SourceLocation getEndLoc() const { return Block->getEndLoc(); }
3252
3253   CompoundStmt *getBlock() const { return cast<CompoundStmt>(Block); }
3254
3255   child_range children() {
3256     return child_range(&Block,&Block+1);
3257   }
3258
3259   const_child_range children() const {
3260     return const_child_range(&Block, &Block + 1);
3261   }
3262
3263   static bool classof(const Stmt *T) {
3264     return T->getStmtClass() == SEHFinallyStmtClass;
3265   }
3266 };
3267
3268 class SEHTryStmt : public Stmt {
3269   friend class ASTReader;
3270   friend class ASTStmtReader;
3271
3272   bool IsCXXTry;
3273   SourceLocation  TryLoc;
3274   Stmt *Children[2];
3275
3276   enum { TRY = 0, HANDLER = 1 };
3277
3278   SEHTryStmt(bool isCXXTry, // true if 'try' otherwise '__try'
3279              SourceLocation TryLoc,
3280              Stmt *TryBlock,
3281              Stmt *Handler);
3282
3283   explicit SEHTryStmt(EmptyShell E) : Stmt(SEHTryStmtClass, E) {}
3284
3285 public:
3286   static SEHTryStmt* Create(const ASTContext &C, bool isCXXTry,
3287                             SourceLocation TryLoc, Stmt *TryBlock,
3288                             Stmt *Handler);
3289
3290   SourceLocation getBeginLoc() const LLVM_READONLY { return getTryLoc(); }
3291
3292   SourceLocation getTryLoc() const { return TryLoc; }
3293   SourceLocation getEndLoc() const { return Children[HANDLER]->getEndLoc(); }
3294
3295   bool getIsCXXTry() const { return IsCXXTry; }
3296
3297   CompoundStmt* getTryBlock() const {
3298     return cast<CompoundStmt>(Children[TRY]);
3299   }
3300
3301   Stmt *getHandler() const { return Children[HANDLER]; }
3302
3303   /// Returns 0 if not defined
3304   SEHExceptStmt  *getExceptHandler() const;
3305   SEHFinallyStmt *getFinallyHandler() const;
3306
3307   child_range children() {
3308     return child_range(Children, Children+2);
3309   }
3310
3311   const_child_range children() const {
3312     return const_child_range(Children, Children + 2);
3313   }
3314
3315   static bool classof(const Stmt *T) {
3316     return T->getStmtClass() == SEHTryStmtClass;
3317   }
3318 };
3319
3320 /// Represents a __leave statement.
3321 class SEHLeaveStmt : public Stmt {
3322   SourceLocation LeaveLoc;
3323
3324 public:
3325   explicit SEHLeaveStmt(SourceLocation LL)
3326       : Stmt(SEHLeaveStmtClass), LeaveLoc(LL) {}
3327
3328   /// Build an empty __leave statement.
3329   explicit SEHLeaveStmt(EmptyShell Empty) : Stmt(SEHLeaveStmtClass, Empty) {}
3330
3331   SourceLocation getLeaveLoc() const { return LeaveLoc; }
3332   void setLeaveLoc(SourceLocation L) { LeaveLoc = L; }
3333
3334   SourceLocation getBeginLoc() const LLVM_READONLY { return LeaveLoc; }
3335   SourceLocation getEndLoc() const LLVM_READONLY { return LeaveLoc; }
3336
3337   static bool classof(const Stmt *T) {
3338     return T->getStmtClass() == SEHLeaveStmtClass;
3339   }
3340
3341   // Iterators
3342   child_range children() {
3343     return child_range(child_iterator(), child_iterator());
3344   }
3345
3346   const_child_range children() const {
3347     return const_child_range(const_child_iterator(), const_child_iterator());
3348   }
3349 };
3350
3351 /// This captures a statement into a function. For example, the following
3352 /// pragma annotated compound statement can be represented as a CapturedStmt,
3353 /// and this compound statement is the body of an anonymous outlined function.
3354 /// @code
3355 /// #pragma omp parallel
3356 /// {
3357 ///   compute();
3358 /// }
3359 /// @endcode
3360 class CapturedStmt : public Stmt {
3361 public:
3362   /// The different capture forms: by 'this', by reference, capture for
3363   /// variable-length array type etc.
3364   enum VariableCaptureKind {
3365     VCK_This,
3366     VCK_ByRef,
3367     VCK_ByCopy,
3368     VCK_VLAType,
3369   };
3370
3371   /// Describes the capture of either a variable, or 'this', or
3372   /// variable-length array type.
3373   class Capture {
3374     llvm::PointerIntPair<VarDecl *, 2, VariableCaptureKind> VarAndKind;
3375     SourceLocation Loc;
3376
3377   public:
3378     friend class ASTStmtReader;
3379
3380     /// Create a new capture.
3381     ///
3382     /// \param Loc The source location associated with this capture.
3383     ///
3384     /// \param Kind The kind of capture (this, ByRef, ...).
3385     ///
3386     /// \param Var The variable being captured, or null if capturing this.
3387     Capture(SourceLocation Loc, VariableCaptureKind Kind,
3388             VarDecl *Var = nullptr);
3389
3390     /// Determine the kind of capture.
3391     VariableCaptureKind getCaptureKind() const;
3392
3393     /// Retrieve the source location at which the variable or 'this' was
3394     /// first used.
3395     SourceLocation getLocation() const { return Loc; }
3396
3397     /// Determine whether this capture handles the C++ 'this' pointer.
3398     bool capturesThis() const { return getCaptureKind() == VCK_This; }
3399
3400     /// Determine whether this capture handles a variable (by reference).
3401     bool capturesVariable() const { return getCaptureKind() == VCK_ByRef; }
3402
3403     /// Determine whether this capture handles a variable by copy.
3404     bool capturesVariableByCopy() const {
3405       return getCaptureKind() == VCK_ByCopy;
3406     }
3407
3408     /// Determine whether this capture handles a variable-length array
3409     /// type.
3410     bool capturesVariableArrayType() const {
3411       return getCaptureKind() == VCK_VLAType;
3412     }
3413
3414     /// Retrieve the declaration of the variable being captured.
3415     ///
3416     /// This operation is only valid if this capture captures a variable.
3417     VarDecl *getCapturedVar() const;
3418   };
3419
3420 private:
3421   /// The number of variable captured, including 'this'.
3422   unsigned NumCaptures;
3423
3424   /// The pointer part is the implicit the outlined function and the
3425   /// int part is the captured region kind, 'CR_Default' etc.
3426   llvm::PointerIntPair<CapturedDecl *, 2, CapturedRegionKind> CapDeclAndKind;
3427
3428   /// The record for captured variables, a RecordDecl or CXXRecordDecl.
3429   RecordDecl *TheRecordDecl = nullptr;
3430
3431   /// Construct a captured statement.
3432   CapturedStmt(Stmt *S, CapturedRegionKind Kind, ArrayRef<Capture> Captures,
3433                ArrayRef<Expr *> CaptureInits, CapturedDecl *CD, RecordDecl *RD);
3434
3435   /// Construct an empty captured statement.
3436   CapturedStmt(EmptyShell Empty, unsigned NumCaptures);
3437
3438   Stmt **getStoredStmts() { return reinterpret_cast<Stmt **>(this + 1); }
3439
3440   Stmt *const *getStoredStmts() const {
3441     return reinterpret_cast<Stmt *const *>(this + 1);
3442   }
3443
3444   Capture *getStoredCaptures() const;
3445
3446   void setCapturedStmt(Stmt *S) { getStoredStmts()[NumCaptures] = S; }
3447
3448 public:
3449   friend class ASTStmtReader;
3450
3451   static CapturedStmt *Create(const ASTContext &Context, Stmt *S,
3452                               CapturedRegionKind Kind,
3453                               ArrayRef<Capture> Captures,
3454                               ArrayRef<Expr *> CaptureInits,
3455                               CapturedDecl *CD, RecordDecl *RD);
3456
3457   static CapturedStmt *CreateDeserialized(const ASTContext &Context,
3458                                           unsigned NumCaptures);
3459
3460   /// Retrieve the statement being captured.
3461   Stmt *getCapturedStmt() { return getStoredStmts()[NumCaptures]; }
3462   const Stmt *getCapturedStmt() const { return getStoredStmts()[NumCaptures]; }
3463
3464   /// Retrieve the outlined function declaration.
3465   CapturedDecl *getCapturedDecl();
3466   const CapturedDecl *getCapturedDecl() const;
3467
3468   /// Set the outlined function declaration.
3469   void setCapturedDecl(CapturedDecl *D);
3470
3471   /// Retrieve the captured region kind.
3472   CapturedRegionKind getCapturedRegionKind() const;
3473
3474   /// Set the captured region kind.
3475   void setCapturedRegionKind(CapturedRegionKind Kind);
3476
3477   /// Retrieve the record declaration for captured variables.
3478   const RecordDecl *getCapturedRecordDecl() const { return TheRecordDecl; }
3479
3480   /// Set the record declaration for captured variables.
3481   void setCapturedRecordDecl(RecordDecl *D) {
3482     assert(D && "null RecordDecl");
3483     TheRecordDecl = D;
3484   }
3485
3486   /// True if this variable has been captured.
3487   bool capturesVariable(const VarDecl *Var) const;
3488
3489   /// An iterator that walks over the captures.
3490   using capture_iterator = Capture *;
3491   using const_capture_iterator = const Capture *;
3492   using capture_range = llvm::iterator_range<capture_iterator>;
3493   using capture_const_range = llvm::iterator_range<const_capture_iterator>;
3494
3495   capture_range captures() {
3496     return capture_range(capture_begin(), capture_end());
3497   }
3498   capture_const_range captures() const {
3499     return capture_const_range(capture_begin(), capture_end());
3500   }
3501
3502   /// Retrieve an iterator pointing to the first capture.
3503   capture_iterator capture_begin() { return getStoredCaptures(); }
3504   const_capture_iterator capture_begin() const { return getStoredCaptures(); }
3505
3506   /// Retrieve an iterator pointing past the end of the sequence of
3507   /// captures.
3508   capture_iterator capture_end() const {
3509     return getStoredCaptures() + NumCaptures;
3510   }
3511
3512   /// Retrieve the number of captures, including 'this'.
3513   unsigned capture_size() const { return NumCaptures; }
3514
3515   /// Iterator that walks over the capture initialization arguments.
3516   using capture_init_iterator = Expr **;
3517   using capture_init_range = llvm::iterator_range<capture_init_iterator>;
3518
3519   /// Const iterator that walks over the capture initialization
3520   /// arguments.
3521   using const_capture_init_iterator = Expr *const *;
3522   using const_capture_init_range =
3523       llvm::iterator_range<const_capture_init_iterator>;
3524
3525   capture_init_range capture_inits() {
3526     return capture_init_range(capture_init_begin(), capture_init_end());
3527   }
3528
3529   const_capture_init_range capture_inits() const {
3530     return const_capture_init_range(capture_init_begin(), capture_init_end());
3531   }
3532
3533   /// Retrieve the first initialization argument.
3534   capture_init_iterator capture_init_begin() {
3535     return reinterpret_cast<Expr **>(getStoredStmts());
3536   }
3537
3538   const_capture_init_iterator capture_init_begin() const {
3539     return reinterpret_cast<Expr *const *>(getStoredStmts());
3540   }
3541
3542   /// Retrieve the iterator pointing one past the last initialization
3543   /// argument.
3544   capture_init_iterator capture_init_end() {
3545     return capture_init_begin() + NumCaptures;
3546   }
3547
3548   const_capture_init_iterator capture_init_end() const {
3549     return capture_init_begin() + NumCaptures;
3550   }
3551
3552   SourceLocation getBeginLoc() const LLVM_READONLY {
3553     return getCapturedStmt()->getBeginLoc();
3554   }
3555
3556   SourceLocation getEndLoc() const LLVM_READONLY {
3557     return getCapturedStmt()->getEndLoc();
3558   }
3559
3560   SourceRange getSourceRange() const LLVM_READONLY {
3561     return getCapturedStmt()->getSourceRange();
3562   }
3563
3564   static bool classof(const Stmt *T) {
3565     return T->getStmtClass() == CapturedStmtClass;
3566   }
3567
3568   child_range children();
3569
3570   const_child_range children() const;
3571 };
3572
3573 } // namespace clang
3574
3575 #endif // LLVM_CLANG_AST_STMT_H