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