Stmt.h revision 4ce854736dd196e2304f554ebeac8b43c89cf9e2
141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//===--- Stmt.h - Classes for representing statements -----------*- C++ -*-===//
241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//
341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//                     The LLVM Compiler Infrastructure
441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//
541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// This file was developed by Chris Lattner and is distributed under
641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// the University of Illinois Open Source License. See LICENSE.TXT for details.
741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//
841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//===----------------------------------------------------------------------===//
941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//
1041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//  This file defines the Stmt interface and subclasses.
1141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//
1241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org//===----------------------------------------------------------------------===//
1341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#ifndef LLVM_CLANG_AST_STMT_H
1541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define LLVM_CLANG_AST_STMT_H
1641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "clang/Basic/SourceLocation.h"
1841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "llvm/ADT/SmallVector.h"
1941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include <iosfwd>
2041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgnamespace clang {
2241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  class Expr;
2341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  class Decl;
2441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  class IdentifierInfo;
2541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  class SwitchStmt;
2641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// Stmt - This represents one statement.
2841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
2941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass Stmt {
3041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
3141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  enum StmtClass {
3241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define STMT(N, CLASS, PARENT) CLASS##Class = N,
3341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define FIRST_STMT(N) firstStmtConstant = N,
3441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define LAST_STMT(N) lastStmtConstant = N,
3541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define FIRST_EXPR(N) firstExprConstant = N,
3641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define LAST_EXPR(N) lastExprConstant = N
3741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "clang/AST/StmtNodes.def"
3841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
3941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgprivate:
4041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const StmtClass sClass;
4141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
4241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt(StmtClass SC) : sClass(SC) {
4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    if (Stmt::CollectingStats()) Stmt::addStmtClass(SC);
4441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  virtual ~Stmt() {}
4641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  StmtClass getStmtClass() const { return sClass; }
4841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const char *getStmtClassName() const;
4941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // global temp stats (until we have a per-module visitor)
5141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static void addStmtClass(const StmtClass s);
5241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool CollectingStats(bool enable=false);
5341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static void PrintStats();
5441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  /// dump - This does a local dump of the specified AST fragment.  It dumps the
5641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  /// specified node and a few nodes underneath it, but not the whole subtree.
5741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  /// This is useful in a debugger.
5841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  void dump() const;
5941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  /// dumpAll - This does a dump of the specified AST fragment and all subtrees.
6141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  void dumpAll() const;
6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  /// dumpPretty/printPretty - These two methods do a "pretty print" of the AST
6441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  /// back to its original source language syntax.
6541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  void dumpPretty() const;
6641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  void printPretty(std::ostream &OS) const;
6741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // Implement isa<T> support.
6941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *) { return true; }
7041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
7141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
7241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// DeclStmt - Adaptor class for mixing declarations with statements and
7341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// expressions. For example, CompoundStmt mixes statements, expressions
7441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// and declarations (variables, types). Another example is ForStmt, where
7541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// the first statement can be an expression or a declaration.
7641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
7741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass DeclStmt : public Stmt {
7841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Decl *TheDecl;
7941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
8041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  DeclStmt(Decl *D) : Stmt(DeclStmtClass), TheDecl(D) {}
8141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
8241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Decl *getDecl() const { return TheDecl; }
8341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Decl *getDecl() { return TheDecl; }
8441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
8541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
8641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == DeclStmtClass;
8741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
8841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const DeclStmt *) { return true; }
8941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
9041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
9141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// NullStmt - This is the null statement ";": C99 6.8.3p3.
9241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
9341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass NullStmt : public Stmt {
9441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SourceLocation SemiLoc;
9541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
9641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  NullStmt(SourceLocation L) : Stmt(NullStmtClass), SemiLoc(L) {}
9741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SourceLocation getSemiLoc() const { return SemiLoc; }
9941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
10041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
10141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == NullStmtClass;
10241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
10341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const NullStmt *) { return true; }
10441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
10541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
10641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// CompoundStmt - This represents a group of statements like { stmt stmt }.
10741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
10841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass CompoundStmt : public Stmt {
10941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  llvm::SmallVector<Stmt*, 16> Body;
11041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
11141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  CompoundStmt(Stmt **StmtStart, unsigned NumStmts)
11241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    : Stmt(CompoundStmtClass), Body(StmtStart, StmtStart+NumStmts) {}
11341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
11441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  bool body_empty() const { return Body.empty(); }
11541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
11641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  typedef llvm::SmallVector<Stmt*, 16>::iterator body_iterator;
11741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  body_iterator body_begin() { return Body.begin(); }
11841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  body_iterator body_end() { return Body.end(); }
11941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *body_back() { return Body.back(); }
12041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
12141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  typedef llvm::SmallVector<Stmt*, 16>::const_iterator const_body_iterator;
12241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const_body_iterator body_begin() const { return Body.begin(); }
12341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const_body_iterator body_end() const { return Body.end(); }
12441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Stmt *body_back() const { return Body.back(); }
12541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
12641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  typedef llvm::SmallVector<Stmt*, 16>::reverse_iterator reverse_body_iterator;
12741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  reverse_body_iterator body_rbegin() { return Body.rbegin(); }
12841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  reverse_body_iterator body_rend() { return Body.rend(); }
12941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
13041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  typedef llvm::SmallVector<Stmt*, 16>::const_reverse_iterator
13141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    const_reverse_body_iterator;
13241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const_reverse_body_iterator body_rbegin() const { return Body.rbegin(); }
13341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const_reverse_body_iterator body_rend() const { return Body.rend(); }
13441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
13541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  void push_back(Stmt *S) { Body.push_back(S); }
13641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
13741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
13841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == CompoundStmtClass;
13941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
14041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const CompoundStmt *) { return true; }
14141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
14241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
14341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// SwitchCase is the base class for CaseStmt and DefaultStmt,
14441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass SwitchCase : public Stmt {
14541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // A pointer to the following CaseStmt or DefaultStmt class,
14641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // used by SwitchStmt.
14741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SwitchCase *NextSwitchCase;
14841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgprotected:
14941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SwitchCase(StmtClass SC) : Stmt(SC), NextSwitchCase(0) {}
15041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
15141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
15241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const SwitchCase *getNextSwitchCase() const { return NextSwitchCase; }
15341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
15441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SwitchCase *getNextSwitchCase() { return NextSwitchCase; }
15541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
15641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  void setNextSwitchCase(SwitchCase *SC) { NextSwitchCase = SC; }
15741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
15841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
15941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == CaseStmtClass ||
16041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    T->getStmtClass() == DefaultStmtClass;
16141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
16241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const SwitchCase *) { return true; }
16341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
16441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
16541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass CaseStmt : public SwitchCase {
16641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *LHSVal;
16741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *RHSVal;  // Non-null for GNU "case 1 ... 4" extension
16841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *SubStmt;
16941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
17041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  CaseStmt(Expr *lhs, Expr *rhs, Stmt *substmt)
17141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    : SwitchCase(CaseStmtClass), LHSVal(lhs), RHSVal(rhs), SubStmt(substmt) {}
17241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
17341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *getLHS() { return LHSVal; }
17441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *getRHS() { return RHSVal; }
17541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *getSubStmt() { return SubStmt; }
17641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
17741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
17841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == CaseStmtClass;
17941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
18041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const CaseStmt *) { return true; }
18141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
18241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
18341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass DefaultStmt : public SwitchCase {
18441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SourceLocation DefaultLoc;
18541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *SubStmt;
18641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
18741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  DefaultStmt(SourceLocation DL, Stmt *substmt) : SwitchCase(DefaultStmtClass),
18841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    DefaultLoc(DL), SubStmt(substmt) {}
18941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
19041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SourceLocation getDefaultLoc() const { return DefaultLoc; }
19141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *getSubStmt() { return SubStmt; }
19241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
19341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
19441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == DefaultStmtClass;
19541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
19641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const DefaultStmt *) { return true; }
19741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
19841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
19941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass LabelStmt : public Stmt {
20041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SourceLocation IdentLoc;
20141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  IdentifierInfo *Label;
20241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *SubStmt;
20341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
20441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  LabelStmt(SourceLocation IL, IdentifierInfo *label, Stmt *substmt)
20541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    : Stmt(LabelStmtClass), IdentLoc(IL), Label(label), SubStmt(substmt) {}
20641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
20741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SourceLocation getIdentLoc() const { return IdentLoc; }
20841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  IdentifierInfo *getID() const { return Label; }
20941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const char *getName() const;
21041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *getSubStmt() { return SubStmt; }
21141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Stmt *getSubStmt() const { return SubStmt; }
21241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
21341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  void setIdentLoc(SourceLocation L) { IdentLoc = L; }
21441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  void setSubStmt(Stmt *SS) { SubStmt = SS; }
21541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
21641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
21741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == LabelStmtClass;
21841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
21941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const LabelStmt *) { return true; }
22041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
22141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
22241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
22341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// IfStmt - This represents an if/then/else.
22441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
22541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass IfStmt : public Stmt {
22641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *Cond;
22741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *Then, *Else;
22841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
22941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  IfStmt(Expr *cond, Stmt *then, Stmt *elsev = 0)
23041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    : Stmt(IfStmtClass), Cond(cond), Then(then), Else(elsev) {}
23141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
23241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Expr *getCond() const { return Cond; }
23341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Stmt *getThen() const { return Then; }
23441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Stmt *getElse() const { return Else; }
23541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
23641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *getCond() { return Cond; }
23741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *getThen() { return Then; }
23841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *getElse() { return Else; }
23941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
24041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
24141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == IfStmtClass;
24241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
24341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const IfStmt *) { return true; }
24441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
24541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
24641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// SwitchStmt - This represents a 'switch' stmt.
24741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
24841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass SwitchStmt : public Stmt {
24941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *Cond;
25041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *Body;
25141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
25241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  // This points to a linked list of case and default statements.
25341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SwitchCase *FirstCase;
25441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
25541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SwitchStmt(Expr *cond)
25641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    : Stmt(SwitchStmtClass), Cond(cond), Body(0), FirstCase(0) {}
25741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
25841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Expr *getCond() const { return Cond; }
25941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Stmt *getBody() const { return Body; }
26041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const SwitchCase *getSwitchCaseList() const { return FirstCase; }
26141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
26241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *getCond() { return Cond; }
26341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *getBody() { return Body; }
26441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  SwitchCase *getSwitchCaseList() { return FirstCase; }
26541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
26641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  void setBody(Stmt *S) { Body = S; }
26741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
26841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  void addSwitchCase(SwitchCase *SC) {
26941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    if (FirstCase)
27041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      SC->setNextSwitchCase(FirstCase);
27141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
27241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    FirstCase = SC;
27341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
27441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
27541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
27641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == SwitchStmtClass;
27741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
27841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const SwitchStmt *) { return true; }
27941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
28041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
28141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
28241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// WhileStmt - This represents a 'while' stmt.
28341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
28441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass WhileStmt : public Stmt {
28541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *Cond;
28641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *Body;
28741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
28841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  WhileStmt(Expr *cond, Stmt *body)
28941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    : Stmt(WhileStmtClass), Cond(cond), Body(body) {}
29041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
29141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *getCond() { return Cond; }
29241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Expr *getCond() const { return Cond; }
29341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *getBody() { return Body; }
29441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Stmt *getBody() const { return Body; }
29541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
29641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
29741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == WhileStmtClass;
29841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
29941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const WhileStmt *) { return true; }
30041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
30141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
30241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// DoStmt - This represents a 'do/while' stmt.
30341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
30441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass DoStmt : public Stmt {
30541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *Body;
30641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *Cond;
30741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
30841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  DoStmt(Stmt *body, Expr *cond)
30941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    : Stmt(DoStmtClass), Body(body), Cond(cond) {}
31041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
31141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *getBody() { return Body; }
31241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Stmt *getBody() const { return Body; }
31341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *getCond() { return Cond; }
31441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Expr *getCond() const { return Cond; }
31541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
31641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
31741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == DoStmtClass;
31841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
31941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const DoStmt *) { return true; }
32041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
32141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
32241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
32341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// ForStmt - This represents a 'for (init;cond;inc)' stmt.  Note that any of
32441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// the init/cond/inc parts of the ForStmt will be null if they were not
32541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// specified in the source.
32641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
32741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass ForStmt : public Stmt {
32841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *Init;  // Expression or declstmt.
32941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *Cond, *Inc;
33041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *Body;
33141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
33241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  ForStmt(Stmt *init, Expr *cond, Expr *inc, Stmt *body)
33341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    : Stmt(ForStmtClass), Init(init), Cond(cond), Inc(inc), Body(body) {}
33441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
33541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *getInit() { return Init; }
33641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *getCond() { return Cond; }
33741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *getInc()  { return Inc; }
33841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Stmt *getBody() { return Body; }
33941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
34041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Stmt *getInit() const { return Init; }
34141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Expr *getCond() const { return Cond; }
34241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Expr *getInc()  const { return Inc; }
34341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Stmt *getBody() const { return Body; }
34441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
34541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
34641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == ForStmtClass;
34741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
34841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const ForStmt *) { return true; }
34941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
35041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
35141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// GotoStmt - This represents a direct goto.
35241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
35341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass GotoStmt : public Stmt {
35441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  LabelStmt *Label;
35541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
35641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  GotoStmt(LabelStmt *label) : Stmt(GotoStmtClass), Label(label) {}
35741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
35841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  LabelStmt *getLabel() const { return Label; }
35941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
36041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
36141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == GotoStmtClass;
36241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
36341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const GotoStmt *) { return true; }
36441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
36541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
36641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// IndirectGotoStmt - This represents an indirect goto.
36741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
36841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass IndirectGotoStmt : public Stmt {
36941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *Target;
37041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
37141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  IndirectGotoStmt(Expr *target) : Stmt(IndirectGotoStmtClass), Target(target){}
37241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
37341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *getTarget() { return Target; }
37441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Expr *getTarget() const { return Target; }
37541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
37641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
37741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == IndirectGotoStmtClass;
37841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
37941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const IndirectGotoStmt *) { return true; }
38041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
38141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
38241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
38341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// ContinueStmt - This represents a continue.
38441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
38541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass ContinueStmt : public Stmt {
38641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
38741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  ContinueStmt() : Stmt(ContinueStmtClass) {}
38841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
38941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == ContinueStmtClass;
39041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
39141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const ContinueStmt *) { return true; }
39241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
39341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
39441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// BreakStmt - This represents a break.
39541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
39641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass BreakStmt : public Stmt {
39741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
39841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  BreakStmt() : Stmt(BreakStmtClass) {}
39941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
40041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == BreakStmtClass;
40141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
40241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const BreakStmt *) { return true; }
40341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
404d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
40541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
40641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/// ReturnStmt - This represents a return, optionally of an expression.
40741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org///
40841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgclass ReturnStmt : public Stmt {
40941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *RetExpr;
41041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgpublic:
41141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  ReturnStmt(Expr *E = 0) : Stmt(ReturnStmtClass), RetExpr(E) {}
41241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
41341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const Expr *getRetValue() const { return RetExpr; }
41441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  Expr *getRetValue() { return RetExpr; }
41541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
41641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const Stmt *T) {
41741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    return T->getStmtClass() == ReturnStmtClass;
41841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
41941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static bool classof(const ReturnStmt *) { return true; }
42041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org};
42141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
42241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}  // end namespace clang
42341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
42441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
42541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org