ExprCXX.h revision c42e1183846228a7fa5143ad76507d6d60f5c6f3
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 2649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXNamedCastExpr - Abstract class common to all of the C++ "named" 2749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// casts, @c static_cast, @c dynamic_cast, @c reinterpret_cast, or @c 2849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// const_cast. 2949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// 3049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This abstract class is inherited by all of the classes 3149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// representing "named" casts, e.g., CXXStaticCastExpr, 3249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXDynamicCastExpr, CXXReinterpretCastExpr, and CXXConstCastExpr. 3349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXNamedCastExpr : public ExplicitCastExpr { 341060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekprivate: 351060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation Loc; // the location of the casting op 3649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 3749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorprotected: 3849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor CXXNamedCastExpr(StmtClass SC, QualType ty, Expr *op, QualType writtenTy, 3949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor SourceLocation l) 4049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor : ExplicitCastExpr(SC, ty, op, writtenTy), Loc(l) {} 4149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 421060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 4349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor const char *getCastName() const; 4449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 451060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual SourceRange getSourceRange() const { 461060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return SourceRange(Loc, getSubExpr()->getSourceRange().getEnd()); 471060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 481060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 4949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor switch (T->getStmtClass()) { 5049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXNamedCastExprClass: 5149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXStaticCastExprClass: 5249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXDynamicCastExprClass: 5349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXReinterpretCastExprClass: 5449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXConstCastExprClass: 5549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return true; 5649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor default: 5749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return false; 5849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 591060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 6049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const CXXNamedCastExpr *) { return true; } 611060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 6249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor virtual void EmitImpl(llvm::Serializer& S) const; 6349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static CXXNamedCastExpr *CreateImpl(llvm::Deserializer& D, ASTContext& C, 6449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor StmtClass SC); 6549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 6649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 6749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXStaticCastExpr - A C++ @c static_cast expression (C++ [expr.static.cast]). 6849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// 6949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a C++ static cast, e.g., 7049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// @c static_cast<int>(1.0). 7149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXStaticCastExpr : public CXXNamedCastExpr { 7249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic: 7349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor CXXStaticCastExpr(QualType ty, Expr *op, QualType writtenTy, SourceLocation l) 7449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor : CXXNamedCastExpr(CXXStaticCastExprClass, ty, op, writtenTy, l) {} 7549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 7649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const Stmt *T) { 7749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXStaticCastExprClass; 7849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 7949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const CXXStaticCastExpr *) { return true; } 8049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 8149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 8249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXDynamicCastExpr - A C++ @c dynamic_cast expression 8349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// (C++ [expr.dynamic.cast]), which may perform a run-time check to 8449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// determine how to perform the type cast. 8549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// 8649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a dynamic cast, e.g., 8749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// @c dynamic_cast<Derived*>(BasePtr). 8849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXDynamicCastExpr : public CXXNamedCastExpr { 8949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic: 9049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor CXXDynamicCastExpr(QualType ty, Expr *op, QualType writtenTy, SourceLocation l) 9149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, op, writtenTy, l) {} 9249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 9349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const Stmt *T) { 9449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXDynamicCastExprClass; 9549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 9649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const CXXDynamicCastExpr *) { return true; } 9749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 9849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 9949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXReinterpretCastExpr - A C++ @c reinterpret_cast expression (C++ 10049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// [expr.reinterpret.cast]), which provides a differently-typed view 10149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// of a value but performs no actual work at run time. 10249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// 10349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a reinterpret cast, e.g., 10449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// @c reinterpret_cast<int>(VoidPtr). 10549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXReinterpretCastExpr : public CXXNamedCastExpr { 10649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic: 10749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor CXXReinterpretCastExpr(QualType ty, Expr *op, QualType writtenTy, 10849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor SourceLocation l) 10949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, op, writtenTy, l) {} 11049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 11149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const Stmt *T) { 11249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXReinterpretCastExprClass; 11349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 11449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const CXXReinterpretCastExpr *) { return true; } 11549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 11649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 11749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXConstCastExpr - A C++ @c const_cast expression (C++ [expr.const.cast]), 11849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// which can remove type qualifiers but does not change the underlying value. 11949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// 12049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a const cast, e.g., 12149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// @c const_cast<char*>(PtrToConstChar). 12249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXConstCastExpr : public CXXNamedCastExpr { 12349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic: 12449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor CXXConstCastExpr(QualType ty, Expr *op, QualType writtenTy, 12549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor SourceLocation l) 12649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor : CXXNamedCastExpr(CXXConstCastExprClass, ty, op, writtenTy, l) {} 12749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 12849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const Stmt *T) { 12949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXConstCastExprClass; 13049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 13149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const CXXConstCastExpr *) { return true; } 1321060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 1331060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1341060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// CXXBoolLiteralExpr - [C++ 2.13.5] C++ Boolean Literal. 1351060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// 1361060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXBoolLiteralExpr : public Expr { 1371060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek bool Value; 1381060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation Loc; 1391060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 1401060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) : 1411060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr(CXXBoolLiteralExprClass, Ty), Value(val), Loc(l) {} 1421060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1431060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek bool getValue() const { return Value; } 1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1451060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1471060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 1481060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXBoolLiteralExprClass; 1491060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 1501060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const CXXBoolLiteralExpr *) { return true; } 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1521060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 1531060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_begin(); 1541060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_end(); 1551060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 1561060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 157c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// CXXTypeidExpr - A C++ @c typeid expression (C++ [expr.typeid]), which gets 158c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// the type_info that corresponds to the supplied type, or the (possibly 159c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// dynamic) type of the supplied expression. 160c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// 161c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// This represents code like @c typeid(int) or @c typeid(*objPtr) 162c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlclass CXXTypeidExpr : public Expr { 163c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlprivate: 164c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl bool isTypeOp : 1; 165c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl void *Operand; 166c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl SourceRange Range; 167c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 168c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlpublic: 169c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl CXXTypeidExpr(bool isTypeOp, void *op, QualType Ty, const SourceRange r) : 170c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl Expr(CXXTypeidExprClass, Ty), isTypeOp(isTypeOp), Operand(op), Range(r) {} 171c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 172c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl bool isTypeOperand() const { return isTypeOp; } 173c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl QualType getTypeOperand() const { 174c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)"); 175c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl return QualType::getFromOpaquePtr(Operand); 176c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 177c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl Expr* getExprOperand() const { 178c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)"); 179c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl return static_cast<Expr*>(Operand); 180c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 181c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 182c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl virtual SourceRange getSourceRange() const { 183c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl return Range; 184c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 185c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl static bool classof(const Stmt *T) { 186c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl return T->getStmtClass() == CXXTypeidExprClass; 187c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 188c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl static bool classof(const CXXTypeidExpr *) { return true; } 189c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 190c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl // Iterators 191c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl virtual child_iterator child_begin(); 192c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl virtual child_iterator child_end(); 193c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 194c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl virtual void EmitImpl(llvm::Serializer& S) const; 195c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl static CXXTypeidExpr* CreateImpl(llvm::Deserializer& D, ASTContext& C); 196c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl}; 197c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 198796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// CXXThisExpr - Represents the "this" expression in C++, which is a 199796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// pointer to the object on which the current member function is 200796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// executing (C++ [expr.prim]p3). Example: 201796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// 202796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// @code 203796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// class Foo { 204796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// public: 205796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// void bar(); 206796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// void test() { this->bar(); } 207796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// }; 208796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// @endcode 209796da18402f286b897782a298ae3b20c459c102eDouglas Gregorclass CXXThisExpr : public Expr { 210796da18402f286b897782a298ae3b20c459c102eDouglas Gregor SourceLocation Loc; 211796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 212796da18402f286b897782a298ae3b20c459c102eDouglas Gregorpublic: 213796da18402f286b897782a298ae3b20c459c102eDouglas Gregor CXXThisExpr(SourceLocation L, QualType Type) 214796da18402f286b897782a298ae3b20c459c102eDouglas Gregor : Expr(CXXThisExprClass, Type), Loc(L) { } 215796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 216796da18402f286b897782a298ae3b20c459c102eDouglas Gregor virtual SourceRange getSourceRange() const { return SourceRange(Loc); } 217796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 218796da18402f286b897782a298ae3b20c459c102eDouglas Gregor static bool classof(const Stmt *T) { 219796da18402f286b897782a298ae3b20c459c102eDouglas Gregor return T->getStmtClass() == CXXThisExprClass; 220796da18402f286b897782a298ae3b20c459c102eDouglas Gregor } 221796da18402f286b897782a298ae3b20c459c102eDouglas Gregor static bool classof(const CXXThisExpr *) { return true; } 222796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 223796da18402f286b897782a298ae3b20c459c102eDouglas Gregor // Iterators 224796da18402f286b897782a298ae3b20c459c102eDouglas Gregor virtual child_iterator child_begin(); 225796da18402f286b897782a298ae3b20c459c102eDouglas Gregor virtual child_iterator child_end(); 226796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 227796da18402f286b897782a298ae3b20c459c102eDouglas Gregor virtual void EmitImpl(llvm::Serializer& S) const; 228796da18402f286b897782a298ae3b20c459c102eDouglas Gregor static CXXThisExpr* CreateImpl(llvm::Deserializer& D, ASTContext& C); 229796da18402f286b897782a298ae3b20c459c102eDouglas Gregor}; 230796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 2311060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// CXXThrowExpr - [C++ 15] C++ Throw Expression. This handles 2321060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// 'throw' and 'throw' assignment-expression. When 2331060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// assignment-expression isn't present, Op will be null. 2341060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// 2351060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXThrowExpr : public Expr { 2361060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Stmt *Op; 2371060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation ThrowLoc; 2381060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 2391060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Ty is the void type which is used as the result type of the 2401060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // exepression. The l is the location of the throw keyword. expr 2411060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // can by null, if the optional expression to throw isn't present. 2421060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l) : 2431060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr(CXXThrowExprClass, Ty), Op(expr), ThrowLoc(l) {} 2441060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); } 2451060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr *getSubExpr() { return cast_or_null<Expr>(Op); } 2461060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 2471060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual SourceRange getSourceRange() const { 2481060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek if (getSubExpr() == 0) 2491060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return SourceRange(ThrowLoc, ThrowLoc); 2501060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return SourceRange(ThrowLoc, getSubExpr()->getSourceRange().getEnd()); 2511060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 2521060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 2531060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 2541060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXThrowExprClass; 2551060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 2561060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const CXXThrowExpr *) { return true; } 2571060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 2581060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 2591060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_begin(); 2601060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_end(); 2611060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 2621060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 2631060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// CXXDefaultArgExpr - C++ [dcl.fct.default]. This wraps up a 2641060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// function call argument that was created from the corresponding 2651060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// parameter's default argument, when the call did not explicitly 2661060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// supply arguments for all of the parameters. 2671060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXDefaultArgExpr : public Expr { 2681060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek ParmVarDecl *Param; 2691060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 2701060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Param is the parameter whose default argument is used by this 2711060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // expression. 2721060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek explicit CXXDefaultArgExpr(ParmVarDecl *param) 2731060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek : Expr(CXXDefaultArgExprClass, param->getDefaultArg()->getType()), 2741060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Param(param) { } 2751060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 2761060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Retrieve the parameter that the argument was created from. 2771060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek const ParmVarDecl *getParam() const { return Param; } 2781060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek ParmVarDecl *getParam() { return Param; } 2791060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 2801060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Retrieve the actual argument to the function call. 2811060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek const Expr *getExpr() const { return Param->getDefaultArg(); } 2821060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr *getExpr() { return Param->getDefaultArg(); } 2831060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 2841060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual SourceRange getSourceRange() const { 2851060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Default argument expressions have no representation in the 2861060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // source, so they have an empty source range. 2871060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return SourceRange(); 2881060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 2891060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 2901060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 2911060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXDefaultArgExprClass; 2921060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 2931060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const CXXDefaultArgExpr *) { return true; } 2941060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 2951060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 2961060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_begin(); 2971060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual child_iterator child_end(); 2981060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 2991060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Serialization 3001060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 3011060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static CXXDefaultArgExpr* CreateImpl(llvm::Deserializer& D, 3021060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek ASTContext& C); 3031060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 304987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 30549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CXXFunctionalCastExpr - Represents an explicit C++ type conversion 30649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// that uses "functional" notion (C++ [expr.type.conv]). Example: @c 30749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// x = int(0.5); 30849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXFunctionalCastExpr : public ExplicitCastExpr { 309987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation TyBeginLoc; 310987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation RParenLoc; 311987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidispublic: 31249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor CXXFunctionalCastExpr(QualType ty, QualType writtenTy, 31349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor SourceLocation tyBeginLoc, Expr *castExpr, 314987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation rParenLoc) : 31549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor ExplicitCastExpr(CXXFunctionalCastExprClass, ty, castExpr, writtenTy), 316987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {} 317987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 318987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } 319987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation getRParenLoc() const { return RParenLoc; } 320987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 321987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis virtual SourceRange getSourceRange() const { 322987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis return SourceRange(TyBeginLoc, RParenLoc); 323987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis } 324987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis static bool classof(const Stmt *T) { 325987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis return T->getStmtClass() == CXXFunctionalCastExprClass; 326987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis } 327987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis static bool classof(const CXXFunctionalCastExpr *) { return true; } 328987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 329987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis virtual void EmitImpl(llvm::Serializer& S) const; 330987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis static CXXFunctionalCastExpr * 331987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis CreateImpl(llvm::Deserializer& D, ASTContext& C); 332987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}; 333987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 334987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis/// CXXZeroInitValueExpr - [C++ 5.2.3p2] 335987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis/// Expression "T()" which creates a value-initialized Rvalue of non-class 336987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis/// type T. 337987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis/// 338987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisclass CXXZeroInitValueExpr : public Expr { 339987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation TyBeginLoc; 340987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation RParenLoc; 341987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 342987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidispublic: 343987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis CXXZeroInitValueExpr(QualType ty, SourceLocation tyBeginLoc, 344987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation rParenLoc ) : 345987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis Expr(CXXZeroInitValueExprClass, ty), 346987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc) {} 347987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 348987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation getTypeBeginLoc() const { return TyBeginLoc; } 349987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation getRParenLoc() const { return RParenLoc; } 350987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 351987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis virtual SourceRange getSourceRange() const { 352987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis return SourceRange(TyBeginLoc, RParenLoc); 353987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis } 354987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 355987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis static bool classof(const Stmt *T) { 356987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis return T->getStmtClass() == CXXZeroInitValueExprClass; 357987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis } 358987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis static bool classof(const CXXZeroInitValueExpr *) { return true; } 359987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 360987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis // Iterators 361987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis virtual child_iterator child_begin(); 362987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis virtual child_iterator child_end(); 363987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 364987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis virtual void EmitImpl(llvm::Serializer& S) const; 365987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis static CXXZeroInitValueExpr * 366987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis CreateImpl(llvm::Deserializer& D, ASTContext& C); 367987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}; 368987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 3699e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis/// CXXConditionDeclExpr - Condition declaration of a if/switch/while/for 3709e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis/// statement, e.g: "if (int x = f()) {...}". 3719e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis/// The main difference with DeclRefExpr is that CXXConditionDeclExpr owns the 3729e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis/// decl that it references. 3739e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis/// 3749e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidisclass CXXConditionDeclExpr : public DeclRefExpr { 3759e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidispublic: 3769e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis CXXConditionDeclExpr(SourceLocation startLoc, 3779e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis SourceLocation eqLoc, VarDecl *var) 3789d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor : DeclRefExpr(CXXConditionDeclExprClass, var, 3799d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor var->getType().getNonReferenceType(), startLoc) {} 3809e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 3819e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis virtual void Destroy(ASTContext& Ctx); 3829e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 3839e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis SourceLocation getStartLoc() const { return getLocation(); } 3849e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 3859e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis VarDecl *getVarDecl() { return cast<VarDecl>(getDecl()); } 3869e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis const VarDecl *getVarDecl() const { return cast<VarDecl>(getDecl()); } 3879e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 3889e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis virtual SourceRange getSourceRange() const { 3899e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis return SourceRange(getStartLoc(), getVarDecl()->getInit()->getLocEnd()); 3909e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis } 3919e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 3929e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis static bool classof(const Stmt *T) { 3939e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis return T->getStmtClass() == CXXConditionDeclExprClass; 3949e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis } 3959e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis static bool classof(const CXXConditionDeclExpr *) { return true; } 3969e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 3979e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis // Iterators 3989e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis virtual child_iterator child_begin(); 3999e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis virtual child_iterator child_end(); 4009e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 4019e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis // FIXME: Implement these. 4029e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis //virtual void EmitImpl(llvm::Serializer& S) const; 4039e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis //static CXXConditionDeclExpr * 4049e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis // CreateImpl(llvm::Deserializer& D, ASTContext& C); 4059e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis}; 4069e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 4075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 4085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 410