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