Stmt.h revision 5f016e2cb5d11daeb237544de1c5d59f20fe1a6e
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Stmt.h - Classes for representing statements -----------*- C++ -*-===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
55f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file was developed by Chris Lattner and is distributed under
65f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// the University of Illinois Open Source License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  This file defines the Stmt interface and subclasses.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_AST_STMT_H
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_AST_STMT_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/SourceLocation.h"
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/SmallVector.h"
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <iosfwd>
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class Expr;
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class Decl;
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class IdentifierInfo;
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class StmtVisitor;
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Stmt - This represents one statement.
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Stmt {
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  enum StmtClass {
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define STMT(N, CLASS, PARENT) CLASS##Class = N,
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define FIRST_STMT(N) firstStmtConstant = N,
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LAST_STMT(N) lastStmtConstant = N,
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define FIRST_EXPR(N) firstExprConstant = N,
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LAST_EXPR(N) lastExprConstant = N
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/StmtNodes.def"
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate:
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const StmtClass sClass;
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt(StmtClass SC) : sClass(SC) {
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (Stmt::CollectingStats()) Stmt::addStmtClass(SC);
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual ~Stmt() {}
465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StmtClass getStmtClass() const { return sClass; }
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *getStmtClassName() const;
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // global temp stats (until we have a per-module visitor)
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static void addStmtClass(const StmtClass s);
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool CollectingStats(bool enable=false);
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static void PrintStats();
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void dump() const;
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void print(std::ostream &OS) const;
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Implement visitor support.
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Implement isa<T> support.
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *) { return true; }
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DeclStmt - Adaptor class for mixing declarations with statements and
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// expressions. For example, CompoundStmt mixes statements, expressions
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// and declarations (variables, types). Another example is ForStmt, where
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the first statement can be an expression or a declaration.
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DeclStmt : public Stmt {
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Decl *TheDecl;
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclStmt(Decl *D) : Stmt(DeclStmtClass), TheDecl(D) {}
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Decl *getDecl() const { return TheDecl; }
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Decl *getDecl() { return TheDecl; }
775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == DeclStmtClass;
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const DeclStmt *) { return true; }
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// NullStmt - This is the null statement ";": C99 6.8.3p3.
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass NullStmt : public Stmt {
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation SemiLoc;
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NullStmt(SourceLocation L) : Stmt(NullStmtClass), SemiLoc(L) {}
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation getSemiLoc() const { return SemiLoc; }
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == NullStmtClass;
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const NullStmt *) { return true; }
995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CompoundStmt - This represents a group of statements like { stmt stmt }.
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CompoundStmt : public Stmt {
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::SmallVector<Stmt*, 16> Body;
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  CompoundStmt(Stmt **StmtStart, unsigned NumStmts)
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(CompoundStmtClass), Body(StmtStart, StmtStart+NumStmts) {}
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef llvm::SmallVector<Stmt*, 16>::iterator body_iterator;
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  body_iterator body_begin() { return Body.begin(); }
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  body_iterator body_end() { return Body.end(); }
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef llvm::SmallVector<Stmt*, 16>::const_iterator const_body_iterator;
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const_body_iterator body_begin() const { return Body.begin(); }
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const_body_iterator body_end() const { return Body.end(); }
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void push_back(Stmt *S) { Body.push_back(S); }
1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == CompoundStmtClass;
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const CompoundStmt *) { return true; }
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CaseStmt : public Stmt {
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *LHSVal;
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *RHSVal;  // Non-null for GNU "case 1 ... 4" extension
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *SubStmt;
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  CaseStmt(Expr *lhs, Expr *rhs, Stmt *substmt)
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(CaseStmtClass), LHSVal(lhs), RHSVal(rhs), SubStmt(substmt) {}
1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getLHS() { return LHSVal; }
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getRHS() { return RHSVal; }
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getSubStmt() { return SubStmt; }
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == CaseStmtClass;
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const CaseStmt *) { return true; }
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DefaultStmt : public Stmt {
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *SubStmt;
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DefaultStmt(Stmt *substmt) : Stmt(DefaultStmtClass), SubStmt(substmt) {}
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getSubStmt() { return SubStmt; }
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == DefaultStmtClass;
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const DefaultStmt *) { return true; }
1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass LabelStmt : public Stmt {
1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation IdentLoc;
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *Label;
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *SubStmt;
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LabelStmt(SourceLocation IL, IdentifierInfo *label, Stmt *substmt)
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(LabelStmtClass), IdentLoc(IL), Label(label), SubStmt(substmt) {}
1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation getIdentLoc() const { return IdentLoc; }
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *getID() const { return Label; }
1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *getName() const;
1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getSubStmt() { return SubStmt; }
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getSubStmt() const { return SubStmt; }
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void setIdentLoc(SourceLocation L) { IdentLoc = L; }
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void setSubStmt(Stmt *SS) { SubStmt = SS; }
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == LabelStmtClass;
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const LabelStmt *) { return true; }
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// IfStmt - This represents an if/then/else.
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass IfStmt : public Stmt {
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Cond;
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Then, *Else;
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IfStmt(Expr *cond, Stmt *then, Stmt *elsev = 0)
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(IfStmtClass), Cond(cond), Then(then), Else(elsev) {}
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getCond() const { return Cond; }
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getThen() const { return Then; }
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getElse() const { return Else; }
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getCond() { return Cond; }
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getThen() { return Then; }
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getElse() { return Else; }
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == IfStmtClass;
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const IfStmt *) { return true; }
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// SwitchStmt - This represents a 'switch' stmt.
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass SwitchStmt : public Stmt {
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Cond;
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Body;
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SwitchStmt(Expr *cond, Stmt *body)
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(SwitchStmtClass), Cond(cond), Body(body) {}
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getCond() { return Cond; }
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getBody() { return Body; }
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == SwitchStmtClass;
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const SwitchStmt *) { return true; }
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// WhileStmt - This represents a 'while' stmt.
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass WhileStmt : public Stmt {
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Cond;
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Body;
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  WhileStmt(Expr *cond, Stmt *body)
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(WhileStmtClass), Cond(cond), Body(body) {}
2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getCond() { return Cond; }
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getCond() const { return Cond; }
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getBody() { return Body; }
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getBody() const { return Body; }
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == WhileStmtClass;
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const WhileStmt *) { return true; }
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DoStmt - This represents a 'do/while' stmt.
2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DoStmt : public Stmt {
2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Body;
2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Cond;
2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DoStmt(Stmt *body, Expr *cond)
2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(DoStmtClass), Body(body), Cond(cond) {}
2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getBody() { return Body; }
2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getBody() const { return Body; }
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getCond() { return Cond; }
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getCond() const { return Cond; }
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == DoStmtClass;
2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const DoStmt *) { return true; }
2685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ForStmt - This represents a 'for (init;cond;inc)' stmt.  Note that any of
2725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the init/cond/inc parts of the ForStmt will be null if they were not
2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified in the source.
2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ForStmt : public Stmt {
2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Init;  // Expression or declstmt.
2775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Cond, *Inc;
2785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Body;
2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ForStmt(Stmt *init, Expr *cond, Expr *inc, Stmt *body)
2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(ForStmtClass), Init(init), Cond(cond), Inc(inc), Body(body) {}
2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getInit() { return Init; }
2845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getCond() { return Cond; }
2855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getInc()  { return Inc; }
2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getBody() { return Body; }
2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getInit() const { return Init; }
2895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getCond() const { return Cond; }
2905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getInc()  const { return Inc; }
2915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getBody() const { return Body; }
2925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
2945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
2955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == ForStmtClass;
2965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const ForStmt *) { return true; }
2985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// GotoStmt - This represents a direct goto.
3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass GotoStmt : public Stmt {
3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LabelStmt *Label;
3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  GotoStmt(LabelStmt *label) : Stmt(GotoStmtClass), Label(label) {}
3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LabelStmt *getLabel() const { return Label; }
3085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
3105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
3115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == GotoStmtClass;
3125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const GotoStmt *) { return true; }
3145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// IndirectGotoStmt - This represents an indirect goto.
3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass IndirectGotoStmt : public Stmt {
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Target;
3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IndirectGotoStmt(Expr *target) : Stmt(IndirectGotoStmtClass),
3225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                   Target(target) {}
3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getTarget() { return Target; }
3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == IndirectGotoStmtClass;
3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const IndirectGotoStmt *) { return true; }
3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ContinueStmt - This represents a continue.
3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ContinueStmt : public Stmt {
3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ContinueStmt() : Stmt(ContinueStmtClass) {}
3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == ContinueStmtClass;
3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const ContinueStmt *) { return true; }
3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// BreakStmt - This represents a break.
3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass BreakStmt : public Stmt {
3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  BreakStmt() : Stmt(BreakStmtClass) {}
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == BreakStmtClass;
3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const BreakStmt *) { return true; }
3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ReturnStmt - This represents a return, optionally of an expression.
3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ReturnStmt : public Stmt {
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *RetExpr;
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ReturnStmt(Expr *E = 0) : Stmt(ReturnStmtClass), RetExpr(E) {}
3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getRetValue() const { return RetExpr; }
3675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getRetValue() { return RetExpr; }
3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void visit(StmtVisitor &Visitor);
3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
3715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == ReturnStmtClass;
3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const ReturnStmt *) { return true; }
3745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
3775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
379