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