ExprCXX.h revision c4a1dea2dc56bd1357ec91b829a0b9e68229a13e
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" 18c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/Decl.h" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 221060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek//===--------------------------------------------------------------------===// 231060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek// C++ Expressions. 241060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek//===--------------------------------------------------------------------===// 251060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 261060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// CXXCastExpr - [C++ 5.2.7, 5.2.9, 5.2.10, 5.2.11] C++ Cast Operators. 271060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// 281060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXCastExpr : public Expr { 291060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 301060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek enum Opcode { 311060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek DynamicCast, 321060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek StaticCast, 331060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek ReinterpretCast, 341060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek ConstCast 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 361060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekprivate: 371060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek QualType Ty; 381060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Opcode Opc; 391060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Stmt *Op; 401060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation Loc; // the location of the casting op 411060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 421060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek CXXCastExpr(Opcode op, QualType ty, Expr *expr, SourceLocation l) 431060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek : Expr(CXXCastExprClass, ty), Ty(ty), Opc(op), Op(expr), Loc(l) {} 441060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 451060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek QualType getDestType() const { return Ty; } 461060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr *getSubExpr() const { return cast<Expr>(Op); } 471060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 481060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Opcode getOpcode() const { return Opc; } 491060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 501060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek /// getOpcodeStr - Turn an Opcode enum value into the string it represents, 511060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek /// e.g. "reinterpret_cast". 521060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static const char *getOpcodeStr(Opcode Op) { 531060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // FIXME: move out of line. 541060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek switch (Op) { 551060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek default: assert(0 && "Not a C++ cast expression"); 561060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek case CXXCastExpr::ConstCast: return "const_cast"; 571060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek case CXXCastExpr::DynamicCast: return "dynamic_cast"; 581060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek case CXXCastExpr::ReinterpretCast: return "reinterpret_cast"; 591060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek case CXXCastExpr::StaticCast: return "static_cast"; 601060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 611060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 621060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 631060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual SourceRange getSourceRange() const { 641060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return SourceRange(Loc, getSubExpr()->getSourceRange().getEnd()); 651060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 661060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 671060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXCastExprClass; 681060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 691060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const CXXCastExpr *) { return true; } 701060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 711060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 721060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_begin(); 731060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_end(); 741060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 751060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 761060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// CXXBoolLiteralExpr - [C++ 2.13.5] C++ Boolean Literal. 771060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// 781060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXBoolLiteralExpr : public Expr { 791060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek bool Value; 801060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation Loc; 811060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 821060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) : 831060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr(CXXBoolLiteralExprClass, Ty), Value(val), Loc(l) {} 841060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 851060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek bool getValue() const { return Value; } 865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 871060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 891060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 901060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXBoolLiteralExprClass; 911060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 921060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const CXXBoolLiteralExpr *) { return true; } 935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 941060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 951060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_begin(); 961060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_end(); 971060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 981060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 991060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// CXXThrowExpr - [C++ 15] C++ Throw Expression. This handles 1001060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// 'throw' and 'throw' assignment-expression. When 1011060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// assignment-expression isn't present, Op will be null. 1021060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// 1031060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXThrowExpr : public Expr { 1041060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Stmt *Op; 1051060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation ThrowLoc; 1061060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 1071060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Ty is the void type which is used as the result type of the 1081060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // exepression. The l is the location of the throw keyword. expr 1091060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // can by null, if the optional expression to throw isn't present. 1101060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l) : 1111060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr(CXXThrowExprClass, Ty), Op(expr), ThrowLoc(l) {} 1121060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); } 1131060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr *getSubExpr() { return cast_or_null<Expr>(Op); } 1141060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1151060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual SourceRange getSourceRange() const { 1161060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek if (getSubExpr() == 0) 1171060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return SourceRange(ThrowLoc, ThrowLoc); 1181060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return SourceRange(ThrowLoc, getSubExpr()->getSourceRange().getEnd()); 1191060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 1201060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1211060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 1221060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXThrowExprClass; 1231060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 1241060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const CXXThrowExpr *) { return true; } 1251060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1261060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 1271060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_begin(); 1281060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_end(); 1291060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 1301060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1311060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// CXXDefaultArgExpr - C++ [dcl.fct.default]. This wraps up a 1321060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// function call argument that was created from the corresponding 1331060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// parameter's default argument, when the call did not explicitly 1341060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// supply arguments for all of the parameters. 1351060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXDefaultArgExpr : public Expr { 1361060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek ParmVarDecl *Param; 1371060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 1381060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Param is the parameter whose default argument is used by this 1391060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // expression. 1401060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek explicit CXXDefaultArgExpr(ParmVarDecl *param) 1411060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek : Expr(CXXDefaultArgExprClass, param->getDefaultArg()->getType()), 1421060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Param(param) { } 1431060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1441060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Retrieve the parameter that the argument was created from. 1451060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek const ParmVarDecl *getParam() const { return Param; } 1461060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek ParmVarDecl *getParam() { return Param; } 1471060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1481060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Retrieve the actual argument to the function call. 1491060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek const Expr *getExpr() const { return Param->getDefaultArg(); } 1501060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr *getExpr() { return Param->getDefaultArg(); } 1511060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1521060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual SourceRange getSourceRange() const { 1531060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Default argument expressions have no representation in the 1541060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // source, so they have an empty source range. 1551060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return SourceRange(); 1561060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 1571060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1581060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 1591060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXDefaultArgExprClass; 1601060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 1611060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const CXXDefaultArgExpr *) { return true; } 1621060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1631060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 1641060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_begin(); 1651060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_end(); 1661060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1671060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Serialization 1681060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 1691060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static CXXDefaultArgExpr* CreateImpl(llvm::Deserializer& D, 1701060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek ASTContext& C); 1711060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 175