ExprCXX.h revision 0bc735ffcfb223c0186419547abaa5c84482663e
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- ExprCXX.h - Classes for representing expressions -------*- C++ -*-===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file defines the Expr interface and subclasses for C++ expressions. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_AST_EXPRCXX_H 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_AST_EXPRCXX_H 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Expr.h" 185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer //===--------------------------------------------------------------------===// 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C++ Expressions. 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer //===--------------------------------------------------------------------===// 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// CXXCastExpr - [C++ 5.2.7, 5.2.9, 5.2.10, 5.2.11] C++ Cast Operators. 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer class CXXCastExpr : public Expr { 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer public: 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer enum Opcode { 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DynamicCast, 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer StaticCast, 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ReinterpretCast, 335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ConstCast 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer private: 365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType Ty; 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Opcode Opc; 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Expr *Op; 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; // the location of the casting op 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer public: 415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer CXXCastExpr(Opcode op, QualType ty, Expr *expr, SourceLocation l) 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer : Expr(CXXCastExprClass, ty), Ty(ty), Opc(op), Op(expr), Loc(l) {} 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType getDestType() const { return Ty; } 455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Expr *getSubExpr() const { return Op; } 465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Opcode getOpcode() const { return Opc; } 485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4936460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner /// getOpcodeStr - Turn an Opcode enum value into the string it represents, 5036460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner /// e.g. "reinterpret_cast". 5136460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner static const char *getOpcodeStr(Opcode Op) { 5236460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner // FIXME: move out of line. 5336460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner switch (Op) { 5436460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner default: assert(0 && "Not a C++ cast expression"); 5536460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner case CXXCastExpr::ConstCast: return "const_cast"; 5636460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner case CXXCastExpr::DynamicCast: return "dynamic_cast"; 5736460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner case CXXCastExpr::ReinterpretCast: return "reinterpret_cast"; 5836460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner case CXXCastExpr::StaticCast: return "static_cast"; 5936460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner } 6036460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner } 6136460eea641bf20a67b8b767b6d26373a90f0965Chris Lattner 625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual SourceRange getSourceRange() const { 63311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner return SourceRange(Loc, getSubExpr()->getSourceRange().getEnd()); 645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const Stmt *T) { 665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return T->getStmtClass() == CXXCastExprClass; 675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const CXXCastExpr *) { return true; } 69c10d33c01478f2444b2b87aefa090493f028d2d5Ted Kremenek 70c10d33c01478f2444b2b87aefa090493f028d2d5Ted Kremenek // Iterators 71c10d33c01478f2444b2b87aefa090493f028d2d5Ted Kremenek virtual child_iterator child_begin(); 72c10d33c01478f2444b2b87aefa090493f028d2d5Ted Kremenek virtual child_iterator child_end(); 735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// CXXBoolLiteralExpr - [C++ 2.13.5] C++ Boolean Literal. 765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer class CXXBoolLiteralExpr : public Expr { 785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool Value; 795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer public: 81210679cacc47640107e46090de1a138977a0431eSteve Naroff CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) : 82210679cacc47640107e46090de1a138977a0431eSteve Naroff Expr(CXXBoolLiteralExprClass, Ty), Value(val), Loc(l) {} 835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool getValue() const { return Value; } 855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const Stmt *T) { 895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return T->getStmtClass() == CXXBoolLiteralExprClass; 905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const CXXBoolLiteralExpr *) { return true; } 92c10d33c01478f2444b2b87aefa090493f028d2d5Ted Kremenek 93c10d33c01478f2444b2b87aefa090493f028d2d5Ted Kremenek // Iterators 94c10d33c01478f2444b2b87aefa090493f028d2d5Ted Kremenek virtual child_iterator child_begin(); 95c10d33c01478f2444b2b87aefa090493f028d2d5Ted Kremenek virtual child_iterator child_end(); 965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 101