LCOV - code coverage report
Current view: top level - clang/AST - Stmt.h (source / functions) Hit Total Coverage
Test: clang.info Lines: 10 40 25.0 %
Date: 2016-01-31 12:01:00 Functions: 9 38 23.7 %

          Line data    Source code
       1             : //===--- Stmt.h - Classes for representing statements -----------*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : //  This file defines the Stmt interface and subclasses.
      11             : //
      12             : //===----------------------------------------------------------------------===//
      13             : 
      14             : #ifndef LLVM_CLANG_AST_STMT_H
      15             : #define LLVM_CLANG_AST_STMT_H
      16             : 
      17             : #include "clang/AST/DeclGroup.h"
      18             : #include "clang/AST/StmtIterator.h"
      19             : #include "clang/Basic/CapturedStmt.h"
      20             : #include "clang/Basic/IdentifierTable.h"
      21             : #include "clang/Basic/LLVM.h"
      22             : #include "clang/Basic/SourceLocation.h"
      23             : #include "llvm/ADT/ArrayRef.h"
      24             : #include "llvm/ADT/PointerIntPair.h"
      25             : #include "llvm/Support/Compiler.h"
      26             : #include "llvm/Support/ErrorHandling.h"
      27             : #include <string>
      28             : 
      29             : namespace llvm {
      30             :   class FoldingSetNodeID;
      31             : }
      32             : 
      33             : namespace clang {
      34             :   class ASTContext;
      35             :   class Attr;
      36             :   class CapturedDecl;
      37             :   class Decl;
      38             :   class Expr;
      39             :   class IdentifierInfo;
      40             :   class LabelDecl;
      41             :   class ParmVarDecl;
      42             :   class PrinterHelper;
      43             :   struct PrintingPolicy;
      44             :   class QualType;
      45             :   class RecordDecl;
      46             :   class SourceManager;
      47             :   class StringLiteral;
      48             :   class SwitchStmt;
      49             :   class Token;
      50             :   class VarDecl;
      51             : 
      52             :   //===--------------------------------------------------------------------===//
      53             :   // ExprIterator - Iterators for iterating over Stmt* arrays that contain
      54             :   //  only Expr*.  This is needed because AST nodes use Stmt* arrays to store
      55             :   //  references to children (to be compatible with StmtIterator).
      56             :   //===--------------------------------------------------------------------===//
      57             : 
      58             :   class Stmt;
      59             :   class Expr;
      60             : 
      61             :   class ExprIterator : public std::iterator<std::forward_iterator_tag,
      62             :                                             Expr *&, ptrdiff_t,
      63             :                                             Expr *&, Expr *&> {
      64             :     Stmt** I;
      65             :   public:
      66             :     ExprIterator(Stmt** i) : I(i) {}
      67             :     ExprIterator() : I(nullptr) {}
      68             :     ExprIterator& operator++() { ++I; return *this; }
      69             :     ExprIterator operator-(size_t i) { return I-i; }
      70             :     ExprIterator operator+(size_t i) { return I+i; }
      71             :     Expr* operator[](size_t idx);
      72             :     // FIXME: Verify that this will correctly return a signed distance.
      73             :     signed operator-(const ExprIterator& R) const { return I - R.I; }
      74             :     Expr* operator*() const;
      75             :     Expr* operator->() const;
      76             :     bool operator==(const ExprIterator& R) const { return I == R.I; }
      77             :     bool operator!=(const ExprIterator& R) const { return I != R.I; }
      78             :     bool operator>(const ExprIterator& R) const { return I > R.I; }
      79             :     bool operator>=(const ExprIterator& R) const { return I >= R.I; }
      80             :   };
      81             : 
      82             :   class ConstExprIterator : public std::iterator<std::forward_iterator_tag,
      83             :                                                  const Expr *&, ptrdiff_t,
      84             :                                                  const Expr *&,
      85             :                                                  const Expr *&> {
      86             :     const Stmt * const *I;
      87             :   public:
      88             :     ConstExprIterator(const Stmt * const *i) : I(i) {}
      89             :     ConstExprIterator() : I(nullptr) {}
      90             :     ConstExprIterator& operator++() { ++I; return *this; }
      91             :     ConstExprIterator operator+(size_t i) const { return I+i; }
      92             :     ConstExprIterator operator-(size_t i) const { return I-i; }
      93             :     const Expr * operator[](size_t idx) const;
      94             :     signed operator-(const ConstExprIterator& R) const { return I - R.I; }
      95             :     const Expr * operator*() const;
      96             :     const Expr * operator->() const;
      97             :     bool operator==(const ConstExprIterator& R) const { return I == R.I; }
      98             :     bool operator!=(const ConstExprIterator& R) const { return I != R.I; }
      99             :     bool operator>(const ConstExprIterator& R) const { return I > R.I; }
     100             :     bool operator>=(const ConstExprIterator& R) const { return I >= R.I; }
     101             :   };
     102             : 
     103             : //===----------------------------------------------------------------------===//
     104             : // AST classes for statements.
     105             : //===----------------------------------------------------------------------===//
     106             : 
     107             : /// Stmt - This represents one statement.
     108             : ///
     109             : class LLVM_ALIGNAS(LLVM_PTR_SIZE) Stmt {
     110             : public:
     111             :   enum StmtClass {
     112             :     NoStmtClass = 0,
     113             : #define STMT(CLASS, PARENT) CLASS##Class,
     114             : #define STMT_RANGE(BASE, FIRST, LAST) \
     115             :         first##BASE##Constant=FIRST##Class, last##BASE##Constant=LAST##Class,
     116             : #define LAST_STMT_RANGE(BASE, FIRST, LAST) \
     117             :         first##BASE##Constant=FIRST##Class, last##BASE##Constant=LAST##Class
     118             : #define ABSTRACT_STMT(STMT)
     119             : #include "clang/AST/StmtNodes.inc"
     120             :   };
     121             : 
     122             :   // Make vanilla 'new' and 'delete' illegal for Stmts.
     123             : protected:
     124             :   void* operator new(size_t bytes) throw() {
     125             :     llvm_unreachable("Stmts cannot be allocated with regular 'new'.");
     126             :   }
     127             :   void operator delete(void* data) throw() {
     128             :     llvm_unreachable("Stmts cannot be released with regular 'delete'.");
     129             :   }
     130             : 
     131             :   class StmtBitfields {
     132             :     friend class Stmt;
     133             : 
     134             :     /// \brief The statement class.
     135             :     unsigned sClass : 8;
     136             :   };
     137             :   enum { NumStmtBits = 8 };
     138             : 
     139             :   class CompoundStmtBitfields {
     140             :     friend class CompoundStmt;
     141             :     unsigned : NumStmtBits;
     142             : 
     143             :     unsigned NumStmts : 32 - NumStmtBits;
     144             :   };
     145             : 
     146             :   class ExprBitfields {
     147             :     friend class Expr;
     148             :     friend class DeclRefExpr; // computeDependence
     149             :     friend class InitListExpr; // ctor
     150             :     friend class DesignatedInitExpr; // ctor
     151             :     friend class BlockDeclRefExpr; // ctor
     152             :     friend class ASTStmtReader; // deserialization
     153             :     friend class CXXNewExpr; // ctor
     154             :     friend class DependentScopeDeclRefExpr; // ctor
     155             :     friend class CXXConstructExpr; // ctor
     156             :     friend class CallExpr; // ctor
     157             :     friend class OffsetOfExpr; // ctor
     158             :     friend class ObjCMessageExpr; // ctor
     159             :     friend class ObjCArrayLiteral; // ctor
     160             :     friend class ObjCDictionaryLiteral; // ctor
     161             :     friend class ShuffleVectorExpr; // ctor
     162             :     friend class ParenListExpr; // ctor
     163             :     friend class CXXUnresolvedConstructExpr; // ctor
     164             :     friend class CXXDependentScopeMemberExpr; // ctor
     165             :     friend class OverloadExpr; // ctor
     166             :     friend class PseudoObjectExpr; // ctor
     167             :     friend class AtomicExpr; // ctor
     168             :     unsigned : NumStmtBits;
     169             : 
     170             :     unsigned ValueKind : 2;
     171             :     unsigned ObjectKind : 2;
     172             :     unsigned TypeDependent : 1;
     173             :     unsigned ValueDependent : 1;
     174             :     unsigned InstantiationDependent : 1;
     175             :     unsigned ContainsUnexpandedParameterPack : 1;
     176             :   };
     177             :   enum { NumExprBits = 16 };
     178             : 
     179             :   class CharacterLiteralBitfields {
     180             :     friend class CharacterLiteral;
     181             :     unsigned : NumExprBits;
     182             : 
     183             :     unsigned Kind : 2;
     184             :   };
     185             : 
     186             :   enum APFloatSemantics {
     187             :     IEEEhalf,
     188             :     IEEEsingle,
     189             :     IEEEdouble,
     190             :     x87DoubleExtended,
     191             :     IEEEquad,
     192             :     PPCDoubleDouble
     193             :   };
     194             : 
     195             :   class FloatingLiteralBitfields {
     196             :     friend class FloatingLiteral;
     197             :     unsigned : NumExprBits;
     198             : 
     199             :     unsigned Semantics : 3; // Provides semantics for APFloat construction
     200             :     unsigned IsExact : 1;
     201             :   };
     202             : 
     203             :   class UnaryExprOrTypeTraitExprBitfields {
     204             :     friend class UnaryExprOrTypeTraitExpr;
     205             :     unsigned : NumExprBits;
     206             : 
     207             :     unsigned Kind : 2;
     208             :     unsigned IsType : 1; // true if operand is a type, false if an expression.
     209             :   };
     210             : 
     211             :   class DeclRefExprBitfields {
     212             :     friend class DeclRefExpr;
     213             :     friend class ASTStmtReader; // deserialization
     214             :     unsigned : NumExprBits;
     215             : 
     216             :     unsigned HasQualifier : 1;
     217             :     unsigned HasTemplateKWAndArgsInfo : 1;
     218             :     unsigned HasFoundDecl : 1;
     219             :     unsigned HadMultipleCandidates : 1;
     220             :     unsigned RefersToEnclosingVariableOrCapture : 1;
     221             :   };
     222             : 
     223             :   class CastExprBitfields {
     224             :     friend class CastExpr;
     225             :     unsigned : NumExprBits;
     226             : 
     227             :     unsigned Kind : 6;
     228             :     unsigned BasePathSize : 32 - 6 - NumExprBits;
     229             :   };
     230             : 
     231             :   class CallExprBitfields {
     232             :     friend class CallExpr;
     233             :     unsigned : NumExprBits;
     234             : 
     235             :     unsigned NumPreArgs : 1;
     236             :   };
     237             : 
     238             :   class ExprWithCleanupsBitfields {
     239             :     friend class ExprWithCleanups;
     240             :     friend class ASTStmtReader; // deserialization
     241             : 
     242             :     unsigned : NumExprBits;
     243             : 
     244             :     unsigned NumObjects : 32 - NumExprBits;
     245             :   };
     246             : 
     247             :   class PseudoObjectExprBitfields {
     248             :     friend class PseudoObjectExpr;
     249             :     friend class ASTStmtReader; // deserialization
     250             : 
     251             :     unsigned : NumExprBits;
     252             : 
     253             :     // These don't need to be particularly wide, because they're
     254             :     // strictly limited by the forms of expressions we permit.
     255             :     unsigned NumSubExprs : 8;
     256             :     unsigned ResultIndex : 32 - 8 - NumExprBits;
     257             :   };
     258             : 
     259             :   class ObjCIndirectCopyRestoreExprBitfields {
     260             :     friend class ObjCIndirectCopyRestoreExpr;
     261             :     unsigned : NumExprBits;
     262             : 
     263             :     unsigned ShouldCopy : 1;
     264             :   };
     265             : 
     266             :   class InitListExprBitfields {
     267             :     friend class InitListExpr;
     268             : 
     269             :     unsigned : NumExprBits;
     270             : 
     271             :     /// Whether this initializer list originally had a GNU array-range
     272             :     /// designator in it. This is a temporary marker used by CodeGen.
     273             :     unsigned HadArrayRangeDesignator : 1;
     274             :   };
     275             : 
     276             :   class TypeTraitExprBitfields {
     277             :     friend class TypeTraitExpr;
     278             :     friend class ASTStmtReader;
     279             :     friend class ASTStmtWriter;
     280             :     
     281             :     unsigned : NumExprBits;
     282             :     
     283             :     /// \brief The kind of type trait, which is a value of a TypeTrait enumerator.
     284             :     unsigned Kind : 8;
     285             :     
     286             :     /// \brief If this expression is not value-dependent, this indicates whether
     287             :     /// the trait evaluated true or false.
     288             :     unsigned Value : 1;
     289             : 
     290             :     /// \brief The number of arguments to this type trait.
     291             :     unsigned NumArgs : 32 - 8 - 1 - NumExprBits;
     292             :   };
     293             : 
     294             :   union {
     295             :     StmtBitfields StmtBits;
     296             :     CompoundStmtBitfields CompoundStmtBits;
     297             :     ExprBitfields ExprBits;
     298             :     CharacterLiteralBitfields CharacterLiteralBits;
     299             :     FloatingLiteralBitfields FloatingLiteralBits;
     300             :     UnaryExprOrTypeTraitExprBitfields UnaryExprOrTypeTraitExprBits;
     301             :     DeclRefExprBitfields DeclRefExprBits;
     302             :     CastExprBitfields CastExprBits;
     303             :     CallExprBitfields CallExprBits;
     304             :     ExprWithCleanupsBitfields ExprWithCleanupsBits;
     305             :     PseudoObjectExprBitfields PseudoObjectExprBits;
     306             :     ObjCIndirectCopyRestoreExprBitfields ObjCIndirectCopyRestoreExprBits;
     307             :     InitListExprBitfields InitListExprBits;
     308             :     TypeTraitExprBitfields TypeTraitExprBits;
     309             :   };
     310             : 
     311             :   friend class ASTStmtReader;
     312             :   friend class ASTStmtWriter;
     313             : 
     314             : public:
     315             :   // Only allow allocation of Stmts using the allocator in ASTContext
     316             :   // or by doing a placement new.
     317             :   void* operator new(size_t bytes, const ASTContext& C,
     318             :                      unsigned alignment = 8);
     319             : 
     320             :   void* operator new(size_t bytes, const ASTContext* C,
     321             :                      unsigned alignment = 8) {
     322             :     return operator new(bytes, *C, alignment);
     323             :   }
     324             : 
     325             :   void* operator new(size_t bytes, void* mem) throw() {
     326             :     return mem;
     327             :   }
     328             : 
     329             :   void operator delete(void*, const ASTContext&, unsigned) throw() { }
     330             :   void operator delete(void*, const ASTContext*, unsigned) throw() { }
     331             :   void operator delete(void*, size_t) throw() { }
     332             :   void operator delete(void*, void*) throw() { }
     333             : 
     334             : public:
     335             :   /// \brief A placeholder type used to construct an empty shell of a
     336             :   /// type, that will be filled in later (e.g., by some
     337             :   /// de-serialization).
     338             :   struct EmptyShell { };
     339             : 
     340             : private:
     341             :   /// \brief Whether statistic collection is enabled.
     342             :   static bool StatisticsEnabled;
     343             : 
     344             : protected:
     345             :   /// \brief Construct an empty statement.
     346             :   explicit Stmt(StmtClass SC, EmptyShell) : Stmt(SC) {}
     347             : 
     348             : public:
     349             :   Stmt(StmtClass SC) {
     350             :     static_assert(sizeof(*this) % llvm::AlignOf<void *>::Alignment == 0,
     351             :                   "Insufficient alignment!");
     352             :     StmtBits.sClass = SC;
     353             :     if (StatisticsEnabled) Stmt::addStmtClass(SC);
     354             :   }
     355             : 
     356             :   StmtClass getStmtClass() const {
     357         632 :     return static_cast<StmtClass>(StmtBits.sClass);
     358             :   }
     359             :   const char *getStmtClassName() const;
     360             : 
     361             :   /// SourceLocation tokens are not useful in isolation - they are low level
     362             :   /// value objects created/interpreted by SourceManager. We assume AST
     363             :   /// clients will have a pointer to the respective SourceManager.
     364             :   SourceRange getSourceRange() const LLVM_READONLY;
     365             :   SourceLocation getLocStart() const LLVM_READONLY;
     366             :   SourceLocation getLocEnd() const LLVM_READONLY;
     367             : 
     368             :   // global temp stats (until we have a per-module visitor)
     369             :   static void addStmtClass(const StmtClass s);
     370             :   static void EnableStatistics();
     371             :   static void PrintStats();
     372             : 
     373             :   /// \brief Dumps the specified AST fragment and all subtrees to
     374             :   /// \c llvm::errs().
     375             :   void dump() const;
     376             :   void dump(SourceManager &SM) const;
     377             :   void dump(raw_ostream &OS, SourceManager &SM) const;
     378             :   void dump(raw_ostream &OS) const;
     379             : 
     380             :   /// dumpColor - same as dump(), but forces color highlighting.
     381             :   void dumpColor() const;
     382             : 
     383             :   /// dumpPretty/printPretty - These two methods do a "pretty print" of the AST
     384             :   /// back to its original source language syntax.
     385             :   void dumpPretty(const ASTContext &Context) const;
     386             :   void printPretty(raw_ostream &OS, PrinterHelper *Helper,
     387             :                    const PrintingPolicy &Policy,
     388             :                    unsigned Indentation = 0) const;
     389             : 
     390             :   /// viewAST - Visualize an AST rooted at this Stmt* using GraphViz.  Only
     391             :   ///   works on systems with GraphViz (Mac OS X) or dot+gv installed.
     392             :   void viewAST() const;
     393             : 
     394             :   /// Skip past any implicit AST nodes which might surround this
     395             :   /// statement, such as ExprWithCleanups or ImplicitCastExpr nodes.
     396             :   Stmt *IgnoreImplicit();
     397             : 
     398             :   /// \brief Skip no-op (attributed, compound) container stmts and skip captured
     399             :   /// stmt at the top, if \a IgnoreCaptured is true.
     400             :   Stmt *IgnoreContainers(bool IgnoreCaptured = false);
     401             : 
     402             :   const Stmt *stripLabelLikeStatements() const;
     403             :   Stmt *stripLabelLikeStatements() {
     404             :     return const_cast<Stmt*>(
     405             :       const_cast<const Stmt*>(this)->stripLabelLikeStatements());
     406             :   }
     407             : 
     408             :   /// Child Iterators: All subclasses must implement 'children'
     409             :   /// to permit easy iteration over the substatements/subexpessions of an
     410             :   /// AST node.  This permits easy iteration over all nodes in the AST.
     411             :   typedef StmtIterator       child_iterator;
     412             :   typedef ConstStmtIterator  const_child_iterator;
     413             : 
     414             :   typedef StmtRange          child_range;
     415             :   typedef ConstStmtRange     const_child_range;
     416             : 
     417             :   child_range children();
     418             :   const_child_range children() const {
     419             :     return const_cast<Stmt*>(this)->children();
     420             :   }
     421             : 
     422           2 :   child_iterator child_begin() { return children().first; }
     423           5 :   child_iterator child_end() { return children().second; }
     424             : 
     425             :   const_child_iterator child_begin() const { return children().first; }
     426             :   const_child_iterator child_end() const { return children().second; }
     427             : 
     428             :   /// \brief Produce a unique representation of the given statement.
     429             :   ///
     430             :   /// \param ID once the profiling operation is complete, will contain
     431             :   /// the unique representation of the given statement.
     432             :   ///
     433             :   /// \param Context the AST context in which the statement resides
     434             :   ///
     435             :   /// \param Canonical whether the profile should be based on the canonical
     436             :   /// representation of this statement (e.g., where non-type template
     437             :   /// parameters are identified by index/level rather than their
     438             :   /// declaration pointers) or the exact representation of the statement as
     439             :   /// written in the source.
     440             :   void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
     441             :                bool Canonical) const;
     442             : };
     443             : 
     444             : /// DeclStmt - Adaptor class for mixing declarations with statements and
     445             : /// expressions. For example, CompoundStmt mixes statements, expressions
     446             : /// and declarations (variables, types). Another example is ForStmt, where
     447             : /// the first statement can be an expression or a declaration.
     448             : ///
     449             : class DeclStmt : public Stmt {
     450             :   DeclGroupRef DG;
     451             :   SourceLocation StartLoc, EndLoc;
     452             : 
     453             : public:
     454             :   DeclStmt(DeclGroupRef dg, SourceLocation startLoc,
     455             :            SourceLocation endLoc) : Stmt(DeclStmtClass), DG(dg),
     456             :                                     StartLoc(startLoc), EndLoc(endLoc) {}
     457             : 
     458             :   /// \brief Build an empty declaration statement.
     459             :   explicit DeclStmt(EmptyShell Empty) : Stmt(DeclStmtClass, Empty) { }
     460             : 
     461             :   /// isSingleDecl - This method returns true if this DeclStmt refers
     462             :   /// to a single Decl.
     463             :   bool isSingleDecl() const {
     464             :     return DG.isSingleDecl();
     465             :   }
     466             : 
     467             :   const Decl *getSingleDecl() const { return DG.getSingleDecl(); }
     468             :   Decl *getSingleDecl() { return DG.getSingleDecl(); }
     469             : 
     470             :   const DeclGroupRef getDeclGroup() const { return DG; }
     471             :   DeclGroupRef getDeclGroup() { return DG; }
     472             :   void setDeclGroup(DeclGroupRef DGR) { DG = DGR; }
     473             : 
     474             :   SourceLocation getStartLoc() const { return StartLoc; }
     475             :   void setStartLoc(SourceLocation L) { StartLoc = L; }
     476             :   SourceLocation getEndLoc() const { return EndLoc; }
     477             :   void setEndLoc(SourceLocation L) { EndLoc = L; }
     478             : 
     479             :   SourceLocation getLocStart() const LLVM_READONLY { return StartLoc; }
     480             :   SourceLocation getLocEnd() const LLVM_READONLY { return EndLoc; }
     481             : 
     482             :   static bool classof(const Stmt *T) {
     483           0 :     return T->getStmtClass() == DeclStmtClass;
     484             :   }
     485             : 
     486             :   // Iterators over subexpressions.
     487             :   child_range children() {
     488             :     return child_range(child_iterator(DG.begin(), DG.end()),
     489             :                        child_iterator(DG.end(), DG.end()));
     490             :   }
     491             : 
     492             :   typedef DeclGroupRef::iterator decl_iterator;
     493             :   typedef DeclGroupRef::const_iterator const_decl_iterator;
     494             :   typedef llvm::iterator_range<decl_iterator> decl_range;
     495             :   typedef llvm::iterator_range<const_decl_iterator> decl_const_range;
     496             : 
     497           6 :   decl_range decls() { return decl_range(decl_begin(), decl_end()); }
     498             :   decl_const_range decls() const {
     499             :     return decl_const_range(decl_begin(), decl_end());
     500             :   }
     501           6 :   decl_iterator decl_begin() { return DG.begin(); }
     502           6 :   decl_iterator decl_end() { return DG.end(); }
     503             :   const_decl_iterator decl_begin() const { return DG.begin(); }
     504             :   const_decl_iterator decl_end() const { return DG.end(); }
     505             : 
     506             :   typedef std::reverse_iterator<decl_iterator> reverse_decl_iterator;
     507             :   reverse_decl_iterator decl_rbegin() {
     508             :     return reverse_decl_iterator(decl_end());
     509             :   }
     510             :   reverse_decl_iterator decl_rend() {
     511             :     return reverse_decl_iterator(decl_begin());
     512             :   }
     513             : };
     514             : 
     515             : /// NullStmt - This is the null statement ";": C99 6.8.3p3.
     516             : ///
     517             : class NullStmt : public Stmt {
     518             :   SourceLocation SemiLoc;
     519             : 
     520             :   /// \brief True if the null statement was preceded by an empty macro, e.g:
     521             :   /// @code
     522             :   ///   #define CALL(x)
     523             :   ///   CALL(0);
     524             :   /// @endcode
     525             :   bool HasLeadingEmptyMacro;
     526             : public:
     527             :   NullStmt(SourceLocation L, bool hasLeadingEmptyMacro = false)
     528             :     : Stmt(NullStmtClass), SemiLoc(L),
     529             :       HasLeadingEmptyMacro(hasLeadingEmptyMacro) {}
     530             : 
     531             :   /// \brief Build an empty null statement.
     532             :   explicit NullStmt(EmptyShell Empty) : Stmt(NullStmtClass, Empty),
     533             :       HasLeadingEmptyMacro(false) { }
     534             : 
     535             :   SourceLocation getSemiLoc() const { return SemiLoc; }
     536             :   void setSemiLoc(SourceLocation L) { SemiLoc = L; }
     537             : 
     538             :   bool hasLeadingEmptyMacro() const { return HasLeadingEmptyMacro; }
     539             : 
     540             :   SourceLocation getLocStart() const LLVM_READONLY { return SemiLoc; }
     541             :   SourceLocation getLocEnd() const LLVM_READONLY { return SemiLoc; }
     542             : 
     543             :   static bool classof(const Stmt *T) {
     544             :     return T->getStmtClass() == NullStmtClass;
     545             :   }
     546             : 
     547           0 :   child_range children() { return child_range(); }
     548             : 
     549             :   friend class ASTStmtReader;
     550             :   friend class ASTStmtWriter;
     551             : };
     552             : 
     553             : /// CompoundStmt - This represents a group of statements like { stmt stmt }.
     554             : ///
     555             : class CompoundStmt : public Stmt {
     556             :   Stmt** Body;
     557             :   SourceLocation LBraceLoc, RBraceLoc;
     558             : 
     559             :   friend class ASTStmtReader;
     560             : 
     561             : public:
     562             :   CompoundStmt(const ASTContext &C, ArrayRef<Stmt*> Stmts,
     563             :                SourceLocation LB, SourceLocation RB);
     564             : 
     565             :   // \brief Build an empty compound statement with a location.
     566             :   explicit CompoundStmt(SourceLocation Loc)
     567             :     : Stmt(CompoundStmtClass), Body(nullptr), LBraceLoc(Loc), RBraceLoc(Loc) {
     568             :     CompoundStmtBits.NumStmts = 0;
     569             :   }
     570             : 
     571             :   // \brief Build an empty compound statement.
     572             :   explicit CompoundStmt(EmptyShell Empty)
     573             :     : Stmt(CompoundStmtClass, Empty), Body(nullptr) {
     574             :     CompoundStmtBits.NumStmts = 0;
     575             :   }
     576             : 
     577             :   void setStmts(const ASTContext &C, Stmt **Stmts, unsigned NumStmts);
     578             : 
     579             :   bool body_empty() const { return CompoundStmtBits.NumStmts == 0; }
     580             :   unsigned size() const { return CompoundStmtBits.NumStmts; }
     581             : 
     582             :   typedef Stmt** body_iterator;
     583             :   typedef llvm::iterator_range<body_iterator> body_range;
     584             : 
     585             :   body_range body() { return body_range(body_begin(), body_end()); }
     586             :   body_iterator body_begin() { return Body; }
     587             :   body_iterator body_end() { return Body + size(); }
     588             :   Stmt *body_front() { return !body_empty() ? Body[0] : nullptr; }
     589             :   Stmt *body_back() { return !body_empty() ? Body[size()-1] : nullptr; }
     590             : 
     591             :   void setLastStmt(Stmt *S) {
     592             :     assert(!body_empty() && "setLastStmt");
     593             :     Body[size()-1] = S;
     594             :   }
     595             : 
     596             :   typedef Stmt* const * const_body_iterator;
     597             :   typedef llvm::iterator_range<const_body_iterator> body_const_range;
     598             : 
     599             :   body_const_range body() const {
     600             :     return body_const_range(body_begin(), body_end());
     601             :   }
     602             :   const_body_iterator body_begin() const { return Body; }
     603             :   const_body_iterator body_end() const { return Body + size(); }
     604             :   const Stmt *body_front() const {
     605             :     return !body_empty() ? Body[0] : nullptr;
     606             :   }
     607             :   const Stmt *body_back() const {
     608             :     return !body_empty() ? Body[size() - 1] : nullptr;
     609             :   }
     610             : 
     611             :   typedef std::reverse_iterator<body_iterator> reverse_body_iterator;
     612             :   reverse_body_iterator body_rbegin() {
     613             :     return reverse_body_iterator(body_end());
     614             :   }
     615             :   reverse_body_iterator body_rend() {
     616             :     return reverse_body_iterator(body_begin());
     617             :   }
     618             : 
     619             :   typedef std::reverse_iterator<const_body_iterator>
     620             :           const_reverse_body_iterator;
     621             : 
     622             :   const_reverse_body_iterator body_rbegin() const {
     623             :     return const_reverse_body_iterator(body_end());
     624             :   }
     625             : 
     626             :   const_reverse_body_iterator body_rend() const {
     627             :     return const_reverse_body_iterator(body_begin());
     628             :   }
     629             : 
     630             :   SourceLocation getLocStart() const LLVM_READONLY { return LBraceLoc; }
     631             :   SourceLocation getLocEnd() const LLVM_READONLY { return RBraceLoc; }
     632             : 
     633             :   SourceLocation getLBracLoc() const { return LBraceLoc; }
     634             :   SourceLocation getRBracLoc() const { return RBraceLoc; }
     635             : 
     636             :   static bool classof(const Stmt *T) {
     637             :     return T->getStmtClass() == CompoundStmtClass;
     638             :   }
     639             : 
     640             :   // Iterators
     641             :   child_range children() {
     642          13 :     return child_range(Body, Body + CompoundStmtBits.NumStmts);
     643             :   }
     644             : 
     645             :   const_child_range children() const {
     646             :     return child_range(Body, Body + CompoundStmtBits.NumStmts);
     647             :   }
     648             : };
     649             : 
     650             : // SwitchCase is the base class for CaseStmt and DefaultStmt,
     651             : class SwitchCase : public Stmt {
     652             : protected:
     653             :   // A pointer to the following CaseStmt or DefaultStmt class,
     654             :   // used by SwitchStmt.
     655             :   SwitchCase *NextSwitchCase;
     656             :   SourceLocation KeywordLoc;
     657             :   SourceLocation ColonLoc;
     658             : 
     659             :   SwitchCase(StmtClass SC, SourceLocation KWLoc, SourceLocation ColonLoc)
     660             :     : Stmt(SC), NextSwitchCase(nullptr), KeywordLoc(KWLoc), ColonLoc(ColonLoc) {
     661             :   }
     662             : 
     663             :   SwitchCase(StmtClass SC, EmptyShell)
     664             :     : Stmt(SC), NextSwitchCase(nullptr) {}
     665             : 
     666             : public:
     667             :   const SwitchCase *getNextSwitchCase() const { return NextSwitchCase; }
     668             : 
     669             :   SwitchCase *getNextSwitchCase() { return NextSwitchCase; }
     670             : 
     671             :   void setNextSwitchCase(SwitchCase *SC) { NextSwitchCase = SC; }
     672             : 
     673             :   SourceLocation getKeywordLoc() const { return KeywordLoc; }
     674             :   void setKeywordLoc(SourceLocation L) { KeywordLoc = L; }
     675             :   SourceLocation getColonLoc() const { return ColonLoc; }
     676             :   void setColonLoc(SourceLocation L) { ColonLoc = L; }
     677             : 
     678             :   Stmt *getSubStmt();
     679             :   const Stmt *getSubStmt() const {
     680             :     return const_cast<SwitchCase*>(this)->getSubStmt();
     681             :   }
     682             : 
     683             :   SourceLocation getLocStart() const LLVM_READONLY { return KeywordLoc; }
     684             :   SourceLocation getLocEnd() const LLVM_READONLY;
     685             : 
     686             :   static bool classof(const Stmt *T) {
     687             :     return T->getStmtClass() == CaseStmtClass ||
     688             :            T->getStmtClass() == DefaultStmtClass;
     689             :   }
     690             : };
     691             : 
     692             : class CaseStmt : public SwitchCase {
     693             :   SourceLocation EllipsisLoc;
     694             :   enum { LHS, RHS, SUBSTMT, END_EXPR };
     695             :   Stmt* SubExprs[END_EXPR];  // The expression for the RHS is Non-null for
     696             :                              // GNU "case 1 ... 4" extension
     697             : public:
     698             :   CaseStmt(Expr *lhs, Expr *rhs, SourceLocation caseLoc,
     699             :            SourceLocation ellipsisLoc, SourceLocation colonLoc)
     700             :     : SwitchCase(CaseStmtClass, caseLoc, colonLoc) {
     701             :     SubExprs[SUBSTMT] = nullptr;
     702             :     SubExprs[LHS] = reinterpret_cast<Stmt*>(lhs);
     703             :     SubExprs[RHS] = reinterpret_cast<Stmt*>(rhs);
     704             :     EllipsisLoc = ellipsisLoc;
     705             :   }
     706             : 
     707             :   /// \brief Build an empty switch case statement.
     708             :   explicit CaseStmt(EmptyShell Empty) : SwitchCase(CaseStmtClass, Empty) { }
     709             : 
     710             :   SourceLocation getCaseLoc() const { return KeywordLoc; }
     711             :   void setCaseLoc(SourceLocation L) { KeywordLoc = L; }
     712             :   SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
     713             :   void setEllipsisLoc(SourceLocation L) { EllipsisLoc = L; }
     714             :   SourceLocation getColonLoc() const { return ColonLoc; }
     715             :   void setColonLoc(SourceLocation L) { ColonLoc = L; }
     716             : 
     717             :   Expr *getLHS() { return reinterpret_cast<Expr*>(SubExprs[LHS]); }
     718             :   Expr *getRHS() { return reinterpret_cast<Expr*>(SubExprs[RHS]); }
     719             :   Stmt *getSubStmt() { return SubExprs[SUBSTMT]; }
     720             : 
     721             :   const Expr *getLHS() const {
     722             :     return reinterpret_cast<const Expr*>(SubExprs[LHS]);
     723             :   }
     724             :   const Expr *getRHS() const {
     725             :     return reinterpret_cast<const Expr*>(SubExprs[RHS]);
     726             :   }
     727             :   const Stmt *getSubStmt() const { return SubExprs[SUBSTMT]; }
     728             : 
     729             :   void setSubStmt(Stmt *S) { SubExprs[SUBSTMT] = S; }
     730             :   void setLHS(Expr *Val) { SubExprs[LHS] = reinterpret_cast<Stmt*>(Val); }
     731             :   void setRHS(Expr *Val) { SubExprs[RHS] = reinterpret_cast<Stmt*>(Val); }
     732             : 
     733             :   SourceLocation getLocStart() const LLVM_READONLY { return KeywordLoc; }
     734             :   SourceLocation getLocEnd() const LLVM_READONLY {
     735             :     // Handle deeply nested case statements with iteration instead of recursion.
     736             :     const CaseStmt *CS = this;
     737             :     while (const CaseStmt *CS2 = dyn_cast<CaseStmt>(CS->getSubStmt()))
     738             :       CS = CS2;
     739             : 
     740             :     return CS->getSubStmt()->getLocEnd();
     741             :   }
     742             : 
     743             :   static bool classof(const Stmt *T) {
     744          73 :     return T->getStmtClass() == CaseStmtClass;
     745             :   }
     746             : 
     747             :   // Iterators
     748             :   child_range children() {
     749           0 :     return child_range(&SubExprs[0], &SubExprs[END_EXPR]);
     750             :   }
     751             : };
     752             : 
     753             : class DefaultStmt : public SwitchCase {
     754             :   Stmt* SubStmt;
     755             : public:
     756             :   DefaultStmt(SourceLocation DL, SourceLocation CL, Stmt *substmt) :
     757             :     SwitchCase(DefaultStmtClass, DL, CL), SubStmt(substmt) {}
     758             : 
     759             :   /// \brief Build an empty default statement.
     760             :   explicit DefaultStmt(EmptyShell Empty)
     761             :     : SwitchCase(DefaultStmtClass, Empty) { }
     762             : 
     763             :   Stmt *getSubStmt() { return SubStmt; }
     764             :   const Stmt *getSubStmt() const { return SubStmt; }
     765             :   void setSubStmt(Stmt *S) { SubStmt = S; }
     766             : 
     767             :   SourceLocation getDefaultLoc() const { return KeywordLoc; }
     768             :   void setDefaultLoc(SourceLocation L) { KeywordLoc = L; }
     769             :   SourceLocation getColonLoc() const { return ColonLoc; }
     770             :   void setColonLoc(SourceLocation L) { ColonLoc = L; }
     771             : 
     772             :   SourceLocation getLocStart() const LLVM_READONLY { return KeywordLoc; }
     773             :   SourceLocation getLocEnd() const LLVM_READONLY { return SubStmt->getLocEnd();}
     774             : 
     775             :   static bool classof(const Stmt *T) {
     776             :     return T->getStmtClass() == DefaultStmtClass;
     777             :   }
     778             : 
     779             :   // Iterators
     780           0 :   child_range children() { return child_range(&SubStmt, &SubStmt+1); }
     781             : };
     782             : 
     783             : inline SourceLocation SwitchCase::getLocEnd() const {
     784             :   if (const CaseStmt *CS = dyn_cast<CaseStmt>(this))
     785             :     return CS->getLocEnd();
     786             :   return cast<DefaultStmt>(this)->getLocEnd();
     787             : }
     788             : 
     789             : /// LabelStmt - Represents a label, which has a substatement.  For example:
     790             : ///    foo: return;
     791             : ///
     792             : class LabelStmt : public Stmt {
     793             :   SourceLocation IdentLoc;
     794             :   LabelDecl *TheDecl;
     795             :   Stmt *SubStmt;
     796             : 
     797             : public:
     798             :   LabelStmt(SourceLocation IL, LabelDecl *D, Stmt *substmt)
     799             :       : Stmt(LabelStmtClass), IdentLoc(IL), TheDecl(D), SubStmt(substmt) {
     800             :     static_assert(sizeof(LabelStmt) ==
     801             :                       2 * sizeof(SourceLocation) + 2 * sizeof(void *),
     802             :                   "LabelStmt too big");
     803             :   }
     804             : 
     805             :   // \brief Build an empty label statement.
     806             :   explicit LabelStmt(EmptyShell Empty) : Stmt(LabelStmtClass, Empty) { }
     807             : 
     808             :   SourceLocation getIdentLoc() const { return IdentLoc; }
     809             :   LabelDecl *getDecl() const { return TheDecl; }
     810             :   void setDecl(LabelDecl *D) { TheDecl = D; }
     811             :   const char *getName() const;
     812             :   Stmt *getSubStmt() { return SubStmt; }
     813             :   const Stmt *getSubStmt() const { return SubStmt; }
     814             :   void setIdentLoc(SourceLocation L) { IdentLoc = L; }
     815             :   void setSubStmt(Stmt *SS) { SubStmt = SS; }
     816             : 
     817             :   SourceLocation getLocStart() const LLVM_READONLY { return IdentLoc; }
     818             :   SourceLocation getLocEnd() const LLVM_READONLY { return SubStmt->getLocEnd();}
     819             : 
     820           0 :   child_range children() { return child_range(&SubStmt, &SubStmt+1); }
     821             : 
     822             :   static bool classof(const Stmt *T) {
     823             :     return T->getStmtClass() == LabelStmtClass;
     824             :   }
     825             : };
     826             : 
     827             : 
     828             : /// \brief Represents an attribute applied to a statement.
     829             : ///
     830             : /// Represents an attribute applied to a statement. For example:
     831             : ///   [[omp::for(...)]] for (...) { ... }
     832             : ///
     833             : class AttributedStmt : public Stmt {
     834             :   Stmt *SubStmt;
     835             :   SourceLocation AttrLoc;
     836             :   unsigned NumAttrs;
     837             : 
     838             :   friend class ASTStmtReader;
     839             : 
     840             :   AttributedStmt(SourceLocation Loc, ArrayRef<const Attr*> Attrs, Stmt *SubStmt)
     841             :     : Stmt(AttributedStmtClass), SubStmt(SubStmt), AttrLoc(Loc),
     842             :       NumAttrs(Attrs.size()) {
     843             :     memcpy(getAttrArrayPtr(), Attrs.data(), Attrs.size() * sizeof(Attr *));
     844             :   }
     845             : 
     846             :   explicit AttributedStmt(EmptyShell Empty, unsigned NumAttrs)
     847             :     : Stmt(AttributedStmtClass, Empty), NumAttrs(NumAttrs) {
     848             :     memset(getAttrArrayPtr(), 0, NumAttrs * sizeof(Attr *));
     849             :   }
     850             : 
     851             :   Attr *const *getAttrArrayPtr() const {
     852             :     return reinterpret_cast<Attr *const *>(this + 1);
     853             :   }
     854             :   Attr **getAttrArrayPtr() { return reinterpret_cast<Attr **>(this + 1); }
     855             : 
     856             : public:
     857             :   static AttributedStmt *Create(const ASTContext &C, SourceLocation Loc,
     858             :                                 ArrayRef<const Attr*> Attrs, Stmt *SubStmt);
     859             :   // \brief Build an empty attributed statement.
     860             :   static AttributedStmt *CreateEmpty(const ASTContext &C, unsigned NumAttrs);
     861             : 
     862             :   SourceLocation getAttrLoc() const { return AttrLoc; }
     863             :   ArrayRef<const Attr*> getAttrs() const {
     864             :     return llvm::makeArrayRef(getAttrArrayPtr(), NumAttrs);
     865             :   }
     866             :   Stmt *getSubStmt() { return SubStmt; }
     867             :   const Stmt *getSubStmt() const { return SubStmt; }
     868             : 
     869             :   SourceLocation getLocStart() const LLVM_READONLY { return AttrLoc; }
     870             :   SourceLocation getLocEnd() const LLVM_READONLY { return SubStmt->getLocEnd();}
     871             : 
     872           0 :   child_range children() { return child_range(&SubStmt, &SubStmt + 1); }
     873             : 
     874             :   static bool classof(const Stmt *T) {
     875             :     return T->getStmtClass() == AttributedStmtClass;
     876             :   }
     877             : };
     878             : 
     879             : 
     880             : /// IfStmt - This represents an if/then/else.
     881             : ///
     882             : class IfStmt : public Stmt {
     883             :   enum { VAR, COND, THEN, ELSE, END_EXPR };
     884             :   Stmt* SubExprs[END_EXPR];
     885             : 
     886             :   SourceLocation IfLoc;
     887             :   SourceLocation ElseLoc;
     888             : 
     889             : public:
     890             :   IfStmt(const ASTContext &C, SourceLocation IL, VarDecl *var, Expr *cond,
     891             :          Stmt *then, SourceLocation EL = SourceLocation(),
     892             :          Stmt *elsev = nullptr);
     893             : 
     894             :   /// \brief Build an empty if/then/else statement
     895             :   explicit IfStmt(EmptyShell Empty) : Stmt(IfStmtClass, Empty) { }
     896             : 
     897             :   /// \brief Retrieve the variable declared in this "if" statement, if any.
     898             :   ///
     899             :   /// In the following example, "x" is the condition variable.
     900             :   /// \code
     901             :   /// if (int x = foo()) {
     902             :   ///   printf("x is %d", x);
     903             :   /// }
     904             :   /// \endcode
     905             :   VarDecl *getConditionVariable() const;
     906             :   void setConditionVariable(const ASTContext &C, VarDecl *V);
     907             : 
     908             :   /// If this IfStmt has a condition variable, return the faux DeclStmt
     909             :   /// associated with the creation of that condition variable.
     910             :   const DeclStmt *getConditionVariableDeclStmt() const {
     911             :     return reinterpret_cast<DeclStmt*>(SubExprs[VAR]);
     912             :   }
     913             : 
     914             :   const Expr *getCond() const { return reinterpret_cast<Expr*>(SubExprs[COND]);}
     915             :   void setCond(Expr *E) { SubExprs[COND] = reinterpret_cast<Stmt *>(E); }
     916             :   const Stmt *getThen() const { return SubExprs[THEN]; }
     917             :   void setThen(Stmt *S) { SubExprs[THEN] = S; }
     918             :   const Stmt *getElse() const { return SubExprs[ELSE]; }
     919             :   void setElse(Stmt *S) { SubExprs[ELSE] = S; }
     920             : 
     921             :   Expr *getCond() { return reinterpret_cast<Expr*>(SubExprs[COND]); }
     922             :   Stmt *getThen() { return SubExprs[THEN]; }
     923             :   Stmt *getElse() { return SubExprs[ELSE]; }
     924             : 
     925             :   SourceLocation getIfLoc() const { return IfLoc; }
     926             :   void setIfLoc(SourceLocation L) { IfLoc = L; }
     927             :   SourceLocation getElseLoc() const { return ElseLoc; }
     928             :   void setElseLoc(SourceLocation L) { ElseLoc = L; }
     929             : 
     930             :   SourceLocation getLocStart() const LLVM_READONLY { return IfLoc; }
     931             :   SourceLocation getLocEnd() const LLVM_READONLY {
     932             :     if (SubExprs[ELSE])
     933             :       return SubExprs[ELSE]->getLocEnd();
     934             :     else
     935             :       return SubExprs[THEN]->getLocEnd();
     936             :   }
     937             : 
     938             :   // Iterators over subexpressions.  The iterators will include iterating
     939             :   // over the initialization expression referenced by the condition variable.
     940             :   child_range children() {
     941           0 :     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
     942             :   }
     943             : 
     944             :   static bool classof(const Stmt *T) {
     945             :     return T->getStmtClass() == IfStmtClass;
     946             :   }
     947             : };
     948             : 
     949             : /// SwitchStmt - This represents a 'switch' stmt.
     950             : ///
     951             : class SwitchStmt : public Stmt {
     952             :   SourceLocation SwitchLoc;
     953             :   enum { VAR, COND, BODY, END_EXPR };
     954             :   Stmt* SubExprs[END_EXPR];
     955             :   // This points to a linked list of case and default statements and, if the
     956             :   // SwitchStmt is a switch on an enum value, records whether all the enum
     957             :   // values were covered by CaseStmts.  The coverage information value is meant
     958             :   // to be a hint for possible clients.
     959             :   llvm::PointerIntPair<SwitchCase *, 1, bool> FirstCase;
     960             : 
     961             : public:
     962             :   SwitchStmt(const ASTContext &C, VarDecl *Var, Expr *cond);
     963             : 
     964             :   /// \brief Build a empty switch statement.
     965             :   explicit SwitchStmt(EmptyShell Empty) : Stmt(SwitchStmtClass, Empty) { }
     966             : 
     967             :   /// \brief Retrieve the variable declared in this "switch" statement, if any.
     968             :   ///
     969             :   /// In the following example, "x" is the condition variable.
     970             :   /// \code
     971             :   /// switch (int x = foo()) {
     972             :   ///   case 0: break;
     973             :   ///   // ...
     974             :   /// }
     975             :   /// \endcode
     976             :   VarDecl *getConditionVariable() const;
     977             :   void setConditionVariable(const ASTContext &C, VarDecl *V);
     978             : 
     979             :   /// If this SwitchStmt has a condition variable, return the faux DeclStmt
     980             :   /// associated with the creation of that condition variable.
     981             :   const DeclStmt *getConditionVariableDeclStmt() const {
     982             :     return reinterpret_cast<DeclStmt*>(SubExprs[VAR]);
     983             :   }
     984             : 
     985             :   const Expr *getCond() const { return reinterpret_cast<Expr*>(SubExprs[COND]);}
     986             :   const Stmt *getBody() const { return SubExprs[BODY]; }
     987             :   const SwitchCase *getSwitchCaseList() const { return FirstCase.getPointer(); }
     988             : 
     989             :   Expr *getCond() { return reinterpret_cast<Expr*>(SubExprs[COND]);}
     990             :   void setCond(Expr *E) { SubExprs[COND] = reinterpret_cast<Stmt *>(E); }
     991             :   Stmt *getBody() { return SubExprs[BODY]; }
     992             :   void setBody(Stmt *S) { SubExprs[BODY] = S; }
     993             :   SwitchCase *getSwitchCaseList() { return FirstCase.getPointer(); }
     994             : 
     995             :   /// \brief Set the case list for this switch statement.
     996             :   void setSwitchCaseList(SwitchCase *SC) { FirstCase.setPointer(SC); }
     997             : 
     998             :   SourceLocation getSwitchLoc() const { return SwitchLoc; }
     999             :   void setSwitchLoc(SourceLocation L) { SwitchLoc = L; }
    1000             : 
    1001             :   void setBody(Stmt *S, SourceLocation SL) {
    1002             :     SubExprs[BODY] = S;
    1003             :     SwitchLoc = SL;
    1004             :   }
    1005             :   void addSwitchCase(SwitchCase *SC) {
    1006             :     assert(!SC->getNextSwitchCase()
    1007             :            && "case/default already added to a switch");
    1008             :     SC->setNextSwitchCase(FirstCase.getPointer());
    1009             :     FirstCase.setPointer(SC);
    1010             :   }
    1011             : 
    1012             :   /// Set a flag in the SwitchStmt indicating that if the 'switch (X)' is a
    1013             :   /// switch over an enum value then all cases have been explicitly covered.
    1014             :   void setAllEnumCasesCovered() { FirstCase.setInt(true); }
    1015             : 
    1016             :   /// Returns true if the SwitchStmt is a switch of an enum value and all cases
    1017             :   /// have been explicitly covered.
    1018             :   bool isAllEnumCasesCovered() const { return FirstCase.getInt(); }
    1019             : 
    1020             :   SourceLocation getLocStart() const LLVM_READONLY { return SwitchLoc; }
    1021             :   SourceLocation getLocEnd() const LLVM_READONLY {
    1022             :     return SubExprs[BODY] ? SubExprs[BODY]->getLocEnd() : SubExprs[COND]->getLocEnd();
    1023             :   }
    1024             : 
    1025             :   // Iterators
    1026             :   child_range children() {
    1027           0 :     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
    1028             :   }
    1029             : 
    1030             :   static bool classof(const Stmt *T) {
    1031             :     return T->getStmtClass() == SwitchStmtClass;
    1032             :   }
    1033             : };
    1034             : 
    1035             : 
    1036             : /// WhileStmt - This represents a 'while' stmt.
    1037             : ///
    1038             : class WhileStmt : public Stmt {
    1039             :   SourceLocation WhileLoc;
    1040             :   enum { VAR, COND, BODY, END_EXPR };
    1041             :   Stmt* SubExprs[END_EXPR];
    1042             : public:
    1043             :   WhileStmt(const ASTContext &C, VarDecl *Var, Expr *cond, Stmt *body,
    1044             :             SourceLocation WL);
    1045             : 
    1046             :   /// \brief Build an empty while statement.
    1047             :   explicit WhileStmt(EmptyShell Empty) : Stmt(WhileStmtClass, Empty) { }
    1048             : 
    1049             :   /// \brief Retrieve the variable declared in this "while" statement, if any.
    1050             :   ///
    1051             :   /// In the following example, "x" is the condition variable.
    1052             :   /// \code
    1053             :   /// while (int x = random()) {
    1054             :   ///   // ...
    1055             :   /// }
    1056             :   /// \endcode
    1057             :   VarDecl *getConditionVariable() const;
    1058             :   void setConditionVariable(const ASTContext &C, VarDecl *V);
    1059             : 
    1060             :   /// If this WhileStmt has a condition variable, return the faux DeclStmt
    1061             :   /// associated with the creation of that condition variable.
    1062             :   const DeclStmt *getConditionVariableDeclStmt() const {
    1063             :     return reinterpret_cast<DeclStmt*>(SubExprs[VAR]);
    1064             :   }
    1065             : 
    1066             :   Expr *getCond() { return reinterpret_cast<Expr*>(SubExprs[COND]); }
    1067             :   const Expr *getCond() const { return reinterpret_cast<Expr*>(SubExprs[COND]);}
    1068             :   void setCond(Expr *E) { SubExprs[COND] = reinterpret_cast<Stmt*>(E); }
    1069             :   Stmt *getBody() { return SubExprs[BODY]; }
    1070             :   const Stmt *getBody() const { return SubExprs[BODY]; }
    1071             :   void setBody(Stmt *S) { SubExprs[BODY] = S; }
    1072             : 
    1073             :   SourceLocation getWhileLoc() const { return WhileLoc; }
    1074             :   void setWhileLoc(SourceLocation L) { WhileLoc = L; }
    1075             : 
    1076             :   SourceLocation getLocStart() const LLVM_READONLY { return WhileLoc; }
    1077             :   SourceLocation getLocEnd() const LLVM_READONLY {
    1078             :     return SubExprs[BODY]->getLocEnd();
    1079             :   }
    1080             : 
    1081             :   static bool classof(const Stmt *T) {
    1082             :     return T->getStmtClass() == WhileStmtClass;
    1083             :   }
    1084             : 
    1085             :   // Iterators
    1086             :   child_range children() {
    1087           0 :     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
    1088             :   }
    1089             : };
    1090             : 
    1091             : /// DoStmt - This represents a 'do/while' stmt.
    1092             : ///
    1093             : class DoStmt : public Stmt {
    1094             :   SourceLocation DoLoc;
    1095             :   enum { BODY, COND, END_EXPR };
    1096             :   Stmt* SubExprs[END_EXPR];
    1097             :   SourceLocation WhileLoc;
    1098             :   SourceLocation RParenLoc;  // Location of final ')' in do stmt condition.
    1099             : 
    1100             : public:
    1101             :   DoStmt(Stmt *body, Expr *cond, SourceLocation DL, SourceLocation WL,
    1102             :          SourceLocation RP)
    1103             :     : Stmt(DoStmtClass), DoLoc(DL), WhileLoc(WL), RParenLoc(RP) {
    1104             :     SubExprs[COND] = reinterpret_cast<Stmt*>(cond);
    1105             :     SubExprs[BODY] = body;
    1106             :   }
    1107             : 
    1108             :   /// \brief Build an empty do-while statement.
    1109             :   explicit DoStmt(EmptyShell Empty) : Stmt(DoStmtClass, Empty) { }
    1110             : 
    1111             :   Expr *getCond() { return reinterpret_cast<Expr*>(SubExprs[COND]); }
    1112             :   const Expr *getCond() const { return reinterpret_cast<Expr*>(SubExprs[COND]);}
    1113             :   void setCond(Expr *E) { SubExprs[COND] = reinterpret_cast<Stmt*>(E); }
    1114             :   Stmt *getBody() { return SubExprs[BODY]; }
    1115             :   const Stmt *getBody() const { return SubExprs[BODY]; }
    1116             :   void setBody(Stmt *S) { SubExprs[BODY] = S; }
    1117             : 
    1118             :   SourceLocation getDoLoc() const { return DoLoc; }
    1119             :   void setDoLoc(SourceLocation L) { DoLoc = L; }
    1120             :   SourceLocation getWhileLoc() const { return WhileLoc; }
    1121             :   void setWhileLoc(SourceLocation L) { WhileLoc = L; }
    1122             : 
    1123             :   SourceLocation getRParenLoc() const { return RParenLoc; }
    1124             :   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
    1125             : 
    1126             :   SourceLocation getLocStart() const LLVM_READONLY { return DoLoc; }
    1127             :   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
    1128             : 
    1129             :   static bool classof(const Stmt *T) {
    1130             :     return T->getStmtClass() == DoStmtClass;
    1131             :   }
    1132             : 
    1133             :   // Iterators
    1134             :   child_range children() {
    1135           0 :     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
    1136             :   }
    1137             : };
    1138             : 
    1139             : 
    1140             : /// ForStmt - This represents a 'for (init;cond;inc)' stmt.  Note that any of
    1141             : /// the init/cond/inc parts of the ForStmt will be null if they were not
    1142             : /// specified in the source.
    1143             : ///
    1144             : class ForStmt : public Stmt {
    1145             :   SourceLocation ForLoc;
    1146             :   enum { INIT, CONDVAR, COND, INC, BODY, END_EXPR };
    1147             :   Stmt* SubExprs[END_EXPR]; // SubExprs[INIT] is an expression or declstmt.
    1148             :   SourceLocation LParenLoc, RParenLoc;
    1149             : 
    1150             : public:
    1151             :   ForStmt(const ASTContext &C, Stmt *Init, Expr *Cond, VarDecl *condVar,
    1152             :           Expr *Inc, Stmt *Body, SourceLocation FL, SourceLocation LP,
    1153             :           SourceLocation RP);
    1154             : 
    1155             :   /// \brief Build an empty for statement.
    1156             :   explicit ForStmt(EmptyShell Empty) : Stmt(ForStmtClass, Empty) { }
    1157             : 
    1158             :   Stmt *getInit() { return SubExprs[INIT]; }
    1159             : 
    1160             :   /// \brief Retrieve the variable declared in this "for" statement, if any.
    1161             :   ///
    1162             :   /// In the following example, "y" is the condition variable.
    1163             :   /// \code
    1164             :   /// for (int x = random(); int y = mangle(x); ++x) {
    1165             :   ///   // ...
    1166             :   /// }
    1167             :   /// \endcode
    1168             :   VarDecl *getConditionVariable() const;
    1169             :   void setConditionVariable(const ASTContext &C, VarDecl *V);
    1170             : 
    1171             :   /// If this ForStmt has a condition variable, return the faux DeclStmt
    1172             :   /// associated with the creation of that condition variable.
    1173             :   const DeclStmt *getConditionVariableDeclStmt() const {
    1174             :     return reinterpret_cast<DeclStmt*>(SubExprs[CONDVAR]);
    1175             :   }
    1176             : 
    1177             :   Expr *getCond() { return reinterpret_cast<Expr*>(SubExprs[COND]); }
    1178             :   Expr *getInc()  { return reinterpret_cast<Expr*>(SubExprs[INC]); }
    1179             :   Stmt *getBody() { return SubExprs[BODY]; }
    1180             : 
    1181             :   const Stmt *getInit() const { return SubExprs[INIT]; }
    1182             :   const Expr *getCond() const { return reinterpret_cast<Expr*>(SubExprs[COND]);}
    1183             :   const Expr *getInc()  const { return reinterpret_cast<Expr*>(SubExprs[INC]); }
    1184             :   const Stmt *getBody() const { return SubExprs[BODY]; }
    1185             : 
    1186             :   void setInit(Stmt *S) { SubExprs[INIT] = S; }
    1187             :   void setCond(Expr *E) { SubExprs[COND] = reinterpret_cast<Stmt*>(E); }
    1188             :   void setInc(Expr *E) { SubExprs[INC] = reinterpret_cast<Stmt*>(E); }
    1189             :   void setBody(Stmt *S) { SubExprs[BODY] = S; }
    1190             : 
    1191             :   SourceLocation getForLoc() const { return ForLoc; }
    1192             :   void setForLoc(SourceLocation L) { ForLoc = L; }
    1193             :   SourceLocation getLParenLoc() const { return LParenLoc; }
    1194             :   void setLParenLoc(SourceLocation L) { LParenLoc = L; }
    1195             :   SourceLocation getRParenLoc() const { return RParenLoc; }
    1196             :   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
    1197             : 
    1198             :   SourceLocation getLocStart() const LLVM_READONLY { return ForLoc; }
    1199             :   SourceLocation getLocEnd() const LLVM_READONLY {
    1200             :     return SubExprs[BODY]->getLocEnd();
    1201             :   }
    1202             : 
    1203             :   static bool classof(const Stmt *T) {
    1204             :     return T->getStmtClass() == ForStmtClass;
    1205             :   }
    1206             : 
    1207             :   // Iterators
    1208             :   child_range children() {
    1209           0 :     return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
    1210             :   }
    1211             : };
    1212             : 
    1213             : /// GotoStmt - This represents a direct goto.
    1214             : ///
    1215             : class GotoStmt : public Stmt {
    1216             :   LabelDecl *Label;
    1217             :   SourceLocation GotoLoc;
    1218             :   SourceLocation LabelLoc;
    1219             : public:
    1220             :   GotoStmt(LabelDecl *label, SourceLocation GL, SourceLocation LL)
    1221             :     : Stmt(GotoStmtClass), Label(label), GotoLoc(GL), LabelLoc(LL) {}
    1222             : 
    1223             :   /// \brief Build an empty goto statement.
    1224             :   explicit GotoStmt(EmptyShell Empty) : Stmt(GotoStmtClass, Empty) { }
    1225             : 
    1226             :   LabelDecl *getLabel() const { return Label; }
    1227             :   void setLabel(LabelDecl *D) { Label = D; }
    1228             : 
    1229             :   SourceLocation getGotoLoc() const { return GotoLoc; }
    1230             :   void setGotoLoc(SourceLocation L) { GotoLoc = L; }
    1231             :   SourceLocation getLabelLoc() const { return LabelLoc; }
    1232             :   void setLabelLoc(SourceLocation L) { LabelLoc = L; }
    1233             : 
    1234             :   SourceLocation getLocStart() const LLVM_READONLY { return GotoLoc; }
    1235             :   SourceLocation getLocEnd() const LLVM_READONLY { return LabelLoc; }
    1236             : 
    1237             :   static bool classof(const Stmt *T) {
    1238             :     return T->getStmtClass() == GotoStmtClass;
    1239             :   }
    1240             : 
    1241             :   // Iterators
    1242           0 :   child_range children() { return child_range(); }
    1243             : };
    1244             : 
    1245             : /// IndirectGotoStmt - This represents an indirect goto.
    1246             : ///
    1247             : class IndirectGotoStmt : public Stmt {
    1248             :   SourceLocation GotoLoc;
    1249             :   SourceLocation StarLoc;
    1250             :   Stmt *Target;
    1251             : public:
    1252             :   IndirectGotoStmt(SourceLocation gotoLoc, SourceLocation starLoc,
    1253             :                    Expr *target)
    1254             :     : Stmt(IndirectGotoStmtClass), GotoLoc(gotoLoc), StarLoc(starLoc),
    1255             :       Target((Stmt*)target) {}
    1256             : 
    1257             :   /// \brief Build an empty indirect goto statement.
    1258             :   explicit IndirectGotoStmt(EmptyShell Empty)
    1259             :     : Stmt(IndirectGotoStmtClass, Empty) { }
    1260             : 
    1261             :   void setGotoLoc(SourceLocation L) { GotoLoc = L; }
    1262             :   SourceLocation getGotoLoc() const { return GotoLoc; }
    1263             :   void setStarLoc(SourceLocation L) { StarLoc = L; }
    1264             :   SourceLocation getStarLoc() const { return StarLoc; }
    1265             : 
    1266             :   Expr *getTarget() { return reinterpret_cast<Expr*>(Target); }
    1267             :   const Expr *getTarget() const {return reinterpret_cast<const Expr*>(Target);}
    1268             :   void setTarget(Expr *E) { Target = reinterpret_cast<Stmt*>(E); }
    1269             : 
    1270             :   /// getConstantTarget - Returns the fixed target of this indirect
    1271             :   /// goto, if one exists.
    1272             :   LabelDecl *getConstantTarget();
    1273             :   const LabelDecl *getConstantTarget() const {
    1274             :     return const_cast<IndirectGotoStmt*>(this)->getConstantTarget();
    1275             :   }
    1276             : 
    1277             :   SourceLocation getLocStart() const LLVM_READONLY { return GotoLoc; }
    1278             :   SourceLocation getLocEnd() const LLVM_READONLY { return Target->getLocEnd(); }
    1279             : 
    1280             :   static bool classof(const Stmt *T) {
    1281             :     return T->getStmtClass() == IndirectGotoStmtClass;
    1282             :   }
    1283             : 
    1284             :   // Iterators
    1285           0 :   child_range children() { return child_range(&Target, &Target+1); }
    1286             : };
    1287             : 
    1288             : 
    1289             : /// ContinueStmt - This represents a continue.
    1290             : ///
    1291             : class ContinueStmt : public Stmt {
    1292             :   SourceLocation ContinueLoc;
    1293             : public:
    1294             :   ContinueStmt(SourceLocation CL) : Stmt(ContinueStmtClass), ContinueLoc(CL) {}
    1295             : 
    1296             :   /// \brief Build an empty continue statement.
    1297             :   explicit ContinueStmt(EmptyShell Empty) : Stmt(ContinueStmtClass, Empty) { }
    1298             : 
    1299             :   SourceLocation getContinueLoc() const { return ContinueLoc; }
    1300             :   void setContinueLoc(SourceLocation L) { ContinueLoc = L; }
    1301             : 
    1302             :   SourceLocation getLocStart() const LLVM_READONLY { return ContinueLoc; }
    1303             :   SourceLocation getLocEnd() const LLVM_READONLY { return ContinueLoc; }
    1304             : 
    1305             :   static bool classof(const Stmt *T) {
    1306             :     return T->getStmtClass() == ContinueStmtClass;
    1307             :   }
    1308             : 
    1309             :   // Iterators
    1310           0 :   child_range children() { return child_range(); }
    1311             : };
    1312             : 
    1313             : /// BreakStmt - This represents a break.
    1314             : ///
    1315             : class BreakStmt : public Stmt {
    1316             :   SourceLocation BreakLoc;
    1317             : 
    1318             : public:
    1319             :   BreakStmt(SourceLocation BL) : Stmt(BreakStmtClass), BreakLoc(BL) {
    1320             :     static_assert(sizeof(BreakStmt) == 2 * sizeof(SourceLocation),
    1321             :                   "BreakStmt too large");
    1322             :   }
    1323             : 
    1324             :   /// \brief Build an empty break statement.
    1325             :   explicit BreakStmt(EmptyShell Empty) : Stmt(BreakStmtClass, Empty) { }
    1326             : 
    1327             :   SourceLocation getBreakLoc() const { return BreakLoc; }
    1328             :   void setBreakLoc(SourceLocation L) { BreakLoc = L; }
    1329             : 
    1330             :   SourceLocation getLocStart() const LLVM_READONLY { return BreakLoc; }
    1331             :   SourceLocation getLocEnd() const LLVM_READONLY { return BreakLoc; }
    1332             : 
    1333             :   static bool classof(const Stmt *T) {
    1334             :     return T->getStmtClass() == BreakStmtClass;
    1335             :   }
    1336             : 
    1337             :   // Iterators
    1338           0 :   child_range children() { return child_range(); }
    1339             : };
    1340             : 
    1341             : 
    1342             : /// ReturnStmt - This represents a return, optionally of an expression:
    1343             : ///   return;
    1344             : ///   return 4;
    1345             : ///
    1346             : /// Note that GCC allows return with no argument in a function declared to
    1347             : /// return a value, and it allows returning a value in functions declared to
    1348             : /// return void.  We explicitly model this in the AST, which means you can't
    1349             : /// depend on the return type of the function and the presence of an argument.
    1350             : ///
    1351             : class ReturnStmt : public Stmt {
    1352             :   SourceLocation RetLoc;
    1353             :   Stmt *RetExpr;
    1354             :   const VarDecl *NRVOCandidate;
    1355             : 
    1356             : public:
    1357             :   explicit ReturnStmt(SourceLocation RL) : ReturnStmt(RL, nullptr, nullptr) {}
    1358             : 
    1359             :   ReturnStmt(SourceLocation RL, Expr *E, const VarDecl *NRVOCandidate)
    1360             :       : Stmt(ReturnStmtClass), RetLoc(RL), RetExpr((Stmt *)E),
    1361             :         NRVOCandidate(NRVOCandidate) {}
    1362             : 
    1363             :   /// \brief Build an empty return expression.
    1364             :   explicit ReturnStmt(EmptyShell Empty) : Stmt(ReturnStmtClass, Empty) { }
    1365             : 
    1366             :   const Expr *getRetValue() const;
    1367             :   Expr *getRetValue();
    1368             :   void setRetValue(Expr *E) { RetExpr = reinterpret_cast<Stmt*>(E); }
    1369             : 
    1370             :   SourceLocation getReturnLoc() const { return RetLoc; }
    1371             :   void setReturnLoc(SourceLocation L) { RetLoc = L; }
    1372             : 
    1373             :   /// \brief Retrieve the variable that might be used for the named return
    1374             :   /// value optimization.
    1375             :   ///
    1376             :   /// The optimization itself can only be performed if the variable is
    1377             :   /// also marked as an NRVO object.
    1378             :   const VarDecl *getNRVOCandidate() const { return NRVOCandidate; }
    1379             :   void setNRVOCandidate(const VarDecl *Var) { NRVOCandidate = Var; }
    1380             : 
    1381             :   SourceLocation getLocStart() const LLVM_READONLY { return RetLoc; }
    1382             :   SourceLocation getLocEnd() const LLVM_READONLY {
    1383             :     return RetExpr ? RetExpr->getLocEnd() : RetLoc;
    1384             :   }
    1385             : 
    1386             :   static bool classof(const Stmt *T) {
    1387             :     return T->getStmtClass() == ReturnStmtClass;
    1388             :   }
    1389             : 
    1390             :   // Iterators
    1391             :   child_range children() {
    1392          10 :     if (RetExpr) return child_range(&RetExpr, &RetExpr+1);
    1393           0 :     return child_range();
    1394           5 :   }
    1395             : };
    1396             : 
    1397             : /// AsmStmt is the base class for GCCAsmStmt and MSAsmStmt.
    1398             : ///
    1399             : class AsmStmt : public Stmt {
    1400             : protected:
    1401             :   SourceLocation AsmLoc;
    1402             :   /// \brief True if the assembly statement does not have any input or output
    1403             :   /// operands.
    1404             :   bool IsSimple;
    1405             : 
    1406             :   /// \brief If true, treat this inline assembly as having side effects.
    1407             :   /// This assembly statement should not be optimized, deleted or moved.
    1408             :   bool IsVolatile;
    1409             : 
    1410             :   unsigned NumOutputs;
    1411             :   unsigned NumInputs;
    1412             :   unsigned NumClobbers;
    1413             : 
    1414             :   Stmt **Exprs;
    1415             : 
    1416             :   AsmStmt(StmtClass SC, SourceLocation asmloc, bool issimple, bool isvolatile,
    1417             :           unsigned numoutputs, unsigned numinputs, unsigned numclobbers) :
    1418             :     Stmt (SC), AsmLoc(asmloc), IsSimple(issimple), IsVolatile(isvolatile),
    1419             :     NumOutputs(numoutputs), NumInputs(numinputs), NumClobbers(numclobbers) { }
    1420             : 
    1421             :   friend class ASTStmtReader;
    1422             : 
    1423             : public:
    1424             :   /// \brief Build an empty inline-assembly statement.
    1425             :   explicit AsmStmt(StmtClass SC, EmptyShell Empty) :
    1426             :     Stmt(SC, Empty), Exprs(nullptr) { }
    1427             : 
    1428             :   SourceLocation getAsmLoc() const { return AsmLoc; }
    1429             :   void setAsmLoc(SourceLocation L) { AsmLoc = L; }
    1430             : 
    1431             :   bool isSimple() const { return IsSimple; }
    1432             :   void setSimple(bool V) { IsSimple = V; }
    1433             : 
    1434             :   bool isVolatile() const { return IsVolatile; }
    1435             :   void setVolatile(bool V) { IsVolatile = V; }
    1436             : 
    1437             :   SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); }
    1438             :   SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); }
    1439             : 
    1440             :   //===--- Asm String Analysis ---===//
    1441             : 
    1442             :   /// Assemble final IR asm string.
    1443             :   std::string generateAsmString(const ASTContext &C) const;
    1444             : 
    1445             :   //===--- Output operands ---===//
    1446             : 
    1447           0 :   unsigned getNumOutputs() const { return NumOutputs; }
    1448             : 
    1449             :   /// getOutputConstraint - Return the constraint string for the specified
    1450             :   /// output operand.  All output constraints are known to be non-empty (either
    1451             :   /// '=' or '+').
    1452             :   StringRef getOutputConstraint(unsigned i) const;
    1453             : 
    1454             :   /// isOutputPlusConstraint - Return true if the specified output constraint
    1455             :   /// is a "+" constraint (which is both an input and an output) or false if it
    1456             :   /// is an "=" constraint (just an output).
    1457             :   bool isOutputPlusConstraint(unsigned i) const {
    1458             :     return getOutputConstraint(i)[0] == '+';
    1459             :   }
    1460             : 
    1461             :   const Expr *getOutputExpr(unsigned i) const;
    1462             : 
    1463             :   /// getNumPlusOperands - Return the number of output operands that have a "+"
    1464             :   /// constraint.
    1465             :   unsigned getNumPlusOperands() const;
    1466             : 
    1467             :   //===--- Input operands ---===//
    1468             : 
    1469           0 :   unsigned getNumInputs() const { return NumInputs; }
    1470             : 
    1471             :   /// getInputConstraint - Return the specified input constraint.  Unlike output
    1472             :   /// constraints, these can be empty.
    1473             :   StringRef getInputConstraint(unsigned i) const;
    1474             :   
    1475             :   const Expr *getInputExpr(unsigned i) const;
    1476             : 
    1477             :   //===--- Other ---===//
    1478             : 
    1479           0 :   unsigned getNumClobbers() const { return NumClobbers; }
    1480             :   StringRef getClobber(unsigned i) const;
    1481             : 
    1482             :   static bool classof(const Stmt *T) {
    1483             :     return T->getStmtClass() == GCCAsmStmtClass ||
    1484             :       T->getStmtClass() == MSAsmStmtClass;
    1485             :   }
    1486             : 
    1487             :   // Input expr iterators.
    1488             : 
    1489             :   typedef ExprIterator inputs_iterator;
    1490             :   typedef ConstExprIterator const_inputs_iterator;
    1491             :   typedef llvm::iterator_range<inputs_iterator> inputs_range;
    1492             :   typedef llvm::iterator_range<const_inputs_iterator> inputs_const_range;
    1493             : 
    1494             :   inputs_iterator begin_inputs() {
    1495             :     return &Exprs[0] + NumOutputs;
    1496             :   }
    1497             : 
    1498             :   inputs_iterator end_inputs() {
    1499             :     return &Exprs[0] + NumOutputs + NumInputs;
    1500             :   }
    1501             : 
    1502             :   inputs_range inputs() { return inputs_range(begin_inputs(), end_inputs()); }
    1503             : 
    1504             :   const_inputs_iterator begin_inputs() const {
    1505             :     return &Exprs[0] + NumOutputs;
    1506             :   }
    1507             : 
    1508             :   const_inputs_iterator end_inputs() const {
    1509             :     return &Exprs[0] + NumOutputs + NumInputs;
    1510             :   }
    1511             : 
    1512             :   inputs_const_range inputs() const {
    1513             :     return inputs_const_range(begin_inputs(), end_inputs());
    1514             :   }
    1515             : 
    1516             :   // Output expr iterators.
    1517             : 
    1518             :   typedef ExprIterator outputs_iterator;
    1519             :   typedef ConstExprIterator const_outputs_iterator;
    1520             :   typedef llvm::iterator_range<outputs_iterator> outputs_range;
    1521             :   typedef llvm::iterator_range<const_outputs_iterator> outputs_const_range;
    1522             : 
    1523             :   outputs_iterator begin_outputs() {
    1524             :     return &Exprs[0];
    1525             :   }
    1526             :   outputs_iterator end_outputs() {
    1527             :     return &Exprs[0] + NumOutputs;
    1528             :   }
    1529             :   outputs_range outputs() {
    1530             :     return outputs_range(begin_outputs(), end_outputs());
    1531             :   }
    1532             : 
    1533             :   const_outputs_iterator begin_outputs() const {
    1534             :     return &Exprs[0];
    1535             :   }
    1536             :   const_outputs_iterator end_outputs() const {
    1537             :     return &Exprs[0] + NumOutputs;
    1538             :   }
    1539             :   outputs_const_range outputs() const {
    1540             :     return outputs_const_range(begin_outputs(), end_outputs());
    1541             :   }
    1542             : 
    1543             :   child_range children() {
    1544           0 :     return child_range(&Exprs[0], &Exprs[0] + NumOutputs + NumInputs);
    1545             :   }
    1546             : };
    1547             : 
    1548             : /// This represents a GCC inline-assembly statement extension.
    1549             : ///
    1550             : class GCCAsmStmt : public AsmStmt {
    1551             :   SourceLocation RParenLoc;
    1552             :   StringLiteral *AsmStr;
    1553             : 
    1554             :   // FIXME: If we wanted to, we could allocate all of these in one big array.
    1555             :   StringLiteral **Constraints;
    1556             :   StringLiteral **Clobbers;
    1557             :   IdentifierInfo **Names;
    1558             : 
    1559             :   friend class ASTStmtReader;
    1560             : 
    1561             : public:
    1562             :   GCCAsmStmt(const ASTContext &C, SourceLocation asmloc, bool issimple,
    1563             :              bool isvolatile, unsigned numoutputs, unsigned numinputs,
    1564             :              IdentifierInfo **names, StringLiteral **constraints, Expr **exprs,
    1565             :              StringLiteral *asmstr, unsigned numclobbers,
    1566             :              StringLiteral **clobbers, SourceLocation rparenloc);
    1567             : 
    1568             :   /// \brief Build an empty inline-assembly statement.
    1569             :   explicit GCCAsmStmt(EmptyShell Empty) : AsmStmt(GCCAsmStmtClass, Empty),
    1570             :     Constraints(nullptr), Clobbers(nullptr), Names(nullptr) { }
    1571             : 
    1572             :   SourceLocation getRParenLoc() const { return RParenLoc; }
    1573             :   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
    1574             : 
    1575             :   //===--- Asm String Analysis ---===//
    1576             : 
    1577             :   const StringLiteral *getAsmString() const { return AsmStr; }
    1578           0 :   StringLiteral *getAsmString() { return AsmStr; }
    1579             :   void setAsmString(StringLiteral *E) { AsmStr = E; }
    1580             : 
    1581             :   /// AsmStringPiece - this is part of a decomposed asm string specification
    1582             :   /// (for use with the AnalyzeAsmString function below).  An asm string is
    1583             :   /// considered to be a concatenation of these parts.
    1584             :   class AsmStringPiece {
    1585             :   public:
    1586             :     enum Kind {
    1587             :       String,  // String in .ll asm string form, "$" -> "$$" and "%%" -> "%".
    1588             :       Operand  // Operand reference, with optional modifier %c4.
    1589             :     };
    1590             :   private:
    1591             :     Kind MyKind;
    1592             :     std::string Str;
    1593             :     unsigned OperandNo;
    1594             : 
    1595             :     // Source range for operand references.
    1596             :     CharSourceRange Range;
    1597             :   public:
    1598             :     AsmStringPiece(const std::string &S) : MyKind(String), Str(S) {}
    1599             :     AsmStringPiece(unsigned OpNo, const std::string &S, SourceLocation Begin,
    1600             :                    SourceLocation End)
    1601             :       : MyKind(Operand), Str(S), OperandNo(OpNo),
    1602             :         Range(CharSourceRange::getCharRange(Begin, End)) {
    1603             :     }
    1604             : 
    1605             :     bool isString() const { return MyKind == String; }
    1606             :     bool isOperand() const { return MyKind == Operand; }
    1607             : 
    1608             :     const std::string &getString() const {
    1609             :       return Str;
    1610             :     }
    1611             : 
    1612             :     unsigned getOperandNo() const {
    1613             :       assert(isOperand());
    1614             :       return OperandNo;
    1615             :     }
    1616             : 
    1617             :     CharSourceRange getRange() const {
    1618             :       assert(isOperand() && "Range is currently used only for Operands.");
    1619             :       return Range;
    1620             :     }
    1621             : 
    1622             :     /// getModifier - Get the modifier for this operand, if present.  This
    1623             :     /// returns '\0' if there was no modifier.
    1624             :     char getModifier() const;
    1625             :   };
    1626             : 
    1627             :   /// AnalyzeAsmString - Analyze the asm string of the current asm, decomposing
    1628             :   /// it into pieces.  If the asm string is erroneous, emit errors and return
    1629             :   /// true, otherwise return false.  This handles canonicalization and
    1630             :   /// translation of strings from GCC syntax to LLVM IR syntax, and handles
    1631             :   //// flattening of named references like %[foo] to Operand AsmStringPiece's.
    1632             :   unsigned AnalyzeAsmString(SmallVectorImpl<AsmStringPiece> &Pieces,
    1633             :                             const ASTContext &C, unsigned &DiagOffs) const;
    1634             : 
    1635             :   /// Assemble final IR asm string.
    1636             :   std::string generateAsmString(const ASTContext &C) const;
    1637             : 
    1638             :   //===--- Output operands ---===//
    1639             : 
    1640             :   IdentifierInfo *getOutputIdentifier(unsigned i) const {
    1641             :     return Names[i];
    1642             :   }
    1643             : 
    1644             :   StringRef getOutputName(unsigned i) const {
    1645             :     if (IdentifierInfo *II = getOutputIdentifier(i))
    1646             :       return II->getName();
    1647             : 
    1648             :     return StringRef();
    1649             :   }
    1650             : 
    1651             :   StringRef getOutputConstraint(unsigned i) const;
    1652             : 
    1653             :   const StringLiteral *getOutputConstraintLiteral(unsigned i) const {
    1654             :     return Constraints[i];
    1655             :   }
    1656             :   StringLiteral *getOutputConstraintLiteral(unsigned i) {
    1657           0 :     return Constraints[i];
    1658             :   }
    1659             : 
    1660             :   Expr *getOutputExpr(unsigned i);
    1661             : 
    1662             :   const Expr *getOutputExpr(unsigned i) const {
    1663             :     return const_cast<GCCAsmStmt*>(this)->getOutputExpr(i);
    1664             :   }
    1665             : 
    1666             :   //===--- Input operands ---===//
    1667             : 
    1668             :   IdentifierInfo *getInputIdentifier(unsigned i) const {
    1669             :     return Names[i + NumOutputs];
    1670             :   }
    1671             : 
    1672             :   StringRef getInputName(unsigned i) const {
    1673             :     if (IdentifierInfo *II = getInputIdentifier(i))
    1674             :       return II->getName();
    1675             : 
    1676             :     return StringRef();
    1677             :   }
    1678             : 
    1679             :   StringRef getInputConstraint(unsigned i) const;
    1680             : 
    1681             :   const StringLiteral *getInputConstraintLiteral(unsigned i) const {
    1682             :     return Constraints[i + NumOutputs];
    1683             :   }
    1684             :   StringLiteral *getInputConstraintLiteral(unsigned i) {
    1685           0 :     return Constraints[i + NumOutputs];
    1686             :   }
    1687             : 
    1688             :   Expr *getInputExpr(unsigned i);
    1689             :   void setInputExpr(unsigned i, Expr *E);
    1690             : 
    1691             :   const Expr *getInputExpr(unsigned i) const {
    1692             :     return const_cast<GCCAsmStmt*>(this)->getInputExpr(i);
    1693             :   }
    1694             : 
    1695             : private:
    1696             :   void setOutputsAndInputsAndClobbers(const ASTContext &C,
    1697             :                                       IdentifierInfo **Names,
    1698             :                                       StringLiteral **Constraints,
    1699             :                                       Stmt **Exprs,
    1700             :                                       unsigned NumOutputs,
    1701             :                                       unsigned NumInputs,
    1702             :                                       StringLiteral **Clobbers,
    1703             :                                       unsigned NumClobbers);
    1704             : public:
    1705             : 
    1706             :   //===--- Other ---===//
    1707             : 
    1708             :   /// getNamedOperand - Given a symbolic operand reference like %[foo],
    1709             :   /// translate this into a numeric value needed to reference the same operand.
    1710             :   /// This returns -1 if the operand name is invalid.
    1711             :   int getNamedOperand(StringRef SymbolicName) const;
    1712             : 
    1713             :   StringRef getClobber(unsigned i) const;
    1714           0 :   StringLiteral *getClobberStringLiteral(unsigned i) { return Clobbers[i]; }
    1715             :   const StringLiteral *getClobberStringLiteral(unsigned i) const {
    1716             :     return Clobbers[i];
    1717             :   }
    1718             : 
    1719             :   SourceLocation getLocStart() const LLVM_READONLY { return AsmLoc; }
    1720             :   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
    1721             : 
    1722             :   static bool classof(const Stmt *T) {
    1723             :     return T->getStmtClass() == GCCAsmStmtClass;
    1724             :   }
    1725             : };
    1726             : 
    1727             : /// This represents a Microsoft inline-assembly statement extension.
    1728             : ///
    1729             : class MSAsmStmt : public AsmStmt {
    1730             :   SourceLocation LBraceLoc, EndLoc;
    1731             :   StringRef AsmStr;
    1732             : 
    1733             :   unsigned NumAsmToks;
    1734             : 
    1735             :   Token *AsmToks;
    1736             :   StringRef *Constraints;
    1737             :   StringRef *Clobbers;
    1738             : 
    1739             :   friend class ASTStmtReader;
    1740             : 
    1741             : public:
    1742             :   MSAsmStmt(const ASTContext &C, SourceLocation asmloc,
    1743             :             SourceLocation lbraceloc, bool issimple, bool isvolatile,
    1744             :             ArrayRef<Token> asmtoks, unsigned numoutputs, unsigned numinputs,
    1745             :             ArrayRef<StringRef> constraints,
    1746             :             ArrayRef<Expr*> exprs, StringRef asmstr,
    1747             :             ArrayRef<StringRef> clobbers, SourceLocation endloc);
    1748             : 
    1749             :   /// \brief Build an empty MS-style inline-assembly statement.
    1750             :   explicit MSAsmStmt(EmptyShell Empty) : AsmStmt(MSAsmStmtClass, Empty),
    1751             :     NumAsmToks(0), AsmToks(nullptr), Constraints(nullptr), Clobbers(nullptr) { }
    1752             : 
    1753             :   SourceLocation getLBraceLoc() const { return LBraceLoc; }
    1754             :   void setLBraceLoc(SourceLocation L) { LBraceLoc = L; }
    1755             :   SourceLocation getEndLoc() const { return EndLoc; }
    1756             :   void setEndLoc(SourceLocation L) { EndLoc = L; }
    1757             : 
    1758             :   bool hasBraces() const { return LBraceLoc.isValid(); }
    1759             : 
    1760             :   unsigned getNumAsmToks() { return NumAsmToks; }
    1761             :   Token *getAsmToks() { return AsmToks; }
    1762             : 
    1763             :   //===--- Asm String Analysis ---===//
    1764             :   StringRef getAsmString() const { return AsmStr; }
    1765             : 
    1766             :   /// Assemble final IR asm string.
    1767             :   std::string generateAsmString(const ASTContext &C) const;
    1768             : 
    1769             :   //===--- Output operands ---===//
    1770             : 
    1771             :   StringRef getOutputConstraint(unsigned i) const {
    1772             :     assert(i < NumOutputs);
    1773             :     return Constraints[i];
    1774             :   }
    1775             : 
    1776             :   Expr *getOutputExpr(unsigned i);
    1777             : 
    1778             :   const Expr *getOutputExpr(unsigned i) const {
    1779             :     return const_cast<MSAsmStmt*>(this)->getOutputExpr(i);
    1780             :   }
    1781             : 
    1782             :   //===--- Input operands ---===//
    1783             : 
    1784             :   StringRef getInputConstraint(unsigned i) const {
    1785             :     assert(i < NumInputs);
    1786             :     return Constraints[i + NumOutputs];
    1787             :   }
    1788             : 
    1789             :   Expr *getInputExpr(unsigned i);
    1790             :   void setInputExpr(unsigned i, Expr *E);
    1791             : 
    1792             :   const Expr *getInputExpr(unsigned i) const {
    1793             :     return const_cast<MSAsmStmt*>(this)->getInputExpr(i);
    1794             :   }
    1795             : 
    1796             :   //===--- Other ---===//
    1797             : 
    1798             :   ArrayRef<StringRef> getAllConstraints() const {
    1799             :     return llvm::makeArrayRef(Constraints, NumInputs + NumOutputs);
    1800             :   }
    1801             :   ArrayRef<StringRef> getClobbers() const {
    1802             :     return llvm::makeArrayRef(Clobbers, NumClobbers);
    1803             :   }
    1804             :   ArrayRef<Expr*> getAllExprs() const {
    1805             :     return llvm::makeArrayRef(reinterpret_cast<Expr**>(Exprs),
    1806             :                               NumInputs + NumOutputs);
    1807             :   }
    1808             : 
    1809             :   StringRef getClobber(unsigned i) const { return getClobbers()[i]; }
    1810             : 
    1811             : private:
    1812             :   void initialize(const ASTContext &C, StringRef AsmString,
    1813             :                   ArrayRef<Token> AsmToks, ArrayRef<StringRef> Constraints,
    1814             :                   ArrayRef<Expr*> Exprs, ArrayRef<StringRef> Clobbers);
    1815             : public:
    1816             : 
    1817             :   SourceLocation getLocStart() const LLVM_READONLY { return AsmLoc; }
    1818             :   SourceLocation getLocEnd() const LLVM_READONLY { return EndLoc; }
    1819             : 
    1820             :   static bool classof(const Stmt *T) {
    1821             :     return T->getStmtClass() == MSAsmStmtClass;
    1822             :   }
    1823             : 
    1824             :   child_range children() {
    1825           0 :     return child_range(&Exprs[0], &Exprs[NumInputs + NumOutputs]);
    1826             :   }
    1827             : };
    1828             : 
    1829             : class SEHExceptStmt : public Stmt {
    1830             :   SourceLocation  Loc;
    1831             :   Stmt           *Children[2];
    1832             : 
    1833             :   enum { FILTER_EXPR, BLOCK };
    1834             : 
    1835             :   SEHExceptStmt(SourceLocation Loc,
    1836             :                 Expr *FilterExpr,
    1837             :                 Stmt *Block);
    1838             : 
    1839             :   friend class ASTReader;
    1840             :   friend class ASTStmtReader;
    1841             :   explicit SEHExceptStmt(EmptyShell E) : Stmt(SEHExceptStmtClass, E) { }
    1842             : 
    1843             : public:
    1844             :   static SEHExceptStmt* Create(const ASTContext &C,
    1845             :                                SourceLocation ExceptLoc,
    1846             :                                Expr *FilterExpr,
    1847             :                                Stmt *Block);
    1848             : 
    1849             :   SourceLocation getLocStart() const LLVM_READONLY { return getExceptLoc(); }
    1850             :   SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); }
    1851             : 
    1852             :   SourceLocation getExceptLoc() const { return Loc; }
    1853             :   SourceLocation getEndLoc() const { return getBlock()->getLocEnd(); }
    1854             : 
    1855             :   Expr *getFilterExpr() const {
    1856             :     return reinterpret_cast<Expr*>(Children[FILTER_EXPR]);
    1857             :   }
    1858             : 
    1859             :   CompoundStmt *getBlock() const {
    1860             :     return cast<CompoundStmt>(Children[BLOCK]);
    1861             :   }
    1862             : 
    1863             :   child_range children() {
    1864           0 :     return child_range(Children,Children+2);
    1865             :   }
    1866             : 
    1867             :   static bool classof(const Stmt *T) {
    1868             :     return T->getStmtClass() == SEHExceptStmtClass;
    1869             :   }
    1870             : 
    1871             : };
    1872             : 
    1873             : class SEHFinallyStmt : public Stmt {
    1874             :   SourceLocation  Loc;
    1875             :   Stmt           *Block;
    1876             : 
    1877             :   SEHFinallyStmt(SourceLocation Loc,
    1878             :                  Stmt *Block);
    1879             : 
    1880             :   friend class ASTReader;
    1881             :   friend class ASTStmtReader;
    1882             :   explicit SEHFinallyStmt(EmptyShell E) : Stmt(SEHFinallyStmtClass, E) { }
    1883             : 
    1884             : public:
    1885             :   static SEHFinallyStmt* Create(const ASTContext &C,
    1886             :                                 SourceLocation FinallyLoc,
    1887             :                                 Stmt *Block);
    1888             : 
    1889             :   SourceLocation getLocStart() const LLVM_READONLY { return getFinallyLoc(); }
    1890             :   SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); }
    1891             : 
    1892             :   SourceLocation getFinallyLoc() const { return Loc; }
    1893             :   SourceLocation getEndLoc() const { return Block->getLocEnd(); }
    1894             : 
    1895             :   CompoundStmt *getBlock() const { return cast<CompoundStmt>(Block); }
    1896             : 
    1897             :   child_range children() {
    1898           0 :     return child_range(&Block,&Block+1);
    1899             :   }
    1900             : 
    1901             :   static bool classof(const Stmt *T) {
    1902             :     return T->getStmtClass() == SEHFinallyStmtClass;
    1903             :   }
    1904             : 
    1905             : };
    1906             : 
    1907             : class SEHTryStmt : public Stmt {
    1908             :   bool            IsCXXTry;
    1909             :   SourceLocation  TryLoc;
    1910             :   Stmt           *Children[2];
    1911             : 
    1912             :   enum { TRY = 0, HANDLER = 1 };
    1913             : 
    1914             :   SEHTryStmt(bool isCXXTry, // true if 'try' otherwise '__try'
    1915             :              SourceLocation TryLoc,
    1916             :              Stmt *TryBlock,
    1917             :              Stmt *Handler);
    1918             : 
    1919             :   friend class ASTReader;
    1920             :   friend class ASTStmtReader;
    1921             :   explicit SEHTryStmt(EmptyShell E) : Stmt(SEHTryStmtClass, E) { }
    1922             : 
    1923             : public:
    1924             :   static SEHTryStmt* Create(const ASTContext &C, bool isCXXTry,
    1925             :                             SourceLocation TryLoc, Stmt *TryBlock,
    1926             :                             Stmt *Handler);
    1927             : 
    1928             :   SourceLocation getLocStart() const LLVM_READONLY { return getTryLoc(); }
    1929             :   SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); }
    1930             : 
    1931             :   SourceLocation getTryLoc() const { return TryLoc; }
    1932             :   SourceLocation getEndLoc() const { return Children[HANDLER]->getLocEnd(); }
    1933             : 
    1934             :   bool getIsCXXTry() const { return IsCXXTry; }
    1935             : 
    1936             :   CompoundStmt* getTryBlock() const {
    1937             :     return cast<CompoundStmt>(Children[TRY]);
    1938             :   }
    1939             : 
    1940             :   Stmt *getHandler() const { return Children[HANDLER]; }
    1941             : 
    1942             :   /// Returns 0 if not defined
    1943             :   SEHExceptStmt  *getExceptHandler() const;
    1944             :   SEHFinallyStmt *getFinallyHandler() const;
    1945             : 
    1946             :   child_range children() {
    1947           0 :     return child_range(Children,Children+2);
    1948             :   }
    1949             : 
    1950             :   static bool classof(const Stmt *T) {
    1951             :     return T->getStmtClass() == SEHTryStmtClass;
    1952             :   }
    1953             : };
    1954             : 
    1955             : /// Represents a __leave statement.
    1956             : ///
    1957             : class SEHLeaveStmt : public Stmt {
    1958             :   SourceLocation LeaveLoc;
    1959             : public:
    1960             :   explicit SEHLeaveStmt(SourceLocation LL)
    1961             :       : Stmt(SEHLeaveStmtClass), LeaveLoc(LL) {}
    1962             : 
    1963             :   /// \brief Build an empty __leave statement.
    1964             :   explicit SEHLeaveStmt(EmptyShell Empty) : Stmt(SEHLeaveStmtClass, Empty) { }
    1965             : 
    1966             :   SourceLocation getLeaveLoc() const { return LeaveLoc; }
    1967             :   void setLeaveLoc(SourceLocation L) { LeaveLoc = L; }
    1968             : 
    1969             :   SourceLocation getLocStart() const LLVM_READONLY { return LeaveLoc; }
    1970             :   SourceLocation getLocEnd() const LLVM_READONLY { return LeaveLoc; }
    1971             : 
    1972             :   static bool classof(const Stmt *T) {
    1973             :     return T->getStmtClass() == SEHLeaveStmtClass;
    1974             :   }
    1975             : 
    1976             :   // Iterators
    1977           0 :   child_range children() { return child_range(); }
    1978             : };
    1979             : 
    1980             : /// \brief This captures a statement into a function. For example, the following
    1981             : /// pragma annotated compound statement can be represented as a CapturedStmt,
    1982             : /// and this compound statement is the body of an anonymous outlined function.
    1983             : /// @code
    1984             : /// #pragma omp parallel
    1985             : /// {
    1986             : ///   compute();
    1987             : /// }
    1988             : /// @endcode
    1989             : class CapturedStmt : public Stmt {
    1990             : public:
    1991             :   /// \brief The different capture forms: by 'this', by reference, capture for
    1992             :   /// variable-length array type etc.
    1993             :   enum VariableCaptureKind {
    1994             :     VCK_This,
    1995             :     VCK_ByRef,
    1996             :     VCK_VLAType,
    1997             :   };
    1998             : 
    1999             :   /// \brief Describes the capture of either a variable, or 'this', or
    2000             :   /// variable-length array type.
    2001             :   class Capture {
    2002             :     llvm::PointerIntPair<VarDecl *, 2, VariableCaptureKind> VarAndKind;
    2003             :     SourceLocation Loc;
    2004             : 
    2005             :   public:
    2006             :     /// \brief Create a new capture.
    2007             :     ///
    2008             :     /// \param Loc The source location associated with this capture.
    2009             :     ///
    2010             :     /// \param Kind The kind of capture (this, ByRef, ...).
    2011             :     ///
    2012             :     /// \param Var The variable being captured, or null if capturing this.
    2013             :     ///
    2014             :     Capture(SourceLocation Loc, VariableCaptureKind Kind,
    2015             :             VarDecl *Var = nullptr)
    2016             :       : VarAndKind(Var, Kind), Loc(Loc) {
    2017             :       switch (Kind) {
    2018             :       case VCK_This:
    2019             :         assert(!Var && "'this' capture cannot have a variable!");
    2020             :         break;
    2021             :       case VCK_ByRef:
    2022             :         assert(Var && "capturing by reference must have a variable!");
    2023             :         break;
    2024             :       case VCK_VLAType:
    2025             :         assert(!Var &&
    2026             :                "Variable-length array type capture cannot have a variable!");
    2027             :         break;
    2028             :       }
    2029             :     }
    2030             : 
    2031             :     /// \brief Determine the kind of capture.
    2032             :     VariableCaptureKind getCaptureKind() const { return VarAndKind.getInt(); }
    2033             : 
    2034             :     /// \brief Retrieve the source location at which the variable or 'this' was
    2035             :     /// first used.
    2036             :     SourceLocation getLocation() const { return Loc; }
    2037             : 
    2038             :     /// \brief Determine whether this capture handles the C++ 'this' pointer.
    2039             :     bool capturesThis() const { return getCaptureKind() == VCK_This; }
    2040             : 
    2041             :     /// \brief Determine whether this capture handles a variable.
    2042             :     bool capturesVariable() const { return getCaptureKind() == VCK_ByRef; }
    2043             : 
    2044             :     /// \brief Determine whether this capture handles a variable-length array
    2045             :     /// type.
    2046             :     bool capturesVariableArrayType() const {
    2047             :       return getCaptureKind() == VCK_VLAType;
    2048             :     }
    2049             : 
    2050             :     /// \brief Retrieve the declaration of the variable being captured.
    2051             :     ///
    2052             :     /// This operation is only valid if this capture captures a variable.
    2053             :     VarDecl *getCapturedVar() const {
    2054             :       assert(capturesVariable() &&
    2055             :              "No variable available for 'this' or VAT capture");
    2056             :       return VarAndKind.getPointer();
    2057             :     }
    2058             :     friend class ASTStmtReader;
    2059             :   };
    2060             : 
    2061             : private:
    2062             :   /// \brief The number of variable captured, including 'this'.
    2063             :   unsigned NumCaptures;
    2064             : 
    2065             :   /// \brief The pointer part is the implicit the outlined function and the 
    2066             :   /// int part is the captured region kind, 'CR_Default' etc.
    2067             :   llvm::PointerIntPair<CapturedDecl *, 1, CapturedRegionKind> CapDeclAndKind;
    2068             : 
    2069             :   /// \brief The record for captured variables, a RecordDecl or CXXRecordDecl.
    2070             :   RecordDecl *TheRecordDecl;
    2071             : 
    2072             :   /// \brief Construct a captured statement.
    2073             :   CapturedStmt(Stmt *S, CapturedRegionKind Kind, ArrayRef<Capture> Captures,
    2074             :                ArrayRef<Expr *> CaptureInits, CapturedDecl *CD, RecordDecl *RD);
    2075             : 
    2076             :   /// \brief Construct an empty captured statement.
    2077             :   CapturedStmt(EmptyShell Empty, unsigned NumCaptures);
    2078             : 
    2079             :   Stmt **getStoredStmts() const {
    2080             :     return reinterpret_cast<Stmt **>(const_cast<CapturedStmt *>(this) + 1);
    2081             :   }
    2082             : 
    2083             :   Capture *getStoredCaptures() const;
    2084             : 
    2085             :   void setCapturedStmt(Stmt *S) { getStoredStmts()[NumCaptures] = S; }
    2086             : 
    2087             : public:
    2088             :   static CapturedStmt *Create(const ASTContext &Context, Stmt *S,
    2089             :                               CapturedRegionKind Kind,
    2090             :                               ArrayRef<Capture> Captures,
    2091             :                               ArrayRef<Expr *> CaptureInits,
    2092             :                               CapturedDecl *CD, RecordDecl *RD);
    2093             : 
    2094             :   static CapturedStmt *CreateDeserialized(const ASTContext &Context,
    2095             :                                           unsigned NumCaptures);
    2096             : 
    2097             :   /// \brief Retrieve the statement being captured.
    2098             :   Stmt *getCapturedStmt() { return getStoredStmts()[NumCaptures]; }
    2099             :   const Stmt *getCapturedStmt() const {
    2100             :     return const_cast<CapturedStmt *>(this)->getCapturedStmt();
    2101             :   }
    2102             : 
    2103             :   /// \brief Retrieve the outlined function declaration.
    2104           0 :   CapturedDecl *getCapturedDecl() { return CapDeclAndKind.getPointer(); }
    2105             :   const CapturedDecl *getCapturedDecl() const {
    2106             :     return const_cast<CapturedStmt *>(this)->getCapturedDecl();
    2107             :   }
    2108             : 
    2109             :   /// \brief Set the outlined function declaration.
    2110             :   void setCapturedDecl(CapturedDecl *D) {
    2111             :     assert(D && "null CapturedDecl");
    2112             :     CapDeclAndKind.setPointer(D);
    2113             :   }
    2114             : 
    2115             :   /// \brief Retrieve the captured region kind.
    2116             :   CapturedRegionKind getCapturedRegionKind() const {
    2117             :     return CapDeclAndKind.getInt();
    2118             :   }
    2119             : 
    2120             :   /// \brief Set the captured region kind.
    2121             :   void setCapturedRegionKind(CapturedRegionKind Kind) {
    2122             :     CapDeclAndKind.setInt(Kind);
    2123             :   }
    2124             : 
    2125             :   /// \brief Retrieve the record declaration for captured variables.
    2126             :   const RecordDecl *getCapturedRecordDecl() const { return TheRecordDecl; }
    2127             : 
    2128             :   /// \brief Set the record declaration for captured variables.
    2129             :   void setCapturedRecordDecl(RecordDecl *D) {
    2130             :     assert(D && "null RecordDecl");
    2131             :     TheRecordDecl = D;
    2132             :   }
    2133             : 
    2134             :   /// \brief True if this variable has been captured.
    2135             :   bool capturesVariable(const VarDecl *Var) const;
    2136             : 
    2137             :   /// \brief An iterator that walks over the captures.
    2138             :   typedef Capture *capture_iterator;
    2139             :   typedef const Capture *const_capture_iterator;
    2140             :   typedef llvm::iterator_range<capture_iterator> capture_range;
    2141             :   typedef llvm::iterator_range<const_capture_iterator> capture_const_range;
    2142             : 
    2143             :   capture_range captures() {
    2144             :     return capture_range(capture_begin(), capture_end());
    2145             :   }
    2146             :   capture_const_range captures() const {
    2147             :     return capture_const_range(capture_begin(), capture_end());
    2148             :   }
    2149             : 
    2150             :   /// \brief Retrieve an iterator pointing to the first capture.
    2151             :   capture_iterator capture_begin() { return getStoredCaptures(); }
    2152             :   const_capture_iterator capture_begin() const { return getStoredCaptures(); }
    2153             : 
    2154             :   /// \brief Retrieve an iterator pointing past the end of the sequence of
    2155             :   /// captures.
    2156             :   capture_iterator capture_end() const {
    2157             :     return getStoredCaptures() + NumCaptures;
    2158             :   }
    2159             : 
    2160             :   /// \brief Retrieve the number of captures, including 'this'.
    2161             :   unsigned capture_size() const { return NumCaptures; }
    2162             : 
    2163             :   /// \brief Iterator that walks over the capture initialization arguments.
    2164             :   typedef Expr **capture_init_iterator;
    2165             :   typedef llvm::iterator_range<capture_init_iterator> capture_init_range;
    2166             : 
    2167             :   capture_init_range capture_inits() const {
    2168             :     return capture_init_range(capture_init_begin(), capture_init_end());
    2169             :   }
    2170             : 
    2171             :   /// \brief Retrieve the first initialization argument.
    2172             :   capture_init_iterator capture_init_begin() const {
    2173             :     return reinterpret_cast<Expr **>(getStoredStmts());
    2174             :   }
    2175             : 
    2176             :   /// \brief Retrieve the iterator pointing one past the last initialization
    2177             :   /// argument.
    2178             :   capture_init_iterator capture_init_end() const {
    2179             :     return capture_init_begin() + NumCaptures;
    2180             :   }
    2181             : 
    2182             :   SourceLocation getLocStart() const LLVM_READONLY {
    2183             :     return getCapturedStmt()->getLocStart();
    2184             :   }
    2185             :   SourceLocation getLocEnd() const LLVM_READONLY {
    2186             :     return getCapturedStmt()->getLocEnd();
    2187             :   }
    2188             :   SourceRange getSourceRange() const LLVM_READONLY {
    2189             :     return getCapturedStmt()->getSourceRange();
    2190             :   }
    2191             : 
    2192             :   static bool classof(const Stmt *T) {
    2193             :     return T->getStmtClass() == CapturedStmtClass;
    2194             :   }
    2195             : 
    2196             :   child_range children();
    2197             : 
    2198             :   friend class ASTStmtReader;
    2199             : };
    2200             : 
    2201             : }  // end namespace clang
    2202             : 
    2203             : #endif

Generated by: LCOV version 1.11