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