]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/clang/include/clang/AST/Stmt.h
Merge ^/vendor/llvm-project/release-10.x up to its last change (upstream
[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   class RequiresExprBitfields {
914     friend class ASTStmtReader;
915     friend class ASTStmtWriter;
916     friend class RequiresExpr;
917
918     unsigned : NumExprBits;
919
920     unsigned IsSatisfied : 1;
921     SourceLocation RequiresKWLoc;
922   };
923
924   //===--- C++ Coroutines TS bitfields classes ---===//
925
926   class CoawaitExprBitfields {
927     friend class CoawaitExpr;
928
929     unsigned : NumExprBits;
930
931     unsigned IsImplicit : 1;
932   };
933
934   //===--- Obj-C Expression bitfields classes ---===//
935
936   class ObjCIndirectCopyRestoreExprBitfields {
937     friend class ObjCIndirectCopyRestoreExpr;
938
939     unsigned : NumExprBits;
940
941     unsigned ShouldCopy : 1;
942   };
943
944   //===--- Clang Extensions bitfields classes ---===//
945
946   class OpaqueValueExprBitfields {
947     friend class ASTStmtReader;
948     friend class OpaqueValueExpr;
949
950     unsigned : NumExprBits;
951
952     /// The OVE is a unique semantic reference to its source expression if this
953     /// bit is set to true.
954     unsigned IsUnique : 1;
955
956     SourceLocation Loc;
957   };
958
959   union {
960     // Same order as in StmtNodes.td.
961     // Statements
962     StmtBitfields StmtBits;
963     NullStmtBitfields NullStmtBits;
964     CompoundStmtBitfields CompoundStmtBits;
965     LabelStmtBitfields LabelStmtBits;
966     AttributedStmtBitfields AttributedStmtBits;
967     IfStmtBitfields IfStmtBits;
968     SwitchStmtBitfields SwitchStmtBits;
969     WhileStmtBitfields WhileStmtBits;
970     DoStmtBitfields DoStmtBits;
971     ForStmtBitfields ForStmtBits;
972     GotoStmtBitfields GotoStmtBits;
973     ContinueStmtBitfields ContinueStmtBits;
974     BreakStmtBitfields BreakStmtBits;
975     ReturnStmtBitfields ReturnStmtBits;
976     SwitchCaseBitfields SwitchCaseBits;
977
978     // Expressions
979     ExprBitfields ExprBits;
980     ConstantExprBitfields ConstantExprBits;
981     PredefinedExprBitfields PredefinedExprBits;
982     DeclRefExprBitfields DeclRefExprBits;
983     FloatingLiteralBitfields FloatingLiteralBits;
984     StringLiteralBitfields StringLiteralBits;
985     CharacterLiteralBitfields CharacterLiteralBits;
986     UnaryOperatorBitfields UnaryOperatorBits;
987     UnaryExprOrTypeTraitExprBitfields UnaryExprOrTypeTraitExprBits;
988     ArraySubscriptExprBitfields ArraySubscriptExprBits;
989     CallExprBitfields CallExprBits;
990     MemberExprBitfields MemberExprBits;
991     CastExprBitfields CastExprBits;
992     BinaryOperatorBitfields BinaryOperatorBits;
993     InitListExprBitfields InitListExprBits;
994     ParenListExprBitfields ParenListExprBits;
995     GenericSelectionExprBitfields GenericSelectionExprBits;
996     PseudoObjectExprBitfields PseudoObjectExprBits;
997     SourceLocExprBitfields SourceLocExprBits;
998
999     // C++ Expressions
1000     CXXOperatorCallExprBitfields CXXOperatorCallExprBits;
1001     CXXRewrittenBinaryOperatorBitfields CXXRewrittenBinaryOperatorBits;
1002     CXXBoolLiteralExprBitfields CXXBoolLiteralExprBits;
1003     CXXNullPtrLiteralExprBitfields CXXNullPtrLiteralExprBits;
1004     CXXThisExprBitfields CXXThisExprBits;
1005     CXXThrowExprBitfields CXXThrowExprBits;
1006     CXXDefaultArgExprBitfields CXXDefaultArgExprBits;
1007     CXXDefaultInitExprBitfields CXXDefaultInitExprBits;
1008     CXXScalarValueInitExprBitfields CXXScalarValueInitExprBits;
1009     CXXNewExprBitfields CXXNewExprBits;
1010     CXXDeleteExprBitfields CXXDeleteExprBits;
1011     TypeTraitExprBitfields TypeTraitExprBits;
1012     DependentScopeDeclRefExprBitfields DependentScopeDeclRefExprBits;
1013     CXXConstructExprBitfields CXXConstructExprBits;
1014     ExprWithCleanupsBitfields ExprWithCleanupsBits;
1015     CXXUnresolvedConstructExprBitfields CXXUnresolvedConstructExprBits;
1016     CXXDependentScopeMemberExprBitfields CXXDependentScopeMemberExprBits;
1017     OverloadExprBitfields OverloadExprBits;
1018     UnresolvedLookupExprBitfields UnresolvedLookupExprBits;
1019     UnresolvedMemberExprBitfields UnresolvedMemberExprBits;
1020     CXXNoexceptExprBitfields CXXNoexceptExprBits;
1021     SubstNonTypeTemplateParmExprBitfields SubstNonTypeTemplateParmExprBits;
1022     RequiresExprBitfields RequiresExprBits;
1023
1024     // C++ Coroutines TS expressions
1025     CoawaitExprBitfields CoawaitBits;
1026
1027     // Obj-C Expressions
1028     ObjCIndirectCopyRestoreExprBitfields ObjCIndirectCopyRestoreExprBits;
1029
1030     // Clang Extensions
1031     OpaqueValueExprBitfields OpaqueValueExprBits;
1032   };
1033
1034 public:
1035   // Only allow allocation of Stmts using the allocator in ASTContext
1036   // or by doing a placement new.
1037   void* operator new(size_t bytes, const ASTContext& C,
1038                      unsigned alignment = 8);
1039
1040   void* operator new(size_t bytes, const ASTContext* C,
1041                      unsigned alignment = 8) {
1042     return operator new(bytes, *C, alignment);
1043   }
1044
1045   void *operator new(size_t bytes, void *mem) noexcept { return mem; }
1046
1047   void operator delete(void *, const ASTContext &, unsigned) noexcept {}
1048   void operator delete(void *, const ASTContext *, unsigned) noexcept {}
1049   void operator delete(void *, size_t) noexcept {}
1050   void operator delete(void *, void *) noexcept {}
1051
1052 public:
1053   /// A placeholder type used to construct an empty shell of a
1054   /// type, that will be filled in later (e.g., by some
1055   /// de-serialization).
1056   struct EmptyShell {};
1057
1058 protected:
1059   /// Iterator for iterating over Stmt * arrays that contain only T *.
1060   ///
1061   /// This is needed because AST nodes use Stmt* arrays to store
1062   /// references to children (to be compatible with StmtIterator).
1063   template<typename T, typename TPtr = T *, typename StmtPtr = Stmt *>
1064   struct CastIterator
1065       : llvm::iterator_adaptor_base<CastIterator<T, TPtr, StmtPtr>, StmtPtr *,
1066                                     std::random_access_iterator_tag, TPtr> {
1067     using Base = typename CastIterator::iterator_adaptor_base;
1068
1069     CastIterator() : Base(nullptr) {}
1070     CastIterator(StmtPtr *I) : Base(I) {}
1071
1072     typename Base::value_type operator*() const {
1073       return cast_or_null<T>(*this->I);
1074     }
1075   };
1076
1077   /// Const iterator for iterating over Stmt * arrays that contain only T *.
1078   template <typename T>
1079   using ConstCastIterator = CastIterator<T, const T *const, const Stmt *const>;
1080
1081   using ExprIterator = CastIterator<Expr>;
1082   using ConstExprIterator = ConstCastIterator<Expr>;
1083
1084 private:
1085   /// Whether statistic collection is enabled.
1086   static bool StatisticsEnabled;
1087
1088 protected:
1089   /// Construct an empty statement.
1090   explicit Stmt(StmtClass SC, EmptyShell) : Stmt(SC) {}
1091
1092 public:
1093   Stmt() = delete;
1094   Stmt(const Stmt &) = delete;
1095   Stmt(Stmt &&) = delete;
1096   Stmt &operator=(const Stmt &) = delete;
1097   Stmt &operator=(Stmt &&) = delete;
1098
1099   Stmt(StmtClass SC) {
1100     static_assert(sizeof(*this) <= 8,
1101                   "changing bitfields changed sizeof(Stmt)");
1102     static_assert(sizeof(*this) % alignof(void *) == 0,
1103                   "Insufficient alignment!");
1104     StmtBits.sClass = SC;
1105     StmtBits.IsOMPStructuredBlock = false;
1106     if (StatisticsEnabled) Stmt::addStmtClass(SC);
1107   }
1108
1109   StmtClass getStmtClass() const {
1110     return static_cast<StmtClass>(StmtBits.sClass);
1111   }
1112
1113   const char *getStmtClassName() const;
1114
1115   bool isOMPStructuredBlock() const { return StmtBits.IsOMPStructuredBlock; }
1116   void setIsOMPStructuredBlock(bool IsOMPStructuredBlock) {
1117     StmtBits.IsOMPStructuredBlock = IsOMPStructuredBlock;
1118   }
1119
1120   /// SourceLocation tokens are not useful in isolation - they are low level
1121   /// value objects created/interpreted by SourceManager. We assume AST
1122   /// clients will have a pointer to the respective SourceManager.
1123   SourceRange getSourceRange() const LLVM_READONLY;
1124   SourceLocation getBeginLoc() const LLVM_READONLY;
1125   SourceLocation getEndLoc() const LLVM_READONLY;
1126
1127   // global temp stats (until we have a per-module visitor)
1128   static void addStmtClass(const StmtClass s);
1129   static void EnableStatistics();
1130   static void PrintStats();
1131
1132   /// Dumps the specified AST fragment and all subtrees to
1133   /// \c llvm::errs().
1134   void dump() const;
1135   void dump(SourceManager &SM) const;
1136   void dump(raw_ostream &OS, SourceManager &SM) const;
1137   void dump(raw_ostream &OS) const;
1138
1139   /// \return Unique reproducible object identifier
1140   int64_t getID(const ASTContext &Context) const;
1141
1142   /// dumpColor - same as dump(), but forces color highlighting.
1143   void dumpColor() const;
1144
1145   /// dumpPretty/printPretty - These two methods do a "pretty print" of the AST
1146   /// back to its original source language syntax.
1147   void dumpPretty(const ASTContext &Context) const;
1148   void printPretty(raw_ostream &OS, PrinterHelper *Helper,
1149                    const PrintingPolicy &Policy, unsigned Indentation = 0,
1150                    StringRef NewlineSymbol = "\n",
1151                    const ASTContext *Context = nullptr) const;
1152
1153   /// Pretty-prints in JSON format.
1154   void printJson(raw_ostream &Out, PrinterHelper *Helper,
1155                  const PrintingPolicy &Policy, bool AddQuotes) const;
1156
1157   /// viewAST - Visualize an AST rooted at this Stmt* using GraphViz.  Only
1158   ///   works on systems with GraphViz (Mac OS X) or dot+gv installed.
1159   void viewAST() const;
1160
1161   /// Skip no-op (attributed, compound) container stmts and skip captured
1162   /// stmt at the top, if \a IgnoreCaptured is true.
1163   Stmt *IgnoreContainers(bool IgnoreCaptured = false);
1164   const Stmt *IgnoreContainers(bool IgnoreCaptured = false) const {
1165     return const_cast<Stmt *>(this)->IgnoreContainers(IgnoreCaptured);
1166   }
1167
1168   const Stmt *stripLabelLikeStatements() const;
1169   Stmt *stripLabelLikeStatements() {
1170     return const_cast<Stmt*>(
1171       const_cast<const Stmt*>(this)->stripLabelLikeStatements());
1172   }
1173
1174   /// Child Iterators: All subclasses must implement 'children'
1175   /// to permit easy iteration over the substatements/subexpessions of an
1176   /// AST node.  This permits easy iteration over all nodes in the AST.
1177   using child_iterator = StmtIterator;
1178   using const_child_iterator = ConstStmtIterator;
1179
1180   using child_range = llvm::iterator_range<child_iterator>;
1181   using const_child_range = llvm::iterator_range<const_child_iterator>;
1182
1183   child_range children();
1184
1185   const_child_range children() const {
1186     auto Children = const_cast<Stmt *>(this)->children();
1187     return const_child_range(Children.begin(), Children.end());
1188   }
1189
1190   child_iterator child_begin() { return children().begin(); }
1191   child_iterator child_end() { return children().end(); }
1192
1193   const_child_iterator child_begin() const { return children().begin(); }
1194   const_child_iterator child_end() const { return children().end(); }
1195
1196   /// Produce a unique representation of the given statement.
1197   ///
1198   /// \param ID once the profiling operation is complete, will contain
1199   /// the unique representation of the given statement.
1200   ///
1201   /// \param Context the AST context in which the statement resides
1202   ///
1203   /// \param Canonical whether the profile should be based on the canonical
1204   /// representation of this statement (e.g., where non-type template
1205   /// parameters are identified by index/level rather than their
1206   /// declaration pointers) or the exact representation of the statement as
1207   /// written in the source.
1208   void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
1209                bool Canonical) const;
1210
1211   /// Calculate a unique representation for a statement that is
1212   /// stable across compiler invocations.
1213   ///
1214   /// \param ID profile information will be stored in ID.
1215   ///
1216   /// \param Hash an ODRHash object which will be called where pointers would
1217   /// have been used in the Profile function.
1218   void ProcessODRHash(llvm::FoldingSetNodeID &ID, ODRHash& Hash) const;
1219 };
1220
1221 /// DeclStmt - Adaptor class for mixing declarations with statements and
1222 /// expressions. For example, CompoundStmt mixes statements, expressions
1223 /// and declarations (variables, types). Another example is ForStmt, where
1224 /// the first statement can be an expression or a declaration.
1225 class DeclStmt : public Stmt {
1226   DeclGroupRef DG;
1227   SourceLocation StartLoc, EndLoc;
1228
1229 public:
1230   DeclStmt(DeclGroupRef dg, SourceLocation startLoc, SourceLocation endLoc)
1231       : Stmt(DeclStmtClass), DG(dg), StartLoc(startLoc), EndLoc(endLoc) {}
1232
1233   /// Build an empty declaration statement.
1234   explicit DeclStmt(EmptyShell Empty) : Stmt(DeclStmtClass, Empty) {}
1235
1236   /// isSingleDecl - This method returns true if this DeclStmt refers
1237   /// to a single Decl.
1238   bool isSingleDecl() const { return DG.isSingleDecl(); }
1239
1240   const Decl *getSingleDecl() const { return DG.getSingleDecl(); }
1241   Decl *getSingleDecl() { return DG.getSingleDecl(); }
1242
1243   const DeclGroupRef getDeclGroup() const { return DG; }
1244   DeclGroupRef getDeclGroup() { return DG; }
1245   void setDeclGroup(DeclGroupRef DGR) { DG = DGR; }
1246
1247   void setStartLoc(SourceLocation L) { StartLoc = L; }
1248   SourceLocation getEndLoc() const { return EndLoc; }
1249   void setEndLoc(SourceLocation L) { EndLoc = L; }
1250
1251   SourceLocation getBeginLoc() const LLVM_READONLY { return StartLoc; }
1252
1253   static bool classof(const Stmt *T) {
1254     return T->getStmtClass() == DeclStmtClass;
1255   }
1256
1257   // Iterators over subexpressions.
1258   child_range children() {
1259     return child_range(child_iterator(DG.begin(), DG.end()),
1260                        child_iterator(DG.end(), DG.end()));
1261   }
1262
1263   const_child_range children() const {
1264     auto Children = const_cast<DeclStmt *>(this)->children();
1265     return const_child_range(Children);
1266   }
1267
1268   using decl_iterator = DeclGroupRef::iterator;
1269   using const_decl_iterator = DeclGroupRef::const_iterator;
1270   using decl_range = llvm::iterator_range<decl_iterator>;
1271   using decl_const_range = llvm::iterator_range<const_decl_iterator>;
1272
1273   decl_range decls() { return decl_range(decl_begin(), decl_end()); }
1274
1275   decl_const_range decls() const {
1276     return decl_const_range(decl_begin(), decl_end());
1277   }
1278
1279   decl_iterator decl_begin() { return DG.begin(); }
1280   decl_iterator decl_end() { return DG.end(); }
1281   const_decl_iterator decl_begin() const { return DG.begin(); }
1282   const_decl_iterator decl_end() const { return DG.end(); }
1283
1284   using reverse_decl_iterator = std::reverse_iterator<decl_iterator>;
1285
1286   reverse_decl_iterator decl_rbegin() {
1287     return reverse_decl_iterator(decl_end());
1288   }
1289
1290   reverse_decl_iterator decl_rend() {
1291     return reverse_decl_iterator(decl_begin());
1292   }
1293 };
1294
1295 /// NullStmt - This is the null statement ";": C99 6.8.3p3.
1296 ///
1297 class NullStmt : public Stmt {
1298 public:
1299   NullStmt(SourceLocation L, bool hasLeadingEmptyMacro = false)
1300       : Stmt(NullStmtClass) {
1301     NullStmtBits.HasLeadingEmptyMacro = hasLeadingEmptyMacro;
1302     setSemiLoc(L);
1303   }
1304
1305   /// Build an empty null statement.
1306   explicit NullStmt(EmptyShell Empty) : Stmt(NullStmtClass, Empty) {}
1307
1308   SourceLocation getSemiLoc() const { return NullStmtBits.SemiLoc; }
1309   void setSemiLoc(SourceLocation L) { NullStmtBits.SemiLoc = L; }
1310
1311   bool hasLeadingEmptyMacro() const {
1312     return NullStmtBits.HasLeadingEmptyMacro;
1313   }
1314
1315   SourceLocation getBeginLoc() const { return getSemiLoc(); }
1316   SourceLocation getEndLoc() const { return getSemiLoc(); }
1317
1318   static bool classof(const Stmt *T) {
1319     return T->getStmtClass() == NullStmtClass;
1320   }
1321
1322   child_range children() {
1323     return child_range(child_iterator(), child_iterator());
1324   }
1325
1326   const_child_range children() const {
1327     return const_child_range(const_child_iterator(), const_child_iterator());
1328   }
1329 };
1330
1331 /// CompoundStmt - This represents a group of statements like { stmt stmt }.
1332 class CompoundStmt final : public Stmt,
1333                            private llvm::TrailingObjects<CompoundStmt, Stmt *> {
1334   friend class ASTStmtReader;
1335   friend TrailingObjects;
1336
1337   /// The location of the closing "}". LBraceLoc is stored in CompoundStmtBits.
1338   SourceLocation RBraceLoc;
1339
1340   CompoundStmt(ArrayRef<Stmt *> Stmts, SourceLocation LB, SourceLocation RB);
1341   explicit CompoundStmt(EmptyShell Empty) : Stmt(CompoundStmtClass, Empty) {}
1342
1343   void setStmts(ArrayRef<Stmt *> Stmts);
1344
1345 public:
1346   static CompoundStmt *Create(const ASTContext &C, ArrayRef<Stmt *> Stmts,
1347                               SourceLocation LB, SourceLocation RB);
1348
1349   // Build an empty compound statement with a location.
1350   explicit CompoundStmt(SourceLocation Loc)
1351       : Stmt(CompoundStmtClass), RBraceLoc(Loc) {
1352     CompoundStmtBits.NumStmts = 0;
1353     CompoundStmtBits.LBraceLoc = Loc;
1354   }
1355
1356   // Build an empty compound statement.
1357   static CompoundStmt *CreateEmpty(const ASTContext &C, unsigned NumStmts);
1358
1359   bool body_empty() const { return CompoundStmtBits.NumStmts == 0; }
1360   unsigned size() const { return CompoundStmtBits.NumStmts; }
1361
1362   using body_iterator = Stmt **;
1363   using body_range = llvm::iterator_range<body_iterator>;
1364
1365   body_range body() { return body_range(body_begin(), body_end()); }
1366   body_iterator body_begin() { return getTrailingObjects<Stmt *>(); }
1367   body_iterator body_end() { return body_begin() + size(); }
1368   Stmt *body_front() { return !body_empty() ? body_begin()[0] : nullptr; }
1369
1370   Stmt *body_back() {
1371     return !body_empty() ? body_begin()[size() - 1] : nullptr;
1372   }
1373
1374   using const_body_iterator = Stmt *const *;
1375   using body_const_range = llvm::iterator_range<const_body_iterator>;
1376
1377   body_const_range body() const {
1378     return body_const_range(body_begin(), body_end());
1379   }
1380
1381   const_body_iterator body_begin() const {
1382     return getTrailingObjects<Stmt *>();
1383   }
1384
1385   const_body_iterator body_end() const { return body_begin() + size(); }
1386
1387   const Stmt *body_front() const {
1388     return !body_empty() ? body_begin()[0] : nullptr;
1389   }
1390
1391   const Stmt *body_back() const {
1392     return !body_empty() ? body_begin()[size() - 1] : nullptr;
1393   }
1394
1395   using reverse_body_iterator = std::reverse_iterator<body_iterator>;
1396
1397   reverse_body_iterator body_rbegin() {
1398     return reverse_body_iterator(body_end());
1399   }
1400
1401   reverse_body_iterator body_rend() {
1402     return reverse_body_iterator(body_begin());
1403   }
1404
1405   using const_reverse_body_iterator =
1406       std::reverse_iterator<const_body_iterator>;
1407
1408   const_reverse_body_iterator body_rbegin() const {
1409     return const_reverse_body_iterator(body_end());
1410   }
1411
1412   const_reverse_body_iterator body_rend() const {
1413     return const_reverse_body_iterator(body_begin());
1414   }
1415
1416   // Get the Stmt that StmtExpr would consider to be the result of this
1417   // compound statement. This is used by StmtExpr to properly emulate the GCC
1418   // compound expression extension, which ignores trailing NullStmts when
1419   // getting the result of the expression.
1420   // i.e. ({ 5;;; })
1421   //           ^^ ignored
1422   // If we don't find something that isn't a NullStmt, just return the last
1423   // Stmt.
1424   Stmt *getStmtExprResult() {
1425     for (auto *B : llvm::reverse(body())) {
1426       if (!isa<NullStmt>(B))
1427         return B;
1428     }
1429     return body_back();
1430   }
1431
1432   const Stmt *getStmtExprResult() const {
1433     return const_cast<CompoundStmt *>(this)->getStmtExprResult();
1434   }
1435
1436   SourceLocation getBeginLoc() const { return CompoundStmtBits.LBraceLoc; }
1437   SourceLocation getEndLoc() const { return RBraceLoc; }
1438
1439   SourceLocation getLBracLoc() const { return CompoundStmtBits.LBraceLoc; }
1440   SourceLocation getRBracLoc() const { return RBraceLoc; }
1441
1442   static bool classof(const Stmt *T) {
1443     return T->getStmtClass() == CompoundStmtClass;
1444   }
1445
1446   // Iterators
1447   child_range children() { return child_range(body_begin(), body_end()); }
1448
1449   const_child_range children() const {
1450     return const_child_range(body_begin(), body_end());
1451   }
1452 };
1453
1454 // SwitchCase is the base class for CaseStmt and DefaultStmt,
1455 class SwitchCase : public Stmt {
1456 protected:
1457   /// The location of the ":".
1458   SourceLocation ColonLoc;
1459
1460   // The location of the "case" or "default" keyword. Stored in SwitchCaseBits.
1461   // SourceLocation KeywordLoc;
1462
1463   /// A pointer to the following CaseStmt or DefaultStmt class,
1464   /// used by SwitchStmt.
1465   SwitchCase *NextSwitchCase = nullptr;
1466
1467   SwitchCase(StmtClass SC, SourceLocation KWLoc, SourceLocation ColonLoc)
1468       : Stmt(SC), ColonLoc(ColonLoc) {
1469     setKeywordLoc(KWLoc);
1470   }
1471
1472   SwitchCase(StmtClass SC, EmptyShell) : Stmt(SC) {}
1473
1474 public:
1475   const SwitchCase *getNextSwitchCase() const { return NextSwitchCase; }
1476   SwitchCase *getNextSwitchCase() { return NextSwitchCase; }
1477   void setNextSwitchCase(SwitchCase *SC) { NextSwitchCase = SC; }
1478
1479   SourceLocation getKeywordLoc() const { return SwitchCaseBits.KeywordLoc; }
1480   void setKeywordLoc(SourceLocation L) { SwitchCaseBits.KeywordLoc = L; }
1481   SourceLocation getColonLoc() const { return ColonLoc; }
1482   void setColonLoc(SourceLocation L) { ColonLoc = L; }
1483
1484   inline Stmt *getSubStmt();
1485   const Stmt *getSubStmt() const {
1486     return const_cast<SwitchCase *>(this)->getSubStmt();
1487   }
1488
1489   SourceLocation getBeginLoc() const { return getKeywordLoc(); }
1490   inline SourceLocation getEndLoc() const LLVM_READONLY;
1491
1492   static bool classof(const Stmt *T) {
1493     return T->getStmtClass() == CaseStmtClass ||
1494            T->getStmtClass() == DefaultStmtClass;
1495   }
1496 };
1497
1498 /// CaseStmt - Represent a case statement. It can optionally be a GNU case
1499 /// statement of the form LHS ... RHS representing a range of cases.
1500 class CaseStmt final
1501     : public SwitchCase,
1502       private llvm::TrailingObjects<CaseStmt, Stmt *, SourceLocation> {
1503   friend TrailingObjects;
1504
1505   // CaseStmt is followed by several trailing objects, some of which optional.
1506   // Note that it would be more convenient to put the optional trailing objects
1507   // at the end but this would impact children().
1508   // The trailing objects are in order:
1509   //
1510   // * A "Stmt *" for the LHS of the case statement. Always present.
1511   //
1512   // * A "Stmt *" for the RHS of the case statement. This is a GNU extension
1513   //   which allow ranges in cases statement of the form LHS ... RHS.
1514   //   Present if and only if caseStmtIsGNURange() is true.
1515   //
1516   // * A "Stmt *" for the substatement of the case statement. Always present.
1517   //
1518   // * A SourceLocation for the location of the ... if this is a case statement
1519   //   with a range. Present if and only if caseStmtIsGNURange() is true.
1520   enum { LhsOffset = 0, SubStmtOffsetFromRhs = 1 };
1521   enum { NumMandatoryStmtPtr = 2 };
1522
1523   unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
1524     return NumMandatoryStmtPtr + caseStmtIsGNURange();
1525   }
1526
1527   unsigned numTrailingObjects(OverloadToken<SourceLocation>) const {
1528     return caseStmtIsGNURange();
1529   }
1530
1531   unsigned lhsOffset() const { return LhsOffset; }
1532   unsigned rhsOffset() const { return LhsOffset + caseStmtIsGNURange(); }
1533   unsigned subStmtOffset() const { return rhsOffset() + SubStmtOffsetFromRhs; }
1534
1535   /// Build a case statement assuming that the storage for the
1536   /// trailing objects has been properly allocated.
1537   CaseStmt(Expr *lhs, Expr *rhs, SourceLocation caseLoc,
1538            SourceLocation ellipsisLoc, SourceLocation colonLoc)
1539       : SwitchCase(CaseStmtClass, caseLoc, colonLoc) {
1540     // Handle GNU case statements of the form LHS ... RHS.
1541     bool IsGNURange = rhs != nullptr;
1542     SwitchCaseBits.CaseStmtIsGNURange = IsGNURange;
1543     setLHS(lhs);
1544     setSubStmt(nullptr);
1545     if (IsGNURange) {
1546       setRHS(rhs);
1547       setEllipsisLoc(ellipsisLoc);
1548     }
1549   }
1550
1551   /// Build an empty switch case statement.
1552   explicit CaseStmt(EmptyShell Empty, bool CaseStmtIsGNURange)
1553       : SwitchCase(CaseStmtClass, Empty) {
1554     SwitchCaseBits.CaseStmtIsGNURange = CaseStmtIsGNURange;
1555   }
1556
1557 public:
1558   /// Build a case statement.
1559   static CaseStmt *Create(const ASTContext &Ctx, Expr *lhs, Expr *rhs,
1560                           SourceLocation caseLoc, SourceLocation ellipsisLoc,
1561                           SourceLocation colonLoc);
1562
1563   /// Build an empty case statement.
1564   static CaseStmt *CreateEmpty(const ASTContext &Ctx, bool CaseStmtIsGNURange);
1565
1566   /// True if this case statement is of the form case LHS ... RHS, which
1567   /// is a GNU extension. In this case the RHS can be obtained with getRHS()
1568   /// and the location of the ellipsis can be obtained with getEllipsisLoc().
1569   bool caseStmtIsGNURange() const { return SwitchCaseBits.CaseStmtIsGNURange; }
1570
1571   SourceLocation getCaseLoc() const { return getKeywordLoc(); }
1572   void setCaseLoc(SourceLocation L) { setKeywordLoc(L); }
1573
1574   /// Get the location of the ... in a case statement of the form LHS ... RHS.
1575   SourceLocation getEllipsisLoc() const {
1576     return caseStmtIsGNURange() ? *getTrailingObjects<SourceLocation>()
1577                                 : SourceLocation();
1578   }
1579
1580   /// Set the location of the ... in a case statement of the form LHS ... RHS.
1581   /// Assert that this case statement is of this form.
1582   void setEllipsisLoc(SourceLocation L) {
1583     assert(
1584         caseStmtIsGNURange() &&
1585         "setEllipsisLoc but this is not a case stmt of the form LHS ... RHS!");
1586     *getTrailingObjects<SourceLocation>() = L;
1587   }
1588
1589   Expr *getLHS() {
1590     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[lhsOffset()]);
1591   }
1592
1593   const Expr *getLHS() const {
1594     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[lhsOffset()]);
1595   }
1596
1597   void setLHS(Expr *Val) {
1598     getTrailingObjects<Stmt *>()[lhsOffset()] = reinterpret_cast<Stmt *>(Val);
1599   }
1600
1601   Expr *getRHS() {
1602     return caseStmtIsGNURange() ? reinterpret_cast<Expr *>(
1603                                       getTrailingObjects<Stmt *>()[rhsOffset()])
1604                                 : nullptr;
1605   }
1606
1607   const Expr *getRHS() const {
1608     return caseStmtIsGNURange() ? reinterpret_cast<Expr *>(
1609                                       getTrailingObjects<Stmt *>()[rhsOffset()])
1610                                 : nullptr;
1611   }
1612
1613   void setRHS(Expr *Val) {
1614     assert(caseStmtIsGNURange() &&
1615            "setRHS but this is not a case stmt of the form LHS ... RHS!");
1616     getTrailingObjects<Stmt *>()[rhsOffset()] = reinterpret_cast<Stmt *>(Val);
1617   }
1618
1619   Stmt *getSubStmt() { return getTrailingObjects<Stmt *>()[subStmtOffset()]; }
1620   const Stmt *getSubStmt() const {
1621     return getTrailingObjects<Stmt *>()[subStmtOffset()];
1622   }
1623
1624   void setSubStmt(Stmt *S) {
1625     getTrailingObjects<Stmt *>()[subStmtOffset()] = S;
1626   }
1627
1628   SourceLocation getBeginLoc() const { return getKeywordLoc(); }
1629   SourceLocation getEndLoc() const LLVM_READONLY {
1630     // Handle deeply nested case statements with iteration instead of recursion.
1631     const CaseStmt *CS = this;
1632     while (const auto *CS2 = dyn_cast<CaseStmt>(CS->getSubStmt()))
1633       CS = CS2;
1634
1635     return CS->getSubStmt()->getEndLoc();
1636   }
1637
1638   static bool classof(const Stmt *T) {
1639     return T->getStmtClass() == CaseStmtClass;
1640   }
1641
1642   // Iterators
1643   child_range children() {
1644     return child_range(getTrailingObjects<Stmt *>(),
1645                        getTrailingObjects<Stmt *>() +
1646                            numTrailingObjects(OverloadToken<Stmt *>()));
1647   }
1648
1649   const_child_range children() const {
1650     return const_child_range(getTrailingObjects<Stmt *>(),
1651                              getTrailingObjects<Stmt *>() +
1652                                  numTrailingObjects(OverloadToken<Stmt *>()));
1653   }
1654 };
1655
1656 class DefaultStmt : public SwitchCase {
1657   Stmt *SubStmt;
1658
1659 public:
1660   DefaultStmt(SourceLocation DL, SourceLocation CL, Stmt *substmt)
1661       : SwitchCase(DefaultStmtClass, DL, CL), SubStmt(substmt) {}
1662
1663   /// Build an empty default statement.
1664   explicit DefaultStmt(EmptyShell Empty)
1665       : SwitchCase(DefaultStmtClass, Empty) {}
1666
1667   Stmt *getSubStmt() { return SubStmt; }
1668   const Stmt *getSubStmt() const { return SubStmt; }
1669   void setSubStmt(Stmt *S) { SubStmt = S; }
1670
1671   SourceLocation getDefaultLoc() const { return getKeywordLoc(); }
1672   void setDefaultLoc(SourceLocation L) { setKeywordLoc(L); }
1673
1674   SourceLocation getBeginLoc() const { return getKeywordLoc(); }
1675   SourceLocation getEndLoc() const LLVM_READONLY {
1676     return SubStmt->getEndLoc();
1677   }
1678
1679   static bool classof(const Stmt *T) {
1680     return T->getStmtClass() == DefaultStmtClass;
1681   }
1682
1683   // Iterators
1684   child_range children() { return child_range(&SubStmt, &SubStmt + 1); }
1685
1686   const_child_range children() const {
1687     return const_child_range(&SubStmt, &SubStmt + 1);
1688   }
1689 };
1690
1691 SourceLocation SwitchCase::getEndLoc() const {
1692   if (const auto *CS = dyn_cast<CaseStmt>(this))
1693     return CS->getEndLoc();
1694   else if (const auto *DS = dyn_cast<DefaultStmt>(this))
1695     return DS->getEndLoc();
1696   llvm_unreachable("SwitchCase is neither a CaseStmt nor a DefaultStmt!");
1697 }
1698
1699 Stmt *SwitchCase::getSubStmt() {
1700   if (auto *CS = dyn_cast<CaseStmt>(this))
1701     return CS->getSubStmt();
1702   else if (auto *DS = dyn_cast<DefaultStmt>(this))
1703     return DS->getSubStmt();
1704   llvm_unreachable("SwitchCase is neither a CaseStmt nor a DefaultStmt!");
1705 }
1706
1707 /// Represents a statement that could possibly have a value and type. This
1708 /// covers expression-statements, as well as labels and attributed statements.
1709 ///
1710 /// Value statements have a special meaning when they are the last non-null
1711 /// statement in a GNU statement expression, where they determine the value
1712 /// of the statement expression.
1713 class ValueStmt : public Stmt {
1714 protected:
1715   using Stmt::Stmt;
1716
1717 public:
1718   const Expr *getExprStmt() const;
1719   Expr *getExprStmt() {
1720     const ValueStmt *ConstThis = this;
1721     return const_cast<Expr*>(ConstThis->getExprStmt());
1722   }
1723
1724   static bool classof(const Stmt *T) {
1725     return T->getStmtClass() >= firstValueStmtConstant &&
1726            T->getStmtClass() <= lastValueStmtConstant;
1727   }
1728 };
1729
1730 /// LabelStmt - Represents a label, which has a substatement.  For example:
1731 ///    foo: return;
1732 class LabelStmt : public ValueStmt {
1733   LabelDecl *TheDecl;
1734   Stmt *SubStmt;
1735
1736 public:
1737   /// Build a label statement.
1738   LabelStmt(SourceLocation IL, LabelDecl *D, Stmt *substmt)
1739       : ValueStmt(LabelStmtClass), TheDecl(D), SubStmt(substmt) {
1740     setIdentLoc(IL);
1741   }
1742
1743   /// Build an empty label statement.
1744   explicit LabelStmt(EmptyShell Empty) : ValueStmt(LabelStmtClass, Empty) {}
1745
1746   SourceLocation getIdentLoc() const { return LabelStmtBits.IdentLoc; }
1747   void setIdentLoc(SourceLocation L) { LabelStmtBits.IdentLoc = L; }
1748
1749   LabelDecl *getDecl() const { return TheDecl; }
1750   void setDecl(LabelDecl *D) { TheDecl = D; }
1751
1752   const char *getName() const;
1753   Stmt *getSubStmt() { return SubStmt; }
1754
1755   const Stmt *getSubStmt() const { return SubStmt; }
1756   void setSubStmt(Stmt *SS) { SubStmt = SS; }
1757
1758   SourceLocation getBeginLoc() const { return getIdentLoc(); }
1759   SourceLocation getEndLoc() const LLVM_READONLY { return SubStmt->getEndLoc();}
1760
1761   child_range children() { return child_range(&SubStmt, &SubStmt + 1); }
1762
1763   const_child_range children() const {
1764     return const_child_range(&SubStmt, &SubStmt + 1);
1765   }
1766
1767   static bool classof(const Stmt *T) {
1768     return T->getStmtClass() == LabelStmtClass;
1769   }
1770 };
1771
1772 /// Represents an attribute applied to a statement.
1773 ///
1774 /// Represents an attribute applied to a statement. For example:
1775 ///   [[omp::for(...)]] for (...) { ... }
1776 class AttributedStmt final
1777     : public ValueStmt,
1778       private llvm::TrailingObjects<AttributedStmt, const Attr *> {
1779   friend class ASTStmtReader;
1780   friend TrailingObjects;
1781
1782   Stmt *SubStmt;
1783
1784   AttributedStmt(SourceLocation Loc, ArrayRef<const Attr *> Attrs,
1785                  Stmt *SubStmt)
1786       : ValueStmt(AttributedStmtClass), SubStmt(SubStmt) {
1787     AttributedStmtBits.NumAttrs = Attrs.size();
1788     AttributedStmtBits.AttrLoc = Loc;
1789     std::copy(Attrs.begin(), Attrs.end(), getAttrArrayPtr());
1790   }
1791
1792   explicit AttributedStmt(EmptyShell Empty, unsigned NumAttrs)
1793       : ValueStmt(AttributedStmtClass, Empty) {
1794     AttributedStmtBits.NumAttrs = NumAttrs;
1795     AttributedStmtBits.AttrLoc = SourceLocation{};
1796     std::fill_n(getAttrArrayPtr(), NumAttrs, nullptr);
1797   }
1798
1799   const Attr *const *getAttrArrayPtr() const {
1800     return getTrailingObjects<const Attr *>();
1801   }
1802   const Attr **getAttrArrayPtr() { return getTrailingObjects<const Attr *>(); }
1803
1804 public:
1805   static AttributedStmt *Create(const ASTContext &C, SourceLocation Loc,
1806                                 ArrayRef<const Attr *> Attrs, Stmt *SubStmt);
1807
1808   // Build an empty attributed statement.
1809   static AttributedStmt *CreateEmpty(const ASTContext &C, unsigned NumAttrs);
1810
1811   SourceLocation getAttrLoc() const { return AttributedStmtBits.AttrLoc; }
1812   ArrayRef<const Attr *> getAttrs() const {
1813     return llvm::makeArrayRef(getAttrArrayPtr(), AttributedStmtBits.NumAttrs);
1814   }
1815
1816   Stmt *getSubStmt() { return SubStmt; }
1817   const Stmt *getSubStmt() const { return SubStmt; }
1818
1819   SourceLocation getBeginLoc() const { return getAttrLoc(); }
1820   SourceLocation getEndLoc() const LLVM_READONLY { return SubStmt->getEndLoc();}
1821
1822   child_range children() { return child_range(&SubStmt, &SubStmt + 1); }
1823
1824   const_child_range children() const {
1825     return const_child_range(&SubStmt, &SubStmt + 1);
1826   }
1827
1828   static bool classof(const Stmt *T) {
1829     return T->getStmtClass() == AttributedStmtClass;
1830   }
1831 };
1832
1833 /// IfStmt - This represents an if/then/else.
1834 class IfStmt final
1835     : public Stmt,
1836       private llvm::TrailingObjects<IfStmt, Stmt *, SourceLocation> {
1837   friend TrailingObjects;
1838
1839   // IfStmt is followed by several trailing objects, some of which optional.
1840   // Note that it would be more convenient to put the optional trailing
1841   // objects at then end but this would change the order of the children.
1842   // The trailing objects are in order:
1843   //
1844   // * A "Stmt *" for the init statement.
1845   //    Present if and only if hasInitStorage().
1846   //
1847   // * A "Stmt *" for the condition variable.
1848   //    Present if and only if hasVarStorage(). This is in fact a "DeclStmt *".
1849   //
1850   // * A "Stmt *" for the condition.
1851   //    Always present. This is in fact a "Expr *".
1852   //
1853   // * A "Stmt *" for the then statement.
1854   //    Always present.
1855   //
1856   // * A "Stmt *" for the else statement.
1857   //    Present if and only if hasElseStorage().
1858   //
1859   // * A "SourceLocation" for the location of the "else".
1860   //    Present if and only if hasElseStorage().
1861   enum { InitOffset = 0, ThenOffsetFromCond = 1, ElseOffsetFromCond = 2 };
1862   enum { NumMandatoryStmtPtr = 2 };
1863
1864   unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
1865     return NumMandatoryStmtPtr + hasElseStorage() + hasVarStorage() +
1866            hasInitStorage();
1867   }
1868
1869   unsigned numTrailingObjects(OverloadToken<SourceLocation>) const {
1870     return hasElseStorage();
1871   }
1872
1873   unsigned initOffset() const { return InitOffset; }
1874   unsigned varOffset() const { return InitOffset + hasInitStorage(); }
1875   unsigned condOffset() const {
1876     return InitOffset + hasInitStorage() + hasVarStorage();
1877   }
1878   unsigned thenOffset() const { return condOffset() + ThenOffsetFromCond; }
1879   unsigned elseOffset() const { return condOffset() + ElseOffsetFromCond; }
1880
1881   /// Build an if/then/else statement.
1882   IfStmt(const ASTContext &Ctx, SourceLocation IL, bool IsConstexpr, Stmt *Init,
1883          VarDecl *Var, Expr *Cond, Stmt *Then, SourceLocation EL, Stmt *Else);
1884
1885   /// Build an empty if/then/else statement.
1886   explicit IfStmt(EmptyShell Empty, bool HasElse, bool HasVar, bool HasInit);
1887
1888 public:
1889   /// Create an IfStmt.
1890   static IfStmt *Create(const ASTContext &Ctx, SourceLocation IL,
1891                         bool IsConstexpr, Stmt *Init, VarDecl *Var, Expr *Cond,
1892                         Stmt *Then, SourceLocation EL = SourceLocation(),
1893                         Stmt *Else = nullptr);
1894
1895   /// Create an empty IfStmt optionally with storage for an else statement,
1896   /// condition variable and init expression.
1897   static IfStmt *CreateEmpty(const ASTContext &Ctx, bool HasElse, bool HasVar,
1898                              bool HasInit);
1899
1900   /// True if this IfStmt has the storage for an init statement.
1901   bool hasInitStorage() const { return IfStmtBits.HasInit; }
1902
1903   /// True if this IfStmt has storage for a variable declaration.
1904   bool hasVarStorage() const { return IfStmtBits.HasVar; }
1905
1906   /// True if this IfStmt has storage for an else statement.
1907   bool hasElseStorage() const { return IfStmtBits.HasElse; }
1908
1909   Expr *getCond() {
1910     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
1911   }
1912
1913   const Expr *getCond() const {
1914     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
1915   }
1916
1917   void setCond(Expr *Cond) {
1918     getTrailingObjects<Stmt *>()[condOffset()] = reinterpret_cast<Stmt *>(Cond);
1919   }
1920
1921   Stmt *getThen() { return getTrailingObjects<Stmt *>()[thenOffset()]; }
1922   const Stmt *getThen() const {
1923     return getTrailingObjects<Stmt *>()[thenOffset()];
1924   }
1925
1926   void setThen(Stmt *Then) {
1927     getTrailingObjects<Stmt *>()[thenOffset()] = Then;
1928   }
1929
1930   Stmt *getElse() {
1931     return hasElseStorage() ? getTrailingObjects<Stmt *>()[elseOffset()]
1932                             : nullptr;
1933   }
1934
1935   const Stmt *getElse() const {
1936     return hasElseStorage() ? getTrailingObjects<Stmt *>()[elseOffset()]
1937                             : nullptr;
1938   }
1939
1940   void setElse(Stmt *Else) {
1941     assert(hasElseStorage() &&
1942            "This if statement has no storage for an else statement!");
1943     getTrailingObjects<Stmt *>()[elseOffset()] = Else;
1944   }
1945
1946   /// Retrieve the variable declared in this "if" statement, if any.
1947   ///
1948   /// In the following example, "x" is the condition variable.
1949   /// \code
1950   /// if (int x = foo()) {
1951   ///   printf("x is %d", x);
1952   /// }
1953   /// \endcode
1954   VarDecl *getConditionVariable();
1955   const VarDecl *getConditionVariable() const {
1956     return const_cast<IfStmt *>(this)->getConditionVariable();
1957   }
1958
1959   /// Set the condition variable for this if statement.
1960   /// The if statement must have storage for the condition variable.
1961   void setConditionVariable(const ASTContext &Ctx, VarDecl *V);
1962
1963   /// If this IfStmt has a condition variable, return the faux DeclStmt
1964   /// associated with the creation of that condition variable.
1965   DeclStmt *getConditionVariableDeclStmt() {
1966     return hasVarStorage() ? static_cast<DeclStmt *>(
1967                                  getTrailingObjects<Stmt *>()[varOffset()])
1968                            : nullptr;
1969   }
1970
1971   const DeclStmt *getConditionVariableDeclStmt() const {
1972     return hasVarStorage() ? static_cast<DeclStmt *>(
1973                                  getTrailingObjects<Stmt *>()[varOffset()])
1974                            : nullptr;
1975   }
1976
1977   Stmt *getInit() {
1978     return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
1979                             : nullptr;
1980   }
1981
1982   const Stmt *getInit() const {
1983     return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
1984                             : nullptr;
1985   }
1986
1987   void setInit(Stmt *Init) {
1988     assert(hasInitStorage() &&
1989            "This if statement has no storage for an init statement!");
1990     getTrailingObjects<Stmt *>()[initOffset()] = Init;
1991   }
1992
1993   SourceLocation getIfLoc() const { return IfStmtBits.IfLoc; }
1994   void setIfLoc(SourceLocation IfLoc) { IfStmtBits.IfLoc = IfLoc; }
1995
1996   SourceLocation getElseLoc() const {
1997     return hasElseStorage() ? *getTrailingObjects<SourceLocation>()
1998                             : SourceLocation();
1999   }
2000
2001   void setElseLoc(SourceLocation ElseLoc) {
2002     assert(hasElseStorage() &&
2003            "This if statement has no storage for an else statement!");
2004     *getTrailingObjects<SourceLocation>() = ElseLoc;
2005   }
2006
2007   bool isConstexpr() const { return IfStmtBits.IsConstexpr; }
2008   void setConstexpr(bool C) { IfStmtBits.IsConstexpr = C; }
2009
2010   /// If this is an 'if constexpr', determine which substatement will be taken.
2011   /// Otherwise, or if the condition is value-dependent, returns None.
2012   Optional<const Stmt*> getNondiscardedCase(const ASTContext &Ctx) const;
2013
2014   bool isObjCAvailabilityCheck() const;
2015
2016   SourceLocation getBeginLoc() const { return getIfLoc(); }
2017   SourceLocation getEndLoc() const LLVM_READONLY {
2018     if (getElse())
2019       return getElse()->getEndLoc();
2020     return getThen()->getEndLoc();
2021   }
2022
2023   // Iterators over subexpressions.  The iterators will include iterating
2024   // over the initialization expression referenced by the condition variable.
2025   child_range children() {
2026     return child_range(getTrailingObjects<Stmt *>(),
2027                        getTrailingObjects<Stmt *>() +
2028                            numTrailingObjects(OverloadToken<Stmt *>()));
2029   }
2030
2031   const_child_range children() const {
2032     return const_child_range(getTrailingObjects<Stmt *>(),
2033                              getTrailingObjects<Stmt *>() +
2034                                  numTrailingObjects(OverloadToken<Stmt *>()));
2035   }
2036
2037   static bool classof(const Stmt *T) {
2038     return T->getStmtClass() == IfStmtClass;
2039   }
2040 };
2041
2042 /// SwitchStmt - This represents a 'switch' stmt.
2043 class SwitchStmt final : public Stmt,
2044                          private llvm::TrailingObjects<SwitchStmt, Stmt *> {
2045   friend TrailingObjects;
2046
2047   /// Points to a linked list of case and default statements.
2048   SwitchCase *FirstCase;
2049
2050   // SwitchStmt is followed by several trailing objects,
2051   // some of which optional. Note that it would be more convenient to
2052   // put the optional trailing objects at the end but this would change
2053   // the order in children().
2054   // The trailing objects are in order:
2055   //
2056   // * A "Stmt *" for the init statement.
2057   //    Present if and only if hasInitStorage().
2058   //
2059   // * A "Stmt *" for the condition variable.
2060   //    Present if and only if hasVarStorage(). This is in fact a "DeclStmt *".
2061   //
2062   // * A "Stmt *" for the condition.
2063   //    Always present. This is in fact an "Expr *".
2064   //
2065   // * A "Stmt *" for the body.
2066   //    Always present.
2067   enum { InitOffset = 0, BodyOffsetFromCond = 1 };
2068   enum { NumMandatoryStmtPtr = 2 };
2069
2070   unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
2071     return NumMandatoryStmtPtr + hasInitStorage() + hasVarStorage();
2072   }
2073
2074   unsigned initOffset() const { return InitOffset; }
2075   unsigned varOffset() const { return InitOffset + hasInitStorage(); }
2076   unsigned condOffset() const {
2077     return InitOffset + hasInitStorage() + hasVarStorage();
2078   }
2079   unsigned bodyOffset() const { return condOffset() + BodyOffsetFromCond; }
2080
2081   /// Build a switch statement.
2082   SwitchStmt(const ASTContext &Ctx, Stmt *Init, VarDecl *Var, Expr *Cond);
2083
2084   /// Build a empty switch statement.
2085   explicit SwitchStmt(EmptyShell Empty, bool HasInit, bool HasVar);
2086
2087 public:
2088   /// Create a switch statement.
2089   static SwitchStmt *Create(const ASTContext &Ctx, Stmt *Init, VarDecl *Var,
2090                             Expr *Cond);
2091
2092   /// Create an empty switch statement optionally with storage for
2093   /// an init expression and a condition variable.
2094   static SwitchStmt *CreateEmpty(const ASTContext &Ctx, bool HasInit,
2095                                  bool HasVar);
2096
2097   /// True if this SwitchStmt has storage for an init statement.
2098   bool hasInitStorage() const { return SwitchStmtBits.HasInit; }
2099
2100   /// True if this SwitchStmt has storage for a condition variable.
2101   bool hasVarStorage() const { return SwitchStmtBits.HasVar; }
2102
2103   Expr *getCond() {
2104     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
2105   }
2106
2107   const Expr *getCond() const {
2108     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
2109   }
2110
2111   void setCond(Expr *Cond) {
2112     getTrailingObjects<Stmt *>()[condOffset()] = reinterpret_cast<Stmt *>(Cond);
2113   }
2114
2115   Stmt *getBody() { return getTrailingObjects<Stmt *>()[bodyOffset()]; }
2116   const Stmt *getBody() const {
2117     return getTrailingObjects<Stmt *>()[bodyOffset()];
2118   }
2119
2120   void setBody(Stmt *Body) {
2121     getTrailingObjects<Stmt *>()[bodyOffset()] = Body;
2122   }
2123
2124   Stmt *getInit() {
2125     return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
2126                             : nullptr;
2127   }
2128
2129   const Stmt *getInit() const {
2130     return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
2131                             : nullptr;
2132   }
2133
2134   void setInit(Stmt *Init) {
2135     assert(hasInitStorage() &&
2136            "This switch statement has no storage for an init statement!");
2137     getTrailingObjects<Stmt *>()[initOffset()] = Init;
2138   }
2139
2140   /// Retrieve the variable declared in this "switch" statement, if any.
2141   ///
2142   /// In the following example, "x" is the condition variable.
2143   /// \code
2144   /// switch (int x = foo()) {
2145   ///   case 0: break;
2146   ///   // ...
2147   /// }
2148   /// \endcode
2149   VarDecl *getConditionVariable();
2150   const VarDecl *getConditionVariable() const {
2151     return const_cast<SwitchStmt *>(this)->getConditionVariable();
2152   }
2153
2154   /// Set the condition variable in this switch statement.
2155   /// The switch statement must have storage for it.
2156   void setConditionVariable(const ASTContext &Ctx, VarDecl *VD);
2157
2158   /// If this SwitchStmt has a condition variable, return the faux DeclStmt
2159   /// associated with the creation of that condition variable.
2160   DeclStmt *getConditionVariableDeclStmt() {
2161     return hasVarStorage() ? static_cast<DeclStmt *>(
2162                                  getTrailingObjects<Stmt *>()[varOffset()])
2163                            : nullptr;
2164   }
2165
2166   const DeclStmt *getConditionVariableDeclStmt() const {
2167     return hasVarStorage() ? static_cast<DeclStmt *>(
2168                                  getTrailingObjects<Stmt *>()[varOffset()])
2169                            : nullptr;
2170   }
2171
2172   SwitchCase *getSwitchCaseList() { return FirstCase; }
2173   const SwitchCase *getSwitchCaseList() const { return FirstCase; }
2174   void setSwitchCaseList(SwitchCase *SC) { FirstCase = SC; }
2175
2176   SourceLocation getSwitchLoc() const { return SwitchStmtBits.SwitchLoc; }
2177   void setSwitchLoc(SourceLocation L) { SwitchStmtBits.SwitchLoc = L; }
2178
2179   void setBody(Stmt *S, SourceLocation SL) {
2180     setBody(S);
2181     setSwitchLoc(SL);
2182   }
2183
2184   void addSwitchCase(SwitchCase *SC) {
2185     assert(!SC->getNextSwitchCase() &&
2186            "case/default already added to a switch");
2187     SC->setNextSwitchCase(FirstCase);
2188     FirstCase = SC;
2189   }
2190
2191   /// Set a flag in the SwitchStmt indicating that if the 'switch (X)' is a
2192   /// switch over an enum value then all cases have been explicitly covered.
2193   void setAllEnumCasesCovered() { SwitchStmtBits.AllEnumCasesCovered = true; }
2194
2195   /// Returns true if the SwitchStmt is a switch of an enum value and all cases
2196   /// have been explicitly covered.
2197   bool isAllEnumCasesCovered() const {
2198     return SwitchStmtBits.AllEnumCasesCovered;
2199   }
2200
2201   SourceLocation getBeginLoc() const { return getSwitchLoc(); }
2202   SourceLocation getEndLoc() const LLVM_READONLY {
2203     return getBody() ? getBody()->getEndLoc()
2204                      : reinterpret_cast<const Stmt *>(getCond())->getEndLoc();
2205   }
2206
2207   // Iterators
2208   child_range children() {
2209     return child_range(getTrailingObjects<Stmt *>(),
2210                        getTrailingObjects<Stmt *>() +
2211                            numTrailingObjects(OverloadToken<Stmt *>()));
2212   }
2213
2214   const_child_range children() const {
2215     return const_child_range(getTrailingObjects<Stmt *>(),
2216                              getTrailingObjects<Stmt *>() +
2217                                  numTrailingObjects(OverloadToken<Stmt *>()));
2218   }
2219
2220   static bool classof(const Stmt *T) {
2221     return T->getStmtClass() == SwitchStmtClass;
2222   }
2223 };
2224
2225 /// WhileStmt - This represents a 'while' stmt.
2226 class WhileStmt final : public Stmt,
2227                         private llvm::TrailingObjects<WhileStmt, Stmt *> {
2228   friend TrailingObjects;
2229
2230   // WhileStmt is followed by several trailing objects,
2231   // some of which optional. Note that it would be more
2232   // convenient to put the optional trailing object at the end
2233   // but this would affect children().
2234   // The trailing objects are in order:
2235   //
2236   // * A "Stmt *" for the condition variable.
2237   //    Present if and only if hasVarStorage(). This is in fact a "DeclStmt *".
2238   //
2239   // * A "Stmt *" for the condition.
2240   //    Always present. This is in fact an "Expr *".
2241   //
2242   // * A "Stmt *" for the body.
2243   //    Always present.
2244   //
2245   enum { VarOffset = 0, BodyOffsetFromCond = 1 };
2246   enum { NumMandatoryStmtPtr = 2 };
2247
2248   unsigned varOffset() const { return VarOffset; }
2249   unsigned condOffset() const { return VarOffset + hasVarStorage(); }
2250   unsigned bodyOffset() const { return condOffset() + BodyOffsetFromCond; }
2251
2252   unsigned numTrailingObjects(OverloadToken<Stmt *>) const {
2253     return NumMandatoryStmtPtr + hasVarStorage();
2254   }
2255
2256   /// Build a while statement.
2257   WhileStmt(const ASTContext &Ctx, VarDecl *Var, Expr *Cond, Stmt *Body,
2258             SourceLocation WL);
2259
2260   /// Build an empty while statement.
2261   explicit WhileStmt(EmptyShell Empty, bool HasVar);
2262
2263 public:
2264   /// Create a while statement.
2265   static WhileStmt *Create(const ASTContext &Ctx, VarDecl *Var, Expr *Cond,
2266                            Stmt *Body, SourceLocation WL);
2267
2268   /// Create an empty while statement optionally with storage for
2269   /// a condition variable.
2270   static WhileStmt *CreateEmpty(const ASTContext &Ctx, bool HasVar);
2271
2272   /// True if this WhileStmt has storage for a condition variable.
2273   bool hasVarStorage() const { return WhileStmtBits.HasVar; }
2274
2275   Expr *getCond() {
2276     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
2277   }
2278
2279   const Expr *getCond() const {
2280     return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]);
2281   }
2282
2283   void setCond(Expr *Cond) {
2284     getTrailingObjects<Stmt *>()[condOffset()] = reinterpret_cast<Stmt *>(Cond);
2285   }
2286
2287   Stmt *getBody() { return getTrailingObjects<Stmt *>()[bodyOffset()]; }
2288   const Stmt *getBody() const {
2289     return getTrailingObjects<Stmt *>()[bodyOffset()];
2290   }
2291
2292   void setBody(Stmt *Body) {
2293     getTrailingObjects<Stmt *>()[bodyOffset()] = Body;
2294   }
2295
2296   /// Retrieve the variable declared in this "while" statement, if any.
2297   ///
2298   /// In the following example, "x" is the condition variable.
2299   /// \code
2300   /// while (int x = random()) {
2301   ///   // ...
2302   /// }
2303   /// \endcode
2304   VarDecl *getConditionVariable();
2305   const VarDecl *getConditionVariable() const {
2306     return const_cast<WhileStmt *>(this)->getConditionVariable();
2307   }
2308
2309   /// Set the condition variable of this while statement.
2310   /// The while statement must have storage for it.
2311   void setConditionVariable(const ASTContext &Ctx, VarDecl *V);
2312
2313   /// If this WhileStmt has a condition variable, return the faux DeclStmt
2314   /// associated with the creation of that condition variable.
2315   DeclStmt *getConditionVariableDeclStmt() {
2316     return hasVarStorage() ? static_cast<DeclStmt *>(
2317                                  getTrailingObjects<Stmt *>()[varOffset()])
2318                            : nullptr;
2319   }
2320
2321   const DeclStmt *getConditionVariableDeclStmt() const {
2322     return hasVarStorage() ? static_cast<DeclStmt *>(
2323                                  getTrailingObjects<Stmt *>()[varOffset()])
2324                            : nullptr;
2325   }
2326
2327   SourceLocation getWhileLoc() const { return WhileStmtBits.WhileLoc; }
2328   void setWhileLoc(SourceLocation L) { WhileStmtBits.WhileLoc = L; }
2329
2330   SourceLocation getBeginLoc() const { return getWhileLoc(); }
2331   SourceLocation getEndLoc() const LLVM_READONLY {
2332     return getBody()->getEndLoc();
2333   }
2334
2335   static bool classof(const Stmt *T) {
2336     return T->getStmtClass() == WhileStmtClass;
2337   }
2338
2339   // Iterators
2340   child_range children() {
2341     return child_range(getTrailingObjects<Stmt *>(),
2342                        getTrailingObjects<Stmt *>() +
2343                            numTrailingObjects(OverloadToken<Stmt *>()));
2344   }
2345
2346   const_child_range children() const {
2347     return const_child_range(getTrailingObjects<Stmt *>(),
2348                              getTrailingObjects<Stmt *>() +
2349                                  numTrailingObjects(OverloadToken<Stmt *>()));
2350   }
2351 };
2352
2353 /// DoStmt - This represents a 'do/while' stmt.
2354 class DoStmt : public Stmt {
2355   enum { BODY, COND, END_EXPR };
2356   Stmt *SubExprs[END_EXPR];
2357   SourceLocation WhileLoc;
2358   SourceLocation RParenLoc; // Location of final ')' in do stmt condition.
2359
2360 public:
2361   DoStmt(Stmt *Body, Expr *Cond, SourceLocation DL, SourceLocation WL,
2362          SourceLocation RP)
2363       : Stmt(DoStmtClass), WhileLoc(WL), RParenLoc(RP) {
2364     setCond(Cond);
2365     setBody(Body);
2366     setDoLoc(DL);
2367   }
2368
2369   /// Build an empty do-while statement.
2370   explicit DoStmt(EmptyShell Empty) : Stmt(DoStmtClass, Empty) {}
2371
2372   Expr *getCond() { return reinterpret_cast<Expr *>(SubExprs[COND]); }
2373   const Expr *getCond() const {
2374     return reinterpret_cast<Expr *>(SubExprs[COND]);
2375   }
2376
2377   void setCond(Expr *Cond) { SubExprs[COND] = reinterpret_cast<Stmt *>(Cond); }
2378
2379   Stmt *getBody() { return SubExprs[BODY]; }
2380   const Stmt *getBody() const { return SubExprs[BODY]; }
2381   void setBody(Stmt *Body) { SubExprs[BODY] = Body; }
2382
2383   SourceLocation getDoLoc() const { return DoStmtBits.DoLoc; }
2384   void setDoLoc(SourceLocation L) { DoStmtBits.DoLoc = L; }
2385   SourceLocation getWhileLoc() const { return WhileLoc; }
2386   void setWhileLoc(SourceLocation L) { WhileLoc = L; }
2387   SourceLocation getRParenLoc() const { return RParenLoc; }
2388   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
2389
2390   SourceLocation getBeginLoc() const { return getDoLoc(); }
2391   SourceLocation getEndLoc() const { return getRParenLoc(); }
2392
2393   static bool classof(const Stmt *T) {
2394     return T->getStmtClass() == DoStmtClass;
2395   }
2396
2397   // Iterators
2398   child_range children() {
2399     return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2400   }
2401
2402   const_child_range children() const {
2403     return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2404   }
2405 };
2406
2407 /// ForStmt - This represents a 'for (init;cond;inc)' stmt.  Note that any of
2408 /// the init/cond/inc parts of the ForStmt will be null if they were not
2409 /// specified in the source.
2410 class ForStmt : public Stmt {
2411   enum { INIT, CONDVAR, COND, INC, BODY, END_EXPR };
2412   Stmt* SubExprs[END_EXPR]; // SubExprs[INIT] is an expression or declstmt.
2413   SourceLocation LParenLoc, RParenLoc;
2414
2415 public:
2416   ForStmt(const ASTContext &C, Stmt *Init, Expr *Cond, VarDecl *condVar,
2417           Expr *Inc, Stmt *Body, SourceLocation FL, SourceLocation LP,
2418           SourceLocation RP);
2419
2420   /// Build an empty for statement.
2421   explicit ForStmt(EmptyShell Empty) : Stmt(ForStmtClass, Empty) {}
2422
2423   Stmt *getInit() { return SubExprs[INIT]; }
2424
2425   /// Retrieve the variable declared in this "for" statement, if any.
2426   ///
2427   /// In the following example, "y" is the condition variable.
2428   /// \code
2429   /// for (int x = random(); int y = mangle(x); ++x) {
2430   ///   // ...
2431   /// }
2432   /// \endcode
2433   VarDecl *getConditionVariable() const;
2434   void setConditionVariable(const ASTContext &C, VarDecl *V);
2435
2436   /// If this ForStmt has a condition variable, return the faux DeclStmt
2437   /// associated with the creation of that condition variable.
2438   const DeclStmt *getConditionVariableDeclStmt() const {
2439     return reinterpret_cast<DeclStmt*>(SubExprs[CONDVAR]);
2440   }
2441
2442   Expr *getCond() { return reinterpret_cast<Expr*>(SubExprs[COND]); }
2443   Expr *getInc()  { return reinterpret_cast<Expr*>(SubExprs[INC]); }
2444   Stmt *getBody() { return SubExprs[BODY]; }
2445
2446   const Stmt *getInit() const { return SubExprs[INIT]; }
2447   const Expr *getCond() const { return reinterpret_cast<Expr*>(SubExprs[COND]);}
2448   const Expr *getInc()  const { return reinterpret_cast<Expr*>(SubExprs[INC]); }
2449   const Stmt *getBody() const { return SubExprs[BODY]; }
2450
2451   void setInit(Stmt *S) { SubExprs[INIT] = S; }
2452   void setCond(Expr *E) { SubExprs[COND] = reinterpret_cast<Stmt*>(E); }
2453   void setInc(Expr *E) { SubExprs[INC] = reinterpret_cast<Stmt*>(E); }
2454   void setBody(Stmt *S) { SubExprs[BODY] = S; }
2455
2456   SourceLocation getForLoc() const { return ForStmtBits.ForLoc; }
2457   void setForLoc(SourceLocation L) { ForStmtBits.ForLoc = L; }
2458   SourceLocation getLParenLoc() const { return LParenLoc; }
2459   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
2460   SourceLocation getRParenLoc() const { return RParenLoc; }
2461   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
2462
2463   SourceLocation getBeginLoc() const { return getForLoc(); }
2464   SourceLocation getEndLoc() const { return getBody()->getEndLoc(); }
2465
2466   static bool classof(const Stmt *T) {
2467     return T->getStmtClass() == ForStmtClass;
2468   }
2469
2470   // Iterators
2471   child_range children() {
2472     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
2473   }
2474
2475   const_child_range children() const {
2476     return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2477   }
2478 };
2479
2480 /// GotoStmt - This represents a direct goto.
2481 class GotoStmt : public Stmt {
2482   LabelDecl *Label;
2483   SourceLocation LabelLoc;
2484
2485 public:
2486   GotoStmt(LabelDecl *label, SourceLocation GL, SourceLocation LL)
2487       : Stmt(GotoStmtClass), Label(label), LabelLoc(LL) {
2488     setGotoLoc(GL);
2489   }
2490
2491   /// Build an empty goto statement.
2492   explicit GotoStmt(EmptyShell Empty) : Stmt(GotoStmtClass, Empty) {}
2493
2494   LabelDecl *getLabel() const { return Label; }
2495   void setLabel(LabelDecl *D) { Label = D; }
2496
2497   SourceLocation getGotoLoc() const { return GotoStmtBits.GotoLoc; }
2498   void setGotoLoc(SourceLocation L) { GotoStmtBits.GotoLoc = L; }
2499   SourceLocation getLabelLoc() const { return LabelLoc; }
2500   void setLabelLoc(SourceLocation L) { LabelLoc = L; }
2501
2502   SourceLocation getBeginLoc() const { return getGotoLoc(); }
2503   SourceLocation getEndLoc() const { return getLabelLoc(); }
2504
2505   static bool classof(const Stmt *T) {
2506     return T->getStmtClass() == GotoStmtClass;
2507   }
2508
2509   // Iterators
2510   child_range children() {
2511     return child_range(child_iterator(), child_iterator());
2512   }
2513
2514   const_child_range children() const {
2515     return const_child_range(const_child_iterator(), const_child_iterator());
2516   }
2517 };
2518
2519 /// IndirectGotoStmt - This represents an indirect goto.
2520 class IndirectGotoStmt : public Stmt {
2521   SourceLocation StarLoc;
2522   Stmt *Target;
2523
2524 public:
2525   IndirectGotoStmt(SourceLocation gotoLoc, SourceLocation starLoc, Expr *target)
2526       : Stmt(IndirectGotoStmtClass), StarLoc(starLoc) {
2527     setTarget(target);
2528     setGotoLoc(gotoLoc);
2529   }
2530
2531   /// Build an empty indirect goto statement.
2532   explicit IndirectGotoStmt(EmptyShell Empty)
2533       : Stmt(IndirectGotoStmtClass, Empty) {}
2534
2535   void setGotoLoc(SourceLocation L) { GotoStmtBits.GotoLoc = L; }
2536   SourceLocation getGotoLoc() const { return GotoStmtBits.GotoLoc; }
2537   void setStarLoc(SourceLocation L) { StarLoc = L; }
2538   SourceLocation getStarLoc() const { return StarLoc; }
2539
2540   Expr *getTarget() { return reinterpret_cast<Expr *>(Target); }
2541   const Expr *getTarget() const {
2542     return reinterpret_cast<const Expr *>(Target);
2543   }
2544   void setTarget(Expr *E) { Target = reinterpret_cast<Stmt *>(E); }
2545
2546   /// getConstantTarget - Returns the fixed target of this indirect
2547   /// goto, if one exists.
2548   LabelDecl *getConstantTarget();
2549   const LabelDecl *getConstantTarget() const {
2550     return const_cast<IndirectGotoStmt *>(this)->getConstantTarget();
2551   }
2552
2553   SourceLocation getBeginLoc() const { return getGotoLoc(); }
2554   SourceLocation getEndLoc() const LLVM_READONLY { return Target->getEndLoc(); }
2555
2556   static bool classof(const Stmt *T) {
2557     return T->getStmtClass() == IndirectGotoStmtClass;
2558   }
2559
2560   // Iterators
2561   child_range children() { return child_range(&Target, &Target + 1); }
2562
2563   const_child_range children() const {
2564     return const_child_range(&Target, &Target + 1);
2565   }
2566 };
2567
2568 /// ContinueStmt - This represents a continue.
2569 class ContinueStmt : public Stmt {
2570 public:
2571   ContinueStmt(SourceLocation CL) : Stmt(ContinueStmtClass) {
2572     setContinueLoc(CL);
2573   }
2574
2575   /// Build an empty continue statement.
2576   explicit ContinueStmt(EmptyShell Empty) : Stmt(ContinueStmtClass, Empty) {}
2577
2578   SourceLocation getContinueLoc() const { return ContinueStmtBits.ContinueLoc; }
2579   void setContinueLoc(SourceLocation L) { ContinueStmtBits.ContinueLoc = L; }
2580
2581   SourceLocation getBeginLoc() const { return getContinueLoc(); }
2582   SourceLocation getEndLoc() const { return getContinueLoc(); }
2583
2584   static bool classof(const Stmt *T) {
2585     return T->getStmtClass() == ContinueStmtClass;
2586   }
2587
2588   // Iterators
2589   child_range children() {
2590     return child_range(child_iterator(), child_iterator());
2591   }
2592
2593   const_child_range children() const {
2594     return const_child_range(const_child_iterator(), const_child_iterator());
2595   }
2596 };
2597
2598 /// BreakStmt - This represents a break.
2599 class BreakStmt : public Stmt {
2600 public:
2601   BreakStmt(SourceLocation BL) : Stmt(BreakStmtClass) {
2602     setBreakLoc(BL);
2603   }
2604
2605   /// Build an empty break statement.
2606   explicit BreakStmt(EmptyShell Empty) : Stmt(BreakStmtClass, Empty) {}
2607
2608   SourceLocation getBreakLoc() const { return BreakStmtBits.BreakLoc; }
2609   void setBreakLoc(SourceLocation L) { BreakStmtBits.BreakLoc = L; }
2610
2611   SourceLocation getBeginLoc() const { return getBreakLoc(); }
2612   SourceLocation getEndLoc() const { return getBreakLoc(); }
2613
2614   static bool classof(const Stmt *T) {
2615     return T->getStmtClass() == BreakStmtClass;
2616   }
2617
2618   // Iterators
2619   child_range children() {
2620     return child_range(child_iterator(), child_iterator());
2621   }
2622
2623   const_child_range children() const {
2624     return const_child_range(const_child_iterator(), const_child_iterator());
2625   }
2626 };
2627
2628 /// ReturnStmt - This represents a return, optionally of an expression:
2629 ///   return;
2630 ///   return 4;
2631 ///
2632 /// Note that GCC allows return with no argument in a function declared to
2633 /// return a value, and it allows returning a value in functions declared to
2634 /// return void.  We explicitly model this in the AST, which means you can't
2635 /// depend on the return type of the function and the presence of an argument.
2636 class ReturnStmt final
2637     : public Stmt,
2638       private llvm::TrailingObjects<ReturnStmt, const VarDecl *> {
2639   friend TrailingObjects;
2640
2641   /// The return expression.
2642   Stmt *RetExpr;
2643
2644   // ReturnStmt is followed optionally by a trailing "const VarDecl *"
2645   // for the NRVO candidate. Present if and only if hasNRVOCandidate().
2646
2647   /// True if this ReturnStmt has storage for an NRVO candidate.
2648   bool hasNRVOCandidate() const { return ReturnStmtBits.HasNRVOCandidate; }
2649
2650   unsigned numTrailingObjects(OverloadToken<const VarDecl *>) const {
2651     return hasNRVOCandidate();
2652   }
2653
2654   /// Build a return statement.
2655   ReturnStmt(SourceLocation RL, Expr *E, const VarDecl *NRVOCandidate);
2656
2657   /// Build an empty return statement.
2658   explicit ReturnStmt(EmptyShell Empty, bool HasNRVOCandidate);
2659
2660 public:
2661   /// Create a return statement.
2662   static ReturnStmt *Create(const ASTContext &Ctx, SourceLocation RL, Expr *E,
2663                             const VarDecl *NRVOCandidate);
2664
2665   /// Create an empty return statement, optionally with
2666   /// storage for an NRVO candidate.
2667   static ReturnStmt *CreateEmpty(const ASTContext &Ctx, bool HasNRVOCandidate);
2668
2669   Expr *getRetValue() { return reinterpret_cast<Expr *>(RetExpr); }
2670   const Expr *getRetValue() const { return reinterpret_cast<Expr *>(RetExpr); }
2671   void setRetValue(Expr *E) { RetExpr = reinterpret_cast<Stmt *>(E); }
2672
2673   /// Retrieve the variable that might be used for the named return
2674   /// value optimization.
2675   ///
2676   /// The optimization itself can only be performed if the variable is
2677   /// also marked as an NRVO object.
2678   const VarDecl *getNRVOCandidate() const {
2679     return hasNRVOCandidate() ? *getTrailingObjects<const VarDecl *>()
2680                               : nullptr;
2681   }
2682
2683   /// Set the variable that might be used for the named return value
2684   /// optimization. The return statement must have storage for it,
2685   /// which is the case if and only if hasNRVOCandidate() is true.
2686   void setNRVOCandidate(const VarDecl *Var) {
2687     assert(hasNRVOCandidate() &&
2688            "This return statement has no storage for an NRVO candidate!");
2689     *getTrailingObjects<const VarDecl *>() = Var;
2690   }
2691
2692   SourceLocation getReturnLoc() const { return ReturnStmtBits.RetLoc; }
2693   void setReturnLoc(SourceLocation L) { ReturnStmtBits.RetLoc = L; }
2694
2695   SourceLocation getBeginLoc() const { return getReturnLoc(); }
2696   SourceLocation getEndLoc() const LLVM_READONLY {
2697     return RetExpr ? RetExpr->getEndLoc() : getReturnLoc();
2698   }
2699
2700   static bool classof(const Stmt *T) {
2701     return T->getStmtClass() == ReturnStmtClass;
2702   }
2703
2704   // Iterators
2705   child_range children() {
2706     if (RetExpr)
2707       return child_range(&RetExpr, &RetExpr + 1);
2708     return child_range(child_iterator(), child_iterator());
2709   }
2710
2711   const_child_range children() const {
2712     if (RetExpr)
2713       return const_child_range(&RetExpr, &RetExpr + 1);
2714     return const_child_range(const_child_iterator(), const_child_iterator());
2715   }
2716 };
2717
2718 /// AsmStmt is the base class for GCCAsmStmt and MSAsmStmt.
2719 class AsmStmt : public Stmt {
2720 protected:
2721   friend class ASTStmtReader;
2722
2723   SourceLocation AsmLoc;
2724
2725   /// True if the assembly statement does not have any input or output
2726   /// operands.
2727   bool IsSimple;
2728
2729   /// If true, treat this inline assembly as having side effects.
2730   /// This assembly statement should not be optimized, deleted or moved.
2731   bool IsVolatile;
2732
2733   unsigned NumOutputs;
2734   unsigned NumInputs;
2735   unsigned NumClobbers;
2736
2737   Stmt **Exprs = nullptr;
2738
2739   AsmStmt(StmtClass SC, SourceLocation asmloc, bool issimple, bool isvolatile,
2740           unsigned numoutputs, unsigned numinputs, unsigned numclobbers)
2741       : Stmt (SC), AsmLoc(asmloc), IsSimple(issimple), IsVolatile(isvolatile),
2742         NumOutputs(numoutputs), NumInputs(numinputs),
2743         NumClobbers(numclobbers) {}
2744
2745 public:
2746   /// Build an empty inline-assembly statement.
2747   explicit AsmStmt(StmtClass SC, EmptyShell Empty) : Stmt(SC, Empty) {}
2748
2749   SourceLocation getAsmLoc() const { return AsmLoc; }
2750   void setAsmLoc(SourceLocation L) { AsmLoc = L; }
2751
2752   bool isSimple() const { return IsSimple; }
2753   void setSimple(bool V) { IsSimple = V; }
2754
2755   bool isVolatile() const { return IsVolatile; }
2756   void setVolatile(bool V) { IsVolatile = V; }
2757
2758   SourceLocation getBeginLoc() const LLVM_READONLY { return {}; }
2759   SourceLocation getEndLoc() const LLVM_READONLY { return {}; }
2760
2761   //===--- Asm String Analysis ---===//
2762
2763   /// Assemble final IR asm string.
2764   std::string generateAsmString(const ASTContext &C) const;
2765
2766   //===--- Output operands ---===//
2767
2768   unsigned getNumOutputs() const { return NumOutputs; }
2769
2770   /// getOutputConstraint - Return the constraint string for the specified
2771   /// output operand.  All output constraints are known to be non-empty (either
2772   /// '=' or '+').
2773   StringRef getOutputConstraint(unsigned i) const;
2774
2775   /// isOutputPlusConstraint - Return true if the specified output constraint
2776   /// is a "+" constraint (which is both an input and an output) or false if it
2777   /// is an "=" constraint (just an output).
2778   bool isOutputPlusConstraint(unsigned i) const {
2779     return getOutputConstraint(i)[0] == '+';
2780   }
2781
2782   const Expr *getOutputExpr(unsigned i) const;
2783
2784   /// getNumPlusOperands - Return the number of output operands that have a "+"
2785   /// constraint.
2786   unsigned getNumPlusOperands() const;
2787
2788   //===--- Input operands ---===//
2789
2790   unsigned getNumInputs() const { return NumInputs; }
2791
2792   /// getInputConstraint - Return the specified input constraint.  Unlike output
2793   /// constraints, these can be empty.
2794   StringRef getInputConstraint(unsigned i) const;
2795
2796   const Expr *getInputExpr(unsigned i) const;
2797
2798   //===--- Other ---===//
2799
2800   unsigned getNumClobbers() const { return NumClobbers; }
2801   StringRef getClobber(unsigned i) const;
2802
2803   static bool classof(const Stmt *T) {
2804     return T->getStmtClass() == GCCAsmStmtClass ||
2805       T->getStmtClass() == MSAsmStmtClass;
2806   }
2807
2808   // Input expr iterators.
2809
2810   using inputs_iterator = ExprIterator;
2811   using const_inputs_iterator = ConstExprIterator;
2812   using inputs_range = llvm::iterator_range<inputs_iterator>;
2813   using inputs_const_range = llvm::iterator_range<const_inputs_iterator>;
2814
2815   inputs_iterator begin_inputs() {
2816     return &Exprs[0] + NumOutputs;
2817   }
2818
2819   inputs_iterator end_inputs() {
2820     return &Exprs[0] + NumOutputs + NumInputs;
2821   }
2822
2823   inputs_range inputs() { return inputs_range(begin_inputs(), end_inputs()); }
2824
2825   const_inputs_iterator begin_inputs() const {
2826     return &Exprs[0] + NumOutputs;
2827   }
2828
2829   const_inputs_iterator end_inputs() const {
2830     return &Exprs[0] + NumOutputs + NumInputs;
2831   }
2832
2833   inputs_const_range inputs() const {
2834     return inputs_const_range(begin_inputs(), end_inputs());
2835   }
2836
2837   // Output expr iterators.
2838
2839   using outputs_iterator = ExprIterator;
2840   using const_outputs_iterator = ConstExprIterator;
2841   using outputs_range = llvm::iterator_range<outputs_iterator>;
2842   using outputs_const_range = llvm::iterator_range<const_outputs_iterator>;
2843
2844   outputs_iterator begin_outputs() {
2845     return &Exprs[0];
2846   }
2847
2848   outputs_iterator end_outputs() {
2849     return &Exprs[0] + NumOutputs;
2850   }
2851
2852   outputs_range outputs() {
2853     return outputs_range(begin_outputs(), end_outputs());
2854   }
2855
2856   const_outputs_iterator begin_outputs() const {
2857     return &Exprs[0];
2858   }
2859
2860   const_outputs_iterator end_outputs() const {
2861     return &Exprs[0] + NumOutputs;
2862   }
2863
2864   outputs_const_range outputs() const {
2865     return outputs_const_range(begin_outputs(), end_outputs());
2866   }
2867
2868   child_range children() {
2869     return child_range(&Exprs[0], &Exprs[0] + NumOutputs + NumInputs);
2870   }
2871
2872   const_child_range children() const {
2873     return const_child_range(&Exprs[0], &Exprs[0] + NumOutputs + NumInputs);
2874   }
2875 };
2876
2877 /// This represents a GCC inline-assembly statement extension.
2878 class GCCAsmStmt : public AsmStmt {
2879   friend class ASTStmtReader;
2880
2881   SourceLocation RParenLoc;
2882   StringLiteral *AsmStr;
2883
2884   // FIXME: If we wanted to, we could allocate all of these in one big array.
2885   StringLiteral **Constraints = nullptr;
2886   StringLiteral **Clobbers = nullptr;
2887   IdentifierInfo **Names = nullptr;
2888   unsigned NumLabels = 0;
2889
2890 public:
2891   GCCAsmStmt(const ASTContext &C, SourceLocation asmloc, bool issimple,
2892              bool isvolatile, unsigned numoutputs, unsigned numinputs,
2893              IdentifierInfo **names, StringLiteral **constraints, Expr **exprs,
2894              StringLiteral *asmstr, unsigned numclobbers,
2895              StringLiteral **clobbers, unsigned numlabels,
2896              SourceLocation rparenloc);
2897
2898   /// Build an empty inline-assembly statement.
2899   explicit GCCAsmStmt(EmptyShell Empty) : AsmStmt(GCCAsmStmtClass, Empty) {}
2900
2901   SourceLocation getRParenLoc() const { return RParenLoc; }
2902   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
2903
2904   //===--- Asm String Analysis ---===//
2905
2906   const StringLiteral *getAsmString() const { return AsmStr; }
2907   StringLiteral *getAsmString() { return AsmStr; }
2908   void setAsmString(StringLiteral *E) { AsmStr = E; }
2909
2910   /// AsmStringPiece - this is part of a decomposed asm string specification
2911   /// (for use with the AnalyzeAsmString function below).  An asm string is
2912   /// considered to be a concatenation of these parts.
2913   class AsmStringPiece {
2914   public:
2915     enum Kind {
2916       String,  // String in .ll asm string form, "$" -> "$$" and "%%" -> "%".
2917       Operand  // Operand reference, with optional modifier %c4.
2918     };
2919
2920   private:
2921     Kind MyKind;
2922     std::string Str;
2923     unsigned OperandNo;
2924
2925     // Source range for operand references.
2926     CharSourceRange Range;
2927
2928   public:
2929     AsmStringPiece(const std::string &S) : MyKind(String), Str(S) {}
2930     AsmStringPiece(unsigned OpNo, const std::string &S, SourceLocation Begin,
2931                    SourceLocation End)
2932         : MyKind(Operand), Str(S), OperandNo(OpNo),
2933           Range(CharSourceRange::getCharRange(Begin, End)) {}
2934
2935     bool isString() const { return MyKind == String; }
2936     bool isOperand() const { return MyKind == Operand; }
2937
2938     const std::string &getString() const { return Str; }
2939
2940     unsigned getOperandNo() const {
2941       assert(isOperand());
2942       return OperandNo;
2943     }
2944
2945     CharSourceRange getRange() const {
2946       assert(isOperand() && "Range is currently used only for Operands.");
2947       return Range;
2948     }
2949
2950     /// getModifier - Get the modifier for this operand, if present.  This
2951     /// returns '\0' if there was no modifier.
2952     char getModifier() const;
2953   };
2954
2955   /// AnalyzeAsmString - Analyze the asm string of the current asm, decomposing
2956   /// it into pieces.  If the asm string is erroneous, emit errors and return
2957   /// true, otherwise return false.  This handles canonicalization and
2958   /// translation of strings from GCC syntax to LLVM IR syntax, and handles
2959   //// flattening of named references like %[foo] to Operand AsmStringPiece's.
2960   unsigned AnalyzeAsmString(SmallVectorImpl<AsmStringPiece> &Pieces,
2961                             const ASTContext &C, unsigned &DiagOffs) const;
2962
2963   /// Assemble final IR asm string.
2964   std::string generateAsmString(const ASTContext &C) const;
2965
2966   //===--- Output operands ---===//
2967
2968   IdentifierInfo *getOutputIdentifier(unsigned i) const { return Names[i]; }
2969
2970   StringRef getOutputName(unsigned i) const {
2971     if (IdentifierInfo *II = getOutputIdentifier(i))
2972       return II->getName();
2973
2974     return {};
2975   }
2976
2977   StringRef getOutputConstraint(unsigned i) const;
2978
2979   const StringLiteral *getOutputConstraintLiteral(unsigned i) const {
2980     return Constraints[i];
2981   }
2982   StringLiteral *getOutputConstraintLiteral(unsigned i) {
2983     return Constraints[i];
2984   }
2985
2986   Expr *getOutputExpr(unsigned i);
2987
2988   const Expr *getOutputExpr(unsigned i) const {
2989     return const_cast<GCCAsmStmt*>(this)->getOutputExpr(i);
2990   }
2991
2992   //===--- Input operands ---===//
2993
2994   IdentifierInfo *getInputIdentifier(unsigned i) const {
2995     return Names[i + NumOutputs];
2996   }
2997
2998   StringRef getInputName(unsigned i) const {
2999     if (IdentifierInfo *II = getInputIdentifier(i))
3000       return II->getName();
3001
3002     return {};
3003   }
3004
3005   StringRef getInputConstraint(unsigned i) const;
3006
3007   const StringLiteral *getInputConstraintLiteral(unsigned i) const {
3008     return Constraints[i + NumOutputs];
3009   }
3010   StringLiteral *getInputConstraintLiteral(unsigned i) {
3011     return Constraints[i + NumOutputs];
3012   }
3013
3014   Expr *getInputExpr(unsigned i);
3015   void setInputExpr(unsigned i, Expr *E);
3016
3017   const Expr *getInputExpr(unsigned i) const {
3018     return const_cast<GCCAsmStmt*>(this)->getInputExpr(i);
3019   }
3020
3021   //===--- Labels ---===//
3022
3023   bool isAsmGoto() const {
3024     return NumLabels > 0;
3025   }
3026
3027   unsigned getNumLabels() const {
3028     return NumLabels;
3029   }
3030
3031   IdentifierInfo *getLabelIdentifier(unsigned i) const {
3032     return Names[i + NumInputs];
3033   }
3034
3035   AddrLabelExpr *getLabelExpr(unsigned i) const;
3036   StringRef getLabelName(unsigned i) const;
3037   using labels_iterator = CastIterator<AddrLabelExpr>;
3038   using const_labels_iterator = ConstCastIterator<AddrLabelExpr>;
3039   using labels_range = llvm::iterator_range<labels_iterator>;
3040   using labels_const_range = llvm::iterator_range<const_labels_iterator>;
3041
3042   labels_iterator begin_labels() {
3043     return &Exprs[0] + NumInputs;
3044   }
3045
3046   labels_iterator end_labels() {
3047     return &Exprs[0] + NumInputs + NumLabels;
3048   }
3049
3050   labels_range labels() {
3051     return labels_range(begin_labels(), end_labels());
3052   }
3053
3054   const_labels_iterator begin_labels() const {
3055     return &Exprs[0] + NumInputs;
3056   }
3057
3058   const_labels_iterator end_labels() const {
3059     return &Exprs[0] + NumInputs + NumLabels;
3060   }
3061
3062   labels_const_range labels() const {
3063     return labels_const_range(begin_labels(), end_labels());
3064   }
3065
3066 private:
3067   void setOutputsAndInputsAndClobbers(const ASTContext &C,
3068                                       IdentifierInfo **Names,
3069                                       StringLiteral **Constraints,
3070                                       Stmt **Exprs,
3071                                       unsigned NumOutputs,
3072                                       unsigned NumInputs,
3073                                       unsigned NumLabels,
3074                                       StringLiteral **Clobbers,
3075                                       unsigned NumClobbers);
3076
3077 public:
3078   //===--- Other ---===//
3079
3080   /// getNamedOperand - Given a symbolic operand reference like %[foo],
3081   /// translate this into a numeric value needed to reference the same operand.
3082   /// This returns -1 if the operand name is invalid.
3083   int getNamedOperand(StringRef SymbolicName) const;
3084
3085   StringRef getClobber(unsigned i) const;
3086
3087   StringLiteral *getClobberStringLiteral(unsigned i) { return Clobbers[i]; }
3088   const StringLiteral *getClobberStringLiteral(unsigned i) const {
3089     return Clobbers[i];
3090   }
3091
3092   SourceLocation getBeginLoc() const LLVM_READONLY { return AsmLoc; }
3093   SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; }
3094
3095   static bool classof(const Stmt *T) {
3096     return T->getStmtClass() == GCCAsmStmtClass;
3097   }
3098 };
3099
3100 /// This represents a Microsoft inline-assembly statement extension.
3101 class MSAsmStmt : public AsmStmt {
3102   friend class ASTStmtReader;
3103
3104   SourceLocation LBraceLoc, EndLoc;
3105   StringRef AsmStr;
3106
3107   unsigned NumAsmToks = 0;
3108
3109   Token *AsmToks = nullptr;
3110   StringRef *Constraints = nullptr;
3111   StringRef *Clobbers = nullptr;
3112
3113 public:
3114   MSAsmStmt(const ASTContext &C, SourceLocation asmloc,
3115             SourceLocation lbraceloc, bool issimple, bool isvolatile,
3116             ArrayRef<Token> asmtoks, unsigned numoutputs, unsigned numinputs,
3117             ArrayRef<StringRef> constraints,
3118             ArrayRef<Expr*> exprs, StringRef asmstr,
3119             ArrayRef<StringRef> clobbers, SourceLocation endloc);
3120
3121   /// Build an empty MS-style inline-assembly statement.
3122   explicit MSAsmStmt(EmptyShell Empty) : AsmStmt(MSAsmStmtClass, Empty) {}
3123
3124   SourceLocation getLBraceLoc() const { return LBraceLoc; }
3125   void setLBraceLoc(SourceLocation L) { LBraceLoc = L; }
3126   SourceLocation getEndLoc() const { return EndLoc; }
3127   void setEndLoc(SourceLocation L) { EndLoc = L; }
3128
3129   bool hasBraces() const { return LBraceLoc.isValid(); }
3130
3131   unsigned getNumAsmToks() { return NumAsmToks; }
3132   Token *getAsmToks() { return AsmToks; }
3133
3134   //===--- Asm String Analysis ---===//
3135   StringRef getAsmString() const { return AsmStr; }
3136
3137   /// Assemble final IR asm string.
3138   std::string generateAsmString(const ASTContext &C) const;
3139
3140   //===--- Output operands ---===//
3141
3142   StringRef getOutputConstraint(unsigned i) const {
3143     assert(i < NumOutputs);
3144     return Constraints[i];
3145   }
3146
3147   Expr *getOutputExpr(unsigned i);
3148
3149   const Expr *getOutputExpr(unsigned i) const {
3150     return const_cast<MSAsmStmt*>(this)->getOutputExpr(i);
3151   }
3152
3153   //===--- Input operands ---===//
3154
3155   StringRef getInputConstraint(unsigned i) const {
3156     assert(i < NumInputs);
3157     return Constraints[i + NumOutputs];
3158   }
3159
3160   Expr *getInputExpr(unsigned i);
3161   void setInputExpr(unsigned i, Expr *E);
3162
3163   const Expr *getInputExpr(unsigned i) const {
3164     return const_cast<MSAsmStmt*>(this)->getInputExpr(i);
3165   }
3166
3167   //===--- Other ---===//
3168
3169   ArrayRef<StringRef> getAllConstraints() const {
3170     return llvm::makeArrayRef(Constraints, NumInputs + NumOutputs);
3171   }
3172
3173   ArrayRef<StringRef> getClobbers() const {
3174     return llvm::makeArrayRef(Clobbers, NumClobbers);
3175   }
3176
3177   ArrayRef<Expr*> getAllExprs() const {
3178     return llvm::makeArrayRef(reinterpret_cast<Expr**>(Exprs),
3179                               NumInputs + NumOutputs);
3180   }
3181
3182   StringRef getClobber(unsigned i) const { return getClobbers()[i]; }
3183
3184 private:
3185   void initialize(const ASTContext &C, StringRef AsmString,
3186                   ArrayRef<Token> AsmToks, ArrayRef<StringRef> Constraints,
3187                   ArrayRef<Expr*> Exprs, ArrayRef<StringRef> Clobbers);
3188
3189 public:
3190   SourceLocation getBeginLoc() const LLVM_READONLY { return AsmLoc; }
3191
3192   static bool classof(const Stmt *T) {
3193     return T->getStmtClass() == MSAsmStmtClass;
3194   }
3195
3196   child_range children() {
3197     return child_range(&Exprs[0], &Exprs[NumInputs + NumOutputs]);
3198   }
3199
3200   const_child_range children() const {
3201     return const_child_range(&Exprs[0], &Exprs[NumInputs + NumOutputs]);
3202   }
3203 };
3204
3205 class SEHExceptStmt : public Stmt {
3206   friend class ASTReader;
3207   friend class ASTStmtReader;
3208
3209   SourceLocation  Loc;
3210   Stmt *Children[2];
3211
3212   enum { FILTER_EXPR, BLOCK };
3213
3214   SEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, Stmt *Block);
3215   explicit SEHExceptStmt(EmptyShell E) : Stmt(SEHExceptStmtClass, E) {}
3216
3217 public:
3218   static SEHExceptStmt* Create(const ASTContext &C,
3219                                SourceLocation ExceptLoc,
3220                                Expr *FilterExpr,
3221                                Stmt *Block);
3222
3223   SourceLocation getBeginLoc() const LLVM_READONLY { return getExceptLoc(); }
3224
3225   SourceLocation getExceptLoc() const { return Loc; }
3226   SourceLocation getEndLoc() const { return getBlock()->getEndLoc(); }
3227
3228   Expr *getFilterExpr() const {
3229     return reinterpret_cast<Expr*>(Children[FILTER_EXPR]);
3230   }
3231
3232   CompoundStmt *getBlock() const {
3233     return cast<CompoundStmt>(Children[BLOCK]);
3234   }
3235
3236   child_range children() {
3237     return child_range(Children, Children+2);
3238   }
3239
3240   const_child_range children() const {
3241     return const_child_range(Children, Children + 2);
3242   }
3243
3244   static bool classof(const Stmt *T) {
3245     return T->getStmtClass() == SEHExceptStmtClass;
3246   }
3247 };
3248
3249 class SEHFinallyStmt : public Stmt {
3250   friend class ASTReader;
3251   friend class ASTStmtReader;
3252
3253   SourceLocation  Loc;
3254   Stmt *Block;
3255
3256   SEHFinallyStmt(SourceLocation Loc, Stmt *Block);
3257   explicit SEHFinallyStmt(EmptyShell E) : Stmt(SEHFinallyStmtClass, E) {}
3258
3259 public:
3260   static SEHFinallyStmt* Create(const ASTContext &C,
3261                                 SourceLocation FinallyLoc,
3262                                 Stmt *Block);
3263
3264   SourceLocation getBeginLoc() const LLVM_READONLY { return getFinallyLoc(); }
3265
3266   SourceLocation getFinallyLoc() const { return Loc; }
3267   SourceLocation getEndLoc() const { return Block->getEndLoc(); }
3268
3269   CompoundStmt *getBlock() const { return cast<CompoundStmt>(Block); }
3270
3271   child_range children() {
3272     return child_range(&Block,&Block+1);
3273   }
3274
3275   const_child_range children() const {
3276     return const_child_range(&Block, &Block + 1);
3277   }
3278
3279   static bool classof(const Stmt *T) {
3280     return T->getStmtClass() == SEHFinallyStmtClass;
3281   }
3282 };
3283
3284 class SEHTryStmt : public Stmt {
3285   friend class ASTReader;
3286   friend class ASTStmtReader;
3287
3288   bool IsCXXTry;
3289   SourceLocation  TryLoc;
3290   Stmt *Children[2];
3291
3292   enum { TRY = 0, HANDLER = 1 };
3293
3294   SEHTryStmt(bool isCXXTry, // true if 'try' otherwise '__try'
3295              SourceLocation TryLoc,
3296              Stmt *TryBlock,
3297              Stmt *Handler);
3298
3299   explicit SEHTryStmt(EmptyShell E) : Stmt(SEHTryStmtClass, E) {}
3300
3301 public:
3302   static SEHTryStmt* Create(const ASTContext &C, bool isCXXTry,
3303                             SourceLocation TryLoc, Stmt *TryBlock,
3304                             Stmt *Handler);
3305
3306   SourceLocation getBeginLoc() const LLVM_READONLY { return getTryLoc(); }
3307
3308   SourceLocation getTryLoc() const { return TryLoc; }
3309   SourceLocation getEndLoc() const { return Children[HANDLER]->getEndLoc(); }
3310
3311   bool getIsCXXTry() const { return IsCXXTry; }
3312
3313   CompoundStmt* getTryBlock() const {
3314     return cast<CompoundStmt>(Children[TRY]);
3315   }
3316
3317   Stmt *getHandler() const { return Children[HANDLER]; }
3318
3319   /// Returns 0 if not defined
3320   SEHExceptStmt  *getExceptHandler() const;
3321   SEHFinallyStmt *getFinallyHandler() const;
3322
3323   child_range children() {
3324     return child_range(Children, Children+2);
3325   }
3326
3327   const_child_range children() const {
3328     return const_child_range(Children, Children + 2);
3329   }
3330
3331   static bool classof(const Stmt *T) {
3332     return T->getStmtClass() == SEHTryStmtClass;
3333   }
3334 };
3335
3336 /// Represents a __leave statement.
3337 class SEHLeaveStmt : public Stmt {
3338   SourceLocation LeaveLoc;
3339
3340 public:
3341   explicit SEHLeaveStmt(SourceLocation LL)
3342       : Stmt(SEHLeaveStmtClass), LeaveLoc(LL) {}
3343
3344   /// Build an empty __leave statement.
3345   explicit SEHLeaveStmt(EmptyShell Empty) : Stmt(SEHLeaveStmtClass, Empty) {}
3346
3347   SourceLocation getLeaveLoc() const { return LeaveLoc; }
3348   void setLeaveLoc(SourceLocation L) { LeaveLoc = L; }
3349
3350   SourceLocation getBeginLoc() const LLVM_READONLY { return LeaveLoc; }
3351   SourceLocation getEndLoc() const LLVM_READONLY { return LeaveLoc; }
3352
3353   static bool classof(const Stmt *T) {
3354     return T->getStmtClass() == SEHLeaveStmtClass;
3355   }
3356
3357   // Iterators
3358   child_range children() {
3359     return child_range(child_iterator(), child_iterator());
3360   }
3361
3362   const_child_range children() const {
3363     return const_child_range(const_child_iterator(), const_child_iterator());
3364   }
3365 };
3366
3367 /// This captures a statement into a function. For example, the following
3368 /// pragma annotated compound statement can be represented as a CapturedStmt,
3369 /// and this compound statement is the body of an anonymous outlined function.
3370 /// @code
3371 /// #pragma omp parallel
3372 /// {
3373 ///   compute();
3374 /// }
3375 /// @endcode
3376 class CapturedStmt : public Stmt {
3377 public:
3378   /// The different capture forms: by 'this', by reference, capture for
3379   /// variable-length array type etc.
3380   enum VariableCaptureKind {
3381     VCK_This,
3382     VCK_ByRef,
3383     VCK_ByCopy,
3384     VCK_VLAType,
3385   };
3386
3387   /// Describes the capture of either a variable, or 'this', or
3388   /// variable-length array type.
3389   class Capture {
3390     llvm::PointerIntPair<VarDecl *, 2, VariableCaptureKind> VarAndKind;
3391     SourceLocation Loc;
3392
3393   public:
3394     friend class ASTStmtReader;
3395
3396     /// Create a new capture.
3397     ///
3398     /// \param Loc The source location associated with this capture.
3399     ///
3400     /// \param Kind The kind of capture (this, ByRef, ...).
3401     ///
3402     /// \param Var The variable being captured, or null if capturing this.
3403     Capture(SourceLocation Loc, VariableCaptureKind Kind,
3404             VarDecl *Var = nullptr);
3405
3406     /// Determine the kind of capture.
3407     VariableCaptureKind getCaptureKind() const;
3408
3409     /// Retrieve the source location at which the variable or 'this' was
3410     /// first used.
3411     SourceLocation getLocation() const { return Loc; }
3412
3413     /// Determine whether this capture handles the C++ 'this' pointer.
3414     bool capturesThis() const { return getCaptureKind() == VCK_This; }
3415
3416     /// Determine whether this capture handles a variable (by reference).
3417     bool capturesVariable() const { return getCaptureKind() == VCK_ByRef; }
3418
3419     /// Determine whether this capture handles a variable by copy.
3420     bool capturesVariableByCopy() const {
3421       return getCaptureKind() == VCK_ByCopy;
3422     }
3423
3424     /// Determine whether this capture handles a variable-length array
3425     /// type.
3426     bool capturesVariableArrayType() const {
3427       return getCaptureKind() == VCK_VLAType;
3428     }
3429
3430     /// Retrieve the declaration of the variable being captured.
3431     ///
3432     /// This operation is only valid if this capture captures a variable.
3433     VarDecl *getCapturedVar() const;
3434   };
3435
3436 private:
3437   /// The number of variable captured, including 'this'.
3438   unsigned NumCaptures;
3439
3440   /// The pointer part is the implicit the outlined function and the
3441   /// int part is the captured region kind, 'CR_Default' etc.
3442   llvm::PointerIntPair<CapturedDecl *, 2, CapturedRegionKind> CapDeclAndKind;
3443
3444   /// The record for captured variables, a RecordDecl or CXXRecordDecl.
3445   RecordDecl *TheRecordDecl = nullptr;
3446
3447   /// Construct a captured statement.
3448   CapturedStmt(Stmt *S, CapturedRegionKind Kind, ArrayRef<Capture> Captures,
3449                ArrayRef<Expr *> CaptureInits, CapturedDecl *CD, RecordDecl *RD);
3450
3451   /// Construct an empty captured statement.
3452   CapturedStmt(EmptyShell Empty, unsigned NumCaptures);
3453
3454   Stmt **getStoredStmts() { return reinterpret_cast<Stmt **>(this + 1); }
3455
3456   Stmt *const *getStoredStmts() const {
3457     return reinterpret_cast<Stmt *const *>(this + 1);
3458   }
3459
3460   Capture *getStoredCaptures() const;
3461
3462   void setCapturedStmt(Stmt *S) { getStoredStmts()[NumCaptures] = S; }
3463
3464 public:
3465   friend class ASTStmtReader;
3466
3467   static CapturedStmt *Create(const ASTContext &Context, Stmt *S,
3468                               CapturedRegionKind Kind,
3469                               ArrayRef<Capture> Captures,
3470                               ArrayRef<Expr *> CaptureInits,
3471                               CapturedDecl *CD, RecordDecl *RD);
3472
3473   static CapturedStmt *CreateDeserialized(const ASTContext &Context,
3474                                           unsigned NumCaptures);
3475
3476   /// Retrieve the statement being captured.
3477   Stmt *getCapturedStmt() { return getStoredStmts()[NumCaptures]; }
3478   const Stmt *getCapturedStmt() const { return getStoredStmts()[NumCaptures]; }
3479
3480   /// Retrieve the outlined function declaration.
3481   CapturedDecl *getCapturedDecl();
3482   const CapturedDecl *getCapturedDecl() const;
3483
3484   /// Set the outlined function declaration.
3485   void setCapturedDecl(CapturedDecl *D);
3486
3487   /// Retrieve the captured region kind.
3488   CapturedRegionKind getCapturedRegionKind() const;
3489
3490   /// Set the captured region kind.
3491   void setCapturedRegionKind(CapturedRegionKind Kind);
3492
3493   /// Retrieve the record declaration for captured variables.
3494   const RecordDecl *getCapturedRecordDecl() const { return TheRecordDecl; }
3495
3496   /// Set the record declaration for captured variables.
3497   void setCapturedRecordDecl(RecordDecl *D) {
3498     assert(D && "null RecordDecl");
3499     TheRecordDecl = D;
3500   }
3501
3502   /// True if this variable has been captured.
3503   bool capturesVariable(const VarDecl *Var) const;
3504
3505   /// An iterator that walks over the captures.
3506   using capture_iterator = Capture *;
3507   using const_capture_iterator = const Capture *;
3508   using capture_range = llvm::iterator_range<capture_iterator>;
3509   using capture_const_range = llvm::iterator_range<const_capture_iterator>;
3510
3511   capture_range captures() {
3512     return capture_range(capture_begin(), capture_end());
3513   }
3514   capture_const_range captures() const {
3515     return capture_const_range(capture_begin(), capture_end());
3516   }
3517
3518   /// Retrieve an iterator pointing to the first capture.
3519   capture_iterator capture_begin() { return getStoredCaptures(); }
3520   const_capture_iterator capture_begin() const { return getStoredCaptures(); }
3521
3522   /// Retrieve an iterator pointing past the end of the sequence of
3523   /// captures.
3524   capture_iterator capture_end() const {
3525     return getStoredCaptures() + NumCaptures;
3526   }
3527
3528   /// Retrieve the number of captures, including 'this'.
3529   unsigned capture_size() const { return NumCaptures; }
3530
3531   /// Iterator that walks over the capture initialization arguments.
3532   using capture_init_iterator = Expr **;
3533   using capture_init_range = llvm::iterator_range<capture_init_iterator>;
3534
3535   /// Const iterator that walks over the capture initialization
3536   /// arguments.
3537   using const_capture_init_iterator = Expr *const *;
3538   using const_capture_init_range =
3539       llvm::iterator_range<const_capture_init_iterator>;
3540
3541   capture_init_range capture_inits() {
3542     return capture_init_range(capture_init_begin(), capture_init_end());
3543   }
3544
3545   const_capture_init_range capture_inits() const {
3546     return const_capture_init_range(capture_init_begin(), capture_init_end());
3547   }
3548
3549   /// Retrieve the first initialization argument.
3550   capture_init_iterator capture_init_begin() {
3551     return reinterpret_cast<Expr **>(getStoredStmts());
3552   }
3553
3554   const_capture_init_iterator capture_init_begin() const {
3555     return reinterpret_cast<Expr *const *>(getStoredStmts());
3556   }
3557
3558   /// Retrieve the iterator pointing one past the last initialization
3559   /// argument.
3560   capture_init_iterator capture_init_end() {
3561     return capture_init_begin() + NumCaptures;
3562   }
3563
3564   const_capture_init_iterator capture_init_end() const {
3565     return capture_init_begin() + NumCaptures;
3566   }
3567
3568   SourceLocation getBeginLoc() const LLVM_READONLY {
3569     return getCapturedStmt()->getBeginLoc();
3570   }
3571
3572   SourceLocation getEndLoc() const LLVM_READONLY {
3573     return getCapturedStmt()->getEndLoc();
3574   }
3575
3576   SourceRange getSourceRange() const LLVM_READONLY {
3577     return getCapturedStmt()->getSourceRange();
3578   }
3579
3580   static bool classof(const Stmt *T) {
3581     return T->getStmtClass() == CapturedStmtClass;
3582   }
3583
3584   child_range children();
3585
3586   const_child_range children() const;
3587 };
3588
3589 } // namespace clang
3590
3591 #endif // LLVM_CLANG_AST_STMT_H