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