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