Expr.h revision 2882eca5a184c78f793188083f6ce539740a5cf2
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" 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/APSInt.h" 25525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner#include "llvm/ADT/APFloat.h" 263b8d116703db8018f855cbb4733ace426422623bNate Begeman#include "llvm/ADT/SmallVector.h" 27b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar#include "llvm/ADT/StringRef.h" 28403ba3522d1b1c97ae5fad81c1a2c4b3a754e1c1Nick Lewycky#include <cctype> 29c5ae899b4bbf65488445316c63168079177db0edSteve Naroff#include <vector> 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, 1752514a309204341798f96912ce7a90841bea59727Fariborz Jahanian LV_MemberFunction, 176e9ff443040cb571ae2c5c2626c4dc9a9a812d84aFariborz Jahanian LV_SubObjCPropertySetting, 177e873fb74219f48407ae0b8fa083aa7f0b6ff1427Douglas Gregor LV_ClassTemporary 1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 1797eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// Reasons why an expression might not be an l-value. 1807eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall LValueClassification ClassifyLValue(ASTContext &Ctx) const; 18153202857c60214d80950a975e6e52aebf30bd16aEli Friedman 1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, 1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// does not have an incomplete type, does not have a const-qualified type, 1841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and if it is a structure or union, does not have any member (including, 1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// recursively, any member or element of all contained aggregates or unions) 1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// with a const-qualified type. 18744e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar /// 18844e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar /// \param Loc [in] [out] - A source location which *may* be filled 18944e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar /// in with the location of the expression making this a 19044e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar /// non-modifiable lvalue, if specified. 1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer enum isModifiableLvalueResult { 1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_Valid, 1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_NotObjectType, 1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_IncompleteVoidType, 195fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff MLV_DuplicateVectorComponents, 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_InvalidExpression, 197ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner MLV_LValueCast, // Specialized form of MLV_InvalidExpression. 1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_IncompleteType, 1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_ConstQualified, 2004f6a7d7ead09b439216c32f2de806a998aeb222aSteve Naroff MLV_ArrayType, 2015daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian MLV_NotBlockQualified, 202ba8d2d684e74a20bef03828c21c991d222c7e9e5Fariborz Jahanian MLV_ReadonlyProperty, 20386f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor MLV_NoSetterProperty, 2042514a309204341798f96912ce7a90841bea59727Fariborz Jahanian MLV_MemberFunction, 205e9ff443040cb571ae2c5c2626c4dc9a9a812d84aFariborz Jahanian MLV_SubObjCPropertySetting, 206e873fb74219f48407ae0b8fa083aa7f0b6ff1427Douglas Gregor MLV_ClassTemporary 2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 20844e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx, 20944e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar SourceLocation *Loc = 0) const; 2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2112111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// \brief The return type of classify(). Represents the C++0x expression 2122111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// taxonomy. 2132111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl class Classification { 2142111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl public: 2152111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// \brief The various classification results. Most of these mean prvalue. 2162111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl enum Kinds { 2172111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_LValue, 2182111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_XValue, 2192111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_Function, // Functions cannot be lvalues in C. 2202111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_Void, // Void cannot be an lvalue in C. 2212111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_DuplicateVectorComponents, // A vector shuffle with dupes. 2222111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_MemberFunction, // An expression referring to a member function 2232111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_SubObjCPropertySetting, 2242111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_ClassTemporary, // A prvalue of class type 2252111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_PRValue // A prvalue for any other reason, of any other type 2262111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl }; 2272111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// \brief The results of modification testing. 2282111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl enum ModifiableType { 2292111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_Untested, // testModifiable was false. 2302111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_Modifiable, 2312111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_RValue, // Not modifiable because it's an rvalue 2322111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_Function, // Not modifiable because it's a function; C++ only 2332111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_LValueCast, // Same as CM_RValue, but indicates GCC cast-as-lvalue ext 2342111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_NotBlockQualified, // Not captured in the closure 2352111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_NoSetterProperty,// Implicit assignment to ObjC property without setter 2362111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_ConstQualified, 2372111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_ArrayType, 2382111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_IncompleteType 2392111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl }; 2402111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 2412111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl private: 2422111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl friend class Expr; 2432111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 2442111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl unsigned short Kind; 2452111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl unsigned short Modifiable; 2462111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 2472111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl explicit Classification(Kinds k, ModifiableType m) 2482111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl : Kind(k), Modifiable(m) 2492111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl {} 2502111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 2512111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl public: 2522111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl Classification() {} 2532111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 2542111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl Kinds getKind() const { return static_cast<Kinds>(Kind); } 2552111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl ModifiableType getModifiable() const { 2562111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl assert(Modifiable != CM_Untested && "Did not test for modifiability."); 2572111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl return static_cast<ModifiableType>(Modifiable); 2582111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl } 2592111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isLValue() const { return Kind == CL_LValue; } 2602111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isXValue() const { return Kind == CL_XValue; } 2612111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isGLValue() const { return Kind <= CL_XValue; } 2622111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isPRValue() const { return Kind >= CL_Function; } 2632111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isRValue() const { return Kind >= CL_XValue; } 2642111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isModifiable() const { return getModifiable() == CM_Modifiable; } 2652c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor 2662c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor /// \brief Create a simple, modifiably lvalue 2672c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor static Classification makeSimpleLValue() { 2682c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor return Classification(CL_LValue, CM_Modifiable); 2692c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor } 2702c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor 2712111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl }; 272369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /// \brief Classify - Classify this expression according to the C++0x 2732111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// expression taxonomy. 2742111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// 2752111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// C++0x defines ([basic.lval]) a new taxonomy of expressions to replace the 2762111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// old lvalue vs rvalue. This function determines the type of expression this 2772111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// is. There are three expression types: 2782111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// - lvalues are classical lvalues as in C++03. 2792111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// - prvalues are equivalent to rvalues in C++03. 2802111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// - xvalues are expressions yielding unnamed rvalue references, e.g. a 2812111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// function returning an rvalue reference. 2822111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// lvalues and xvalues are collectively referred to as glvalues, while 2832111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// prvalues and xvalues together form rvalues. 2842111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl Classification Classify(ASTContext &Ctx) const { 2852111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl return ClassifyImpl(Ctx, 0); 2862111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl } 2872111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 288369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /// \brief ClassifyModifiable - Classify this expression according to the 2892111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// C++0x expression taxonomy, and see if it is valid on the left side 2902111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// of an assignment. 2912111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// 2922111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// This function extends classify in that it also tests whether the 2932111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// expression is modifiable (C99 6.3.2.1p1). 2942111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// \param Loc A source location that might be filled with a relevant location 2952111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// if the expression is not modifiable. 2962111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl Classification ClassifyModifiable(ASTContext &Ctx, SourceLocation &Loc) const{ 2972111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl return ClassifyImpl(Ctx, &Loc); 2982111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl } 2992111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 300f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// getValueKindForType - Given a formal return or parameter type, 301f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// give its value kind. 302f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall static ExprValueKind getValueKindForType(QualType T) { 303f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall if (const ReferenceType *RT = T->getAs<ReferenceType>()) 3040943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall return (isa<LValueReferenceType>(RT) 3050943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall ? VK_LValue 3060943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall : (RT->getPointeeType()->isFunctionType() 3070943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall ? VK_LValue : VK_XValue)); 308f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall return VK_RValue; 309f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 310f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall 311f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// getValueKind - The value kind that this expression produces. 312f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind getValueKind() const { 313f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall return static_cast<ExprValueKind>(ExprBits.ValueKind); 314f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 315f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall 316f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// getObjectKind - The object kind that this expression produces. 317f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// Object kinds are meaningful only for expressions that yield an 318f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// l-value or x-value. 319f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprObjectKind getObjectKind() const { 320f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall return static_cast<ExprObjectKind>(ExprBits.ObjectKind); 321f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 322f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall 32356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall bool isOrdinaryOrBitFieldObject() const { 32456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprObjectKind OK = getObjectKind(); 32556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return (OK == OK_Ordinary || OK == OK_BitField); 32656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 32756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 328f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// setValueKind - Set the value kind produced by this expression. 329f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall void setValueKind(ExprValueKind Cat) { ExprBits.ValueKind = Cat; } 330f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall 331f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// setObjectKind - Set the object kind produced by this expression. 332f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall void setObjectKind(ExprObjectKind Cat) { ExprBits.ObjectKind = Cat; } 333f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall 3342111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redlprivate: 3352111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl Classification ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const; 3362111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 3372111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redlpublic: 3382111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 33933bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor /// \brief If this expression refers to a bit-field, retrieve the 34033bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor /// declaration of that bit-field. 34133bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor FieldDecl *getBitField(); 3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 34338d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson const FieldDecl *getBitField() const { 34438d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson return const_cast<Expr*>(this)->getBitField(); 34538d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson } 3461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 347f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall /// \brief If this expression is an l-value for an Objective C 348f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall /// property, find the underlying property reference expression. 349f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall const ObjCPropertyRefExpr *getObjCProperty() const; 350f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 351093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson /// \brief Returns whether this expression refers to a vector element. 352093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson bool refersToVectorElement() const; 353c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3542b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner /// isKnownToHaveBooleanValue - Return true if this is an integer expression 3552b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner /// that is known to return 0 or 1. This happens for _Bool/bool expressions 3562b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner /// but also int expressions which are produced by things like comparisons in 3572b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner /// C. 3582b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner bool isKnownToHaveBooleanValue() const; 359c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// isIntegerConstantExpr - Return true if this expression is a valid integer 3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// constant expression, and, if so, return its value in Result. If not a 3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// valid i-c-e, return false and fill in Loc (if specified) with the location 3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// of the invalid expression. 364590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner bool isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, 365590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner SourceLocation *Loc = 0, 3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isEvaluated = true) const; 367590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner bool isIntegerConstantExpr(ASTContext &Ctx, SourceLocation *Loc = 0) const { 3688070a8497c0fb3e6f70a557f788405d8945b1208Daniel Dunbar llvm::APSInt X; 369590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner return isIntegerConstantExpr(X, Ctx, Loc); 3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 371c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedman /// isConstantInitializer - Returns true if this expression is a constant 372c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedman /// initializer, which can be emitted at compile-time. 3734204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall bool isConstantInitializer(ASTContext &Ctx, bool ForRef) const; 3741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37594deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// EvalResult is a struct with detailed info about an evaluated expression. 37694deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson struct EvalResult { 3772d6744ff04c1690a1485178d550d2fab84a0270bDaniel Dunbar /// Val - This is the value the expression can be folded to. 37894deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson APValue Val; 3791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// HasSideEffects - Whether the evaluated expression has side effects. 38194deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// For example, (f() && 0) can be folded, but it still has side effects. 38294deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson bool HasSideEffects; 3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38494deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// Diag - If the expression is unfoldable, then Diag contains a note 38594deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// diagnostic indicating why it's not foldable. DiagLoc indicates a caret 38694deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// position for the error, and DiagExpr is the expression that caused 38794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// the error. 38894deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// If the expression is foldable, but not an integer constant expression, 38994deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// Diag contains a note diagnostic that describes why it isn't an integer 39094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// constant expression. If the expression *is* an integer constant 39194deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// expression, then Diag will be zero. 39294deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson unsigned Diag; 39394deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson const Expr *DiagExpr; 39494deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson SourceLocation DiagLoc; 3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39694deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson EvalResult() : HasSideEffects(false), Diag(0), DiagExpr(0) {} 397e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara 398e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara // isGlobalLValue - Return true if the evaluated lvalue expression 399e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara // is global. 400e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara bool isGlobalLValue() const; 401e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara // hasSideEffects - Return true if the evaluated expression has 402e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara // side effects. 403e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara bool hasSideEffects() const { 404e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara return HasSideEffects; 405e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara } 40694deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson }; 40794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson 4086ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner /// Evaluate - Return true if this is a constant which we can fold using 409019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner /// any crazy technique (that has nothing to do with language standards) that 410019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner /// we want to. If this function returns true, it returns the folded constant 411019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner /// in Result. 4124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool Evaluate(EvalResult &Result, const ASTContext &Ctx) const; 4135b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson 414cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall /// EvaluateAsBooleanCondition - Return true if this is a constant 415cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall /// which we we can fold and convert to a boolean condition using 416cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall /// any crazy technique that we want to. 4174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx) const; 418cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall 4196ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner /// isEvaluatable - Call Evaluate to see if this expression can be constant 42045b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner /// folded, but discard the result. 4214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool isEvaluatable(const ASTContext &Ctx) const; 422c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson 4236ddf4784a22b994b954ed74c6061d4603d474639Fariborz Jahanian /// HasSideEffects - This routine returns true for all those expressions 424138d6a6890c171068ac60430431eaadb3fcef9abGabor Greif /// which must be evaluated each time and must not be optimized away 4256ddf4784a22b994b954ed74c6061d4603d474639Fariborz Jahanian /// or evaluated at compile time. Example is a function call, volatile 4266ddf4784a22b994b954ed74c6061d4603d474639Fariborz Jahanian /// variable read. 4274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool HasSideEffects(const ASTContext &Ctx) const; 428c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 42951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson /// EvaluateAsInt - Call Evaluate and return the folded integer. This 43051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson /// must be called on an expression that constant folds to an integer. 4314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad llvm::APSInt EvaluateAsInt(const ASTContext &Ctx) const; 43251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 433b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman /// EvaluateAsLValue - Evaluate an expression to see if it's a lvalue 434b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman /// with link time known address. 4354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const; 4361b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 437e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara /// EvaluateAsLValue - Evaluate an expression to see if it's a lvalue. 4384ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool EvaluateAsAnyLValue(EvalResult &Result, const ASTContext &Ctx) const; 439e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara 44082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// \brief Enumeration used to describe the kind of Null pointer constant 44182214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// returned from \c isNullPointerConstant(). 44282214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth enum NullPointerConstantKind { 44382214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// \brief Expression is not a Null pointer constant. 44482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NPCK_NotNull = 0, 44582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth 44682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// \brief Expression is a Null pointer constant built from a zero integer. 44782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NPCK_ZeroInteger, 44882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth 44982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// \brief Expression is a C++0X nullptr. 45082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NPCK_CXX0X_nullptr, 45182214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth 45282214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// \brief Expression is a GNU-style __null constant. 45382214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NPCK_GNUNull 45482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth }; 45582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth 456ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// \brief Enumeration used to describe how \c isNullPointerConstant() 457ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// should cope with value-dependent expressions. 458ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor enum NullPointerConstantValueDependence { 459ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// \brief Specifies that the expression should never be value-dependent. 460ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor NPC_NeverValueDependent = 0, 461c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 462ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// \brief Specifies that a value-dependent expression of integral or 463ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// dependent type should be considered a null pointer constant. 464ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor NPC_ValueDependentIsNull, 465c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 466ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// \brief Specifies that a value-dependent expression should be considered 467ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// to never be a null pointer constant. 468ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor NPC_ValueDependentIsNotNull 469ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor }; 470c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 47182214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to 47282214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// a Null pointer constant. The return value can further distinguish the 47382214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// kind of NULL pointer constant that was detected. 47482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NullPointerConstantKind isNullPointerConstant( 47582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth ASTContext &Ctx, 47682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NullPointerConstantValueDependence NPC) const; 477efa9b3877ef298bcb792600ac33521827e1f7fafAnders Carlsson 47844baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian /// isOBJCGCCandidate - Return true if this expression may be used in a read/ 4791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// write barrier. 480102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian bool isOBJCGCCandidate(ASTContext &Ctx) const; 4811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48211ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis /// \brief Returns true if this expression is a bound member function. 48311ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis bool isBoundMemberFunction(ASTContext &Ctx) const; 48411ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis 485369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /// \brief Result type of CanThrow(). 486369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl enum CanThrowResult { 487369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CT_Cannot, 488369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CT_Dependent, 489369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CT_Can 490369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl }; 491369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /// \brief Test if this expression, if evaluated, might throw, according to 492369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /// the rules of C++ [expr.unary.noexcept]. 493369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CanThrowResult CanThrow(ASTContext &C) const; 494369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 4954e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek /// IgnoreParens - Ignore parentheses. If this Expr is a ParenExpr, return 4961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// its subexpression. If that subexpression is also a ParenExpr, 4974e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek /// then this method recursively returns its subexpression, and so forth. 4984e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek /// Otherwise, the method returns the current Expr. 4992b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner Expr *IgnoreParens(); 50056f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner 50156f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner /// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr 50227c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor /// or CastExprs, returning their operand. 50356f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner Expr *IgnoreParenCasts(); 5041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5052fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall /// IgnoreParenImpCasts - Ignore parentheses and implicit casts. Strip off any 5062fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall /// ParenExpr or ImplicitCastExprs, returning their operand. 5072fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall Expr *IgnoreParenImpCasts(); 5082fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall 5094d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek const Expr *IgnoreParenImpCasts() const { 5104d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek return const_cast<Expr*>(this)->IgnoreParenImpCasts(); 5114d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek } 512f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 513f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall /// Ignore parentheses and lvalue casts. Strip off any ParenExpr and 514f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall /// CastExprs that represent lvalue casts, returning their operand. 515f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall Expr *IgnoreParenLValueCasts(); 516f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 517f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall const Expr *IgnoreParenLValueCasts() const { 518f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall return const_cast<Expr*>(this)->IgnoreParenLValueCasts(); 519f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 5204d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek 521ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner /// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the 522ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner /// value (including ptr->int casts of the same size). Strip off any 523ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner /// ParenExpr or CastExprs, returning their operand. 524ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner Expr *IgnoreParenNoopCasts(ASTContext &Ctx); 5251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5266eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// \brief Determine whether this expression is a default function argument. 5276eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// 5286eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// Default arguments are implicitly generated in the abstract syntax tree 529c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /// by semantic analysis for function calls, object constructions, etc. in 5306eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes; 5316eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// this routine also looks through any implicit casts to determine whether 5326eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// the expression is a default argument. 5336eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor bool isDefaultArgument() const; 534c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 535558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall /// \brief Determine whether the result of this expression is a 536558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall /// temporary object of the given class type. 537558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const; 5382f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 5392b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner const Expr *IgnoreParens() const { 5404e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek return const_cast<Expr*>(this)->IgnoreParens(); 5414e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek } 54256f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner const Expr *IgnoreParenCasts() const { 54356f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner return const_cast<Expr*>(this)->IgnoreParenCasts(); 54456f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner } 545ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner const Expr *IgnoreParenNoopCasts(ASTContext &Ctx) const { 546ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner return const_cast<Expr*>(this)->IgnoreParenNoopCasts(Ctx); 547ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 5481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 549898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor static bool hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs); 550898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor static bool hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs); 551898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 5521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 5535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return T->getStmtClass() >= firstExprConstant && 5541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T->getStmtClass() <= lastExprConstant; 5555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const Expr *) { return true; } 5575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 5585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5605549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek//===----------------------------------------------------------------------===// 5615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Primary Expressions. 5625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 5635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 56456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// OpaqueValueExpr - An expression referring to an opaque object of a 56556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// fixed type and value class. These don't correspond to concrete 56656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// syntax; instead they're used to express operations (usually copy 56756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// operations) on values whose source is generally obvious from 56856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// context. 56956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass OpaqueValueExpr : public Expr { 57056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall friend class ASTStmtReader; 57156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *SourceExpr; 57256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation Loc; 57356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 57456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic: 57556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK, 57656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprObjectKind OK = OK_Ordinary) 57756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : Expr(OpaqueValueExprClass, T, VK, OK, 57856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall T->isDependentType(), T->isDependentType(), false), 57956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceExpr(0), Loc(Loc) { 58056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 58156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 58256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// Given an expression which invokes a copy constructor --- i.e. a 58356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// CXXConstructExpr, possibly wrapped in an ExprWithCleanups --- 58456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// find the OpaqueValueExpr that's the source of the construction. 58556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static const OpaqueValueExpr *findInCopyConstruct(const Expr *expr); 58656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 58756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall explicit OpaqueValueExpr(EmptyShell Empty) 58856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : Expr(OpaqueValueExprClass, Empty) { } 58956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 59056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief Retrieve the location of this expression. 59156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation getLocation() const { return Loc; } 59256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 59356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceRange getSourceRange() const { 59456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (SourceExpr) return SourceExpr->getSourceRange(); 59556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return Loc; 59656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 59756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation getExprLoc() const { 59856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (SourceExpr) return SourceExpr->getExprLoc(); 59956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return Loc; 60056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 60156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 60256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall child_range children() { return child_range(); } 60356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 60456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// The source expression of an opaque value expression is the 60556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// expression which originally generated the value. This is 60656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// provided as a convenience for analyses that don't wish to 60756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// precisely model the execution behavior of the program. 60856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// 60956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// The source expression is typically set when building the 61056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// expression which binds the opaque value expression in the first 61156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// place. 61256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getSourceExpr() const { return SourceExpr; } 61356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall void setSourceExpr(Expr *e) { SourceExpr = e; } 61456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 61556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const Stmt *T) { 61656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return T->getStmtClass() == OpaqueValueExprClass; 61756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 61856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const OpaqueValueExpr *) { return true; } 61956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}; 62056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 621a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// \brief Represents the qualifier that may precede a C++ name, e.g., the 622a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// "std::" in "std::sort". 623a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregorstruct NameQualifier { 624a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief The nested name specifier. 625a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *NNS; 626c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 627a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief The source range covered by the nested name specifier. 628a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange Range; 629a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor}; 630a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor 631a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// \brief Represents an explicit template argument list in C++, e.g., 632a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// the "<int>" in "sort<int>". 633a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregorstruct ExplicitTemplateArgumentList { 634a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief The source location of the left angle bracket ('<'); 635a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation LAngleLoc; 636c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 637a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief The source location of the right angle bracket ('>'); 638a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation RAngleLoc; 639c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 640a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief The number of template arguments in TemplateArgs. 641a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// The actual template arguments (if any) are stored after the 642a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// ExplicitTemplateArgumentList structure. 643a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor unsigned NumTemplateArgs; 644c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 645a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the template arguments 646833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *getTemplateArgs() { 647833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return reinterpret_cast<TemplateArgumentLoc *> (this + 1); 648a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 649c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 650a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the template arguments 651833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *getTemplateArgs() const { 652833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return reinterpret_cast<const TemplateArgumentLoc *> (this + 1); 653a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 654d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 655d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall void initializeFrom(const TemplateArgumentListInfo &List); 656bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor void initializeFrom(const TemplateArgumentListInfo &List, 657bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool &Dependent, bool &ContainsUnexpandedParameterPack); 658d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall void copyInto(TemplateArgumentListInfo &List) const; 6598dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis static std::size_t sizeFor(unsigned NumTemplateArgs); 660d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall static std::size_t sizeFor(const TemplateArgumentListInfo &List); 661a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor}; 662c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 6635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DeclRefExpr - [C99 6.5.1p2] - A reference to a declared variable, function, 6645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// enum, etc. 6655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DeclRefExpr : public Expr { 666a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor enum { 667c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // Flag on DecoratedD that specifies when this declaration reference 668a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // expression has a C++ nested-name-specifier. 669a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor HasQualifierFlag = 0x01, 670c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // Flag on DecoratedD that specifies when this declaration reference 671a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // expression has an explicit C++ template argument list. 672a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor HasExplicitTemplateArgumentListFlag = 0x02 673a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor }; 674c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 675c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // DecoratedD - The declaration that we are referencing, plus two bits to 676a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // indicate whether (1) the declaration's name was explicitly qualified and 677c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt // (2) the declaration's name was followed by an explicit template 678a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // argument list. 679dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall llvm::PointerIntPair<ValueDecl *, 2> DecoratedD; 6802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 681a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor // Loc - The location of the declaration name itself. 6825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 6839e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 6842577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// DNLoc - Provides source/type location info for the 6852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// declaration name embedded in DecoratedD. 6862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameLoc DNLoc; 6872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 688a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the qualifier that preceded the declaration name, if any. 689a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NameQualifier *getNameQualifier() { 6902cf719c3c3d805f630dfc6b1255e52647820888eSebastian Redl if ((DecoratedD.getInt() & HasQualifierFlag) == 0) 691a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return 0; 692c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 693a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return reinterpret_cast<NameQualifier *> (this + 1); 694a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 695c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 696a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the qualifier that preceded the member name, if any. 697a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor const NameQualifier *getNameQualifier() const { 698a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return const_cast<DeclRefExpr *>(this)->getNameQualifier(); 699a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 700096832c5ed5b9106fa177ebc148489760c3bc496John McCall 701a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor DeclRefExpr(NestedNameSpecifier *Qualifier, SourceRange QualifierRange, 702dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *D, SourceLocation NameLoc, 703d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *TemplateArgs, 704f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK); 705663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis 7062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclRefExpr(NestedNameSpecifier *Qualifier, SourceRange QualifierRange, 7072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ValueDecl *D, const DeclarationNameInfo &NameInfo, 7082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const TemplateArgumentListInfo *TemplateArgs, 709f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK); 7102577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 711663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis /// \brief Construct an empty declaration reference expression. 712663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis explicit DeclRefExpr(EmptyShell Empty) 713663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis : Expr(DeclRefExprClass, Empty) { } 714c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7150da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor /// \brief Computes the type- and value-dependence flags for this 7160da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor /// declaration reference expression. 7170da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor void computeDependence(); 7189e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 7195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 720f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall DeclRefExpr(ValueDecl *d, QualType t, ExprValueKind VK, SourceLocation l) : 721bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Expr(DeclRefExprClass, t, VK, OK_Ordinary, false, false, false), 722f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall DecoratedD(d, 0), Loc(l) { 7230da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor computeDependence(); 7240da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor } 7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 726a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor static DeclRefExpr *Create(ASTContext &Context, 727a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *Qualifier, 728a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange QualifierRange, 729dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *D, 730a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation NameLoc, 731f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK, 7320da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor const TemplateArgumentListInfo *TemplateArgs = 0); 733663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis 7342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara static DeclRefExpr *Create(ASTContext &Context, 7352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara NestedNameSpecifier *Qualifier, 7362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceRange QualifierRange, 7372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ValueDecl *D, 7382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 739f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK, 7402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const TemplateArgumentListInfo *TemplateArgs = 0); 7412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 742663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis /// \brief Construct an empty declaration reference expression. 743663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis static DeclRefExpr *CreateEmpty(ASTContext &Context, 744def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor bool HasQualifier, 745def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor bool HasExplicitTemplateArgs, 746def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor unsigned NumTemplateArgs); 747c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 748dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *getDecl() { return DecoratedD.getPointer(); } 749dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall const ValueDecl *getDecl() const { return DecoratedD.getPointer(); } 750dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall void setDecl(ValueDecl *NewD) { DecoratedD.setPointer(NewD); } 751904eed3f6148758d39a2d3c88f3133274460d645Douglas Gregor 7522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo getNameInfo() const { 7532577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(getDecl()->getDeclName(), Loc, DNLoc); 7542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 7552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 7569e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis SourceLocation getLocation() const { return Loc; } 7570b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor void setLocation(SourceLocation L) { Loc = L; } 75863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const; 7591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 760a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Determine whether this declaration reference was preceded by a 761a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// C++ nested-name-specifier, e.g., \c N::foo. 762a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor bool hasQualifier() const { return DecoratedD.getInt() & HasQualifierFlag; } 763c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 764a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief If the name was qualified, retrieves the source range of 765a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// the nested-name-specifier that precedes the name. Otherwise, 766a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// returns an empty source range. 767a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceRange getQualifierRange() const { 768a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!hasQualifier()) 769a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SourceRange(); 770c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 771a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getNameQualifier()->Range; 772a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 773c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 774c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /// \brief If the name was qualified, retrieves the nested-name-specifier 775a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// that precedes the name. Otherwise, returns NULL. 776a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *getQualifier() const { 777a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!hasQualifier()) 778a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return 0; 779c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 780a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return getNameQualifier()->NNS; 781a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 782c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 783096832c5ed5b9106fa177ebc148489760c3bc496John McCall bool hasExplicitTemplateArgs() const { 784096832c5ed5b9106fa177ebc148489760c3bc496John McCall return (DecoratedD.getInt() & HasExplicitTemplateArgumentListFlag); 785096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 786096832c5ed5b9106fa177ebc148489760c3bc496John McCall 787096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieve the explicit template argument list that followed the 788096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// member template name. 789096832c5ed5b9106fa177ebc148489760c3bc496John McCall ExplicitTemplateArgumentList &getExplicitTemplateArgs() { 790096832c5ed5b9106fa177ebc148489760c3bc496John McCall assert(hasExplicitTemplateArgs()); 791096832c5ed5b9106fa177ebc148489760c3bc496John McCall 792096832c5ed5b9106fa177ebc148489760c3bc496John McCall if ((DecoratedD.getInt() & HasQualifierFlag) == 0) 793096832c5ed5b9106fa177ebc148489760c3bc496John McCall return *reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); 794096832c5ed5b9106fa177ebc148489760c3bc496John McCall 795096832c5ed5b9106fa177ebc148489760c3bc496John McCall return *reinterpret_cast<ExplicitTemplateArgumentList *>( 796096832c5ed5b9106fa177ebc148489760c3bc496John McCall getNameQualifier() + 1); 797096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 798096832c5ed5b9106fa177ebc148489760c3bc496John McCall 799096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieve the explicit template argument list that followed the 800096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// member template name. 801096832c5ed5b9106fa177ebc148489760c3bc496John McCall const ExplicitTemplateArgumentList &getExplicitTemplateArgs() const { 802096832c5ed5b9106fa177ebc148489760c3bc496John McCall return const_cast<DeclRefExpr *>(this)->getExplicitTemplateArgs(); 803a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 804d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 805096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieves the optional explicit template arguments. 806096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// This points to the same data as getExplicitTemplateArgs(), but 807096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// returns null if there are no explicit template arguments. 808096832c5ed5b9106fa177ebc148489760c3bc496John McCall const ExplicitTemplateArgumentList *getExplicitTemplateArgsOpt() const { 809096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) return 0; 810096832c5ed5b9106fa177ebc148489760c3bc496John McCall return &getExplicitTemplateArgs(); 811096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 812096832c5ed5b9106fa177ebc148489760c3bc496John McCall 813d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// \brief Copies the template arguments (if present) into the given 814d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// structure. 815d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 816096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (hasExplicitTemplateArgs()) 817096832c5ed5b9106fa177ebc148489760c3bc496John McCall getExplicitTemplateArgs().copyInto(List); 818d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 819c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 820a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the location of the left angle bracket following the 821a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// member name ('<'), if any. 822a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation getLAngleLoc() const { 823096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) 824a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SourceLocation(); 825c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 826096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().LAngleLoc; 827a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 828c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 829a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the template arguments provided as part of this 830a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// template-id. 831833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *getTemplateArgs() const { 832096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) 833a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return 0; 834c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 835096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().getTemplateArgs(); 836a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 837c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 838a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the number of template arguments provided as part of this 839a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// template-id. 840a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor unsigned getNumTemplateArgs() const { 841096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) 842a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return 0; 843c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 844096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().NumTemplateArgs; 845a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 846c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 847a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the location of the right angle bracket following the 848a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// template arguments ('>'). 849a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation getRAngleLoc() const { 850096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) 851a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SourceLocation(); 852c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 853096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().RAngleLoc; 854a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 855c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 8561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 85799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return T->getStmtClass() == DeclRefExprClass; 8585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 8595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const DeclRefExpr *) { return true; } 8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 86177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 86263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 863663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis 86460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 8653397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl friend class ASTStmtWriter; 8665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 8675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 868d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner/// PredefinedExpr - [C99 6.4.2.2] - A predefined identifier such as __func__. 869d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnerclass PredefinedExpr : public Expr { 870227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonpublic: 871227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson enum IdentType { 872227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson Func, 873227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson Function, 874848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson PrettyFunction, 875848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson /// PrettyFunctionNoVirtual - The same as PrettyFunction, except that the 876848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson /// 'virtual' keyword is omitted for virtual member functions. 877848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson PrettyFunctionNoVirtual 878227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson }; 8791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 880227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonprivate: 881227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson SourceLocation Loc; 882227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson IdentType Type; 883227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonpublic: 8841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PredefinedExpr(SourceLocation l, QualType type, IdentType IT) 885f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(PredefinedExprClass, type, VK_LValue, OK_Ordinary, 886bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor type->isDependentType(), type->isDependentType(), 887bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /*ContainsUnexpandedParameterPack=*/false), 888f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Loc(l), Type(IT) {} 8891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 89017fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor /// \brief Construct an empty predefined expression. 8911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit PredefinedExpr(EmptyShell Empty) 89217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor : Expr(PredefinedExprClass, Empty) { } 89317fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 894227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson IdentType getIdentType() const { return Type; } 89517fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor void setIdentType(IdentType IT) { Type = IT; } 89617fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 89717fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor SourceLocation getLocation() const { return Loc; } 89817fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor void setLocation(SourceLocation L) { Loc = L; } 89917fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 900848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson static std::string ComputeName(IdentType IT, const Decl *CurrentDecl); 9013a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 90263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(Loc); } 903227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson 9041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 9051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == PredefinedExprClass; 906227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson } 907d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner static bool classof(const PredefinedExpr *) { return true; } 9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 90977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 91063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 911227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson}; 912227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson 9139996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// \brief Used by IntegerLiteral/FloatingLiteral to store the numeric without 9149996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// leaking memory. 9159996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// 9169996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// For large floats/integers, APFloat/APInt will allocate memory from the heap 9179996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// to represent these numbers. Unfortunately, when we use a BumpPtrAllocator 9189996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// to allocate IntegerLiteral/FloatingLiteral nodes the memory associated with 9199996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// the APFloat/APInt values will never get freed. APNumericStorage uses 9209996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// ASTContext's allocator for memory allocation. 9219996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisclass APNumericStorage { 9229996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis unsigned BitWidth; 9239996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis union { 9249996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis uint64_t VAL; ///< Used to store the <= 64 bits integer value. 9259996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis uint64_t *pVal; ///< Used to store the >64 bits integer value. 9269996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis }; 9279996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9289996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis bool hasAllocation() const { return llvm::APInt::getNumWords(BitWidth) > 1; } 9299996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9309996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis APNumericStorage(const APNumericStorage&); // do not implement 9319996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis APNumericStorage& operator=(const APNumericStorage&); // do not implement 9329996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9339996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisprotected: 9349996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis APNumericStorage() : BitWidth(0), VAL(0) { } 9359996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9369996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis llvm::APInt getIntValue() const { 9379996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 9389996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis if (NumWords > 1) 9399996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return llvm::APInt(BitWidth, NumWords, pVal); 9409996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis else 9419996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return llvm::APInt(BitWidth, VAL); 9429996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis } 9439996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis void setIntValue(ASTContext &C, const llvm::APInt &Val); 9449996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}; 9459996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9469996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisclass APIntStorage : public APNumericStorage { 9479996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidispublic: 9489996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis llvm::APInt getValue() const { return getIntValue(); } 9499996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis void setValue(ASTContext &C, const llvm::APInt &Val) { setIntValue(C, Val); } 9509996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}; 9519996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9529996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisclass APFloatStorage : public APNumericStorage { 9539996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidispublic: 9549996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis llvm::APFloat getValue() const { return llvm::APFloat(getIntValue()); } 9559996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis void setValue(ASTContext &C, const llvm::APFloat &Val) { 9569996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis setIntValue(C, Val.bitcastToAPInt()); 9579996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis } 9589996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}; 9599996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass IntegerLiteral : public Expr { 9619996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis APIntStorage Num; 9625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 9639996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9649996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis /// \brief Construct an empty integer literal. 9659996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis explicit IntegerLiteral(EmptyShell Empty) 9669996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis : Expr(IntegerLiteralClass, Empty) { } 9679996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy, 9705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // or UnsignedLongLongTy 9719996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis IntegerLiteral(ASTContext &C, const llvm::APInt &V, 9729996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis QualType type, SourceLocation l) 973bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(IntegerLiteralClass, type, VK_RValue, OK_Ordinary, false, false, 974bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false), 975f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Loc(l) { 9765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(type->isIntegerType() && "Illegal type in IntegerLiteral"); 9779996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis setValue(C, V); 9785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 979a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson 9809996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy, 9819996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis // or UnsignedLongLongTy 9829996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis static IntegerLiteral *Create(ASTContext &C, const llvm::APInt &V, 9839996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis QualType type, SourceLocation l); 9849996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis static IntegerLiteral *Create(ASTContext &C, EmptyShell Empty); 9850b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 9869996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis llvm::APInt getValue() const { return Num.getValue(); } 98763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(Loc); } 9885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 989313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor /// \brief Retrieve the location of the literal. 990313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor SourceLocation getLocation() const { return Loc; } 991313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor 9929996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis void setValue(ASTContext &C, const llvm::APInt &Val) { Num.setValue(C, Val); } 9930b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor void setLocation(SourceLocation Location) { Loc = Location; } 9940b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 9951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == IntegerLiteralClass; 9975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 9985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const IntegerLiteral *) { return true; } 9991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 100077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 100163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 10025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 10035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CharacterLiteral : public Expr { 10055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned Value; 10065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 1007c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner bool IsWide; 10085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 10095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // type should be IntTy 1010c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner CharacterLiteral(unsigned value, bool iswide, QualType type, SourceLocation l) 1011bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(CharacterLiteralClass, type, VK_RValue, OK_Ordinary, false, false, 1012bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false), 1013f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Value(value), Loc(l), IsWide(iswide) { 10145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10150b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 10160b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor /// \brief Construct an empty character literal. 10170b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { } 10180b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 1019018d8e0596dd57401eeddcf11ac84ff0a065fbbeChris Lattner SourceLocation getLocation() const { return Loc; } 1020c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner bool isWide() const { return IsWide; } 10211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 102263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(Loc); } 10231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getValue() const { return Value; } 10255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10260b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor void setLocation(SourceLocation Location) { Loc = Location; } 10270b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor void setWide(bool W) { IsWide = W; } 10280b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor void setValue(unsigned Val) { Value = Val; } 10290b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 10311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == CharacterLiteralClass; 10325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const CharacterLiteral *) { return true; } 103477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 103577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 103663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 10375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 10385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass FloatingLiteral : public Expr { 10409996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis APFloatStorage Num; 1041720c4ec57b6110873cd533ad434853a27e7c3f4aTed Kremenek bool IsExact : 1; 10425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 10439996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 10449996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis FloatingLiteral(ASTContext &C, const llvm::APFloat &V, bool isexact, 1045720c4ec57b6110873cd533ad434853a27e7c3f4aTed Kremenek QualType Type, SourceLocation L) 1046bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(FloatingLiteralClass, Type, VK_RValue, OK_Ordinary, false, false, 1047bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false), 10489996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis IsExact(isexact), Loc(L) { 10499996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis setValue(C, V); 10509996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis } 10515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 105217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor /// \brief Construct an empty floating-point literal. 10531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit FloatingLiteral(EmptyShell Empty) 10549996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis : Expr(FloatingLiteralClass, Empty), IsExact(false) { } 105517fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 10569996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidispublic: 10579996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis static FloatingLiteral *Create(ASTContext &C, const llvm::APFloat &V, 10589996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis bool isexact, QualType Type, SourceLocation L); 10599996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis static FloatingLiteral *Create(ASTContext &C, EmptyShell Empty); 10609996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 10619996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis llvm::APFloat getValue() const { return Num.getValue(); } 10629996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis void setValue(ASTContext &C, const llvm::APFloat &Val) { 10639996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis Num.setValue(C, Val); 10649996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis } 106517fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 1066720c4ec57b6110873cd533ad434853a27e7c3f4aTed Kremenek bool isExact() const { return IsExact; } 106717fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor void setExact(bool E) { IsExact = E; } 1068c9bec4bfea9090a08dd83a7b213f0c8adf8d78ecChris Lattner 1069da8249e57f3badecf925571881fe57243935c6c1Chris Lattner /// getValueAsApproximateDouble - This returns the value as an inaccurate 1070da8249e57f3badecf925571881fe57243935c6c1Chris Lattner /// double. Note that this may cause loss of precision, but is useful for 1071da8249e57f3badecf925571881fe57243935c6c1Chris Lattner /// debugging dumps, etc. 1072da8249e57f3badecf925571881fe57243935c6c1Chris Lattner double getValueAsApproximateDouble() const; 10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 107417fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor SourceLocation getLocation() const { return Loc; } 107517fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor void setLocation(SourceLocation L) { Loc = L; } 107617fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 107763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(Loc); } 10785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 10801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == FloatingLiteralClass; 10815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const FloatingLiteral *) { return true; } 10831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 108477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 108563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 10865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 10875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10885d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// ImaginaryLiteral - We support imaginary integer and floating point literals, 10895d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// like "1.0i". We represent these as a wrapper around FloatingLiteral and 10905d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// IntegerLiteral classes. Instances of this class always have a Complex type 10915d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// whose element type matches the subexpression. 10925d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// 10935d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnerclass ImaginaryLiteral : public Expr { 10945549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *Val; 10955d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnerpublic: 10965d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner ImaginaryLiteral(Expr *val, QualType Ty) 1097bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(ImaginaryLiteralClass, Ty, VK_RValue, OK_Ordinary, false, false, 1098bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false), 1099f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Val(val) {} 11001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1101cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor /// \brief Build an empty imaginary literal. 11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit ImaginaryLiteral(EmptyShell Empty) 1103cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor : Expr(ImaginaryLiteralClass, Empty) { } 1104cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor 11055549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getSubExpr() const { return cast<Expr>(Val); } 11065549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getSubExpr() { return cast<Expr>(Val); } 1107cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor void setSubExpr(Expr *E) { Val = E; } 1108cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor 110963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return Val->getSourceRange(); } 11101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ImaginaryLiteralClass; 11125d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner } 11135d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner static bool classof(const ImaginaryLiteral *) { return true; } 11141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11155d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner // Iterators 111663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Val, &Val+1); } 11175d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner}; 11185d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 1119e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek/// StringLiteral - This represents a string literal expression, e.g. "foo" 1120e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek/// or L"bar" (wide strings). The actual string is returned by getStrData() 1121e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek/// is NOT null-terminated, and the length of the string is determined by 1122a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// calling getByteLength(). The C type for a string is always a 1123c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// ConstantArrayType. In C++, the char type is const qualified, in C it is 1124c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// not. 1125690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner/// 1126690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner/// Note that strings in C can be formed by concatenation of multiple string 11278bea7c0ee44c71c817de7dc2be932b73bec90c9fChris Lattner/// literal pptokens in translation phase #6. This keeps track of the locations 1128690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner/// of each of these pieces. 1129c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// 1130c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// Strings in C can also be truncated and extended by assigning into arrays, 1131c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// e.g. with constructs like: 1132c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// char X[2] = "foobar"; 1133c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// In this case, getByteLength() will return 6, but the string literal will 1134c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// have type "char[2]". 11355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass StringLiteral : public Expr { 11365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *StrData; 11375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned ByteLength; 11385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool IsWide; 1139726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner unsigned NumConcatenated; 1140726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner SourceLocation TokLocs[1]; 11412085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner 1142f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall StringLiteral(QualType Ty) : 1143bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Expr(StringLiteralClass, Ty, VK_LValue, OK_Ordinary, false, false, false) {} 11441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 11462085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner /// This is the "fully general" constructor that allows representation of 11472085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner /// strings formed from multiple concatenated tokens. 11482085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner static StringLiteral *Create(ASTContext &C, const char *StrData, 11492085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner unsigned ByteLength, bool Wide, QualType Ty, 1150a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson const SourceLocation *Loc, unsigned NumStrs); 11512085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner 11522085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner /// Simple constructor for string literals made from one token. 11531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static StringLiteral *Create(ASTContext &C, const char *StrData, 11542085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner unsigned ByteLength, 11552085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner bool Wide, QualType Ty, SourceLocation Loc) { 11562085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner return Create(C, StrData, ByteLength, Wide, Ty, &Loc, 1); 11572085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner } 1158a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson 1159673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor /// \brief Construct an empty string literal. 1160673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor static StringLiteral *CreateEmpty(ASTContext &C, unsigned NumStrs); 1161673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 1162b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar llvm::StringRef getString() const { 1163b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar return llvm::StringRef(StrData, ByteLength); 1164b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar } 11652f4eaef37476ae6891ede8ba215d0f6fd093629bBenjamin Kramer 11665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getByteLength() const { return ByteLength; } 1167673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 1168673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor /// \brief Sets the string data to the given string data. 1169b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar void setString(ASTContext &C, llvm::StringRef Str); 1170673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 11715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isWide() const { return IsWide; } 1172673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor void setWide(bool W) { IsWide = W; } 1173673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 11748d4141f83d9de379547cf05bd75d4c6cf894b189Steve Naroff bool containsNonAsciiOrNull() const { 1175b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar llvm::StringRef Str = getString(); 1176b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar for (unsigned i = 0, e = Str.size(); i != e; ++i) 1177b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar if (!isascii(Str[i]) || !Str[i]) 117833fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff return true; 117933fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff return false; 118033fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff } 1181726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner /// getNumConcatenated - Get the number of string literal tokens that were 1182726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner /// concatenated in translation phase #6 to form this string literal. 1183726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner unsigned getNumConcatenated() const { return NumConcatenated; } 11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1185726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner SourceLocation getStrTokenLoc(unsigned TokNum) const { 1186726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner assert(TokNum < NumConcatenated && "Invalid tok number"); 1187726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner return TokLocs[TokNum]; 1188726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner } 11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void setStrTokenLoc(unsigned TokNum, SourceLocation L) { 1190673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor assert(TokNum < NumConcatenated && "Invalid tok number"); 1191673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor TokLocs[TokNum] = L; 1192673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor } 119308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 119408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// getLocationOfByte - Return a source location that points to the specified 119508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// byte of this string literal. 119608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// 119708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// Strings are amazingly complex. They can be formed from multiple tokens 119808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// and can have escape sequences in them in addition to the usual trigraph 119908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// and escaped newline business. This routine handles this complexity. 120008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// 120108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner SourceLocation getLocationOfByte(unsigned ByteNo, const SourceManager &SM, 120208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner const LangOptions &Features, 120308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner const TargetInfo &Target) const; 1204673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 1205b137299ce5bb6c36fbba651858600857fda4dd50Chris Lattner typedef const SourceLocation *tokloc_iterator; 1206b137299ce5bb6c36fbba651858600857fda4dd50Chris Lattner tokloc_iterator tokloc_begin() const { return TokLocs; } 1207b137299ce5bb6c36fbba651858600857fda4dd50Chris Lattner tokloc_iterator tokloc_end() const { return TokLocs+NumConcatenated; } 12085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 120963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 12101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SourceRange(TokLocs[0], TokLocs[NumConcatenated-1]); 12115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 12131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == StringLiteralClass; 12145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 12155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const StringLiteral *) { return true; } 12161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 121777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 121863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 12195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 12205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 12215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ParenExpr - This represents a parethesized expression, e.g. "(1)". This 12225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// AST node is only formed if full location information is requested. 12235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ParenExpr : public Expr { 12245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation L, R; 12255549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *Val; 12265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 12275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ParenExpr(SourceLocation l, SourceLocation r, Expr *val) 1228898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor : Expr(ParenExprClass, val->getType(), 1229f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall val->getValueKind(), val->getObjectKind(), 1230bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor val->isTypeDependent(), val->isValueDependent(), 1231bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor val->containsUnexpandedParameterPack()), 1232898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor L(l), R(r), Val(val) {} 12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1234c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor /// \brief Construct an empty parenthesized expression. 12351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit ParenExpr(EmptyShell Empty) 1236c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor : Expr(ParenExprClass, Empty) { } 1237c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor 12385549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getSubExpr() const { return cast<Expr>(Val); } 12395549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getSubExpr() { return cast<Expr>(Val); } 1240c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor void setSubExpr(Expr *E) { Val = E; } 1241c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor 124263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(L, R); } 12435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1244313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor /// \brief Get the location of the left parentheses '('. 1245313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor SourceLocation getLParen() const { return L; } 1246c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor void setLParen(SourceLocation Loc) { L = Loc; } 1247313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor 1248313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor /// \brief Get the location of the right parentheses ')'. 1249313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor SourceLocation getRParen() const { return R; } 1250c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor void setRParen(SourceLocation Loc) { R = Loc; } 1251313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor 12521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 12531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ParenExprClass; 12545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 12555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const ParenExpr *) { return true; } 12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 125777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 125863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Val, &Val+1); } 12595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 12605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 12615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 12620518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// UnaryOperator - This represents the unary-expression's (except sizeof and 12630518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// alignof), the postinc/postdec operators from postfix-expression, and various 12645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// extensions. 1265dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// 1266dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// Notes on various nodes: 1267dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// 1268dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// Real/Imag - These return the real/imag part of a complex operand. If 1269dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// applied to a non-complex value, the former returns its operand and the 1270dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// later returns zero in the type of the operand. 1271dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// 12725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass UnaryOperator : public Expr { 12735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 12745baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall typedef UnaryOperatorKind Opcode; 12755baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall 12765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate: 12770799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall unsigned Opc : 5; 12785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 12790799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall Stmt *Val; 12801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 12815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1282f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall UnaryOperator(Expr *input, Opcode opc, QualType type, 1283f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK, SourceLocation l) 1284f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(UnaryOperatorClass, type, VK, OK, 1285de7e66256b1bdfcf6526994825a8c8fced52a31cEli Friedman input->isTypeDependent() || type->isDependentType(), 1286bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor input->isValueDependent(), 1287bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor input->containsUnexpandedParameterPack()), 12880799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall Opc(opc), Loc(l), Val(input) {} 12895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 12900b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor /// \brief Build an empty unary operator. 12911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit UnaryOperator(EmptyShell Empty) 12922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall : Expr(UnaryOperatorClass, Empty), Opc(UO_AddrOf) { } 12930b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 12940799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall Opcode getOpcode() const { return static_cast<Opcode>(Opc); } 12950b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setOpcode(Opcode O) { Opc = O; } 12960b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 12975549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getSubExpr() const { return cast<Expr>(Val); } 12980b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setSubExpr(Expr *E) { Val = E; } 12990b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 13005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getOperatorLoc - Return the location of the operator. 13015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation getOperatorLoc() const { return Loc; } 13020b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setOperatorLoc(SourceLocation L) { Loc = L; } 13030b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 13045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// isPostfix - Return true if this is a postfix operation, like x++. 13052085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner static bool isPostfix(Opcode Op) { 13062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall return Op == UO_PostInc || Op == UO_PostDec; 13072085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner } 13085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1309cc7bd10c0de9449b795bda3c5dcc6d83cc48436bZhanyong Wan /// isPrefix - Return true if this is a prefix operation, like --x. 13102085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner static bool isPrefix(Opcode Op) { 13112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall return Op == UO_PreInc || Op == UO_PreDec; 13122085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner } 13135a56ac30d04e8f0431a08980885662a47a6308aaTed Kremenek 13140799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isPrefix() const { return isPrefix(getOpcode()); } 13150799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isPostfix() const { return isPostfix(getOpcode()); } 13162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall bool isIncrementOp() const { 1317993cdca0fed7deb646e4654dfb2607227a497faaBenjamin Kramer return Opc == UO_PreInc || Opc == UO_PostInc; 13182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall } 13192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall bool isIncrementDecrementOp() const { 1320993cdca0fed7deb646e4654dfb2607227a497faaBenjamin Kramer return Opc <= UO_PreDec; 13212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall } 13222de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isArithmeticOp(Opcode Op) { 13232de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall return Op >= UO_Plus && Op <= UO_LNot; 13242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall } 13250799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isArithmeticOp() const { return isArithmeticOp(getOpcode()); } 13261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 13285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// corresponds to, e.g. "sizeof" or "[pre]++" 13295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static const char *getOpcodeStr(Opcode Op); 13305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1331bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor /// \brief Retrieve the unary opcode that corresponds to the given 1332bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor /// overloaded operator. 1333bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix); 1334bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 1335bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor /// \brief Retrieve the overloaded operator kind that corresponds to 1336bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor /// the given unary opcode. 1337bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); 1338bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 133963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 13405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (isPostfix()) 13415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return SourceRange(Val->getLocStart(), Loc); 13425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 13435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return SourceRange(Loc, Val->getLocEnd()); 13445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 134563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceLocation getExprLoc() const { return Loc; } 13461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 13481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == UnaryOperatorClass; 13495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 13505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const UnaryOperator *) { return true; } 13511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 135277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 135363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Val, &Val+1); } 13545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 13555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 13568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// OffsetOfExpr - [C99 7.17] - This represents an expression of the form 13578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// offsetof(record-type, member-designator). For example, given: 13588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// @code 13598ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// struct S { 13608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// float f; 1361c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt/// double d; 13628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// }; 13638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// struct T { 13648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// int i; 13658ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// struct S s[10]; 13668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// }; 13678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// @endcode 1368c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt/// we can represent and evaluate the expression @c offsetof(struct T, s[2].d). 13698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 13708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorclass OffsetOfExpr : public Expr { 13718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorpublic: 13728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // __builtin_offsetof(type, identifier(.identifier|[expr])*) 13738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor class OffsetOfNode { 13748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor public: 13758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief The kind of offsetof node we have. 13768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor enum Kind { 1377cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief An index into an array. 13788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Array = 0x00, 1379cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief A field. 13808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Field = 0x01, 1381cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief A field in a dependent type, known only by its name. 1382cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor Identifier = 0x02, 1383cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief An implicit indirection through a C++ base class, when the 1384cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// field found is in a base class. 1385cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor Base = 0x03 13868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor }; 13878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 13888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor private: 13898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor enum { MaskBits = 2, Mask = 0x03 }; 1390c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 13918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief The source range that covers this part of the designator. 13928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceRange Range; 1393c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 13948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief The data describing the designator, which comes in three 13958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// different forms, depending on the lower two bits. 1396c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /// - An unsigned index into the array of Expr*'s stored after this node 13978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// in memory, for [constant-expression] designators. 13988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// - A FieldDecl*, for references to a known field. 13998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// - An IdentifierInfo*, for references to a field with a given name 14008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// when the class type is dependent. 1401c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /// - A CXXBaseSpecifier*, for references that look at a field in a 1402cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// base class. 14038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor uintptr_t Data; 1404c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor public: 14068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Create an offsetof node that refers to an array element. 1407c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfNode(SourceLocation LBracketLoc, unsigned Index, 14088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation RBracketLoc) 14098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor : Range(LBracketLoc, RBracketLoc), Data((Index << 2) | Array) { } 1410c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Create an offsetof node that refers to a field. 1412c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfNode(SourceLocation DotLoc, FieldDecl *Field, 14138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation NameLoc) 1414c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt : Range(DotLoc.isValid()? DotLoc : NameLoc, NameLoc), 14158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Data(reinterpret_cast<uintptr_t>(Field) | OffsetOfNode::Field) { } 1416c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Create an offsetof node that refers to an identifier. 14188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OffsetOfNode(SourceLocation DotLoc, IdentifierInfo *Name, 14198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation NameLoc) 1420c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt : Range(DotLoc.isValid()? DotLoc : NameLoc, NameLoc), 14218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Data(reinterpret_cast<uintptr_t>(Name) | Identifier) { } 1422cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 1423cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief Create an offsetof node that refers into a C++ base class. 1424cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor explicit OffsetOfNode(const CXXBaseSpecifier *Base) 1425cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor : Range(), Data(reinterpret_cast<uintptr_t>(Base) | OffsetOfNode::Base) {} 1426c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14278ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Determine what kind of offsetof node this is. 1428c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt Kind getKind() const { 14298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return static_cast<Kind>(Data & Mask); 14308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1431c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief For an array element node, returns the index into the array 14338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// of expressions. 14348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned getArrayExprIndex() const { 14358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(getKind() == Array); 14368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return Data >> 2; 14378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 14388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 14398ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief For a field offsetof node, returns the field. 14408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor FieldDecl *getField() const { 14418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(getKind() == Field); 1442cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor return reinterpret_cast<FieldDecl *>(Data & ~(uintptr_t)Mask); 14438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1444c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14458ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief For a field or identifier offsetof node, returns the name of 14468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// the field. 14478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor IdentifierInfo *getFieldName() const; 1448c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1449cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief For a base class node, returns the base specifier. 1450cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor CXXBaseSpecifier *getBase() const { 1451cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor assert(getKind() == Base); 1452c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return reinterpret_cast<CXXBaseSpecifier *>(Data & ~(uintptr_t)Mask); 1453cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor } 1454c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Retrieve the source range that covers this offsetof node. 14568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// 14578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// For an array element node, the source range contains the locations of 14588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// the square brackets. For a field or identifier node, the source range 1459c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /// contains the location of the period (if there is one) and the 14608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// identifier. 14618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceRange getRange() const { return Range; } 14628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor }; 14638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 14648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorprivate: 1465c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation OperatorLoc, RParenLoc; 14678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Base type; 14688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TypeSourceInfo *TSInfo; 14698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Number of sub-components (i.e. instances of OffsetOfNode). 14708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned NumComps; 14718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Number of sub-expressions (i.e. array subscript expressions). 14728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned NumExprs; 1473c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1474c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfExpr(ASTContext &C, QualType type, 14758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation OperatorLoc, TypeSourceInfo *tsi, 1476c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfNode* compsPtr, unsigned numComps, 14778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr** exprsPtr, unsigned numExprs, 14788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation RParenLoc); 14798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 14808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor explicit OffsetOfExpr(unsigned numComps, unsigned numExprs) 14818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor : Expr(OffsetOfExprClass, EmptyShell()), 1482c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt TSInfo(0), NumComps(numComps), NumExprs(numExprs) {} 14838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 14848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorpublic: 1485c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1486c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt static OffsetOfExpr *Create(ASTContext &C, QualType type, 1487c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt SourceLocation OperatorLoc, TypeSourceInfo *tsi, 1488c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfNode* compsPtr, unsigned numComps, 14898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr** exprsPtr, unsigned numExprs, 14908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation RParenLoc); 14918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 1492c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt static OffsetOfExpr *CreateEmpty(ASTContext &C, 14938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned NumComps, unsigned NumExprs); 14948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 14958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// getOperatorLoc - Return the location of the operator. 14968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation getOperatorLoc() const { return OperatorLoc; } 14978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void setOperatorLoc(SourceLocation L) { OperatorLoc = L; } 14988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 14998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Return the location of the right parentheses. 15008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 15018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void setRParenLoc(SourceLocation R) { RParenLoc = R; } 1502c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 15038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TypeSourceInfo *getTypeSourceInfo() const { 15048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return TSInfo; 15058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void setTypeSourceInfo(TypeSourceInfo *tsi) { 15078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TSInfo = tsi; 15088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1509c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 15108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor const OffsetOfNode &getComponent(unsigned Idx) { 15118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(Idx < NumComps && "Subscript out of range"); 15128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return reinterpret_cast<OffsetOfNode *> (this + 1)[Idx]; 15138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void setComponent(unsigned Idx, OffsetOfNode ON) { 15168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(Idx < NumComps && "Subscript out of range"); 15178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor reinterpret_cast<OffsetOfNode *> (this + 1)[Idx] = ON; 15188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1519c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 15208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned getNumComponents() const { 15218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return NumComps; 15228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr* getIndexExpr(unsigned Idx) { 15258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(Idx < NumExprs && "Subscript out of range"); 15268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return reinterpret_cast<Expr **>( 15278ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor reinterpret_cast<OffsetOfNode *>(this+1) + NumComps)[Idx]; 15288ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void setIndexExpr(unsigned Idx, Expr* E) { 15318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(Idx < NumComps && "Subscript out of range"); 15328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor reinterpret_cast<Expr **>( 15338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor reinterpret_cast<OffsetOfNode *>(this+1) + NumComps)[Idx] = E; 15348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1535c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 15368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned getNumExpressions() const { 15378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return NumExprs; 15388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15398ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 154063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 15418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return SourceRange(OperatorLoc, RParenLoc); 15428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor static bool classof(const Stmt *T) { 15458ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return T->getStmtClass() == OffsetOfExprClass; 15468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor static bool classof(const OffsetOfExpr *) { return true; } 15498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15508ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Iterators 155163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 155263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall Stmt **begin = 155363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall reinterpret_cast<Stmt**>(reinterpret_cast<OffsetOfNode*>(this + 1) 155463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall + NumComps); 155563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(begin, begin + NumExprs); 155663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 15578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}; 15588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15590518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// SizeOfAlignOfExpr - [C99 6.5.3.4] - This is for sizeof/alignof, both of 15600518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// types and expressions. 15610518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlclass SizeOfAlignOfExpr : public Expr { 15620518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool isSizeof : 1; // true if sizeof, false if alignof. 15630518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool isType : 1; // true if operand is a type, false if an expression 1564d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl union { 1565a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *Ty; 1566d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl Stmt *Ex; 1567d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl } Argument; 15685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation OpLoc, RParenLoc; 156942602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregor 15705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 1571a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall SizeOfAlignOfExpr(bool issizeof, TypeSourceInfo *TInfo, 15720518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType resultType, SourceLocation op, 15730518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl SourceLocation rp) : 1574f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr(SizeOfAlignOfExprClass, resultType, VK_RValue, OK_Ordinary, 1575ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor false, // Never type-dependent (C++ [temp.dep.expr]p3). 15762850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl // Value-dependent if the argument is type-dependent. 1577bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor TInfo->getType()->isDependentType(), 1578bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor TInfo->getType()->containsUnexpandedParameterPack()), 1579ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor isSizeof(issizeof), isType(true), OpLoc(op), RParenLoc(rp) { 1580a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall Argument.Ty = TInfo; 1581ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor } 1582ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor 15831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SizeOfAlignOfExpr(bool issizeof, Expr *E, 1584ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor QualType resultType, SourceLocation op, 1585ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor SourceLocation rp) : 1586f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr(SizeOfAlignOfExprClass, resultType, VK_RValue, OK_Ordinary, 1587ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor false, // Never type-dependent (C++ [temp.dep.expr]p3). 1588ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor // Value-dependent if the argument is type-dependent. 1589bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor E->isTypeDependent(), 1590bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor E->containsUnexpandedParameterPack()), 1591ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor isSizeof(issizeof), isType(false), OpLoc(op), RParenLoc(rp) { 1592ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor Argument.Ex = E; 1593d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl } 15940518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 15950b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor /// \brief Construct an empty sizeof/alignof expression. 15960b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor explicit SizeOfAlignOfExpr(EmptyShell Empty) 15970b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor : Expr(SizeOfAlignOfExprClass, Empty) { } 15980b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 15995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isSizeOf() const { return isSizeof; } 16000b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setSizeof(bool S) { isSizeof = S; } 16010b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 16020518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool isArgumentType() const { return isType; } 16030518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType getArgumentType() const { 16045ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getArgumentTypeInfo()->getType(); 16055ab75172051a6d2ea71a80a79e81c65519fd3462John McCall } 1606a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *getArgumentTypeInfo() const { 16070518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl assert(isArgumentType() && "calling getArgumentType() when arg is expr"); 16085ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return Argument.Ty; 16090518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 1610caae7b099a0324b7c15dc89a9b70969d5d7ce996Chris Lattner Expr *getArgumentExpr() { 16110518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl assert(!isArgumentType() && "calling getArgumentExpr() when arg is type"); 1612d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl return static_cast<Expr*>(Argument.Ex); 16130518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 1614caae7b099a0324b7c15dc89a9b70969d5d7ce996Chris Lattner const Expr *getArgumentExpr() const { 1615caae7b099a0324b7c15dc89a9b70969d5d7ce996Chris Lattner return const_cast<SizeOfAlignOfExpr*>(this)->getArgumentExpr(); 1616caae7b099a0324b7c15dc89a9b70969d5d7ce996Chris Lattner } 16170b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 16180b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setArgument(Expr *E) { Argument.Ex = E; isType = false; } 1619a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall void setArgument(TypeSourceInfo *TInfo) { 1620a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall Argument.Ty = TInfo; 16211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump isType = true; 16220b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor } 16230b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 16240518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl /// Gets the argument type, or the type of the argument expression, whichever 16250518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl /// is appropriate. 16260518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType getTypeOfArgument() const { 16270518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl return isArgumentType() ? getArgumentType() : getArgumentExpr()->getType(); 16280518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 16290518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 163076e773a443be9f006610f46529e07d4c8d857680Chris Lattner SourceLocation getOperatorLoc() const { return OpLoc; } 16310b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setOperatorLoc(SourceLocation L) { OpLoc = L; } 16320b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 16330b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 16340b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 1635866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek 163663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 1637866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek return SourceRange(OpLoc, RParenLoc); 1638866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek } 16395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 16411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == SizeOfAlignOfExprClass; 16425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 16430518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl static bool classof(const SizeOfAlignOfExpr *) { return true; } 16441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 164577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 164663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children(); 16475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 16485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 16505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Postfix Operators. 16515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 16525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting. 16545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ArraySubscriptExpr : public Expr { 165577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek enum { LHS, RHS, END_EXPR=2 }; 16561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Stmt* SubExprs[END_EXPR]; 16575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation RBracketLoc; 16585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 16592324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t, 1660f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK, 166173d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner SourceLocation rbracketloc) 1662f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(ArraySubscriptExprClass, t, VK, OK, 16632850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl lhs->isTypeDependent() || rhs->isTypeDependent(), 1664bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor lhs->isValueDependent() || rhs->isValueDependent(), 1665bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (lhs->containsUnexpandedParameterPack() || 1666bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor rhs->containsUnexpandedParameterPack())), 16672850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl RBracketLoc(rbracketloc) { 166873d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner SubExprs[LHS] = lhs; 166973d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner SubExprs[RHS] = rhs; 167073d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner } 16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1672cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor /// \brief Create an empty array subscript expression. 1673cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor explicit ArraySubscriptExpr(EmptyShell Shell) 1674cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor : Expr(ArraySubscriptExprClass, Shell) { } 1675cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor 16762324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek /// An array access can be written A[4] or 4[A] (both are equivalent). 16772324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek /// - getBase() and getIdx() always present the normalized view: A[4]. 16782324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek /// In this case getBase() returns "A" and getIdx() returns "4". 16792324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek /// - getLHS() and getRHS() present the syntactic view. e.g. for 16802324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek /// 4[A] getLHS() returns "4". 168133fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb /// Note: Because vector element access is also written A[4] we must 168233fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb /// predicate the format conversion in getBase and getIdx only on the 168333fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb /// the type of the RHS, as it is possible for the LHS to be a vector of 168433fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb /// integer type 16855549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); } 16865549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 1687cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor void setLHS(Expr *E) { SubExprs[LHS] = E; } 1688cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor 16895549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); } 16905549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 1691cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor void setRHS(Expr *E) { SubExprs[RHS] = E; } 16921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *getBase() { 16945549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS()); 169577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek } 16961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Expr *getBase() const { 16985549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS()); 16992324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek } 17001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *getIdx() { 17025549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS()); 17032324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek } 17041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 170577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek const Expr *getIdx() const { 17065549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS()); 17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 170963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 171077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek return SourceRange(getLHS()->getLocStart(), RBracketLoc); 17115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 17121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1713026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner SourceLocation getRBracketLoc() const { return RBracketLoc; } 1714cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor void setRBracketLoc(SourceLocation L) { RBracketLoc = L; } 1715cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor 171663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceLocation getExprLoc() const { return getBase()->getExprLoc(); } 17175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ArraySubscriptExprClass; 17205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 17215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const ArraySubscriptExpr *) { return true; } 17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 172377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 172463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 172563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 172663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 17275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 17285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1730b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]). 17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CallExpr itself represents a normal function call, e.g., "f(x, 2)", 1732b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// while its subclasses may represent alternative syntax that (semantically) 17331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// results in a function call. For example, CXXOperatorCallExpr is 1734b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// a subclass for overloaded operator calls that use operator syntax, e.g., 1735b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// "str1 + str2" to resolve to a function call. 17365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CallExpr : public Expr { 1737cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne enum { FN=0, PREARGS_START=1 }; 17385549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt **SubExprs; 17395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumArgs; 17405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation RParenLoc; 17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1742b4609806e9232593ece09ce08b630836e825865cDouglas Gregorprotected: 1743cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne // These versions of the constructor are for derived classes. 1744cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne CallExpr(ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs, 1745cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne Expr **args, unsigned numargs, QualType t, ExprValueKind VK, 1746cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne SourceLocation rparenloc); 1747cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne CallExpr(ASTContext &C, StmtClass SC, unsigned NumPreArgs, EmptyShell Empty); 1748cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne 1749cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne Stmt *getPreArg(unsigned i) { 1750cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne assert(i < getNumPreArgs() && "Prearg access out of range!"); 1751cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return SubExprs[PREARGS_START+i]; 1752cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1753cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne const Stmt *getPreArg(unsigned i) const { 1754cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne assert(i < getNumPreArgs() && "Prearg access out of range!"); 1755cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return SubExprs[PREARGS_START+i]; 1756cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1757cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne void setPreArg(unsigned i, Stmt *PreArg) { 1758cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne assert(i < getNumPreArgs() && "Prearg access out of range!"); 1759cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne SubExprs[PREARGS_START+i] = PreArg; 1760cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1761cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne 1762cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne unsigned getNumPreArgs() const { return CallExprBits.NumPreArgs; } 176342602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregor 17645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 17651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs, QualType t, 1766f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, SourceLocation rparenloc); 17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17681f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor /// \brief Build an empty call expression. 1769ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty); 17701f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor 17715549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getCallee() const { return cast<Expr>(SubExprs[FN]); } 17725549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getCallee() { return cast<Expr>(SubExprs[FN]); } 177318b2515e1bf8c86a4900792692e42fe1296be28dChris Lattner void setCallee(Expr *F) { SubExprs[FN] = F; } 1774a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu 1775d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes Decl *getCalleeDecl(); 1776d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes const Decl *getCalleeDecl() const { 1777d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes return const_cast<CallExpr*>(this)->getCalleeDecl(); 1778d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes } 1779d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes 1780a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu /// \brief If the callee is a FunctionDecl, return it. Otherwise return 0. 1781a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu FunctionDecl *getDirectCallee(); 1782bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner const FunctionDecl *getDirectCallee() const { 1783bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner return const_cast<CallExpr*>(this)->getDirectCallee(); 1784bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner } 1785a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu 17865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getNumArgs - Return the number of actual arguments to this call. 17875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 17885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getNumArgs() const { return NumArgs; } 17891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1790aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \brief Retrieve the call arguments. 1791cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne Expr **getArgs() { 1792cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return reinterpret_cast<Expr **>(SubExprs+getNumPreArgs()+PREARGS_START); 1793cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1794aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 17955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getArg - Return the specified argument. 17965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Expr *getArg(unsigned Arg) { 17975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(Arg < NumArgs && "Arg access out of range!"); 1798cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return cast<Expr>(SubExprs[Arg+getNumPreArgs()+PREARGS_START]); 17995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 18005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const Expr *getArg(unsigned Arg) const { 18015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(Arg < NumArgs && "Arg access out of range!"); 1802cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return cast<Expr>(SubExprs[Arg+getNumPreArgs()+PREARGS_START]); 18035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 18041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1805934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff /// setArg - Set the specified argument. 1806934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff void setArg(unsigned Arg, Expr *ArgExpr) { 1807934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff assert(Arg < NumArgs && "Arg access out of range!"); 1808cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne SubExprs[Arg+getNumPreArgs()+PREARGS_START] = ArgExpr; 1809934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff } 18101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1811d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner /// setNumArgs - This changes the number of arguments present in this call. 1812d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner /// Any orphaned expressions are deleted by this, and any new operands are set 1813d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner /// to null. 18148189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek void setNumArgs(ASTContext& C, unsigned NumArgs); 18151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18165549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek typedef ExprIterator arg_iterator; 18175549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek typedef ConstExprIterator const_arg_iterator; 18181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1819cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne arg_iterator arg_begin() { return SubExprs+PREARGS_START+getNumPreArgs(); } 1820cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne arg_iterator arg_end() { 1821cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return SubExprs+PREARGS_START+getNumPreArgs()+getNumArgs(); 1822cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1823cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne const_arg_iterator arg_begin() const { 1824cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return SubExprs+PREARGS_START+getNumPreArgs(); 1825cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1826cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne const_arg_iterator arg_end() const { 1827cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return SubExprs+PREARGS_START+getNumPreArgs()+getNumArgs(); 1828cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 18291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getNumCommas - Return the number of commas that must have been present in 18315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// this function call. 18325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getNumCommas() const { return NumArgs ? NumArgs - 1 : 0; } 18335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1834cb888967400a03504c88acedd5248d6778a82f46Chris Lattner /// isBuiltinCall - If this is a call to a builtin, return the builtin ID. If 1835cb888967400a03504c88acedd5248d6778a82f46Chris Lattner /// not, return 0. 18364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned isBuiltinCall(const ASTContext &Context) const; 18371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// getCallReturnType - Get the return type of the call expr. This is not 18391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// always the type of the expr itself, if the return type is a reference 18406dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson /// type. 18416dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson QualType getCallReturnType() const; 18421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1843d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner SourceLocation getRParenLoc() const { return RParenLoc; } 18441f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 1845866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek 18462882eca5a184c78f793188083f6ce539740a5cf2John McCall SourceRange getSourceRange() const; 18471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 18494bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt return T->getStmtClass() >= firstCallExprConstant && 18504bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt T->getStmtClass() <= lastCallExprConstant; 18515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 18525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const CallExpr *) { return true; } 185388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 185477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 185563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 185663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], 185763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall &SubExprs[0]+NumArgs+getNumPreArgs()+PREARGS_START); 185863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 18595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 18605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1861ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner/// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F. 18625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 18635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass MemberExpr : public Expr { 18646bb8017bb9e828d118e15e59d71c66bba323c364John McCall /// Extra data stored in some member expressions. 18656bb8017bb9e828d118e15e59d71c66bba323c364John McCall struct MemberNameQualifier : public NameQualifier { 1866161755a09898c95d21bfff33707da9ca41cd53c5John McCall DeclAccessPair FoundDecl; 18676bb8017bb9e828d118e15e59d71c66bba323c364John McCall }; 18686bb8017bb9e828d118e15e59d71c66bba323c364John McCall 1869ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// Base - the expression for the base pointer or structure references. In 1870ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// X.F, this is "X". 18715549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *Base; 18721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1873ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// MemberDecl - This is the decl being referenced by the field/member name. 1874ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// In X.F, this is the decl referenced by F. 1875f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *MemberDecl; 18761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1877ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// MemberLoc - This is the location of the member name. 18785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation MemberLoc; 18791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// MemberDNLoc - Provides source/type location info for the 18812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// declaration name embedded in MemberDecl. 18822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameLoc MemberDNLoc; 18832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 1884ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// IsArrow - True if this is "X->F", false if this is "X.F". 188583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor bool IsArrow : 1; 18861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 188783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// \brief True if this member expression used a nested-name-specifier to 18886bb8017bb9e828d118e15e59d71c66bba323c364John McCall /// refer to the member, e.g., "x->Base::f", or found its member via a using 18896bb8017bb9e828d118e15e59d71c66bba323c364John McCall /// declaration. When true, a MemberNameQualifier 1890c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// structure is allocated immediately after the MemberExpr. 18916bb8017bb9e828d118e15e59d71c66bba323c364John McCall bool HasQualifierOrFoundDecl : 1; 18921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1893c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// \brief True if this member expression specified a template argument list 1894c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// explicitly, e.g., x->f<int>. When true, an ExplicitTemplateArgumentList 1895c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// structure (and its TemplateArguments) are allocated immediately after 1896c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// the MemberExpr or, if the member expression also has a qualifier, after 18976bb8017bb9e828d118e15e59d71c66bba323c364John McCall /// the MemberNameQualifier structure. 1898c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor bool HasExplicitTemplateArgumentList : 1; 18991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 190083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// \brief Retrieve the qualifier that preceded the member name, if any. 19016bb8017bb9e828d118e15e59d71c66bba323c364John McCall MemberNameQualifier *getMemberQualifier() { 19026bb8017bb9e828d118e15e59d71c66bba323c364John McCall assert(HasQualifierOrFoundDecl); 19036bb8017bb9e828d118e15e59d71c66bba323c364John McCall return reinterpret_cast<MemberNameQualifier *> (this + 1); 190483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 190583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 190683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// \brief Retrieve the qualifier that preceded the member name, if any. 19076bb8017bb9e828d118e15e59d71c66bba323c364John McCall const MemberNameQualifier *getMemberQualifier() const { 1908c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor return const_cast<MemberExpr *>(this)->getMemberQualifier(); 1909c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 19101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 1912f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman MemberExpr(Expr *base, bool isarrow, ValueDecl *memberdecl, 1913f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall const DeclarationNameInfo &NameInfo, QualType ty, 1914f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK) 1915f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(MemberExprClass, ty, VK, OK, 1916bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->isTypeDependent(), base->isValueDependent(), 1917bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->containsUnexpandedParameterPack()), 19182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Base(base), MemberDecl(memberdecl), MemberLoc(NameInfo.getLoc()), 19192577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberDNLoc(NameInfo.getInfo()), IsArrow(isarrow), 19202577743c5650c646fb705df01403707e94f2df04Abramo Bagnara HasQualifierOrFoundDecl(false), HasExplicitTemplateArgumentList(false) { 19212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara assert(memberdecl->getDeclName() == NameInfo.getName()); 19222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 19232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 19242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // NOTE: this constructor should be used only when it is known that 19252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // the member name can not provide additional syntactic info 19262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // (i.e., source locations for C++ operator names or type source info 19272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // for constructors, destructors and conversion oeprators). 19282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberExpr(Expr *base, bool isarrow, ValueDecl *memberdecl, 1929f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall SourceLocation l, QualType ty, 1930f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK) 1931f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(MemberExprClass, ty, VK, OK, 1932bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->isTypeDependent(), base->isValueDependent(), 1933bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->containsUnexpandedParameterPack()), 19342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Base(base), MemberDecl(memberdecl), MemberLoc(l), MemberDNLoc(), 19352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara IsArrow(isarrow), 19366bb8017bb9e828d118e15e59d71c66bba323c364John McCall HasQualifierOrFoundDecl(false), HasExplicitTemplateArgumentList(false) {} 1937510190777c4bd53e960eea4665b204778fec1b64Eli Friedman 19381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static MemberExpr *Create(ASTContext &C, Expr *base, bool isarrow, 193983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *qual, SourceRange qualrange, 1940161755a09898c95d21bfff33707da9ca41cd53c5John McCall ValueDecl *memberdecl, DeclAccessPair founddecl, 19412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo MemberNameInfo, 1942d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *targs, 1943f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType ty, ExprValueKind VK, ExprObjectKind OK); 19441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 194588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor void setBase(Expr *E) { Base = E; } 19465549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getBase() const { return cast<Expr>(Base); } 194757e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor 194857e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor /// \brief Retrieve the member declaration to which this expression refers. 194957e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor /// 195057e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor /// The returned declaration will either be a FieldDecl or (in C++) 195157e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor /// a CXXMethodDecl. 1952f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *getMemberDecl() const { return MemberDecl; } 1953f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman void setMemberDecl(ValueDecl *D) { MemberDecl = D; } 19541f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor 19556bb8017bb9e828d118e15e59d71c66bba323c364John McCall /// \brief Retrieves the declaration found by lookup. 1956161755a09898c95d21bfff33707da9ca41cd53c5John McCall DeclAccessPair getFoundDecl() const { 19576bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (!HasQualifierOrFoundDecl) 1958161755a09898c95d21bfff33707da9ca41cd53c5John McCall return DeclAccessPair::make(getMemberDecl(), 1959161755a09898c95d21bfff33707da9ca41cd53c5John McCall getMemberDecl()->getAccess()); 19606bb8017bb9e828d118e15e59d71c66bba323c364John McCall return getMemberQualifier()->FoundDecl; 19616bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 19626bb8017bb9e828d118e15e59d71c66bba323c364John McCall 19631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Determines whether this member expression actually had 19640979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor /// a C++ nested-name-specifier prior to the name of the member, e.g., 19650979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor /// x->Base::foo. 19666bb8017bb9e828d118e15e59d71c66bba323c364John McCall bool hasQualifier() const { return getQualifier() != 0; } 19671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 196883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// \brief If the member name was qualified, retrieves the source range of 196983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// the nested-name-specifier that precedes the member name. Otherwise, 197083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// returns an empty source range. 19711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceRange getQualifierRange() const { 19726bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (!HasQualifierOrFoundDecl) 197383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SourceRange(); 19741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 197583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return getMemberQualifier()->Range; 197683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 19771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief If the member name was qualified, retrieves the 197983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// nested-name-specifier that precedes the member name. Otherwise, returns 198083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// NULL. 19811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *getQualifier() const { 19826bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (!HasQualifierOrFoundDecl) 198383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return 0; 19841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 198583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return getMemberQualifier()->NNS; 198683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 1987c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor 1988c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// \brief Determines whether this member expression actually had a C++ 1989c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// template argument list explicitly specified, e.g., x.f<int>. 1990096832c5ed5b9106fa177ebc148489760c3bc496John McCall bool hasExplicitTemplateArgs() const { 19911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return HasExplicitTemplateArgumentList; 1992c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 19931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1994d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// \brief Copies the template arguments (if present) into the given 1995d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// structure. 1996d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 1997096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (hasExplicitTemplateArgs()) 1998096832c5ed5b9106fa177ebc148489760c3bc496John McCall getExplicitTemplateArgs().copyInto(List); 1999096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 2000096832c5ed5b9106fa177ebc148489760c3bc496John McCall 2001096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieve the explicit template argument list that 2002096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// follow the member template name. This must only be called on an 2003096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// expression with explicit template arguments. 2004096832c5ed5b9106fa177ebc148489760c3bc496John McCall ExplicitTemplateArgumentList &getExplicitTemplateArgs() { 2005096832c5ed5b9106fa177ebc148489760c3bc496John McCall assert(HasExplicitTemplateArgumentList); 2006096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!HasQualifierOrFoundDecl) 2007096832c5ed5b9106fa177ebc148489760c3bc496John McCall return *reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); 2008096832c5ed5b9106fa177ebc148489760c3bc496John McCall 2009096832c5ed5b9106fa177ebc148489760c3bc496John McCall return *reinterpret_cast<ExplicitTemplateArgumentList *>( 2010096832c5ed5b9106fa177ebc148489760c3bc496John McCall getMemberQualifier() + 1); 2011096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 2012096832c5ed5b9106fa177ebc148489760c3bc496John McCall 2013096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieve the explicit template argument list that 2014096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// followed the member template name. This must only be called on 2015096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// an expression with explicit template arguments. 2016096832c5ed5b9106fa177ebc148489760c3bc496John McCall const ExplicitTemplateArgumentList &getExplicitTemplateArgs() const { 2017096832c5ed5b9106fa177ebc148489760c3bc496John McCall return const_cast<MemberExpr *>(this)->getExplicitTemplateArgs(); 2018096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 2019096832c5ed5b9106fa177ebc148489760c3bc496John McCall 2020096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieves the optional explicit template arguments. 2021096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// This points to the same data as getExplicitTemplateArgs(), but 2022096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// returns null if there are no explicit template arguments. 2023096832c5ed5b9106fa177ebc148489760c3bc496John McCall const ExplicitTemplateArgumentList *getOptionalExplicitTemplateArgs() const { 2024096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) return 0; 2025096832c5ed5b9106fa177ebc148489760c3bc496John McCall return &getExplicitTemplateArgs(); 2026d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 2027c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 20281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Retrieve the location of the left angle bracket following the 2029c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// member name ('<'), if any. 20301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation getLAngleLoc() const { 2031c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (!HasExplicitTemplateArgumentList) 2032c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor return SourceLocation(); 20331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2034096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().LAngleLoc; 2035c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 20361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2037c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// \brief Retrieve the template arguments provided as part of this 2038c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// template-id. 2039833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *getTemplateArgs() const { 2040c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (!HasExplicitTemplateArgumentList) 20411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 20421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2043096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().getTemplateArgs(); 2044c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 20451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2046c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// \brief Retrieve the number of template arguments provided as part of this 2047c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// template-id. 20481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned getNumTemplateArgs() const { 2049c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (!HasExplicitTemplateArgumentList) 20501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 20511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2052096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().NumTemplateArgs; 2053c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 20541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Retrieve the location of the right angle bracket following the 2056c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// template arguments ('>'). 20571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation getRAngleLoc() const { 2058c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (!HasExplicitTemplateArgumentList) 2059c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor return SourceLocation(); 20601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2061096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().RAngleLoc; 2062c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 20631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// \brief Retrieve the member declaration name info. 20652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo getMemberNameInfo() const { 20662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(MemberDecl->getDeclName(), 20672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberLoc, MemberDNLoc); 20682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 20692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 20705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isArrow() const { return IsArrow; } 20711f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor void setArrow(bool A) { IsArrow = A; } 20721f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor 2073ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// getMemberLoc - Return the location of the "member", in X->F, it is the 2074ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// location of 'F'. 2075026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner SourceLocation getMemberLoc() const { return MemberLoc; } 20761f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor void setMemberLoc(SourceLocation L) { MemberLoc = L; } 20775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 207863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 207972527137c521ad9330ecb81ccd841159719dc8cdEli Friedman // If we have an implicit base (like a C++ implicit this), 208072527137c521ad9330ecb81ccd841159719dc8cdEli Friedman // make sure not to return its location 20812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceLocation EndLoc = (HasExplicitTemplateArgumentList) 20822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ? getRAngleLoc() : getMemberNameInfo().getEndLoc(); 20831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 208472527137c521ad9330ecb81ccd841159719dc8cdEli Friedman SourceLocation BaseLoc = getBase()->getLocStart(); 208572527137c521ad9330ecb81ccd841159719dc8cdEli Friedman if (BaseLoc.isInvalid()) 2086c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor return SourceRange(MemberLoc, EndLoc); 2087c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor return SourceRange(BaseLoc, EndLoc); 20885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 20891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 209063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceLocation getExprLoc() const { return MemberLoc; } 20915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 20921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 209383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return T->getStmtClass() == MemberExprClass; 20945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 20955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const MemberExpr *) { return true; } 20961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20971237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 209863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Base, &Base+1); } 20994045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 21004045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTReader; 21014045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtWriter; 21025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 21035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 21041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CompoundLiteralExpr - [C99 6.5.2.5] 2105aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff/// 2106aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffclass CompoundLiteralExpr : public Expr { 21070fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner /// LParenLoc - If non-null, this is the location of the left paren in a 21080fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner /// compound literal like "(int){4}". This can be null if this is a 21090fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner /// synthesized compound expression. 21100fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner SourceLocation LParenLoc; 21111d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall 21121d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall /// The type as written. This can be an incomplete array type, in 21131d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall /// which case the actual expression type will be different. 211442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *TInfo; 21155549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *Init; 2116e9b12198c4cc7f5687960100351b4af006c14469Steve Naroff bool FileScope; 2117aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffpublic: 211842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo, 2119f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK, Expr *init, bool fileScope) 2120f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary, 2121bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor tinfo->getType()->isDependentType(), 2122bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor init->isValueDependent(), 2123bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor init->containsUnexpandedParameterPack()), 212442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall LParenLoc(lparenloc), TInfo(tinfo), Init(init), FileScope(fileScope) {} 21251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2126ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor /// \brief Construct an empty compound literal. 2127ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor explicit CompoundLiteralExpr(EmptyShell Empty) 2128ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor : Expr(CompoundLiteralExprClass, Empty) { } 2129ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor 21305549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getInitializer() const { return cast<Expr>(Init); } 21315549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getInitializer() { return cast<Expr>(Init); } 2132ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor void setInitializer(Expr *E) { Init = E; } 2133e9b12198c4cc7f5687960100351b4af006c14469Steve Naroff 2134e9b12198c4cc7f5687960100351b4af006c14469Steve Naroff bool isFileScope() const { return FileScope; } 2135ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor void setFileScope(bool FS) { FileScope = FS; } 2136ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor 21370fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner SourceLocation getLParenLoc() const { return LParenLoc; } 2138ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor void setLParenLoc(SourceLocation L) { LParenLoc = L; } 2139ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor 214042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *getTypeSourceInfo() const { return TInfo; } 214142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall void setTypeSourceInfo(TypeSourceInfo* tinfo) { TInfo = tinfo; } 214242f56b50062cd3b3c6b23fdb9053578ae9145664John McCall 214363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 21440fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner // FIXME: Init should never be null. 21450fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner if (!Init) 21460fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner return SourceRange(); 21470fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner if (LParenLoc.isInvalid()) 214873d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner return Init->getSourceRange(); 21490fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner return SourceRange(LParenLoc, Init->getLocEnd()); 215073d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner } 2151aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff 21521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 21531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == CompoundLiteralExprClass; 2154aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff } 2155aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff static bool classof(const CompoundLiteralExpr *) { return true; } 21561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21571237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 215863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Init, &Init+1); } 2159aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff}; 2160aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff 216149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CastExpr - Base class for type casts, including both implicit 216249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// casts (ImplicitCastExpr) and explicit casts that have some 216349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// representation in the source code (ExplicitCastExpr's derived 216449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// classes). 21650835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisclass CastExpr : public Expr { 2166cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlssonpublic: 21675baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall typedef clang::CastKind CastKind; 21681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2169cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlssonprivate: 21700835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis Stmt *Op; 2171409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson 2172daa8e4e888758d55a7a759dd4a91b83921cef222John McCall void CheckCastConsistency() const { 2173409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson#ifndef NDEBUG 2174409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson switch (getCastKind()) { 21755cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson case CK_DerivedToBase: 2176cee22421929c91b481f4d1bb85cd48c0f6b7510bAnders Carlsson case CK_UncheckedDerivedToBase: 2177cee22421929c91b481f4d1bb85cd48c0f6b7510bAnders Carlsson case CK_DerivedToBaseMemberPointer: 2178409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_BaseToDerived: 2179409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_BaseToDerivedMemberPointer: 2180f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall assert(!path_empty() && "Cast kind should have a base path!"); 2181f9d68e1dd015972318b2448f75115ff4fc3d5008Anders Carlsson break; 2182409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson 2183409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson // These should not have an inheritance path. 2184409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_BitCast: 2185409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_Dynamic: 2186409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_ToUnion: 2187409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_ArrayToPointerDecay: 2188409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_FunctionToPointerDecay: 2189409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_NullToMemberPointer: 2190404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall case CK_NullToPointer: 2191409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_ConstructorConversion: 2192409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_IntegralToPointer: 2193409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_PointerToIntegral: 2194409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_ToVoid: 2195409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_VectorSplat: 2196409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_IntegralCast: 2197409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_IntegralToFloating: 2198409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_FloatingToIntegral: 2199409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_FloatingCast: 2200409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_AnyPointerToObjCPointerCast: 2201409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_AnyPointerToBlockPointerCast: 2202569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case CK_ObjCObjectLValueCast: 22032bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_FloatingRealToComplex: 2204f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_FloatingComplexToReal: 22052bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_FloatingComplexCast: 2206f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_FloatingComplexToIntegralComplex: 22072bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_IntegralRealToComplex: 2208f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_IntegralComplexToReal: 22092bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_IntegralComplexCast: 2210f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_IntegralComplexToFloatingComplex: 2211daa8e4e888758d55a7a759dd4a91b83921cef222John McCall assert(!getType()->isBooleanType() && "unheralded conversion to bool"); 2212daa8e4e888758d55a7a759dd4a91b83921cef222John McCall // fallthrough to check for null base path 2213daa8e4e888758d55a7a759dd4a91b83921cef222John McCall 2214daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_Dependent: 22150ae287a498b8cec2086fe6b7e753cbb3df63e74aJohn McCall case CK_LValueToRValue: 2216f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall case CK_GetObjCProperty: 2217daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_NoOp: 2218daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_PointerToBoolean: 2219daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_IntegralToBoolean: 2220daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_FloatingToBoolean: 2221daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_MemberPointerToBoolean: 2222daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_FloatingComplexToBoolean: 2223daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_IntegralComplexToBoolean: 22245082d34e4107a44ac7f07b62f7a6c917e0e6e71eJohn McCall case CK_LValueBitCast: // -> bool& 22255082d34e4107a44ac7f07b62f7a6c917e0e6e71eJohn McCall case CK_UserDefinedConversion: // operator bool() 2226f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall assert(path_empty() && "Cast kind should not have a base path!"); 2227409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson break; 2228409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson } 2229409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson#endif 2230409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson } 2231409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson 2232f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXBaseSpecifier * const *path_buffer() const { 2233f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return const_cast<CastExpr*>(this)->path_buffer(); 2234f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall } 2235f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXBaseSpecifier **path_buffer(); 2236f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 22370835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisprotected: 2238f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, 2239f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall const CastKind kind, Expr *op, unsigned BasePathSize) : 2240f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr(SC, ty, VK, OK_Ordinary, 2241898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // Cast expressions are type-dependent if the type is 2242898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // dependent (C++ [temp.dep.expr]p3). 2243898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor ty->isDependentType(), 2244898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // Cast expressions are value-dependent if the type is 2245898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // dependent or if the subexpression is value-dependent. 2246bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ty->isDependentType() || (op && op->isValueDependent()), 2247bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (ty->containsUnexpandedParameterPack() || 2248bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor op->containsUnexpandedParameterPack())), 22498e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall Op(op) { 2250daa8e4e888758d55a7a759dd4a91b83921cef222John McCall assert(kind != CK_Invalid && "creating cast with invalid cast kind"); 22518e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall CastExprBits.Kind = kind; 22528e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall CastExprBits.BasePathSize = BasePathSize; 2253daa8e4e888758d55a7a759dd4a91b83921cef222John McCall CheckCastConsistency(); 2254f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall } 22551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2256087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor /// \brief Construct an empty cast. 2257f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize) 22588e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall : Expr(SC, Empty) { 22598e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall CastExprBits.BasePathSize = BasePathSize; 22608e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall } 22611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22620835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidispublic: 22638e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; } 22648e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall void setCastKind(CastKind K) { CastExprBits.Kind = K; } 2265f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson const char *getCastKindName() const; 2266f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson 22670835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis Expr *getSubExpr() { return cast<Expr>(Op); } 22680835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis const Expr *getSubExpr() const { return cast<Expr>(Op); } 2269087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor void setSubExpr(Expr *E) { Op = E; } 2270087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor 22716eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// \brief Retrieve the cast subexpression as it was written in the source 22726eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// code, looking through any implicit casts or other intermediate nodes 22736eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// introduced by semantic analysis. 22746eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor Expr *getSubExprAsWritten(); 22756eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor const Expr *getSubExprAsWritten() const { 22766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return const_cast<CastExpr *>(this)->getSubExprAsWritten(); 22776eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } 227841b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson 2279f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall typedef CXXBaseSpecifier **path_iterator; 2280f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall typedef const CXXBaseSpecifier * const *path_const_iterator; 22818e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall bool path_empty() const { return CastExprBits.BasePathSize == 0; } 22828e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall unsigned path_size() const { return CastExprBits.BasePathSize; } 2283f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall path_iterator path_begin() { return path_buffer(); } 2284f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall path_iterator path_end() { return path_buffer() + path_size(); } 2285f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall path_const_iterator path_begin() const { return path_buffer(); } 2286f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall path_const_iterator path_end() const { return path_buffer() + path_size(); } 2287f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2288f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void setCastPath(const CXXCastPath &Path); 228941b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson 22901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 22914bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt return T->getStmtClass() >= firstCastExprConstant && 22924bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt T->getStmtClass() <= lastCastExprConstant; 22930835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis } 22940835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis static bool classof(const CastExpr *) { return true; } 22951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22960835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis // Iterators 229763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Op, &Op+1); } 22980835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis}; 22990835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis 230049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// ImplicitCastExpr - Allows us to explicitly represent implicit type 230149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// conversions, which have no direct representation in the original 230249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// source code. For example: converting T[]->T*, void f()->void 230349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// (*f)(), float->double, short->int, etc. 230449b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff/// 2305bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// In C, implicit casts always produce rvalues. However, in C++, an 2306bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// implicit cast whose result is being bound to a reference will be 2307906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// an lvalue or xvalue. For example: 2308bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// 2309bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// @code 2310bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// class Base { }; 2311bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// class Derived : public Base { }; 2312906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// Derived &&ref(); 23131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// void f(Derived d) { 2314906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// Base& b = d; // initializer is an ImplicitCastExpr 2315906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// // to an lvalue of type Base 2316906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// Base&& r = ref(); // initializer is an ImplicitCastExpr 2317906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// // to an xvalue of type Base 2318bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// } 2319bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// @endcode 23200835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisclass ImplicitCastExpr : public CastExpr { 2321906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redlprivate: 2322f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall ImplicitCastExpr(QualType ty, CastKind kind, Expr *op, 23235baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall unsigned BasePathLength, ExprValueKind VK) 2324f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength) { 23255baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall } 232690045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff 2327087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor /// \brief Construct an empty implicit cast. 2328f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit ImplicitCastExpr(EmptyShell Shell, unsigned PathSize) 2329f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CastExpr(ImplicitCastExprClass, Shell, PathSize) { } 2330f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2331f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 2332f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall enum OnStack_t { OnStack }; 2333f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall ImplicitCastExpr(OnStack_t _, QualType ty, CastKind kind, Expr *op, 23345baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) 2335f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0) { 23365baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall } 2337f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2338f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall static ImplicitCastExpr *Create(ASTContext &Context, QualType T, 2339f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastKind Kind, Expr *Operand, 2340f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *BasePath, 23415baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind Cat); 2342f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2343f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall static ImplicitCastExpr *CreateEmpty(ASTContext &Context, unsigned PathSize); 2344087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor 234563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 23460835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis return getSubExpr()->getSourceRange(); 23470835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis } 234890045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff 23491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 23501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ImplicitCastExprClass; 235149b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff } 235249b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff static bool classof(const ImplicitCastExpr *) { return true; } 235349b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff}; 235449b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff 235549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// ExplicitCastExpr - An explicit cast written in the source 23561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// code. 235749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// 235849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This class is effectively an abstract class, because it provides 235949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// the basic representation of an explicitly-written cast without 236049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// specifying which kind of cast (C cast, functional cast, static 236149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// cast, etc.) was written; specific derived classes represent the 236249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// particular style of cast and its location information. 23635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 236449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// Unlike implicit casts, explicit cast nodes have two different 236549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// types: the type that was written into the source code, and the 236649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// actual type of the expression as determined by semantic 236749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// analysis. These types may differ slightly. For example, in C++ one 236849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// can cast to a reference type, which indicates that the resulting 2369906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// expression will be an lvalue or xvalue. The reference type, however, 2370906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// will not be used as the type of the expression. 23710835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisclass ExplicitCastExpr : public CastExpr { 23729d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall /// TInfo - Source type info for the (written) type 23739d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall /// this expression is casting to. 23749d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo; 237549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 237649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorprotected: 2377f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExplicitCastExpr(StmtClass SC, QualType exprTy, ExprValueKind VK, 2378f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CastKind kind, Expr *op, unsigned PathSize, 2379f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall TypeSourceInfo *writtenTy) 2380f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CastExpr(SC, exprTy, VK, kind, op, PathSize), TInfo(writtenTy) {} 238149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 2382db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor /// \brief Construct an empty explicit cast. 2383f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall ExplicitCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize) 2384f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CastExpr(SC, Shell, PathSize) { } 2385db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 238649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic: 23879d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall /// getTypeInfoAsWritten - Returns the type source info for the type 23889d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall /// that this expression is casting to. 23899d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; } 23909d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; } 23919d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall 239249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor /// getTypeAsWritten - Returns the type that this expression is 239349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor /// casting to, as written in the source code. 23949d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall QualType getTypeAsWritten() const { return TInfo->getType(); } 239549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 23974bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt return T->getStmtClass() >= firstExplicitCastExprConstant && 23984bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt T->getStmtClass() <= lastExplicitCastExprConstant; 239949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 240049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const ExplicitCastExpr *) { return true; } 240149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 240249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 24036eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor/// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style 240449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// cast in C++ (C++ [expr.cast]), which uses the syntax 240549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// (Type)expr. For example: @c (int)f. 24066eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorclass CStyleCastExpr : public ExplicitCastExpr { 2407b2f9e516327310d95840d442416084508f80c183Steve Naroff SourceLocation LPLoc; // the location of the left paren 2408b2f9e516327310d95840d442416084508f80c183Steve Naroff SourceLocation RPLoc; // the location of the right paren 2409f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2410f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CStyleCastExpr(QualType exprTy, ExprValueKind vk, CastKind kind, Expr *op, 2411f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize, TypeSourceInfo *writtenTy, 241241b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson SourceLocation l, SourceLocation r) 2413f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : ExplicitCastExpr(CStyleCastExprClass, exprTy, vk, kind, op, PathSize, 241441b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson writtenTy), LPLoc(l), RPLoc(r) {} 241549b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff 2416db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor /// \brief Construct an empty C-style explicit cast. 2417f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize) 2418f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize) { } 2419f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2420f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 2421f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall static CStyleCastExpr *Create(ASTContext &Context, QualType T, 2422f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, CastKind K, 2423f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Expr *Op, const CXXCastPath *BasePath, 2424f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall TypeSourceInfo *WrittenTy, SourceLocation L, 2425f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall SourceLocation R); 2426f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2427f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall static CStyleCastExpr *CreateEmpty(ASTContext &Context, unsigned PathSize); 2428db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 2429b2f9e516327310d95840d442416084508f80c183Steve Naroff SourceLocation getLParenLoc() const { return LPLoc; } 2430db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setLParenLoc(SourceLocation L) { LPLoc = L; } 2431db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 2432b2f9e516327310d95840d442416084508f80c183Steve Naroff SourceLocation getRParenLoc() const { return RPLoc; } 2433db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setRParenLoc(SourceLocation L) { RPLoc = L; } 2434db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 243563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 2436b2f9e516327310d95840d442416084508f80c183Steve Naroff return SourceRange(LPLoc, getSubExpr()->getSourceRange().getEnd()); 24375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 24381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 24391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == CStyleCastExprClass; 24405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 24416eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor static bool classof(const CStyleCastExpr *) { return true; } 24425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 24435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 24443fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// \brief A builtin binary operation expression such as "x + y" or "x <= y". 24453fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// 24463fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// This expression node kind describes a builtin binary operation, 24473fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// such as "x + y" for integer values "x" and "y". The operands will 24483fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// already have been converted to appropriate types (e.g., by 24493fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// performing promotions or conversions). 24503fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// 24513fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// In C++, where operators may be overloaded, a different kind of 24523fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// expression node (CXXOperatorCallExpr) is used to express the 24533fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// invocation of an overloaded operator with operator syntax. Within 24543fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is 24553fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// used to store an expression "x + y" depends on the subexpressions 24563fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// for x and y. If neither x or y is type-dependent, and the "+" 24573fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// operator resolves to a built-in operation, BinaryOperator will be 24583fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// used to express the computation (x and y may still be 24593fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// value-dependent). If either x or y is type-dependent, or if the 24603fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// "+" resolves to an overloaded operator, CXXOperatorCallExpr will 24613fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// be used to express the computation. 24625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass BinaryOperator : public Expr { 24635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 24645baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall typedef BinaryOperatorKind Opcode; 24655baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall 246617d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattnerprivate: 24670799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall unsigned Opc : 6; 24680799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall SourceLocation OpLoc; 24690799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall 247017d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner enum { LHS, RHS, END_EXPR }; 24715549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt* SubExprs[END_EXPR]; 24721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 24731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 247417d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 2475f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK, 247617d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner SourceLocation opLoc) 2477f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(BinaryOperatorClass, ResTy, VK, OK, 2478898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor lhs->isTypeDependent() || rhs->isTypeDependent(), 2479bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor lhs->isValueDependent() || rhs->isValueDependent(), 2480bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (lhs->containsUnexpandedParameterPack() || 2481bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor rhs->containsUnexpandedParameterPack())), 2482898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor Opc(opc), OpLoc(opLoc) { 24831237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[LHS] = lhs; 24841237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[RHS] = rhs; 24851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(!isCompoundAssignmentOp() && 24865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer "Use ArithAssignBinaryOperator for compound assignments"); 24875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 24885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2489db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor /// \brief Construct an empty binary operator. 24901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit BinaryOperator(EmptyShell Empty) 24912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall : Expr(BinaryOperatorClass, Empty), Opc(BO_Comma) { } 2492db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 249317d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner SourceLocation getOperatorLoc() const { return OpLoc; } 2494db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setOperatorLoc(SourceLocation L) { OpLoc = L; } 2495db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 24960799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall Opcode getOpcode() const { return static_cast<Opcode>(Opc); } 2497db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setOpcode(Opcode O) { Opc = O; } 2498db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 24995549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 2500db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setLHS(Expr *E) { SubExprs[LHS] = E; } 25015549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 2502db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setRHS(Expr *E) { SubExprs[RHS] = E; } 2503db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 250463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 25055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return SourceRange(getLHS()->getLocStart(), getRHS()->getLocEnd()); 25065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 25071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 25095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// corresponds to, e.g. "<<=". 25105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static const char *getOpcodeStr(Opcode Op); 25115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 25120799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall const char *getOpcodeStr() const { return getOpcodeStr(getOpcode()); } 2513a84c02d0f4d63975a1c52b9bb8308d88e9d79352Ted Kremenek 2514063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /// \brief Retrieve the binary opcode that corresponds to the given 2515063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /// overloaded operator. 2516063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor static Opcode getOverloadedOpcode(OverloadedOperatorKind OO); 2517063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor 2518063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /// \brief Retrieve the overloaded operator kind that corresponds to 2519063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /// the given binary opcode. 2520063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); 2521063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor 25225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// predicates to categorize the respective opcodes. 2523200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl bool isPtrMemOp() const { return Opc == BO_PtrMemD || Opc == BO_PtrMemI; } 25242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall bool isMultiplicativeOp() const { return Opc >= BO_Mul && Opc <= BO_Rem; } 25252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isAdditiveOp(Opcode Opc) { return Opc == BO_Add || Opc==BO_Sub; } 25260799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isAdditiveOp() const { return isAdditiveOp(getOpcode()); } 25272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isShiftOp(Opcode Opc) { return Opc == BO_Shl || Opc == BO_Shr; } 25280799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isShiftOp() const { return isShiftOp(getOpcode()); } 2529aee3c9375f97a49edef2a36f15df6abd9748e2a1Sebastian Redl 25302de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isBitwiseOp(Opcode Opc) { return Opc >= BO_And && Opc <= BO_Or; } 25310799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isBitwiseOp() const { return isBitwiseOp(getOpcode()); } 2532f2da7a06f6b98c3886d9b871ab839f5085b1c238Ted Kremenek 25332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isRelationalOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_GE; } 25340799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isRelationalOp() const { return isRelationalOp(getOpcode()); } 2535f2da7a06f6b98c3886d9b871ab839f5085b1c238Ted Kremenek 25362de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isEqualityOp(Opcode Opc) { return Opc == BO_EQ || Opc == BO_NE; } 25370799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isEqualityOp() const { return isEqualityOp(getOpcode()); } 25381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25392de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isComparisonOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_NE; } 25400799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isComparisonOp() const { return isComparisonOp(getOpcode()); } 2541aee3c9375f97a49edef2a36f15df6abd9748e2a1Sebastian Redl 25422de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isLogicalOp(Opcode Opc) { return Opc == BO_LAnd || Opc==BO_LOr; } 25430799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isLogicalOp() const { return isLogicalOp(getOpcode()); } 2544f2da7a06f6b98c3886d9b871ab839f5085b1c238Ted Kremenek 25450e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall static bool isAssignmentOp(Opcode Opc) { 25460e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall return Opc >= BO_Assign && Opc <= BO_OrAssign; 25470e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall } 25480e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall bool isAssignmentOp() const { return isAssignmentOp(getOpcode()); } 25490e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall 25500e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall static bool isCompoundAssignmentOp(Opcode Opc) { 25512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall return Opc > BO_Assign && Opc <= BO_OrAssign; 25522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall } 25530e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall bool isCompoundAssignmentOp() const { 25540e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall return isCompoundAssignmentOp(getOpcode()); 25550e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall } 25560e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall 25570e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall static bool isShiftAssignOp(Opcode Opc) { 25582de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall return Opc == BO_ShlAssign || Opc == BO_ShrAssign; 25592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall } 25600e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall bool isShiftAssignOp() const { 25610e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall return isShiftAssignOp(getOpcode()); 25620e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall } 25631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *S) { 25654bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt return S->getStmtClass() >= firstBinaryOperatorConstant && 25664bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt S->getStmtClass() <= lastBinaryOperatorConstant; 25675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 25685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const BinaryOperator *) { return true; } 25691237c673c07f9d827129ba02720108816abde562Ted Kremenek 25701237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 257163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 257263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 257363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 25741237c673c07f9d827129ba02720108816abde562Ted Kremenek 25755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprotected: 257617d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 2577f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK, 25782333f7727f97018d6742e1e0938133bcfad967abEli Friedman SourceLocation opLoc, bool dead) 2579f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CompoundAssignOperatorClass, ResTy, VK, OK, 25802333f7727f97018d6742e1e0938133bcfad967abEli Friedman lhs->isTypeDependent() || rhs->isTypeDependent(), 2581bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor lhs->isValueDependent() || rhs->isValueDependent(), 2582bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (lhs->containsUnexpandedParameterPack() || 2583bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor rhs->containsUnexpandedParameterPack())), 25842333f7727f97018d6742e1e0938133bcfad967abEli Friedman Opc(opc), OpLoc(opLoc) { 25851237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[LHS] = lhs; 25861237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[RHS] = rhs; 25875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2588ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor 25891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator(StmtClass SC, EmptyShell Empty) 25902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall : Expr(SC, Empty), Opc(BO_MulAssign) { } 25915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 25925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 25935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CompoundAssignOperator - For compound assignments (e.g. +=), we keep 25945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// track of the type the operation is performed in. Due to the semantics of 25955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// these operators, the operands are promoted, the aritmetic performed, an 25965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// implicit conversion back to the result type done, then the assignment takes 25975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// place. This captures the intermediate type which the computation is done 25985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// in. 25995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CompoundAssignOperator : public BinaryOperator { 2600ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman QualType ComputationLHSType; 2601ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman QualType ComputationResultType; 26025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 2603f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CompoundAssignOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResType, 2604f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK, 2605f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType CompLHSType, QualType CompResultType, 260617d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner SourceLocation OpLoc) 2607f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : BinaryOperator(lhs, rhs, opc, ResType, VK, OK, OpLoc, true), 2608ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman ComputationLHSType(CompLHSType), 2609ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman ComputationResultType(CompResultType) { 26101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(isCompoundAssignmentOp() && 26115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer "Only should be used for compound assignments"); 26125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 26135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2614ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor /// \brief Build an empty compound assignment operator expression. 2615ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor explicit CompoundAssignOperator(EmptyShell Empty) 2616ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor : BinaryOperator(CompoundAssignOperatorClass, Empty) { } 2617ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor 2618ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman // The two computation types are the type the LHS is converted 2619ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman // to for the computation and the type of the result; the two are 2620ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman // distinct in a few cases (specifically, int+=ptr and ptr-=ptr). 2621ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman QualType getComputationLHSType() const { return ComputationLHSType; } 2622ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor void setComputationLHSType(QualType T) { ComputationLHSType = T; } 2623ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor 2624ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman QualType getComputationResultType() const { return ComputationResultType; } 2625ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor void setComputationResultType(QualType T) { ComputationResultType = T; } 2626ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor 26275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const CompoundAssignOperator *) { return true; } 26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *S) { 26291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return S->getStmtClass() == CompoundAssignOperatorClass; 26305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 26315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 26325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 263356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// AbstractConditionalOperator - An abstract base class for 263456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// ConditionalOperator and BinaryConditionalOperator. 263556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass AbstractConditionalOperator : public Expr { 263656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation QuestionLoc, ColonLoc; 263756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall friend class ASTStmtReader; 263856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 263956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallprotected: 264056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall AbstractConditionalOperator(StmtClass SC, QualType T, 264156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprValueKind VK, ExprObjectKind OK, 264256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall bool TD, bool VD, 264356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall bool ContainsUnexpandedParameterPack, 264456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation qloc, 264556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation cloc) 264656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : Expr(SC, T, VK, OK, TD, VD, ContainsUnexpandedParameterPack), 264756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall QuestionLoc(qloc), ColonLoc(cloc) {} 264856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 264956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall AbstractConditionalOperator(StmtClass SC, EmptyShell Empty) 265056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : Expr(SC, Empty) { } 265156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 265256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic: 265356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // getCond - Return the expression representing the condition for 265456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the ?: operator. 265556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getCond() const; 265656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 265756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // getTrueExpr - Return the subexpression representing the value of 265856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the expression if the condition evaluates to true. 265956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getTrueExpr() const; 266056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 266156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // getFalseExpr - Return the subexpression representing the value of 266256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the expression if the condition evaluates to false. This is 266356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the same as getRHS. 266456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getFalseExpr() const; 266556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 266656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation getQuestionLoc() const { return QuestionLoc; } 266756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation getColonLoc() const { return ColonLoc; } 266856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 266956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const Stmt *T) { 267056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return T->getStmtClass() == ConditionalOperatorClass || 267156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall T->getStmtClass() == BinaryConditionalOperatorClass; 267256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 267356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const AbstractConditionalOperator *) { return true; } 267456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}; 267556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 267656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// ConditionalOperator - The ?: ternary operator. The GNU "missing 267756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// middle" extension is a BinaryConditionalOperator. 267856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass ConditionalOperator : public AbstractConditionalOperator { 26791237c673c07f9d827129ba02720108816abde562Ted Kremenek enum { COND, LHS, RHS, END_EXPR }; 26805549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 268156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 268256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall friend class ASTStmtReader; 26835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 268447e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs, 268556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation CLoc, Expr *rhs, 26860943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall QualType t, ExprValueKind VK, ExprObjectKind OK) 268756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK, 2688898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // FIXME: the type of the conditional operator doesn't 2689898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // depend on the type of the conditional, but the standard 2690898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // seems to imply that it could. File a bug! 269156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall (lhs->isTypeDependent() || rhs->isTypeDependent()), 269256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall (cond->isValueDependent() || lhs->isValueDependent() || 269356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs->isValueDependent()), 2694bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (cond->containsUnexpandedParameterPack() || 269556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall lhs->containsUnexpandedParameterPack() || 269656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs->containsUnexpandedParameterPack()), 269756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall QLoc, CLoc) { 26981237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[COND] = cond; 26991237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[LHS] = lhs; 27001237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[RHS] = rhs; 27011237c673c07f9d827129ba02720108816abde562Ted Kremenek } 27025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2703ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor /// \brief Build an empty conditional operator. 2704ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor explicit ConditionalOperator(EmptyShell Empty) 270556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { } 2706ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor 2707395a2abf0028968d85958610e393e067885dc14fTed Kremenek // getCond - Return the expression representing the condition for 270856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the ?: operator. 27095549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 2710395a2abf0028968d85958610e393e067885dc14fTed Kremenek 271156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // getTrueExpr - Return the subexpression representing the value of 271256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the expression if the condition evaluates to true. 271356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getTrueExpr() const { return cast<Expr>(SubExprs[LHS]); } 27141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 271556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // getFalseExpr - Return the subexpression representing the value of 271656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the expression if the condition evaluates to false. This is 271756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the same as getRHS. 27185549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); } 2719f9b949fecf339a2c9bd97dd11a272c4878f85ce4Fariborz Jahanian 272056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 27215549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 272247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor 272363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 27245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return SourceRange(getCond()->getLocStart(), getRHS()->getLocEnd()); 27255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 27261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 27271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ConditionalOperatorClass; 27285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 27295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const ConditionalOperator *) { return true; } 27301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27311237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 273263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 273363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 273463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 27355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 27365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 273756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// BinaryConditionalOperator - The GNU extension to the conditional 273856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// operator which allows the middle operand to be omitted. 273956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// 274056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// This is a different expression kind on the assumption that almost 274156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// every client ends up needing to know that these are different. 274256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass BinaryConditionalOperator : public AbstractConditionalOperator { 274356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall enum { COMMON, COND, LHS, RHS, NUM_SUBEXPRS }; 274456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 274556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// - the common condition/left-hand-side expression, which will be 274656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// evaluated as the opaque value 274756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// - the condition, expressed in terms of the opaque value 274856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// - the left-hand-side, expressed in terms of the opaque value 274956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// - the right-hand-side 275056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Stmt *SubExprs[NUM_SUBEXPRS]; 275156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueExpr *OpaqueValue; 275256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 275356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall friend class ASTStmtReader; 275456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic: 275556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall BinaryConditionalOperator(Expr *common, OpaqueValueExpr *opaqueValue, 275656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *cond, Expr *lhs, Expr *rhs, 275756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation qloc, SourceLocation cloc, 275856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall QualType t, ExprValueKind VK, ExprObjectKind OK) 275956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK, 276056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall (common->isTypeDependent() || rhs->isTypeDependent()), 276156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall (common->isValueDependent() || rhs->isValueDependent()), 276256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall (common->containsUnexpandedParameterPack() || 276356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs->containsUnexpandedParameterPack()), 276456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall qloc, cloc), 276556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValue(opaqueValue) { 276656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SubExprs[COMMON] = common; 276756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SubExprs[COND] = cond; 276856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SubExprs[LHS] = lhs; 276956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SubExprs[RHS] = rhs; 277056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 277156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValue->setSourceExpr(common); 277256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 277356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 277456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief Build an empty conditional operator. 277556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall explicit BinaryConditionalOperator(EmptyShell Empty) 277656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : AbstractConditionalOperator(BinaryConditionalOperatorClass, Empty) { } 277756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 277856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief getCommon - Return the common expression, written to the 277956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// left of the condition. The opaque value will be bound to the 278056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// result of this expression. 278156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getCommon() const { return cast<Expr>(SubExprs[COMMON]); } 278256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 278356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief getOpaqueValue - Return the opaque value placeholder. 278456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; } 278556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 278656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief getCond - Return the condition expression; this is defined 278756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// in terms of the opaque value. 278856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 278956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 279056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief getTrueExpr - Return the subexpression which will be 279156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// evaluated if the condition evaluates to true; this is defined 279256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// in terms of the opaque value. 279356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getTrueExpr() const { 279456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return cast<Expr>(SubExprs[LHS]); 279556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 279656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 279756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief getFalseExpr - Return the subexpression which will be 279856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// evaluated if the condnition evaluates to false; this is 279956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// defined in terms of the opaque value. 280056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getFalseExpr() const { 280156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return cast<Expr>(SubExprs[RHS]); 280256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 280356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 280456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceRange getSourceRange() const { 280556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return SourceRange(getCommon()->getLocStart(), getFalseExpr()->getLocEnd()); 280656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 280756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const Stmt *T) { 280856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return T->getStmtClass() == BinaryConditionalOperatorClass; 280956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 281056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const BinaryConditionalOperator *) { return true; } 281156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 281256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // Iterators 281356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall child_range children() { 281456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return child_range(SubExprs, SubExprs + NUM_SUBEXPRS); 281556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 281656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}; 281756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 281856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallinline Expr *AbstractConditionalOperator::getCond() const { 281956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 282056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return co->getCond(); 282156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return cast<BinaryConditionalOperator>(this)->getCond(); 282256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 282356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 282456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallinline Expr *AbstractConditionalOperator::getTrueExpr() const { 282556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 282656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return co->getTrueExpr(); 282756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return cast<BinaryConditionalOperator>(this)->getTrueExpr(); 282856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 282956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 283056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallinline Expr *AbstractConditionalOperator::getFalseExpr() const { 283156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 283256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return co->getFalseExpr(); 283356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return cast<BinaryConditionalOperator>(this)->getFalseExpr(); 283456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 283556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 28366481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner/// AddrLabelExpr - The GNU address of label extension, representing &&label. 28376481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnerclass AddrLabelExpr : public Expr { 28385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation AmpAmpLoc, LabelLoc; 2839ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner LabelDecl *Label; 28405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 2841ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelDecl *L, 28426481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner QualType t) 2843bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(AddrLabelExprClass, t, VK_RValue, OK_Ordinary, false, false, false), 28442333f7727f97018d6742e1e0938133bcfad967abEli Friedman AmpAmpLoc(AALoc), LabelLoc(LLoc), Label(L) {} 28451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28467d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor /// \brief Build an empty address of a label expression. 28471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit AddrLabelExpr(EmptyShell Empty) 28487d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor : Expr(AddrLabelExprClass, Empty) { } 28497d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor 28507d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; } 28517d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; } 28527d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor SourceLocation getLabelLoc() const { return LabelLoc; } 28537d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor void setLabelLoc(SourceLocation L) { LabelLoc = L; } 28547d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor 285563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 28565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return SourceRange(AmpAmpLoc, LabelLoc); 28575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 28581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2859ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner LabelDecl *getLabel() const { return Label; } 2860ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner void setLabel(LabelDecl *L) { Label = L; } 28617d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor 28625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const Stmt *T) { 28631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == AddrLabelExprClass; 28645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 28656481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner static bool classof(const AddrLabelExpr *) { return true; } 28661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28671237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 286863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 28695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 2870ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 2871ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner/// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}). 2872ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner/// The StmtExpr contains a single CompoundStmt node, which it evaluates and 2873ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner/// takes the value of the last subexpression. 2874f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall/// 2875f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall/// A StmtExpr is always an r-value; values "returned" out of a 2876f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall/// StmtExpr will be copied. 2877ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnerclass StmtExpr : public Expr { 28785549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *SubStmt; 2879ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner SourceLocation LParenLoc, RParenLoc; 2880ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnerpublic: 28812333f7727f97018d6742e1e0938133bcfad967abEli Friedman // FIXME: Does type-dependence need to be computed differently? 2882d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff StmtExpr(CompoundStmt *substmt, QualType T, 2883d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff SourceLocation lp, SourceLocation rp) : 2884f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr(StmtExprClass, T, VK_RValue, OK_Ordinary, 2885bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor T->isDependentType(), false, false), 28862333f7727f97018d6742e1e0938133bcfad967abEli Friedman SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) { } 28871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28886a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor /// \brief Build an empty statement expression. 28896a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { } 28906a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor 28915549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); } 28925549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); } 28936a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor void setSubStmt(CompoundStmt *S) { SubStmt = S; } 28946a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor 289563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 2896ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner return SourceRange(LParenLoc, RParenLoc); 2897ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner } 28981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2899026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner SourceLocation getLParenLoc() const { return LParenLoc; } 29006a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor void setLParenLoc(SourceLocation L) { LParenLoc = L; } 2901026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner SourceLocation getRParenLoc() const { return RParenLoc; } 29026a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 29031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2904ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner static bool classof(const Stmt *T) { 29051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == StmtExprClass; 2906ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner } 2907ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner static bool classof(const StmtExpr *) { return true; } 29081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29091237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 291063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&SubStmt, &SubStmt+1); } 2911ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner}; 2912ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 2913d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff 2914d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// ShuffleVectorExpr - clang-specific builtin-in function 2915d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// __builtin_shufflevector. 2916d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// This AST node represents a operator that does a constant 2917d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// shuffle, similar to LLVM's shufflevector instruction. It takes 2918d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// two vectors and a variable number of constant indices, 2919d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// and returns the appropriately shuffled vector. 2920d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanclass ShuffleVectorExpr : public Expr { 2921d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman SourceLocation BuiltinLoc, RParenLoc; 2922d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman 2923d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman // SubExprs - the list of values passed to the __builtin_shufflevector 2924d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman // function. The first two are vectors, and the rest are constant 2925d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman // indices. The number of values in this list is always 2926d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman // 2+the number of indices in the vector type. 29275549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt **SubExprs; 2928d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman unsigned NumExprs; 2929d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman 2930d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanpublic: 2931a88dc3079bedf70a5cfc39791727e43a10383006Nate Begeman ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr, 29321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Type, SourceLocation BLoc, 2933bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SourceLocation RP); 293494cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 293594cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor /// \brief Build an empty vector-shuffle expression. 29361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit ShuffleVectorExpr(EmptyShell Empty) 293794cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor : Expr(ShuffleVectorExprClass, Empty), SubExprs(0) { } 293894cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 293994cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 294094cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 29411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 294294cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 294394cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 294494cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 294563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 2946d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman return SourceRange(BuiltinLoc, RParenLoc); 2947d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 2948d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman static bool classof(const Stmt *T) { 29491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ShuffleVectorExprClass; 2950d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 2951d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman static bool classof(const ShuffleVectorExpr *) { return true; } 29521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2953d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman /// getNumSubExprs - Return the size of the SubExprs array. This includes the 2954d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman /// constant expression, the actual arguments passed in, and the function 2955d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman /// pointers. 2956d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman unsigned getNumSubExprs() const { return NumExprs; } 29571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2958aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \brief Retrieve the array of expressions. 2959aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); } 2960aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 2961d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman /// getExpr - Return the Expr at the specified index. 2962d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman Expr *getExpr(unsigned Index) { 2963d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman assert((Index < NumExprs) && "Arg access out of range!"); 29645549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(SubExprs[Index]); 2965d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 2966d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman const Expr *getExpr(unsigned Index) const { 2967d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman assert((Index < NumExprs) && "Arg access out of range!"); 29685549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(SubExprs[Index]); 2969d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 29701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2971888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman void setExprs(ASTContext &C, Expr ** Exprs, unsigned NumExprs); 297294cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 2973dde8c94873976632e3ada4d8d067e1e244184d51Eli Friedman unsigned getShuffleMaskIdx(ASTContext &Ctx, unsigned N) { 2974dde8c94873976632e3ada4d8d067e1e244184d51Eli Friedman assert((N < NumExprs - 2) && "Shuffle idx out of range!"); 29759a901bb63990574ff0bcc12ff851d7a71cff8ddbEli Friedman return getExpr(N+2)->EvaluateAsInt(Ctx).getZExtValue(); 2976d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 29771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2978d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman // Iterators 297963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 298063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], &SubExprs[0]+NumExprs); 298163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 2982d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman}; 2983d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman 2984d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff/// ChooseExpr - GNU builtin-in function __builtin_choose_expr. 29851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// This AST node is similar to the conditional operator (?:) in C, with 2986d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff/// the following exceptions: 29877976932a1c256d447316ffac58e9821417725e34Eli Friedman/// - the test expression must be a integer constant expression. 29887976932a1c256d447316ffac58e9821417725e34Eli Friedman/// - the expression returned acts like the chosen subexpression in every 29897976932a1c256d447316ffac58e9821417725e34Eli Friedman/// visible way: the type is the same as that of the chosen subexpression, 29907976932a1c256d447316ffac58e9821417725e34Eli Friedman/// and all predicates (whether it's an l-value, whether it's an integer 29917976932a1c256d447316ffac58e9821417725e34Eli Friedman/// constant expression, etc.) return the same result as for the chosen 29927976932a1c256d447316ffac58e9821417725e34Eli Friedman/// sub-expression. 2993d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffclass ChooseExpr : public Expr { 29941237c673c07f9d827129ba02720108816abde562Ted Kremenek enum { COND, LHS, RHS, END_EXPR }; 29955549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 2996d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff SourceLocation BuiltinLoc, RParenLoc; 2997d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffpublic: 2998f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, 2999f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType t, ExprValueKind VK, ExprObjectKind OK, 3000ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor SourceLocation RP, bool TypeDependent, bool ValueDependent) 3001bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(ChooseExprClass, t, VK, OK, TypeDependent, ValueDependent, 3002bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (cond->containsUnexpandedParameterPack() || 3003bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor lhs->containsUnexpandedParameterPack() || 3004bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor rhs->containsUnexpandedParameterPack())), 30051237c673c07f9d827129ba02720108816abde562Ted Kremenek BuiltinLoc(BLoc), RParenLoc(RP) { 30061237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[COND] = cond; 30071237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[LHS] = lhs; 30081237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[RHS] = rhs; 30091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 30107976932a1c256d447316ffac58e9821417725e34Eli Friedman 301144cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor /// \brief Build an empty __builtin_choose_expr. 301244cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { } 301344cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor 30147976932a1c256d447316ffac58e9821417725e34Eli Friedman /// isConditionTrue - Return whether the condition is true (i.e. not 30157976932a1c256d447316ffac58e9821417725e34Eli Friedman /// equal to zero). 30164ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool isConditionTrue(const ASTContext &C) const; 30177976932a1c256d447316ffac58e9821417725e34Eli Friedman 30187976932a1c256d447316ffac58e9821417725e34Eli Friedman /// getChosenSubExpr - Return the subexpression chosen according to the 30197976932a1c256d447316ffac58e9821417725e34Eli Friedman /// condition. 30204ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad Expr *getChosenSubExpr(const ASTContext &C) const { 30217976932a1c256d447316ffac58e9821417725e34Eli Friedman return isConditionTrue(C) ? getLHS() : getRHS(); 30227976932a1c256d447316ffac58e9821417725e34Eli Friedman } 30237976932a1c256d447316ffac58e9821417725e34Eli Friedman 30245549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 302544cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setCond(Expr *E) { SubExprs[COND] = E; } 30265549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 302744cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setLHS(Expr *E) { SubExprs[LHS] = E; } 30285549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 302944cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setRHS(Expr *E) { SubExprs[RHS] = E; } 303044cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor 303144cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 303244cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 30331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 303444cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 303544cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 30361237c673c07f9d827129ba02720108816abde562Ted Kremenek 303763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 3038d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff return SourceRange(BuiltinLoc, RParenLoc); 3039d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff } 3040d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff static bool classof(const Stmt *T) { 30411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ChooseExprClass; 3042d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff } 3043d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff static bool classof(const ChooseExpr *) { return true; } 30441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30451237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 304663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 304763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 304863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 3049d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff}; 3050d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff 30512d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// GNUNullExpr - Implements the GNU __null extension, which is a name 30522d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// for a null pointer constant that has integral type (e.g., int or 30532d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// long) and is the same size and alignment as a pointer. The __null 30542d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// extension is typically only used by system headers, which define 30552d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// NULL as __null in C++ rather than using 0 (which is an integer 30562d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// that may not match the size of a pointer). 30572d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorclass GNUNullExpr : public Expr { 30582d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor /// TokenLoc - The location of the __null keyword. 30592d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor SourceLocation TokenLoc; 30602d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 30612d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorpublic: 30621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump GNUNullExpr(QualType Ty, SourceLocation Loc) 3063bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(GNUNullExprClass, Ty, VK_RValue, OK_Ordinary, false, false, false), 3064f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall TokenLoc(Loc) { } 30652d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 306644cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor /// \brief Build an empty GNU __null expression. 306744cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor explicit GNUNullExpr(EmptyShell Empty) : Expr(GNUNullExprClass, Empty) { } 306844cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor 30692d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor /// getTokenLocation - The location of the __null token. 30702d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor SourceLocation getTokenLocation() const { return TokenLoc; } 307144cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setTokenLocation(SourceLocation L) { TokenLoc = L; } 30722d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 307363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 30742d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor return SourceRange(TokenLoc); 30752d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor } 30762d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor static bool classof(const Stmt *T) { 30771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == GNUNullExprClass; 30782d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor } 30792d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor static bool classof(const GNUNullExpr *) { return true; } 30801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30812d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor // Iterators 308263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 30832d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor}; 30842d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 308574626d6ef2e194fcc911e071556660ff331eb4a8Zhongxing Xu/// VAArgExpr, used for the builtin function __builtin_va_arg. 30867c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonclass VAArgExpr : public Expr { 30875549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *Val; 30882cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara TypeSourceInfo *TInfo; 30897c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson SourceLocation BuiltinLoc, RParenLoc; 30907c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonpublic: 30912cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara VAArgExpr(SourceLocation BLoc, Expr* e, TypeSourceInfo *TInfo, 30922cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara SourceLocation RPLoc, QualType t) 3093f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(VAArgExprClass, t, VK_RValue, OK_Ordinary, 3094bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor t->isDependentType(), false, 3095bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (TInfo->getType()->containsUnexpandedParameterPack() || 3096bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor e->containsUnexpandedParameterPack())), 30972cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara Val(e), TInfo(TInfo), 30987c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson BuiltinLoc(BLoc), 30997c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson RParenLoc(RPLoc) { } 31001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310174626d6ef2e194fcc911e071556660ff331eb4a8Zhongxing Xu /// \brief Create an empty __builtin_va_arg expression. 3102d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor explicit VAArgExpr(EmptyShell Empty) : Expr(VAArgExprClass, Empty) { } 3103d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 31045549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getSubExpr() const { return cast<Expr>(Val); } 31055549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getSubExpr() { return cast<Expr>(Val); } 3106d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setSubExpr(Expr *E) { Val = E; } 3107d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 31082cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara TypeSourceInfo *getWrittenTypeInfo() const { return TInfo; } 31092cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara void setWrittenTypeInfo(TypeSourceInfo *TI) { TInfo = TI; } 31102cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara 3111d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 3112d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 31131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3114d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 3115d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 3116d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 311763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 31187c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson return SourceRange(BuiltinLoc, RParenLoc); 31191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 31207c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson static bool classof(const Stmt *T) { 31217c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson return T->getStmtClass() == VAArgExprClass; 31227c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson } 31237c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson static bool classof(const VAArgExpr *) { return true; } 31241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31257c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson // Iterators 312663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Val, &Val+1); } 31277c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson}; 31281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @brief Describes an C or C++ initializer list. 31304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 31314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// InitListExpr describes an initializer list, which can be used to 31324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initialize objects of different types, including 31334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// struct/class/union types, arrays, and vectors. For example: 31344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 31354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @code 31364c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// struct foo x = { 1, { 2, 3 } }; 31374c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @endcode 3138196ef51bc4d008ec1c69851fb3b0f8d036065931Chris Lattner/// 31394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Prior to semantic analysis, an initializer list will represent the 31404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializer list as written by the user, but will have the 31414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// placeholder type "void". This initializer list is called the 31424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// syntactic form of the initializer, and may contain C99 designated 31434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializers (represented as DesignatedInitExprs), initializations 31444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// of subobject members without explicit braces, and so on. Clients 31454c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// interested in the original syntax of the initializer list should 31464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// use the syntactic form of the initializer list. 3147196ef51bc4d008ec1c69851fb3b0f8d036065931Chris Lattner/// 31484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// After semantic analysis, the initializer list will represent the 31494c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// semantic form of the initializer, where the initializations of all 31504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// subobjects are made explicit with nested InitListExpr nodes and 31514c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// C99 designators have been eliminated by placing the designated 31524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializations into the subobject they initialize. Additionally, 31534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// any "holes" in the initialization, where no initializer has been 31544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// specified for a particular subobject, will be replaced with 31553498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// implicitly-generated ImplicitValueInitExpr expressions that 31564c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// value-initialize the subobjects. Note, however, that the 31574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializer lists may still have fewer initializers than there are 31584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// elements to initialize within the object. 3159196ef51bc4d008ec1c69851fb3b0f8d036065931Chris Lattner/// 31604c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Given the semantic form of the initializer list, one can retrieve 31614c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// the original syntactic form of that initializer list (if it 31624c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// exists) using getSyntacticForm(). Since many initializer lists 31634c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// have the same syntactic and semantic forms, getSyntacticForm() may 31644c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// return NULL, indicating that the current initializer list also 31654c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// serves as its syntactic form. 316666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonclass InitListExpr : public Expr { 3167ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek // FIXME: Eliminate this vector in favor of ASTContext allocation 3168709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek typedef ASTVector<Stmt *> InitExprsTy; 3169709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitExprsTy InitExprs; 317066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson SourceLocation LBraceLoc, RBraceLoc; 31711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// Contains the initializer list that describes the syntactic form 31734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// written in the source code. 31744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *SyntacticForm; 31754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 31760bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// If this initializer list initializes a union, specifies which 31770bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// field within the union will be initialized. 31780bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor FieldDecl *UnionFieldInit; 31790bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 3180a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor /// Whether this initializer list originally had a GNU array-range 3181a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor /// designator in it. This is a temporary marker used by CodeGen. 3182a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor bool HadArrayRangeDesignator; 3183a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor 318466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonpublic: 3185709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitListExpr(ASTContext &C, SourceLocation lbraceloc, 3186709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Expr **initexprs, unsigned numinits, 3187ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek SourceLocation rbraceloc); 3188d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 3189d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// \brief Build an empty initializer list. 3190709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek explicit InitListExpr(ASTContext &C, EmptyShell Empty) 3191709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek : Expr(InitListExprClass, Empty), InitExprs(C) { } 31921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3193ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek unsigned getNumInits() const { return InitExprs.size(); } 31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3195aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \brief Retrieve the set of initializers. 3196aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Expr **getInits() { return reinterpret_cast<Expr **>(InitExprs.data()); } 3197aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 319816c5dea6c2d3e4cf529de9d9b37f6a40441acb2cChris Lattner const Expr *getInit(unsigned Init) const { 3199c5ae899b4bbf65488445316c63168079177db0edSteve Naroff assert(Init < getNumInits() && "Initializer access out of range!"); 32004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return cast_or_null<Expr>(InitExprs[Init]); 320166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson } 32021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 320316c5dea6c2d3e4cf529de9d9b37f6a40441acb2cChris Lattner Expr *getInit(unsigned Init) { 3204c5ae899b4bbf65488445316c63168079177db0edSteve Naroff assert(Init < getNumInits() && "Initializer access out of range!"); 32054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return cast_or_null<Expr>(InitExprs[Init]); 320666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson } 32071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void setInit(unsigned Init, Expr *expr) { 3209c5ae899b4bbf65488445316c63168079177db0edSteve Naroff assert(Init < getNumInits() && "Initializer access out of range!"); 32109e8925e72f53a9e2c4633b6b48e965ed01702fe4Steve Naroff InitExprs[Init] = expr; 32119e8925e72f53a9e2c4633b6b48e965ed01702fe4Steve Naroff } 3212c5ae899b4bbf65488445316c63168079177db0edSteve Naroff 3213fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor /// \brief Reserve space for some number of initializers. 3214709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek void reserveInits(ASTContext &C, unsigned NumInits); 32151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// @brief Specify the number of initializers 32174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// 32184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// If there are more than @p NumInits initializers, the remaining 32194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// initializers will be destroyed. If there are fewer than @p 32204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// NumInits initializers, NULL expressions will be added for the 32214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// unknown initializers. 32224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor void resizeInits(ASTContext &Context, unsigned NumInits); 32234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 32244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// @brief Updates the initializer at index @p Init with the new 32254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// expression @p expr, and returns the old expression at that 32264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// location. 32274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// 32284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// When @p Init is out of range for this initializer list, the 32294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// initializer list will be extended with NULL expressions to 32304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// accomodate the new entry. 3231709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Expr *updateInit(ASTContext &C, unsigned Init, Expr *expr); 3232c5ae899b4bbf65488445316c63168079177db0edSteve Naroff 32330bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// \brief If this initializes a union, specifies which field in the 32340bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// union to initialize. 32350bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// 32360bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// Typically, this field is the first named field within the 32370bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// union. However, a designated initializer can specify the 32380bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// initialization of a different field within the union. 32390bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor FieldDecl *getInitializedFieldInUnion() { return UnionFieldInit; } 32400bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor void setInitializedFieldInUnion(FieldDecl *FD) { UnionFieldInit = FD; } 32410bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 3242c5ae899b4bbf65488445316c63168079177db0edSteve Naroff // Explicit InitListExpr's originate from source code (and have valid source 3243c5ae899b4bbf65488445316c63168079177db0edSteve Naroff // locations). Implicit InitListExpr's are created by the semantic analyzer. 3244b3eef68111ffc220e449be96da1747998c057790Douglas Gregor bool isExplicit() { 3245b3eef68111ffc220e449be96da1747998c057790Douglas Gregor return LBraceLoc.isValid() && RBraceLoc.isValid(); 3246b3eef68111ffc220e449be96da1747998c057790Douglas Gregor } 32471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3248d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor SourceLocation getLBraceLoc() const { return LBraceLoc; } 3249d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; } 3250d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor SourceLocation getRBraceLoc() const { return RBraceLoc; } 325187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor void setRBraceLoc(SourceLocation Loc) { RBraceLoc = Loc; } 325287fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 32534c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// @brief Retrieve the initializer list that describes the 32544c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// syntactic form of the initializer. 32554c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// 32561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 32574c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *getSyntacticForm() const { return SyntacticForm; } 32584c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor void setSyntacticForm(InitListExpr *Init) { SyntacticForm = Init; } 32594c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3260a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor bool hadArrayRangeDesignator() const { return HadArrayRangeDesignator; } 32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void sawArrayRangeDesignator(bool ARD = true) { 3262d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor HadArrayRangeDesignator = ARD; 3263a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor } 3264a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor 326563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const; 3266c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek 326766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson static bool classof(const Stmt *T) { 32681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == InitListExprClass; 326966b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson } 327066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson static bool classof(const InitListExpr *) { return true; } 32711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 327266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson // Iterators 327363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 327463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall if (InitExprs.empty()) return child_range(); 327563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size()); 327663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 32771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3278709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek typedef InitExprsTy::iterator iterator; 32798111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu typedef InitExprsTy::const_iterator const_iterator; 3280709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek typedef InitExprsTy::reverse_iterator reverse_iterator; 32818111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu typedef InitExprsTy::const_reverse_iterator const_reverse_iterator; 32821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3283ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek iterator begin() { return InitExprs.begin(); } 32848111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu const_iterator begin() const { return InitExprs.begin(); } 3285ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek iterator end() { return InitExprs.end(); } 32868111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu const_iterator end() const { return InitExprs.end(); } 3287ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek reverse_iterator rbegin() { return InitExprs.rbegin(); } 32888111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu const_reverse_iterator rbegin() const { return InitExprs.rbegin(); } 3289ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek reverse_iterator rend() { return InitExprs.rend(); } 32908111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu const_reverse_iterator rend() const { return InitExprs.rend(); } 329166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson}; 329266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson 329305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Represents a C99 designated initializer expression. 329405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 329505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// A designated initializer expression (C99 6.7.8) contains one or 329605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// more designators (which can be field designators, array 329705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designators, or GNU array-range designators) followed by an 329805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// expression that initializes the field or element(s) that the 329905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designators refer to. For example, given: 33001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 330105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @code 330205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// struct point { 330305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// double x; 330405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// double y; 330505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// }; 330605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// struct point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 330705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @endcode 330805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 330905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// The InitListExpr contains three DesignatedInitExprs, the first of 331005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// which covers @c [2].y=1.0. This DesignatedInitExpr will have two 331105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designators, one array designator for @c [2] followed by one field 331205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designator for @c .y. The initalization expression will be 1.0. 331305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorclass DesignatedInitExpr : public Expr { 3314ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorpublic: 3315ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor /// \brief Forward declaration of the Designator class. 3316ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor class Designator; 3317ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 3318ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorprivate: 331905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the '=' or ':' prior to the actual initializer 332005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// expression. 332105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation EqualOrColonLoc; 332205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3323eeae8f072748affce25ab4064982626361293390Douglas Gregor /// Whether this designated initializer used the GNU deprecated 332405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// syntax rather than the C99 '=' syntax. 3325eeae8f072748affce25ab4064982626361293390Douglas Gregor bool GNUSyntax : 1; 332605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 332705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The number of designators in this initializer expression. 332805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned NumDesignators : 15; 332905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3330ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor /// \brief The designators in this designated initialization 3331ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor /// expression. 3332ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designator *Designators; 3333ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 333405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The number of subexpressions of this initializer expression, 333505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// which contains both the initializer and any additional 333605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// expressions used by array and array-range designators. 333705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned NumSubExprs : 16; 333805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3339ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 3340319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DesignatedInitExpr(ASTContext &C, QualType Ty, unsigned NumDesignators, 3341ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor const Designator *Designators, 3342eeae8f072748affce25ab4064982626361293390Douglas Gregor SourceLocation EqualOrColonLoc, bool GNUSyntax, 33439ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr **IndexExprs, unsigned NumIndexExprs, 33449ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr *Init); 334505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3346d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor explicit DesignatedInitExpr(unsigned NumSubExprs) 3347d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor : Expr(DesignatedInitExprClass, EmptyShell()), 3348d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor NumDesignators(0), Designators(0), NumSubExprs(NumSubExprs) { } 3349d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 335005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorpublic: 335105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// A field designator, e.g., ".x". 335205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor struct FieldDesignator { 335305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// Refers to the field that is being initialized. The low bit 335405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// of this field determines whether this is actually a pointer 335505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// to an IdentifierInfo (if 1) or a FieldDecl (if 0). When 335605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// initially constructed, a field designator will store an 335705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// IdentifierInfo*. After semantic analysis has resolved that 335805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// name, the field designator will instead store a FieldDecl*. 335905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor uintptr_t NameOrField; 33601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the '.' in the designated initializer. 336205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned DotLoc; 33631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the field name in the designated initializer. 336505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned FieldLoc; 336605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor }; 336705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 336805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". 336905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor struct ArrayOrRangeDesignator { 337005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// Location of the first index expression within the designated 337105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// initializer expression's list of subexpressions. 337205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned Index; 337305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the '[' starting the array range designator. 337405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned LBracketLoc; 337505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the ellipsis separating the start and end 337605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// indices. Only valid for GNU array-range designators. 337705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned EllipsisLoc; 337805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the ']' terminating the array range designator. 33791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned RBracketLoc; 338005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor }; 338105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 338205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Represents a single C99 designator. 338305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// 338405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @todo This class is infuriatingly similar to clang::Designator, 338505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// but minor differences (storing indices vs. storing pointers) 338605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// keep us from reusing it. Try harder, later, to rectify these 338705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// differences. 338805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor class Designator { 338905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief The kind of designator this describes. 339005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor enum { 339105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor FieldDesignator, 339205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayDesignator, 339305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayRangeDesignator 339405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } Kind; 339505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 339605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor union { 339705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// A field designator, e.g., ".x". 339805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor struct FieldDesignator Field; 339905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". 340005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor struct ArrayOrRangeDesignator ArrayOrRange; 340105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor }; 340205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor friend class DesignatedInitExpr; 340305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 340405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor public: 3405ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designator() {} 3406ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 340705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Initializes a field designator. 34081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designator(const IdentifierInfo *FieldName, SourceLocation DotLoc, 34091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FieldLoc) 341005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor : Kind(FieldDesignator) { 341105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Field.NameOrField = reinterpret_cast<uintptr_t>(FieldName) | 0x01; 341205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Field.DotLoc = DotLoc.getRawEncoding(); 341305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Field.FieldLoc = FieldLoc.getRawEncoding(); 341405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 341505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 341605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Initializes an array designator. 34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designator(unsigned Index, SourceLocation LBracketLoc, 341805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation RBracketLoc) 341905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor : Kind(ArrayDesignator) { 342005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.Index = Index; 342105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding(); 342205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.EllipsisLoc = SourceLocation().getRawEncoding(); 342305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding(); 342405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 342505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 342605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Initializes a GNU array-range designator. 34271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designator(unsigned Index, SourceLocation LBracketLoc, 342805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation EllipsisLoc, SourceLocation RBracketLoc) 342905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor : Kind(ArrayRangeDesignator) { 343005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.Index = Index; 343105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding(); 343205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.EllipsisLoc = EllipsisLoc.getRawEncoding(); 343305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding(); 343405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 343505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 343605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool isFieldDesignator() const { return Kind == FieldDesignator; } 343705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool isArrayDesignator() const { return Kind == ArrayDesignator; } 343805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; } 343905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 344005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor IdentifierInfo * getFieldName(); 344105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 344205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor FieldDecl *getField() { 344305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(Kind == FieldDesignator && "Only valid on a field designator"); 344405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field.NameOrField & 0x01) 344505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return 0; 344605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else 344705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return reinterpret_cast<FieldDecl *>(Field.NameOrField); 344805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 344905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 345005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor void setField(FieldDecl *FD) { 345105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(Kind == FieldDesignator && "Only valid on a field designator"); 345205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Field.NameOrField = reinterpret_cast<uintptr_t>(FD); 345305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 345405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 345587f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation getDotLoc() const { 345687f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(Kind == FieldDesignator && "Only valid on a field designator"); 345787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return SourceLocation::getFromRawEncoding(Field.DotLoc); 345887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 345987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 346005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation getFieldLoc() const { 346105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(Kind == FieldDesignator && "Only valid on a field designator"); 346205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return SourceLocation::getFromRawEncoding(Field.FieldLoc); 346305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 346405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 346505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation getLBracketLoc() const { 346605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 346705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor "Only valid on an array or array-range designator"); 346805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return SourceLocation::getFromRawEncoding(ArrayOrRange.LBracketLoc); 346905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 347005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 347105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation getRBracketLoc() const { 347205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 347305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor "Only valid on an array or array-range designator"); 347405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return SourceLocation::getFromRawEncoding(ArrayOrRange.RBracketLoc); 347505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 347605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 347705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation getEllipsisLoc() const { 347805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(Kind == ArrayRangeDesignator && 347905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor "Only valid on an array-range designator"); 348005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return SourceLocation::getFromRawEncoding(ArrayOrRange.EllipsisLoc); 348105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 34824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3483d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor unsigned getFirstExprIndex() const { 3484d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 3485d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor "Only valid on an array or array-range designator"); 3486d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor return ArrayOrRange.Index; 3487d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor } 3488d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 34894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceLocation getStartLocation() const { 34904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Kind == FieldDesignator) 34914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return getDotLoc().isInvalid()? getFieldLoc() : getDotLoc(); 34924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 34934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return getLBracketLoc(); 34944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 349505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor }; 349605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 34971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static DesignatedInitExpr *Create(ASTContext &C, Designator *Designators, 349805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned NumDesignators, 349905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr **IndexExprs, unsigned NumIndexExprs, 350005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation EqualOrColonLoc, 3501eeae8f072748affce25ab4064982626361293390Douglas Gregor bool GNUSyntax, Expr *Init); 350205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3503d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor static DesignatedInitExpr *CreateEmpty(ASTContext &C, unsigned NumIndexExprs); 3504d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 350505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Returns the number of designators in this initializer. 350605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned size() const { return NumDesignators; } 350705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 350805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Iterator access to the designators. 350905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef Designator* designators_iterator; 3510ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor designators_iterator designators_begin() { return Designators; } 35111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump designators_iterator designators_end() { 35121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Designators + NumDesignators; 3513ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 351405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3515cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek typedef std::reverse_iterator<designators_iterator> 3516cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek reverse_designators_iterator; 3517cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek reverse_designators_iterator designators_rbegin() { 3518cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek return reverse_designators_iterator(designators_end()); 3519cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek } 3520cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek reverse_designators_iterator designators_rend() { 3521cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek return reverse_designators_iterator(designators_begin()); 3522cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek } 3523cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek 3524711997184366d584c9c437102cae1e9d9927b986Douglas Gregor Designator *getDesignator(unsigned Idx) { return &designators_begin()[Idx]; } 3525711997184366d584c9c437102cae1e9d9927b986Douglas Gregor 3526c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt void setDesignators(ASTContext &C, const Designator *Desigs, 3527319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor unsigned NumDesigs); 3528d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 352905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *getArrayIndex(const Designator& D); 353005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *getArrayRangeStart(const Designator& D); 353105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *getArrayRangeEnd(const Designator& D); 353205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 353305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Retrieve the location of the '=' that precedes the 353405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// initializer value itself, if present. 353505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation getEqualOrColonLoc() const { return EqualOrColonLoc; } 3536d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor void setEqualOrColonLoc(SourceLocation L) { EqualOrColonLoc = L; } 353705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 353805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Determines whether this designated initializer used the 3539eeae8f072748affce25ab4064982626361293390Douglas Gregor /// deprecated GNU syntax for designated initializers. 3540eeae8f072748affce25ab4064982626361293390Douglas Gregor bool usesGNUSyntax() const { return GNUSyntax; } 3541d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor void setGNUSyntax(bool GNU) { GNUSyntax = GNU; } 354205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 354305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Retrieve the initializer value. 35441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *getInit() const { 354505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return cast<Expr>(*const_cast<DesignatedInitExpr*>(this)->child_begin()); 354605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 354705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 354805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor void setInit(Expr *init) { 354905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor *child_begin() = init; 355005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 355105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3552d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// \brief Retrieve the total number of subexpressions in this 3553d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// designated initializer expression, including the actual 3554d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// initialized value and any expressions that occur within array 3555d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// and array-range designators. 3556d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor unsigned getNumSubExprs() const { return NumSubExprs; } 3557d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 3558d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor Expr *getSubExpr(unsigned Idx) { 3559d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor assert(Idx < NumSubExprs && "Subscript out of range"); 3560d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 3561d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 3562d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor return reinterpret_cast<Expr**>(reinterpret_cast<void**>(Ptr))[Idx]; 3563d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor } 3564d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 3565d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor void setSubExpr(unsigned Idx, Expr *E) { 3566d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor assert(Idx < NumSubExprs && "Subscript out of range"); 3567d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 3568d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 3569d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor reinterpret_cast<Expr**>(reinterpret_cast<void**>(Ptr))[Idx] = E; 3570d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor } 3571d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 3572ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor /// \brief Replaces the designator at index @p Idx with the series 3573ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor /// of designators in [First, Last). 3574319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor void ExpandDesignator(ASTContext &C, unsigned Idx, const Designator *First, 3575ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor const Designator *Last); 3576ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 357763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const; 357805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 357905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor static bool classof(const Stmt *T) { 35801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == DesignatedInitExprClass; 358105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 358205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor static bool classof(const DesignatedInitExpr *) { return true; } 358305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 358405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Iterators 358563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 358663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall Stmt **begin = reinterpret_cast<Stmt**>(this + 1); 358763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(begin, begin + NumSubExprs); 358863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 35893498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor}; 35903498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 35913498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// \brief Represents an implicitly-generated value initialization of 35923498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// an object of a given type. 35933498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// 35941a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// Implicit value initializations occur within semantic initializer 35951a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// list expressions (InitListExpr) as placeholders for subobject 35963498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// initializations not explicitly specified by the user. 35971a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// 35981a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// \see InitListExpr 35991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpclass ImplicitValueInitExpr : public Expr { 36003498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregorpublic: 36011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit ImplicitValueInitExpr(QualType ty) 3602f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(ImplicitValueInitExprClass, ty, VK_RValue, OK_Ordinary, 3603bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false, false, false) { } 36043498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 3605d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// \brief Construct an empty implicit value initialization. 3606d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor explicit ImplicitValueInitExpr(EmptyShell Empty) 3607d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor : Expr(ImplicitValueInitExprClass, Empty) { } 3608d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 36103498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return T->getStmtClass() == ImplicitValueInitExprClass; 36113498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 36123498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor static bool classof(const ImplicitValueInitExpr *) { return true; } 36133498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 361463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 36153498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return SourceRange(); 36163498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 36173498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 36183498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor // Iterators 361963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 362005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}; 362105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 36222ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 36232ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanclass ParenListExpr : public Expr { 36242ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman Stmt **Exprs; 36252ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned NumExprs; 36262ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SourceLocation LParenLoc, RParenLoc; 36272ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 36282ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanpublic: 36291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParenListExpr(ASTContext& C, SourceLocation lparenloc, Expr **exprs, 36302ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned numexprs, SourceLocation rparenloc); 36312ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 36322ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman /// \brief Build an empty paren list. 363337bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis explicit ParenListExpr(EmptyShell Empty) : Expr(ParenListExprClass, Empty) { } 36341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36352ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned getNumExprs() const { return NumExprs; } 36361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Expr* getExpr(unsigned Init) const { 36382ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman assert(Init < getNumExprs() && "Initializer access out of range!"); 36392ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman return cast_or_null<Expr>(Exprs[Init]); 36402ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 36411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr* getExpr(unsigned Init) { 36432ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman assert(Init < getNumExprs() && "Initializer access out of range!"); 36442ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman return cast_or_null<Expr>(Exprs[Init]); 36452ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 36462ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 364783ddad3ab513f5d73698cf9fbeb4ed3f011bc3b9Douglas Gregor Expr **getExprs() { return reinterpret_cast<Expr **>(Exprs); } 36481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36492ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SourceLocation getLParenLoc() const { return LParenLoc; } 36502ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SourceLocation getRParenLoc() const { return RParenLoc; } 36512ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 365263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 36532ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman return SourceRange(LParenLoc, RParenLoc); 36541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 36552ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman static bool classof(const Stmt *T) { 36561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ParenListExprClass; 36572ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 36582ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman static bool classof(const ParenListExpr *) { return true; } 36591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36602ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman // Iterators 366163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 366263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Exprs[0], &Exprs[0]+NumExprs); 366363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 366437bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis 366560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 36663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl friend class ASTStmtWriter; 36672ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman}; 36682ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 36691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36704eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff//===----------------------------------------------------------------------===// 36714eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff// Clang Extensions 36724eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff//===----------------------------------------------------------------------===// 36734eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 3674a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner 3675a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// ExtVectorElementExpr - This represents access to specific elements of a 3676a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// vector, and may occur on the left hand side or right hand side. For example 3677a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// the following is legal: "V.xy = V.zw" if V is a 4 element extended vector. 3678a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// 367973525de7fd9bdd534382dc89a24f1f76db3e04b9Chris Lattner/// Note that the base may have either vector or pointer to vector type, just 368073525de7fd9bdd534382dc89a24f1f76db3e04b9Chris Lattner/// like a struct field reference. 368173525de7fd9bdd534382dc89a24f1f76db3e04b9Chris Lattner/// 3682a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattnerclass ExtVectorElementExpr : public Expr { 3683a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner Stmt *Base; 3684d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor IdentifierInfo *Accessor; 3685a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner SourceLocation AccessorLoc; 3686a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattnerpublic: 3687f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExtVectorElementExpr(QualType ty, ExprValueKind VK, Expr *base, 3688f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall IdentifierInfo &accessor, SourceLocation loc) 36890943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall : Expr(ExtVectorElementExprClass, ty, VK, 36900943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall (VK == VK_RValue ? OK_Ordinary : OK_VectorComponent), 3691bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->isTypeDependent(), base->isValueDependent(), 3692bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->containsUnexpandedParameterPack()), 3693d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor Base(base), Accessor(&accessor), AccessorLoc(loc) {} 36941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3695d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor /// \brief Build an empty vector element expression. 3696d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor explicit ExtVectorElementExpr(EmptyShell Empty) 3697d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor : Expr(ExtVectorElementExprClass, Empty) { } 3698d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 3699a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner const Expr *getBase() const { return cast<Expr>(Base); } 3700a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner Expr *getBase() { return cast<Expr>(Base); } 3701d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setBase(Expr *E) { Base = E; } 3702d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 3703d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor IdentifierInfo &getAccessor() const { return *Accessor; } 3704d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setAccessor(IdentifierInfo *II) { Accessor = II; } 3705d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 3706d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor SourceLocation getAccessorLoc() const { return AccessorLoc; } 3707d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setAccessorLoc(SourceLocation L) { AccessorLoc = L; } 3708d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 3709a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner /// getNumElements - Get the number of components being selected. 3710a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner unsigned getNumElements() const; 37111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3712a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner /// containsDuplicateElements - Return true if any element access is 3713a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner /// repeated. 3714a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner bool containsDuplicateElements() const; 37151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3716a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner /// getEncodedElementAccess - Encode the elements accessed into an llvm 3717a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner /// aggregate Constant of ConstantInt(s). 3718a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner void getEncodedElementAccess(llvm::SmallVectorImpl<unsigned> &Elts) const; 37191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 372063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 3721a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner return SourceRange(getBase()->getLocStart(), AccessorLoc); 3722a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner } 37231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37242140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner /// isArrow - Return true if the base expression is a pointer to vector, 37252140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner /// return false if the base expression is a vector. 37262140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner bool isArrow() const; 37271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 37291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ExtVectorElementExprClass; 3730a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner } 3731a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner static bool classof(const ExtVectorElementExpr *) { return true; } 37321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3733a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner // Iterators 373463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Base, &Base+1); } 3735a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner}; 3736a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner 3737a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner 373856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff/// BlockExpr - Adaptor class for mixing a BlockDecl with expressions. 37399c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff/// ^{ statement-body } or ^(int arg1, float arg2){ statement-body } 37404eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffclass BlockExpr : public Expr { 374156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffprotected: 374256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff BlockDecl *TheBlock; 37434eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffpublic: 3744469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall BlockExpr(BlockDecl *BD, QualType ty) 3745f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(BlockExprClass, ty, VK_RValue, OK_Ordinary, 3746bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ty->isDependentType(), false, false), 3747469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall TheBlock(BD) {} 37489c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff 374984af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor /// \brief Build an empty block expression. 375084af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor explicit BlockExpr(EmptyShell Empty) : Expr(BlockExprClass, Empty) { } 375184af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor 3752d5cab5435371b8cc74a9e05ebd40b5995ebad149Anders Carlsson const BlockDecl *getBlockDecl() const { return TheBlock; } 375356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff BlockDecl *getBlockDecl() { return TheBlock; } 375484af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor void setBlockDecl(BlockDecl *BD) { TheBlock = BD; } 375584af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor 375656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff // Convenience functions for probing the underlying BlockDecl. 375756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff SourceLocation getCaretLocation() const; 375856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff const Stmt *getBody() const; 375956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Stmt *getBody(); 37609c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff 376163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 376256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff return SourceRange(getCaretLocation(), getBody()->getLocEnd()); 37639c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff } 37649c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff 376556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff /// getFunctionType - Return the underlying function type for this block. 376656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff const FunctionType *getFunctionType() const; 376756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 37681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 37699c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff return T->getStmtClass() == BlockExprClass; 37704eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 37714eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff static bool classof(const BlockExpr *) { return true; } 37721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37734eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff // Iterators 377463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 37754eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}; 37761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37776b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// BlockDeclRefExpr - A reference to a local variable declared in an 37786b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// enclosing scope. 37794eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffclass BlockDeclRefExpr : public Expr { 37806b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall VarDecl *D; 37814eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff SourceLocation Loc; 37827d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian bool IsByRef : 1; 37837d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian bool ConstQualAdded : 1; 37844eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffpublic: 37856b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall BlockDeclRefExpr(VarDecl *d, QualType t, ExprValueKind VK, 37866b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall SourceLocation l, bool ByRef, bool constAdded = false); 378794cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 378894cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor // \brief Build an empty reference to a declared variable in a 378994cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor // block. 379094cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor explicit BlockDeclRefExpr(EmptyShell Empty) 379194cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor : Expr(BlockDeclRefExprClass, Empty) { } 37921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37936b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall VarDecl *getDecl() { return D; } 37946b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall const VarDecl *getDecl() const { return D; } 37956b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall void setDecl(VarDecl *VD) { D = VD; } 379694cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 379794cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor SourceLocation getLocation() const { return Loc; } 379894cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor void setLocation(SourceLocation L) { Loc = L; } 379994cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 380063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(Loc); } 38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38024eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff bool isByRef() const { return IsByRef; } 380394cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor void setByRef(bool BR) { IsByRef = BR; } 38041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38057d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian bool isConstQualAdded() const { return ConstQualAdded; } 38067d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian void setConstQualAdded(bool C) { ConstQualAdded = C; } 380789f9d3a7651d1225f3f56ae3387c83b98a26da00Fariborz Jahanian 38081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 38091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == BlockDeclRefExprClass; 38104eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 38114eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff static bool classof(const BlockDeclRefExpr *) { return true; } 38121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38134eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff // Iterators 381463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 38154eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}; 38164eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 38175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 38185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 38195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 3820