Expr.h revision 654f6b2b53af2c950c62ef0161fa021648accbcb
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Expr.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.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_AST_EXPR_H
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_AST_EXPR_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson#include "clang/AST/APValue.h"
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Stmt.h"
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Type.h"
20161755a09898c95d21bfff33707da9ca41cd53c5John McCall#include "clang/AST/DeclAccessPair.h"
215baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall#include "clang/AST/OperationKinds.h"
22709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek#include "clang/AST/ASTVector.h"
23409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson#include "clang/AST/UsuallyTinyPtrVector.h"
24f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne#include "clang/Basic/TypeTraits.h"
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/APSInt.h"
26525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner#include "llvm/ADT/APFloat.h"
273b8d116703db8018f855cbb4733ace426422623bNate Begeman#include "llvm/ADT/SmallVector.h"
28b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar#include "llvm/ADT/StringRef.h"
29403ba3522d1b1c97ae5fad81c1a2c4b3a754e1c1Nick Lewycky#include <cctype>
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
32590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner  class ASTContext;
33c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson  class APValue;
34c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar  class Decl;
35c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar  class IdentifierInfo;
36c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar  class ParmVarDecl;
378e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor  class NamedDecl;
38c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar  class ValueDecl;
3956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  class BlockDecl;
40409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson  class CXXBaseSpecifier;
4188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  class CXXOperatorCallExpr;
4288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  class CXXMemberCallExpr;
43f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  class ObjCPropertyRefExpr;
44833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  class TemplateArgumentLoc;
45d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  class TemplateArgumentListInfo;
4656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  class OpaqueValueExpr;
4788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
487ab9d574d27ecee1f130e5755aa403e5ab529b6bAnders Carlsson/// \brief A simple array of base specifiers.
49f871d0cc377a1367b519a6cce26be74607566ebaJohn McCalltypedef llvm::SmallVector<CXXBaseSpecifier*, 4> CXXCastPath;
507ab9d574d27ecee1f130e5755aa403e5ab529b6bAnders Carlsson
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Expr - This represents one expression.  Note that Expr's are subclasses of
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Stmt.  This allows an expression to be transparently used any place a Stmt
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// is required.
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Expr : public Stmt {
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  QualType TR;
57898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
588e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCallprotected:
59f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  Expr(StmtClass SC, QualType T, ExprValueKind VK, ExprObjectKind OK,
60bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor       bool TD, bool VD, bool ContainsUnexpandedParameterPack) : Stmt(SC) {
618e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    ExprBits.TypeDependent = TD;
628e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    ExprBits.ValueDependent = VD;
63f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    ExprBits.ValueKind = VK;
64f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    ExprBits.ObjectKind = OK;
65bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
66898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    setType(T);
67898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  }
68898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
690b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  /// \brief Construct an empty expression.
700b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  explicit Expr(StmtClass SC, EmptyShell) : Stmt(SC) { }
710b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
73f7c2aa0b049272d8f318988c1965760dcb852578Douglas Gregor  QualType getType() const { return TR; }
741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  void setType(QualType t) {
759d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    // In C++, the type of an expression is always adjusted so that it
769d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    // will not have reference type an expression will never have
779d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    // reference type (C++ [expr]p6). Use
789d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    // QualType::getNonReferenceType() to retrieve the non-reference
799d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    // type. Additionally, inspect Expr::isLvalue to determine whether
809d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    // an expression that is adjusted in this manner should be
819d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor    // considered an lvalue.
82905d11d53aeb6b26744f44fedc2b2820c7a62df6Douglas Gregor    assert((t.isNull() || !t->isReferenceType()) &&
838320aaaa01d931aa234fc3bce05b399ef41898d5Daniel Dunbar           "Expressions can't have reference type");
84f7c2aa0b049272d8f318988c1965760dcb852578Douglas Gregor
851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TR = t;
869d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor  }
8777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
88898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// isValueDependent - Determines whether this expression is
89898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// value-dependent (C++ [temp.dep.constexpr]). For example, the
90898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// array bound of "Chars" in the following example is
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// value-dependent.
92898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// @code
93898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// template<int Size, char (&Chars)[Size]> struct meta_string;
94898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// @endcode
958e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  bool isValueDependent() const { return ExprBits.ValueDependent; }
96898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
970b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  /// \brief Set whether this expression is value-dependent or not.
988e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  void setValueDependent(bool VD) { ExprBits.ValueDependent = VD; }
990b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
100898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// isTypeDependent - Determines whether this expression is
101898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// type-dependent (C++ [temp.dep.expr]), which means that its type
102898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// could change from one template instantiation to the next. For
103898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// example, the expressions "x" and "x + y" are type-dependent in
104898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// the following code, but "y" is not type-dependent:
105898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// @code
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// template<typename T>
107898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// void add(T x, int y) {
108898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  ///   x + y;
109898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// }
110898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  /// @endcode
1118e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  bool isTypeDependent() const { return ExprBits.TypeDependent; }
112898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
1130b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  /// \brief Set whether this expression is type-dependent or not.
1148e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  void setTypeDependent(bool TD) { ExprBits.TypeDependent = TD; }
1150b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
116d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// \brief Whether this expression contains an unexpanded parameter
117d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// pack (for C++0x variadic templates).
118d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  ///
119d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// Given the following function template:
120d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  ///
121d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// \code
122d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// template<typename F, typename ...Types>
123d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// void forward(const F &f, Types &&...args) {
124d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  ///   f(static_cast<Types&&>(args)...);
125d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// }
126d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// \endcode
127d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  ///
128d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// The expressions \c args and \c static_cast<Types&&>(args) both
129d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// contain parameter packs.
130d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  bool containsUnexpandedParameterPack() const {
131d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    return ExprBits.ContainsUnexpandedParameterPack;
132d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  }
133d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
134bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  /// \brief Set the bit that describes whether this expression
135bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  /// contains an unexpanded parameter pack.
136bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  void setContainsUnexpandedParameterPack(bool PP = true) {
137bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    ExprBits.ContainsUnexpandedParameterPack = PP;
138bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
139bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getExprLoc - Return the preferred location for the arrow when diagnosing
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// a problem with a generic expression.
14263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceLocation getExprLoc() const;
1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
144026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  /// isUnusedResultAWarning - Return true if this immediate expression should
145026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  /// be warned about if the result is unused.  If so, fill in Loc and Ranges
146026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  /// with location to warn on and the source range[s] to report with the
147026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  /// warning.
148026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  bool isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,
149df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                              SourceRange &R2, ASTContext &Ctx) const;
1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1517eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// isLValue - True if this expression is an "l-value" according to
1527eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// the rules of the current language.  C and C++ give somewhat
1537eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// different rules for this concept, but in general, the result of
1547eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// an l-value expression identifies a specific object whereas the
1557eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// result of an r-value expression is a value detached from any
1567eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// specific storage.
1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1587eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// C++0x divides the concept of "r-value" into pure r-values
1597eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// ("pr-values") and so-called expiring values ("x-values"), which
1607eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// identify specific objects that can be safely cannibalized for
1617eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// their resources.  This is an unfortunate abuse of terminology on
1627eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// the part of the C++ committee.  In Clang, when we say "r-value",
1637eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// we generally mean a pr-value.
1647eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  bool isLValue() const { return getValueKind() == VK_LValue; }
1657eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  bool isRValue() const { return getValueKind() == VK_RValue; }
1667eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  bool isXValue() const { return getValueKind() == VK_XValue; }
1677eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  bool isGLValue() const { return getValueKind() != VK_RValue; }
1687eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall
1697eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  enum LValueClassification {
1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    LV_Valid,
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    LV_NotObjectType,
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    LV_IncompleteVoidType,
173fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff    LV_DuplicateVectorComponents,
17486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor    LV_InvalidExpression,
175077f490d0a514dcc448475f33f799934252b85a7Fariborz Jahanian    LV_InvalidMessageExpression,
1762514a309204341798f96912ce7a90841bea59727Fariborz Jahanian    LV_MemberFunction,
177e9ff443040cb571ae2c5c2626c4dc9a9a812d84aFariborz Jahanian    LV_SubObjCPropertySetting,
178e873fb74219f48407ae0b8fa083aa7f0b6ff1427Douglas Gregor    LV_ClassTemporary
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  };
1807eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  /// Reasons why an expression might not be an l-value.
1817eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  LValueClassification ClassifyLValue(ASTContext &Ctx) const;
18253202857c60214d80950a975e6e52aebf30bd16aEli Friedman
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type,
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// does not have an incomplete type, does not have a const-qualified type,
1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and if it is a structure or union, does not have any member (including,
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// recursively, any member or element of all contained aggregates or unions)
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// with a const-qualified type.
18844e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar  ///
18944e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar  /// \param Loc [in] [out] - A source location which *may* be filled
19044e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar  /// in with the location of the expression making this a
19144e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar  /// non-modifiable lvalue, if specified.
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  enum isModifiableLvalueResult {
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    MLV_Valid,
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    MLV_NotObjectType,
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    MLV_IncompleteVoidType,
196fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff    MLV_DuplicateVectorComponents,
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    MLV_InvalidExpression,
198ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner    MLV_LValueCast,           // Specialized form of MLV_InvalidExpression.
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    MLV_IncompleteType,
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    MLV_ConstQualified,
2014f6a7d7ead09b439216c32f2de806a998aeb222aSteve Naroff    MLV_ArrayType,
2025daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian    MLV_NotBlockQualified,
203ba8d2d684e74a20bef03828c21c991d222c7e9e5Fariborz Jahanian    MLV_ReadonlyProperty,
20486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor    MLV_NoSetterProperty,
2052514a309204341798f96912ce7a90841bea59727Fariborz Jahanian    MLV_MemberFunction,
206e9ff443040cb571ae2c5c2626c4dc9a9a812d84aFariborz Jahanian    MLV_SubObjCPropertySetting,
207077f490d0a514dcc448475f33f799934252b85a7Fariborz Jahanian    MLV_InvalidMessageExpression,
208e873fb74219f48407ae0b8fa083aa7f0b6ff1427Douglas Gregor    MLV_ClassTemporary
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  };
21044e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar  isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx,
21144e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar                                              SourceLocation *Loc = 0) const;
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2132111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// \brief The return type of classify(). Represents the C++0x expression
2142111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  ///        taxonomy.
2152111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  class Classification {
2162111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  public:
2172111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    /// \brief The various classification results. Most of these mean prvalue.
2182111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    enum Kinds {
2192111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CL_LValue,
2202111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CL_XValue,
2212111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CL_Function, // Functions cannot be lvalues in C.
2222111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CL_Void, // Void cannot be an lvalue in C.
2231c860d5640e8eebb11a5d515a761242b66761b0bPeter Collingbourne      CL_AddressableVoid, // Void expression whose address can be taken in C.
2242111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CL_DuplicateVectorComponents, // A vector shuffle with dupes.
2252111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CL_MemberFunction, // An expression referring to a member function
2262111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CL_SubObjCPropertySetting,
2272111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CL_ClassTemporary, // A prvalue of class type
228077f490d0a514dcc448475f33f799934252b85a7Fariborz Jahanian      CL_ObjCMessageRValue, // ObjC message is an rvalue
2292111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CL_PRValue // A prvalue for any other reason, of any other type
2302111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    };
2312111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    /// \brief The results of modification testing.
2322111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    enum ModifiableType {
2332111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CM_Untested, // testModifiable was false.
2342111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CM_Modifiable,
2352111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CM_RValue, // Not modifiable because it's an rvalue
2362111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CM_Function, // Not modifiable because it's a function; C++ only
2372111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CM_LValueCast, // Same as CM_RValue, but indicates GCC cast-as-lvalue ext
2382111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CM_NotBlockQualified, // Not captured in the closure
2392111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CM_NoSetterProperty,// Implicit assignment to ObjC property without setter
2402111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CM_ConstQualified,
2412111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CM_ArrayType,
2422111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      CM_IncompleteType
2432111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    };
2442111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl
2452111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  private:
2462111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    friend class Expr;
2472111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl
2482111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    unsigned short Kind;
2492111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    unsigned short Modifiable;
2502111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl
2512111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    explicit Classification(Kinds k, ModifiableType m)
2522111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      : Kind(k), Modifiable(m)
2532111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    {}
2542111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl
2552111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  public:
2562111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    Classification() {}
2572111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl
2582111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    Kinds getKind() const { return static_cast<Kinds>(Kind); }
2592111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    ModifiableType getModifiable() const {
2602111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      assert(Modifiable != CM_Untested && "Did not test for modifiability.");
2612111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl      return static_cast<ModifiableType>(Modifiable);
2622111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    }
2632111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    bool isLValue() const { return Kind == CL_LValue; }
2642111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    bool isXValue() const { return Kind == CL_XValue; }
2652111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    bool isGLValue() const { return Kind <= CL_XValue; }
2662111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    bool isPRValue() const { return Kind >= CL_Function; }
2672111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    bool isRValue() const { return Kind >= CL_XValue; }
2682111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    bool isModifiable() const { return getModifiable() == CM_Modifiable; }
2692c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor
2702c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor    /// \brief Create a simple, modifiably lvalue
2712c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor    static Classification makeSimpleLValue() {
2722c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor      return Classification(CL_LValue, CM_Modifiable);
2732c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor    }
2742c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor
2752111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  };
276369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  /// \brief Classify - Classify this expression according to the C++0x
2772111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  ///        expression taxonomy.
2782111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  ///
2792111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// C++0x defines ([basic.lval]) a new taxonomy of expressions to replace the
2802111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// old lvalue vs rvalue. This function determines the type of expression this
2812111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// is. There are three expression types:
2822111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// - lvalues are classical lvalues as in C++03.
2832111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// - prvalues are equivalent to rvalues in C++03.
2842111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// - xvalues are expressions yielding unnamed rvalue references, e.g. a
2852111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  ///   function returning an rvalue reference.
2862111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// lvalues and xvalues are collectively referred to as glvalues, while
2872111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// prvalues and xvalues together form rvalues.
2882111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  Classification Classify(ASTContext &Ctx) const {
2892111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    return ClassifyImpl(Ctx, 0);
2902111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  }
2912111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl
292369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  /// \brief ClassifyModifiable - Classify this expression according to the
2932111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  ///        C++0x expression taxonomy, and see if it is valid on the left side
2942111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  ///        of an assignment.
2952111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  ///
2962111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// This function extends classify in that it also tests whether the
2972111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// expression is modifiable (C99 6.3.2.1p1).
2982111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  /// \param Loc A source location that might be filled with a relevant location
2992111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  ///            if the expression is not modifiable.
3002111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  Classification ClassifyModifiable(ASTContext &Ctx, SourceLocation &Loc) const{
3012111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl    return ClassifyImpl(Ctx, &Loc);
3022111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  }
3032111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl
304f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  /// getValueKindForType - Given a formal return or parameter type,
305f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  /// give its value kind.
306f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  static ExprValueKind getValueKindForType(QualType T) {
307f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    if (const ReferenceType *RT = T->getAs<ReferenceType>())
3080943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall      return (isa<LValueReferenceType>(RT)
3090943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall                ? VK_LValue
3100943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall                : (RT->getPointeeType()->isFunctionType()
3110943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall                     ? VK_LValue : VK_XValue));
312f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    return VK_RValue;
313f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  }
314f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall
315f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  /// getValueKind - The value kind that this expression produces.
316f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  ExprValueKind getValueKind() const {
317f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    return static_cast<ExprValueKind>(ExprBits.ValueKind);
318f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  }
319f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall
320f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  /// getObjectKind - The object kind that this expression produces.
321f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  /// Object kinds are meaningful only for expressions that yield an
322f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  /// l-value or x-value.
323f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  ExprObjectKind getObjectKind() const {
324f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    return static_cast<ExprObjectKind>(ExprBits.ObjectKind);
325f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  }
326f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall
32756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  bool isOrdinaryOrBitFieldObject() const {
32856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    ExprObjectKind OK = getObjectKind();
32956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return (OK == OK_Ordinary || OK == OK_BitField);
33056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
33156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
332f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  /// setValueKind - Set the value kind produced by this expression.
333f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  void setValueKind(ExprValueKind Cat) { ExprBits.ValueKind = Cat; }
334f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall
335f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  /// setObjectKind - Set the object kind produced by this expression.
336f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  void setObjectKind(ExprObjectKind Cat) { ExprBits.ObjectKind = Cat; }
337f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall
3382111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redlprivate:
3392111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl  Classification ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const;
3402111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl
3412111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redlpublic:
3422111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl
34333bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor  /// \brief If this expression refers to a bit-field, retrieve the
34433bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor  /// declaration of that bit-field.
34533bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor  FieldDecl *getBitField();
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
34738d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson  const FieldDecl *getBitField() const {
34838d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson    return const_cast<Expr*>(this)->getBitField();
34938d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson  }
3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
351f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  /// \brief If this expression is an l-value for an Objective C
352f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  /// property, find the underlying property reference expression.
353f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  const ObjCPropertyRefExpr *getObjCProperty() const;
354f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
355093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  /// \brief Returns whether this expression refers to a vector element.
356093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  bool refersToVectorElement() const;
357c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3582b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  /// isKnownToHaveBooleanValue - Return true if this is an integer expression
3592b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  /// that is known to return 0 or 1.  This happens for _Bool/bool expressions
3602b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  /// but also int expressions which are produced by things like comparisons in
3612b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  /// C.
3622b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  bool isKnownToHaveBooleanValue() const;
363c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isIntegerConstantExpr - Return true if this expression is a valid integer
3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// constant expression, and, if so, return its value in Result.  If not a
3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// valid i-c-e, return false and fill in Loc (if specified) with the location
3675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// of the invalid expression.
368590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner  bool isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx,
369590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner                             SourceLocation *Loc = 0,
3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                             bool isEvaluated = true) const;
371590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner  bool isIntegerConstantExpr(ASTContext &Ctx, SourceLocation *Loc = 0) const {
3728070a8497c0fb3e6f70a557f788405d8945b1208Daniel Dunbar    llvm::APSInt X;
373590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner    return isIntegerConstantExpr(X, Ctx, Loc);
3745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
375c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedman  /// isConstantInitializer - Returns true if this expression is a constant
376c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedman  /// initializer, which can be emitted at compile-time.
3774204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  bool isConstantInitializer(ASTContext &Ctx, bool ForRef) const;
3781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37994deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  /// EvalResult is a struct with detailed info about an evaluated expression.
38094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  struct EvalResult {
3812d6744ff04c1690a1485178d550d2fab84a0270bDaniel Dunbar    /// Val - This is the value the expression can be folded to.
38294deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    APValue Val;
3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38494deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    /// HasSideEffects - Whether the evaluated expression has side effects.
38594deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    /// For example, (f() && 0) can be folded, but it still has side effects.
38694deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    bool HasSideEffects;
3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38894deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    /// Diag - If the expression is unfoldable, then Diag contains a note
38994deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    /// diagnostic indicating why it's not foldable. DiagLoc indicates a caret
39094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    /// position for the error, and DiagExpr is the expression that caused
39194deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    /// the error.
39294deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    /// If the expression is foldable, but not an integer constant expression,
39394deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    /// Diag contains a note diagnostic that describes why it isn't an integer
39494deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    /// constant expression. If the expression *is* an integer constant
39594deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    /// expression, then Diag will be zero.
39694deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    unsigned Diag;
39794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    const Expr *DiagExpr;
39894deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    SourceLocation DiagLoc;
3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson    EvalResult() : HasSideEffects(false), Diag(0), DiagExpr(0) {}
401e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara
402e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara    // isGlobalLValue - Return true if the evaluated lvalue expression
403e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara    // is global.
404e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara    bool isGlobalLValue() const;
405e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara    // hasSideEffects - Return true if the evaluated expression has
406e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara    // side effects.
407e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara    bool hasSideEffects() const {
408e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara      return HasSideEffects;
409e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara    }
41094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson  };
41194deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson
4126ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner  /// Evaluate - Return true if this is a constant which we can fold using
413019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  /// any crazy technique (that has nothing to do with language standards) that
414019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  /// we want to.  If this function returns true, it returns the folded constant
415019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  /// in Result.
4164ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  bool Evaluate(EvalResult &Result, const ASTContext &Ctx) const;
4175b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson
418cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall  /// EvaluateAsBooleanCondition - Return true if this is a constant
419cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall  /// which we we can fold and convert to a boolean condition using
420cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall  /// any crazy technique that we want to.
4214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx) const;
422cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall
4236ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner  /// isEvaluatable - Call Evaluate to see if this expression can be constant
42445b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner  /// folded, but discard the result.
4254ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  bool isEvaluatable(const ASTContext &Ctx) const;
426c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson
4276ddf4784a22b994b954ed74c6061d4603d474639Fariborz Jahanian  /// HasSideEffects - This routine returns true for all those expressions
428138d6a6890c171068ac60430431eaadb3fcef9abGabor Greif  /// which must be evaluated each time and must not be optimized away
4296ddf4784a22b994b954ed74c6061d4603d474639Fariborz Jahanian  /// or evaluated at compile time. Example is a function call, volatile
4306ddf4784a22b994b954ed74c6061d4603d474639Fariborz Jahanian  /// variable read.
4314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  bool HasSideEffects(const ASTContext &Ctx) const;
432c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  /// EvaluateAsInt - Call Evaluate and return the folded integer. This
43451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  /// must be called on an expression that constant folds to an integer.
4354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  llvm::APSInt EvaluateAsInt(const ASTContext &Ctx) const;
43651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
437b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman  /// EvaluateAsLValue - Evaluate an expression to see if it's a lvalue
438b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman  /// with link time known address.
4394ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const;
4401b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson
441e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara  /// EvaluateAsLValue - Evaluate an expression to see if it's a lvalue.
4424ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  bool EvaluateAsAnyLValue(EvalResult &Result, const ASTContext &Ctx) const;
443e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara
44482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth  /// \brief Enumeration used to describe the kind of Null pointer constant
44582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth  /// returned from \c isNullPointerConstant().
44682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth  enum NullPointerConstantKind {
44782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    /// \brief Expression is not a Null pointer constant.
44882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    NPCK_NotNull = 0,
44982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth
45082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    /// \brief Expression is a Null pointer constant built from a zero integer.
45182214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    NPCK_ZeroInteger,
45282214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth
45382214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    /// \brief Expression is a C++0X nullptr.
45482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    NPCK_CXX0X_nullptr,
45582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth
45682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    /// \brief Expression is a GNU-style __null constant.
45782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    NPCK_GNUNull
45882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth  };
45982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth
460ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  /// \brief Enumeration used to describe how \c isNullPointerConstant()
461ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  /// should cope with value-dependent expressions.
462ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  enum NullPointerConstantValueDependence {
463ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    /// \brief Specifies that the expression should never be value-dependent.
464ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    NPC_NeverValueDependent = 0,
465c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
466ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    /// \brief Specifies that a value-dependent expression of integral or
467ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    /// dependent type should be considered a null pointer constant.
468ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    NPC_ValueDependentIsNull,
469c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
470ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    /// \brief Specifies that a value-dependent expression should be considered
471ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    /// to never be a null pointer constant.
472ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    NPC_ValueDependentIsNotNull
473ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  };
474c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
47582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth  /// isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to
47682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth  /// a Null pointer constant. The return value can further distinguish the
47782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth  /// kind of NULL pointer constant that was detected.
47882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth  NullPointerConstantKind isNullPointerConstant(
47982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth      ASTContext &Ctx,
48082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth      NullPointerConstantValueDependence NPC) const;
481efa9b3877ef298bcb792600ac33521827e1f7fafAnders Carlsson
48244baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  /// isOBJCGCCandidate - Return true if this expression may be used in a read/
4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// write barrier.
484102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian  bool isOBJCGCCandidate(ASTContext &Ctx) const;
4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48611ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis  /// \brief Returns true if this expression is a bound member function.
48711ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis  bool isBoundMemberFunction(ASTContext &Ctx) const;
48811ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis
489864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  /// \brief Given an expression of bound-member type, find the type
490864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  /// of the member.  Returns null if this is an *overloaded* bound
491864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  /// member expression.
492864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  static QualType findBoundMemberType(const Expr *expr);
493864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
494369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  /// \brief Result type of CanThrow().
495369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  enum CanThrowResult {
496369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CT_Cannot,
497369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CT_Dependent,
498369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CT_Can
499369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  };
500369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  /// \brief Test if this expression, if evaluated, might throw, according to
501369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  ///        the rules of C++ [expr.unary.noexcept].
502369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  CanThrowResult CanThrow(ASTContext &C) const;
503369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
5044e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek  /// IgnoreParens - Ignore parentheses.  If this Expr is a ParenExpr, return
5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///  its subexpression.  If that subexpression is also a ParenExpr,
5064e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek  ///  then this method recursively returns its subexpression, and so forth.
5074e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek  ///  Otherwise, the method returns the current Expr.
5082b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  Expr *IgnoreParens();
50956f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner
51056f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  /// IgnoreParenCasts - Ignore parentheses and casts.  Strip off any ParenExpr
51127c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor  /// or CastExprs, returning their operand.
51256f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  Expr *IgnoreParenCasts();
5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5142fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall  /// IgnoreParenImpCasts - Ignore parentheses and implicit casts.  Strip off any
5152fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall  /// ParenExpr or ImplicitCastExprs, returning their operand.
5162fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall  Expr *IgnoreParenImpCasts();
5172fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall
5184d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek  const Expr *IgnoreParenImpCasts() const {
5194d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek    return const_cast<Expr*>(this)->IgnoreParenImpCasts();
5204d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek  }
521f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
522f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  /// Ignore parentheses and lvalue casts.  Strip off any ParenExpr and
523f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  /// CastExprs that represent lvalue casts, returning their operand.
524f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  Expr *IgnoreParenLValueCasts();
525f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
526f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  const Expr *IgnoreParenLValueCasts() const {
527f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    return const_cast<Expr*>(this)->IgnoreParenLValueCasts();
528f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  }
5294d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek
530ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  /// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the
531ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  /// value (including ptr->int casts of the same size).  Strip off any
532ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  /// ParenExpr or CastExprs, returning their operand.
533ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  Expr *IgnoreParenNoopCasts(ASTContext &Ctx);
5341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5356eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// \brief Determine whether this expression is a default function argument.
5366eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  ///
5376eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// Default arguments are implicitly generated in the abstract syntax tree
538c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// by semantic analysis for function calls, object constructions, etc. in
5396eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes;
5406eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// this routine also looks through any implicit casts to determine whether
5416eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// the expression is a default argument.
5426eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  bool isDefaultArgument() const;
543c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
544558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  /// \brief Determine whether the result of this expression is a
545558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  /// temporary object of the given class type.
546558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const;
5472f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
54875e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  /// \brief Whether this expression is an implicit reference to 'this' in C++.
54975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  bool isImplicitCXXThis() const;
55075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
5512b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  const Expr *IgnoreParens() const {
5524e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek    return const_cast<Expr*>(this)->IgnoreParens();
5534e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek  }
55456f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  const Expr *IgnoreParenCasts() const {
55556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner    return const_cast<Expr*>(this)->IgnoreParenCasts();
55656f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  }
557ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  const Expr *IgnoreParenNoopCasts(ASTContext &Ctx) const {
558ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    return const_cast<Expr*>(this)->IgnoreParenNoopCasts(Ctx);
559ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  }
5601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
561898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  static bool hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs);
562898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  static bool hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs);
563898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
5641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
5655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return T->getStmtClass() >= firstExprConstant &&
5661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump           T->getStmtClass() <= lastExprConstant;
5675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Expr *) { return true; }
5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5725549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek//===----------------------------------------------------------------------===//
5735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Primary Expressions.
5745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
57656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// OpaqueValueExpr - An expression referring to an opaque object of a
57756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// fixed type and value class.  These don't correspond to concrete
57856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// syntax; instead they're used to express operations (usually copy
57956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// operations) on values whose source is generally obvious from
58056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// context.
58156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass OpaqueValueExpr : public Expr {
58256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  friend class ASTStmtReader;
58356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *SourceExpr;
58456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  SourceLocation Loc;
58556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
58656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic:
58756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK,
58856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                  ExprObjectKind OK = OK_Ordinary)
58956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    : Expr(OpaqueValueExprClass, T, VK, OK,
59056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall           T->isDependentType(), T->isDependentType(), false),
59156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      SourceExpr(0), Loc(Loc) {
59256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
59356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
59456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// Given an expression which invokes a copy constructor --- i.e.  a
59556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// CXXConstructExpr, possibly wrapped in an ExprWithCleanups ---
59656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// find the OpaqueValueExpr that's the source of the construction.
59756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  static const OpaqueValueExpr *findInCopyConstruct(const Expr *expr);
59856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
59956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  explicit OpaqueValueExpr(EmptyShell Empty)
60056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    : Expr(OpaqueValueExprClass, Empty) { }
60156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
60256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// \brief Retrieve the location of this expression.
60356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  SourceLocation getLocation() const { return Loc; }
60456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
60556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  SourceRange getSourceRange() const {
60656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    if (SourceExpr) return SourceExpr->getSourceRange();
60756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return Loc;
60856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
60956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  SourceLocation getExprLoc() const {
61056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    if (SourceExpr) return SourceExpr->getExprLoc();
61156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return Loc;
61256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
61356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
61456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  child_range children() { return child_range(); }
61556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
61656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// The source expression of an opaque value expression is the
61756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// expression which originally generated the value.  This is
61856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// provided as a convenience for analyses that don't wish to
61956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// precisely model the execution behavior of the program.
62056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ///
62156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// The source expression is typically set when building the
62256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// expression which binds the opaque value expression in the first
62356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// place.
62456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *getSourceExpr() const { return SourceExpr; }
62556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  void setSourceExpr(Expr *e) { SourceExpr = e; }
62656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
62756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  static bool classof(const Stmt *T) {
62856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return T->getStmtClass() == OpaqueValueExprClass;
62956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
63056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  static bool classof(const OpaqueValueExpr *) { return true; }
63156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall};
63256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
633a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// \brief Represents the qualifier that may precede a C++ name, e.g., the
634a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// "std::" in "std::sort".
635a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregorstruct NameQualifier {
63640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  /// \brief The nested-name-specifier that qualifies the name, including
63740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  /// source-location information.
63840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  NestedNameSpecifierLoc QualifierLoc;
639a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor};
640a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
641a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// \brief Represents an explicit template argument list in C++, e.g.,
642a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// the "<int>" in "sort<int>".
643a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregorstruct ExplicitTemplateArgumentList {
644a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief The source location of the left angle bracket ('<');
645a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  SourceLocation LAngleLoc;
646c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
647a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief The source location of the right angle bracket ('>');
648a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  SourceLocation RAngleLoc;
649c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
650a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief The number of template arguments in TemplateArgs.
651a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// The actual template arguments (if any) are stored after the
652a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// ExplicitTemplateArgumentList structure.
653a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  unsigned NumTemplateArgs;
654c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
655a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief Retrieve the template arguments
656833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateArgumentLoc *getTemplateArgs() {
657833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return reinterpret_cast<TemplateArgumentLoc *> (this + 1);
658a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
659c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
660a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief Retrieve the template arguments
661833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgumentLoc *getTemplateArgs() const {
662833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return reinterpret_cast<const TemplateArgumentLoc *> (this + 1);
663a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
664d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
665d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  void initializeFrom(const TemplateArgumentListInfo &List);
666bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  void initializeFrom(const TemplateArgumentListInfo &List,
667bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                      bool &Dependent, bool &ContainsUnexpandedParameterPack);
668d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  void copyInto(TemplateArgumentListInfo &List) const;
6698dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  static std::size_t sizeFor(unsigned NumTemplateArgs);
670d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  static std::size_t sizeFor(const TemplateArgumentListInfo &List);
671a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor};
672c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DeclRefExpr - [C99 6.5.1p2] - A reference to a declared variable, function,
6745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// enum, etc.
6755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DeclRefExpr : public Expr {
676a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  enum {
677c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    // Flag on DecoratedD that specifies when this declaration reference
678a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    // expression has a C++ nested-name-specifier.
679a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    HasQualifierFlag = 0x01,
680c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    // Flag on DecoratedD that specifies when this declaration reference
681a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    // expression has an explicit C++ template argument list.
682a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    HasExplicitTemplateArgumentListFlag = 0x02
683a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  };
684c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
685c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // DecoratedD - The declaration that we are referencing, plus two bits to
686a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  // indicate whether (1) the declaration's name was explicitly qualified and
687c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // (2) the declaration's name was followed by an explicit template
688a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  // argument list.
689dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  llvm::PointerIntPair<ValueDecl *, 2> DecoratedD;
6902577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
691a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  // Loc - The location of the declaration name itself.
6925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation Loc;
6939e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis
6942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  /// DNLoc - Provides source/type location info for the
6952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  /// declaration name embedded in DecoratedD.
6962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameLoc DNLoc;
6972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
698a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief Retrieve the qualifier that preceded the declaration name, if any.
699a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NameQualifier *getNameQualifier() {
7002cf719c3c3d805f630dfc6b1255e52647820888eSebastian Redl    if ((DecoratedD.getInt() & HasQualifierFlag) == 0)
701a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return 0;
702c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
703a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    return reinterpret_cast<NameQualifier *> (this + 1);
704a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
705c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
706a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief Retrieve the qualifier that preceded the member name, if any.
707a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  const NameQualifier *getNameQualifier() const {
708a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    return const_cast<DeclRefExpr *>(this)->getNameQualifier();
709a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
710096832c5ed5b9106fa177ebc148489760c3bc496John McCall
71140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  DeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
712dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall              ValueDecl *D, SourceLocation NameLoc,
713d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall              const TemplateArgumentListInfo *TemplateArgs,
714f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall              QualType T, ExprValueKind VK);
715663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
71640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  DeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
7172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara              ValueDecl *D, const DeclarationNameInfo &NameInfo,
7182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara              const TemplateArgumentListInfo *TemplateArgs,
719f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall              QualType T, ExprValueKind VK);
7202577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
721663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  /// \brief Construct an empty declaration reference expression.
722663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  explicit DeclRefExpr(EmptyShell Empty)
723663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    : Expr(DeclRefExprClass, Empty) { }
724c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7250da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  /// \brief Computes the type- and value-dependence flags for this
7260da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  /// declaration reference expression.
7270da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  void computeDependence();
7289e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis
7295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
730f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  DeclRefExpr(ValueDecl *d, QualType t, ExprValueKind VK, SourceLocation l) :
731bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    Expr(DeclRefExprClass, t, VK, OK_Ordinary, false, false, false),
732f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    DecoratedD(d, 0), Loc(l) {
7330da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor    computeDependence();
7340da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  }
7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
736a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  static DeclRefExpr *Create(ASTContext &Context,
73740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                             NestedNameSpecifierLoc QualifierLoc,
738dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                             ValueDecl *D,
739a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                             SourceLocation NameLoc,
740f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                             QualType T, ExprValueKind VK,
7410da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                             const TemplateArgumentListInfo *TemplateArgs = 0);
742663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
7432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  static DeclRefExpr *Create(ASTContext &Context,
74440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                             NestedNameSpecifierLoc QualifierLoc,
7452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             ValueDecl *D,
7462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             const DeclarationNameInfo &NameInfo,
747f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                             QualType T, ExprValueKind VK,
7482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             const TemplateArgumentListInfo *TemplateArgs = 0);
7492577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
750663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  /// \brief Construct an empty declaration reference expression.
751663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  static DeclRefExpr *CreateEmpty(ASTContext &Context,
752def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                  bool HasQualifier,
753def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                  bool HasExplicitTemplateArgs,
754def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                  unsigned NumTemplateArgs);
755c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
756dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *getDecl() { return DecoratedD.getPointer(); }
757dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  const ValueDecl *getDecl() const { return DecoratedD.getPointer(); }
758dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  void setDecl(ValueDecl *NewD) { DecoratedD.setPointer(NewD); }
759904eed3f6148758d39a2d3c88f3133274460d645Douglas Gregor
7602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo getNameInfo() const {
7612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return DeclarationNameInfo(getDecl()->getDeclName(), Loc, DNLoc);
7622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
7632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
7649e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis  SourceLocation getLocation() const { return Loc; }
7650b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  void setLocation(SourceLocation L) { Loc = L; }
76663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const;
7671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
768a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief Determine whether this declaration reference was preceded by a
769a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// C++ nested-name-specifier, e.g., \c N::foo.
770a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  bool hasQualifier() const { return DecoratedD.getInt() & HasQualifierFlag; }
771c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
772c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// \brief If the name was qualified, retrieves the nested-name-specifier
773a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// that precedes the name. Otherwise, returns NULL.
774a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *getQualifier() const {
775a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!hasQualifier())
776a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return 0;
777c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
77840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    return getNameQualifier()->QualifierLoc.getNestedNameSpecifier();
779a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
78040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor
78140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  /// \brief If the name was qualified, retrieves the nested-name-specifier
78240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  /// that precedes the name, with source-location information.
78340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  NestedNameSpecifierLoc getQualifierLoc() const {
78440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    if (!hasQualifier())
78540d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      return NestedNameSpecifierLoc();
78640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor
78740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    return getNameQualifier()->QualifierLoc;
78840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  }
78940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor
790096832c5ed5b9106fa177ebc148489760c3bc496John McCall  bool hasExplicitTemplateArgs() const {
791096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return (DecoratedD.getInt() & HasExplicitTemplateArgumentListFlag);
792096832c5ed5b9106fa177ebc148489760c3bc496John McCall  }
793096832c5ed5b9106fa177ebc148489760c3bc496John McCall
794096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// \brief Retrieve the explicit template argument list that followed the
795096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// member template name.
796096832c5ed5b9106fa177ebc148489760c3bc496John McCall  ExplicitTemplateArgumentList &getExplicitTemplateArgs() {
797096832c5ed5b9106fa177ebc148489760c3bc496John McCall    assert(hasExplicitTemplateArgs());
798096832c5ed5b9106fa177ebc148489760c3bc496John McCall
799096832c5ed5b9106fa177ebc148489760c3bc496John McCall    if ((DecoratedD.getInt() & HasQualifierFlag) == 0)
800096832c5ed5b9106fa177ebc148489760c3bc496John McCall      return *reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1);
801096832c5ed5b9106fa177ebc148489760c3bc496John McCall
802096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return *reinterpret_cast<ExplicitTemplateArgumentList *>(
803096832c5ed5b9106fa177ebc148489760c3bc496John McCall                                                      getNameQualifier() + 1);
804096832c5ed5b9106fa177ebc148489760c3bc496John McCall  }
805096832c5ed5b9106fa177ebc148489760c3bc496John McCall
806096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// \brief Retrieve the explicit template argument list that followed the
807096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// member template name.
808096832c5ed5b9106fa177ebc148489760c3bc496John McCall  const ExplicitTemplateArgumentList &getExplicitTemplateArgs() const {
809096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return const_cast<DeclRefExpr *>(this)->getExplicitTemplateArgs();
810a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
811d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
812096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// \brief Retrieves the optional explicit template arguments.
813096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// This points to the same data as getExplicitTemplateArgs(), but
814096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// returns null if there are no explicit template arguments.
815096832c5ed5b9106fa177ebc148489760c3bc496John McCall  const ExplicitTemplateArgumentList *getExplicitTemplateArgsOpt() const {
816096832c5ed5b9106fa177ebc148489760c3bc496John McCall    if (!hasExplicitTemplateArgs()) return 0;
817096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return &getExplicitTemplateArgs();
818096832c5ed5b9106fa177ebc148489760c3bc496John McCall  }
819096832c5ed5b9106fa177ebc148489760c3bc496John McCall
820d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  /// \brief Copies the template arguments (if present) into the given
821d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  /// structure.
822d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
823096832c5ed5b9106fa177ebc148489760c3bc496John McCall    if (hasExplicitTemplateArgs())
824096832c5ed5b9106fa177ebc148489760c3bc496John McCall      getExplicitTemplateArgs().copyInto(List);
825d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
826c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
827a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief Retrieve the location of the left angle bracket following the
828a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// member name ('<'), if any.
829a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  SourceLocation getLAngleLoc() const {
830096832c5ed5b9106fa177ebc148489760c3bc496John McCall    if (!hasExplicitTemplateArgs())
831a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SourceLocation();
832c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
833096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return getExplicitTemplateArgs().LAngleLoc;
834a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
835c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
836a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief Retrieve the template arguments provided as part of this
837a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// template-id.
838833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgumentLoc *getTemplateArgs() const {
839096832c5ed5b9106fa177ebc148489760c3bc496John McCall    if (!hasExplicitTemplateArgs())
840a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return 0;
841c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
842096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return getExplicitTemplateArgs().getTemplateArgs();
843a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
844c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
845a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief Retrieve the number of template arguments provided as part of this
846a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// template-id.
847a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  unsigned getNumTemplateArgs() const {
848096832c5ed5b9106fa177ebc148489760c3bc496John McCall    if (!hasExplicitTemplateArgs())
849a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return 0;
850c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
851096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return getExplicitTemplateArgs().NumTemplateArgs;
852a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
853c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
854a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// \brief Retrieve the location of the right angle bracket following the
855a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  /// template arguments ('>').
856a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  SourceLocation getRAngleLoc() const {
857096832c5ed5b9106fa177ebc148489760c3bc496John McCall    if (!hasExplicitTemplateArgs())
858a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SourceLocation();
859c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
860096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return getExplicitTemplateArgs().RAngleLoc;
861a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
862c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
86499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return T->getStmtClass() == DeclRefExprClass;
8655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const DeclRefExpr *) { return true; }
8671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
86963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
870663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
87160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl  friend class ASTStmtReader;
8723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  friend class ASTStmtWriter;
8735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
8745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
875d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner/// PredefinedExpr - [C99 6.4.2.2] - A predefined identifier such as __func__.
876d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnerclass PredefinedExpr : public Expr {
877227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonpublic:
878227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  enum IdentType {
879227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    Func,
880227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    Function,
881848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson    PrettyFunction,
882848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson    /// PrettyFunctionNoVirtual - The same as PrettyFunction, except that the
883848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson    /// 'virtual' keyword is omitted for virtual member functions.
884848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson    PrettyFunctionNoVirtual
885227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  };
8861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
887227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonprivate:
888227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  SourceLocation Loc;
889227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  IdentType Type;
890227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonpublic:
8911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  PredefinedExpr(SourceLocation l, QualType type, IdentType IT)
892f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : Expr(PredefinedExprClass, type, VK_LValue, OK_Ordinary,
893bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           type->isDependentType(), type->isDependentType(),
894bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           /*ContainsUnexpandedParameterPack=*/false),
895f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      Loc(l), Type(IT) {}
8961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
89717fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor  /// \brief Construct an empty predefined expression.
8981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  explicit PredefinedExpr(EmptyShell Empty)
89917fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor    : Expr(PredefinedExprClass, Empty) { }
90017fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor
901227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  IdentType getIdentType() const { return Type; }
90217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor  void setIdentType(IdentType IT) { Type = IT; }
90317fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor
90417fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor  SourceLocation getLocation() const { return Loc; }
90517fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor  void setLocation(SourceLocation L) { Loc = L; }
90617fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor
907848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson  static std::string ComputeName(IdentType IT, const Decl *CurrentDecl);
9083a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
90963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const { return SourceRange(Loc); }
910227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson
9111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == PredefinedExprClass;
913227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  }
914d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner  static bool classof(const PredefinedExpr *) { return true; }
9151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
91677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
91763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
918227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson};
919227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson
9209996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// \brief Used by IntegerLiteral/FloatingLiteral to store the numeric without
9219996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// leaking memory.
9229996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis///
9239996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// For large floats/integers, APFloat/APInt will allocate memory from the heap
9249996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// to represent these numbers.  Unfortunately, when we use a BumpPtrAllocator
9259996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// to allocate IntegerLiteral/FloatingLiteral nodes the memory associated with
9269996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// the APFloat/APInt values will never get freed. APNumericStorage uses
9279996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// ASTContext's allocator for memory allocation.
9289996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisclass APNumericStorage {
9299996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  unsigned BitWidth;
9309996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  union {
9319996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    uint64_t VAL;    ///< Used to store the <= 64 bits integer value.
9329996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    uint64_t *pVal;  ///< Used to store the >64 bits integer value.
9339996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  };
9349996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
9359996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  bool hasAllocation() const { return llvm::APInt::getNumWords(BitWidth) > 1; }
9369996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
9379996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  APNumericStorage(const APNumericStorage&); // do not implement
9389996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  APNumericStorage& operator=(const APNumericStorage&); // do not implement
9399996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
9409996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisprotected:
9419996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  APNumericStorage() : BitWidth(0), VAL(0) { }
9429996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
9439996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  llvm::APInt getIntValue() const {
9449996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
9459996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    if (NumWords > 1)
9469996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis      return llvm::APInt(BitWidth, NumWords, pVal);
9479996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    else
9489996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis      return llvm::APInt(BitWidth, VAL);
9499996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  }
9509996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  void setIntValue(ASTContext &C, const llvm::APInt &Val);
9519996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis};
9529996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
9539996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisclass APIntStorage : public APNumericStorage {
9549996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidispublic:
9559996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  llvm::APInt getValue() const { return getIntValue(); }
9569996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  void setValue(ASTContext &C, const llvm::APInt &Val) { setIntValue(C, Val); }
9579996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis};
9589996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
9599996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisclass APFloatStorage : public APNumericStorage {
9609996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidispublic:
9619996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  llvm::APFloat getValue() const { return llvm::APFloat(getIntValue()); }
9629996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  void setValue(ASTContext &C, const llvm::APFloat &Val) {
9639996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    setIntValue(C, Val.bitcastToAPInt());
9649996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  }
9659996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis};
9669996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
9675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass IntegerLiteral : public Expr {
9689996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  APIntStorage Num;
9695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation Loc;
9709996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
9719996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  /// \brief Construct an empty integer literal.
9729996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  explicit IntegerLiteral(EmptyShell Empty)
9739996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    : Expr(IntegerLiteralClass, Empty) { }
9749996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
9755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
9761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy,
9775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // or UnsignedLongLongTy
9789996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  IntegerLiteral(ASTContext &C, const llvm::APInt &V,
9799996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                 QualType type, SourceLocation l)
980bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    : Expr(IntegerLiteralClass, type, VK_RValue, OK_Ordinary, false, false,
981bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           false),
982f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      Loc(l) {
9835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(type->isIntegerType() && "Illegal type in IntegerLiteral");
9849996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    setValue(C, V);
9855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
986a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson
9879996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy,
9889996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  // or UnsignedLongLongTy
9899996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  static IntegerLiteral *Create(ASTContext &C, const llvm::APInt &V,
9909996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                QualType type, SourceLocation l);
9919996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  static IntegerLiteral *Create(ASTContext &C, EmptyShell Empty);
9920b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
9939996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  llvm::APInt getValue() const { return Num.getValue(); }
99463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const { return SourceRange(Loc); }
9955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
996313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor  /// \brief Retrieve the location of the literal.
997313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor  SourceLocation getLocation() const { return Loc; }
998313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor
9999996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  void setValue(ASTContext &C, const llvm::APInt &Val) { Num.setValue(C, Val); }
10000b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  void setLocation(SourceLocation Location) { Loc = Location; }
10010b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
10031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == IntegerLiteralClass;
10045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
10055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const IntegerLiteral *) { return true; }
10061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
100777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
100863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
10095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
10105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CharacterLiteral : public Expr {
10125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned Value;
10135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation Loc;
1014c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner  bool IsWide;
10155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
10165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // type should be IntTy
1017c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner  CharacterLiteral(unsigned value, bool iswide, QualType type, SourceLocation l)
1018bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    : Expr(CharacterLiteralClass, type, VK_RValue, OK_Ordinary, false, false,
1019bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           false),
1020f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      Value(value), Loc(l), IsWide(iswide) {
10215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
10220b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
10230b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  /// \brief Construct an empty character literal.
10240b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { }
10250b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
1026018d8e0596dd57401eeddcf11ac84ff0a065fbbeChris Lattner  SourceLocation getLocation() const { return Loc; }
1027c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner  bool isWide() const { return IsWide; }
10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
102963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const { return SourceRange(Loc); }
10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned getValue() const { return Value; }
10325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10330b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  void setLocation(SourceLocation Location) { Loc = Location; }
10340b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  void setWide(bool W) { IsWide = W; }
10350b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor  void setValue(unsigned Val) { Value = Val; }
10360b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
10371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
10381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == CharacterLiteralClass;
10395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
10405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const CharacterLiteral *) { return true; }
104177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
104277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
104363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
10445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
10455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass FloatingLiteral : public Expr {
10479996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  APFloatStorage Num;
1048720c4ec57b6110873cd533ad434853a27e7c3f4aTed Kremenek  bool IsExact : 1;
10495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation Loc;
10509996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
10519996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  FloatingLiteral(ASTContext &C, const llvm::APFloat &V, bool isexact,
1052720c4ec57b6110873cd533ad434853a27e7c3f4aTed Kremenek                  QualType Type, SourceLocation L)
1053bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    : Expr(FloatingLiteralClass, Type, VK_RValue, OK_Ordinary, false, false,
1054bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           false),
10559996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis      IsExact(isexact), Loc(L) {
10569996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    setValue(C, V);
10579996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  }
10585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
105917fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor  /// \brief Construct an empty floating-point literal.
10601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  explicit FloatingLiteral(EmptyShell Empty)
10619996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    : Expr(FloatingLiteralClass, Empty), IsExact(false) { }
106217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor
10639996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidispublic:
10649996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  static FloatingLiteral *Create(ASTContext &C, const llvm::APFloat &V,
10659996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                 bool isexact, QualType Type, SourceLocation L);
10669996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  static FloatingLiteral *Create(ASTContext &C, EmptyShell Empty);
10679996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
10689996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  llvm::APFloat getValue() const { return Num.getValue(); }
10699996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  void setValue(ASTContext &C, const llvm::APFloat &Val) {
10709996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    Num.setValue(C, Val);
10719996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  }
107217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor
1073720c4ec57b6110873cd533ad434853a27e7c3f4aTed Kremenek  bool isExact() const { return IsExact; }
107417fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor  void setExact(bool E) { IsExact = E; }
1075c9bec4bfea9090a08dd83a7b213f0c8adf8d78ecChris Lattner
1076da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  /// getValueAsApproximateDouble - This returns the value as an inaccurate
1077da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  /// double.  Note that this may cause loss of precision, but is useful for
1078da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  /// debugging dumps, etc.
1079da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  double getValueAsApproximateDouble() const;
10801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
108117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor  SourceLocation getLocation() const { return Loc; }
108217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor  void setLocation(SourceLocation L) { Loc = L; }
108317fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor
108463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const { return SourceRange(Loc); }
10855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == FloatingLiteralClass;
10885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
10895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const FloatingLiteral *) { return true; }
10901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
109177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
109263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
10935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
10945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10955d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// ImaginaryLiteral - We support imaginary integer and floating point literals,
10965d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// like "1.0i".  We represent these as a wrapper around FloatingLiteral and
10975d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// IntegerLiteral classes.  Instances of this class always have a Complex type
10985d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// whose element type matches the subexpression.
10995d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner///
11005d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnerclass ImaginaryLiteral : public Expr {
11015549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt *Val;
11025d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnerpublic:
11035d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  ImaginaryLiteral(Expr *val, QualType Ty)
1104bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    : Expr(ImaginaryLiteralClass, Ty, VK_RValue, OK_Ordinary, false, false,
1105bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           false),
1106f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      Val(val) {}
11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1108cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor  /// \brief Build an empty imaginary literal.
11091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  explicit ImaginaryLiteral(EmptyShell Empty)
1110cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor    : Expr(ImaginaryLiteralClass, Empty) { }
1111cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor
11125549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  const Expr *getSubExpr() const { return cast<Expr>(Val); }
11135549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getSubExpr() { return cast<Expr>(Val); }
1114cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor  void setSubExpr(Expr *E) { Val = E; }
1115cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor
111663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const { return Val->getSourceRange(); }
11171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
11181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == ImaginaryLiteralClass;
11195d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  }
11205d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  static bool classof(const ImaginaryLiteral *) { return true; }
11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11225d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  // Iterators
112363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(&Val, &Val+1); }
11245d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner};
11255d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
1126e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek/// StringLiteral - This represents a string literal expression, e.g. "foo"
1127e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek/// or L"bar" (wide strings).  The actual string is returned by getStrData()
1128e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek/// is NOT null-terminated, and the length of the string is determined by
1129a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// calling getByteLength().  The C type for a string is always a
1130c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// ConstantArrayType.  In C++, the char type is const qualified, in C it is
1131c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// not.
1132690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner///
1133690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner/// Note that strings in C can be formed by concatenation of multiple string
11348bea7c0ee44c71c817de7dc2be932b73bec90c9fChris Lattner/// literal pptokens in translation phase #6.  This keeps track of the locations
1135690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner/// of each of these pieces.
1136c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner///
1137c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// Strings in C can also be truncated and extended by assigning into arrays,
1138c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// e.g. with constructs like:
1139c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner///   char X[2] = "foobar";
1140c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// In this case, getByteLength() will return 6, but the string literal will
1141c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// have type "char[2]".
11425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass StringLiteral : public Expr {
11433e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson  friend class ASTStmtReader;
11443e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson
11455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *StrData;
11465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned ByteLength;
11475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool IsWide;
11483e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson  bool IsPascal;
1149726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner  unsigned NumConcatenated;
1150726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner  SourceLocation TokLocs[1];
11512085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner
1152f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  StringLiteral(QualType Ty) :
1153bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    Expr(StringLiteralClass, Ty, VK_LValue, OK_Ordinary, false, false, false) {}
11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
11562085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  /// This is the "fully general" constructor that allows representation of
11572085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  /// strings formed from multiple concatenated tokens.
11582085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  static StringLiteral *Create(ASTContext &C, const char *StrData,
11593e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson                               unsigned ByteLength, bool Wide, bool Pascal,
11603e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson                               QualType Ty,
1161a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson                               const SourceLocation *Loc, unsigned NumStrs);
11622085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner
11632085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  /// Simple constructor for string literals made from one token.
11641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static StringLiteral *Create(ASTContext &C, const char *StrData,
11653e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson                               unsigned ByteLength, bool Wide,
11663e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson                               bool Pascal, QualType Ty, SourceLocation Loc) {
11673e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson    return Create(C, StrData, ByteLength, Wide, Pascal, Ty, &Loc, 1);
11682085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  }
1169a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson
1170673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  /// \brief Construct an empty string literal.
1171673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  static StringLiteral *CreateEmpty(ASTContext &C, unsigned NumStrs);
1172673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor
1173b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  llvm::StringRef getString() const {
1174b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar    return llvm::StringRef(StrData, ByteLength);
1175b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  }
11762f4eaef37476ae6891ede8ba215d0f6fd093629bBenjamin Kramer
11775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned getByteLength() const { return ByteLength; }
1178673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor
1179673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  /// \brief Sets the string data to the given string data.
1180b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  void setString(ASTContext &C, llvm::StringRef Str);
1181673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor
11825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isWide() const { return IsWide; }
11833e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson  bool isPascal() const { return IsPascal; }
11843e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson
11858d4141f83d9de379547cf05bd75d4c6cf894b189Steve Naroff  bool containsNonAsciiOrNull() const {
1186b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar    llvm::StringRef Str = getString();
1187b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar    for (unsigned i = 0, e = Str.size(); i != e; ++i)
1188b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar      if (!isascii(Str[i]) || !Str[i])
118933fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff        return true;
119033fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff    return false;
119133fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff  }
1192726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner  /// getNumConcatenated - Get the number of string literal tokens that were
1193726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner  /// concatenated in translation phase #6 to form this string literal.
1194726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner  unsigned getNumConcatenated() const { return NumConcatenated; }
11951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1196726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner  SourceLocation getStrTokenLoc(unsigned TokNum) const {
1197726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner    assert(TokNum < NumConcatenated && "Invalid tok number");
1198726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner    return TokLocs[TokNum];
1199726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner  }
12001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  void setStrTokenLoc(unsigned TokNum, SourceLocation L) {
1201673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor    assert(TokNum < NumConcatenated && "Invalid tok number");
1202673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor    TokLocs[TokNum] = L;
1203673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  }
120408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
120508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  /// getLocationOfByte - Return a source location that points to the specified
120608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  /// byte of this string literal.
120708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  ///
120808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  /// Strings are amazingly complex.  They can be formed from multiple tokens
120908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  /// and can have escape sequences in them in addition to the usual trigraph
121008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  /// and escaped newline business.  This routine handles this complexity.
121108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  ///
121208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  SourceLocation getLocationOfByte(unsigned ByteNo, const SourceManager &SM,
121308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner                                   const LangOptions &Features,
121408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner                                   const TargetInfo &Target) const;
1215673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor
1216b137299ce5bb6c36fbba651858600857fda4dd50Chris Lattner  typedef const SourceLocation *tokloc_iterator;
1217b137299ce5bb6c36fbba651858600857fda4dd50Chris Lattner  tokloc_iterator tokloc_begin() const { return TokLocs; }
1218b137299ce5bb6c36fbba651858600857fda4dd50Chris Lattner  tokloc_iterator tokloc_end() const { return TokLocs+NumConcatenated; }
12195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
122063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
12211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SourceRange(TokLocs[0], TokLocs[NumConcatenated-1]);
12225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
12231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
12241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == StringLiteralClass;
12255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
12265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const StringLiteral *) { return true; }
12271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
122877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
122963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
12305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
12315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
12325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ParenExpr - This represents a parethesized expression, e.g. "(1)".  This
12335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// AST node is only formed if full location information is requested.
12345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ParenExpr : public Expr {
12355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation L, R;
12365549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt *Val;
12375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
12385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ParenExpr(SourceLocation l, SourceLocation r, Expr *val)
1239898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    : Expr(ParenExprClass, val->getType(),
1240f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall           val->getValueKind(), val->getObjectKind(),
1241bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           val->isTypeDependent(), val->isValueDependent(),
1242bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           val->containsUnexpandedParameterPack()),
1243898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor      L(l), R(r), Val(val) {}
12441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1245c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor  /// \brief Construct an empty parenthesized expression.
12461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  explicit ParenExpr(EmptyShell Empty)
1247c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor    : Expr(ParenExprClass, Empty) { }
1248c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor
12495549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  const Expr *getSubExpr() const { return cast<Expr>(Val); }
12505549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getSubExpr() { return cast<Expr>(Val); }
1251c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor  void setSubExpr(Expr *E) { Val = E; }
1252c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor
125363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const { return SourceRange(L, R); }
12545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1255313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor  /// \brief Get the location of the left parentheses '('.
1256313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor  SourceLocation getLParen() const { return L; }
1257c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor  void setLParen(SourceLocation Loc) { L = Loc; }
1258313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor
1259313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor  /// \brief Get the location of the right parentheses ')'.
1260313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor  SourceLocation getRParen() const { return R; }
1261c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor  void setRParen(SourceLocation Loc) { R = Loc; }
1262313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor
12631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
12641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == ParenExprClass;
12655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
12665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const ParenExpr *) { return true; }
12671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
126877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
126963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(&Val, &Val+1); }
12705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
12715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
12725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
12730518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// UnaryOperator - This represents the unary-expression's (except sizeof and
12740518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// alignof), the postinc/postdec operators from postfix-expression, and various
12755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// extensions.
1276dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner///
1277dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// Notes on various nodes:
1278dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner///
1279dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// Real/Imag - These return the real/imag part of a complex operand.  If
1280dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner///   applied to a non-complex value, the former returns its operand and the
1281dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner///   later returns zero in the type of the operand.
1282dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner///
12835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass UnaryOperator : public Expr {
12845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
12855baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall  typedef UnaryOperatorKind Opcode;
12865baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall
12875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate:
12880799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  unsigned Opc : 5;
12895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation Loc;
12900799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  Stmt *Val;
12911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
12925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1293f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  UnaryOperator(Expr *input, Opcode opc, QualType type,
1294f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                ExprValueKind VK, ExprObjectKind OK, SourceLocation l)
1295f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : Expr(UnaryOperatorClass, type, VK, OK,
1296de7e66256b1bdfcf6526994825a8c8fced52a31cEli Friedman           input->isTypeDependent() || type->isDependentType(),
1297bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           input->isValueDependent(),
1298bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           input->containsUnexpandedParameterPack()),
12990799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall      Opc(opc), Loc(l), Val(input) {}
13005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
13010b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor  /// \brief Build an empty unary operator.
13021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  explicit UnaryOperator(EmptyShell Empty)
13032de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    : Expr(UnaryOperatorClass, Empty), Opc(UO_AddrOf) { }
13040b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor
13050799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  Opcode getOpcode() const { return static_cast<Opcode>(Opc); }
13060b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor  void setOpcode(Opcode O) { Opc = O; }
13070b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor
13085549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getSubExpr() const { return cast<Expr>(Val); }
13090b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor  void setSubExpr(Expr *E) { Val = E; }
13100b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor
13115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getOperatorLoc - Return the location of the operator.
13125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation getOperatorLoc() const { return Loc; }
13130b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor  void setOperatorLoc(SourceLocation L) { Loc = L; }
13140b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor
13155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isPostfix - Return true if this is a postfix operation, like x++.
13162085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  static bool isPostfix(Opcode Op) {
13172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    return Op == UO_PostInc || Op == UO_PostDec;
13182085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  }
13195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1320cc7bd10c0de9449b795bda3c5dcc6d83cc48436bZhanyong Wan  /// isPrefix - Return true if this is a prefix operation, like --x.
13212085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  static bool isPrefix(Opcode Op) {
13222de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    return Op == UO_PreInc || Op == UO_PreDec;
13232085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  }
13245a56ac30d04e8f0431a08980885662a47a6308aaTed Kremenek
13250799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  bool isPrefix() const { return isPrefix(getOpcode()); }
13260799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  bool isPostfix() const { return isPostfix(getOpcode()); }
13272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  bool isIncrementOp() const {
1328993cdca0fed7deb646e4654dfb2607227a497faaBenjamin Kramer    return Opc == UO_PreInc || Opc == UO_PostInc;
13292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  }
13302de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  bool isIncrementDecrementOp() const {
1331993cdca0fed7deb646e4654dfb2607227a497faaBenjamin Kramer    return Opc <= UO_PreDec;
13322de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  }
13332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  static bool isArithmeticOp(Opcode Op) {
13342de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    return Op >= UO_Plus && Op <= UO_LNot;
13352de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  }
13360799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  bool isArithmeticOp() const { return isArithmeticOp(getOpcode()); }
13371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
13395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// corresponds to, e.g. "sizeof" or "[pre]++"
13405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static const char *getOpcodeStr(Opcode Op);
13415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1342bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  /// \brief Retrieve the unary opcode that corresponds to the given
1343bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  /// overloaded operator.
1344bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix);
1345bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor
1346bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  /// \brief Retrieve the overloaded operator kind that corresponds to
1347bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  /// the given unary opcode.
1348bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  static OverloadedOperatorKind getOverloadedOperator(Opcode Opc);
1349bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor
135063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
13515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (isPostfix())
13525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return SourceRange(Val->getLocStart(), Loc);
13535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
13545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return SourceRange(Loc, Val->getLocEnd());
13555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
135663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceLocation getExprLoc() const { return Loc; }
13571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
13591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == UnaryOperatorClass;
13605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
13615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const UnaryOperator *) { return true; }
13621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
136377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
136463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(&Val, &Val+1); }
13655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
13665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
13678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// OffsetOfExpr - [C99 7.17] - This represents an expression of the form
13688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// offsetof(record-type, member-designator). For example, given:
13698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// @code
13708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// struct S {
13718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor///   float f;
1372c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt///   double d;
13738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// };
13748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// struct T {
13758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor///   int i;
13768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor///   struct S s[10];
13778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// };
13788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// @endcode
1379c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt/// we can represent and evaluate the expression @c offsetof(struct T, s[2].d).
13808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
13818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorclass OffsetOfExpr : public Expr {
13828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorpublic:
13838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // __builtin_offsetof(type, identifier(.identifier|[expr])*)
13848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  class OffsetOfNode {
13858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  public:
13868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief The kind of offsetof node we have.
13878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    enum Kind {
1388cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      /// \brief An index into an array.
13898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Array = 0x00,
1390cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      /// \brief A field.
13918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Field = 0x01,
1392cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      /// \brief A field in a dependent type, known only by its name.
1393cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      Identifier = 0x02,
1394cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      /// \brief An implicit indirection through a C++ base class, when the
1395cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      /// field found is in a base class.
1396cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      Base = 0x03
13978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    };
13988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
13998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  private:
14008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    enum { MaskBits = 2, Mask = 0x03 };
1401c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
14028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief The source range that covers this part of the designator.
14038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    SourceRange Range;
1404c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
14058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief The data describing the designator, which comes in three
14068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// different forms, depending on the lower two bits.
1407c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ///   - An unsigned index into the array of Expr*'s stored after this node
14088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    ///     in memory, for [constant-expression] designators.
14098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    ///   - A FieldDecl*, for references to a known field.
14108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    ///   - An IdentifierInfo*, for references to a field with a given name
14118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    ///     when the class type is dependent.
1412c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ///   - A CXXBaseSpecifier*, for references that look at a field in a
1413cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    ///     base class.
14148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    uintptr_t Data;
1415c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
14168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  public:
14178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief Create an offsetof node that refers to an array element.
1418c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    OffsetOfNode(SourceLocation LBracketLoc, unsigned Index,
14198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                 SourceLocation RBracketLoc)
14208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      : Range(LBracketLoc, RBracketLoc), Data((Index << 2) | Array) { }
1421c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
14228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief Create an offsetof node that refers to a field.
1423c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    OffsetOfNode(SourceLocation DotLoc, FieldDecl *Field,
14248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                 SourceLocation NameLoc)
1425c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      : Range(DotLoc.isValid()? DotLoc : NameLoc, NameLoc),
14268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        Data(reinterpret_cast<uintptr_t>(Field) | OffsetOfNode::Field) { }
1427c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
14288ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief Create an offsetof node that refers to an identifier.
14298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    OffsetOfNode(SourceLocation DotLoc, IdentifierInfo *Name,
14308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                 SourceLocation NameLoc)
1431c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      : Range(DotLoc.isValid()? DotLoc : NameLoc, NameLoc),
14328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        Data(reinterpret_cast<uintptr_t>(Name) | Identifier) { }
1433cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
1434cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    /// \brief Create an offsetof node that refers into a C++ base class.
1435cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    explicit OffsetOfNode(const CXXBaseSpecifier *Base)
1436cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      : Range(), Data(reinterpret_cast<uintptr_t>(Base) | OffsetOfNode::Base) {}
1437c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
14388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief Determine what kind of offsetof node this is.
1439c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Kind getKind() const {
14408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      return static_cast<Kind>(Data & Mask);
14418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
1442c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
14438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief For an array element node, returns the index into the array
14448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// of expressions.
14458ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    unsigned getArrayExprIndex() const {
14468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      assert(getKind() == Array);
14478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      return Data >> 2;
14488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
14498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
14508ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief For a field offsetof node, returns the field.
14518ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    FieldDecl *getField() const {
14528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      assert(getKind() == Field);
1453cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      return reinterpret_cast<FieldDecl *>(Data & ~(uintptr_t)Mask);
14548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
1455c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
14568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief For a field or identifier offsetof node, returns the name of
14578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// the field.
14588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    IdentifierInfo *getFieldName() const;
1459c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1460cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    /// \brief For a base class node, returns the base specifier.
1461cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    CXXBaseSpecifier *getBase() const {
1462cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      assert(getKind() == Base);
1463c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      return reinterpret_cast<CXXBaseSpecifier *>(Data & ~(uintptr_t)Mask);
1464cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    }
1465c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
14668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// \brief Retrieve the source range that covers this offsetof node.
14678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    ///
14688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// For an array element node, the source range contains the locations of
14698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// the square brackets. For a field or identifier node, the source range
1470c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    /// contains the location of the period (if there is one) and the
14718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    /// identifier.
147206dec892b5300b43263d25c5476b506c9d6cfbadAbramo Bagnara    SourceRange getSourceRange() const { return Range; }
14738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  };
14748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
14758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorprivate:
1476c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
14778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  SourceLocation OperatorLoc, RParenLoc;
14788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Base type;
14798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  TypeSourceInfo *TSInfo;
14808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Number of sub-components (i.e. instances of OffsetOfNode).
14818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  unsigned NumComps;
14828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Number of sub-expressions (i.e. array subscript expressions).
14838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  unsigned NumExprs;
1484c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1485c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  OffsetOfExpr(ASTContext &C, QualType type,
14868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor               SourceLocation OperatorLoc, TypeSourceInfo *tsi,
1487c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt               OffsetOfNode* compsPtr, unsigned numComps,
14888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor               Expr** exprsPtr, unsigned numExprs,
14898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor               SourceLocation RParenLoc);
14908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
14918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  explicit OffsetOfExpr(unsigned numComps, unsigned numExprs)
14928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    : Expr(OffsetOfExprClass, EmptyShell()),
1493c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      TSInfo(0), NumComps(numComps), NumExprs(numExprs) {}
14948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
14958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorpublic:
1496c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1497c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  static OffsetOfExpr *Create(ASTContext &C, QualType type,
1498c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                              SourceLocation OperatorLoc, TypeSourceInfo *tsi,
1499c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                              OffsetOfNode* compsPtr, unsigned numComps,
15008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                              Expr** exprsPtr, unsigned numExprs,
15018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                              SourceLocation RParenLoc);
15028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
1503c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  static OffsetOfExpr *CreateEmpty(ASTContext &C,
15048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                   unsigned NumComps, unsigned NumExprs);
15058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
15068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// getOperatorLoc - Return the location of the operator.
15078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  SourceLocation getOperatorLoc() const { return OperatorLoc; }
15088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  void setOperatorLoc(SourceLocation L) { OperatorLoc = L; }
15098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
15108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// \brief Return the location of the right parentheses.
15118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  SourceLocation getRParenLoc() const { return RParenLoc; }
15128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  void setRParenLoc(SourceLocation R) { RParenLoc = R; }
1513c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
15148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  TypeSourceInfo *getTypeSourceInfo() const {
15158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return TSInfo;
15168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
15178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  void setTypeSourceInfo(TypeSourceInfo *tsi) {
15188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    TSInfo = tsi;
15198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1520c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
15218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  const OffsetOfNode &getComponent(unsigned Idx) {
15228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    assert(Idx < NumComps && "Subscript out of range");
15238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return reinterpret_cast<OffsetOfNode *> (this + 1)[Idx];
15248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
15258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
15268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  void setComponent(unsigned Idx, OffsetOfNode ON) {
15278ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    assert(Idx < NumComps && "Subscript out of range");
15288ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    reinterpret_cast<OffsetOfNode *> (this + 1)[Idx] = ON;
15298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1530c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
15318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  unsigned getNumComponents() const {
15328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return NumComps;
15338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
15348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
15358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  Expr* getIndexExpr(unsigned Idx) {
15368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    assert(Idx < NumExprs && "Subscript out of range");
15378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return reinterpret_cast<Expr **>(
15388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                    reinterpret_cast<OffsetOfNode *>(this+1) + NumComps)[Idx];
15398ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
15408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
15418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  void setIndexExpr(unsigned Idx, Expr* E) {
15428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    assert(Idx < NumComps && "Subscript out of range");
15438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    reinterpret_cast<Expr **>(
15448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                reinterpret_cast<OffsetOfNode *>(this+1) + NumComps)[Idx] = E;
15458ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1546c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
15478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  unsigned getNumExpressions() const {
15488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return NumExprs;
15498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
15508ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
155163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
15528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return SourceRange(OperatorLoc, RParenLoc);
15538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
15548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
15558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  static bool classof(const Stmt *T) {
15568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return T->getStmtClass() == OffsetOfExprClass;
15578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
15588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
15598ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  static bool classof(const OffsetOfExpr *) { return true; }
15608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
15618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Iterators
156263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() {
156363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    Stmt **begin =
156463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall      reinterpret_cast<Stmt**>(reinterpret_cast<OffsetOfNode*>(this + 1)
156563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall                               + NumComps);
156663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range(begin, begin + NumExprs);
156763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
15688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor};
15698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
1570f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated)
1571f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// expression operand.  Used for sizeof/alignof (C99 6.5.3.4) and
1572f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// vec_step (OpenCL 1.1 6.11.12).
1573f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourneclass UnaryExprOrTypeTraitExpr : public Expr {
1574f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  unsigned Kind : 2;
15750518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  bool isType : 1;    // true if operand is a type, false if an expression
1576d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl  union {
1577a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *Ty;
1578d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl    Stmt *Ex;
1579d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl  } Argument;
15805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation OpLoc, RParenLoc;
158142602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregor
15825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1583f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo,
1584f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne                           QualType resultType, SourceLocation op,
1585f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne                           SourceLocation rp) :
1586f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_RValue, OK_Ordinary,
1587ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor           false, // Never type-dependent (C++ [temp.dep.expr]p3).
15882850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl           // Value-dependent if the argument is type-dependent.
1589bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           TInfo->getType()->isDependentType(),
1590bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           TInfo->getType()->containsUnexpandedParameterPack()),
1591f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      Kind(ExprKind), isType(true), OpLoc(op), RParenLoc(rp) {
1592a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    Argument.Ty = TInfo;
1593ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor  }
1594ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor
1595f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, Expr *E,
1596f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne                           QualType resultType, SourceLocation op,
1597f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne                           SourceLocation rp) :
1598f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_RValue, OK_Ordinary,
1599ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor           false, // Never type-dependent (C++ [temp.dep.expr]p3).
1600ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor           // Value-dependent if the argument is type-dependent.
1601bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           E->isTypeDependent(),
1602bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           E->containsUnexpandedParameterPack()),
1603f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      Kind(ExprKind), isType(false), OpLoc(op), RParenLoc(rp) {
1604ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor    Argument.Ex = E;
1605d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl  }
16060518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
16070b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor  /// \brief Construct an empty sizeof/alignof expression.
1608f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  explicit UnaryExprOrTypeTraitExpr(EmptyShell Empty)
1609f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    : Expr(UnaryExprOrTypeTraitExprClass, Empty) { }
16100b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor
1611f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  UnaryExprOrTypeTrait getKind() const {
1612f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    return static_cast<UnaryExprOrTypeTrait>(Kind);
1613f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
1614f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  void setKind(UnaryExprOrTypeTrait K) { Kind = K; }
16150b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor
16160518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  bool isArgumentType() const { return isType; }
16170518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType getArgumentType() const {
16185ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getArgumentTypeInfo()->getType();
16195ab75172051a6d2ea71a80a79e81c65519fd3462John McCall  }
1620a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *getArgumentTypeInfo() const {
16210518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    assert(isArgumentType() && "calling getArgumentType() when arg is expr");
16225ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return Argument.Ty;
16230518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  }
1624caae7b099a0324b7c15dc89a9b70969d5d7ce996Chris Lattner  Expr *getArgumentExpr() {
16250518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    assert(!isArgumentType() && "calling getArgumentExpr() when arg is type");
1626d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl    return static_cast<Expr*>(Argument.Ex);
16270518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  }
1628caae7b099a0324b7c15dc89a9b70969d5d7ce996Chris Lattner  const Expr *getArgumentExpr() const {
1629f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    return const_cast<UnaryExprOrTypeTraitExpr*>(this)->getArgumentExpr();
1630caae7b099a0324b7c15dc89a9b70969d5d7ce996Chris Lattner  }
16310b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor
16320b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor  void setArgument(Expr *E) { Argument.Ex = E; isType = false; }
1633a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  void setArgument(TypeSourceInfo *TInfo) {
1634a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    Argument.Ty = TInfo;
16351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    isType = true;
16360b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor  }
16370b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor
16380518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  /// Gets the argument type, or the type of the argument expression, whichever
16390518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  /// is appropriate.
16400518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType getTypeOfArgument() const {
16410518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    return isArgumentType() ? getArgumentType() : getArgumentExpr()->getType();
16420518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  }
16430518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
164476e773a443be9f006610f46529e07d4c8d857680Chris Lattner  SourceLocation getOperatorLoc() const { return OpLoc; }
16450b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor  void setOperatorLoc(SourceLocation L) { OpLoc = L; }
16460b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor
16470b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor  SourceLocation getRParenLoc() const { return RParenLoc; }
16480b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
1649866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek
165063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
1651866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek    return SourceRange(OpLoc, RParenLoc);
1652866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek  }
16535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
16541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
1655f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    return T->getStmtClass() == UnaryExprOrTypeTraitExprClass;
16565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1657f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  static bool classof(const UnaryExprOrTypeTraitExpr *) { return true; }
16581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
165977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
166063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children();
16615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
16625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
16635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
16645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Postfix Operators.
16655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
16665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
16675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
16685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ArraySubscriptExpr : public Expr {
166977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  enum { LHS, RHS, END_EXPR=2 };
16701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Stmt* SubExprs[END_EXPR];
16715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation RBracketLoc;
16725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
16732324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t,
1674f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                     ExprValueKind VK, ExprObjectKind OK,
167573d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner                     SourceLocation rbracketloc)
1676f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(ArraySubscriptExprClass, t, VK, OK,
16772850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl         lhs->isTypeDependent() || rhs->isTypeDependent(),
1678bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         lhs->isValueDependent() || rhs->isValueDependent(),
1679bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         (lhs->containsUnexpandedParameterPack() ||
1680bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          rhs->containsUnexpandedParameterPack())),
16812850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl    RBracketLoc(rbracketloc) {
168273d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner    SubExprs[LHS] = lhs;
168373d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner    SubExprs[RHS] = rhs;
168473d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner  }
16851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1686cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor  /// \brief Create an empty array subscript expression.
1687cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor  explicit ArraySubscriptExpr(EmptyShell Shell)
1688cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor    : Expr(ArraySubscriptExprClass, Shell) { }
1689cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor
16902324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  /// An array access can be written A[4] or 4[A] (both are equivalent).
16912324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  /// - getBase() and getIdx() always present the normalized view: A[4].
16922324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  ///    In this case getBase() returns "A" and getIdx() returns "4".
16932324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  /// - getLHS() and getRHS() present the syntactic view. e.g. for
16942324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  ///    4[A] getLHS() returns "4".
169533fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb  /// Note: Because vector element access is also written A[4] we must
169633fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb  /// predicate the format conversion in getBase and getIdx only on the
169733fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb  /// the type of the RHS, as it is possible for the LHS to be a vector of
169833fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb  /// integer type
16995549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); }
17005549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
1701cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor  void setLHS(Expr *E) { SubExprs[LHS] = E; }
1702cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor
17035549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); }
17045549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
1705cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor  void setRHS(Expr *E) { SubExprs[RHS] = E; }
17061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Expr *getBase() {
17085549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek    return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS());
170977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  }
17101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Expr *getBase() const {
17125549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek    return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS());
17132324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  }
17141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Expr *getIdx() {
17165549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek    return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS());
17172324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  }
17181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
171977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  const Expr *getIdx() const {
17205549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek    return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS());
17211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
172363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
172477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    return SourceRange(getLHS()->getLocStart(), RBracketLoc);
17255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
17261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1727026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  SourceLocation getRBracketLoc() const { return RBracketLoc; }
1728cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor  void setRBracketLoc(SourceLocation L) { RBracketLoc = L; }
1729cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor
173063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceLocation getExprLoc() const { return getBase()->getExprLoc(); }
17315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
17321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
17331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == ArraySubscriptExprClass;
17345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
17355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const ArraySubscriptExpr *) { return true; }
17361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
173777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
173863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() {
173963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
174063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
17415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
17425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
17435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1744b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
17451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CallExpr itself represents a normal function call, e.g., "f(x, 2)",
1746b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// while its subclasses may represent alternative syntax that (semantically)
17471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// results in a function call. For example, CXXOperatorCallExpr is
1748b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// a subclass for overloaded operator calls that use operator syntax, e.g.,
1749b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// "str1 + str2" to resolve to a function call.
17505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CallExpr : public Expr {
1751cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  enum { FN=0, PREARGS_START=1 };
17525549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt **SubExprs;
17535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned NumArgs;
17545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation RParenLoc;
17551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1756b4609806e9232593ece09ce08b630836e825865cDouglas Gregorprotected:
1757cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  // These versions of the constructor are for derived classes.
1758cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  CallExpr(ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs,
1759cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne           Expr **args, unsigned numargs, QualType t, ExprValueKind VK,
1760cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne           SourceLocation rparenloc);
1761cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  CallExpr(ASTContext &C, StmtClass SC, unsigned NumPreArgs, EmptyShell Empty);
1762cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne
1763cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  Stmt *getPreArg(unsigned i) {
1764cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    assert(i < getNumPreArgs() && "Prearg access out of range!");
1765cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    return SubExprs[PREARGS_START+i];
1766cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  }
1767cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  const Stmt *getPreArg(unsigned i) const {
1768cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    assert(i < getNumPreArgs() && "Prearg access out of range!");
1769cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    return SubExprs[PREARGS_START+i];
1770cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  }
1771cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  void setPreArg(unsigned i, Stmt *PreArg) {
1772cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    assert(i < getNumPreArgs() && "Prearg access out of range!");
1773cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    SubExprs[PREARGS_START+i] = PreArg;
1774cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  }
1775cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne
1776cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  unsigned getNumPreArgs() const { return CallExprBits.NumPreArgs; }
177742602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregor
17785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
17791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs, QualType t,
1780f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall           ExprValueKind VK, SourceLocation rparenloc);
17811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17821f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor  /// \brief Build an empty call expression.
1783ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis  CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty);
17841f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor
17855549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  const Expr *getCallee() const { return cast<Expr>(SubExprs[FN]); }
17865549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getCallee() { return cast<Expr>(SubExprs[FN]); }
178718b2515e1bf8c86a4900792692e42fe1296be28dChris Lattner  void setCallee(Expr *F) { SubExprs[FN] = F; }
1788a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu
1789d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes  Decl *getCalleeDecl();
1790d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes  const Decl *getCalleeDecl() const {
1791d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes    return const_cast<CallExpr*>(this)->getCalleeDecl();
1792d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes  }
1793d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes
1794a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu  /// \brief If the callee is a FunctionDecl, return it. Otherwise return 0.
1795a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu  FunctionDecl *getDirectCallee();
1796bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner  const FunctionDecl *getDirectCallee() const {
1797bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner    return const_cast<CallExpr*>(this)->getDirectCallee();
1798bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner  }
1799a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu
18005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getNumArgs - Return the number of actual arguments to this call.
18015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
18025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned getNumArgs() const { return NumArgs; }
18031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1804aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \brief Retrieve the call arguments.
1805cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  Expr **getArgs() {
1806cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    return reinterpret_cast<Expr **>(SubExprs+getNumPreArgs()+PREARGS_START);
1807cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  }
1808aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
18095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getArg - Return the specified argument.
18105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Expr *getArg(unsigned Arg) {
18115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(Arg < NumArgs && "Arg access out of range!");
1812cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    return cast<Expr>(SubExprs[Arg+getNumPreArgs()+PREARGS_START]);
18135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
18145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const Expr *getArg(unsigned Arg) const {
18155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(Arg < NumArgs && "Arg access out of range!");
1816cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    return cast<Expr>(SubExprs[Arg+getNumPreArgs()+PREARGS_START]);
18175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
18181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1819934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff  /// setArg - Set the specified argument.
1820934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff  void setArg(unsigned Arg, Expr *ArgExpr) {
1821934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff    assert(Arg < NumArgs && "Arg access out of range!");
1822cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    SubExprs[Arg+getNumPreArgs()+PREARGS_START] = ArgExpr;
1823934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff  }
18241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1825d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  /// setNumArgs - This changes the number of arguments present in this call.
1826d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  /// Any orphaned expressions are deleted by this, and any new operands are set
1827d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  /// to null.
18288189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek  void setNumArgs(ASTContext& C, unsigned NumArgs);
18291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18305549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  typedef ExprIterator arg_iterator;
18315549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  typedef ConstExprIterator const_arg_iterator;
18321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1833cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  arg_iterator arg_begin() { return SubExprs+PREARGS_START+getNumPreArgs(); }
1834cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  arg_iterator arg_end() {
1835cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    return SubExprs+PREARGS_START+getNumPreArgs()+getNumArgs();
1836cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  }
1837cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  const_arg_iterator arg_begin() const {
1838cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    return SubExprs+PREARGS_START+getNumPreArgs();
1839cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  }
1840cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  const_arg_iterator arg_end() const {
1841cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    return SubExprs+PREARGS_START+getNumPreArgs()+getNumArgs();
1842cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  }
18431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getNumCommas - Return the number of commas that must have been present in
18455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// this function call.
18465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned getNumCommas() const { return NumArgs ? NumArgs - 1 : 0; }
18475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1848cb888967400a03504c88acedd5248d6778a82f46Chris Lattner  /// isBuiltinCall - If this is a call to a builtin, return the builtin ID.  If
1849cb888967400a03504c88acedd5248d6778a82f46Chris Lattner  /// not, return 0.
18504ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  unsigned isBuiltinCall(const ASTContext &Context) const;
18511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// getCallReturnType - Get the return type of the call expr. This is not
18531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// always the type of the expr itself, if the return type is a reference
18546dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson  /// type.
18556dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson  QualType getCallReturnType() const;
18561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1857d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  SourceLocation getRParenLoc() const { return RParenLoc; }
18581f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
1859866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek
18602882eca5a184c78f793188083f6ce539740a5cf2John McCall  SourceRange getSourceRange() const;
18611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
18634bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt    return T->getStmtClass() >= firstCallExprConstant &&
18644bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt           T->getStmtClass() <= lastCallExprConstant;
18655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
18665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const CallExpr *) { return true; }
186788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
186877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  // Iterators
186963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() {
187063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range(&SubExprs[0],
187163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall                       &SubExprs[0]+NumArgs+getNumPreArgs()+PREARGS_START);
187263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
18735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
18745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1875ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner/// MemberExpr - [C99 6.5.2.3] Structure and Union Members.  X->F and X.F.
18765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
18775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass MemberExpr : public Expr {
18786bb8017bb9e828d118e15e59d71c66bba323c364John McCall  /// Extra data stored in some member expressions.
18796bb8017bb9e828d118e15e59d71c66bba323c364John McCall  struct MemberNameQualifier : public NameQualifier {
1880161755a09898c95d21bfff33707da9ca41cd53c5John McCall    DeclAccessPair FoundDecl;
18816bb8017bb9e828d118e15e59d71c66bba323c364John McCall  };
18826bb8017bb9e828d118e15e59d71c66bba323c364John McCall
1883ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner  /// Base - the expression for the base pointer or structure references.  In
1884ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner  /// X.F, this is "X".
18855549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt *Base;
18861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1887ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner  /// MemberDecl - This is the decl being referenced by the field/member name.
1888ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner  /// In X.F, this is the decl referenced by F.
1889f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *MemberDecl;
18901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1891ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner  /// MemberLoc - This is the location of the member name.
18925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation MemberLoc;
18931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  /// MemberDNLoc - Provides source/type location info for the
18952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  /// declaration name embedded in MemberDecl.
18962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameLoc MemberDNLoc;
18972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
1898ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner  /// IsArrow - True if this is "X->F", false if this is "X.F".
189983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  bool IsArrow : 1;
19001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
190183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  /// \brief True if this member expression used a nested-name-specifier to
19026bb8017bb9e828d118e15e59d71c66bba323c364John McCall  /// refer to the member, e.g., "x->Base::f", or found its member via a using
19036bb8017bb9e828d118e15e59d71c66bba323c364John McCall  /// declaration.  When true, a MemberNameQualifier
1904c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// structure is allocated immediately after the MemberExpr.
19056bb8017bb9e828d118e15e59d71c66bba323c364John McCall  bool HasQualifierOrFoundDecl : 1;
19061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1907c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// \brief True if this member expression specified a template argument list
1908c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// explicitly, e.g., x->f<int>. When true, an ExplicitTemplateArgumentList
1909c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// structure (and its TemplateArguments) are allocated immediately after
1910c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// the MemberExpr or, if the member expression also has a qualifier, after
19116bb8017bb9e828d118e15e59d71c66bba323c364John McCall  /// the MemberNameQualifier structure.
1912c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  bool HasExplicitTemplateArgumentList : 1;
19131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
191483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  /// \brief Retrieve the qualifier that preceded the member name, if any.
19156bb8017bb9e828d118e15e59d71c66bba323c364John McCall  MemberNameQualifier *getMemberQualifier() {
19166bb8017bb9e828d118e15e59d71c66bba323c364John McCall    assert(HasQualifierOrFoundDecl);
19176bb8017bb9e828d118e15e59d71c66bba323c364John McCall    return reinterpret_cast<MemberNameQualifier *> (this + 1);
191883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
191983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
192083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  /// \brief Retrieve the qualifier that preceded the member name, if any.
19216bb8017bb9e828d118e15e59d71c66bba323c364John McCall  const MemberNameQualifier *getMemberQualifier() const {
1922c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    return const_cast<MemberExpr *>(this)->getMemberQualifier();
1923c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  }
19241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1926f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  MemberExpr(Expr *base, bool isarrow, ValueDecl *memberdecl,
1927f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall             const DeclarationNameInfo &NameInfo, QualType ty,
1928f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall             ExprValueKind VK, ExprObjectKind OK)
1929f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : Expr(MemberExprClass, ty, VK, OK,
1930bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           base->isTypeDependent(), base->isValueDependent(),
1931bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           base->containsUnexpandedParameterPack()),
19322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      Base(base), MemberDecl(memberdecl), MemberLoc(NameInfo.getLoc()),
19332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      MemberDNLoc(NameInfo.getInfo()), IsArrow(isarrow),
19342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      HasQualifierOrFoundDecl(false), HasExplicitTemplateArgumentList(false) {
19352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    assert(memberdecl->getDeclName() == NameInfo.getName());
19362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
19372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
19382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // NOTE: this constructor should be used only when it is known that
19392577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // the member name can not provide additional syntactic info
19402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // (i.e., source locations for C++ operator names or type source info
19412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // for constructors, destructors and conversion oeprators).
19422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  MemberExpr(Expr *base, bool isarrow, ValueDecl *memberdecl,
1943f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall             SourceLocation l, QualType ty,
1944f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall             ExprValueKind VK, ExprObjectKind OK)
1945f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : Expr(MemberExprClass, ty, VK, OK,
1946bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           base->isTypeDependent(), base->isValueDependent(),
1947bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           base->containsUnexpandedParameterPack()),
19482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      Base(base), MemberDecl(memberdecl), MemberLoc(l), MemberDNLoc(),
19492577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      IsArrow(isarrow),
19506bb8017bb9e828d118e15e59d71c66bba323c364John McCall      HasQualifierOrFoundDecl(false), HasExplicitTemplateArgumentList(false) {}
1951510190777c4bd53e960eea4665b204778fec1b64Eli Friedman
19521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static MemberExpr *Create(ASTContext &C, Expr *base, bool isarrow,
195340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                            NestedNameSpecifierLoc QualifierLoc,
1954161755a09898c95d21bfff33707da9ca41cd53c5John McCall                            ValueDecl *memberdecl, DeclAccessPair founddecl,
19552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                            DeclarationNameInfo MemberNameInfo,
1956d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                            const TemplateArgumentListInfo *targs,
1957f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                            QualType ty, ExprValueKind VK, ExprObjectKind OK);
19581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
195988a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  void setBase(Expr *E) { Base = E; }
19605549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getBase() const { return cast<Expr>(Base); }
196157e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor
196257e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor  /// \brief Retrieve the member declaration to which this expression refers.
196357e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor  ///
196457e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor  /// The returned declaration will either be a FieldDecl or (in C++)
196557e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor  /// a CXXMethodDecl.
1966f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *getMemberDecl() const { return MemberDecl; }
1967f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  void setMemberDecl(ValueDecl *D) { MemberDecl = D; }
19681f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor
19696bb8017bb9e828d118e15e59d71c66bba323c364John McCall  /// \brief Retrieves the declaration found by lookup.
1970161755a09898c95d21bfff33707da9ca41cd53c5John McCall  DeclAccessPair getFoundDecl() const {
19716bb8017bb9e828d118e15e59d71c66bba323c364John McCall    if (!HasQualifierOrFoundDecl)
1972161755a09898c95d21bfff33707da9ca41cd53c5John McCall      return DeclAccessPair::make(getMemberDecl(),
1973161755a09898c95d21bfff33707da9ca41cd53c5John McCall                                  getMemberDecl()->getAccess());
19746bb8017bb9e828d118e15e59d71c66bba323c364John McCall    return getMemberQualifier()->FoundDecl;
19756bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
19766bb8017bb9e828d118e15e59d71c66bba323c364John McCall
19771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Determines whether this member expression actually had
19780979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  /// a C++ nested-name-specifier prior to the name of the member, e.g.,
19790979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  /// x->Base::foo.
19806bb8017bb9e828d118e15e59d71c66bba323c364John McCall  bool hasQualifier() const { return getQualifier() != 0; }
19811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief If the member name was qualified, retrieves the
198383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  /// nested-name-specifier that precedes the member name. Otherwise, returns
198483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  /// NULL.
19851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NestedNameSpecifier *getQualifier() const {
19866bb8017bb9e828d118e15e59d71c66bba323c364John McCall    if (!HasQualifierOrFoundDecl)
198783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return 0;
19881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
198940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    return getMemberQualifier()->QualifierLoc.getNestedNameSpecifier();
199040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  }
199140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor
199240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  /// \brief If the member name was qualified, retrieves the
199340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  /// nested-name-specifier that precedes the member name, with source-location
199440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  /// information.
199540d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  NestedNameSpecifierLoc getQualifierLoc() const {
199640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    if (!hasQualifier())
199740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      return NestedNameSpecifierLoc();
199840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor
199940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    return getMemberQualifier()->QualifierLoc;
200083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
2001c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor
2002c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// \brief Determines whether this member expression actually had a C++
2003c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// template argument list explicitly specified, e.g., x.f<int>.
2004096832c5ed5b9106fa177ebc148489760c3bc496John McCall  bool hasExplicitTemplateArgs() const {
20051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return HasExplicitTemplateArgumentList;
2006c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  }
20071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2008d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  /// \brief Copies the template arguments (if present) into the given
2009d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  /// structure.
2010d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
2011096832c5ed5b9106fa177ebc148489760c3bc496John McCall    if (hasExplicitTemplateArgs())
2012096832c5ed5b9106fa177ebc148489760c3bc496John McCall      getExplicitTemplateArgs().copyInto(List);
2013096832c5ed5b9106fa177ebc148489760c3bc496John McCall  }
2014096832c5ed5b9106fa177ebc148489760c3bc496John McCall
2015096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// \brief Retrieve the explicit template argument list that
2016096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// follow the member template name.  This must only be called on an
2017096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// expression with explicit template arguments.
2018096832c5ed5b9106fa177ebc148489760c3bc496John McCall  ExplicitTemplateArgumentList &getExplicitTemplateArgs() {
2019096832c5ed5b9106fa177ebc148489760c3bc496John McCall    assert(HasExplicitTemplateArgumentList);
2020096832c5ed5b9106fa177ebc148489760c3bc496John McCall    if (!HasQualifierOrFoundDecl)
2021096832c5ed5b9106fa177ebc148489760c3bc496John McCall      return *reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1);
2022096832c5ed5b9106fa177ebc148489760c3bc496John McCall
2023096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return *reinterpret_cast<ExplicitTemplateArgumentList *>(
2024096832c5ed5b9106fa177ebc148489760c3bc496John McCall                                                      getMemberQualifier() + 1);
2025096832c5ed5b9106fa177ebc148489760c3bc496John McCall  }
2026096832c5ed5b9106fa177ebc148489760c3bc496John McCall
2027096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// \brief Retrieve the explicit template argument list that
2028096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// followed the member template name.  This must only be called on
2029096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// an expression with explicit template arguments.
2030096832c5ed5b9106fa177ebc148489760c3bc496John McCall  const ExplicitTemplateArgumentList &getExplicitTemplateArgs() const {
2031096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return const_cast<MemberExpr *>(this)->getExplicitTemplateArgs();
2032096832c5ed5b9106fa177ebc148489760c3bc496John McCall  }
2033096832c5ed5b9106fa177ebc148489760c3bc496John McCall
2034096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// \brief Retrieves the optional explicit template arguments.
2035096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// This points to the same data as getExplicitTemplateArgs(), but
2036096832c5ed5b9106fa177ebc148489760c3bc496John McCall  /// returns null if there are no explicit template arguments.
2037096832c5ed5b9106fa177ebc148489760c3bc496John McCall  const ExplicitTemplateArgumentList *getOptionalExplicitTemplateArgs() const {
2038096832c5ed5b9106fa177ebc148489760c3bc496John McCall    if (!hasExplicitTemplateArgs()) return 0;
2039096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return &getExplicitTemplateArgs();
2040d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
2041c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
20421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Retrieve the location of the left angle bracket following the
2043c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// member name ('<'), if any.
20441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation getLAngleLoc() const {
2045c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (!HasExplicitTemplateArgumentList)
2046c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor      return SourceLocation();
20471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2048096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return getExplicitTemplateArgs().LAngleLoc;
2049c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  }
20501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2051c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// \brief Retrieve the template arguments provided as part of this
2052c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// template-id.
2053833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgumentLoc *getTemplateArgs() const {
2054c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (!HasExplicitTemplateArgumentList)
20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return 0;
20561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2057096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return getExplicitTemplateArgs().getTemplateArgs();
2058c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  }
20591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2060c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// \brief Retrieve the number of template arguments provided as part of this
2061c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// template-id.
20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  unsigned getNumTemplateArgs() const {
2063c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (!HasExplicitTemplateArgumentList)
20641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return 0;
20651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2066096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return getExplicitTemplateArgs().NumTemplateArgs;
2067c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  }
20681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Retrieve the location of the right angle bracket following the
2070c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  /// template arguments ('>').
20711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation getRAngleLoc() const {
2072c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (!HasExplicitTemplateArgumentList)
2073c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor      return SourceLocation();
20741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2075096832c5ed5b9106fa177ebc148489760c3bc496John McCall    return getExplicitTemplateArgs().RAngleLoc;
2076c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  }
20771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  /// \brief Retrieve the member declaration name info.
20792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo getMemberNameInfo() const {
20802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return DeclarationNameInfo(MemberDecl->getDeclName(),
20812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                               MemberLoc, MemberDNLoc);
20822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
20832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
20845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isArrow() const { return IsArrow; }
20851f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor  void setArrow(bool A) { IsArrow = A; }
20861f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor
2087ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner  /// getMemberLoc - Return the location of the "member", in X->F, it is the
2088ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner  /// location of 'F'.
2089026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  SourceLocation getMemberLoc() const { return MemberLoc; }
20901f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor  void setMemberLoc(SourceLocation L) { MemberLoc = L; }
20915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
209275e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  SourceRange getSourceRange() const;
209375e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
209463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceLocation getExprLoc() const { return MemberLoc; }
20955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
209675e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  /// \brief Determine whether the base of this explicit is implicit.
209775e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  bool isImplicitAccess() const {
209875e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    return getBase() && getBase()->isImplicitCXXThis();
209975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  }
210075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
21011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
210283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    return T->getStmtClass() == MemberExprClass;
21035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
21045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const MemberExpr *) { return true; }
21051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21061237c673c07f9d827129ba02720108816abde562Ted Kremenek  // Iterators
210763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(&Base, &Base+1); }
21084045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis
21094045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  friend class ASTReader;
21104045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  friend class ASTStmtWriter;
21115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
21125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
21131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CompoundLiteralExpr - [C99 6.5.2.5]
2114aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff///
2115aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffclass CompoundLiteralExpr : public Expr {
21160fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner  /// LParenLoc - If non-null, this is the location of the left paren in a
21170fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner  /// compound literal like "(int){4}".  This can be null if this is a
21180fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner  /// synthesized compound expression.
21190fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner  SourceLocation LParenLoc;
21201d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall
21211d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  /// The type as written.  This can be an incomplete array type, in
21221d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  /// which case the actual expression type will be different.
212342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *TInfo;
21245549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt *Init;
2125e9b12198c4cc7f5687960100351b4af006c14469Steve Naroff  bool FileScope;
2126aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffpublic:
212742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo,
2128f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                      QualType T, ExprValueKind VK, Expr *init, bool fileScope)
2129f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary,
2130bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           tinfo->getType()->isDependentType(),
2131bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           init->isValueDependent(),
2132bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           init->containsUnexpandedParameterPack()),
213342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall      LParenLoc(lparenloc), TInfo(tinfo), Init(init), FileScope(fileScope) {}
21341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2135ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor  /// \brief Construct an empty compound literal.
2136ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor  explicit CompoundLiteralExpr(EmptyShell Empty)
2137ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor    : Expr(CompoundLiteralExprClass, Empty) { }
2138ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor
21395549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  const Expr *getInitializer() const { return cast<Expr>(Init); }
21405549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getInitializer() { return cast<Expr>(Init); }
2141ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor  void setInitializer(Expr *E) { Init = E; }
2142e9b12198c4cc7f5687960100351b4af006c14469Steve Naroff
2143e9b12198c4cc7f5687960100351b4af006c14469Steve Naroff  bool isFileScope() const { return FileScope; }
2144ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor  void setFileScope(bool FS) { FileScope = FS; }
2145ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor
21460fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner  SourceLocation getLParenLoc() const { return LParenLoc; }
2147ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor  void setLParenLoc(SourceLocation L) { LParenLoc = L; }
2148ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor
214942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *getTypeSourceInfo() const { return TInfo; }
215042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  void setTypeSourceInfo(TypeSourceInfo* tinfo) { TInfo = tinfo; }
215142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall
215263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
21530fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner    // FIXME: Init should never be null.
21540fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner    if (!Init)
21550fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner      return SourceRange();
21560fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner    if (LParenLoc.isInvalid())
215773d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner      return Init->getSourceRange();
21580fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner    return SourceRange(LParenLoc, Init->getLocEnd());
215973d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner  }
2160aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff
21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
21621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == CompoundLiteralExprClass;
2163aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff  }
2164aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff  static bool classof(const CompoundLiteralExpr *) { return true; }
21651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21661237c673c07f9d827129ba02720108816abde562Ted Kremenek  // Iterators
216763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(&Init, &Init+1); }
2168aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff};
2169aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff
217049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CastExpr - Base class for type casts, including both implicit
217149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// casts (ImplicitCastExpr) and explicit casts that have some
217249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// representation in the source code (ExplicitCastExpr's derived
217349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// classes).
21740835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisclass CastExpr : public Expr {
2175cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlssonpublic:
21765baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall  typedef clang::CastKind CastKind;
21771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2178cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlssonprivate:
21790835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  Stmt *Op;
2180409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson
2181daa8e4e888758d55a7a759dd4a91b83921cef222John McCall  void CheckCastConsistency() const {
2182409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson#ifndef NDEBUG
2183409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    switch (getCastKind()) {
21845cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    case CK_DerivedToBase:
2185cee22421929c91b481f4d1bb85cd48c0f6b7510bAnders Carlsson    case CK_UncheckedDerivedToBase:
2186cee22421929c91b481f4d1bb85cd48c0f6b7510bAnders Carlsson    case CK_DerivedToBaseMemberPointer:
2187409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_BaseToDerived:
2188409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_BaseToDerivedMemberPointer:
2189f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      assert(!path_empty() && "Cast kind should have a base path!");
2190f9d68e1dd015972318b2448f75115ff4fc3d5008Anders Carlsson      break;
2191409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson
2192409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    // These should not have an inheritance path.
2193409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_BitCast:
2194409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_Dynamic:
2195409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_ToUnion:
2196409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_ArrayToPointerDecay:
2197409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_FunctionToPointerDecay:
2198409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_NullToMemberPointer:
2199404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall    case CK_NullToPointer:
2200409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_ConstructorConversion:
2201409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_IntegralToPointer:
2202409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_PointerToIntegral:
2203409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_ToVoid:
2204409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_VectorSplat:
2205409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_IntegralCast:
2206409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_IntegralToFloating:
2207409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_FloatingToIntegral:
2208409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_FloatingCast:
2209409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_AnyPointerToObjCPointerCast:
2210409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    case CK_AnyPointerToBlockPointerCast:
2211569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor    case CK_ObjCObjectLValueCast:
22122bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    case CK_FloatingRealToComplex:
2213f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    case CK_FloatingComplexToReal:
22142bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    case CK_FloatingComplexCast:
2215f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    case CK_FloatingComplexToIntegralComplex:
22162bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    case CK_IntegralRealToComplex:
2217f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    case CK_IntegralComplexToReal:
22182bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    case CK_IntegralComplexCast:
2219f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    case CK_IntegralComplexToFloatingComplex:
2220daa8e4e888758d55a7a759dd4a91b83921cef222John McCall      assert(!getType()->isBooleanType() && "unheralded conversion to bool");
2221daa8e4e888758d55a7a759dd4a91b83921cef222John McCall      // fallthrough to check for null base path
2222daa8e4e888758d55a7a759dd4a91b83921cef222John McCall
2223daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    case CK_Dependent:
22240ae287a498b8cec2086fe6b7e753cbb3df63e74aJohn McCall    case CK_LValueToRValue:
2225f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    case CK_GetObjCProperty:
2226daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    case CK_NoOp:
2227daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    case CK_PointerToBoolean:
2228daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    case CK_IntegralToBoolean:
2229daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    case CK_FloatingToBoolean:
2230daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    case CK_MemberPointerToBoolean:
2231daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    case CK_FloatingComplexToBoolean:
2232daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    case CK_IntegralComplexToBoolean:
22335082d34e4107a44ac7f07b62f7a6c917e0e6e71eJohn McCall    case CK_LValueBitCast:            // -> bool&
22345082d34e4107a44ac7f07b62f7a6c917e0e6e71eJohn McCall    case CK_UserDefinedConversion:    // operator bool()
2235f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      assert(path_empty() && "Cast kind should not have a base path!");
2236409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson      break;
2237409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson    }
2238409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson#endif
2239409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson  }
2240409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson
2241f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  const CXXBaseSpecifier * const *path_buffer() const {
2242f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    return const_cast<CastExpr*>(this)->path_buffer();
2243f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  }
2244f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CXXBaseSpecifier **path_buffer();
2245f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
2246654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis  void setBasePathSize(unsigned basePathSize) {
2247654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis    CastExprBits.BasePathSize = basePathSize;
2248654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis    assert(CastExprBits.BasePathSize == basePathSize &&
2249654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis           "basePathSize doesn't fit in bits of CastExprBits.BasePathSize!");
2250654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis  }
2251654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis
22520835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisprotected:
2253f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  CastExpr(StmtClass SC, QualType ty, ExprValueKind VK,
2254f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall           const CastKind kind, Expr *op, unsigned BasePathSize) :
2255f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    Expr(SC, ty, VK, OK_Ordinary,
2256898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor         // Cast expressions are type-dependent if the type is
2257898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor         // dependent (C++ [temp.dep.expr]p3).
2258898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor         ty->isDependentType(),
2259898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor         // Cast expressions are value-dependent if the type is
2260898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor         // dependent or if the subexpression is value-dependent.
2261bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         ty->isDependentType() || (op && op->isValueDependent()),
2262bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         (ty->containsUnexpandedParameterPack() ||
2263bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          op->containsUnexpandedParameterPack())),
22648e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    Op(op) {
2265daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    assert(kind != CK_Invalid && "creating cast with invalid cast kind");
22668e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    CastExprBits.Kind = kind;
2267654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis    setBasePathSize(BasePathSize);
2268daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    CheckCastConsistency();
2269f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  }
22701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2271087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor  /// \brief Construct an empty cast.
2272f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize)
22738e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    : Expr(SC, Empty) {
2274654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis    setBasePathSize(BasePathSize);
22758e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  }
22761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22770835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidispublic:
22788e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; }
22798e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  void setCastKind(CastKind K) { CastExprBits.Kind = K; }
2280f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson  const char *getCastKindName() const;
2281f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson
22820835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  Expr *getSubExpr() { return cast<Expr>(Op); }
22830835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  const Expr *getSubExpr() const { return cast<Expr>(Op); }
2284087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor  void setSubExpr(Expr *E) { Op = E; }
2285087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor
22866eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// \brief Retrieve the cast subexpression as it was written in the source
22876eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// code, looking through any implicit casts or other intermediate nodes
22886eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// introduced by semantic analysis.
22896eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  Expr *getSubExprAsWritten();
22906eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  const Expr *getSubExprAsWritten() const {
22916eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    return const_cast<CastExpr *>(this)->getSubExprAsWritten();
22926eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  }
229341b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson
2294f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  typedef CXXBaseSpecifier **path_iterator;
2295f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  typedef const CXXBaseSpecifier * const *path_const_iterator;
22968e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  bool path_empty() const { return CastExprBits.BasePathSize == 0; }
22978e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  unsigned path_size() const { return CastExprBits.BasePathSize; }
2298f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  path_iterator path_begin() { return path_buffer(); }
2299f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  path_iterator path_end() { return path_buffer() + path_size(); }
2300f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  path_const_iterator path_begin() const { return path_buffer(); }
2301f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  path_const_iterator path_end() const { return path_buffer() + path_size(); }
2302f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
2303f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void setCastPath(const CXXCastPath &Path);
230441b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson
23051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
23064bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt    return T->getStmtClass() >= firstCastExprConstant &&
23074bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt           T->getStmtClass() <= lastCastExprConstant;
23080835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  }
23090835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  static bool classof(const CastExpr *) { return true; }
23101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23110835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  // Iterators
231263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(&Op, &Op+1); }
23130835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis};
23140835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis
231549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// ImplicitCastExpr - Allows us to explicitly represent implicit type
231649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// conversions, which have no direct representation in the original
231749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// source code. For example: converting T[]->T*, void f()->void
231849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// (*f)(), float->double, short->int, etc.
231949b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff///
2320bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// In C, implicit casts always produce rvalues. However, in C++, an
2321bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// implicit cast whose result is being bound to a reference will be
2322906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// an lvalue or xvalue. For example:
2323bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor///
2324bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// @code
2325bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// class Base { };
2326bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// class Derived : public Base { };
2327906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// Derived &&ref();
23281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// void f(Derived d) {
2329906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl///   Base& b = d; // initializer is an ImplicitCastExpr
2330906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl///                // to an lvalue of type Base
2331906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl///   Base&& r = ref(); // initializer is an ImplicitCastExpr
2332906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl///                     // to an xvalue of type Base
2333bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// }
2334bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// @endcode
23350835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisclass ImplicitCastExpr : public CastExpr {
2336906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redlprivate:
2337f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  ImplicitCastExpr(QualType ty, CastKind kind, Expr *op,
23385baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall                   unsigned BasePathLength, ExprValueKind VK)
2339f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength) {
23405baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall  }
234190045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff
2342087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor  /// \brief Construct an empty implicit cast.
2343f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  explicit ImplicitCastExpr(EmptyShell Shell, unsigned PathSize)
2344f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    : CastExpr(ImplicitCastExprClass, Shell, PathSize) { }
2345f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
2346f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic:
2347f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  enum OnStack_t { OnStack };
2348f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  ImplicitCastExpr(OnStack_t _, QualType ty, CastKind kind, Expr *op,
23495baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall                   ExprValueKind VK)
2350f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0) {
23515baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall  }
2352f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
2353f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  static ImplicitCastExpr *Create(ASTContext &Context, QualType T,
2354f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                  CastKind Kind, Expr *Operand,
2355f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                  const CXXCastPath *BasePath,
23565baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall                                  ExprValueKind Cat);
2357f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
2358f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  static ImplicitCastExpr *CreateEmpty(ASTContext &Context, unsigned PathSize);
2359087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor
236063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
23610835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis    return getSubExpr()->getSourceRange();
23620835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  }
236390045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff
23641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
23651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == ImplicitCastExprClass;
236649b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff  }
236749b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff  static bool classof(const ImplicitCastExpr *) { return true; }
236849b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff};
236949b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff
237049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// ExplicitCastExpr - An explicit cast written in the source
23711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// code.
237249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor///
237349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This class is effectively an abstract class, because it provides
237449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// the basic representation of an explicitly-written cast without
237549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// specifying which kind of cast (C cast, functional cast, static
237649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// cast, etc.) was written; specific derived classes represent the
237749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// particular style of cast and its location information.
23785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
237949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// Unlike implicit casts, explicit cast nodes have two different
238049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// types: the type that was written into the source code, and the
238149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// actual type of the expression as determined by semantic
238249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// analysis. These types may differ slightly. For example, in C++ one
238349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// can cast to a reference type, which indicates that the resulting
2384906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// expression will be an lvalue or xvalue. The reference type, however,
2385906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// will not be used as the type of the expression.
23860835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisclass ExplicitCastExpr : public CastExpr {
23879d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  /// TInfo - Source type info for the (written) type
23889d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  /// this expression is casting to.
23899d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *TInfo;
239049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
239149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorprotected:
2392f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  ExplicitCastExpr(StmtClass SC, QualType exprTy, ExprValueKind VK,
2393f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                   CastKind kind, Expr *op, unsigned PathSize,
2394f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                   TypeSourceInfo *writtenTy)
2395f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : CastExpr(SC, exprTy, VK, kind, op, PathSize), TInfo(writtenTy) {}
239649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
2397db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor  /// \brief Construct an empty explicit cast.
2398f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  ExplicitCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize)
2399f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    : CastExpr(SC, Shell, PathSize) { }
2400db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor
240149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic:
24029d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  /// getTypeInfoAsWritten - Returns the type source info for the type
24039d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  /// that this expression is casting to.
24049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; }
24059d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; }
24069d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall
240749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  /// getTypeAsWritten - Returns the type that this expression is
240849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  /// casting to, as written in the source code.
24099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  QualType getTypeAsWritten() const { return TInfo->getType(); }
241049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
24111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
24124bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt     return T->getStmtClass() >= firstExplicitCastExprConstant &&
24134bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt            T->getStmtClass() <= lastExplicitCastExprConstant;
241449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  }
241549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  static bool classof(const ExplicitCastExpr *) { return true; }
241649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor};
241749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
24186eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor/// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style
241949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// cast in C++ (C++ [expr.cast]), which uses the syntax
242049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// (Type)expr. For example: @c (int)f.
24216eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorclass CStyleCastExpr : public ExplicitCastExpr {
2422b2f9e516327310d95840d442416084508f80c183Steve Naroff  SourceLocation LPLoc; // the location of the left paren
2423b2f9e516327310d95840d442416084508f80c183Steve Naroff  SourceLocation RPLoc; // the location of the right paren
2424f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
2425f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  CStyleCastExpr(QualType exprTy, ExprValueKind vk, CastKind kind, Expr *op,
2426f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                 unsigned PathSize, TypeSourceInfo *writtenTy,
242741b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson                 SourceLocation l, SourceLocation r)
2428f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : ExplicitCastExpr(CStyleCastExprClass, exprTy, vk, kind, op, PathSize,
242941b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson                       writtenTy), LPLoc(l), RPLoc(r) {}
243049b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff
2431db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor  /// \brief Construct an empty C-style explicit cast.
2432f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize)
2433f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    : ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize) { }
2434f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
2435f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic:
2436f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  static CStyleCastExpr *Create(ASTContext &Context, QualType T,
2437f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                ExprValueKind VK, CastKind K,
2438f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                Expr *Op, const CXXCastPath *BasePath,
2439f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                TypeSourceInfo *WrittenTy, SourceLocation L,
2440f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                SourceLocation R);
2441f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
2442f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  static CStyleCastExpr *CreateEmpty(ASTContext &Context, unsigned PathSize);
2443db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor
2444b2f9e516327310d95840d442416084508f80c183Steve Naroff  SourceLocation getLParenLoc() const { return LPLoc; }
2445db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor  void setLParenLoc(SourceLocation L) { LPLoc = L; }
2446db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor
2447b2f9e516327310d95840d442416084508f80c183Steve Naroff  SourceLocation getRParenLoc() const { return RPLoc; }
2448db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor  void setRParenLoc(SourceLocation L) { RPLoc = L; }
2449db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor
245063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
2451b2f9e516327310d95840d442416084508f80c183Steve Naroff    return SourceRange(LPLoc, getSubExpr()->getSourceRange().getEnd());
24525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
24531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
24541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == CStyleCastExprClass;
24555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
24566eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor  static bool classof(const CStyleCastExpr *) { return true; }
24575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
24585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
24593fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// \brief A builtin binary operation expression such as "x + y" or "x <= y".
24603fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor///
24613fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// This expression node kind describes a builtin binary operation,
24623fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// such as "x + y" for integer values "x" and "y". The operands will
24633fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// already have been converted to appropriate types (e.g., by
24643fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// performing promotions or conversions).
24653fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor///
24663fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// In C++, where operators may be overloaded, a different kind of
24673fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// expression node (CXXOperatorCallExpr) is used to express the
24683fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// invocation of an overloaded operator with operator syntax. Within
24693fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is
24703fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// used to store an expression "x + y" depends on the subexpressions
24713fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// for x and y. If neither x or y is type-dependent, and the "+"
24723fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// operator resolves to a built-in operation, BinaryOperator will be
24733fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// used to express the computation (x and y may still be
24743fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// value-dependent). If either x or y is type-dependent, or if the
24753fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// "+" resolves to an overloaded operator, CXXOperatorCallExpr will
24763fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// be used to express the computation.
24775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass BinaryOperator : public Expr {
24785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
24795baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall  typedef BinaryOperatorKind Opcode;
24805baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall
248117d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattnerprivate:
24820799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  unsigned Opc : 6;
24830799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  SourceLocation OpLoc;
24840799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall
248517d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner  enum { LHS, RHS, END_EXPR };
24865549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt* SubExprs[END_EXPR];
24871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
24881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
248917d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner  BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy,
2490f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                 ExprValueKind VK, ExprObjectKind OK,
249117d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner                 SourceLocation opLoc)
2492f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : Expr(BinaryOperatorClass, ResTy, VK, OK,
2493898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor           lhs->isTypeDependent() || rhs->isTypeDependent(),
2494bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           lhs->isValueDependent() || rhs->isValueDependent(),
2495bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           (lhs->containsUnexpandedParameterPack() ||
2496bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor            rhs->containsUnexpandedParameterPack())),
2497898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor      Opc(opc), OpLoc(opLoc) {
24981237c673c07f9d827129ba02720108816abde562Ted Kremenek    SubExprs[LHS] = lhs;
24991237c673c07f9d827129ba02720108816abde562Ted Kremenek    SubExprs[RHS] = rhs;
25001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(!isCompoundAssignmentOp() &&
25015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           "Use ArithAssignBinaryOperator for compound assignments");
25025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
25035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2504db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor  /// \brief Construct an empty binary operator.
25051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  explicit BinaryOperator(EmptyShell Empty)
25062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    : Expr(BinaryOperatorClass, Empty), Opc(BO_Comma) { }
2507db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor
250817d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner  SourceLocation getOperatorLoc() const { return OpLoc; }
2509db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor  void setOperatorLoc(SourceLocation L) { OpLoc = L; }
2510db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor
25110799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  Opcode getOpcode() const { return static_cast<Opcode>(Opc); }
2512db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor  void setOpcode(Opcode O) { Opc = O; }
2513db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor
25145549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
2515db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor  void setLHS(Expr *E) { SubExprs[LHS] = E; }
25165549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
2517db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor  void setRHS(Expr *E) { SubExprs[RHS] = E; }
2518db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor
251963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
25205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return SourceRange(getLHS()->getLocStart(), getRHS()->getLocEnd());
25215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
25221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
25245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// corresponds to, e.g. "<<=".
25255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static const char *getOpcodeStr(Opcode Op);
25265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
25270799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  const char *getOpcodeStr() const { return getOpcodeStr(getOpcode()); }
2528a84c02d0f4d63975a1c52b9bb8308d88e9d79352Ted Kremenek
2529063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  /// \brief Retrieve the binary opcode that corresponds to the given
2530063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  /// overloaded operator.
2531063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  static Opcode getOverloadedOpcode(OverloadedOperatorKind OO);
2532063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor
2533063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  /// \brief Retrieve the overloaded operator kind that corresponds to
2534063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  /// the given binary opcode.
2535063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  static OverloadedOperatorKind getOverloadedOperator(Opcode Opc);
2536063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor
25375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// predicates to categorize the respective opcodes.
2538200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl  bool isPtrMemOp() const { return Opc == BO_PtrMemD || Opc == BO_PtrMemI; }
25392de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  bool isMultiplicativeOp() const { return Opc >= BO_Mul && Opc <= BO_Rem; }
25402de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  static bool isAdditiveOp(Opcode Opc) { return Opc == BO_Add || Opc==BO_Sub; }
25410799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  bool isAdditiveOp() const { return isAdditiveOp(getOpcode()); }
25422de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  static bool isShiftOp(Opcode Opc) { return Opc == BO_Shl || Opc == BO_Shr; }
25430799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  bool isShiftOp() const { return isShiftOp(getOpcode()); }
2544aee3c9375f97a49edef2a36f15df6abd9748e2a1Sebastian Redl
25452de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  static bool isBitwiseOp(Opcode Opc) { return Opc >= BO_And && Opc <= BO_Or; }
25460799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  bool isBitwiseOp() const { return isBitwiseOp(getOpcode()); }
2547f2da7a06f6b98c3886d9b871ab839f5085b1c238Ted Kremenek
25482de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  static bool isRelationalOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_GE; }
25490799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  bool isRelationalOp() const { return isRelationalOp(getOpcode()); }
2550f2da7a06f6b98c3886d9b871ab839f5085b1c238Ted Kremenek
25512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  static bool isEqualityOp(Opcode Opc) { return Opc == BO_EQ || Opc == BO_NE; }
25520799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  bool isEqualityOp() const { return isEqualityOp(getOpcode()); }
25531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25542de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  static bool isComparisonOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_NE; }
25550799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  bool isComparisonOp() const { return isComparisonOp(getOpcode()); }
2556aee3c9375f97a49edef2a36f15df6abd9748e2a1Sebastian Redl
25572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  static bool isLogicalOp(Opcode Opc) { return Opc == BO_LAnd || Opc==BO_LOr; }
25580799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall  bool isLogicalOp() const { return isLogicalOp(getOpcode()); }
2559f2da7a06f6b98c3886d9b871ab839f5085b1c238Ted Kremenek
25600e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  static bool isAssignmentOp(Opcode Opc) {
25610e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall    return Opc >= BO_Assign && Opc <= BO_OrAssign;
25620e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  }
25630e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  bool isAssignmentOp() const { return isAssignmentOp(getOpcode()); }
25640e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall
25650e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  static bool isCompoundAssignmentOp(Opcode Opc) {
25662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    return Opc > BO_Assign && Opc <= BO_OrAssign;
25672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  }
25680e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  bool isCompoundAssignmentOp() const {
25690e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall    return isCompoundAssignmentOp(getOpcode());
25700e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  }
25710e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall
25720e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  static bool isShiftAssignOp(Opcode Opc) {
25732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    return Opc == BO_ShlAssign || Opc == BO_ShrAssign;
25742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  }
25750e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  bool isShiftAssignOp() const {
25760e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall    return isShiftAssignOp(getOpcode());
25770e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  }
25781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *S) {
25804bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt    return S->getStmtClass() >= firstBinaryOperatorConstant &&
25814bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt           S->getStmtClass() <= lastBinaryOperatorConstant;
25825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
25835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const BinaryOperator *) { return true; }
25841237c673c07f9d827129ba02720108816abde562Ted Kremenek
25851237c673c07f9d827129ba02720108816abde562Ted Kremenek  // Iterators
258663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() {
258763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
258863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
25891237c673c07f9d827129ba02720108816abde562Ted Kremenek
25905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprotected:
259117d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner  BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy,
2592f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                 ExprValueKind VK, ExprObjectKind OK,
25932333f7727f97018d6742e1e0938133bcfad967abEli Friedman                 SourceLocation opLoc, bool dead)
2594f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : Expr(CompoundAssignOperatorClass, ResTy, VK, OK,
25952333f7727f97018d6742e1e0938133bcfad967abEli Friedman           lhs->isTypeDependent() || rhs->isTypeDependent(),
2596bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           lhs->isValueDependent() || rhs->isValueDependent(),
2597bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           (lhs->containsUnexpandedParameterPack() ||
2598bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor            rhs->containsUnexpandedParameterPack())),
25992333f7727f97018d6742e1e0938133bcfad967abEli Friedman      Opc(opc), OpLoc(opLoc) {
26001237c673c07f9d827129ba02720108816abde562Ted Kremenek    SubExprs[LHS] = lhs;
26011237c673c07f9d827129ba02720108816abde562Ted Kremenek    SubExprs[RHS] = rhs;
26025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2603ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor
26041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator(StmtClass SC, EmptyShell Empty)
26052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    : Expr(SC, Empty), Opc(BO_MulAssign) { }
26065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
26075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
26085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CompoundAssignOperator - For compound assignments (e.g. +=), we keep
26095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// track of the type the operation is performed in.  Due to the semantics of
26105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// these operators, the operands are promoted, the aritmetic performed, an
26115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// implicit conversion back to the result type done, then the assignment takes
26125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// place.  This captures the intermediate type which the computation is done
26135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// in.
26145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CompoundAssignOperator : public BinaryOperator {
2615ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  QualType ComputationLHSType;
2616ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  QualType ComputationResultType;
26175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
2618f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  CompoundAssignOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResType,
2619f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                         ExprValueKind VK, ExprObjectKind OK,
2620f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                         QualType CompLHSType, QualType CompResultType,
262117d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner                         SourceLocation OpLoc)
2622f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : BinaryOperator(lhs, rhs, opc, ResType, VK, OK, OpLoc, true),
2623ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman      ComputationLHSType(CompLHSType),
2624ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman      ComputationResultType(CompResultType) {
26251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(isCompoundAssignmentOp() &&
26265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           "Only should be used for compound assignments");
26275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
26285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2629ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor  /// \brief Build an empty compound assignment operator expression.
2630ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor  explicit CompoundAssignOperator(EmptyShell Empty)
2631ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor    : BinaryOperator(CompoundAssignOperatorClass, Empty) { }
2632ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor
2633ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  // The two computation types are the type the LHS is converted
2634ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  // to for the computation and the type of the result; the two are
2635ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  // distinct in a few cases (specifically, int+=ptr and ptr-=ptr).
2636ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  QualType getComputationLHSType() const { return ComputationLHSType; }
2637ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor  void setComputationLHSType(QualType T) { ComputationLHSType = T; }
2638ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor
2639ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  QualType getComputationResultType() const { return ComputationResultType; }
2640ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor  void setComputationResultType(QualType T) { ComputationResultType = T; }
2641ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor
26425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const CompoundAssignOperator *) { return true; }
26431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *S) {
26441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return S->getStmtClass() == CompoundAssignOperatorClass;
26455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
26465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
26475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
264856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// AbstractConditionalOperator - An abstract base class for
264956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// ConditionalOperator and BinaryConditionalOperator.
265056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass AbstractConditionalOperator : public Expr {
265156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  SourceLocation QuestionLoc, ColonLoc;
265256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  friend class ASTStmtReader;
265356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
265456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallprotected:
265556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  AbstractConditionalOperator(StmtClass SC, QualType T,
265656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                              ExprValueKind VK, ExprObjectKind OK,
265756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                              bool TD, bool VD,
265856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                              bool ContainsUnexpandedParameterPack,
265956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                              SourceLocation qloc,
266056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                              SourceLocation cloc)
266156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    : Expr(SC, T, VK, OK, TD, VD, ContainsUnexpandedParameterPack),
266256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      QuestionLoc(qloc), ColonLoc(cloc) {}
266356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
266456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  AbstractConditionalOperator(StmtClass SC, EmptyShell Empty)
266556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    : Expr(SC, Empty) { }
266656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
266756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic:
266856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // getCond - Return the expression representing the condition for
266956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  //   the ?: operator.
267056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *getCond() const;
267156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
267256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // getTrueExpr - Return the subexpression representing the value of
267356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  //   the expression if the condition evaluates to true.
267456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *getTrueExpr() const;
267556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
267656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // getFalseExpr - Return the subexpression representing the value of
267756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  //   the expression if the condition evaluates to false.  This is
267856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  //   the same as getRHS.
267956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *getFalseExpr() const;
268056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
268156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  SourceLocation getQuestionLoc() const { return QuestionLoc; }
268256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  SourceLocation getColonLoc() const { return ColonLoc; }
268356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
268456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  static bool classof(const Stmt *T) {
268556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return T->getStmtClass() == ConditionalOperatorClass ||
268656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall           T->getStmtClass() == BinaryConditionalOperatorClass;
268756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
268856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  static bool classof(const AbstractConditionalOperator *) { return true; }
268956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall};
269056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
269156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// ConditionalOperator - The ?: ternary operator.  The GNU "missing
269256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// middle" extension is a BinaryConditionalOperator.
269356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass ConditionalOperator : public AbstractConditionalOperator {
26941237c673c07f9d827129ba02720108816abde562Ted Kremenek  enum { COND, LHS, RHS, END_EXPR };
26955549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
269656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
269756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  friend class ASTStmtReader;
26985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
269947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor  ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs,
270056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                      SourceLocation CLoc, Expr *rhs,
27010943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall                      QualType t, ExprValueKind VK, ExprObjectKind OK)
270256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK,
2703898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor           // FIXME: the type of the conditional operator doesn't
2704898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor           // depend on the type of the conditional, but the standard
2705898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor           // seems to imply that it could. File a bug!
270656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall           (lhs->isTypeDependent() || rhs->isTypeDependent()),
270756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall           (cond->isValueDependent() || lhs->isValueDependent() ||
270856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall            rhs->isValueDependent()),
2709bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           (cond->containsUnexpandedParameterPack() ||
271056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall            lhs->containsUnexpandedParameterPack() ||
271156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall            rhs->containsUnexpandedParameterPack()),
271256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                  QLoc, CLoc) {
27131237c673c07f9d827129ba02720108816abde562Ted Kremenek    SubExprs[COND] = cond;
27141237c673c07f9d827129ba02720108816abde562Ted Kremenek    SubExprs[LHS] = lhs;
27151237c673c07f9d827129ba02720108816abde562Ted Kremenek    SubExprs[RHS] = rhs;
27161237c673c07f9d827129ba02720108816abde562Ted Kremenek  }
27175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2718ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor  /// \brief Build an empty conditional operator.
2719ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor  explicit ConditionalOperator(EmptyShell Empty)
272056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { }
2721ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor
2722395a2abf0028968d85958610e393e067885dc14fTed Kremenek  // getCond - Return the expression representing the condition for
272356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  //   the ?: operator.
27245549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
2725395a2abf0028968d85958610e393e067885dc14fTed Kremenek
272656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // getTrueExpr - Return the subexpression representing the value of
272756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  //   the expression if the condition evaluates to true.
272856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *getTrueExpr() const { return cast<Expr>(SubExprs[LHS]); }
27291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
273056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // getFalseExpr - Return the subexpression representing the value of
273156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  //   the expression if the condition evaluates to false.  This is
273256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  //   the same as getRHS.
27335549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); }
2734f9b949fecf339a2c9bd97dd11a272c4878f85ce4Fariborz Jahanian
273556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
27365549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
273747e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor
273863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
27395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return SourceRange(getCond()->getLocStart(), getRHS()->getLocEnd());
27405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
27411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
27421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == ConditionalOperatorClass;
27435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
27445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const ConditionalOperator *) { return true; }
27451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27461237c673c07f9d827129ba02720108816abde562Ted Kremenek  // Iterators
274763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() {
274863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
274963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
27505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
27515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
275256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// BinaryConditionalOperator - The GNU extension to the conditional
275356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// operator which allows the middle operand to be omitted.
275456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall///
275556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// This is a different expression kind on the assumption that almost
275656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// every client ends up needing to know that these are different.
275756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass BinaryConditionalOperator : public AbstractConditionalOperator {
275856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  enum { COMMON, COND, LHS, RHS, NUM_SUBEXPRS };
275956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
276056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// - the common condition/left-hand-side expression, which will be
276156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ///   evaluated as the opaque value
276256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// - the condition, expressed in terms of the opaque value
276356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// - the left-hand-side, expressed in terms of the opaque value
276456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// - the right-hand-side
276556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Stmt *SubExprs[NUM_SUBEXPRS];
276656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OpaqueValueExpr *OpaqueValue;
276756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
276856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  friend class ASTStmtReader;
276956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic:
277056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  BinaryConditionalOperator(Expr *common, OpaqueValueExpr *opaqueValue,
277156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                            Expr *cond, Expr *lhs, Expr *rhs,
277256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                            SourceLocation qloc, SourceLocation cloc,
277356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                            QualType t, ExprValueKind VK, ExprObjectKind OK)
277456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    : AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK,
277556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall           (common->isTypeDependent() || rhs->isTypeDependent()),
277656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall           (common->isValueDependent() || rhs->isValueDependent()),
277756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall           (common->containsUnexpandedParameterPack() ||
277856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall            rhs->containsUnexpandedParameterPack()),
277956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                  qloc, cloc),
278056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      OpaqueValue(opaqueValue) {
278156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    SubExprs[COMMON] = common;
278256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    SubExprs[COND] = cond;
278356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    SubExprs[LHS] = lhs;
278456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    SubExprs[RHS] = rhs;
278556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
278656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    OpaqueValue->setSourceExpr(common);
278756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
278856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
278956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// \brief Build an empty conditional operator.
279056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  explicit BinaryConditionalOperator(EmptyShell Empty)
279156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    : AbstractConditionalOperator(BinaryConditionalOperatorClass, Empty) { }
279256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
279356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// \brief getCommon - Return the common expression, written to the
279456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ///   left of the condition.  The opaque value will be bound to the
279556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ///   result of this expression.
279656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *getCommon() const { return cast<Expr>(SubExprs[COMMON]); }
279756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
279856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// \brief getOpaqueValue - Return the opaque value placeholder.
279956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; }
280056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
280156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// \brief getCond - Return the condition expression; this is defined
280256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ///   in terms of the opaque value.
280356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
280456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
280556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// \brief getTrueExpr - Return the subexpression which will be
280656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ///   evaluated if the condition evaluates to true;  this is defined
280756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ///   in terms of the opaque value.
280856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *getTrueExpr() const {
280956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return cast<Expr>(SubExprs[LHS]);
281056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
281156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
281256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  /// \brief getFalseExpr - Return the subexpression which will be
281356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ///   evaluated if the condnition evaluates to false; this is
281456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ///   defined in terms of the opaque value.
281556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Expr *getFalseExpr() const {
281656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return cast<Expr>(SubExprs[RHS]);
281756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
281856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
281956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  SourceRange getSourceRange() const {
282056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return SourceRange(getCommon()->getLocStart(), getFalseExpr()->getLocEnd());
282156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
282256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  static bool classof(const Stmt *T) {
282356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return T->getStmtClass() == BinaryConditionalOperatorClass;
282456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
282556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  static bool classof(const BinaryConditionalOperator *) { return true; }
282656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
282756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // Iterators
282856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  child_range children() {
282956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return child_range(SubExprs, SubExprs + NUM_SUBEXPRS);
283056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  }
283156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall};
283256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
283356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallinline Expr *AbstractConditionalOperator::getCond() const {
283456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
283556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return co->getCond();
283656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  return cast<BinaryConditionalOperator>(this)->getCond();
283756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
283856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
283956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallinline Expr *AbstractConditionalOperator::getTrueExpr() const {
284056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
284156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return co->getTrueExpr();
284256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  return cast<BinaryConditionalOperator>(this)->getTrueExpr();
284356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
284456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
284556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallinline Expr *AbstractConditionalOperator::getFalseExpr() const {
284656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this))
284756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return co->getFalseExpr();
284856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  return cast<BinaryConditionalOperator>(this)->getFalseExpr();
284956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
285056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
28516481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner/// AddrLabelExpr - The GNU address of label extension, representing &&label.
28526481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnerclass AddrLabelExpr : public Expr {
28535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation AmpAmpLoc, LabelLoc;
2854ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  LabelDecl *Label;
28555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
2856ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelDecl *L,
28576481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner                QualType t)
2858bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    : Expr(AddrLabelExprClass, t, VK_RValue, OK_Ordinary, false, false, false),
28592333f7727f97018d6742e1e0938133bcfad967abEli Friedman      AmpAmpLoc(AALoc), LabelLoc(LLoc), Label(L) {}
28601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28617d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor  /// \brief Build an empty address of a label expression.
28621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  explicit AddrLabelExpr(EmptyShell Empty)
28637d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor    : Expr(AddrLabelExprClass, Empty) { }
28647d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor
28657d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor  SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; }
28667d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor  void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; }
28677d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor  SourceLocation getLabelLoc() const { return LabelLoc; }
28687d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor  void setLabelLoc(SourceLocation L) { LabelLoc = L; }
28697d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor
287063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
28715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return SourceRange(AmpAmpLoc, LabelLoc);
28725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
28731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2874ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  LabelDecl *getLabel() const { return Label; }
2875ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  void setLabel(LabelDecl *L) { Label = L; }
28767d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor
28775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool classof(const Stmt *T) {
28781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == AddrLabelExprClass;
28795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
28806481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner  static bool classof(const AddrLabelExpr *) { return true; }
28811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28821237c673c07f9d827129ba02720108816abde562Ted Kremenek  // Iterators
288363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
28845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2885ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
2886ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner/// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
2887ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner/// The StmtExpr contains a single CompoundStmt node, which it evaluates and
2888ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner/// takes the value of the last subexpression.
2889f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall///
2890f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall/// A StmtExpr is always an r-value; values "returned" out of a
2891f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall/// StmtExpr will be copied.
2892ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnerclass StmtExpr : public Expr {
28935549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt *SubStmt;
2894ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  SourceLocation LParenLoc, RParenLoc;
2895ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnerpublic:
28962333f7727f97018d6742e1e0938133bcfad967abEli Friedman  // FIXME: Does type-dependence need to be computed differently?
2897d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff  StmtExpr(CompoundStmt *substmt, QualType T,
2898d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff           SourceLocation lp, SourceLocation rp) :
2899f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    Expr(StmtExprClass, T, VK_RValue, OK_Ordinary,
2900bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         T->isDependentType(), false, false),
29012333f7727f97018d6742e1e0938133bcfad967abEli Friedman    SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) { }
29021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29036a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor  /// \brief Build an empty statement expression.
29046a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor  explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { }
29056a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor
29065549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); }
29075549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); }
29086a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor  void setSubStmt(CompoundStmt *S) { SubStmt = S; }
29096a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor
291063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
2911ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner    return SourceRange(LParenLoc, RParenLoc);
2912ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  }
29131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2914026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  SourceLocation getLParenLoc() const { return LParenLoc; }
29156a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor  void setLParenLoc(SourceLocation L) { LParenLoc = L; }
2916026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  SourceLocation getRParenLoc() const { return RParenLoc; }
29176a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
29181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2919ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  static bool classof(const Stmt *T) {
29201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == StmtExprClass;
2921ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  }
2922ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  static bool classof(const StmtExpr *) { return true; }
29231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29241237c673c07f9d827129ba02720108816abde562Ted Kremenek  // Iterators
292563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(&SubStmt, &SubStmt+1); }
2926ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner};
2927ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
2928d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff
2929d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// ShuffleVectorExpr - clang-specific builtin-in function
2930d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// __builtin_shufflevector.
2931d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// This AST node represents a operator that does a constant
2932d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// shuffle, similar to LLVM's shufflevector instruction. It takes
2933d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// two vectors and a variable number of constant indices,
2934d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// and returns the appropriately shuffled vector.
2935d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanclass ShuffleVectorExpr : public Expr {
2936d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  SourceLocation BuiltinLoc, RParenLoc;
2937d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman
2938d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  // SubExprs - the list of values passed to the __builtin_shufflevector
2939d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  // function. The first two are vectors, and the rest are constant
2940d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  // indices.  The number of values in this list is always
2941d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  // 2+the number of indices in the vector type.
29425549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt **SubExprs;
2943d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  unsigned NumExprs;
2944d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman
2945d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanpublic:
2946a88dc3079bedf70a5cfc39791727e43a10383006Nate Begeman  ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr,
29471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    QualType Type, SourceLocation BLoc,
2948bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                    SourceLocation RP);
294994cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor
295094cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  /// \brief Build an empty vector-shuffle expression.
29511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  explicit ShuffleVectorExpr(EmptyShell Empty)
295294cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor    : Expr(ShuffleVectorExprClass, Empty), SubExprs(0) { }
295394cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor
295494cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
295594cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
29561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
295794cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  SourceLocation getRParenLoc() const { return RParenLoc; }
295894cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
295994cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor
296063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
2961d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    return SourceRange(BuiltinLoc, RParenLoc);
2962d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
2963d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  static bool classof(const Stmt *T) {
29641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == ShuffleVectorExprClass;
2965d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
2966d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  static bool classof(const ShuffleVectorExpr *) { return true; }
29671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2968d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  /// getNumSubExprs - Return the size of the SubExprs array.  This includes the
2969d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  /// constant expression, the actual arguments passed in, and the function
2970d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  /// pointers.
2971d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  unsigned getNumSubExprs() const { return NumExprs; }
29721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2973aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \brief Retrieve the array of expressions.
2974aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); }
2975aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2976d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  /// getExpr - Return the Expr at the specified index.
2977d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  Expr *getExpr(unsigned Index) {
2978d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    assert((Index < NumExprs) && "Arg access out of range!");
29795549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek    return cast<Expr>(SubExprs[Index]);
2980d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
2981d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  const Expr *getExpr(unsigned Index) const {
2982d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    assert((Index < NumExprs) && "Arg access out of range!");
29835549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek    return cast<Expr>(SubExprs[Index]);
2984d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
29851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2986888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman  void setExprs(ASTContext &C, Expr ** Exprs, unsigned NumExprs);
298794cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor
2988dde8c94873976632e3ada4d8d067e1e244184d51Eli Friedman  unsigned getShuffleMaskIdx(ASTContext &Ctx, unsigned N) {
2989dde8c94873976632e3ada4d8d067e1e244184d51Eli Friedman    assert((N < NumExprs - 2) && "Shuffle idx out of range!");
29909a901bb63990574ff0bcc12ff851d7a71cff8ddbEli Friedman    return getExpr(N+2)->EvaluateAsInt(Ctx).getZExtValue();
2991d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
29921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2993d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  // Iterators
299463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() {
299563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range(&SubExprs[0], &SubExprs[0]+NumExprs);
299663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
2997d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman};
2998d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman
2999d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff/// ChooseExpr - GNU builtin-in function __builtin_choose_expr.
30001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// This AST node is similar to the conditional operator (?:) in C, with
3001d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff/// the following exceptions:
30027976932a1c256d447316ffac58e9821417725e34Eli Friedman/// - the test expression must be a integer constant expression.
30037976932a1c256d447316ffac58e9821417725e34Eli Friedman/// - the expression returned acts like the chosen subexpression in every
30047976932a1c256d447316ffac58e9821417725e34Eli Friedman///   visible way: the type is the same as that of the chosen subexpression,
30057976932a1c256d447316ffac58e9821417725e34Eli Friedman///   and all predicates (whether it's an l-value, whether it's an integer
30067976932a1c256d447316ffac58e9821417725e34Eli Friedman///   constant expression, etc.) return the same result as for the chosen
30077976932a1c256d447316ffac58e9821417725e34Eli Friedman///   sub-expression.
3008d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffclass ChooseExpr : public Expr {
30091237c673c07f9d827129ba02720108816abde562Ted Kremenek  enum { COND, LHS, RHS, END_EXPR };
30105549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
3011d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  SourceLocation BuiltinLoc, RParenLoc;
3012d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffpublic:
3013f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs,
3014f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall             QualType t, ExprValueKind VK, ExprObjectKind OK,
3015ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor             SourceLocation RP, bool TypeDependent, bool ValueDependent)
3016bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    : Expr(ChooseExprClass, t, VK, OK, TypeDependent, ValueDependent,
3017bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           (cond->containsUnexpandedParameterPack() ||
3018bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor            lhs->containsUnexpandedParameterPack() ||
3019bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor            rhs->containsUnexpandedParameterPack())),
30201237c673c07f9d827129ba02720108816abde562Ted Kremenek      BuiltinLoc(BLoc), RParenLoc(RP) {
30211237c673c07f9d827129ba02720108816abde562Ted Kremenek      SubExprs[COND] = cond;
30221237c673c07f9d827129ba02720108816abde562Ted Kremenek      SubExprs[LHS] = lhs;
30231237c673c07f9d827129ba02720108816abde562Ted Kremenek      SubExprs[RHS] = rhs;
30241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
30257976932a1c256d447316ffac58e9821417725e34Eli Friedman
302644cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  /// \brief Build an empty __builtin_choose_expr.
302744cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { }
302844cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor
30297976932a1c256d447316ffac58e9821417725e34Eli Friedman  /// isConditionTrue - Return whether the condition is true (i.e. not
30307976932a1c256d447316ffac58e9821417725e34Eli Friedman  /// equal to zero).
30314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  bool isConditionTrue(const ASTContext &C) const;
30327976932a1c256d447316ffac58e9821417725e34Eli Friedman
30337976932a1c256d447316ffac58e9821417725e34Eli Friedman  /// getChosenSubExpr - Return the subexpression chosen according to the
30347976932a1c256d447316ffac58e9821417725e34Eli Friedman  /// condition.
30354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad  Expr *getChosenSubExpr(const ASTContext &C) const {
30367976932a1c256d447316ffac58e9821417725e34Eli Friedman    return isConditionTrue(C) ? getLHS() : getRHS();
30377976932a1c256d447316ffac58e9821417725e34Eli Friedman  }
30387976932a1c256d447316ffac58e9821417725e34Eli Friedman
30395549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
304044cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  void setCond(Expr *E) { SubExprs[COND] = E; }
30415549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
304244cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  void setLHS(Expr *E) { SubExprs[LHS] = E; }
30435549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
304444cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  void setRHS(Expr *E) { SubExprs[RHS] = E; }
304544cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor
304644cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
304744cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
30481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
304944cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  SourceLocation getRParenLoc() const { return RParenLoc; }
305044cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
30511237c673c07f9d827129ba02720108816abde562Ted Kremenek
305263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
3053d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff    return SourceRange(BuiltinLoc, RParenLoc);
3054d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  }
3055d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  static bool classof(const Stmt *T) {
30561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == ChooseExprClass;
3057d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  }
3058d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  static bool classof(const ChooseExpr *) { return true; }
30591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30601237c673c07f9d827129ba02720108816abde562Ted Kremenek  // Iterators
306163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() {
306263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
306363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
3064d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff};
3065d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff
30662d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// GNUNullExpr - Implements the GNU __null extension, which is a name
30672d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// for a null pointer constant that has integral type (e.g., int or
30682d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// long) and is the same size and alignment as a pointer. The __null
30692d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// extension is typically only used by system headers, which define
30702d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// NULL as __null in C++ rather than using 0 (which is an integer
30712d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// that may not match the size of a pointer).
30722d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorclass GNUNullExpr : public Expr {
30732d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  /// TokenLoc - The location of the __null keyword.
30742d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  SourceLocation TokenLoc;
30752d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
30762d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorpublic:
30771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  GNUNullExpr(QualType Ty, SourceLocation Loc)
3078bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    : Expr(GNUNullExprClass, Ty, VK_RValue, OK_Ordinary, false, false, false),
3079f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      TokenLoc(Loc) { }
30802d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
308144cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  /// \brief Build an empty GNU __null expression.
308244cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  explicit GNUNullExpr(EmptyShell Empty) : Expr(GNUNullExprClass, Empty) { }
308344cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor
30842d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  /// getTokenLocation - The location of the __null token.
30852d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  SourceLocation getTokenLocation() const { return TokenLoc; }
308644cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor  void setTokenLocation(SourceLocation L) { TokenLoc = L; }
30872d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
308863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
30892d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor    return SourceRange(TokenLoc);
30902d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  }
30912d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  static bool classof(const Stmt *T) {
30921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == GNUNullExprClass;
30932d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  }
30942d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  static bool classof(const GNUNullExpr *) { return true; }
30951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30962d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  // Iterators
309763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
30982d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor};
30992d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
310074626d6ef2e194fcc911e071556660ff331eb4a8Zhongxing Xu/// VAArgExpr, used for the builtin function __builtin_va_arg.
31017c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonclass VAArgExpr : public Expr {
31025549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Stmt *Val;
31032cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara  TypeSourceInfo *TInfo;
31047c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  SourceLocation BuiltinLoc, RParenLoc;
31057c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonpublic:
31062cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara  VAArgExpr(SourceLocation BLoc, Expr* e, TypeSourceInfo *TInfo,
31072cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara            SourceLocation RPLoc, QualType t)
3108f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : Expr(VAArgExprClass, t, VK_RValue, OK_Ordinary,
3109bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           t->isDependentType(), false,
3110bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           (TInfo->getType()->containsUnexpandedParameterPack() ||
3111bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor            e->containsUnexpandedParameterPack())),
31122cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara      Val(e), TInfo(TInfo),
31137c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson      BuiltinLoc(BLoc),
31147c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson      RParenLoc(RPLoc) { }
31151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
311674626d6ef2e194fcc911e071556660ff331eb4a8Zhongxing Xu  /// \brief Create an empty __builtin_va_arg expression.
3117d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  explicit VAArgExpr(EmptyShell Empty) : Expr(VAArgExprClass, Empty) { }
3118d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor
31195549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  const Expr *getSubExpr() const { return cast<Expr>(Val); }
31205549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  Expr *getSubExpr() { return cast<Expr>(Val); }
3121d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  void setSubExpr(Expr *E) { Val = E; }
3122d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor
31232cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara  TypeSourceInfo *getWrittenTypeInfo() const { return TInfo; }
31242cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara  void setWrittenTypeInfo(TypeSourceInfo *TI) { TInfo = TI; }
31252cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara
3126d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
3127d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
31281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3129d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  SourceLocation getRParenLoc() const { return RParenLoc; }
3130d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
3131d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor
313263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
31337c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson    return SourceRange(BuiltinLoc, RParenLoc);
31341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
31357c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  static bool classof(const Stmt *T) {
31367c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson    return T->getStmtClass() == VAArgExprClass;
31377c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  }
31387c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  static bool classof(const VAArgExpr *) { return true; }
31391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31407c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  // Iterators
314163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(&Val, &Val+1); }
31427c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson};
31431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @brief Describes an C or C++ initializer list.
31454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor///
31464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// InitListExpr describes an initializer list, which can be used to
31474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initialize objects of different types, including
31484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// struct/class/union types, arrays, and vectors. For example:
31494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor///
31504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @code
31514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// struct foo x = { 1, { 2, 3 } };
31524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @endcode
3153196ef51bc4d008ec1c69851fb3b0f8d036065931Chris Lattner///
31544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Prior to semantic analysis, an initializer list will represent the
31554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializer list as written by the user, but will have the
31564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// placeholder type "void". This initializer list is called the
31574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// syntactic form of the initializer, and may contain C99 designated
31584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializers (represented as DesignatedInitExprs), initializations
31594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// of subobject members without explicit braces, and so on. Clients
31604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// interested in the original syntax of the initializer list should
31614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// use the syntactic form of the initializer list.
3162196ef51bc4d008ec1c69851fb3b0f8d036065931Chris Lattner///
31634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// After semantic analysis, the initializer list will represent the
31644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// semantic form of the initializer, where the initializations of all
31654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// subobjects are made explicit with nested InitListExpr nodes and
31664c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// C99 designators have been eliminated by placing the designated
31674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializations into the subobject they initialize. Additionally,
31684c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// any "holes" in the initialization, where no initializer has been
31694c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// specified for a particular subobject, will be replaced with
31703498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// implicitly-generated ImplicitValueInitExpr expressions that
31714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// value-initialize the subobjects. Note, however, that the
31724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializer lists may still have fewer initializers than there are
31734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// elements to initialize within the object.
3174196ef51bc4d008ec1c69851fb3b0f8d036065931Chris Lattner///
31754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Given the semantic form of the initializer list, one can retrieve
31764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// the original syntactic form of that initializer list (if it
31774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// exists) using getSyntacticForm(). Since many initializer lists
31784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// have the same syntactic and semantic forms, getSyntacticForm() may
31794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// return NULL, indicating that the current initializer list also
31804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// serves as its syntactic form.
318166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonclass InitListExpr : public Expr {
3182ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  // FIXME: Eliminate this vector in favor of ASTContext allocation
3183709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  typedef ASTVector<Stmt *> InitExprsTy;
3184709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  InitExprsTy InitExprs;
318566b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  SourceLocation LBraceLoc, RBraceLoc;
31861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// Contains the initializer list that describes the syntactic form
31884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// written in the source code.
31894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  InitListExpr *SyntacticForm;
31904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
31914423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  /// \brief Either:
31924423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  ///  If this initializer list initializes an array with more elements than
31934423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  ///  there are initializers in the list, specifies an expression to be used
31944423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  ///  for value initialization of the rest of the elements.
31954423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  /// Or
31964423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  ///  If this initializer list initializes a union, specifies which
31974423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  ///  field within the union will be initialized.
31984423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  llvm::PointerUnion<Expr *, FieldDecl *> ArrayFillerOrUnionFieldInit;
31990bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor
3200a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor  /// Whether this initializer list originally had a GNU array-range
3201a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor  /// designator in it. This is a temporary marker used by CodeGen.
3202a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor  bool HadArrayRangeDesignator;
3203a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor
320466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonpublic:
3205709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  InitListExpr(ASTContext &C, SourceLocation lbraceloc,
3206709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek               Expr **initexprs, unsigned numinits,
3207ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek               SourceLocation rbraceloc);
3208d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
3209d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  /// \brief Build an empty initializer list.
3210709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  explicit InitListExpr(ASTContext &C, EmptyShell Empty)
3211709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek    : Expr(InitListExprClass, Empty), InitExprs(C) { }
32121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3213ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  unsigned getNumInits() const { return InitExprs.size(); }
32141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3215aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \brief Retrieve the set of initializers.
3216aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  Expr **getInits() { return reinterpret_cast<Expr **>(InitExprs.data()); }
3217aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
321816c5dea6c2d3e4cf529de9d9b37f6a40441acb2cChris Lattner  const Expr *getInit(unsigned Init) const {
3219c5ae899b4bbf65488445316c63168079177db0edSteve Naroff    assert(Init < getNumInits() && "Initializer access out of range!");
32204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    return cast_or_null<Expr>(InitExprs[Init]);
322166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  }
32221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
322316c5dea6c2d3e4cf529de9d9b37f6a40441acb2cChris Lattner  Expr *getInit(unsigned Init) {
3224c5ae899b4bbf65488445316c63168079177db0edSteve Naroff    assert(Init < getNumInits() && "Initializer access out of range!");
32254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    return cast_or_null<Expr>(InitExprs[Init]);
322666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  }
32271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  void setInit(unsigned Init, Expr *expr) {
3229c5ae899b4bbf65488445316c63168079177db0edSteve Naroff    assert(Init < getNumInits() && "Initializer access out of range!");
32309e8925e72f53a9e2c4633b6b48e965ed01702fe4Steve Naroff    InitExprs[Init] = expr;
32319e8925e72f53a9e2c4633b6b48e965ed01702fe4Steve Naroff  }
3232c5ae899b4bbf65488445316c63168079177db0edSteve Naroff
3233fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor  /// \brief Reserve space for some number of initializers.
3234709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  void reserveInits(ASTContext &C, unsigned NumInits);
32351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// @brief Specify the number of initializers
32374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  ///
32384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// If there are more than @p NumInits initializers, the remaining
32394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// initializers will be destroyed. If there are fewer than @p
32404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// NumInits initializers, NULL expressions will be added for the
32414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// unknown initializers.
32424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  void resizeInits(ASTContext &Context, unsigned NumInits);
32434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
32444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// @brief Updates the initializer at index @p Init with the new
32454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// expression @p expr, and returns the old expression at that
32464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// location.
32474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  ///
32484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// When @p Init is out of range for this initializer list, the
32494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// initializer list will be extended with NULL expressions to
3250fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// accommodate the new entry.
3251709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  Expr *updateInit(ASTContext &C, unsigned Init, Expr *expr);
3252c5ae899b4bbf65488445316c63168079177db0edSteve Naroff
32534423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  /// \brief If this initializer list initializes an array with more elements
32544423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  /// than there are initializers in the list, specifies an expression to be
32554423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  /// used for value initialization of the rest of the elements.
32564423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  Expr *getArrayFiller() {
32574423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis    return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>();
32584423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  }
32593e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis  void setArrayFiller(Expr *filler);
32604423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis
32610bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor  /// \brief If this initializes a union, specifies which field in the
32620bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor  /// union to initialize.
32630bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor  ///
32640bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor  /// Typically, this field is the first named field within the
32650bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor  /// union. However, a designated initializer can specify the
32660bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor  /// initialization of a different field within the union.
32674423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  FieldDecl *getInitializedFieldInUnion() {
32684423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis    return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>();
32694423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  }
32704423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  void setInitializedFieldInUnion(FieldDecl *FD) {
32714423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis    ArrayFillerOrUnionFieldInit = FD;
32724423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  }
32730bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor
3274c5ae899b4bbf65488445316c63168079177db0edSteve Naroff  // Explicit InitListExpr's originate from source code (and have valid source
3275c5ae899b4bbf65488445316c63168079177db0edSteve Naroff  // locations). Implicit InitListExpr's are created by the semantic analyzer.
3276b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  bool isExplicit() {
3277b3eef68111ffc220e449be96da1747998c057790Douglas Gregor    return LBraceLoc.isValid() && RBraceLoc.isValid();
3278b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  }
32791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3280d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  SourceLocation getLBraceLoc() const { return LBraceLoc; }
3281d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; }
3282d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  SourceLocation getRBraceLoc() const { return RBraceLoc; }
328387fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor  void setRBraceLoc(SourceLocation Loc) { RBraceLoc = Loc; }
328487fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor
32854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// @brief Retrieve the initializer list that describes the
32864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  /// syntactic form of the initializer.
32874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  ///
32881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
32894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  InitListExpr *getSyntacticForm() const { return SyntacticForm; }
32904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  void setSyntacticForm(InitListExpr *Init) { SyntacticForm = Init; }
32914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
3292a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor  bool hadArrayRangeDesignator() const { return HadArrayRangeDesignator; }
32931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  void sawArrayRangeDesignator(bool ARD = true) {
3294d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    HadArrayRangeDesignator = ARD;
3295a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor  }
3296a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor
329763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const;
3298c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek
329966b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  static bool classof(const Stmt *T) {
33001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == InitListExprClass;
330166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  }
330266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  static bool classof(const InitListExpr *) { return true; }
33031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
330466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  // Iterators
330563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() {
330663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    if (InitExprs.empty()) return child_range();
330763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size());
330863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3310709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  typedef InitExprsTy::iterator iterator;
33118111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu  typedef InitExprsTy::const_iterator const_iterator;
3312709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  typedef InitExprsTy::reverse_iterator reverse_iterator;
33138111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu  typedef InitExprsTy::const_reverse_iterator const_reverse_iterator;
33141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3315ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  iterator begin() { return InitExprs.begin(); }
33168111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu  const_iterator begin() const { return InitExprs.begin(); }
3317ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  iterator end() { return InitExprs.end(); }
33188111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu  const_iterator end() const { return InitExprs.end(); }
3319ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  reverse_iterator rbegin() { return InitExprs.rbegin(); }
33208111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu  const_reverse_iterator rbegin() const { return InitExprs.rbegin(); }
3321ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  reverse_iterator rend() { return InitExprs.rend(); }
33228111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu  const_reverse_iterator rend() const { return InitExprs.rend(); }
33234423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis
33244423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  friend class ASTStmtReader;
33254423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis  friend class ASTStmtWriter;
332666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson};
332766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson
332805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Represents a C99 designated initializer expression.
332905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor///
333005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// A designated initializer expression (C99 6.7.8) contains one or
333105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// more designators (which can be field designators, array
333205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designators, or GNU array-range designators) followed by an
333305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// expression that initializes the field or element(s) that the
333405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designators refer to. For example, given:
33351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump///
333605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @code
333705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// struct point {
333805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor///   double x;
333905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor///   double y;
334005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// };
334105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// struct point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
334205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @endcode
334305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor///
334405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// The InitListExpr contains three DesignatedInitExprs, the first of
334505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// which covers @c [2].y=1.0. This DesignatedInitExpr will have two
334605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designators, one array designator for @c [2] followed by one field
334705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designator for @c .y. The initalization expression will be 1.0.
334805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorclass DesignatedInitExpr : public Expr {
3349ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorpublic:
3350ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  /// \brief Forward declaration of the Designator class.
3351ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  class Designator;
3352ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
3353ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorprivate:
335405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// The location of the '=' or ':' prior to the actual initializer
335505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// expression.
335605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation EqualOrColonLoc;
335705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
3358eeae8f072748affce25ab4064982626361293390Douglas Gregor  /// Whether this designated initializer used the GNU deprecated
335905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// syntax rather than the C99 '=' syntax.
3360eeae8f072748affce25ab4064982626361293390Douglas Gregor  bool GNUSyntax : 1;
336105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
336205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// The number of designators in this initializer expression.
336305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  unsigned NumDesignators : 15;
336405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
3365ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  /// \brief The designators in this designated initialization
3366ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  /// expression.
3367ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  Designator *Designators;
3368ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
336905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// The number of subexpressions of this initializer expression,
337005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// which contains both the initializer and any additional
337105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// expressions used by array and array-range designators.
337205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  unsigned NumSubExprs : 16;
337305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
3374ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
3375319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  DesignatedInitExpr(ASTContext &C, QualType Ty, unsigned NumDesignators,
3376ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                     const Designator *Designators,
3377eeae8f072748affce25ab4064982626361293390Douglas Gregor                     SourceLocation EqualOrColonLoc, bool GNUSyntax,
33789ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor                     Expr **IndexExprs, unsigned NumIndexExprs,
33799ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor                     Expr *Init);
338005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
3381d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  explicit DesignatedInitExpr(unsigned NumSubExprs)
3382d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    : Expr(DesignatedInitExprClass, EmptyShell()),
3383d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor      NumDesignators(0), Designators(0), NumSubExprs(NumSubExprs) { }
3384d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
338505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorpublic:
338605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// A field designator, e.g., ".x".
338705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  struct FieldDesignator {
338805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// Refers to the field that is being initialized. The low bit
338905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// of this field determines whether this is actually a pointer
339005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// to an IdentifierInfo (if 1) or a FieldDecl (if 0). When
339105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// initially constructed, a field designator will store an
339205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// IdentifierInfo*. After semantic analysis has resolved that
339305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// name, the field designator will instead store a FieldDecl*.
339405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    uintptr_t NameOrField;
33951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
339605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// The location of the '.' in the designated initializer.
339705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned DotLoc;
33981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
339905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// The location of the field name in the designated initializer.
340005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned FieldLoc;
340105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  };
340205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
340305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]".
340405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  struct ArrayOrRangeDesignator {
340505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// Location of the first index expression within the designated
340605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// initializer expression's list of subexpressions.
340705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned Index;
340805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// The location of the '[' starting the array range designator.
340905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned LBracketLoc;
341005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// The location of the ellipsis separating the start and end
341105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// indices. Only valid for GNU array-range designators.
341205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned EllipsisLoc;
341305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// The location of the ']' terminating the array range designator.
34141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    unsigned RBracketLoc;
341505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  };
341605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
341705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// @brief Represents a single C99 designator.
341805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  ///
341905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// @todo This class is infuriatingly similar to clang::Designator,
342005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// but minor differences (storing indices vs. storing pointers)
342105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// keep us from reusing it. Try harder, later, to rectify these
342205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// differences.
342305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  class Designator {
342405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// @brief The kind of designator this describes.
342505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    enum {
342605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      FieldDesignator,
342705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayDesignator,
342805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayRangeDesignator
342905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    } Kind;
343005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
343105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    union {
343205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      /// A field designator, e.g., ".x".
343305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      struct FieldDesignator Field;
343405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]".
343505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      struct ArrayOrRangeDesignator ArrayOrRange;
343605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    };
343705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    friend class DesignatedInitExpr;
343805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
343905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  public:
3440ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    Designator() {}
3441ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
344205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// @brief Initializes a field designator.
34431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Designator(const IdentifierInfo *FieldName, SourceLocation DotLoc,
34441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump               SourceLocation FieldLoc)
344505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      : Kind(FieldDesignator) {
344605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      Field.NameOrField = reinterpret_cast<uintptr_t>(FieldName) | 0x01;
344705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      Field.DotLoc = DotLoc.getRawEncoding();
344805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      Field.FieldLoc = FieldLoc.getRawEncoding();
344905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    }
345005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
345105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// @brief Initializes an array designator.
34521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Designator(unsigned Index, SourceLocation LBracketLoc,
345305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor               SourceLocation RBracketLoc)
345405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      : Kind(ArrayDesignator) {
345505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayOrRange.Index = Index;
345605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding();
345705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayOrRange.EllipsisLoc = SourceLocation().getRawEncoding();
345805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding();
345905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    }
346005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
346105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    /// @brief Initializes a GNU array-range designator.
34621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Designator(unsigned Index, SourceLocation LBracketLoc,
346305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor               SourceLocation EllipsisLoc, SourceLocation RBracketLoc)
346405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      : Kind(ArrayRangeDesignator) {
346505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayOrRange.Index = Index;
346605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding();
346705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayOrRange.EllipsisLoc = EllipsisLoc.getRawEncoding();
346805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding();
346905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    }
347005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
347105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    bool isFieldDesignator() const { return Kind == FieldDesignator; }
347205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    bool isArrayDesignator() const { return Kind == ArrayDesignator; }
347305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; }
347405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
347505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    IdentifierInfo * getFieldName();
347605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
347705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    FieldDecl *getField() {
347805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      assert(Kind == FieldDesignator && "Only valid on a field designator");
347905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      if (Field.NameOrField & 0x01)
348005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor        return 0;
348105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      else
348205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor        return reinterpret_cast<FieldDecl *>(Field.NameOrField);
348305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    }
348405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
348505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    void setField(FieldDecl *FD) {
348605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      assert(Kind == FieldDesignator && "Only valid on a field designator");
348705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      Field.NameOrField = reinterpret_cast<uintptr_t>(FD);
348805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    }
348905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
349087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor    SourceLocation getDotLoc() const {
349187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor      assert(Kind == FieldDesignator && "Only valid on a field designator");
349287f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor      return SourceLocation::getFromRawEncoding(Field.DotLoc);
349387f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor    }
349487f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor
349505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    SourceLocation getFieldLoc() const {
349605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      assert(Kind == FieldDesignator && "Only valid on a field designator");
349705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(Field.FieldLoc);
349805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    }
349905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
350005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    SourceLocation getLBracketLoc() const {
350105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&
350205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor             "Only valid on an array or array-range designator");
350305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayOrRange.LBracketLoc);
350405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    }
350505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
350605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    SourceLocation getRBracketLoc() const {
350705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&
350805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor             "Only valid on an array or array-range designator");
350905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayOrRange.RBracketLoc);
351005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    }
351105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
351205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    SourceLocation getEllipsisLoc() const {
351305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      assert(Kind == ArrayRangeDesignator &&
351405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor             "Only valid on an array-range designator");
351505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayOrRange.EllipsisLoc);
351605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    }
35174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
3518d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    unsigned getFirstExprIndex() const {
3519d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor      assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) &&
3520d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor             "Only valid on an array or array-range designator");
3521d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor      return ArrayOrRange.Index;
3522d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    }
3523d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
35244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    SourceLocation getStartLocation() const {
35254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      if (Kind == FieldDesignator)
35264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        return getDotLoc().isInvalid()? getFieldLoc() : getDotLoc();
35274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      else
35284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        return getLBracketLoc();
35294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    }
353024f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara    SourceLocation getEndLocation() const {
353124f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara      return Kind == FieldDesignator ? getFieldLoc() : getRBracketLoc();
353224f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara    }
353324f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara    SourceRange getSourceRange() const {
353424f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara      return SourceRange(getStartLocation(), getEndLocation());
353524f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara    }
353605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  };
353705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
35381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static DesignatedInitExpr *Create(ASTContext &C, Designator *Designators,
353905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                                    unsigned NumDesignators,
354005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                                    Expr **IndexExprs, unsigned NumIndexExprs,
354105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                                    SourceLocation EqualOrColonLoc,
3542eeae8f072748affce25ab4064982626361293390Douglas Gregor                                    bool GNUSyntax, Expr *Init);
354305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
3544d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  static DesignatedInitExpr *CreateEmpty(ASTContext &C, unsigned NumIndexExprs);
3545d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
354605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// @brief Returns the number of designators in this initializer.
354705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  unsigned size() const { return NumDesignators; }
354805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
354905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  // Iterator access to the designators.
355005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  typedef Designator* designators_iterator;
3551ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  designators_iterator designators_begin() { return Designators; }
35521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  designators_iterator designators_end() {
35531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return Designators + NumDesignators;
3554ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  }
355505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
3556cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek  typedef std::reverse_iterator<designators_iterator>
3557cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek          reverse_designators_iterator;
3558cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek  reverse_designators_iterator designators_rbegin() {
3559cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek    return reverse_designators_iterator(designators_end());
3560cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek  }
3561cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek  reverse_designators_iterator designators_rend() {
3562cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek    return reverse_designators_iterator(designators_begin());
3563cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek  }
3564cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek
3565711997184366d584c9c437102cae1e9d9927b986Douglas Gregor  Designator *getDesignator(unsigned Idx) { return &designators_begin()[Idx]; }
3566711997184366d584c9c437102cae1e9d9927b986Douglas Gregor
3567c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  void setDesignators(ASTContext &C, const Designator *Desigs,
3568319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor                      unsigned NumDesigs);
3569d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
357005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Expr *getArrayIndex(const Designator& D);
357105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Expr *getArrayRangeStart(const Designator& D);
357205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Expr *getArrayRangeEnd(const Designator& D);
357305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
357405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// @brief Retrieve the location of the '=' that precedes the
357505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// initializer value itself, if present.
357605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getEqualOrColonLoc() const { return EqualOrColonLoc; }
3577d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  void setEqualOrColonLoc(SourceLocation L) { EqualOrColonLoc = L; }
357805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
357905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// @brief Determines whether this designated initializer used the
3580eeae8f072748affce25ab4064982626361293390Douglas Gregor  /// deprecated GNU syntax for designated initializers.
3581eeae8f072748affce25ab4064982626361293390Douglas Gregor  bool usesGNUSyntax() const { return GNUSyntax; }
3582d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  void setGNUSyntax(bool GNU) { GNUSyntax = GNU; }
358305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
358405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  /// @brief Retrieve the initializer value.
35851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Expr *getInit() const {
358605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return cast<Expr>(*const_cast<DesignatedInitExpr*>(this)->child_begin());
358705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
358805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
358905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  void setInit(Expr *init) {
359005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    *child_begin() = init;
359105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
359205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
3593d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  /// \brief Retrieve the total number of subexpressions in this
3594d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  /// designated initializer expression, including the actual
3595d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  /// initialized value and any expressions that occur within array
3596d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  /// and array-range designators.
3597d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  unsigned getNumSubExprs() const { return NumSubExprs; }
3598d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
3599d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  Expr *getSubExpr(unsigned Idx) {
3600d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    assert(Idx < NumSubExprs && "Subscript out of range");
3601d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    char* Ptr = static_cast<char*>(static_cast<void *>(this));
3602d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    Ptr += sizeof(DesignatedInitExpr);
3603d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    return reinterpret_cast<Expr**>(reinterpret_cast<void**>(Ptr))[Idx];
3604d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  }
3605d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
3606d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  void setSubExpr(unsigned Idx, Expr *E) {
3607d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    assert(Idx < NumSubExprs && "Subscript out of range");
3608d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    char* Ptr = static_cast<char*>(static_cast<void *>(this));
3609d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    Ptr += sizeof(DesignatedInitExpr);
3610d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    reinterpret_cast<Expr**>(reinterpret_cast<void**>(Ptr))[Idx] = E;
3611d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  }
3612d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
3613ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  /// \brief Replaces the designator at index @p Idx with the series
3614ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  /// of designators in [First, Last).
3615319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  void ExpandDesignator(ASTContext &C, unsigned Idx, const Designator *First,
3616ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                        const Designator *Last);
3617ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
361824f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara  SourceRange getDesignatorsSourceRange() const;
361924f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara
362063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const;
362105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
362205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  static bool classof(const Stmt *T) {
36231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == DesignatedInitExprClass;
362405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
362505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  static bool classof(const DesignatedInitExpr *) { return true; }
362605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
362705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  // Iterators
362863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() {
362963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    Stmt **begin = reinterpret_cast<Stmt**>(this + 1);
363063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range(begin, begin + NumSubExprs);
363163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
36323498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor};
36333498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor
36343498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// \brief Represents an implicitly-generated value initialization of
36353498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// an object of a given type.
36363498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor///
36371a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// Implicit value initializations occur within semantic initializer
36381a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// list expressions (InitListExpr) as placeholders for subobject
36393498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// initializations not explicitly specified by the user.
36401a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor///
36411a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// \see InitListExpr
36421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpclass ImplicitValueInitExpr : public Expr {
36433498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregorpublic:
36441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  explicit ImplicitValueInitExpr(QualType ty)
3645f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : Expr(ImplicitValueInitExprClass, ty, VK_RValue, OK_Ordinary,
3646bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           false, false, false) { }
36473498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor
3648d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  /// \brief Construct an empty implicit value initialization.
3649d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  explicit ImplicitValueInitExpr(EmptyShell Empty)
3650d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    : Expr(ImplicitValueInitExprClass, Empty) { }
3651d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
36521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
36533498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor    return T->getStmtClass() == ImplicitValueInitExprClass;
36543498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  }
36553498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  static bool classof(const ImplicitValueInitExpr *) { return true; }
36563498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor
365763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
36583498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor    return SourceRange();
36593498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  }
36603498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor
36613498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  // Iterators
366263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
366305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor};
366405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
36652ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
36662ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanclass ParenListExpr : public Expr {
36672ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  Stmt **Exprs;
36682ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  unsigned NumExprs;
36692ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  SourceLocation LParenLoc, RParenLoc;
36702ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
36712ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanpublic:
36721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParenListExpr(ASTContext& C, SourceLocation lparenloc, Expr **exprs,
36732ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman                unsigned numexprs, SourceLocation rparenloc);
36742ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
36752ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  /// \brief Build an empty paren list.
367637bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  explicit ParenListExpr(EmptyShell Empty) : Expr(ParenListExprClass, Empty) { }
36771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36782ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  unsigned getNumExprs() const { return NumExprs; }
36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Expr* getExpr(unsigned Init) const {
36812ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    assert(Init < getNumExprs() && "Initializer access out of range!");
36822ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    return cast_or_null<Expr>(Exprs[Init]);
36832ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  }
36841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Expr* getExpr(unsigned Init) {
36862ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    assert(Init < getNumExprs() && "Initializer access out of range!");
36872ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    return cast_or_null<Expr>(Exprs[Init]);
36882ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  }
36892ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
369083ddad3ab513f5d73698cf9fbeb4ed3f011bc3b9Douglas Gregor  Expr **getExprs() { return reinterpret_cast<Expr **>(Exprs); }
36911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36922ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  SourceLocation getLParenLoc() const { return LParenLoc; }
36932ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  SourceLocation getRParenLoc() const { return RParenLoc; }
36942ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
369563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
36962ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    return SourceRange(LParenLoc, RParenLoc);
36971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
36982ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  static bool classof(const Stmt *T) {
36991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == ParenListExprClass;
37002ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  }
37012ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  static bool classof(const ParenListExpr *) { return true; }
37021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37032ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  // Iterators
370463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() {
370563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range(&Exprs[0], &Exprs[0]+NumExprs);
370663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
370737bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
370860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl  friend class ASTStmtReader;
37093397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  friend class ASTStmtWriter;
37102ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman};
37112ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
37121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3713f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// \brief Represents a C1X generic selection.
3714f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne///
3715f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// A generic selection (C1X 6.5.1.1) contains an unevaluated controlling
3716f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// expression, followed by one or more generic associations.  Each generic
3717f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// association specifies a type name and an expression, or "default" and an
3718f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// expression (in which case it is known as a default generic association).
3719f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// The type and value of the generic selection are identical to those of its
3720f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// result expression, which is defined as the expression in the generic
3721f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// association with a type name that is compatible with the type of the
3722f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// controlling expression, or the expression in the default generic association
3723f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// if no types are compatible.  For example:
3724f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne///
3725f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// @code
3726f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// _Generic(X, double: 1, float: 2, default: 3)
3727f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// @endcode
3728f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne///
3729f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// The above expression evaluates to 1 if 1.0 is substituted for X, 2 if 1.0f
3730f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// or 3 if "hello".
3731f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne///
3732f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// As an extension, generic selections are allowed in C++, where the following
3733f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// additional semantics apply:
3734f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne///
3735f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// Any generic selection whose controlling expression is type-dependent or
3736f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// which names a dependent type in its association list is result-dependent,
3737f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// which means that the choice of result expression is dependent.
3738f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// Result-dependent generic associations are both type- and value-dependent.
3739f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourneclass GenericSelectionExpr : public Expr {
3740f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  enum { CONTROLLING, END_EXPR };
3741f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  TypeSourceInfo **AssocTypes;
3742f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  Stmt **SubExprs;
3743f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  unsigned NumAssocs, ResultIndex;
3744f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  SourceLocation GenericLoc, DefaultLoc, RParenLoc;
3745f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3746f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbournepublic:
3747f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  GenericSelectionExpr(ASTContext &Context,
3748f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       SourceLocation GenericLoc, Expr *ControllingExpr,
3749f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       TypeSourceInfo **AssocTypes, Expr **AssocExprs,
3750f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       unsigned NumAssocs, SourceLocation DefaultLoc,
3751f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       SourceLocation RParenLoc,
3752f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       bool ContainsUnexpandedParameterPack,
3753f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       unsigned ResultIndex);
3754f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3755f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  /// This constructor is used in the result-dependent case.
3756f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  GenericSelectionExpr(ASTContext &Context,
3757f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       SourceLocation GenericLoc, Expr *ControllingExpr,
3758f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       TypeSourceInfo **AssocTypes, Expr **AssocExprs,
3759f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       unsigned NumAssocs, SourceLocation DefaultLoc,
3760f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       SourceLocation RParenLoc,
3761f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                       bool ContainsUnexpandedParameterPack);
3762f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3763f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  explicit GenericSelectionExpr(EmptyShell Empty)
3764f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    : Expr(GenericSelectionExprClass, Empty) { }
3765f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3766f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  unsigned getNumAssocs() const { return NumAssocs; }
3767f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3768f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  SourceLocation getGenericLoc() const { return GenericLoc; }
3769f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  SourceLocation getDefaultLoc() const { return DefaultLoc; }
3770f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  SourceLocation getRParenLoc() const { return RParenLoc; }
3771f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3772f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  const Expr *getAssocExpr(unsigned i) const {
3773f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return cast<Expr>(SubExprs[END_EXPR+i]);
3774f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
3775f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  Expr *getAssocExpr(unsigned i) { return cast<Expr>(SubExprs[END_EXPR+i]); }
3776f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3777f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  const TypeSourceInfo *getAssocTypeSourceInfo(unsigned i) const {
3778f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return AssocTypes[i];
3779f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
3780f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  TypeSourceInfo *getAssocTypeSourceInfo(unsigned i) { return AssocTypes[i]; }
3781f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3782f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  QualType getAssocType(unsigned i) const {
3783f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (const TypeSourceInfo *TS = getAssocTypeSourceInfo(i))
3784f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      return TS->getType();
3785f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    else
3786f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      return QualType();
3787f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
3788f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3789f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  const Expr *getControllingExpr() const {
3790f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return cast<Expr>(SubExprs[CONTROLLING]);
3791f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
3792f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  Expr *getControllingExpr() { return cast<Expr>(SubExprs[CONTROLLING]); }
3793f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3794f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  /// Whether this generic selection is result-dependent.
3795f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  bool isResultDependent() const { return ResultIndex == -1U; }
3796f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3797f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  /// The zero-based index of the result expression's generic association in
3798f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  /// the generic selection's association list.  Defined only if the
3799f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  /// generic selection is not result-dependent.
3800f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  unsigned getResultIndex() const {
3801f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    assert(!isResultDependent() && "Generic selection is result-dependent");
3802f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return ResultIndex;
3803f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
3804f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3805f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  /// The generic selection's result expression.  Defined only if the
3806f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  /// generic selection is not result-dependent.
3807f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  const Expr *getResultExpr() const { return getAssocExpr(getResultIndex()); }
3808f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  Expr *getResultExpr() { return getAssocExpr(getResultIndex()); }
3809f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3810f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  SourceRange getSourceRange() const {
3811f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return SourceRange(GenericLoc, RParenLoc);
3812f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
3813f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  static bool classof(const Stmt *T) {
3814f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return T->getStmtClass() == GenericSelectionExprClass;
3815f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
3816f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  static bool classof(const GenericSelectionExpr *) { return true; }
3817f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3818f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  child_range children() {
3819f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return child_range(SubExprs, SubExprs+END_EXPR+NumAssocs);
3820f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
3821f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
3822f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  friend class ASTStmtReader;
3823f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne};
3824f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
38254eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff//===----------------------------------------------------------------------===//
38264eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff// Clang Extensions
38274eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff//===----------------------------------------------------------------------===//
38284eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
3829a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner
3830a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// ExtVectorElementExpr - This represents access to specific elements of a
3831a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// vector, and may occur on the left hand side or right hand side.  For example
3832a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// the following is legal:  "V.xy = V.zw" if V is a 4 element extended vector.
3833a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner///
383473525de7fd9bdd534382dc89a24f1f76db3e04b9Chris Lattner/// Note that the base may have either vector or pointer to vector type, just
383573525de7fd9bdd534382dc89a24f1f76db3e04b9Chris Lattner/// like a struct field reference.
383673525de7fd9bdd534382dc89a24f1f76db3e04b9Chris Lattner///
3837a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattnerclass ExtVectorElementExpr : public Expr {
3838a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  Stmt *Base;
3839d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  IdentifierInfo *Accessor;
3840a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  SourceLocation AccessorLoc;
3841a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattnerpublic:
3842f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  ExtVectorElementExpr(QualType ty, ExprValueKind VK, Expr *base,
3843f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                       IdentifierInfo &accessor, SourceLocation loc)
38440943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall    : Expr(ExtVectorElementExprClass, ty, VK,
38450943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall           (VK == VK_RValue ? OK_Ordinary : OK_VectorComponent),
3846bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           base->isTypeDependent(), base->isValueDependent(),
3847bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           base->containsUnexpandedParameterPack()),
3848d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor      Base(base), Accessor(&accessor), AccessorLoc(loc) {}
38491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3850d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  /// \brief Build an empty vector element expression.
3851d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  explicit ExtVectorElementExpr(EmptyShell Empty)
3852d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor    : Expr(ExtVectorElementExprClass, Empty) { }
3853d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor
3854a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  const Expr *getBase() const { return cast<Expr>(Base); }
3855a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  Expr *getBase() { return cast<Expr>(Base); }
3856d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  void setBase(Expr *E) { Base = E; }
3857d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor
3858d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  IdentifierInfo &getAccessor() const { return *Accessor; }
3859d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  void setAccessor(IdentifierInfo *II) { Accessor = II; }
3860d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor
3861d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  SourceLocation getAccessorLoc() const { return AccessorLoc; }
3862d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor  void setAccessorLoc(SourceLocation L) { AccessorLoc = L; }
3863d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor
3864a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  /// getNumElements - Get the number of components being selected.
3865a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  unsigned getNumElements() const;
38661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3867a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  /// containsDuplicateElements - Return true if any element access is
3868a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  /// repeated.
3869a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  bool containsDuplicateElements() const;
38701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3871a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  /// getEncodedElementAccess - Encode the elements accessed into an llvm
3872a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  /// aggregate Constant of ConstantInt(s).
3873a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  void getEncodedElementAccess(llvm::SmallVectorImpl<unsigned> &Elts) const;
38741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
387563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
3876a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner    return SourceRange(getBase()->getLocStart(), AccessorLoc);
3877a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  }
38781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38792140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner  /// isArrow - Return true if the base expression is a pointer to vector,
38802140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner  /// return false if the base expression is a vector.
38812140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner  bool isArrow() const;
38821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
38841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == ExtVectorElementExprClass;
3885a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  }
3886a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  static bool classof(const ExtVectorElementExpr *) { return true; }
38871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3888a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner  // Iterators
388963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(&Base, &Base+1); }
3890a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner};
3891a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner
3892a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner
389356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff/// BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
38949c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff/// ^{ statement-body }   or   ^(int arg1, float arg2){ statement-body }
38954eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffclass BlockExpr : public Expr {
389656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffprotected:
389756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  BlockDecl *TheBlock;
38984eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffpublic:
3899469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall  BlockExpr(BlockDecl *BD, QualType ty)
3900f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    : Expr(BlockExprClass, ty, VK_RValue, OK_Ordinary,
3901bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           ty->isDependentType(), false, false),
3902469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall      TheBlock(BD) {}
39039c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff
390484af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor  /// \brief Build an empty block expression.
390584af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor  explicit BlockExpr(EmptyShell Empty) : Expr(BlockExprClass, Empty) { }
390684af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor
3907d5cab5435371b8cc74a9e05ebd40b5995ebad149Anders Carlsson  const BlockDecl *getBlockDecl() const { return TheBlock; }
390856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  BlockDecl *getBlockDecl() { return TheBlock; }
390984af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor  void setBlockDecl(BlockDecl *BD) { TheBlock = BD; }
391084af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor
391156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  // Convenience functions for probing the underlying BlockDecl.
391256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  SourceLocation getCaretLocation() const;
391356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  const Stmt *getBody() const;
391456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  Stmt *getBody();
39159c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff
391663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const {
391756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    return SourceRange(getCaretLocation(), getBody()->getLocEnd());
39189c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff  }
39199c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff
392056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  /// getFunctionType - Return the underlying function type for this block.
392156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  const FunctionType *getFunctionType() const;
392256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
39231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
39249c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff    return T->getStmtClass() == BlockExprClass;
39254eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  }
39264eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  static bool classof(const BlockExpr *) { return true; }
39271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39284eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  // Iterators
392963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
39304eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff};
39311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39326b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// BlockDeclRefExpr - A reference to a local variable declared in an
39336b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// enclosing scope.
39344eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffclass BlockDeclRefExpr : public Expr {
39356b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  VarDecl *D;
39364eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  SourceLocation Loc;
39377d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian  bool IsByRef : 1;
39387d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian  bool ConstQualAdded : 1;
39394eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffpublic:
39406b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  BlockDeclRefExpr(VarDecl *d, QualType t, ExprValueKind VK,
39416b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall                   SourceLocation l, bool ByRef, bool constAdded = false);
394294cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor
394394cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  // \brief Build an empty reference to a declared variable in a
394494cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  // block.
394594cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  explicit BlockDeclRefExpr(EmptyShell Empty)
394694cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor    : Expr(BlockDeclRefExprClass, Empty) { }
39471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39486b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  VarDecl *getDecl() { return D; }
39496b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  const VarDecl *getDecl() const { return D; }
39506b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  void setDecl(VarDecl *VD) { D = VD; }
395194cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor
395294cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  SourceLocation getLocation() const { return Loc; }
395394cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  void setLocation(SourceLocation L) { Loc = L; }
395494cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor
395563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceRange getSourceRange() const { return SourceRange(Loc); }
39561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39574eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  bool isByRef() const { return IsByRef; }
395894cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  void setByRef(bool BR) { IsByRef = BR; }
39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39607d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian  bool isConstQualAdded() const { return ConstQualAdded; }
39617d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian  void setConstQualAdded(bool C) { ConstQualAdded = C; }
396289f9d3a7651d1225f3f56ae3387c83b98a26da00Fariborz Jahanian
39631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Stmt *T) {
39641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return T->getStmtClass() == BlockDeclRefExprClass;
39654eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  }
39664eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  static bool classof(const BlockDeclRefExpr *) { return true; }
39671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39684eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  // Iterators
396963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  child_range children() { return child_range(); }
39704eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff};
39714eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
39725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
39735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
39745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
3975