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