Stmt.h revision 4ce854736dd196e2304f554ebeac8b43c89cf9e2
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;
256c36be5b383875b490684bcf439d6d427298c1afChris Lattner  class SwitchStmt;
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();
546000dace22f110d8768476989313e9d981d690d0Chris Lattner
556000dace22f110d8768476989313e9d981d690d0Chris Lattner  /// dump - This does a local dump of the specified AST fragment.  It dumps the
566000dace22f110d8768476989313e9d981d690d0Chris Lattner  /// specified node and a few nodes underneath it, but not the whole subtree.
576000dace22f110d8768476989313e9d981d690d0Chris Lattner  /// This is useful in a debugger.
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void dump() const;
596000dace22f110d8768476989313e9d981d690d0Chris Lattner
606000dace22f110d8768476989313e9d981d690d0Chris Lattner  /// dumpAll - This does a dump of the specified AST fragment and all subtrees.
616000dace22f110d8768476989313e9d981d690d0Chris Lattner  void dumpAll() const;
626000dace22f110d8768476989313e9d981d690d0Chris Lattner
636000dace22f110d8768476989313e9d981d690d0Chris Lattner  /// dumpPretty/printPretty - These two methods do a "pretty print" of the AST
646000dace22f110d8768476989313e9d981d690d0Chris Lattner  /// back to its original source language syntax.
656000dace22f110d8768476989313e9d981d690d0Chris Lattner  void dumpPretty() const;
666000dace22f110d8768476989313e9d981d690d0Chris Lattner  void printPretty(std::ostream &OS) const;
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Implement isa<T> support.
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *) { return true; }
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DeclStmt - Adaptor class for mixing declarations with statements and
735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// expressions. For example, CompoundStmt mixes statements, expressions
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// and declarations (variables, types). Another example is ForStmt, where
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the first statement can be an expression or a declaration.
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DeclStmt : public Stmt {
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Decl *TheDecl;
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DeclStmt(Decl *D) : Stmt(DeclStmtClass), TheDecl(D) {}
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Decl *getDecl() const { return TheDecl; }
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Decl *getDecl() { return TheDecl; }
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == DeclStmtClass;
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const DeclStmt *) { return true; }
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// NullStmt - This is the null statement ";": C99 6.8.3p3.
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass NullStmt : public Stmt {
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation SemiLoc;
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NullStmt(SourceLocation L) : Stmt(NullStmtClass), SemiLoc(L) {}
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation getSemiLoc() const { return SemiLoc; }
995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == NullStmtClass;
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const NullStmt *) { return true; }
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CompoundStmt - This represents a group of statements like { stmt stmt }.
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CompoundStmt : public Stmt {
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::SmallVector<Stmt*, 16> Body;
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  CompoundStmt(Stmt **StmtStart, unsigned NumStmts)
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(CompoundStmtClass), Body(StmtStart, StmtStart+NumStmts) {}
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
114ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  bool body_empty() const { return Body.empty(); }
115ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef llvm::SmallVector<Stmt*, 16>::iterator body_iterator;
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  body_iterator body_begin() { return Body.begin(); }
1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  body_iterator body_end() { return Body.end(); }
119ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  Stmt *body_back() { return Body.back(); }
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  typedef llvm::SmallVector<Stmt*, 16>::const_iterator const_body_iterator;
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const_body_iterator body_begin() const { return Body.begin(); }
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const_body_iterator body_end() const { return Body.end(); }
124ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  const Stmt *body_back() const { return Body.back(); }
1254ce854736dd196e2304f554ebeac8b43c89cf9e2Ted Kremenek
1264ce854736dd196e2304f554ebeac8b43c89cf9e2Ted Kremenek  typedef llvm::SmallVector<Stmt*, 16>::reverse_iterator reverse_body_iterator;
1274ce854736dd196e2304f554ebeac8b43c89cf9e2Ted Kremenek  reverse_body_iterator body_rbegin() { return Body.rbegin(); }
1284ce854736dd196e2304f554ebeac8b43c89cf9e2Ted Kremenek  reverse_body_iterator body_rend() { return Body.rend(); }
1294ce854736dd196e2304f554ebeac8b43c89cf9e2Ted Kremenek
1304ce854736dd196e2304f554ebeac8b43c89cf9e2Ted Kremenek  typedef llvm::SmallVector<Stmt*, 16>::const_reverse_iterator
1314ce854736dd196e2304f554ebeac8b43c89cf9e2Ted Kremenek    const_reverse_body_iterator;
1324ce854736dd196e2304f554ebeac8b43c89cf9e2Ted Kremenek  const_reverse_body_iterator body_rbegin() const { return Body.rbegin(); }
1334ce854736dd196e2304f554ebeac8b43c89cf9e2Ted Kremenek  const_reverse_body_iterator body_rend() const { return Body.rend(); }
1344ce854736dd196e2304f554ebeac8b43c89cf9e2Ted Kremenek
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void push_back(Stmt *S) { Body.push_back(S); }
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == CompoundStmtClass;
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const CompoundStmt *) { return true; }
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
143c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson// SwitchCase is the base class for CaseStmt and DefaultStmt,
144c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlssonclass SwitchCase : public Stmt {
145c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  // A pointer to the following CaseStmt or DefaultStmt class,
146c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  // used by SwitchStmt.
147c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  SwitchCase *NextSwitchCase;
148c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlssonprotected:
149c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  SwitchCase(StmtClass SC) : Stmt(SC), NextSwitchCase(0) {}
150c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
151c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlssonpublic:
152c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  const SwitchCase *getNextSwitchCase() const { return NextSwitchCase; }
153c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
154c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  SwitchCase *getNextSwitchCase() { return NextSwitchCase; }
155c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
156c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  void setNextSwitchCase(SwitchCase *SC) { NextSwitchCase = SC; }
157c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
158c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  static bool classof(const Stmt *T) {
159c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson    return T->getStmtClass() == CaseStmtClass ||
160c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson    T->getStmtClass() == DefaultStmtClass;
161c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  }
162c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  static bool classof(const SwitchCase *) { return true; }
163c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson};
164c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
165c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlssonclass CaseStmt : public SwitchCase {
1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *LHSVal;
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *RHSVal;  // Non-null for GNU "case 1 ... 4" extension
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *SubStmt;
1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  CaseStmt(Expr *lhs, Expr *rhs, Stmt *substmt)
171c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson    : SwitchCase(CaseStmtClass), LHSVal(lhs), RHSVal(rhs), SubStmt(substmt) {}
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getLHS() { return LHSVal; }
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getRHS() { return RHSVal; }
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getSubStmt() { return SubStmt; }
1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == CaseStmtClass;
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const CaseStmt *) { return true; }
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
183c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlssonclass DefaultStmt : public SwitchCase {
1846c36be5b383875b490684bcf439d6d427298c1afChris Lattner  SourceLocation DefaultLoc;
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *SubStmt;
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
187c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  DefaultStmt(SourceLocation DL, Stmt *substmt) : SwitchCase(DefaultStmtClass),
1886c36be5b383875b490684bcf439d6d427298c1afChris Lattner    DefaultLoc(DL), SubStmt(substmt) {}
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1906c36be5b383875b490684bcf439d6d427298c1afChris Lattner  SourceLocation getDefaultLoc() const { return DefaultLoc; }
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getSubStmt() { return SubStmt; }
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == DefaultStmtClass;
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const DefaultStmt *) { return true; }
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass LabelStmt : public Stmt {
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation IdentLoc;
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *Label;
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *SubStmt;
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LabelStmt(SourceLocation IL, IdentifierInfo *label, Stmt *substmt)
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(LabelStmtClass), IdentLoc(IL), Label(label), SubStmt(substmt) {}
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation getIdentLoc() const { return IdentLoc; }
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *getID() const { return Label; }
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *getName() const;
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getSubStmt() { return SubStmt; }
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getSubStmt() const { return SubStmt; }
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void setIdentLoc(SourceLocation L) { IdentLoc = L; }
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void setSubStmt(Stmt *SS) { SubStmt = SS; }
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == LabelStmtClass;
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const LabelStmt *) { return true; }
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// IfStmt - This represents an if/then/else.
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass IfStmt : public Stmt {
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Cond;
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Then, *Else;
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IfStmt(Expr *cond, Stmt *then, Stmt *elsev = 0)
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(IfStmtClass), Cond(cond), Then(then), Else(elsev) {}
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getCond() const { return Cond; }
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getThen() const { return Then; }
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getElse() const { return Else; }
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getCond() { return Cond; }
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getThen() { return Then; }
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getElse() { return Else; }
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == IfStmtClass;
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const IfStmt *) { return true; }
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// SwitchStmt - This represents a 'switch' stmt.
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass SwitchStmt : public Stmt {
2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Cond;
2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Body;
251c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
252c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  // This points to a linked list of case and default statements.
253c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  SwitchCase *FirstCase;
2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
255c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  SwitchStmt(Expr *cond)
256c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson    : Stmt(SwitchStmtClass), Cond(cond), Body(0), FirstCase(0) {}
2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
258c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  const Expr *getCond() const { return Cond; }
259c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  const Stmt *getBody() const { return Body; }
260c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  const SwitchCase *getSwitchCaseList() const { return FirstCase; }
261c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getCond() { return Cond; }
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getBody() { return Body; }
264c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  SwitchCase *getSwitchCaseList() { return FirstCase; }
265c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
266c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  void setBody(Stmt *S) { Body = S; }
267c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
268c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  void addSwitchCase(SwitchCase *SC) {
269c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson    if (FirstCase)
270c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson      SC->setNextSwitchCase(FirstCase);
271c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
272c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson    FirstCase = SC;
273c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  }
2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == SwitchStmtClass;
2775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const SwitchStmt *) { return true; }
2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// WhileStmt - This represents a 'while' stmt.
2835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
2845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass WhileStmt : public Stmt {
2855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Cond;
2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Body;
2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  WhileStmt(Expr *cond, Stmt *body)
2895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(WhileStmtClass), Cond(cond), Body(body) {}
2905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getCond() { return Cond; }
2925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getCond() const { return Cond; }
2935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getBody() { return Body; }
2945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getBody() const { return Body; }
2955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
2975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == WhileStmtClass;
2985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const WhileStmt *) { return true; }
3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DoStmt - This represents a 'do/while' stmt.
3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DoStmt : public Stmt {
3055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Body;
3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Cond;
3075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DoStmt(Stmt *body, Expr *cond)
3095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(DoStmtClass), Body(body), Cond(cond) {}
3105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getBody() { return Body; }
3125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getBody() const { return Body; }
3135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getCond() { return Cond; }
3145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getCond() const { return Cond; }
3155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == DoStmtClass;
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const DoStmt *) { return true; }
3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ForStmt - This represents a 'for (init;cond;inc)' stmt.  Note that any of
3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the init/cond/inc parts of the ForStmt will be null if they were not
3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified in the source.
3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ForStmt : public Stmt {
3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Init;  // Expression or declstmt.
3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Cond, *Inc;
3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *Body;
3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ForStmt(Stmt *init, Expr *cond, Expr *inc, Stmt *body)
3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    : Stmt(ForStmtClass), Init(init), Cond(cond), Inc(inc), Body(body) {}
3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getInit() { return Init; }
3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getCond() { return Cond; }
3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getInc()  { return Inc; }
3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Stmt *getBody() { return Body; }
3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getInit() const { return Init; }
3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getCond() const { return Cond; }
3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getInc()  const { return Inc; }
3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Stmt *getBody() const { return Body; }
3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == ForStmtClass;
3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const ForStmt *) { return true; }
3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// GotoStmt - This represents a direct goto.
3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass GotoStmt : public Stmt {
3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LabelStmt *Label;
3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  GotoStmt(LabelStmt *label) : Stmt(GotoStmtClass), Label(label) {}
3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LabelStmt *getLabel() const { return Label; }
3595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == GotoStmtClass;
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const GotoStmt *) { return true; }
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// IndirectGotoStmt - This represents an indirect goto.
3675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass IndirectGotoStmt : public Stmt {
3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *Target;
3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3716000dace22f110d8768476989313e9d981d690d0Chris Lattner  IndirectGotoStmt(Expr *target) : Stmt(IndirectGotoStmtClass), Target(target){}
3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getTarget() { return Target; }
3746000dace22f110d8768476989313e9d981d690d0Chris Lattner  const Expr *getTarget() const { return Target; }
3755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
3775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == IndirectGotoStmtClass;
3785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const IndirectGotoStmt *) { return true; }
3805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ContinueStmt - This represents a continue.
3845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ContinueStmt : public Stmt {
3865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ContinueStmt() : Stmt(ContinueStmtClass) {}
3885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
3895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == ContinueStmtClass;
3905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const ContinueStmt *) { return true; }
3925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// BreakStmt - This represents a break.
3955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass BreakStmt : public Stmt {
3975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
3985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  BreakStmt() : Stmt(BreakStmtClass) {}
3995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
4005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == BreakStmtClass;
4015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const BreakStmt *) { return true; }
4035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
4045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ReturnStmt - This represents a return, optionally of an expression.
4075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
4085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ReturnStmt : public Stmt {
4095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *RetExpr;
4105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
4115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ReturnStmt(Expr *E = 0) : Stmt(ReturnStmtClass), RetExpr(E) {}
4125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getRetValue() const { return RetExpr; }
4145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getRetValue() { return RetExpr; }
4155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
4175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() == ReturnStmtClass;
4185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const ReturnStmt *) { return true; }
4205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
4215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
4235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
425