]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/include/clang/AST/StmtCXX.h
Merge ACPICA 20101209.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / include / clang / AST / StmtCXX.h
1 //===--- StmtCXX.h - Classes for representing C++ 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 C++ statement AST node classes.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_AST_STMTCXX_H
15 #define LLVM_CLANG_AST_STMTCXX_H
16
17 #include "clang/AST/Stmt.h"
18
19 namespace clang {
20
21 class VarDecl;
22
23 /// CXXCatchStmt - This represents a C++ catch block.
24 ///
25 class CXXCatchStmt : public Stmt {
26   SourceLocation CatchLoc;
27   /// The exception-declaration of the type.
28   VarDecl *ExceptionDecl;
29   /// The handler block.
30   Stmt *HandlerBlock;
31
32 public:
33   CXXCatchStmt(SourceLocation catchLoc, VarDecl *exDecl, Stmt *handlerBlock)
34   : Stmt(CXXCatchStmtClass), CatchLoc(catchLoc), ExceptionDecl(exDecl),
35     HandlerBlock(handlerBlock) {}
36
37   CXXCatchStmt(EmptyShell Empty)
38   : Stmt(CXXCatchStmtClass), ExceptionDecl(0), HandlerBlock(0) {}
39
40   virtual SourceRange getSourceRange() const {
41     return SourceRange(CatchLoc, HandlerBlock->getLocEnd());
42   }
43
44   SourceLocation getCatchLoc() const { return CatchLoc; }
45   VarDecl *getExceptionDecl() const { return ExceptionDecl; }
46   QualType getCaughtType() const;
47   Stmt *getHandlerBlock() const { return HandlerBlock; }
48
49   static bool classof(const Stmt *T) {
50     return T->getStmtClass() == CXXCatchStmtClass;
51   }
52   static bool classof(const CXXCatchStmt *) { return true; }
53
54   virtual child_iterator child_begin();
55   virtual child_iterator child_end();
56
57   friend class ASTStmtReader;
58 };
59
60 /// CXXTryStmt - A C++ try block, including all handlers.
61 ///
62 class CXXTryStmt : public Stmt {
63   SourceLocation TryLoc;
64   unsigned NumHandlers;
65
66   CXXTryStmt(SourceLocation tryLoc, Stmt *tryBlock, Stmt **handlers,
67              unsigned numHandlers);
68
69   CXXTryStmt(EmptyShell Empty, unsigned numHandlers)
70     : Stmt(CXXTryStmtClass), NumHandlers(numHandlers) { }
71
72   Stmt const * const *getStmts() const {
73     return reinterpret_cast<Stmt const * const*>(this + 1);
74   }
75   Stmt **getStmts() {
76     return reinterpret_cast<Stmt **>(this + 1);
77   }
78
79 public:
80   static CXXTryStmt *Create(ASTContext &C, SourceLocation tryLoc,
81                             Stmt *tryBlock, Stmt **handlers,
82                             unsigned numHandlers);
83
84   static CXXTryStmt *Create(ASTContext &C, EmptyShell Empty,
85                             unsigned numHandlers);
86
87   virtual SourceRange getSourceRange() const {
88     return SourceRange(getTryLoc(), getEndLoc());
89   }
90
91   SourceLocation getTryLoc() const { return TryLoc; }
92   SourceLocation getEndLoc() const {
93     return getStmts()[NumHandlers]->getLocEnd();
94   }
95
96   CompoundStmt *getTryBlock() {
97     return llvm::cast<CompoundStmt>(getStmts()[0]);
98   }
99   const CompoundStmt *getTryBlock() const {
100     return llvm::cast<CompoundStmt>(getStmts()[0]);
101   }
102
103   unsigned getNumHandlers() const { return NumHandlers; }
104   CXXCatchStmt *getHandler(unsigned i) {
105     return llvm::cast<CXXCatchStmt>(getStmts()[i + 1]);
106   }
107   const CXXCatchStmt *getHandler(unsigned i) const {
108     return llvm::cast<CXXCatchStmt>(getStmts()[i + 1]);
109   }
110
111   static bool classof(const Stmt *T) {
112     return T->getStmtClass() == CXXTryStmtClass;
113   }
114   static bool classof(const CXXTryStmt *) { return true; }
115
116   virtual child_iterator child_begin();
117   virtual child_iterator child_end();
118
119   friend class ASTStmtReader;
120 };
121
122
123 }  // end namespace clang
124
125 #endif