Expr.h revision 7b33c2b3908b178511ccaace8cacb5e5b14552a9
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Expr.h - Classes for representing expressions ----------*- C++ -*-===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file defines the Expr interface and subclasses. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_AST_EXPR_H 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_AST_EXPR_H 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson#include "clang/AST/APValue.h" 185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Stmt.h" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Type.h" 20161755a09898c95d21bfff33707da9ca41cd53c5John McCall#include "clang/AST/DeclAccessPair.h" 215baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall#include "clang/AST/OperationKinds.h" 22709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek#include "clang/AST/ASTVector.h" 23409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson#include "clang/AST/UsuallyTinyPtrVector.h" 24f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne#include "clang/Basic/TypeTraits.h" 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/APSInt.h" 26525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner#include "llvm/ADT/APFloat.h" 273b8d116703db8018f855cbb4733ace426422623bNate Begeman#include "llvm/ADT/SmallVector.h" 28b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar#include "llvm/ADT/StringRef.h" 29403ba3522d1b1c97ae5fad81c1a2c4b3a754e1c1Nick Lewycky#include <cctype> 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 32590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner class ASTContext; 33c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson class APValue; 34c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar class Decl; 35c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar class IdentifierInfo; 36c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar class ParmVarDecl; 378e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor class NamedDecl; 38c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar class ValueDecl; 3956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff class BlockDecl; 40409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson class CXXBaseSpecifier; 4188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor class CXXOperatorCallExpr; 4288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor class CXXMemberCallExpr; 43f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall class ObjCPropertyRefExpr; 44833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall class TemplateArgumentLoc; 45d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall class TemplateArgumentListInfo; 4656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall class OpaqueValueExpr; 4788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 487ab9d574d27ecee1f130e5755aa403e5ab529b6bAnders Carlsson/// \brief A simple array of base specifiers. 49f871d0cc377a1367b519a6cce26be74607566ebaJohn McCalltypedef llvm::SmallVector<CXXBaseSpecifier*, 4> CXXCastPath; 507ab9d574d27ecee1f130e5755aa403e5ab529b6bAnders Carlsson 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Expr - This represents one expression. Note that Expr's are subclasses of 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Stmt. This allows an expression to be transparently used any place a Stmt 535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// is required. 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Expr : public Stmt { 565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QualType TR; 57898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 588e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCallprotected: 59f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr(StmtClass SC, QualType T, ExprValueKind VK, ExprObjectKind OK, 60bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool TD, bool VD, bool ContainsUnexpandedParameterPack) : Stmt(SC) { 618e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.TypeDependent = TD; 628e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall ExprBits.ValueDependent = VD; 63f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprBits.ValueKind = VK; 64f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprBits.ObjectKind = OK; 65bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack; 66898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor setType(T); 67898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor } 68898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 690b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor /// \brief Construct an empty expression. 700b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor explicit Expr(StmtClass SC, EmptyShell) : Stmt(SC) { } 710b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 73f7c2aa0b049272d8f318988c1965760dcb852578Douglas Gregor QualType getType() const { return TR; } 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void setType(QualType t) { 759d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // In C++, the type of an expression is always adjusted so that it 769d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // will not have reference type an expression will never have 779d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // reference type (C++ [expr]p6). Use 789d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // QualType::getNonReferenceType() to retrieve the non-reference 799d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // type. Additionally, inspect Expr::isLvalue to determine whether 809d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // an expression that is adjusted in this manner should be 819d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor // considered an lvalue. 82905d11d53aeb6b26744f44fedc2b2820c7a62df6Douglas Gregor assert((t.isNull() || !t->isReferenceType()) && 838320aaaa01d931aa234fc3bce05b399ef41898d5Daniel Dunbar "Expressions can't have reference type"); 84f7c2aa0b049272d8f318988c1965760dcb852578Douglas Gregor 851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TR = t; 869d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor } 8777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 88898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// isValueDependent - Determines whether this expression is 89898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// value-dependent (C++ [temp.dep.constexpr]). For example, the 90898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// array bound of "Chars" in the following example is 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// value-dependent. 92898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// @code 93898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// template<int Size, char (&Chars)[Size]> struct meta_string; 94898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// @endcode 958e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall bool isValueDependent() const { return ExprBits.ValueDependent; } 96898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 970b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor /// \brief Set whether this expression is value-dependent or not. 988e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall void setValueDependent(bool VD) { ExprBits.ValueDependent = VD; } 990b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 100898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// isTypeDependent - Determines whether this expression is 101898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// type-dependent (C++ [temp.dep.expr]), which means that its type 102898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// could change from one template instantiation to the next. For 103898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// example, the expressions "x" and "x + y" are type-dependent in 104898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// the following code, but "y" is not type-dependent: 105898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// @code 1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// template<typename T> 107898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// void add(T x, int y) { 108898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// x + y; 109898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// } 110898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /// @endcode 1118e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall bool isTypeDependent() const { return ExprBits.TypeDependent; } 112898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 1130b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor /// \brief Set whether this expression is type-dependent or not. 1148e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall void setTypeDependent(bool TD) { ExprBits.TypeDependent = TD; } 1150b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 116d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// \brief Whether this expression contains an unexpanded parameter 117d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// pack (for C++0x variadic templates). 118d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// 119d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// Given the following function template: 120d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// 121d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// \code 122d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// template<typename F, typename ...Types> 123d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// void forward(const F &f, Types &&...args) { 124d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// f(static_cast<Types&&>(args)...); 125d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// } 126d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// \endcode 127d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// 128d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// The expressions \c args and \c static_cast<Types&&>(args) both 129d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor /// contain parameter packs. 130d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor bool containsUnexpandedParameterPack() const { 131d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor return ExprBits.ContainsUnexpandedParameterPack; 132d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor } 133d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor 134bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /// \brief Set the bit that describes whether this expression 135bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /// contains an unexpanded parameter pack. 136bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor void setContainsUnexpandedParameterPack(bool PP = true) { 137bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ExprBits.ContainsUnexpandedParameterPack = PP; 138bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 139bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getExprLoc - Return the preferred location for the arrow when diagnosing 1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// a problem with a generic expression. 14263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceLocation getExprLoc() const; 1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 144026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner /// isUnusedResultAWarning - Return true if this immediate expression should 145026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner /// be warned about if the result is unused. If so, fill in Loc and Ranges 146026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner /// with location to warn on and the source range[s] to report with the 147026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner /// warning. 148026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner bool isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1, 149df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump SourceRange &R2, ASTContext &Ctx) const; 1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1517eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// isLValue - True if this expression is an "l-value" according to 1527eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// the rules of the current language. C and C++ give somewhat 1537eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// different rules for this concept, but in general, the result of 1547eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// an l-value expression identifies a specific object whereas the 1557eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// result of an r-value expression is a value detached from any 1567eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// specific storage. 1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 1587eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// C++0x divides the concept of "r-value" into pure r-values 1597eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// ("pr-values") and so-called expiring values ("x-values"), which 1607eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// identify specific objects that can be safely cannibalized for 1617eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// their resources. This is an unfortunate abuse of terminology on 1627eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// the part of the C++ committee. In Clang, when we say "r-value", 1637eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// we generally mean a pr-value. 1647eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall bool isLValue() const { return getValueKind() == VK_LValue; } 1657eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall bool isRValue() const { return getValueKind() == VK_RValue; } 1667eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall bool isXValue() const { return getValueKind() == VK_XValue; } 1677eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall bool isGLValue() const { return getValueKind() != VK_RValue; } 1687eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall 1697eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall enum LValueClassification { 1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer LV_Valid, 1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer LV_NotObjectType, 1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer LV_IncompleteVoidType, 173fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff LV_DuplicateVectorComponents, 17486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor LV_InvalidExpression, 175077f490d0a514dcc448475f33f799934252b85a7Fariborz Jahanian LV_InvalidMessageExpression, 1762514a309204341798f96912ce7a90841bea59727Fariborz Jahanian LV_MemberFunction, 177e9ff443040cb571ae2c5c2626c4dc9a9a812d84aFariborz Jahanian LV_SubObjCPropertySetting, 178e873fb74219f48407ae0b8fa083aa7f0b6ff1427Douglas Gregor LV_ClassTemporary 1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 1807eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall /// Reasons why an expression might not be an l-value. 1817eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall LValueClassification ClassifyLValue(ASTContext &Ctx) const; 18253202857c60214d80950a975e6e52aebf30bd16aEli Friedman 1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, 1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// does not have an incomplete type, does not have a const-qualified type, 1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and if it is a structure or union, does not have any member (including, 1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// recursively, any member or element of all contained aggregates or unions) 1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// with a const-qualified type. 18844e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar /// 18944e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar /// \param Loc [in] [out] - A source location which *may* be filled 19044e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar /// in with the location of the expression making this a 19144e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar /// non-modifiable lvalue, if specified. 1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer enum isModifiableLvalueResult { 1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_Valid, 1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_NotObjectType, 1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_IncompleteVoidType, 196fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff MLV_DuplicateVectorComponents, 1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_InvalidExpression, 198ca354faa7e9b99af17070c82b9662a5fca76422cChris Lattner MLV_LValueCast, // Specialized form of MLV_InvalidExpression. 1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_IncompleteType, 2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MLV_ConstQualified, 2014f6a7d7ead09b439216c32f2de806a998aeb222aSteve Naroff MLV_ArrayType, 2025daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian MLV_NotBlockQualified, 203ba8d2d684e74a20bef03828c21c991d222c7e9e5Fariborz Jahanian MLV_ReadonlyProperty, 20486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor MLV_NoSetterProperty, 2052514a309204341798f96912ce7a90841bea59727Fariborz Jahanian MLV_MemberFunction, 206e9ff443040cb571ae2c5c2626c4dc9a9a812d84aFariborz Jahanian MLV_SubObjCPropertySetting, 207077f490d0a514dcc448475f33f799934252b85a7Fariborz Jahanian MLV_InvalidMessageExpression, 208e873fb74219f48407ae0b8fa083aa7f0b6ff1427Douglas Gregor MLV_ClassTemporary 2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 21044e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx, 21144e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar SourceLocation *Loc = 0) const; 2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2132111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// \brief The return type of classify(). Represents the C++0x expression 2142111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// taxonomy. 2152111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl class Classification { 2162111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl public: 2172111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// \brief The various classification results. Most of these mean prvalue. 2182111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl enum Kinds { 2192111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_LValue, 2202111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_XValue, 2212111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_Function, // Functions cannot be lvalues in C. 2222111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_Void, // Void cannot be an lvalue in C. 2231c860d5640e8eebb11a5d515a761242b66761b0bPeter Collingbourne CL_AddressableVoid, // Void expression whose address can be taken in C. 2242111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_DuplicateVectorComponents, // A vector shuffle with dupes. 2252111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_MemberFunction, // An expression referring to a member function 2262111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_SubObjCPropertySetting, 2272111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_ClassTemporary, // A prvalue of class type 228077f490d0a514dcc448475f33f799934252b85a7Fariborz Jahanian CL_ObjCMessageRValue, // ObjC message is an rvalue 2292111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CL_PRValue // A prvalue for any other reason, of any other type 2302111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl }; 2312111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// \brief The results of modification testing. 2322111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl enum ModifiableType { 2332111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_Untested, // testModifiable was false. 2342111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_Modifiable, 2352111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_RValue, // Not modifiable because it's an rvalue 2362111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_Function, // Not modifiable because it's a function; C++ only 2372111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_LValueCast, // Same as CM_RValue, but indicates GCC cast-as-lvalue ext 2382111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_NotBlockQualified, // Not captured in the closure 2392111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_NoSetterProperty,// Implicit assignment to ObjC property without setter 2402111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_ConstQualified, 2412111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_ArrayType, 2422111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl CM_IncompleteType 2432111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl }; 2442111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 2452111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl private: 2462111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl friend class Expr; 2472111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 2482111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl unsigned short Kind; 2492111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl unsigned short Modifiable; 2502111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 2512111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl explicit Classification(Kinds k, ModifiableType m) 2522111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl : Kind(k), Modifiable(m) 2532111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl {} 2542111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 2552111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl public: 2562111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl Classification() {} 2572111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 2582111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl Kinds getKind() const { return static_cast<Kinds>(Kind); } 2592111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl ModifiableType getModifiable() const { 2602111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl assert(Modifiable != CM_Untested && "Did not test for modifiability."); 2612111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl return static_cast<ModifiableType>(Modifiable); 2622111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl } 2632111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isLValue() const { return Kind == CL_LValue; } 2642111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isXValue() const { return Kind == CL_XValue; } 2652111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isGLValue() const { return Kind <= CL_XValue; } 2662111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isPRValue() const { return Kind >= CL_Function; } 2672111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isRValue() const { return Kind >= CL_XValue; } 2682111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl bool isModifiable() const { return getModifiable() == CM_Modifiable; } 2692c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor 2702c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor /// \brief Create a simple, modifiably lvalue 2712c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor static Classification makeSimpleLValue() { 2722c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor return Classification(CL_LValue, CM_Modifiable); 2732c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor } 2742c9a03f3b249e4d9d76eadf758a33142adc4d0a4Douglas Gregor 2752111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl }; 276369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /// \brief Classify - Classify this expression according to the C++0x 2772111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// expression taxonomy. 2782111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// 2792111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// C++0x defines ([basic.lval]) a new taxonomy of expressions to replace the 2802111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// old lvalue vs rvalue. This function determines the type of expression this 2812111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// is. There are three expression types: 2822111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// - lvalues are classical lvalues as in C++03. 2832111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// - prvalues are equivalent to rvalues in C++03. 2842111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// - xvalues are expressions yielding unnamed rvalue references, e.g. a 2852111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// function returning an rvalue reference. 2862111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// lvalues and xvalues are collectively referred to as glvalues, while 2872111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// prvalues and xvalues together form rvalues. 2882111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl Classification Classify(ASTContext &Ctx) const { 2892111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl return ClassifyImpl(Ctx, 0); 2902111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl } 2912111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 292369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /// \brief ClassifyModifiable - Classify this expression according to the 2932111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// C++0x expression taxonomy, and see if it is valid on the left side 2942111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// of an assignment. 2952111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// 2962111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// This function extends classify in that it also tests whether the 2972111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// expression is modifiable (C99 6.3.2.1p1). 2982111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// \param Loc A source location that might be filled with a relevant location 2992111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl /// if the expression is not modifiable. 3002111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl Classification ClassifyModifiable(ASTContext &Ctx, SourceLocation &Loc) const{ 3012111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl return ClassifyImpl(Ctx, &Loc); 3022111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl } 3032111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 304f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// getValueKindForType - Given a formal return or parameter type, 305f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// give its value kind. 306f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall static ExprValueKind getValueKindForType(QualType T) { 307f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall if (const ReferenceType *RT = T->getAs<ReferenceType>()) 3080943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall return (isa<LValueReferenceType>(RT) 3090943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall ? VK_LValue 3100943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall : (RT->getPointeeType()->isFunctionType() 3110943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall ? VK_LValue : VK_XValue)); 312f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall return VK_RValue; 313f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 314f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall 315f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// getValueKind - The value kind that this expression produces. 316f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind getValueKind() const { 317f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall return static_cast<ExprValueKind>(ExprBits.ValueKind); 318f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 319f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall 320f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// getObjectKind - The object kind that this expression produces. 321f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// Object kinds are meaningful only for expressions that yield an 322f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// l-value or x-value. 323f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprObjectKind getObjectKind() const { 324f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall return static_cast<ExprObjectKind>(ExprBits.ObjectKind); 325f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall } 326f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall 32756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall bool isOrdinaryOrBitFieldObject() const { 32856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprObjectKind OK = getObjectKind(); 32956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return (OK == OK_Ordinary || OK == OK_BitField); 33056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 33156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 332f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// setValueKind - Set the value kind produced by this expression. 333f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall void setValueKind(ExprValueKind Cat) { ExprBits.ValueKind = Cat; } 334f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall 335f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /// setObjectKind - Set the object kind produced by this expression. 336f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall void setObjectKind(ExprObjectKind Cat) { ExprBits.ObjectKind = Cat; } 337f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall 3382111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redlprivate: 3392111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl Classification ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const; 3402111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 3412111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redlpublic: 3422111c855343a0530e236bf0862358ec8d67b28f3Sebastian Redl 34333bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor /// \brief If this expression refers to a bit-field, retrieve the 34433bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor /// declaration of that bit-field. 34533bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor FieldDecl *getBitField(); 3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 34738d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson const FieldDecl *getBitField() const { 34838d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson return const_cast<Expr*>(this)->getBitField(); 34938d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson } 3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 351f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall /// \brief If this expression is an l-value for an Objective C 352f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall /// property, find the underlying property reference expression. 353f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall const ObjCPropertyRefExpr *getObjCProperty() const; 354f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 355093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson /// \brief Returns whether this expression refers to a vector element. 356093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson bool refersToVectorElement() const; 357c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3582b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner /// isKnownToHaveBooleanValue - Return true if this is an integer expression 3592b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner /// that is known to return 0 or 1. This happens for _Bool/bool expressions 3602b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner /// but also int expressions which are produced by things like comparisons in 3612b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner /// C. 3622b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner bool isKnownToHaveBooleanValue() const; 363c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// isIntegerConstantExpr - Return true if this expression is a valid integer 3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// constant expression, and, if so, return its value in Result. If not a 3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// valid i-c-e, return false and fill in Loc (if specified) with the location 3675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// of the invalid expression. 368590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner bool isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, 369590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner SourceLocation *Loc = 0, 3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isEvaluated = true) const; 371590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner bool isIntegerConstantExpr(ASTContext &Ctx, SourceLocation *Loc = 0) const { 3728070a8497c0fb3e6f70a557f788405d8945b1208Daniel Dunbar llvm::APSInt X; 373590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner return isIntegerConstantExpr(X, Ctx, Loc); 3745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 375c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedman /// isConstantInitializer - Returns true if this expression is a constant 376c9e8f606787b0bc0c3b08e566b87cc1751694168Eli Friedman /// initializer, which can be emitted at compile-time. 3774204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall bool isConstantInitializer(ASTContext &Ctx, bool ForRef) const; 3781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37994deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// EvalResult is a struct with detailed info about an evaluated expression. 38094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson struct EvalResult { 3812d6744ff04c1690a1485178d550d2fab84a0270bDaniel Dunbar /// Val - This is the value the expression can be folded to. 38294deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson APValue Val; 3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38494deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// HasSideEffects - Whether the evaluated expression has side effects. 38594deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// For example, (f() && 0) can be folded, but it still has side effects. 38694deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson bool HasSideEffects; 3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38894deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// Diag - If the expression is unfoldable, then Diag contains a note 38994deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// diagnostic indicating why it's not foldable. DiagLoc indicates a caret 39094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// position for the error, and DiagExpr is the expression that caused 39194deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// the error. 39294deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// If the expression is foldable, but not an integer constant expression, 39394deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// Diag contains a note diagnostic that describes why it isn't an integer 39494deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// constant expression. If the expression *is* an integer constant 39594deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson /// expression, then Diag will be zero. 39694deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson unsigned Diag; 39794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson const Expr *DiagExpr; 39894deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson SourceLocation DiagLoc; 3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson EvalResult() : HasSideEffects(false), Diag(0), DiagExpr(0) {} 401e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara 402e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara // isGlobalLValue - Return true if the evaluated lvalue expression 403e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara // is global. 404e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara bool isGlobalLValue() const; 405e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara // hasSideEffects - Return true if the evaluated expression has 406e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara // side effects. 407e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara bool hasSideEffects() const { 408e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara return HasSideEffects; 409e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara } 41094deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson }; 41194deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson 4126ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner /// Evaluate - Return true if this is a constant which we can fold using 413019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner /// any crazy technique (that has nothing to do with language standards) that 414019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner /// we want to. If this function returns true, it returns the folded constant 415019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner /// in Result. 4164ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool Evaluate(EvalResult &Result, const ASTContext &Ctx) const; 4175b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson 418cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall /// EvaluateAsBooleanCondition - Return true if this is a constant 419cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall /// which we we can fold and convert to a boolean condition using 420cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall /// any crazy technique that we want to. 4214ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx) const; 422cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall 4236ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner /// isEvaluatable - Call Evaluate to see if this expression can be constant 42445b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner /// folded, but discard the result. 4254ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool isEvaluatable(const ASTContext &Ctx) const; 426c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson 4276ddf4784a22b994b954ed74c6061d4603d474639Fariborz Jahanian /// HasSideEffects - This routine returns true for all those expressions 428138d6a6890c171068ac60430431eaadb3fcef9abGabor Greif /// which must be evaluated each time and must not be optimized away 4296ddf4784a22b994b954ed74c6061d4603d474639Fariborz Jahanian /// or evaluated at compile time. Example is a function call, volatile 4306ddf4784a22b994b954ed74c6061d4603d474639Fariborz Jahanian /// variable read. 4314ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool HasSideEffects(const ASTContext &Ctx) const; 432c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 43351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson /// EvaluateAsInt - Call Evaluate and return the folded integer. This 43451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson /// must be called on an expression that constant folds to an integer. 4354ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad llvm::APSInt EvaluateAsInt(const ASTContext &Ctx) const; 43651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 437b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman /// EvaluateAsLValue - Evaluate an expression to see if it's a lvalue 438b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman /// with link time known address. 4394ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const; 4401b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 441e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara /// EvaluateAsLValue - Evaluate an expression to see if it's a lvalue. 4424ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool EvaluateAsAnyLValue(EvalResult &Result, const ASTContext &Ctx) const; 443e17a6436b429e4b18a5e157061fb13bbc677b3b0Abramo Bagnara 44482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// \brief Enumeration used to describe the kind of Null pointer constant 44582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// returned from \c isNullPointerConstant(). 44682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth enum NullPointerConstantKind { 44782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// \brief Expression is not a Null pointer constant. 44882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NPCK_NotNull = 0, 44982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth 45082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// \brief Expression is a Null pointer constant built from a zero integer. 45182214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NPCK_ZeroInteger, 45282214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth 45382214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// \brief Expression is a C++0X nullptr. 45482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NPCK_CXX0X_nullptr, 45582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth 45682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// \brief Expression is a GNU-style __null constant. 45782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NPCK_GNUNull 45882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth }; 45982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth 460ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// \brief Enumeration used to describe how \c isNullPointerConstant() 461ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// should cope with value-dependent expressions. 462ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor enum NullPointerConstantValueDependence { 463ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// \brief Specifies that the expression should never be value-dependent. 464ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor NPC_NeverValueDependent = 0, 465c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 466ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// \brief Specifies that a value-dependent expression of integral or 467ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// dependent type should be considered a null pointer constant. 468ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor NPC_ValueDependentIsNull, 469c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 470ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// \brief Specifies that a value-dependent expression should be considered 471ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor /// to never be a null pointer constant. 472ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor NPC_ValueDependentIsNotNull 473ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor }; 474c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 47582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to 47682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// a Null pointer constant. The return value can further distinguish the 47782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth /// kind of NULL pointer constant that was detected. 47882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NullPointerConstantKind isNullPointerConstant( 47982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth ASTContext &Ctx, 48082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth NullPointerConstantValueDependence NPC) const; 481efa9b3877ef298bcb792600ac33521827e1f7fafAnders Carlsson 48244baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian /// isOBJCGCCandidate - Return true if this expression may be used in a read/ 4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// write barrier. 484102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian bool isOBJCGCCandidate(ASTContext &Ctx) const; 4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48611ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis /// \brief Returns true if this expression is a bound member function. 48711ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis bool isBoundMemberFunction(ASTContext &Ctx) const; 48811ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis 489864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall /// \brief Given an expression of bound-member type, find the type 490864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall /// of the member. Returns null if this is an *overloaded* bound 491864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall /// member expression. 492864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall static QualType findBoundMemberType(const Expr *expr); 493864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall 494369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /// \brief Result type of CanThrow(). 495369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl enum CanThrowResult { 496369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CT_Cannot, 497369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CT_Dependent, 498369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CT_Can 499369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl }; 500369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /// \brief Test if this expression, if evaluated, might throw, according to 501369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl /// the rules of C++ [expr.unary.noexcept]. 502369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl CanThrowResult CanThrow(ASTContext &C) const; 503369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl 5044e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek /// IgnoreParens - Ignore parentheses. If this Expr is a ParenExpr, return 5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// its subexpression. If that subexpression is also a ParenExpr, 5064e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek /// then this method recursively returns its subexpression, and so forth. 5074e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek /// Otherwise, the method returns the current Expr. 5082b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner Expr *IgnoreParens(); 50956f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner 51056f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner /// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr 51127c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor /// or CastExprs, returning their operand. 51256f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner Expr *IgnoreParenCasts(); 5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5142fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall /// IgnoreParenImpCasts - Ignore parentheses and implicit casts. Strip off any 5152fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall /// ParenExpr or ImplicitCastExprs, returning their operand. 5162fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall Expr *IgnoreParenImpCasts(); 5172fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall 5184d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek const Expr *IgnoreParenImpCasts() const { 5194d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek return const_cast<Expr*>(this)->IgnoreParenImpCasts(); 5204d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek } 521f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 522f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall /// Ignore parentheses and lvalue casts. Strip off any ParenExpr and 523f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall /// CastExprs that represent lvalue casts, returning their operand. 524f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall Expr *IgnoreParenLValueCasts(); 525f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 526f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall const Expr *IgnoreParenLValueCasts() const { 527f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall return const_cast<Expr*>(this)->IgnoreParenLValueCasts(); 528f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall } 5294d3175c1e5a44251ea97b0c81e80f060629d9c08Ted Kremenek 530ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner /// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the 531ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner /// value (including ptr->int casts of the same size). Strip off any 532ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner /// ParenExpr or CastExprs, returning their operand. 533ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner Expr *IgnoreParenNoopCasts(ASTContext &Ctx); 5341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5356eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// \brief Determine whether this expression is a default function argument. 5366eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// 5376eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// Default arguments are implicitly generated in the abstract syntax tree 538c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /// by semantic analysis for function calls, object constructions, etc. in 5396eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes; 5406eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// this routine also looks through any implicit casts to determine whether 5416eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// the expression is a default argument. 5426eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor bool isDefaultArgument() const; 543c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 544558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall /// \brief Determine whether the result of this expression is a 545558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall /// temporary object of the given class type. 546558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const; 5472f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor 54875e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor /// \brief Whether this expression is an implicit reference to 'this' in C++. 54975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor bool isImplicitCXXThis() const; 55075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor 5512b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner const Expr *IgnoreParens() const { 5524e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek return const_cast<Expr*>(this)->IgnoreParens(); 5534e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek } 55456f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner const Expr *IgnoreParenCasts() const { 55556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner return const_cast<Expr*>(this)->IgnoreParenCasts(); 55656f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner } 557ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner const Expr *IgnoreParenNoopCasts(ASTContext &Ctx) const { 558ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner return const_cast<Expr*>(this)->IgnoreParenNoopCasts(Ctx); 559ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner } 5601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 561898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor static bool hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs); 562898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor static bool hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs); 563898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 5641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 5655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return T->getStmtClass() >= firstExprConstant && 5661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T->getStmtClass() <= lastExprConstant; 5675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const Expr *) { return true; } 5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5725549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek//===----------------------------------------------------------------------===// 5735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Primary Expressions. 5745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 5755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 57656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// OpaqueValueExpr - An expression referring to an opaque object of a 57756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// fixed type and value class. These don't correspond to concrete 57856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// syntax; instead they're used to express operations (usually copy 57956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// operations) on values whose source is generally obvious from 58056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// context. 58156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass OpaqueValueExpr : public Expr { 58256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall friend class ASTStmtReader; 58356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *SourceExpr; 58456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation Loc; 58556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 58656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic: 58756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK, 58856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprObjectKind OK = OK_Ordinary) 58956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : Expr(OpaqueValueExprClass, T, VK, OK, 59056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall T->isDependentType(), T->isDependentType(), false), 59156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceExpr(0), Loc(Loc) { 59256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 59356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 59456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// Given an expression which invokes a copy constructor --- i.e. a 59556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// CXXConstructExpr, possibly wrapped in an ExprWithCleanups --- 59656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// find the OpaqueValueExpr that's the source of the construction. 59756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static const OpaqueValueExpr *findInCopyConstruct(const Expr *expr); 59856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 59956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall explicit OpaqueValueExpr(EmptyShell Empty) 60056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : Expr(OpaqueValueExprClass, Empty) { } 60156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 60256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief Retrieve the location of this expression. 60356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation getLocation() const { return Loc; } 60456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 60556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceRange getSourceRange() const { 60656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (SourceExpr) return SourceExpr->getSourceRange(); 60756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return Loc; 60856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 60956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation getExprLoc() const { 61056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (SourceExpr) return SourceExpr->getExprLoc(); 61156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return Loc; 61256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 61356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 61456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall child_range children() { return child_range(); } 61556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 61656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// The source expression of an opaque value expression is the 61756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// expression which originally generated the value. This is 61856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// provided as a convenience for analyses that don't wish to 61956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// precisely model the execution behavior of the program. 62056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// 62156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// The source expression is typically set when building the 62256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// expression which binds the opaque value expression in the first 62356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// place. 62456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getSourceExpr() const { return SourceExpr; } 62556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall void setSourceExpr(Expr *e) { SourceExpr = e; } 62656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 62756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const Stmt *T) { 62856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return T->getStmtClass() == OpaqueValueExprClass; 62956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 63056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const OpaqueValueExpr *) { return true; } 63156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}; 63256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 633a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// \brief Represents an explicit template argument list in C++, e.g., 634a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// the "<int>" in "sort<int>". 635a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregorstruct ExplicitTemplateArgumentList { 636a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief The source location of the left angle bracket ('<'); 637a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation LAngleLoc; 638c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 639a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief The source location of the right angle bracket ('>'); 640a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation RAngleLoc; 641c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 642a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief The number of template arguments in TemplateArgs. 643a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// The actual template arguments (if any) are stored after the 644a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// ExplicitTemplateArgumentList structure. 645a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor unsigned NumTemplateArgs; 646c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 647a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the template arguments 648833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *getTemplateArgs() { 649833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return reinterpret_cast<TemplateArgumentLoc *> (this + 1); 650a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 651c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 652a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the template arguments 653833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *getTemplateArgs() const { 654833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return reinterpret_cast<const TemplateArgumentLoc *> (this + 1); 655a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 656d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 657d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall void initializeFrom(const TemplateArgumentListInfo &List); 658bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor void initializeFrom(const TemplateArgumentListInfo &List, 659bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor bool &Dependent, bool &ContainsUnexpandedParameterPack); 660d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall void copyInto(TemplateArgumentListInfo &List) const; 6618dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis static std::size_t sizeFor(unsigned NumTemplateArgs); 662d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall static std::size_t sizeFor(const TemplateArgumentListInfo &List); 663a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor}; 664cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth 665cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// \brief A reference to a declared variable, function, enum, etc. 666cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// [C99 6.5.1p2] 667cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// 668cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// This encodes all the information about how a declaration is referenced 669cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// within an expression. 670cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// 671cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// There are several optional constructs attached to DeclRefExprs only when 672cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// they apply in order to conserve memory. These are laid out past the end of 673cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// the object, and flags in the DeclRefExprBitfield track whether they exist: 674cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// 675cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// DeclRefExprBits.HasQualifier: 676cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// Specifies when this declaration reference expression has a C++ 677cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// nested-name-specifier. 6783aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth/// DeclRefExprBits.HasFoundDecl: 6793aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth/// Specifies when this declaration reference expression has a record of 6803aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth/// a NamedDecl (different from the referenced ValueDecl) which was found 6813aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth/// during name lookup and/or overload resolution. 682cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// DeclRefExprBits.HasExplicitTemplateArgs: 683cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// Specifies when this declaration reference expression has an explicit 684cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth/// C++ template argument list. 6855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DeclRefExpr : public Expr { 686cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth /// \brief The declaration that we are referencing. 687cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth ValueDecl *D; 6882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 689cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth /// \brief The location of the declaration name itself. 6905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 6919e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 692cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth /// \brief Provides source/type location info for the declaration name 693cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth /// embedded in D. 6942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameLoc DNLoc; 6952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 6966857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth /// \brief Helper to retrieve the optional NestedNameSpecifierLoc. 6976857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth NestedNameSpecifierLoc &getInternalQualifierLoc() { 6987e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth assert(hasQualifier()); 6996857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth return *reinterpret_cast<NestedNameSpecifierLoc *>(this + 1); 700a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 701cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth 7026857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth /// \brief Helper to retrieve the optional NestedNameSpecifierLoc. 7036857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth const NestedNameSpecifierLoc &getInternalQualifierLoc() const { 7046857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth return const_cast<DeclRefExpr *>(this)->getInternalQualifierLoc(); 705a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 706096832c5ed5b9106fa177ebc148489760c3bc496John McCall 7073aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// \brief Test whether there is a distinct FoundDecl attached to the end of 7083aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// this DRE. 7093aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth bool hasFoundDecl() const { return DeclRefExprBits.HasFoundDecl; } 7103aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth 7113aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// \brief Helper to retrieve the optional NamedDecl through which this 7123aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// reference occured. 7133aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth NamedDecl *&getInternalFoundDecl() { 7143aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth assert(hasFoundDecl()); 7153aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (hasQualifier()) 7163aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth return *reinterpret_cast<NamedDecl **>(&getInternalQualifierLoc() + 1); 7173aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth return *reinterpret_cast<NamedDecl **>(this + 1); 7183aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth } 7193aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth 7203aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// \brief Helper to retrieve the optional NamedDecl through which this 7213aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// reference occured. 7223aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth NamedDecl *getInternalFoundDecl() const { 7233aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth return const_cast<DeclRefExpr *>(this)->getInternalFoundDecl(); 7243aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth } 7253aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth 7267e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth DeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 7272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ValueDecl *D, const DeclarationNameInfo &NameInfo, 7283aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth NamedDecl *FoundD, 7292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const TemplateArgumentListInfo *TemplateArgs, 730f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK); 7312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 732663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis /// \brief Construct an empty declaration reference expression. 733663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis explicit DeclRefExpr(EmptyShell Empty) 734663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis : Expr(DeclRefExprClass, Empty) { } 7357e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 7360da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor /// \brief Computes the type- and value-dependence flags for this 7370da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor /// declaration reference expression. 7380da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor void computeDependence(); 7399e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 7405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 741cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth DeclRefExpr(ValueDecl *D, QualType T, ExprValueKind VK, SourceLocation L) 742cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false), 743cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth D(D), Loc(L) { 744cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth DeclRefExprBits.HasQualifier = 0; 745cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth DeclRefExprBits.HasExplicitTemplateArgs = 0; 7463aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth DeclRefExprBits.HasFoundDecl = 0; 7470da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor computeDependence(); 7480da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor } 7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 750a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor static DeclRefExpr *Create(ASTContext &Context, 75140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 752dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall ValueDecl *D, 753a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation NameLoc, 754f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK, 7553aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth NamedDecl *FoundD = 0, 7560da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor const TemplateArgumentListInfo *TemplateArgs = 0); 757663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis 7582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara static DeclRefExpr *Create(ASTContext &Context, 75940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 7602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara ValueDecl *D, 7612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 762f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK, 7633aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth NamedDecl *FoundD = 0, 7642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const TemplateArgumentListInfo *TemplateArgs = 0); 7652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 766663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis /// \brief Construct an empty declaration reference expression. 767663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis static DeclRefExpr *CreateEmpty(ASTContext &Context, 7683aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth bool HasQualifier, 7693aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth bool HasFoundDecl, 770def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor bool HasExplicitTemplateArgs, 771def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor unsigned NumTemplateArgs); 7727e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 773cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth ValueDecl *getDecl() { return D; } 774cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth const ValueDecl *getDecl() const { return D; } 775cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth void setDecl(ValueDecl *NewD) { D = NewD; } 776904eed3f6148758d39a2d3c88f3133274460d645Douglas Gregor 7772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo getNameInfo() const { 7782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(getDecl()->getDeclName(), Loc, DNLoc); 7792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 7802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 7819e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis SourceLocation getLocation() const { return Loc; } 7820b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor void setLocation(SourceLocation L) { Loc = L; } 78363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const; 7841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 785a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Determine whether this declaration reference was preceded by a 786a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// C++ nested-name-specifier, e.g., \c N::foo. 787cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth bool hasQualifier() const { return DeclRefExprBits.HasQualifier; } 7887e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 7897e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth /// \brief If the name was qualified, retrieves the nested-name-specifier 790a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// that precedes the name. Otherwise, returns NULL. 791a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor NestedNameSpecifier *getQualifier() const { 792a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (!hasQualifier()) 793a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return 0; 7947e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 7956857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth return getInternalQualifierLoc().getNestedNameSpecifier(); 796a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 79740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor 7987e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth /// \brief If the name was qualified, retrieves the nested-name-specifier 79940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor /// that precedes the name, with source-location information. 80040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc getQualifierLoc() const { 80140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (!hasQualifier()) 80240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return NestedNameSpecifierLoc(); 8037e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 8046857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth return getInternalQualifierLoc(); 80540d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor } 80640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor 8073aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// \brief Get the NamedDecl through which this reference occured. 8083aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// 8093aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// This Decl may be different from the ValueDecl actually referred to in the 8103aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// presence of using declarations, etc. It always returns non-NULL, and may 8113aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// simple return the ValueDecl when appropriate. 8123aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth NamedDecl *getFoundDecl() { 8133aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth return hasFoundDecl() ? getInternalFoundDecl() : D; 8143aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth } 8153aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth 8163aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// \brief Get the NamedDecl through which this reference occurred. 8173aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth /// See non-const variant. 8183aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth const NamedDecl *getFoundDecl() const { 8193aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth return hasFoundDecl() ? getInternalFoundDecl() : D; 8203aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth } 8213aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth 8227e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth /// \brief Determines whether this declaration reference was followed by an 8237e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth /// explict template argument list. 824096832c5ed5b9106fa177ebc148489760c3bc496John McCall bool hasExplicitTemplateArgs() const { 825cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth return DeclRefExprBits.HasExplicitTemplateArgs; 826096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 8277e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 828096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieve the explicit template argument list that followed the 829096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// member template name. 830096832c5ed5b9106fa177ebc148489760c3bc496John McCall ExplicitTemplateArgumentList &getExplicitTemplateArgs() { 831096832c5ed5b9106fa177ebc148489760c3bc496John McCall assert(hasExplicitTemplateArgs()); 8323aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (hasFoundDecl()) 8333aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth return *reinterpret_cast<ExplicitTemplateArgumentList *>( 8343aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth &getInternalFoundDecl() + 1); 8353aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth 8363aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth if (hasQualifier()) 8373aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth return *reinterpret_cast<ExplicitTemplateArgumentList *>( 8383aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth &getInternalQualifierLoc() + 1); 8397e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 8403aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth return *reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); 841096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 8427e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 843096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieve the explicit template argument list that followed the 844096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// member template name. 845096832c5ed5b9106fa177ebc148489760c3bc496John McCall const ExplicitTemplateArgumentList &getExplicitTemplateArgs() const { 846096832c5ed5b9106fa177ebc148489760c3bc496John McCall return const_cast<DeclRefExpr *>(this)->getExplicitTemplateArgs(); 847a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 848d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 849096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieves the optional explicit template arguments. 850096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// This points to the same data as getExplicitTemplateArgs(), but 851096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// returns null if there are no explicit template arguments. 852096832c5ed5b9106fa177ebc148489760c3bc496John McCall const ExplicitTemplateArgumentList *getExplicitTemplateArgsOpt() const { 853096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) return 0; 854096832c5ed5b9106fa177ebc148489760c3bc496John McCall return &getExplicitTemplateArgs(); 855096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 8567e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 857d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// \brief Copies the template arguments (if present) into the given 858d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// structure. 859d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 860096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (hasExplicitTemplateArgs()) 861096832c5ed5b9106fa177ebc148489760c3bc496John McCall getExplicitTemplateArgs().copyInto(List); 862d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 8637e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 864a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the location of the left angle bracket following the 865a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// member name ('<'), if any. 866a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation getLAngleLoc() const { 867096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) 868a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SourceLocation(); 8697e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 870096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().LAngleLoc; 871a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 8727e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 873a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the template arguments provided as part of this 874a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// template-id. 875833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *getTemplateArgs() const { 876096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) 877a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return 0; 8787e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 879096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().getTemplateArgs(); 880a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 8817e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 882a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the number of template arguments provided as part of this 883a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// template-id. 884a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor unsigned getNumTemplateArgs() const { 885096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) 886a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return 0; 8877e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 888096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().NumTemplateArgs; 889a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 8907e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 891a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// \brief Retrieve the location of the right angle bracket following the 892a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor /// template arguments ('>'). 893a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor SourceLocation getRAngleLoc() const { 894096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) 895a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor return SourceLocation(); 8967e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 897096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().RAngleLoc; 898a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor } 8997e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 9001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 90199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor return T->getStmtClass() == DeclRefExprClass; 9025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 9035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const DeclRefExpr *) { return true; } 9041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 90577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 90663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 9077e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth 90860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 9093397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl friend class ASTStmtWriter; 9105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 9115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 912d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner/// PredefinedExpr - [C99 6.4.2.2] - A predefined identifier such as __func__. 913d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnerclass PredefinedExpr : public Expr { 914227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonpublic: 915227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson enum IdentType { 916227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson Func, 917227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson Function, 918848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson PrettyFunction, 919848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson /// PrettyFunctionNoVirtual - The same as PrettyFunction, except that the 920848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson /// 'virtual' keyword is omitted for virtual member functions. 921848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson PrettyFunctionNoVirtual 922227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson }; 9231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 924227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonprivate: 925227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson SourceLocation Loc; 926227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson IdentType Type; 927227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlssonpublic: 9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PredefinedExpr(SourceLocation l, QualType type, IdentType IT) 929f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(PredefinedExprClass, type, VK_LValue, OK_Ordinary, 930bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor type->isDependentType(), type->isDependentType(), 931bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /*ContainsUnexpandedParameterPack=*/false), 932f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Loc(l), Type(IT) {} 9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 93417fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor /// \brief Construct an empty predefined expression. 9351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit PredefinedExpr(EmptyShell Empty) 93617fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor : Expr(PredefinedExprClass, Empty) { } 93717fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 938227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson IdentType getIdentType() const { return Type; } 93917fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor void setIdentType(IdentType IT) { Type = IT; } 94017fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 94117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor SourceLocation getLocation() const { return Loc; } 94217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor void setLocation(SourceLocation L) { Loc = L; } 94317fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 944848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson static std::string ComputeName(IdentType IT, const Decl *CurrentDecl); 9453a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 94663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(Loc); } 947227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson 9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 9491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == PredefinedExprClass; 950227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson } 951d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner static bool classof(const PredefinedExpr *) { return true; } 9521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 95377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 95463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 955227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson}; 956227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson 9579996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// \brief Used by IntegerLiteral/FloatingLiteral to store the numeric without 9589996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// leaking memory. 9599996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// 9609996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// For large floats/integers, APFloat/APInt will allocate memory from the heap 9619996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// to represent these numbers. Unfortunately, when we use a BumpPtrAllocator 9629996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// to allocate IntegerLiteral/FloatingLiteral nodes the memory associated with 9639996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// the APFloat/APInt values will never get freed. APNumericStorage uses 9649996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis/// ASTContext's allocator for memory allocation. 9659996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisclass APNumericStorage { 9669996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis unsigned BitWidth; 9679996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis union { 9689996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis uint64_t VAL; ///< Used to store the <= 64 bits integer value. 9699996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis uint64_t *pVal; ///< Used to store the >64 bits integer value. 9709996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis }; 9719996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9729996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis bool hasAllocation() const { return llvm::APInt::getNumWords(BitWidth) > 1; } 9739996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9749996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis APNumericStorage(const APNumericStorage&); // do not implement 9759996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis APNumericStorage& operator=(const APNumericStorage&); // do not implement 9769996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9779996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisprotected: 9789996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis APNumericStorage() : BitWidth(0), VAL(0) { } 9799996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9809996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis llvm::APInt getIntValue() const { 9819996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 9829996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis if (NumWords > 1) 9839996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return llvm::APInt(BitWidth, NumWords, pVal); 9849996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis else 9859996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis return llvm::APInt(BitWidth, VAL); 9869996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis } 9879996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis void setIntValue(ASTContext &C, const llvm::APInt &Val); 9889996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}; 9899996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9909996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisclass APIntStorage : public APNumericStorage { 9919996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidispublic: 9929996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis llvm::APInt getValue() const { return getIntValue(); } 9939996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis void setValue(ASTContext &C, const llvm::APInt &Val) { setIntValue(C, Val); } 9949996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}; 9959996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 9969996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisclass APFloatStorage : public APNumericStorage { 9979996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidispublic: 9989996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis llvm::APFloat getValue() const { return llvm::APFloat(getIntValue()); } 9999996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis void setValue(ASTContext &C, const llvm::APFloat &Val) { 10009996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis setIntValue(C, Val.bitcastToAPInt()); 10019996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis } 10029996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}; 10039996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 10045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass IntegerLiteral : public Expr { 10059996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis APIntStorage Num; 10065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 10079996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 10089996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis /// \brief Construct an empty integer literal. 10099996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis explicit IntegerLiteral(EmptyShell Empty) 10109996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis : Expr(IntegerLiteralClass, Empty) { } 10119996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 10125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 10131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy, 10145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // or UnsignedLongLongTy 10159996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis IntegerLiteral(ASTContext &C, const llvm::APInt &V, 10169996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis QualType type, SourceLocation l) 1017bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(IntegerLiteralClass, type, VK_RValue, OK_Ordinary, false, false, 1018bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false), 1019f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Loc(l) { 10205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(type->isIntegerType() && "Illegal type in IntegerLiteral"); 10211dd986dff9ddfbec687975700770bb377988e9edRichard Trieu assert(V.getBitWidth() == C.getIntWidth(type) && 10221dd986dff9ddfbec687975700770bb377988e9edRichard Trieu "Integer type is not the correct size for constant."); 10239996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis setValue(C, V); 10245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1025a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson 10261dd986dff9ddfbec687975700770bb377988e9edRichard Trieu /// \brief Returns a new integer literal with value 'V' and type 'type'. 10271dd986dff9ddfbec687975700770bb377988e9edRichard Trieu /// \param type - either IntTy, LongTy, LongLongTy, UnsignedIntTy, 10281dd986dff9ddfbec687975700770bb377988e9edRichard Trieu /// UnsignedLongTy, or UnsignedLongLongTy which should match the size of V 10291dd986dff9ddfbec687975700770bb377988e9edRichard Trieu /// \param V - the value that the returned integer literal contains. 10309996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis static IntegerLiteral *Create(ASTContext &C, const llvm::APInt &V, 10319996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis QualType type, SourceLocation l); 10321dd986dff9ddfbec687975700770bb377988e9edRichard Trieu /// \brief Returns a new empty integer literal. 10339996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis static IntegerLiteral *Create(ASTContext &C, EmptyShell Empty); 10340b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 10359996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis llvm::APInt getValue() const { return Num.getValue(); } 103663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(Loc); } 10375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1038313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor /// \brief Retrieve the location of the literal. 1039313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor SourceLocation getLocation() const { return Loc; } 1040313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor 10419996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis void setValue(ASTContext &C, const llvm::APInt &Val) { Num.setValue(C, Val); } 10420b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor void setLocation(SourceLocation Location) { Loc = Location; } 10430b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 10451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == IntegerLiteralClass; 10465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const IntegerLiteral *) { return true; } 10481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 104977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 105063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 10515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 10525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CharacterLiteral : public Expr { 10545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned Value; 10555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 1056c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner bool IsWide; 10575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 10585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // type should be IntTy 1059c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner CharacterLiteral(unsigned value, bool iswide, QualType type, SourceLocation l) 1060bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(CharacterLiteralClass, type, VK_RValue, OK_Ordinary, false, false, 1061bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false), 1062f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Value(value), Loc(l), IsWide(iswide) { 10635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10640b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 10650b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor /// \brief Construct an empty character literal. 10660b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { } 10670b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 1068018d8e0596dd57401eeddcf11ac84ff0a065fbbeChris Lattner SourceLocation getLocation() const { return Loc; } 1069c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner bool isWide() const { return IsWide; } 10701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 107163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(Loc); } 10721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getValue() const { return Value; } 10745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10750b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor void setLocation(SourceLocation Location) { Loc = Location; } 10760b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor void setWide(bool W) { IsWide = W; } 10770b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor void setValue(unsigned Val) { Value = Val; } 10780b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 10791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 10801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == CharacterLiteralClass; 10815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const CharacterLiteral *) { return true; } 108377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 108477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 108563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 10865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 10875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass FloatingLiteral : public Expr { 10899996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis APFloatStorage Num; 1090720c4ec57b6110873cd533ad434853a27e7c3f4aTed Kremenek bool IsExact : 1; 10915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 10929996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 10939996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis FloatingLiteral(ASTContext &C, const llvm::APFloat &V, bool isexact, 1094720c4ec57b6110873cd533ad434853a27e7c3f4aTed Kremenek QualType Type, SourceLocation L) 1095bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(FloatingLiteralClass, Type, VK_RValue, OK_Ordinary, false, false, 1096bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false), 10979996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis IsExact(isexact), Loc(L) { 10989996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis setValue(C, V); 10999996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis } 11005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 110117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor /// \brief Construct an empty floating-point literal. 11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit FloatingLiteral(EmptyShell Empty) 11039996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis : Expr(FloatingLiteralClass, Empty), IsExact(false) { } 110417fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 11059996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidispublic: 11069996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis static FloatingLiteral *Create(ASTContext &C, const llvm::APFloat &V, 11079996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis bool isexact, QualType Type, SourceLocation L); 11089996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis static FloatingLiteral *Create(ASTContext &C, EmptyShell Empty); 11099996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis 11109996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis llvm::APFloat getValue() const { return Num.getValue(); } 11119996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis void setValue(ASTContext &C, const llvm::APFloat &Val) { 11129996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis Num.setValue(C, Val); 11139996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis } 111417fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 1115720c4ec57b6110873cd533ad434853a27e7c3f4aTed Kremenek bool isExact() const { return IsExact; } 111617fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor void setExact(bool E) { IsExact = E; } 1117c9bec4bfea9090a08dd83a7b213f0c8adf8d78ecChris Lattner 1118da8249e57f3badecf925571881fe57243935c6c1Chris Lattner /// getValueAsApproximateDouble - This returns the value as an inaccurate 1119da8249e57f3badecf925571881fe57243935c6c1Chris Lattner /// double. Note that this may cause loss of precision, but is useful for 1120da8249e57f3badecf925571881fe57243935c6c1Chris Lattner /// debugging dumps, etc. 1121da8249e57f3badecf925571881fe57243935c6c1Chris Lattner double getValueAsApproximateDouble() const; 11221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 112317fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor SourceLocation getLocation() const { return Loc; } 112417fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor void setLocation(SourceLocation L) { Loc = L; } 112517fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 112663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(Loc); } 11275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 11281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 11291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == FloatingLiteralClass; 11305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 11315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const FloatingLiteral *) { return true; } 11321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 113377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 113463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 11355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 11365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 11375d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// ImaginaryLiteral - We support imaginary integer and floating point literals, 11385d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// like "1.0i". We represent these as a wrapper around FloatingLiteral and 11395d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// IntegerLiteral classes. Instances of this class always have a Complex type 11405d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// whose element type matches the subexpression. 11415d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner/// 11425d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnerclass ImaginaryLiteral : public Expr { 11435549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *Val; 11445d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnerpublic: 11455d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner ImaginaryLiteral(Expr *val, QualType Ty) 1146bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(ImaginaryLiteralClass, Ty, VK_RValue, OK_Ordinary, false, false, 1147bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false), 1148f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Val(val) {} 11491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1150cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor /// \brief Build an empty imaginary literal. 11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit ImaginaryLiteral(EmptyShell Empty) 1152cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor : Expr(ImaginaryLiteralClass, Empty) { } 1153cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor 11545549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getSubExpr() const { return cast<Expr>(Val); } 11555549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getSubExpr() { return cast<Expr>(Val); } 1156cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor void setSubExpr(Expr *E) { Val = E; } 1157cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor 115863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return Val->getSourceRange(); } 11591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 11601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ImaginaryLiteralClass; 11615d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner } 11625d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner static bool classof(const ImaginaryLiteral *) { return true; } 11631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11645d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner // Iterators 116563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Val, &Val+1); } 11665d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner}; 11675d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 1168e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek/// StringLiteral - This represents a string literal expression, e.g. "foo" 1169e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek/// or L"bar" (wide strings). The actual string is returned by getStrData() 1170e6a82b2c29ad05534841e5f8fd033fb17b6f61e2Ted Kremenek/// is NOT null-terminated, and the length of the string is determined by 1171a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner/// calling getByteLength(). The C type for a string is always a 1172c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// ConstantArrayType. In C++, the char type is const qualified, in C it is 1173c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// not. 1174690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner/// 1175690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner/// Note that strings in C can be formed by concatenation of multiple string 11768bea7c0ee44c71c817de7dc2be932b73bec90c9fChris Lattner/// literal pptokens in translation phase #6. This keeps track of the locations 1177690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner/// of each of these pieces. 1178c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// 1179c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// Strings in C can also be truncated and extended by assigning into arrays, 1180c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// e.g. with constructs like: 1181c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// char X[2] = "foobar"; 1182c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// In this case, getByteLength() will return 6, but the string literal will 1183c4a09c189981b4561428e4b56fd250718e2717bbChris Lattner/// have type "char[2]". 11845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass StringLiteral : public Expr { 11853e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson friend class ASTStmtReader; 11863e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson 11875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *StrData; 11885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned ByteLength; 11895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool IsWide; 11903e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson bool IsPascal; 1191726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner unsigned NumConcatenated; 1192726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner SourceLocation TokLocs[1]; 11932085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner 1194f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall StringLiteral(QualType Ty) : 1195bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Expr(StringLiteralClass, Ty, VK_LValue, OK_Ordinary, false, false, false) {} 11961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 11982085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner /// This is the "fully general" constructor that allows representation of 11992085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner /// strings formed from multiple concatenated tokens. 12002085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner static StringLiteral *Create(ASTContext &C, const char *StrData, 12013e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson unsigned ByteLength, bool Wide, bool Pascal, 12023e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson QualType Ty, 1203a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson const SourceLocation *Loc, unsigned NumStrs); 12042085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner 12052085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner /// Simple constructor for string literals made from one token. 12061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static StringLiteral *Create(ASTContext &C, const char *StrData, 12073e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson unsigned ByteLength, bool Wide, 12083e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson bool Pascal, QualType Ty, SourceLocation Loc) { 12093e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson return Create(C, StrData, ByteLength, Wide, Pascal, Ty, &Loc, 1); 12102085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner } 1211a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson 1212673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor /// \brief Construct an empty string literal. 1213673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor static StringLiteral *CreateEmpty(ASTContext &C, unsigned NumStrs); 1214673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 1215b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar llvm::StringRef getString() const { 1216b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar return llvm::StringRef(StrData, ByteLength); 1217b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar } 12182f4eaef37476ae6891ede8ba215d0f6fd093629bBenjamin Kramer 12195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getByteLength() const { return ByteLength; } 1220673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 1221673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor /// \brief Sets the string data to the given string data. 1222b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar void setString(ASTContext &C, llvm::StringRef Str); 1223673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 12245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isWide() const { return IsWide; } 12253e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson bool isPascal() const { return IsPascal; } 12263e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson 12278d4141f83d9de379547cf05bd75d4c6cf894b189Steve Naroff bool containsNonAsciiOrNull() const { 1228b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar llvm::StringRef Str = getString(); 1229b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar for (unsigned i = 0, e = Str.size(); i != e; ++i) 1230b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar if (!isascii(Str[i]) || !Str[i]) 123133fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff return true; 123233fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff return false; 123333fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff } 1234726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner /// getNumConcatenated - Get the number of string literal tokens that were 1235726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner /// concatenated in translation phase #6 to form this string literal. 1236726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner unsigned getNumConcatenated() const { return NumConcatenated; } 12371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1238726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner SourceLocation getStrTokenLoc(unsigned TokNum) const { 1239726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner assert(TokNum < NumConcatenated && "Invalid tok number"); 1240726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner return TokLocs[TokNum]; 1241726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner } 12421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void setStrTokenLoc(unsigned TokNum, SourceLocation L) { 1243673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor assert(TokNum < NumConcatenated && "Invalid tok number"); 1244673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor TokLocs[TokNum] = L; 1245673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor } 124608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner 124708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// getLocationOfByte - Return a source location that points to the specified 124808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// byte of this string literal. 124908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// 125008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// Strings are amazingly complex. They can be formed from multiple tokens 125108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// and can have escape sequences in them in addition to the usual trigraph 125208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// and escaped newline business. This routine handles this complexity. 125308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner /// 125408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner SourceLocation getLocationOfByte(unsigned ByteNo, const SourceManager &SM, 125508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner const LangOptions &Features, 125608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner const TargetInfo &Target) const; 1257673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor 1258b137299ce5bb6c36fbba651858600857fda4dd50Chris Lattner typedef const SourceLocation *tokloc_iterator; 1259b137299ce5bb6c36fbba651858600857fda4dd50Chris Lattner tokloc_iterator tokloc_begin() const { return TokLocs; } 1260b137299ce5bb6c36fbba651858600857fda4dd50Chris Lattner tokloc_iterator tokloc_end() const { return TokLocs+NumConcatenated; } 12615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 126263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 12631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SourceRange(TokLocs[0], TokLocs[NumConcatenated-1]); 12645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 12651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 12661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == StringLiteralClass; 12675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 12685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const StringLiteral *) { return true; } 12691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 127077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 127163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 12725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 12735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 12745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ParenExpr - This represents a parethesized expression, e.g. "(1)". This 12755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// AST node is only formed if full location information is requested. 12765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ParenExpr : public Expr { 12775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation L, R; 12785549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *Val; 12795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 12805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ParenExpr(SourceLocation l, SourceLocation r, Expr *val) 1281898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor : Expr(ParenExprClass, val->getType(), 1282f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall val->getValueKind(), val->getObjectKind(), 1283bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor val->isTypeDependent(), val->isValueDependent(), 1284bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor val->containsUnexpandedParameterPack()), 1285898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor L(l), R(r), Val(val) {} 12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1287c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor /// \brief Construct an empty parenthesized expression. 12881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit ParenExpr(EmptyShell Empty) 1289c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor : Expr(ParenExprClass, Empty) { } 1290c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor 12915549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getSubExpr() const { return cast<Expr>(Val); } 12925549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getSubExpr() { return cast<Expr>(Val); } 1293c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor void setSubExpr(Expr *E) { Val = E; } 1294c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor 129563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(L, R); } 12965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1297313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor /// \brief Get the location of the left parentheses '('. 1298313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor SourceLocation getLParen() const { return L; } 1299c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor void setLParen(SourceLocation Loc) { L = Loc; } 1300313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor 1301313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor /// \brief Get the location of the right parentheses ')'. 1302313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor SourceLocation getRParen() const { return R; } 1303c04db4feefa2b0dbbc6876cb4eeeee108aa6791dDouglas Gregor void setRParen(SourceLocation Loc) { R = Loc; } 1304313a81dd820c9b2c0203bdcd974c781a81e4f0cfDouglas Gregor 13051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 13061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ParenExprClass; 13075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 13085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const ParenExpr *) { return true; } 13091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 131077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 131163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Val, &Val+1); } 13125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 13135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 13145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 13150518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// UnaryOperator - This represents the unary-expression's (except sizeof and 13160518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// alignof), the postinc/postdec operators from postfix-expression, and various 13175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// extensions. 1318dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// 1319dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// Notes on various nodes: 1320dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// 1321dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// Real/Imag - These return the real/imag part of a complex operand. If 1322dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// applied to a non-complex value, the former returns its operand and the 1323dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// later returns zero in the type of the operand. 1324dbb36971c68ea944ac4b1fbe2d97fe7cca3b20acChris Lattner/// 13255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass UnaryOperator : public Expr { 13265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 13275baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall typedef UnaryOperatorKind Opcode; 13285baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall 13295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate: 13300799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall unsigned Opc : 5; 13315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Loc; 13320799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall Stmt *Val; 13331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 13345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1335f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall UnaryOperator(Expr *input, Opcode opc, QualType type, 1336f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK, SourceLocation l) 1337f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(UnaryOperatorClass, type, VK, OK, 1338de7e66256b1bdfcf6526994825a8c8fced52a31cEli Friedman input->isTypeDependent() || type->isDependentType(), 1339bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor input->isValueDependent(), 1340bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor input->containsUnexpandedParameterPack()), 13410799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall Opc(opc), Loc(l), Val(input) {} 13425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 13430b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor /// \brief Build an empty unary operator. 13441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit UnaryOperator(EmptyShell Empty) 13452de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall : Expr(UnaryOperatorClass, Empty), Opc(UO_AddrOf) { } 13460b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 13470799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall Opcode getOpcode() const { return static_cast<Opcode>(Opc); } 13480b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setOpcode(Opcode O) { Opc = O; } 13490b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 13505549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getSubExpr() const { return cast<Expr>(Val); } 13510b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setSubExpr(Expr *E) { Val = E; } 13520b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 13535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getOperatorLoc - Return the location of the operator. 13545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation getOperatorLoc() const { return Loc; } 13550b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setOperatorLoc(SourceLocation L) { Loc = L; } 13560b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 13575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// isPostfix - Return true if this is a postfix operation, like x++. 13582085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner static bool isPostfix(Opcode Op) { 13592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall return Op == UO_PostInc || Op == UO_PostDec; 13602085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner } 13615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1362cc7bd10c0de9449b795bda3c5dcc6d83cc48436bZhanyong Wan /// isPrefix - Return true if this is a prefix operation, like --x. 13632085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner static bool isPrefix(Opcode Op) { 13642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall return Op == UO_PreInc || Op == UO_PreDec; 13652085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner } 13665a56ac30d04e8f0431a08980885662a47a6308aaTed Kremenek 13670799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isPrefix() const { return isPrefix(getOpcode()); } 13680799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isPostfix() const { return isPostfix(getOpcode()); } 13692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall bool isIncrementOp() const { 1370993cdca0fed7deb646e4654dfb2607227a497faaBenjamin Kramer return Opc == UO_PreInc || Opc == UO_PostInc; 13712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall } 13722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall bool isIncrementDecrementOp() const { 1373993cdca0fed7deb646e4654dfb2607227a497faaBenjamin Kramer return Opc <= UO_PreDec; 13742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall } 13752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isArithmeticOp(Opcode Op) { 13762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall return Op >= UO_Plus && Op <= UO_LNot; 13772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall } 13780799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isArithmeticOp() const { return isArithmeticOp(getOpcode()); } 13791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 13815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// corresponds to, e.g. "sizeof" or "[pre]++" 13825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static const char *getOpcodeStr(Opcode Op); 13835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1384bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor /// \brief Retrieve the unary opcode that corresponds to the given 1385bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor /// overloaded operator. 1386bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix); 1387bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 1388bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor /// \brief Retrieve the overloaded operator kind that corresponds to 1389bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor /// the given unary opcode. 1390bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); 1391bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor 139263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 13935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (isPostfix()) 13945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return SourceRange(Val->getLocStart(), Loc); 13955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 13965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return SourceRange(Loc, Val->getLocEnd()); 13975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 139863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceLocation getExprLoc() const { return Loc; } 13991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 14011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == UnaryOperatorClass; 14025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 14035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const UnaryOperator *) { return true; } 14041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 140577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 140663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Val, &Val+1); } 14075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 14085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 14098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// OffsetOfExpr - [C99 7.17] - This represents an expression of the form 14108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// offsetof(record-type, member-designator). For example, given: 14118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// @code 14128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// struct S { 14138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// float f; 1414c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt/// double d; 14158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// }; 14168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// struct T { 14178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// int i; 14188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// struct S s[10]; 14198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// }; 14208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor/// @endcode 1421c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt/// we can represent and evaluate the expression @c offsetof(struct T, s[2].d). 14228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 14238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorclass OffsetOfExpr : public Expr { 14248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorpublic: 14258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // __builtin_offsetof(type, identifier(.identifier|[expr])*) 14268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor class OffsetOfNode { 14278ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor public: 14288ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief The kind of offsetof node we have. 14298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor enum Kind { 1430cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief An index into an array. 14318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Array = 0x00, 1432cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief A field. 14338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Field = 0x01, 1434cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief A field in a dependent type, known only by its name. 1435cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor Identifier = 0x02, 1436cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief An implicit indirection through a C++ base class, when the 1437cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// field found is in a base class. 1438cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor Base = 0x03 14398ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor }; 14408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 14418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor private: 14428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor enum { MaskBits = 2, Mask = 0x03 }; 1443c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief The source range that covers this part of the designator. 14458ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceRange Range; 1446c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief The data describing the designator, which comes in three 14488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// different forms, depending on the lower two bits. 1449c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /// - An unsigned index into the array of Expr*'s stored after this node 14508ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// in memory, for [constant-expression] designators. 14518ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// - A FieldDecl*, for references to a known field. 14528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// - An IdentifierInfo*, for references to a field with a given name 14538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// when the class type is dependent. 1454c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /// - A CXXBaseSpecifier*, for references that look at a field in a 1455cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// base class. 14568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor uintptr_t Data; 1457c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor public: 14598ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Create an offsetof node that refers to an array element. 1460c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfNode(SourceLocation LBracketLoc, unsigned Index, 14618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation RBracketLoc) 14628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor : Range(LBracketLoc, RBracketLoc), Data((Index << 2) | Array) { } 1463c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Create an offsetof node that refers to a field. 1465c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfNode(SourceLocation DotLoc, FieldDecl *Field, 14668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation NameLoc) 1467c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt : Range(DotLoc.isValid()? DotLoc : NameLoc, NameLoc), 14688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Data(reinterpret_cast<uintptr_t>(Field) | OffsetOfNode::Field) { } 1469c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Create an offsetof node that refers to an identifier. 14718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OffsetOfNode(SourceLocation DotLoc, IdentifierInfo *Name, 14728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation NameLoc) 1473c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt : Range(DotLoc.isValid()? DotLoc : NameLoc, NameLoc), 14748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Data(reinterpret_cast<uintptr_t>(Name) | Identifier) { } 1475cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 1476cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief Create an offsetof node that refers into a C++ base class. 1477cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor explicit OffsetOfNode(const CXXBaseSpecifier *Base) 1478cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor : Range(), Data(reinterpret_cast<uintptr_t>(Base) | OffsetOfNode::Base) {} 1479c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Determine what kind of offsetof node this is. 1481c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt Kind getKind() const { 14828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return static_cast<Kind>(Data & Mask); 14838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1484c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief For an array element node, returns the index into the array 14868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// of expressions. 14878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned getArrayExprIndex() const { 14888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(getKind() == Array); 14898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return Data >> 2; 14908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 14918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 14928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief For a field offsetof node, returns the field. 14938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor FieldDecl *getField() const { 14948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(getKind() == Field); 1495cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor return reinterpret_cast<FieldDecl *>(Data & ~(uintptr_t)Mask); 14968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1497c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 14988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief For a field or identifier offsetof node, returns the name of 14998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// the field. 15008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor IdentifierInfo *getFieldName() const; 1501c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1502cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor /// \brief For a base class node, returns the base specifier. 1503cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor CXXBaseSpecifier *getBase() const { 1504cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor assert(getKind() == Base); 1505c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt return reinterpret_cast<CXXBaseSpecifier *>(Data & ~(uintptr_t)Mask); 1506cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor } 1507c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 15088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Retrieve the source range that covers this offsetof node. 15098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// 15108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// For an array element node, the source range contains the locations of 15118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// the square brackets. For a field or identifier node, the source range 1512c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt /// contains the location of the period (if there is one) and the 15138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// identifier. 151406dec892b5300b43263d25c5476b506c9d6cfbadAbramo Bagnara SourceRange getSourceRange() const { return Range; } 15158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor }; 15168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorprivate: 1518c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 15198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation OperatorLoc, RParenLoc; 15208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Base type; 15218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TypeSourceInfo *TSInfo; 15228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Number of sub-components (i.e. instances of OffsetOfNode). 15238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned NumComps; 15248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Number of sub-expressions (i.e. array subscript expressions). 15258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned NumExprs; 1526c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1527c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfExpr(ASTContext &C, QualType type, 15288ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation OperatorLoc, TypeSourceInfo *tsi, 1529c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfNode* compsPtr, unsigned numComps, 15308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr** exprsPtr, unsigned numExprs, 15318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation RParenLoc); 15328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor explicit OffsetOfExpr(unsigned numComps, unsigned numExprs) 15348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor : Expr(OffsetOfExprClass, EmptyShell()), 1535c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt TSInfo(0), NumComps(numComps), NumExprs(numExprs) {} 15368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorpublic: 1538c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 1539c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt static OffsetOfExpr *Create(ASTContext &C, QualType type, 1540c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt SourceLocation OperatorLoc, TypeSourceInfo *tsi, 1541c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OffsetOfNode* compsPtr, unsigned numComps, 15428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr** exprsPtr, unsigned numExprs, 15438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation RParenLoc); 15448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 1545c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt static OffsetOfExpr *CreateEmpty(ASTContext &C, 15468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned NumComps, unsigned NumExprs); 15478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// getOperatorLoc - Return the location of the operator. 15498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation getOperatorLoc() const { return OperatorLoc; } 15508ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void setOperatorLoc(SourceLocation L) { OperatorLoc = L; } 15518ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor /// \brief Return the location of the right parentheses. 15538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 15548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void setRParenLoc(SourceLocation R) { RParenLoc = R; } 1555c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 15568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TypeSourceInfo *getTypeSourceInfo() const { 15578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return TSInfo; 15588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15598ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void setTypeSourceInfo(TypeSourceInfo *tsi) { 15608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor TSInfo = tsi; 15618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1562c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 15638cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const OffsetOfNode &getComponent(unsigned Idx) const { 15648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(Idx < NumComps && "Subscript out of range"); 15658cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return reinterpret_cast<const OffsetOfNode *> (this + 1)[Idx]; 15668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void setComponent(unsigned Idx, OffsetOfNode ON) { 15698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(Idx < NumComps && "Subscript out of range"); 15708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor reinterpret_cast<OffsetOfNode *> (this + 1)[Idx] = ON; 15718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1572c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 15738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned getNumComponents() const { 15748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return NumComps; 15758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor Expr* getIndexExpr(unsigned Idx) { 15788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(Idx < NumExprs && "Subscript out of range"); 15798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return reinterpret_cast<Expr **>( 15808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor reinterpret_cast<OffsetOfNode *>(this+1) + NumComps)[Idx]; 15818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15828cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr *getIndexExpr(unsigned Idx) const { 15838cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return const_cast<OffsetOfExpr*>(this)->getIndexExpr(Idx); 15848cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 15858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 15868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor void setIndexExpr(unsigned Idx, Expr* E) { 15878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor assert(Idx < NumComps && "Subscript out of range"); 15888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor reinterpret_cast<Expr **>( 15898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor reinterpret_cast<OffsetOfNode *>(this+1) + NumComps)[Idx] = E; 15908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1591c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 15928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor unsigned getNumExpressions() const { 15938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return NumExprs; 15948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 159663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 15978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return SourceRange(OperatorLoc, RParenLoc); 15988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 15998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 16008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor static bool classof(const Stmt *T) { 16018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor return T->getStmtClass() == OffsetOfExprClass; 16028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 16038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 16048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor static bool classof(const OffsetOfExpr *) { return true; } 16058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 16068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Iterators 160763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 160863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall Stmt **begin = 160963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall reinterpret_cast<Stmt**>(reinterpret_cast<OffsetOfNode*>(this + 1) 161063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall + NumComps); 161163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(begin, begin + NumExprs); 161263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 16138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}; 16148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 1615f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) 1616f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// expression operand. Used for sizeof/alignof (C99 6.5.3.4) and 1617f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne/// vec_step (OpenCL 1.1 6.11.12). 1618f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourneclass UnaryExprOrTypeTraitExpr : public Expr { 1619f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne unsigned Kind : 2; 16200518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool isType : 1; // true if operand is a type, false if an expression 1621d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl union { 1622a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *Ty; 1623d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl Stmt *Ex; 1624d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl } Argument; 16255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation OpLoc, RParenLoc; 162642602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregor 16275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 1628f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo, 1629f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne QualType resultType, SourceLocation op, 1630f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne SourceLocation rp) : 1631f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_RValue, OK_Ordinary, 1632ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor false, // Never type-dependent (C++ [temp.dep.expr]p3). 16332850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl // Value-dependent if the argument is type-dependent. 1634bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor TInfo->getType()->isDependentType(), 1635bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor TInfo->getType()->containsUnexpandedParameterPack()), 1636f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne Kind(ExprKind), isType(true), OpLoc(op), RParenLoc(rp) { 1637a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall Argument.Ty = TInfo; 1638ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor } 1639ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor 1640f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, Expr *E, 1641f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne QualType resultType, SourceLocation op, 1642f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne SourceLocation rp) : 1643f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_RValue, OK_Ordinary, 1644ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor false, // Never type-dependent (C++ [temp.dep.expr]p3). 1645ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor // Value-dependent if the argument is type-dependent. 1646bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor E->isTypeDependent(), 1647bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor E->containsUnexpandedParameterPack()), 1648f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne Kind(ExprKind), isType(false), OpLoc(op), RParenLoc(rp) { 1649ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor Argument.Ex = E; 1650d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl } 16510518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 16520b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor /// \brief Construct an empty sizeof/alignof expression. 1653f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne explicit UnaryExprOrTypeTraitExpr(EmptyShell Empty) 1654f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne : Expr(UnaryExprOrTypeTraitExprClass, Empty) { } 16550b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 1656f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne UnaryExprOrTypeTrait getKind() const { 1657f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return static_cast<UnaryExprOrTypeTrait>(Kind); 1658f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 1659f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne void setKind(UnaryExprOrTypeTrait K) { Kind = K; } 16600b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 16610518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool isArgumentType() const { return isType; } 16620518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType getArgumentType() const { 16635ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return getArgumentTypeInfo()->getType(); 16645ab75172051a6d2ea71a80a79e81c65519fd3462John McCall } 1665a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *getArgumentTypeInfo() const { 16660518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl assert(isArgumentType() && "calling getArgumentType() when arg is expr"); 16675ab75172051a6d2ea71a80a79e81c65519fd3462John McCall return Argument.Ty; 16680518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 1669caae7b099a0324b7c15dc89a9b70969d5d7ce996Chris Lattner Expr *getArgumentExpr() { 16700518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl assert(!isArgumentType() && "calling getArgumentExpr() when arg is type"); 1671d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl return static_cast<Expr*>(Argument.Ex); 16720518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 1673caae7b099a0324b7c15dc89a9b70969d5d7ce996Chris Lattner const Expr *getArgumentExpr() const { 1674f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return const_cast<UnaryExprOrTypeTraitExpr*>(this)->getArgumentExpr(); 1675caae7b099a0324b7c15dc89a9b70969d5d7ce996Chris Lattner } 16760b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 16770b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setArgument(Expr *E) { Argument.Ex = E; isType = false; } 1678a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall void setArgument(TypeSourceInfo *TInfo) { 1679a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall Argument.Ty = TInfo; 16801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump isType = true; 16810b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor } 16820b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 16830518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl /// Gets the argument type, or the type of the argument expression, whichever 16840518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl /// is appropriate. 16850518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType getTypeOfArgument() const { 16860518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl return isArgumentType() ? getArgumentType() : getArgumentExpr()->getType(); 16870518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 16880518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 168976e773a443be9f006610f46529e07d4c8d857680Chris Lattner SourceLocation getOperatorLoc() const { return OpLoc; } 16900b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setOperatorLoc(SourceLocation L) { OpLoc = L; } 16910b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor 16920b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 16930b0b77fa29c74c99a77548ed86ca8a04f7cf6b02Douglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 1694866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek 169563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 1696866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek return SourceRange(OpLoc, RParenLoc); 1697866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek } 16985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 1700f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne return T->getStmtClass() == UnaryExprOrTypeTraitExprClass; 17015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1702f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne static bool classof(const UnaryExprOrTypeTraitExpr *) { return true; } 17031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 170477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 170563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children(); 17065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 17075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 17095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Postfix Operators. 17105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 17115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting. 17135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ArraySubscriptExpr : public Expr { 171477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek enum { LHS, RHS, END_EXPR=2 }; 17151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Stmt* SubExprs[END_EXPR]; 17165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation RBracketLoc; 17175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 17182324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t, 1719f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK, 172073d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner SourceLocation rbracketloc) 1721f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(ArraySubscriptExprClass, t, VK, OK, 17222850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl lhs->isTypeDependent() || rhs->isTypeDependent(), 1723bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor lhs->isValueDependent() || rhs->isValueDependent(), 1724bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (lhs->containsUnexpandedParameterPack() || 1725bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor rhs->containsUnexpandedParameterPack())), 17262850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl RBracketLoc(rbracketloc) { 172773d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner SubExprs[LHS] = lhs; 172873d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner SubExprs[RHS] = rhs; 172973d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner } 17301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1731cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor /// \brief Create an empty array subscript expression. 1732cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor explicit ArraySubscriptExpr(EmptyShell Shell) 1733cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor : Expr(ArraySubscriptExprClass, Shell) { } 1734cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor 17352324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek /// An array access can be written A[4] or 4[A] (both are equivalent). 17362324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek /// - getBase() and getIdx() always present the normalized view: A[4]. 17372324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek /// In this case getBase() returns "A" and getIdx() returns "4". 17382324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek /// - getLHS() and getRHS() present the syntactic view. e.g. for 17392324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek /// 4[A] getLHS() returns "4". 174033fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb /// Note: Because vector element access is also written A[4] we must 174133fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb /// predicate the format conversion in getBase and getIdx only on the 174233fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb /// the type of the RHS, as it is possible for the LHS to be a vector of 174333fd5c124aac15bab7cad95e4e0e7761356d2c06Christopher Lamb /// integer type 17445549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); } 17455549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 1746cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor void setLHS(Expr *E) { SubExprs[LHS] = E; } 1747cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor 17485549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); } 17495549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 1750cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor void setRHS(Expr *E) { SubExprs[RHS] = E; } 17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *getBase() { 17535549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS()); 175477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek } 17551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Expr *getBase() const { 17575549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS()); 17582324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek } 17591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *getIdx() { 17615549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS()); 17622324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek } 17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 176477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek const Expr *getIdx() const { 17655549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS()); 17661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 176863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 176977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek return SourceRange(getLHS()->getLocStart(), RBracketLoc); 17705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1772026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner SourceLocation getRBracketLoc() const { return RBracketLoc; } 1773cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor void setRBracketLoc(SourceLocation L) { RBracketLoc = L; } 1774cb2ca73c1d7e76cc1358ce51457d2d5837d84f9bDouglas Gregor 177563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceLocation getExprLoc() const { return getBase()->getExprLoc(); } 17765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 17781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ArraySubscriptExprClass; 17795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 17805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const ArraySubscriptExpr *) { return true; } 17811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 178277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 178363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 178463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 178563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 17865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 17875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1789b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]). 17901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CallExpr itself represents a normal function call, e.g., "f(x, 2)", 1791b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// while its subclasses may represent alternative syntax that (semantically) 17921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// results in a function call. For example, CXXOperatorCallExpr is 1793b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// a subclass for overloaded operator calls that use operator syntax, e.g., 1794b4609806e9232593ece09ce08b630836e825865cDouglas Gregor/// "str1 + str2" to resolve to a function call. 17955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CallExpr : public Expr { 1796cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne enum { FN=0, PREARGS_START=1 }; 17975549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt **SubExprs; 17985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumArgs; 17995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation RParenLoc; 18001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1801b4609806e9232593ece09ce08b630836e825865cDouglas Gregorprotected: 1802cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne // These versions of the constructor are for derived classes. 1803cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne CallExpr(ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs, 1804cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne Expr **args, unsigned numargs, QualType t, ExprValueKind VK, 1805cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne SourceLocation rparenloc); 1806cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne CallExpr(ASTContext &C, StmtClass SC, unsigned NumPreArgs, EmptyShell Empty); 1807cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne 1808cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne Stmt *getPreArg(unsigned i) { 1809cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne assert(i < getNumPreArgs() && "Prearg access out of range!"); 1810cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return SubExprs[PREARGS_START+i]; 1811cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1812cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne const Stmt *getPreArg(unsigned i) const { 1813cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne assert(i < getNumPreArgs() && "Prearg access out of range!"); 1814cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return SubExprs[PREARGS_START+i]; 1815cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1816cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne void setPreArg(unsigned i, Stmt *PreArg) { 1817cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne assert(i < getNumPreArgs() && "Prearg access out of range!"); 1818cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne SubExprs[PREARGS_START+i] = PreArg; 1819cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1820cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne 1821cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne unsigned getNumPreArgs() const { return CallExprBits.NumPreArgs; } 182242602bb40aefcc2751d4078ba88aacf4d965c9bdDouglas Gregor 18235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 18241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs, QualType t, 1825f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, SourceLocation rparenloc); 18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18271f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor /// \brief Build an empty call expression. 1828ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty); 18291f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor 18305549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getCallee() const { return cast<Expr>(SubExprs[FN]); } 18315549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getCallee() { return cast<Expr>(SubExprs[FN]); } 183218b2515e1bf8c86a4900792692e42fe1296be28dChris Lattner void setCallee(Expr *F) { SubExprs[FN] = F; } 1833a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu 1834d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes Decl *getCalleeDecl(); 1835d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes const Decl *getCalleeDecl() const { 1836d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes return const_cast<CallExpr*>(this)->getCalleeDecl(); 1837d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes } 1838d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes 1839a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu /// \brief If the callee is a FunctionDecl, return it. Otherwise return 0. 1840a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu FunctionDecl *getDirectCallee(); 1841bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner const FunctionDecl *getDirectCallee() const { 1842bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner return const_cast<CallExpr*>(this)->getDirectCallee(); 1843bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner } 1844a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu 18455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getNumArgs - Return the number of actual arguments to this call. 18465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 18475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getNumArgs() const { return NumArgs; } 18481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1849aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \brief Retrieve the call arguments. 1850cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne Expr **getArgs() { 1851cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return reinterpret_cast<Expr **>(SubExprs+getNumPreArgs()+PREARGS_START); 1852cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1853aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 18545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getArg - Return the specified argument. 18555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Expr *getArg(unsigned Arg) { 18565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(Arg < NumArgs && "Arg access out of range!"); 1857cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return cast<Expr>(SubExprs[Arg+getNumPreArgs()+PREARGS_START]); 18585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 18595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const Expr *getArg(unsigned Arg) const { 18605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(Arg < NumArgs && "Arg access out of range!"); 1861cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return cast<Expr>(SubExprs[Arg+getNumPreArgs()+PREARGS_START]); 18625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1864934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff /// setArg - Set the specified argument. 1865934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff void setArg(unsigned Arg, Expr *ArgExpr) { 1866934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff assert(Arg < NumArgs && "Arg access out of range!"); 1867cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne SubExprs[Arg+getNumPreArgs()+PREARGS_START] = ArgExpr; 1868934f276cc5b45e19cd12ebb2d04fd7972a23865cSteve Naroff } 18691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1870d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner /// setNumArgs - This changes the number of arguments present in this call. 1871d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner /// Any orphaned expressions are deleted by this, and any new operands are set 1872d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner /// to null. 18738189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek void setNumArgs(ASTContext& C, unsigned NumArgs); 18741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18755549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek typedef ExprIterator arg_iterator; 18765549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek typedef ConstExprIterator const_arg_iterator; 18771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1878cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne arg_iterator arg_begin() { return SubExprs+PREARGS_START+getNumPreArgs(); } 1879cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne arg_iterator arg_end() { 1880cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return SubExprs+PREARGS_START+getNumPreArgs()+getNumArgs(); 1881cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1882cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne const_arg_iterator arg_begin() const { 1883cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return SubExprs+PREARGS_START+getNumPreArgs(); 1884cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 1885cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne const_arg_iterator arg_end() const { 1886cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne return SubExprs+PREARGS_START+getNumPreArgs()+getNumArgs(); 1887cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne } 18881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getNumCommas - Return the number of commas that must have been present in 18905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// this function call. 18915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getNumCommas() const { return NumArgs ? NumArgs - 1 : 0; } 18925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1893cb888967400a03504c88acedd5248d6778a82f46Chris Lattner /// isBuiltinCall - If this is a call to a builtin, return the builtin ID. If 1894cb888967400a03504c88acedd5248d6778a82f46Chris Lattner /// not, return 0. 18954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad unsigned isBuiltinCall(const ASTContext &Context) const; 18961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// getCallReturnType - Get the return type of the call expr. This is not 18981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// always the type of the expr itself, if the return type is a reference 18996dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson /// type. 19006dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson QualType getCallReturnType() const; 19011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1902d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner SourceLocation getRParenLoc() const { return RParenLoc; } 19031f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 1904866b5c03e3b9c01cf496ad97b85a05afc917345bTed Kremenek 19052882eca5a184c78f793188083f6ce539740a5cf2John McCall SourceRange getSourceRange() const; 19061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 19084bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt return T->getStmtClass() >= firstCallExprConstant && 19094bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt T->getStmtClass() <= lastCallExprConstant; 19105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 19115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const CallExpr *) { return true; } 191288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 191377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek // Iterators 191463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 191563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], 191663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall &SubExprs[0]+NumArgs+getNumPreArgs()+PREARGS_START); 191763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 19185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 19195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1920ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner/// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F. 19215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 19225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass MemberExpr : public Expr { 19236bb8017bb9e828d118e15e59d71c66bba323c364John McCall /// Extra data stored in some member expressions. 19246857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth struct MemberNameQualifier { 19256857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth /// \brief The nested-name-specifier that qualifies the name, including 19266857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth /// source-location information. 19276857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth NestedNameSpecifierLoc QualifierLoc; 19286857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth 19296857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth /// \brief The DeclAccessPair through which the MemberDecl was found due to 19306857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth /// name qualifiers. 1931161755a09898c95d21bfff33707da9ca41cd53c5John McCall DeclAccessPair FoundDecl; 19326bb8017bb9e828d118e15e59d71c66bba323c364John McCall }; 19336bb8017bb9e828d118e15e59d71c66bba323c364John McCall 1934ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// Base - the expression for the base pointer or structure references. In 1935ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// X.F, this is "X". 19365549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *Base; 19371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1938ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// MemberDecl - This is the decl being referenced by the field/member name. 1939ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// In X.F, this is the decl referenced by F. 1940f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *MemberDecl; 19411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1942ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// MemberLoc - This is the location of the member name. 19435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation MemberLoc; 19441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// MemberDNLoc - Provides source/type location info for the 19462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// declaration name embedded in MemberDecl. 19472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameLoc MemberDNLoc; 19482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 1949ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// IsArrow - True if this is "X->F", false if this is "X.F". 195083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor bool IsArrow : 1; 19511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 195283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// \brief True if this member expression used a nested-name-specifier to 19536bb8017bb9e828d118e15e59d71c66bba323c364John McCall /// refer to the member, e.g., "x->Base::f", or found its member via a using 19546bb8017bb9e828d118e15e59d71c66bba323c364John McCall /// declaration. When true, a MemberNameQualifier 1955c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// structure is allocated immediately after the MemberExpr. 19566bb8017bb9e828d118e15e59d71c66bba323c364John McCall bool HasQualifierOrFoundDecl : 1; 19571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1958c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// \brief True if this member expression specified a template argument list 1959c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// explicitly, e.g., x->f<int>. When true, an ExplicitTemplateArgumentList 1960c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// structure (and its TemplateArguments) are allocated immediately after 1961c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// the MemberExpr or, if the member expression also has a qualifier, after 19626bb8017bb9e828d118e15e59d71c66bba323c364John McCall /// the MemberNameQualifier structure. 1963c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor bool HasExplicitTemplateArgumentList : 1; 19641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 196583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// \brief Retrieve the qualifier that preceded the member name, if any. 19666bb8017bb9e828d118e15e59d71c66bba323c364John McCall MemberNameQualifier *getMemberQualifier() { 19676bb8017bb9e828d118e15e59d71c66bba323c364John McCall assert(HasQualifierOrFoundDecl); 19686bb8017bb9e828d118e15e59d71c66bba323c364John McCall return reinterpret_cast<MemberNameQualifier *> (this + 1); 196983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 197083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 197183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// \brief Retrieve the qualifier that preceded the member name, if any. 19726bb8017bb9e828d118e15e59d71c66bba323c364John McCall const MemberNameQualifier *getMemberQualifier() const { 1973c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor return const_cast<MemberExpr *>(this)->getMemberQualifier(); 1974c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 19751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 1977f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman MemberExpr(Expr *base, bool isarrow, ValueDecl *memberdecl, 1978f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall const DeclarationNameInfo &NameInfo, QualType ty, 1979f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK) 1980f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(MemberExprClass, ty, VK, OK, 1981bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->isTypeDependent(), base->isValueDependent(), 1982bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->containsUnexpandedParameterPack()), 19832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Base(base), MemberDecl(memberdecl), MemberLoc(NameInfo.getLoc()), 19842577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberDNLoc(NameInfo.getInfo()), IsArrow(isarrow), 19852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara HasQualifierOrFoundDecl(false), HasExplicitTemplateArgumentList(false) { 19862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara assert(memberdecl->getDeclName() == NameInfo.getName()); 19872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 19882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 19892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // NOTE: this constructor should be used only when it is known that 19902577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // the member name can not provide additional syntactic info 19912577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // (i.e., source locations for C++ operator names or type source info 19922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // for constructors, destructors and conversion oeprators). 19932577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberExpr(Expr *base, bool isarrow, ValueDecl *memberdecl, 1994f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall SourceLocation l, QualType ty, 1995f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK) 1996f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(MemberExprClass, ty, VK, OK, 1997bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->isTypeDependent(), base->isValueDependent(), 1998bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->containsUnexpandedParameterPack()), 19992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Base(base), MemberDecl(memberdecl), MemberLoc(l), MemberDNLoc(), 20002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara IsArrow(isarrow), 20016bb8017bb9e828d118e15e59d71c66bba323c364John McCall HasQualifierOrFoundDecl(false), HasExplicitTemplateArgumentList(false) {} 2002510190777c4bd53e960eea4665b204778fec1b64Eli Friedman 20031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static MemberExpr *Create(ASTContext &C, Expr *base, bool isarrow, 200440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 2005161755a09898c95d21bfff33707da9ca41cd53c5John McCall ValueDecl *memberdecl, DeclAccessPair founddecl, 20062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo MemberNameInfo, 2007d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *targs, 2008f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType ty, ExprValueKind VK, ExprObjectKind OK); 20091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 201088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor void setBase(Expr *E) { Base = E; } 20115549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getBase() const { return cast<Expr>(Base); } 201257e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor 201357e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor /// \brief Retrieve the member declaration to which this expression refers. 201457e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor /// 201557e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor /// The returned declaration will either be a FieldDecl or (in C++) 201657e8b05fe9ba03d410db9c161e032cb79c9ab5baDouglas Gregor /// a CXXMethodDecl. 2017f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman ValueDecl *getMemberDecl() const { return MemberDecl; } 2018f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman void setMemberDecl(ValueDecl *D) { MemberDecl = D; } 20191f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor 20206bb8017bb9e828d118e15e59d71c66bba323c364John McCall /// \brief Retrieves the declaration found by lookup. 2021161755a09898c95d21bfff33707da9ca41cd53c5John McCall DeclAccessPair getFoundDecl() const { 20226bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (!HasQualifierOrFoundDecl) 2023161755a09898c95d21bfff33707da9ca41cd53c5John McCall return DeclAccessPair::make(getMemberDecl(), 2024161755a09898c95d21bfff33707da9ca41cd53c5John McCall getMemberDecl()->getAccess()); 20256bb8017bb9e828d118e15e59d71c66bba323c364John McCall return getMemberQualifier()->FoundDecl; 20266bb8017bb9e828d118e15e59d71c66bba323c364John McCall } 20276bb8017bb9e828d118e15e59d71c66bba323c364John McCall 20281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Determines whether this member expression actually had 20290979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor /// a C++ nested-name-specifier prior to the name of the member, e.g., 20300979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor /// x->Base::foo. 20316bb8017bb9e828d118e15e59d71c66bba323c364John McCall bool hasQualifier() const { return getQualifier() != 0; } 20321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief If the member name was qualified, retrieves the 203483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// nested-name-specifier that precedes the member name. Otherwise, returns 203583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /// NULL. 20361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *getQualifier() const { 20376bb8017bb9e828d118e15e59d71c66bba323c364John McCall if (!HasQualifierOrFoundDecl) 203883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return 0; 20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 204040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return getMemberQualifier()->QualifierLoc.getNestedNameSpecifier(); 204140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor } 204240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor 204340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor /// \brief If the member name was qualified, retrieves the 204440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor /// nested-name-specifier that precedes the member name, with source-location 204540d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor /// information. 204640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor NestedNameSpecifierLoc getQualifierLoc() const { 204740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor if (!hasQualifier()) 204840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return NestedNameSpecifierLoc(); 204940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor 205040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor return getMemberQualifier()->QualifierLoc; 205183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 2052c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor 2053c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// \brief Determines whether this member expression actually had a C++ 2054c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// template argument list explicitly specified, e.g., x.f<int>. 2055096832c5ed5b9106fa177ebc148489760c3bc496John McCall bool hasExplicitTemplateArgs() const { 20561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return HasExplicitTemplateArgumentList; 2057c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 20581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2059d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// \brief Copies the template arguments (if present) into the given 2060d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// structure. 2061d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 2062096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (hasExplicitTemplateArgs()) 2063096832c5ed5b9106fa177ebc148489760c3bc496John McCall getExplicitTemplateArgs().copyInto(List); 2064096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 2065096832c5ed5b9106fa177ebc148489760c3bc496John McCall 2066096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieve the explicit template argument list that 2067096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// follow the member template name. This must only be called on an 2068096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// expression with explicit template arguments. 2069096832c5ed5b9106fa177ebc148489760c3bc496John McCall ExplicitTemplateArgumentList &getExplicitTemplateArgs() { 2070096832c5ed5b9106fa177ebc148489760c3bc496John McCall assert(HasExplicitTemplateArgumentList); 2071096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!HasQualifierOrFoundDecl) 2072096832c5ed5b9106fa177ebc148489760c3bc496John McCall return *reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); 2073096832c5ed5b9106fa177ebc148489760c3bc496John McCall 2074096832c5ed5b9106fa177ebc148489760c3bc496John McCall return *reinterpret_cast<ExplicitTemplateArgumentList *>( 2075096832c5ed5b9106fa177ebc148489760c3bc496John McCall getMemberQualifier() + 1); 2076096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 2077096832c5ed5b9106fa177ebc148489760c3bc496John McCall 2078096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieve the explicit template argument list that 2079096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// followed the member template name. This must only be called on 2080096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// an expression with explicit template arguments. 2081096832c5ed5b9106fa177ebc148489760c3bc496John McCall const ExplicitTemplateArgumentList &getExplicitTemplateArgs() const { 2082096832c5ed5b9106fa177ebc148489760c3bc496John McCall return const_cast<MemberExpr *>(this)->getExplicitTemplateArgs(); 2083096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 2084096832c5ed5b9106fa177ebc148489760c3bc496John McCall 2085096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieves the optional explicit template arguments. 2086096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// This points to the same data as getExplicitTemplateArgs(), but 2087096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// returns null if there are no explicit template arguments. 2088096832c5ed5b9106fa177ebc148489760c3bc496John McCall const ExplicitTemplateArgumentList *getOptionalExplicitTemplateArgs() const { 2089096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (!hasExplicitTemplateArgs()) return 0; 2090096832c5ed5b9106fa177ebc148489760c3bc496John McCall return &getExplicitTemplateArgs(); 2091d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 2092c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 20931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Retrieve the location of the left angle bracket following the 2094c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// member name ('<'), if any. 20951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation getLAngleLoc() const { 2096c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (!HasExplicitTemplateArgumentList) 2097c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor return SourceLocation(); 20981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2099096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().LAngleLoc; 2100c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 21011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2102c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// \brief Retrieve the template arguments provided as part of this 2103c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// template-id. 2104833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *getTemplateArgs() const { 2105c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (!HasExplicitTemplateArgumentList) 21061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 21071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2108096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().getTemplateArgs(); 2109c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 21101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2111c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// \brief Retrieve the number of template arguments provided as part of this 2112c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// template-id. 21131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned getNumTemplateArgs() const { 2114c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (!HasExplicitTemplateArgumentList) 21151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 21161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2117096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().NumTemplateArgs; 2118c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 21191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Retrieve the location of the right angle bracket following the 2121c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor /// template arguments ('>'). 21221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation getRAngleLoc() const { 2123c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (!HasExplicitTemplateArgumentList) 2124c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor return SourceLocation(); 21251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2126096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().RAngleLoc; 2127c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor } 21281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// \brief Retrieve the member declaration name info. 21302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo getMemberNameInfo() const { 21312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return DeclarationNameInfo(MemberDecl->getDeclName(), 21322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara MemberLoc, MemberDNLoc); 21332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 21342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 21355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isArrow() const { return IsArrow; } 21361f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor void setArrow(bool A) { IsArrow = A; } 21371f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor 2138ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// getMemberLoc - Return the location of the "member", in X->F, it is the 2139ddca44e86281bb7dcf5fdcaf1563434c524e3861Chris Lattner /// location of 'F'. 2140026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner SourceLocation getMemberLoc() const { return MemberLoc; } 21411f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor void setMemberLoc(SourceLocation L) { MemberLoc = L; } 21425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 214375e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor SourceRange getSourceRange() const; 214475e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor 214563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceLocation getExprLoc() const { return MemberLoc; } 21465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 214775e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor /// \brief Determine whether the base of this explicit is implicit. 214875e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor bool isImplicitAccess() const { 214975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor return getBase() && getBase()->isImplicitCXXThis(); 215075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor } 215175e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor 21521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 215383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return T->getStmtClass() == MemberExprClass; 21545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 21555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const MemberExpr *) { return true; } 21561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21571237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 215863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Base, &Base+1); } 21594045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 21604045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTReader; 21614045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtWriter; 21625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 21635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 21641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CompoundLiteralExpr - [C99 6.5.2.5] 2165aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff/// 2166aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffclass CompoundLiteralExpr : public Expr { 21670fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner /// LParenLoc - If non-null, this is the location of the left paren in a 21680fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner /// compound literal like "(int){4}". This can be null if this is a 21690fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner /// synthesized compound expression. 21700fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner SourceLocation LParenLoc; 21711d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall 21721d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall /// The type as written. This can be an incomplete array type, in 21731d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall /// which case the actual expression type will be different. 217442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *TInfo; 21755549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *Init; 2176e9b12198c4cc7f5687960100351b4af006c14469Steve Naroff bool FileScope; 2177aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffpublic: 217842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo, 2179f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType T, ExprValueKind VK, Expr *init, bool fileScope) 2180f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary, 2181bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor tinfo->getType()->isDependentType(), 2182bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor init->isValueDependent(), 2183bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor init->containsUnexpandedParameterPack()), 218442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall LParenLoc(lparenloc), TInfo(tinfo), Init(init), FileScope(fileScope) {} 21851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2186ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor /// \brief Construct an empty compound literal. 2187ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor explicit CompoundLiteralExpr(EmptyShell Empty) 2188ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor : Expr(CompoundLiteralExprClass, Empty) { } 2189ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor 21905549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getInitializer() const { return cast<Expr>(Init); } 21915549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getInitializer() { return cast<Expr>(Init); } 2192ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor void setInitializer(Expr *E) { Init = E; } 2193e9b12198c4cc7f5687960100351b4af006c14469Steve Naroff 2194e9b12198c4cc7f5687960100351b4af006c14469Steve Naroff bool isFileScope() const { return FileScope; } 2195ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor void setFileScope(bool FS) { FileScope = FS; } 2196ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor 21970fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner SourceLocation getLParenLoc() const { return LParenLoc; } 2198ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor void setLParenLoc(SourceLocation L) { LParenLoc = L; } 2199ba6d7e7fa5f79959d3eef39adb5620d845ba5198Douglas Gregor 220042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall TypeSourceInfo *getTypeSourceInfo() const { return TInfo; } 220142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall void setTypeSourceInfo(TypeSourceInfo* tinfo) { TInfo = tinfo; } 220242f56b50062cd3b3c6b23fdb9053578ae9145664John McCall 220363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 22040fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner // FIXME: Init should never be null. 22050fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner if (!Init) 22060fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner return SourceRange(); 22070fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner if (LParenLoc.isInvalid()) 220873d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner return Init->getSourceRange(); 22090fc53dfc7a33f68e71ef245389c4e7cd34a62a39Chris Lattner return SourceRange(LParenLoc, Init->getLocEnd()); 221073d0d4fac161ed12926e010dcf8b448a8de6a2ecChris Lattner } 2211aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff 22121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 22131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == CompoundLiteralExprClass; 2214aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff } 2215aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff static bool classof(const CompoundLiteralExpr *) { return true; } 22161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22171237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 221863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Init, &Init+1); } 2219aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff}; 2220aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff 222149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// CastExpr - Base class for type casts, including both implicit 222249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// casts (ImplicitCastExpr) and explicit casts that have some 222349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// representation in the source code (ExplicitCastExpr's derived 222449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// classes). 22250835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisclass CastExpr : public Expr { 2226cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlssonpublic: 22275baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall typedef clang::CastKind CastKind; 22281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2229cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlssonprivate: 22300835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis Stmt *Op; 2231409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson 2232daa8e4e888758d55a7a759dd4a91b83921cef222John McCall void CheckCastConsistency() const { 2233409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson#ifndef NDEBUG 2234409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson switch (getCastKind()) { 22355cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson case CK_DerivedToBase: 2236cee22421929c91b481f4d1bb85cd48c0f6b7510bAnders Carlsson case CK_UncheckedDerivedToBase: 2237cee22421929c91b481f4d1bb85cd48c0f6b7510bAnders Carlsson case CK_DerivedToBaseMemberPointer: 2238409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_BaseToDerived: 2239409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_BaseToDerivedMemberPointer: 2240f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall assert(!path_empty() && "Cast kind should have a base path!"); 2241f9d68e1dd015972318b2448f75115ff4fc3d5008Anders Carlsson break; 2242409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson 2243409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson // These should not have an inheritance path. 2244409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_BitCast: 2245409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_Dynamic: 2246409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_ToUnion: 2247409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_ArrayToPointerDecay: 2248409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_FunctionToPointerDecay: 2249409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_NullToMemberPointer: 2250404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall case CK_NullToPointer: 2251409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_ConstructorConversion: 2252409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_IntegralToPointer: 2253409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_PointerToIntegral: 2254409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_ToVoid: 2255409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_VectorSplat: 2256409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_IntegralCast: 2257409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_IntegralToFloating: 2258409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_FloatingToIntegral: 2259409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_FloatingCast: 2260409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_AnyPointerToObjCPointerCast: 2261409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson case CK_AnyPointerToBlockPointerCast: 2262569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor case CK_ObjCObjectLValueCast: 22632bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_FloatingRealToComplex: 2264f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_FloatingComplexToReal: 22652bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_FloatingComplexCast: 2266f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_FloatingComplexToIntegralComplex: 22672bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_IntegralRealToComplex: 2268f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_IntegralComplexToReal: 22692bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall case CK_IntegralComplexCast: 2270f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall case CK_IntegralComplexToFloatingComplex: 2271daa8e4e888758d55a7a759dd4a91b83921cef222John McCall assert(!getType()->isBooleanType() && "unheralded conversion to bool"); 2272daa8e4e888758d55a7a759dd4a91b83921cef222John McCall // fallthrough to check for null base path 2273daa8e4e888758d55a7a759dd4a91b83921cef222John McCall 2274daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_Dependent: 22750ae287a498b8cec2086fe6b7e753cbb3df63e74aJohn McCall case CK_LValueToRValue: 2276f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall case CK_GetObjCProperty: 2277daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_NoOp: 2278daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_PointerToBoolean: 2279daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_IntegralToBoolean: 2280daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_FloatingToBoolean: 2281daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_MemberPointerToBoolean: 2282daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_FloatingComplexToBoolean: 2283daa8e4e888758d55a7a759dd4a91b83921cef222John McCall case CK_IntegralComplexToBoolean: 22845082d34e4107a44ac7f07b62f7a6c917e0e6e71eJohn McCall case CK_LValueBitCast: // -> bool& 22855082d34e4107a44ac7f07b62f7a6c917e0e6e71eJohn McCall case CK_UserDefinedConversion: // operator bool() 2286f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall assert(path_empty() && "Cast kind should not have a base path!"); 2287409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson break; 2288409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson } 2289409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson#endif 2290409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson } 2291409c99edb8b623403fade6f3a9e9c86acda74455Anders Carlsson 2292f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXBaseSpecifier * const *path_buffer() const { 2293f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall return const_cast<CastExpr*>(this)->path_buffer(); 2294f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall } 2295f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXBaseSpecifier **path_buffer(); 2296f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2297654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis void setBasePathSize(unsigned basePathSize) { 2298654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis CastExprBits.BasePathSize = basePathSize; 2299654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis assert(CastExprBits.BasePathSize == basePathSize && 2300654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis "basePathSize doesn't fit in bits of CastExprBits.BasePathSize!"); 2301654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis } 2302654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis 23030835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisprotected: 2304f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, 2305f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall const CastKind kind, Expr *op, unsigned BasePathSize) : 2306f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr(SC, ty, VK, OK_Ordinary, 2307898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // Cast expressions are type-dependent if the type is 2308898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // dependent (C++ [temp.dep.expr]p3). 2309898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor ty->isDependentType(), 2310898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // Cast expressions are value-dependent if the type is 2311898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // dependent or if the subexpression is value-dependent. 2312bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ty->isDependentType() || (op && op->isValueDependent()), 2313bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (ty->containsUnexpandedParameterPack() || 2314bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor op->containsUnexpandedParameterPack())), 23158e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall Op(op) { 2316daa8e4e888758d55a7a759dd4a91b83921cef222John McCall assert(kind != CK_Invalid && "creating cast with invalid cast kind"); 23178e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall CastExprBits.Kind = kind; 2318654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis setBasePathSize(BasePathSize); 2319daa8e4e888758d55a7a759dd4a91b83921cef222John McCall CheckCastConsistency(); 2320f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall } 23211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2322087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor /// \brief Construct an empty cast. 2323f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize) 23248e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall : Expr(SC, Empty) { 2325654f6b2b53af2c950c62ef0161fa021648accbcbArgyrios Kyrtzidis setBasePathSize(BasePathSize); 23268e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall } 23271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23280835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidispublic: 23298e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; } 23308e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall void setCastKind(CastKind K) { CastExprBits.Kind = K; } 2331f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson const char *getCastKindName() const; 2332f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson 23330835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis Expr *getSubExpr() { return cast<Expr>(Op); } 23340835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis const Expr *getSubExpr() const { return cast<Expr>(Op); } 2335087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor void setSubExpr(Expr *E) { Op = E; } 2336087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor 23376eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// \brief Retrieve the cast subexpression as it was written in the source 23386eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// code, looking through any implicit casts or other intermediate nodes 23396eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor /// introduced by semantic analysis. 23406eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor Expr *getSubExprAsWritten(); 23416eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor const Expr *getSubExprAsWritten() const { 23426eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor return const_cast<CastExpr *>(this)->getSubExprAsWritten(); 23436eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } 234441b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson 2345f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall typedef CXXBaseSpecifier **path_iterator; 2346f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall typedef const CXXBaseSpecifier * const *path_const_iterator; 23478e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall bool path_empty() const { return CastExprBits.BasePathSize == 0; } 23488e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall unsigned path_size() const { return CastExprBits.BasePathSize; } 2349f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall path_iterator path_begin() { return path_buffer(); } 2350f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall path_iterator path_end() { return path_buffer() + path_size(); } 2351f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall path_const_iterator path_begin() const { return path_buffer(); } 2352f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall path_const_iterator path_end() const { return path_buffer() + path_size(); } 2353f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2354f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall void setCastPath(const CXXCastPath &Path); 235541b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson 23561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 23574bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt return T->getStmtClass() >= firstCastExprConstant && 23584bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt T->getStmtClass() <= lastCastExprConstant; 23590835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis } 23600835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis static bool classof(const CastExpr *) { return true; } 23611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23620835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis // Iterators 236363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Op, &Op+1); } 23640835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis}; 23650835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis 236649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// ImplicitCastExpr - Allows us to explicitly represent implicit type 236749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// conversions, which have no direct representation in the original 236849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// source code. For example: converting T[]->T*, void f()->void 236949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// (*f)(), float->double, short->int, etc. 237049b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff/// 2371bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// In C, implicit casts always produce rvalues. However, in C++, an 2372bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// implicit cast whose result is being bound to a reference will be 2373906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// an lvalue or xvalue. For example: 2374bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// 2375bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// @code 2376bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// class Base { }; 2377bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// class Derived : public Base { }; 2378906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// Derived &&ref(); 23791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// void f(Derived d) { 2380906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// Base& b = d; // initializer is an ImplicitCastExpr 2381906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// // to an lvalue of type Base 2382906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// Base&& r = ref(); // initializer is an ImplicitCastExpr 2383906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// // to an xvalue of type Base 2384bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// } 2385bf3af056289893f58d37b05a2c80970708781d61Douglas Gregor/// @endcode 23860835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisclass ImplicitCastExpr : public CastExpr { 2387906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redlprivate: 2388f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall ImplicitCastExpr(QualType ty, CastKind kind, Expr *op, 23895baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall unsigned BasePathLength, ExprValueKind VK) 2390f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength) { 23915baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall } 239290045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff 2393087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor /// \brief Construct an empty implicit cast. 2394f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit ImplicitCastExpr(EmptyShell Shell, unsigned PathSize) 2395f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CastExpr(ImplicitCastExprClass, Shell, PathSize) { } 2396f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2397f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 2398f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall enum OnStack_t { OnStack }; 2399f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall ImplicitCastExpr(OnStack_t _, QualType ty, CastKind kind, Expr *op, 24005baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind VK) 2401f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0) { 24025baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall } 2403f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2404f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall static ImplicitCastExpr *Create(ASTContext &Context, QualType T, 2405f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastKind Kind, Expr *Operand, 2406f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *BasePath, 24075baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall ExprValueKind Cat); 2408f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2409f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall static ImplicitCastExpr *CreateEmpty(ASTContext &Context, unsigned PathSize); 2410087fd536809ebe754d91c641a98917e02dd7452dDouglas Gregor 241163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 24120835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis return getSubExpr()->getSourceRange(); 24130835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis } 241490045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff 24151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 24161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ImplicitCastExprClass; 241749b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff } 241849b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff static bool classof(const ImplicitCastExpr *) { return true; } 241949b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff}; 242049b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff 242149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// ExplicitCastExpr - An explicit cast written in the source 24221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// code. 242349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// 242449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This class is effectively an abstract class, because it provides 242549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// the basic representation of an explicitly-written cast without 242649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// specifying which kind of cast (C cast, functional cast, static 242749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// cast, etc.) was written; specific derived classes represent the 242849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// particular style of cast and its location information. 24295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 243049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// Unlike implicit casts, explicit cast nodes have two different 243149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// types: the type that was written into the source code, and the 243249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// actual type of the expression as determined by semantic 243349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// analysis. These types may differ slightly. For example, in C++ one 243449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// can cast to a reference type, which indicates that the resulting 2435906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// expression will be an lvalue or xvalue. The reference type, however, 2436906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// will not be used as the type of the expression. 24370835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisclass ExplicitCastExpr : public CastExpr { 24389d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall /// TInfo - Source type info for the (written) type 24399d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall /// this expression is casting to. 24409d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *TInfo; 244149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 244249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorprotected: 2443f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExplicitCastExpr(StmtClass SC, QualType exprTy, ExprValueKind VK, 2444f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CastKind kind, Expr *op, unsigned PathSize, 2445f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall TypeSourceInfo *writtenTy) 2446f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CastExpr(SC, exprTy, VK, kind, op, PathSize), TInfo(writtenTy) {} 244749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 2448db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor /// \brief Construct an empty explicit cast. 2449f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall ExplicitCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize) 2450f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CastExpr(SC, Shell, PathSize) { } 2451db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 245249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorpublic: 24539d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall /// getTypeInfoAsWritten - Returns the type source info for the type 24549d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall /// that this expression is casting to. 24559d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; } 24569d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; } 24579d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall 245849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor /// getTypeAsWritten - Returns the type that this expression is 245949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor /// casting to, as written in the source code. 24609d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall QualType getTypeAsWritten() const { return TInfo->getType(); } 246149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 24621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 24634bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt return T->getStmtClass() >= firstExplicitCastExprConstant && 24644bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt T->getStmtClass() <= lastExplicitCastExprConstant; 246549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 246649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor static bool classof(const ExplicitCastExpr *) { return true; } 246749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 246849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 24696eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor/// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style 247049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// cast in C++ (C++ [expr.cast]), which uses the syntax 247149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// (Type)expr. For example: @c (int)f. 24726eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorclass CStyleCastExpr : public ExplicitCastExpr { 2473b2f9e516327310d95840d442416084508f80c183Steve Naroff SourceLocation LPLoc; // the location of the left paren 2474b2f9e516327310d95840d442416084508f80c183Steve Naroff SourceLocation RPLoc; // the location of the right paren 2475f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2476f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CStyleCastExpr(QualType exprTy, ExprValueKind vk, CastKind kind, Expr *op, 2477f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize, TypeSourceInfo *writtenTy, 247841b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson SourceLocation l, SourceLocation r) 2479f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : ExplicitCastExpr(CStyleCastExprClass, exprTy, vk, kind, op, PathSize, 248041b2dcd465f1e438502c420effc9d0c747f9db8fAnders Carlsson writtenTy), LPLoc(l), RPLoc(r) {} 248149b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff 2482db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor /// \brief Construct an empty C-style explicit cast. 2483f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize) 2484f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize) { } 2485f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2486f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 2487f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall static CStyleCastExpr *Create(ASTContext &Context, QualType T, 2488f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, CastKind K, 2489f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall Expr *Op, const CXXCastPath *BasePath, 2490f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall TypeSourceInfo *WrittenTy, SourceLocation L, 2491f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall SourceLocation R); 2492f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 2493f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall static CStyleCastExpr *CreateEmpty(ASTContext &Context, unsigned PathSize); 2494db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 2495b2f9e516327310d95840d442416084508f80c183Steve Naroff SourceLocation getLParenLoc() const { return LPLoc; } 2496db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setLParenLoc(SourceLocation L) { LPLoc = L; } 2497db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 2498b2f9e516327310d95840d442416084508f80c183Steve Naroff SourceLocation getRParenLoc() const { return RPLoc; } 2499db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setRParenLoc(SourceLocation L) { RPLoc = L; } 2500db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 250163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 2502b2f9e516327310d95840d442416084508f80c183Steve Naroff return SourceRange(LPLoc, getSubExpr()->getSourceRange().getEnd()); 25035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 25041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 25051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == CStyleCastExprClass; 25065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 25076eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor static bool classof(const CStyleCastExpr *) { return true; } 25085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 25095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 25103fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// \brief A builtin binary operation expression such as "x + y" or "x <= y". 25113fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// 25123fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// This expression node kind describes a builtin binary operation, 25133fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// such as "x + y" for integer values "x" and "y". The operands will 25143fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// already have been converted to appropriate types (e.g., by 25153fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// performing promotions or conversions). 25163fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// 25173fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// In C++, where operators may be overloaded, a different kind of 25183fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// expression node (CXXOperatorCallExpr) is used to express the 25193fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// invocation of an overloaded operator with operator syntax. Within 25203fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is 25213fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// used to store an expression "x + y" depends on the subexpressions 25223fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// for x and y. If neither x or y is type-dependent, and the "+" 25233fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// operator resolves to a built-in operation, BinaryOperator will be 25243fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// used to express the computation (x and y may still be 25253fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// value-dependent). If either x or y is type-dependent, or if the 25263fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// "+" resolves to an overloaded operator, CXXOperatorCallExpr will 25273fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// be used to express the computation. 25285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass BinaryOperator : public Expr { 25295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 25305baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall typedef BinaryOperatorKind Opcode; 25315baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall 253217d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattnerprivate: 25330799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall unsigned Opc : 6; 25340799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall SourceLocation OpLoc; 25350799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall 253617d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner enum { LHS, RHS, END_EXPR }; 25375549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt* SubExprs[END_EXPR]; 25381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 25391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 254017d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 2541f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK, 254217d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner SourceLocation opLoc) 2543f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(BinaryOperatorClass, ResTy, VK, OK, 2544898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor lhs->isTypeDependent() || rhs->isTypeDependent(), 2545bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor lhs->isValueDependent() || rhs->isValueDependent(), 2546bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (lhs->containsUnexpandedParameterPack() || 2547bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor rhs->containsUnexpandedParameterPack())), 2548898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor Opc(opc), OpLoc(opLoc) { 25491237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[LHS] = lhs; 25501237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[RHS] = rhs; 25511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(!isCompoundAssignmentOp() && 25525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer "Use ArithAssignBinaryOperator for compound assignments"); 25535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 25545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2555db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor /// \brief Construct an empty binary operator. 25561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit BinaryOperator(EmptyShell Empty) 25572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall : Expr(BinaryOperatorClass, Empty), Opc(BO_Comma) { } 2558db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 255917d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner SourceLocation getOperatorLoc() const { return OpLoc; } 2560db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setOperatorLoc(SourceLocation L) { OpLoc = L; } 2561db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 25620799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall Opcode getOpcode() const { return static_cast<Opcode>(Opc); } 2563db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setOpcode(Opcode O) { Opc = O; } 2564db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 25655549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 2566db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setLHS(Expr *E) { SubExprs[LHS] = E; } 25675549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 2568db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor void setRHS(Expr *E) { SubExprs[RHS] = E; } 2569db600c330a37b1c3ab4533310729910ee188f900Douglas Gregor 257063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 25715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return SourceRange(getLHS()->getLocStart(), getRHS()->getLocEnd()); 25725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 25731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 25755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// corresponds to, e.g. "<<=". 25765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static const char *getOpcodeStr(Opcode Op); 25775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 25780799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall const char *getOpcodeStr() const { return getOpcodeStr(getOpcode()); } 2579a84c02d0f4d63975a1c52b9bb8308d88e9d79352Ted Kremenek 2580063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /// \brief Retrieve the binary opcode that corresponds to the given 2581063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /// overloaded operator. 2582063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor static Opcode getOverloadedOpcode(OverloadedOperatorKind OO); 2583063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor 2584063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /// \brief Retrieve the overloaded operator kind that corresponds to 2585063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /// the given binary opcode. 2586063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); 2587063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor 25885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// predicates to categorize the respective opcodes. 2589200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl bool isPtrMemOp() const { return Opc == BO_PtrMemD || Opc == BO_PtrMemI; } 25902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall bool isMultiplicativeOp() const { return Opc >= BO_Mul && Opc <= BO_Rem; } 25912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isAdditiveOp(Opcode Opc) { return Opc == BO_Add || Opc==BO_Sub; } 25920799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isAdditiveOp() const { return isAdditiveOp(getOpcode()); } 25932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isShiftOp(Opcode Opc) { return Opc == BO_Shl || Opc == BO_Shr; } 25940799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isShiftOp() const { return isShiftOp(getOpcode()); } 2595aee3c9375f97a49edef2a36f15df6abd9748e2a1Sebastian Redl 25962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isBitwiseOp(Opcode Opc) { return Opc >= BO_And && Opc <= BO_Or; } 25970799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isBitwiseOp() const { return isBitwiseOp(getOpcode()); } 2598f2da7a06f6b98c3886d9b871ab839f5085b1c238Ted Kremenek 25992de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isRelationalOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_GE; } 26000799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isRelationalOp() const { return isRelationalOp(getOpcode()); } 2601f2da7a06f6b98c3886d9b871ab839f5085b1c238Ted Kremenek 26022de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isEqualityOp(Opcode Opc) { return Opc == BO_EQ || Opc == BO_NE; } 26030799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isEqualityOp() const { return isEqualityOp(getOpcode()); } 26041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isComparisonOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_NE; } 26060799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isComparisonOp() const { return isComparisonOp(getOpcode()); } 2607aee3c9375f97a49edef2a36f15df6abd9748e2a1Sebastian Redl 26082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall static bool isLogicalOp(Opcode Opc) { return Opc == BO_LAnd || Opc==BO_LOr; } 26090799c53fc2bb7acf937c8a8e165033dba1a5aba3John McCall bool isLogicalOp() const { return isLogicalOp(getOpcode()); } 2610f2da7a06f6b98c3886d9b871ab839f5085b1c238Ted Kremenek 26110e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall static bool isAssignmentOp(Opcode Opc) { 26120e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall return Opc >= BO_Assign && Opc <= BO_OrAssign; 26130e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall } 26140e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall bool isAssignmentOp() const { return isAssignmentOp(getOpcode()); } 26150e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall 26160e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall static bool isCompoundAssignmentOp(Opcode Opc) { 26172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall return Opc > BO_Assign && Opc <= BO_OrAssign; 26182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall } 26190e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall bool isCompoundAssignmentOp() const { 26200e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall return isCompoundAssignmentOp(getOpcode()); 26210e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall } 26220e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall 26230e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall static bool isShiftAssignOp(Opcode Opc) { 26242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall return Opc == BO_ShlAssign || Opc == BO_ShrAssign; 26252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall } 26260e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall bool isShiftAssignOp() const { 26270e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall return isShiftAssignOp(getOpcode()); 26280e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall } 26291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *S) { 26314bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt return S->getStmtClass() >= firstBinaryOperatorConstant && 26324bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt S->getStmtClass() <= lastBinaryOperatorConstant; 26335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 26345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const BinaryOperator *) { return true; } 26351237c673c07f9d827129ba02720108816abde562Ted Kremenek 26361237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 263763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 263863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 263963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 26401237c673c07f9d827129ba02720108816abde562Ted Kremenek 26415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprotected: 264217d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 2643f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK, 26442333f7727f97018d6742e1e0938133bcfad967abEli Friedman SourceLocation opLoc, bool dead) 2645f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CompoundAssignOperatorClass, ResTy, VK, OK, 26462333f7727f97018d6742e1e0938133bcfad967abEli Friedman lhs->isTypeDependent() || rhs->isTypeDependent(), 2647bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor lhs->isValueDependent() || rhs->isValueDependent(), 2648bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (lhs->containsUnexpandedParameterPack() || 2649bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor rhs->containsUnexpandedParameterPack())), 26502333f7727f97018d6742e1e0938133bcfad967abEli Friedman Opc(opc), OpLoc(opLoc) { 26511237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[LHS] = lhs; 26521237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[RHS] = rhs; 26535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2654ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor 26551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator(StmtClass SC, EmptyShell Empty) 26562de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall : Expr(SC, Empty), Opc(BO_MulAssign) { } 26575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 26585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 26595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CompoundAssignOperator - For compound assignments (e.g. +=), we keep 26605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// track of the type the operation is performed in. Due to the semantics of 26615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// these operators, the operands are promoted, the aritmetic performed, an 26625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// implicit conversion back to the result type done, then the assignment takes 26635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// place. This captures the intermediate type which the computation is done 26645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// in. 26655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CompoundAssignOperator : public BinaryOperator { 2666ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman QualType ComputationLHSType; 2667ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman QualType ComputationResultType; 26685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 2669f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CompoundAssignOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResType, 2670f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, ExprObjectKind OK, 2671f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType CompLHSType, QualType CompResultType, 267217d1b2ac9f8371a0a2e79d4f8e0008658164f080Chris Lattner SourceLocation OpLoc) 2673f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : BinaryOperator(lhs, rhs, opc, ResType, VK, OK, OpLoc, true), 2674ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman ComputationLHSType(CompLHSType), 2675ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman ComputationResultType(CompResultType) { 26761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(isCompoundAssignmentOp() && 26775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer "Only should be used for compound assignments"); 26785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 26795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2680ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor /// \brief Build an empty compound assignment operator expression. 2681ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor explicit CompoundAssignOperator(EmptyShell Empty) 2682ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor : BinaryOperator(CompoundAssignOperatorClass, Empty) { } 2683ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor 2684ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman // The two computation types are the type the LHS is converted 2685ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman // to for the computation and the type of the result; the two are 2686ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman // distinct in a few cases (specifically, int+=ptr and ptr-=ptr). 2687ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman QualType getComputationLHSType() const { return ComputationLHSType; } 2688ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor void setComputationLHSType(QualType T) { ComputationLHSType = T; } 2689ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor 2690ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman QualType getComputationResultType() const { return ComputationResultType; } 2691ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor void setComputationResultType(QualType T) { ComputationResultType = T; } 2692ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor 26935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const CompoundAssignOperator *) { return true; } 26941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *S) { 26951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return S->getStmtClass() == CompoundAssignOperatorClass; 26965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 26975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 26985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 269956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// AbstractConditionalOperator - An abstract base class for 270056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// ConditionalOperator and BinaryConditionalOperator. 270156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass AbstractConditionalOperator : public Expr { 270256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation QuestionLoc, ColonLoc; 270356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall friend class ASTStmtReader; 270456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 270556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallprotected: 270656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall AbstractConditionalOperator(StmtClass SC, QualType T, 270756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall ExprValueKind VK, ExprObjectKind OK, 270856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall bool TD, bool VD, 270956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall bool ContainsUnexpandedParameterPack, 271056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation qloc, 271156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation cloc) 271256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : Expr(SC, T, VK, OK, TD, VD, ContainsUnexpandedParameterPack), 271356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall QuestionLoc(qloc), ColonLoc(cloc) {} 271456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 271556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall AbstractConditionalOperator(StmtClass SC, EmptyShell Empty) 271656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : Expr(SC, Empty) { } 271756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 271856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic: 271956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // getCond - Return the expression representing the condition for 272056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the ?: operator. 272156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getCond() const; 272256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 272356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // getTrueExpr - Return the subexpression representing the value of 272456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the expression if the condition evaluates to true. 272556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getTrueExpr() const; 272656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 272756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // getFalseExpr - Return the subexpression representing the value of 272856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the expression if the condition evaluates to false. This is 272956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the same as getRHS. 273056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getFalseExpr() const; 273156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 273256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation getQuestionLoc() const { return QuestionLoc; } 273356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation getColonLoc() const { return ColonLoc; } 273456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 273556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const Stmt *T) { 273656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return T->getStmtClass() == ConditionalOperatorClass || 273756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall T->getStmtClass() == BinaryConditionalOperatorClass; 273856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 273956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const AbstractConditionalOperator *) { return true; } 274056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}; 274156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 274256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// ConditionalOperator - The ?: ternary operator. The GNU "missing 274356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// middle" extension is a BinaryConditionalOperator. 274456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass ConditionalOperator : public AbstractConditionalOperator { 27451237c673c07f9d827129ba02720108816abde562Ted Kremenek enum { COND, LHS, RHS, END_EXPR }; 27465549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 274756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 274856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall friend class ASTStmtReader; 27495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 275047e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs, 275156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation CLoc, Expr *rhs, 27520943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall QualType t, ExprValueKind VK, ExprObjectKind OK) 275356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK, 2754898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // FIXME: the type of the conditional operator doesn't 2755898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // depend on the type of the conditional, but the standard 2756898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor // seems to imply that it could. File a bug! 275756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall (lhs->isTypeDependent() || rhs->isTypeDependent()), 275856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall (cond->isValueDependent() || lhs->isValueDependent() || 275956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs->isValueDependent()), 2760bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (cond->containsUnexpandedParameterPack() || 276156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall lhs->containsUnexpandedParameterPack() || 276256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs->containsUnexpandedParameterPack()), 276356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall QLoc, CLoc) { 27641237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[COND] = cond; 27651237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[LHS] = lhs; 27661237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[RHS] = rhs; 27671237c673c07f9d827129ba02720108816abde562Ted Kremenek } 27685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2769ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor /// \brief Build an empty conditional operator. 2770ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor explicit ConditionalOperator(EmptyShell Empty) 277156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { } 2772ad90e96fb7eed26d5217dd06ba50ecbbbebb59e6Douglas Gregor 2773395a2abf0028968d85958610e393e067885dc14fTed Kremenek // getCond - Return the expression representing the condition for 277456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the ?: operator. 27755549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 2776395a2abf0028968d85958610e393e067885dc14fTed Kremenek 277756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // getTrueExpr - Return the subexpression representing the value of 277856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the expression if the condition evaluates to true. 277956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getTrueExpr() const { return cast<Expr>(SubExprs[LHS]); } 27801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 278156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // getFalseExpr - Return the subexpression representing the value of 278256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the expression if the condition evaluates to false. This is 278356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // the same as getRHS. 27845549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); } 2785f9b949fecf339a2c9bd97dd11a272c4878f85ce4Fariborz Jahanian 278656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 27875549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 278847e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor 278963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 27905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return SourceRange(getCond()->getLocStart(), getRHS()->getLocEnd()); 27915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 27921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 27931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ConditionalOperatorClass; 27945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 27955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const ConditionalOperator *) { return true; } 27961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27971237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 279863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 279963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 280063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 28015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 28025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 280356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// BinaryConditionalOperator - The GNU extension to the conditional 280456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// operator which allows the middle operand to be omitted. 280556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// 280656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// This is a different expression kind on the assumption that almost 280756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall/// every client ends up needing to know that these are different. 280856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallclass BinaryConditionalOperator : public AbstractConditionalOperator { 280956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall enum { COMMON, COND, LHS, RHS, NUM_SUBEXPRS }; 281056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 281156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// - the common condition/left-hand-side expression, which will be 281256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// evaluated as the opaque value 281356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// - the condition, expressed in terms of the opaque value 281456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// - the left-hand-side, expressed in terms of the opaque value 281556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// - the right-hand-side 281656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Stmt *SubExprs[NUM_SUBEXPRS]; 281756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueExpr *OpaqueValue; 281856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 281956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall friend class ASTStmtReader; 282056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallpublic: 282156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall BinaryConditionalOperator(Expr *common, OpaqueValueExpr *opaqueValue, 282256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *cond, Expr *lhs, Expr *rhs, 282356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceLocation qloc, SourceLocation cloc, 282456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall QualType t, ExprValueKind VK, ExprObjectKind OK) 282556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK, 282656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall (common->isTypeDependent() || rhs->isTypeDependent()), 282756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall (common->isValueDependent() || rhs->isValueDependent()), 282856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall (common->containsUnexpandedParameterPack() || 282956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall rhs->containsUnexpandedParameterPack()), 283056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall qloc, cloc), 283156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValue(opaqueValue) { 283256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SubExprs[COMMON] = common; 283356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SubExprs[COND] = cond; 283456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SubExprs[LHS] = lhs; 283556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SubExprs[RHS] = rhs; 283656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 283756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValue->setSourceExpr(common); 283856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 283956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 284056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief Build an empty conditional operator. 284156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall explicit BinaryConditionalOperator(EmptyShell Empty) 284256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall : AbstractConditionalOperator(BinaryConditionalOperatorClass, Empty) { } 284356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 284456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief getCommon - Return the common expression, written to the 284556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// left of the condition. The opaque value will be bound to the 284656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// result of this expression. 284756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getCommon() const { return cast<Expr>(SubExprs[COMMON]); } 284856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 284956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief getOpaqueValue - Return the opaque value placeholder. 285056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; } 285156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 285256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief getCond - Return the condition expression; this is defined 285356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// in terms of the opaque value. 285456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 285556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 285656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief getTrueExpr - Return the subexpression which will be 285756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// evaluated if the condition evaluates to true; this is defined 285856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// in terms of the opaque value. 285956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getTrueExpr() const { 286056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return cast<Expr>(SubExprs[LHS]); 286156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 286256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 286356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// \brief getFalseExpr - Return the subexpression which will be 286456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// evaluated if the condnition evaluates to false; this is 286556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall /// defined in terms of the opaque value. 286656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall Expr *getFalseExpr() const { 286756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return cast<Expr>(SubExprs[RHS]); 286856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 286956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 287056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall SourceRange getSourceRange() const { 287156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return SourceRange(getCommon()->getLocStart(), getFalseExpr()->getLocEnd()); 287256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 287356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const Stmt *T) { 287456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return T->getStmtClass() == BinaryConditionalOperatorClass; 287556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 287656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall static bool classof(const BinaryConditionalOperator *) { return true; } 287756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 287856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall // Iterators 287956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall child_range children() { 288056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return child_range(SubExprs, SubExprs + NUM_SUBEXPRS); 288156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall } 288256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}; 288356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 288456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallinline Expr *AbstractConditionalOperator::getCond() const { 288556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 288656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return co->getCond(); 288756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return cast<BinaryConditionalOperator>(this)->getCond(); 288856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 288956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 289056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallinline Expr *AbstractConditionalOperator::getTrueExpr() const { 289156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 289256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return co->getTrueExpr(); 289356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return cast<BinaryConditionalOperator>(this)->getTrueExpr(); 289456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 289556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 289656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallinline Expr *AbstractConditionalOperator::getFalseExpr() const { 289756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 289856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return co->getFalseExpr(); 289956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall return cast<BinaryConditionalOperator>(this)->getFalseExpr(); 290056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 290156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall 29026481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner/// AddrLabelExpr - The GNU address of label extension, representing &&label. 29036481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnerclass AddrLabelExpr : public Expr { 29045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation AmpAmpLoc, LabelLoc; 2905ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner LabelDecl *Label; 29065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 2907ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelDecl *L, 29086481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner QualType t) 2909bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(AddrLabelExprClass, t, VK_RValue, OK_Ordinary, false, false, false), 29102333f7727f97018d6742e1e0938133bcfad967abEli Friedman AmpAmpLoc(AALoc), LabelLoc(LLoc), Label(L) {} 29111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29127d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor /// \brief Build an empty address of a label expression. 29131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit AddrLabelExpr(EmptyShell Empty) 29147d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor : Expr(AddrLabelExprClass, Empty) { } 29157d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor 29167d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; } 29177d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; } 29187d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor SourceLocation getLabelLoc() const { return LabelLoc; } 29197d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor void setLabelLoc(SourceLocation L) { LabelLoc = L; } 29207d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor 292163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 29225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return SourceRange(AmpAmpLoc, LabelLoc); 29235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 29241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2925ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner LabelDecl *getLabel() const { return Label; } 2926ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner void setLabel(LabelDecl *L) { Label = L; } 29277d5c2f241c74e5f8d9ec492e8f9f268e5e9ae41fDouglas Gregor 29285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool classof(const Stmt *T) { 29291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == AddrLabelExprClass; 29305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 29316481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner static bool classof(const AddrLabelExpr *) { return true; } 29321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29331237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 293463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 29355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 2936ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 2937ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner/// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}). 2938ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner/// The StmtExpr contains a single CompoundStmt node, which it evaluates and 2939ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner/// takes the value of the last subexpression. 2940f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall/// 2941f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall/// A StmtExpr is always an r-value; values "returned" out of a 2942f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall/// StmtExpr will be copied. 2943ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnerclass StmtExpr : public Expr { 29445549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *SubStmt; 2945ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner SourceLocation LParenLoc, RParenLoc; 2946ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnerpublic: 29472333f7727f97018d6742e1e0938133bcfad967abEli Friedman // FIXME: Does type-dependence need to be computed differently? 2948d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff StmtExpr(CompoundStmt *substmt, QualType T, 2949d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff SourceLocation lp, SourceLocation rp) : 2950f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr(StmtExprClass, T, VK_RValue, OK_Ordinary, 2951bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor T->isDependentType(), false, false), 29522333f7727f97018d6742e1e0938133bcfad967abEli Friedman SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) { } 29531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29546a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor /// \brief Build an empty statement expression. 29556a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { } 29566a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor 29575549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); } 29585549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); } 29596a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor void setSubStmt(CompoundStmt *S) { SubStmt = S; } 29606a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor 296163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 2962ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner return SourceRange(LParenLoc, RParenLoc); 2963ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner } 29641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2965026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner SourceLocation getLParenLoc() const { return LParenLoc; } 29666a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor void setLParenLoc(SourceLocation L) { LParenLoc = L; } 2967026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner SourceLocation getRParenLoc() const { return RParenLoc; } 29686a2dd55b0b3ae376d449a4b07bbb6b2d30b26330Douglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 29691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2970ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner static bool classof(const Stmt *T) { 29711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == StmtExprClass; 2972ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner } 2973ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner static bool classof(const StmtExpr *) { return true; } 29741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29751237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 297663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&SubStmt, &SubStmt+1); } 2977ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner}; 2978ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 2979d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff 2980d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// ShuffleVectorExpr - clang-specific builtin-in function 2981d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// __builtin_shufflevector. 2982d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// This AST node represents a operator that does a constant 2983d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// shuffle, similar to LLVM's shufflevector instruction. It takes 2984d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// two vectors and a variable number of constant indices, 2985d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman/// and returns the appropriately shuffled vector. 2986d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanclass ShuffleVectorExpr : public Expr { 2987d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman SourceLocation BuiltinLoc, RParenLoc; 2988d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman 2989d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman // SubExprs - the list of values passed to the __builtin_shufflevector 2990d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman // function. The first two are vectors, and the rest are constant 2991d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman // indices. The number of values in this list is always 2992d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman // 2+the number of indices in the vector type. 29935549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt **SubExprs; 2994d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman unsigned NumExprs; 2995d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman 2996d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanpublic: 2997a88dc3079bedf70a5cfc39791727e43a10383006Nate Begeman ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr, 29981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Type, SourceLocation BLoc, 2999bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SourceLocation RP); 300094cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 300194cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor /// \brief Build an empty vector-shuffle expression. 30021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit ShuffleVectorExpr(EmptyShell Empty) 300394cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor : Expr(ShuffleVectorExprClass, Empty), SubExprs(0) { } 300494cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 300594cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 300694cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 30071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 300894cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 300994cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 301094cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 301163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 3012d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman return SourceRange(BuiltinLoc, RParenLoc); 3013d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 3014d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman static bool classof(const Stmt *T) { 30151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ShuffleVectorExprClass; 3016d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 3017d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman static bool classof(const ShuffleVectorExpr *) { return true; } 30181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3019d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman /// getNumSubExprs - Return the size of the SubExprs array. This includes the 3020d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman /// constant expression, the actual arguments passed in, and the function 3021d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman /// pointers. 3022d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman unsigned getNumSubExprs() const { return NumExprs; } 30231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3024aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \brief Retrieve the array of expressions. 3025aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); } 3026aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 3027d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman /// getExpr - Return the Expr at the specified index. 3028d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman Expr *getExpr(unsigned Index) { 3029d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman assert((Index < NumExprs) && "Arg access out of range!"); 30305549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(SubExprs[Index]); 3031d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 3032d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman const Expr *getExpr(unsigned Index) const { 3033d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman assert((Index < NumExprs) && "Arg access out of range!"); 30345549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek return cast<Expr>(SubExprs[Index]); 3035d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 30361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3037888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman void setExprs(ASTContext &C, Expr ** Exprs, unsigned NumExprs); 303894cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 3039dde8c94873976632e3ada4d8d067e1e244184d51Eli Friedman unsigned getShuffleMaskIdx(ASTContext &Ctx, unsigned N) { 3040dde8c94873976632e3ada4d8d067e1e244184d51Eli Friedman assert((N < NumExprs - 2) && "Shuffle idx out of range!"); 30419a901bb63990574ff0bcc12ff851d7a71cff8ddbEli Friedman return getExpr(N+2)->EvaluateAsInt(Ctx).getZExtValue(); 3042d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 30431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3044d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman // Iterators 304563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 304663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], &SubExprs[0]+NumExprs); 304763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 3048d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman}; 3049d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman 3050d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff/// ChooseExpr - GNU builtin-in function __builtin_choose_expr. 30511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// This AST node is similar to the conditional operator (?:) in C, with 3052d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff/// the following exceptions: 30537976932a1c256d447316ffac58e9821417725e34Eli Friedman/// - the test expression must be a integer constant expression. 30547976932a1c256d447316ffac58e9821417725e34Eli Friedman/// - the expression returned acts like the chosen subexpression in every 30557976932a1c256d447316ffac58e9821417725e34Eli Friedman/// visible way: the type is the same as that of the chosen subexpression, 30567976932a1c256d447316ffac58e9821417725e34Eli Friedman/// and all predicates (whether it's an l-value, whether it's an integer 30577976932a1c256d447316ffac58e9821417725e34Eli Friedman/// constant expression, etc.) return the same result as for the chosen 30587976932a1c256d447316ffac58e9821417725e34Eli Friedman/// sub-expression. 3059d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffclass ChooseExpr : public Expr { 30601237c673c07f9d827129ba02720108816abde562Ted Kremenek enum { COND, LHS, RHS, END_EXPR }; 30615549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 3062d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff SourceLocation BuiltinLoc, RParenLoc; 3063d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffpublic: 3064f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, 3065f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType t, ExprValueKind VK, ExprObjectKind OK, 3066ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor SourceLocation RP, bool TypeDependent, bool ValueDependent) 3067bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(ChooseExprClass, t, VK, OK, TypeDependent, ValueDependent, 3068bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (cond->containsUnexpandedParameterPack() || 3069bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor lhs->containsUnexpandedParameterPack() || 3070bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor rhs->containsUnexpandedParameterPack())), 30711237c673c07f9d827129ba02720108816abde562Ted Kremenek BuiltinLoc(BLoc), RParenLoc(RP) { 30721237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[COND] = cond; 30731237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[LHS] = lhs; 30741237c673c07f9d827129ba02720108816abde562Ted Kremenek SubExprs[RHS] = rhs; 30751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 30767976932a1c256d447316ffac58e9821417725e34Eli Friedman 307744cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor /// \brief Build an empty __builtin_choose_expr. 307844cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { } 307944cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor 30807976932a1c256d447316ffac58e9821417725e34Eli Friedman /// isConditionTrue - Return whether the condition is true (i.e. not 30817976932a1c256d447316ffac58e9821417725e34Eli Friedman /// equal to zero). 30824ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad bool isConditionTrue(const ASTContext &C) const; 30837976932a1c256d447316ffac58e9821417725e34Eli Friedman 30847976932a1c256d447316ffac58e9821417725e34Eli Friedman /// getChosenSubExpr - Return the subexpression chosen according to the 30857976932a1c256d447316ffac58e9821417725e34Eli Friedman /// condition. 30864ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad Expr *getChosenSubExpr(const ASTContext &C) const { 30877976932a1c256d447316ffac58e9821417725e34Eli Friedman return isConditionTrue(C) ? getLHS() : getRHS(); 30887976932a1c256d447316ffac58e9821417725e34Eli Friedman } 30897976932a1c256d447316ffac58e9821417725e34Eli Friedman 30905549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 309144cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setCond(Expr *E) { SubExprs[COND] = E; } 30925549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 309344cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setLHS(Expr *E) { SubExprs[LHS] = E; } 30945549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 309544cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setRHS(Expr *E) { SubExprs[RHS] = E; } 309644cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor 309744cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 309844cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 30991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 310044cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 310144cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 31021237c673c07f9d827129ba02720108816abde562Ted Kremenek 310363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 3104d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff return SourceRange(BuiltinLoc, RParenLoc); 3105d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff } 3106d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff static bool classof(const Stmt *T) { 31071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ChooseExprClass; 3108d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff } 3109d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff static bool classof(const ChooseExpr *) { return true; } 31101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31111237c673c07f9d827129ba02720108816abde562Ted Kremenek // Iterators 311263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 311363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 311463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 3115d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff}; 3116d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff 31172d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// GNUNullExpr - Implements the GNU __null extension, which is a name 31182d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// for a null pointer constant that has integral type (e.g., int or 31192d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// long) and is the same size and alignment as a pointer. The __null 31202d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// extension is typically only used by system headers, which define 31212d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// NULL as __null in C++ rather than using 0 (which is an integer 31222d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor/// that may not match the size of a pointer). 31232d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorclass GNUNullExpr : public Expr { 31242d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor /// TokenLoc - The location of the __null keyword. 31252d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor SourceLocation TokenLoc; 31262d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 31272d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorpublic: 31281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump GNUNullExpr(QualType Ty, SourceLocation Loc) 3129bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(GNUNullExprClass, Ty, VK_RValue, OK_Ordinary, false, false, false), 3130f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall TokenLoc(Loc) { } 31312d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 313244cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor /// \brief Build an empty GNU __null expression. 313344cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor explicit GNUNullExpr(EmptyShell Empty) : Expr(GNUNullExprClass, Empty) { } 313444cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor 31352d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor /// getTokenLocation - The location of the __null token. 31362d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor SourceLocation getTokenLocation() const { return TokenLoc; } 313744cae0c8669cdf83618cbe7fd36ea7a8e51cf97fDouglas Gregor void setTokenLocation(SourceLocation L) { TokenLoc = L; } 31382d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 313963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 31402d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor return SourceRange(TokenLoc); 31412d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor } 31422d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor static bool classof(const Stmt *T) { 31431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == GNUNullExprClass; 31442d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor } 31452d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor static bool classof(const GNUNullExpr *) { return true; } 31461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31472d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor // Iterators 314863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 31492d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor}; 31502d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 315174626d6ef2e194fcc911e071556660ff331eb4a8Zhongxing Xu/// VAArgExpr, used for the builtin function __builtin_va_arg. 31527c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonclass VAArgExpr : public Expr { 31535549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Stmt *Val; 31542cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara TypeSourceInfo *TInfo; 31557c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson SourceLocation BuiltinLoc, RParenLoc; 31567c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonpublic: 31572cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara VAArgExpr(SourceLocation BLoc, Expr* e, TypeSourceInfo *TInfo, 31582cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara SourceLocation RPLoc, QualType t) 3159f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(VAArgExprClass, t, VK_RValue, OK_Ordinary, 3160bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor t->isDependentType(), false, 3161bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor (TInfo->getType()->containsUnexpandedParameterPack() || 3162bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor e->containsUnexpandedParameterPack())), 31632cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara Val(e), TInfo(TInfo), 31647c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson BuiltinLoc(BLoc), 31657c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson RParenLoc(RPLoc) { } 31661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 316774626d6ef2e194fcc911e071556660ff331eb4a8Zhongxing Xu /// \brief Create an empty __builtin_va_arg expression. 3168d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor explicit VAArgExpr(EmptyShell Empty) : Expr(VAArgExprClass, Empty) { } 3169d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 31705549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek const Expr *getSubExpr() const { return cast<Expr>(Val); } 31715549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek Expr *getSubExpr() { return cast<Expr>(Val); } 3172d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setSubExpr(Expr *E) { Val = E; } 3173d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 31742cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara TypeSourceInfo *getWrittenTypeInfo() const { return TInfo; } 31752cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara void setWrittenTypeInfo(TypeSourceInfo *TI) { TInfo = TI; } 31762cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara 3177d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 3178d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 31791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3180d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 3181d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 3182d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 318363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 31847c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson return SourceRange(BuiltinLoc, RParenLoc); 31851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 31867c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson static bool classof(const Stmt *T) { 31877c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson return T->getStmtClass() == VAArgExprClass; 31887c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson } 31897c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson static bool classof(const VAArgExpr *) { return true; } 31901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31917c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson // Iterators 319263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Val, &Val+1); } 31937c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson}; 31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @brief Describes an C or C++ initializer list. 31964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 31974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// InitListExpr describes an initializer list, which can be used to 31984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initialize objects of different types, including 31994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// struct/class/union types, arrays, and vectors. For example: 32004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// 32014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @code 32024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// struct foo x = { 1, { 2, 3 } }; 32034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// @endcode 3204196ef51bc4d008ec1c69851fb3b0f8d036065931Chris Lattner/// 32054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Prior to semantic analysis, an initializer list will represent the 32064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializer list as written by the user, but will have the 32074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// placeholder type "void". This initializer list is called the 32084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// syntactic form of the initializer, and may contain C99 designated 32094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializers (represented as DesignatedInitExprs), initializations 32104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// of subobject members without explicit braces, and so on. Clients 32114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// interested in the original syntax of the initializer list should 32124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// use the syntactic form of the initializer list. 3213196ef51bc4d008ec1c69851fb3b0f8d036065931Chris Lattner/// 32144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// After semantic analysis, the initializer list will represent the 32154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// semantic form of the initializer, where the initializations of all 32164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// subobjects are made explicit with nested InitListExpr nodes and 32174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// C99 designators have been eliminated by placing the designated 32184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializations into the subobject they initialize. Additionally, 32194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// any "holes" in the initialization, where no initializer has been 32204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// specified for a particular subobject, will be replaced with 32213498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// implicitly-generated ImplicitValueInitExpr expressions that 32224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// value-initialize the subobjects. Note, however, that the 32234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// initializer lists may still have fewer initializers than there are 32244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// elements to initialize within the object. 3225196ef51bc4d008ec1c69851fb3b0f8d036065931Chris Lattner/// 32264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// Given the semantic form of the initializer list, one can retrieve 32274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// the original syntactic form of that initializer list (if it 32284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// exists) using getSyntacticForm(). Since many initializer lists 32294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// have the same syntactic and semantic forms, getSyntacticForm() may 32304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// return NULL, indicating that the current initializer list also 32314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor/// serves as its syntactic form. 323266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonclass InitListExpr : public Expr { 3233ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek // FIXME: Eliminate this vector in favor of ASTContext allocation 3234709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek typedef ASTVector<Stmt *> InitExprsTy; 3235709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitExprsTy InitExprs; 323666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson SourceLocation LBraceLoc, RBraceLoc; 32371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32384c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// Contains the initializer list that describes the syntactic form 32394c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// written in the source code. 32404c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *SyntacticForm; 32414c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 32424423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis /// \brief Either: 32434423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis /// If this initializer list initializes an array with more elements than 32444423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis /// there are initializers in the list, specifies an expression to be used 32454423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis /// for value initialization of the rest of the elements. 32464423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis /// Or 32474423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis /// If this initializer list initializes a union, specifies which 32484423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis /// field within the union will be initialized. 32494423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis llvm::PointerUnion<Expr *, FieldDecl *> ArrayFillerOrUnionFieldInit; 32500bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 3251a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor /// Whether this initializer list originally had a GNU array-range 3252a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor /// designator in it. This is a temporary marker used by CodeGen. 3253a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor bool HadArrayRangeDesignator; 3254a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor 325566b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonpublic: 3256709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek InitListExpr(ASTContext &C, SourceLocation lbraceloc, 3257709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Expr **initexprs, unsigned numinits, 3258ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek SourceLocation rbraceloc); 3259d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 3260d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// \brief Build an empty initializer list. 3261709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek explicit InitListExpr(ASTContext &C, EmptyShell Empty) 3262709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek : Expr(InitListExprClass, Empty), InitExprs(C) { } 32631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3264ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek unsigned getNumInits() const { return InitExprs.size(); } 32651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3266aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor /// \brief Retrieve the set of initializers. 3267aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor Expr **getInits() { return reinterpret_cast<Expr **>(InitExprs.data()); } 3268aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor 326916c5dea6c2d3e4cf529de9d9b37f6a40441acb2cChris Lattner const Expr *getInit(unsigned Init) const { 3270c5ae899b4bbf65488445316c63168079177db0edSteve Naroff assert(Init < getNumInits() && "Initializer access out of range!"); 32714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return cast_or_null<Expr>(InitExprs[Init]); 327266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson } 32731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 327416c5dea6c2d3e4cf529de9d9b37f6a40441acb2cChris Lattner Expr *getInit(unsigned Init) { 3275c5ae899b4bbf65488445316c63168079177db0edSteve Naroff assert(Init < getNumInits() && "Initializer access out of range!"); 32764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return cast_or_null<Expr>(InitExprs[Init]); 327766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson } 32781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void setInit(unsigned Init, Expr *expr) { 3280c5ae899b4bbf65488445316c63168079177db0edSteve Naroff assert(Init < getNumInits() && "Initializer access out of range!"); 32819e8925e72f53a9e2c4633b6b48e965ed01702fe4Steve Naroff InitExprs[Init] = expr; 32829e8925e72f53a9e2c4633b6b48e965ed01702fe4Steve Naroff } 3283c5ae899b4bbf65488445316c63168079177db0edSteve Naroff 3284fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor /// \brief Reserve space for some number of initializers. 3285709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek void reserveInits(ASTContext &C, unsigned NumInits); 32861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// @brief Specify the number of initializers 32884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// 32894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// If there are more than @p NumInits initializers, the remaining 32904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// initializers will be destroyed. If there are fewer than @p 32914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// NumInits initializers, NULL expressions will be added for the 32924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// unknown initializers. 32934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor void resizeInits(ASTContext &Context, unsigned NumInits); 32944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 32954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// @brief Updates the initializer at index @p Init with the new 32964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// expression @p expr, and returns the old expression at that 32974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// location. 32984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// 32994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// When @p Init is out of range for this initializer list, the 33004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// initializer list will be extended with NULL expressions to 3301fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// accommodate the new entry. 3302709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek Expr *updateInit(ASTContext &C, unsigned Init, Expr *expr); 3303c5ae899b4bbf65488445316c63168079177db0edSteve Naroff 33044423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis /// \brief If this initializer list initializes an array with more elements 33054423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis /// than there are initializers in the list, specifies an expression to be 33064423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis /// used for value initialization of the rest of the elements. 33074423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis Expr *getArrayFiller() { 33084423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>(); 33094423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 33108cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const Expr *getArrayFiller() const { 33118cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return const_cast<InitListExpr *>(this)->getArrayFiller(); 33128cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 33133e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis void setArrayFiller(Expr *filler); 33144423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis 33150bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// \brief If this initializes a union, specifies which field in the 33160bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// union to initialize. 33170bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// 33180bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// Typically, this field is the first named field within the 33190bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// union. However, a designated initializer can specify the 33200bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor /// initialization of a different field within the union. 33214423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis FieldDecl *getInitializedFieldInUnion() { 33224423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>(); 33234423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 33248cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne const FieldDecl *getInitializedFieldInUnion() const { 33258cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne return const_cast<InitListExpr *>(this)->getInitializedFieldInUnion(); 33268cad3046be06ea73ff8892d947697a21d7a440d3Peter Collingbourne } 33274423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis void setInitializedFieldInUnion(FieldDecl *FD) { 33284423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis ArrayFillerOrUnionFieldInit = FD; 33294423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis } 33300bb76897bedb8b747efc6523efb432fc24966118Douglas Gregor 3331c5ae899b4bbf65488445316c63168079177db0edSteve Naroff // Explicit InitListExpr's originate from source code (and have valid source 3332c5ae899b4bbf65488445316c63168079177db0edSteve Naroff // locations). Implicit InitListExpr's are created by the semantic analyzer. 3333b3eef68111ffc220e449be96da1747998c057790Douglas Gregor bool isExplicit() { 3334b3eef68111ffc220e449be96da1747998c057790Douglas Gregor return LBraceLoc.isValid() && RBraceLoc.isValid(); 3335b3eef68111ffc220e449be96da1747998c057790Douglas Gregor } 33361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3337d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor SourceLocation getLBraceLoc() const { return LBraceLoc; } 3338d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; } 3339d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor SourceLocation getRBraceLoc() const { return RBraceLoc; } 334087fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor void setRBraceLoc(SourceLocation Loc) { RBraceLoc = Loc; } 334187fd703e097c27d63479cb83b687d4000a22bbb1Douglas Gregor 33424c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// @brief Retrieve the initializer list that describes the 33434c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// syntactic form of the initializer. 33444c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor /// 33451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 33464c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor InitListExpr *getSyntacticForm() const { return SyntacticForm; } 33474c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor void setSyntacticForm(InitListExpr *Init) { SyntacticForm = Init; } 33484c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3349a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor bool hadArrayRangeDesignator() const { return HadArrayRangeDesignator; } 33501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void sawArrayRangeDesignator(bool ARD = true) { 3351d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor HadArrayRangeDesignator = ARD; 3352a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor } 3353a9c878086036de36482cc21e35a33cabe9699b0aDouglas Gregor 335463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const; 3355c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek 335666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson static bool classof(const Stmt *T) { 33571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == InitListExprClass; 335866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson } 335966b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson static bool classof(const InitListExpr *) { return true; } 33601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson // Iterators 336263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 336363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall if (InitExprs.empty()) return child_range(); 336463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size()); 336563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 33661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3367709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek typedef InitExprsTy::iterator iterator; 33688111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu typedef InitExprsTy::const_iterator const_iterator; 3369709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek typedef InitExprsTy::reverse_iterator reverse_iterator; 33708111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu typedef InitExprsTy::const_reverse_iterator const_reverse_iterator; 33711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3372ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek iterator begin() { return InitExprs.begin(); } 33738111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu const_iterator begin() const { return InitExprs.begin(); } 3374ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek iterator end() { return InitExprs.end(); } 33758111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu const_iterator end() const { return InitExprs.end(); } 3376ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek reverse_iterator rbegin() { return InitExprs.rbegin(); } 33778111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu const_reverse_iterator rbegin() const { return InitExprs.rbegin(); } 3378ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek reverse_iterator rend() { return InitExprs.rend(); } 33798111a6150cb68a238d55a31f9f4f90869a43f988Zhongxing Xu const_reverse_iterator rend() const { return InitExprs.rend(); } 33804423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis 33814423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis friend class ASTStmtReader; 33824423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis friend class ASTStmtWriter; 338366b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson}; 338466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson 338505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @brief Represents a C99 designated initializer expression. 338605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 338705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// A designated initializer expression (C99 6.7.8) contains one or 338805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// more designators (which can be field designators, array 338905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designators, or GNU array-range designators) followed by an 339005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// expression that initializes the field or element(s) that the 339105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designators refer to. For example, given: 33921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 339305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @code 339405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// struct point { 339505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// double x; 339605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// double y; 339705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// }; 339805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// struct point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 339905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// @endcode 340005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// 340105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// The InitListExpr contains three DesignatedInitExprs, the first of 340205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// which covers @c [2].y=1.0. This DesignatedInitExpr will have two 340305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designators, one array designator for @c [2] followed by one field 340405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor/// designator for @c .y. The initalization expression will be 1.0. 340505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorclass DesignatedInitExpr : public Expr { 3406ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorpublic: 3407ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor /// \brief Forward declaration of the Designator class. 3408ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor class Designator; 3409ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 3410ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregorprivate: 341105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the '=' or ':' prior to the actual initializer 341205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// expression. 341305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation EqualOrColonLoc; 341405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3415eeae8f072748affce25ab4064982626361293390Douglas Gregor /// Whether this designated initializer used the GNU deprecated 341605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// syntax rather than the C99 '=' syntax. 3417eeae8f072748affce25ab4064982626361293390Douglas Gregor bool GNUSyntax : 1; 341805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 341905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The number of designators in this initializer expression. 342005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned NumDesignators : 15; 342105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3422ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor /// \brief The designators in this designated initialization 3423ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor /// expression. 3424ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designator *Designators; 3425ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 342605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The number of subexpressions of this initializer expression, 342705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// which contains both the initializer and any additional 342805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// expressions used by array and array-range designators. 342905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned NumSubExprs : 16; 343005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3431ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 3432319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor DesignatedInitExpr(ASTContext &C, QualType Ty, unsigned NumDesignators, 3433ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor const Designator *Designators, 3434eeae8f072748affce25ab4064982626361293390Douglas Gregor SourceLocation EqualOrColonLoc, bool GNUSyntax, 34359ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr **IndexExprs, unsigned NumIndexExprs, 34369ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor Expr *Init); 343705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3438d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor explicit DesignatedInitExpr(unsigned NumSubExprs) 3439d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor : Expr(DesignatedInitExprClass, EmptyShell()), 3440d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor NumDesignators(0), Designators(0), NumSubExprs(NumSubExprs) { } 3441d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 344205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorpublic: 344305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// A field designator, e.g., ".x". 344405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor struct FieldDesignator { 344505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// Refers to the field that is being initialized. The low bit 344605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// of this field determines whether this is actually a pointer 344705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// to an IdentifierInfo (if 1) or a FieldDecl (if 0). When 344805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// initially constructed, a field designator will store an 344905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// IdentifierInfo*. After semantic analysis has resolved that 345005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// name, the field designator will instead store a FieldDecl*. 345105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor uintptr_t NameOrField; 34521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 345305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the '.' in the designated initializer. 345405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned DotLoc; 34551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 345605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the field name in the designated initializer. 345705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned FieldLoc; 345805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor }; 345905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 346005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". 346105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor struct ArrayOrRangeDesignator { 346205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// Location of the first index expression within the designated 346305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// initializer expression's list of subexpressions. 346405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned Index; 346505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the '[' starting the array range designator. 346605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned LBracketLoc; 346705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the ellipsis separating the start and end 346805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// indices. Only valid for GNU array-range designators. 346905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned EllipsisLoc; 347005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// The location of the ']' terminating the array range designator. 34711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned RBracketLoc; 347205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor }; 347305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 347405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Represents a single C99 designator. 347505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// 347605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @todo This class is infuriatingly similar to clang::Designator, 347705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// but minor differences (storing indices vs. storing pointers) 347805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// keep us from reusing it. Try harder, later, to rectify these 347905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// differences. 348005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor class Designator { 348105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief The kind of designator this describes. 348205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor enum { 348305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor FieldDesignator, 348405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayDesignator, 348505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayRangeDesignator 348605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } Kind; 348705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 348805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor union { 348905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// A field designator, e.g., ".x". 349005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor struct FieldDesignator Field; 349105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". 349205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor struct ArrayOrRangeDesignator ArrayOrRange; 349305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor }; 349405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor friend class DesignatedInitExpr; 349505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 349605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor public: 3497ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor Designator() {} 3498ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 349905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Initializes a field designator. 35001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designator(const IdentifierInfo *FieldName, SourceLocation DotLoc, 35011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FieldLoc) 350205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor : Kind(FieldDesignator) { 350305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Field.NameOrField = reinterpret_cast<uintptr_t>(FieldName) | 0x01; 350405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Field.DotLoc = DotLoc.getRawEncoding(); 350505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Field.FieldLoc = FieldLoc.getRawEncoding(); 350605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 350705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 350805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Initializes an array designator. 35091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designator(unsigned Index, SourceLocation LBracketLoc, 351005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation RBracketLoc) 351105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor : Kind(ArrayDesignator) { 351205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.Index = Index; 351305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding(); 351405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.EllipsisLoc = SourceLocation().getRawEncoding(); 351505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding(); 351605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 351705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 351805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Initializes a GNU array-range designator. 35191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Designator(unsigned Index, SourceLocation LBracketLoc, 352005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation EllipsisLoc, SourceLocation RBracketLoc) 352105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor : Kind(ArrayRangeDesignator) { 352205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.Index = Index; 352305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding(); 352405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.EllipsisLoc = EllipsisLoc.getRawEncoding(); 352505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding(); 352605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 352705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 352805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool isFieldDesignator() const { return Kind == FieldDesignator; } 352905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool isArrayDesignator() const { return Kind == ArrayDesignator; } 353005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; } 353105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 353205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor IdentifierInfo * getFieldName(); 353305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 353405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor FieldDecl *getField() { 353505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(Kind == FieldDesignator && "Only valid on a field designator"); 353605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor if (Field.NameOrField & 0x01) 353705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return 0; 353805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor else 353905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return reinterpret_cast<FieldDecl *>(Field.NameOrField); 354005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 354105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 354205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor void setField(FieldDecl *FD) { 354305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(Kind == FieldDesignator && "Only valid on a field designator"); 354405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Field.NameOrField = reinterpret_cast<uintptr_t>(FD); 354505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 354605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 354787f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor SourceLocation getDotLoc() const { 354887f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor assert(Kind == FieldDesignator && "Only valid on a field designator"); 354987f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor return SourceLocation::getFromRawEncoding(Field.DotLoc); 355087f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor } 355187f55cf59e82f246d8605733e9300d0c5f6830a6Douglas Gregor 355205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation getFieldLoc() const { 355305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(Kind == FieldDesignator && "Only valid on a field designator"); 355405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return SourceLocation::getFromRawEncoding(Field.FieldLoc); 355505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 355605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 355705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation getLBracketLoc() const { 355805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 355905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor "Only valid on an array or array-range designator"); 356005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return SourceLocation::getFromRawEncoding(ArrayOrRange.LBracketLoc); 356105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 356205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 356305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation getRBracketLoc() const { 356405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 356505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor "Only valid on an array or array-range designator"); 356605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return SourceLocation::getFromRawEncoding(ArrayOrRange.RBracketLoc); 356705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 356805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 356905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation getEllipsisLoc() const { 357005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor assert(Kind == ArrayRangeDesignator && 357105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor "Only valid on an array-range designator"); 357205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return SourceLocation::getFromRawEncoding(ArrayOrRange.EllipsisLoc); 357305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 35744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 3575d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor unsigned getFirstExprIndex() const { 3576d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 3577d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor "Only valid on an array or array-range designator"); 3578d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor return ArrayOrRange.Index; 3579d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor } 3580d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 35814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor SourceLocation getStartLocation() const { 35824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Kind == FieldDesignator) 35834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return getDotLoc().isInvalid()? getFieldLoc() : getDotLoc(); 35844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 35854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor return getLBracketLoc(); 35864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 358724f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara SourceLocation getEndLocation() const { 358824f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara return Kind == FieldDesignator ? getFieldLoc() : getRBracketLoc(); 358924f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara } 359024f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara SourceRange getSourceRange() const { 359124f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara return SourceRange(getStartLocation(), getEndLocation()); 359224f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara } 359305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor }; 359405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 35951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static DesignatedInitExpr *Create(ASTContext &C, Designator *Designators, 359605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned NumDesignators, 359705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr **IndexExprs, unsigned NumIndexExprs, 359805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation EqualOrColonLoc, 3599eeae8f072748affce25ab4064982626361293390Douglas Gregor bool GNUSyntax, Expr *Init); 360005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3601d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor static DesignatedInitExpr *CreateEmpty(ASTContext &C, unsigned NumIndexExprs); 3602d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 360305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Returns the number of designators in this initializer. 360405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor unsigned size() const { return NumDesignators; } 360505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 360605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Iterator access to the designators. 360705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor typedef Designator* designators_iterator; 3608ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor designators_iterator designators_begin() { return Designators; } 36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump designators_iterator designators_end() { 36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Designators + NumDesignators; 3611ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor } 361205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3613cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek typedef std::reverse_iterator<designators_iterator> 3614cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek reverse_designators_iterator; 3615cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek reverse_designators_iterator designators_rbegin() { 3616cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek return reverse_designators_iterator(designators_end()); 3617cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek } 3618cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek reverse_designators_iterator designators_rend() { 3619cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek return reverse_designators_iterator(designators_begin()); 3620cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek } 3621cdba6595a61a7bd31f504260abf63c900a759d0fTed Kremenek 3622711997184366d584c9c437102cae1e9d9927b986Douglas Gregor Designator *getDesignator(unsigned Idx) { return &designators_begin()[Idx]; } 3623711997184366d584c9c437102cae1e9d9927b986Douglas Gregor 3624c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt void setDesignators(ASTContext &C, const Designator *Desigs, 3625319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor unsigned NumDesigs); 3626d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 362705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *getArrayIndex(const Designator& D); 362805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *getArrayRangeStart(const Designator& D); 362905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor Expr *getArrayRangeEnd(const Designator& D); 363005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 363105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Retrieve the location of the '=' that precedes the 363205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// initializer value itself, if present. 363305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor SourceLocation getEqualOrColonLoc() const { return EqualOrColonLoc; } 3634d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor void setEqualOrColonLoc(SourceLocation L) { EqualOrColonLoc = L; } 363505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 363605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Determines whether this designated initializer used the 3637eeae8f072748affce25ab4064982626361293390Douglas Gregor /// deprecated GNU syntax for designated initializers. 3638eeae8f072748affce25ab4064982626361293390Douglas Gregor bool usesGNUSyntax() const { return GNUSyntax; } 3639d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor void setGNUSyntax(bool GNU) { GNUSyntax = GNU; } 364005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 364105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor /// @brief Retrieve the initializer value. 36421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *getInit() const { 364305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor return cast<Expr>(*const_cast<DesignatedInitExpr*>(this)->child_begin()); 364405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 364505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 364605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor void setInit(Expr *init) { 364705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor *child_begin() = init; 364805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 364905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 3650d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// \brief Retrieve the total number of subexpressions in this 3651d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// designated initializer expression, including the actual 3652d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// initialized value and any expressions that occur within array 3653d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// and array-range designators. 3654d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor unsigned getNumSubExprs() const { return NumSubExprs; } 3655d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 3656d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor Expr *getSubExpr(unsigned Idx) { 3657d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor assert(Idx < NumSubExprs && "Subscript out of range"); 3658d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 3659d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 3660d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor return reinterpret_cast<Expr**>(reinterpret_cast<void**>(Ptr))[Idx]; 3661d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor } 3662d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 3663d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor void setSubExpr(unsigned Idx, Expr *E) { 3664d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor assert(Idx < NumSubExprs && "Subscript out of range"); 3665d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor char* Ptr = static_cast<char*>(static_cast<void *>(this)); 3666d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor Ptr += sizeof(DesignatedInitExpr); 3667d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor reinterpret_cast<Expr**>(reinterpret_cast<void**>(Ptr))[Idx] = E; 3668d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor } 3669d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 3670ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor /// \brief Replaces the designator at index @p Idx with the series 3671ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor /// of designators in [First, Last). 3672319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor void ExpandDesignator(ASTContext &C, unsigned Idx, const Designator *First, 3673ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor const Designator *Last); 3674ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor 367524f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara SourceRange getDesignatorsSourceRange() const; 367624f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara 367763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const; 367805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 367905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor static bool classof(const Stmt *T) { 36801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == DesignatedInitExprClass; 368105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor } 368205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor static bool classof(const DesignatedInitExpr *) { return true; } 368305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 368405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor // Iterators 368563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 368663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall Stmt **begin = reinterpret_cast<Stmt**>(this + 1); 368763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(begin, begin + NumSubExprs); 368863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 36893498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor}; 36903498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 36913498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// \brief Represents an implicitly-generated value initialization of 36923498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// an object of a given type. 36933498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// 36941a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// Implicit value initializations occur within semantic initializer 36951a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// list expressions (InitListExpr) as placeholders for subobject 36963498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor/// initializations not explicitly specified by the user. 36971a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// 36981a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor/// \see InitListExpr 36991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpclass ImplicitValueInitExpr : public Expr { 37003498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregorpublic: 37011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit ImplicitValueInitExpr(QualType ty) 3702f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(ImplicitValueInitExprClass, ty, VK_RValue, OK_Ordinary, 3703bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false, false, false) { } 37043498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 3705d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor /// \brief Construct an empty implicit value initialization. 3706d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor explicit ImplicitValueInitExpr(EmptyShell Empty) 3707d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor : Expr(ImplicitValueInitExprClass, Empty) { } 3708d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor 37091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 37103498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return T->getStmtClass() == ImplicitValueInitExprClass; 37113498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 37123498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor static bool classof(const ImplicitValueInitExpr *) { return true; } 37133498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 371463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 37153498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor return SourceRange(); 37163498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor } 37173498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 37183498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor // Iterators 371963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 372005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}; 372105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 37222ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 37232ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanclass ParenListExpr : public Expr { 37242ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman Stmt **Exprs; 37252ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned NumExprs; 37262ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SourceLocation LParenLoc, RParenLoc; 37272ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 37282ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanpublic: 37291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParenListExpr(ASTContext& C, SourceLocation lparenloc, Expr **exprs, 37302ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned numexprs, SourceLocation rparenloc); 37312ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 37322ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman /// \brief Build an empty paren list. 373337bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis explicit ParenListExpr(EmptyShell Empty) : Expr(ParenListExprClass, Empty) { } 37341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37352ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman unsigned getNumExprs() const { return NumExprs; } 37361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Expr* getExpr(unsigned Init) const { 37382ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman assert(Init < getNumExprs() && "Initializer access out of range!"); 37392ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman return cast_or_null<Expr>(Exprs[Init]); 37402ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 37411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr* getExpr(unsigned Init) { 37432ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman assert(Init < getNumExprs() && "Initializer access out of range!"); 37442ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman return cast_or_null<Expr>(Exprs[Init]); 37452ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 37462ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 374783ddad3ab513f5d73698cf9fbeb4ed3f011bc3b9Douglas Gregor Expr **getExprs() { return reinterpret_cast<Expr **>(Exprs); } 37481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37492ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SourceLocation getLParenLoc() const { return LParenLoc; } 37502ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman SourceLocation getRParenLoc() const { return RParenLoc; } 37512ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 375263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 37532ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman return SourceRange(LParenLoc, RParenLoc); 37541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 37552ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman static bool classof(const Stmt *T) { 37561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ParenListExprClass; 37572ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 37582ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman static bool classof(const ParenListExpr *) { return true; } 37591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37602ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman // Iterators 376163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 376263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Exprs[0], &Exprs[0]+NumExprs); 376363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 376437bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis 376560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 37663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl friend class ASTStmtWriter; 37672ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman}; 37682ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 37691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3770f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// \brief Represents a C1X generic selection. 3771f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// 3772f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// A generic selection (C1X 6.5.1.1) contains an unevaluated controlling 3773f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// expression, followed by one or more generic associations. Each generic 3774f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// association specifies a type name and an expression, or "default" and an 3775f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// expression (in which case it is known as a default generic association). 3776f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// The type and value of the generic selection are identical to those of its 3777f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// result expression, which is defined as the expression in the generic 3778f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// association with a type name that is compatible with the type of the 3779f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// controlling expression, or the expression in the default generic association 3780f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// if no types are compatible. For example: 3781f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// 3782f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// @code 3783f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// _Generic(X, double: 1, float: 2, default: 3) 3784f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// @endcode 3785f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// 3786f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// The above expression evaluates to 1 if 1.0 is substituted for X, 2 if 1.0f 3787f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// or 3 if "hello". 3788f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// 3789f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// As an extension, generic selections are allowed in C++, where the following 3790f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// additional semantics apply: 3791f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// 3792f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// Any generic selection whose controlling expression is type-dependent or 3793f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// which names a dependent type in its association list is result-dependent, 3794f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// which means that the choice of result expression is dependent. 3795f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne/// Result-dependent generic associations are both type- and value-dependent. 3796f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourneclass GenericSelectionExpr : public Expr { 3797f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne enum { CONTROLLING, END_EXPR }; 3798f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne TypeSourceInfo **AssocTypes; 3799f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne Stmt **SubExprs; 3800f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne unsigned NumAssocs, ResultIndex; 3801f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne SourceLocation GenericLoc, DefaultLoc, RParenLoc; 3802f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3803f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbournepublic: 3804f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne GenericSelectionExpr(ASTContext &Context, 3805f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne SourceLocation GenericLoc, Expr *ControllingExpr, 3806f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne TypeSourceInfo **AssocTypes, Expr **AssocExprs, 3807f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne unsigned NumAssocs, SourceLocation DefaultLoc, 3808f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne SourceLocation RParenLoc, 3809f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne bool ContainsUnexpandedParameterPack, 3810f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne unsigned ResultIndex); 3811f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3812f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne /// This constructor is used in the result-dependent case. 3813f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne GenericSelectionExpr(ASTContext &Context, 3814f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne SourceLocation GenericLoc, Expr *ControllingExpr, 3815f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne TypeSourceInfo **AssocTypes, Expr **AssocExprs, 3816f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne unsigned NumAssocs, SourceLocation DefaultLoc, 3817f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne SourceLocation RParenLoc, 3818f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne bool ContainsUnexpandedParameterPack); 3819f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3820f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne explicit GenericSelectionExpr(EmptyShell Empty) 3821f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne : Expr(GenericSelectionExprClass, Empty) { } 3822f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3823f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne unsigned getNumAssocs() const { return NumAssocs; } 3824f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3825f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne SourceLocation getGenericLoc() const { return GenericLoc; } 3826f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne SourceLocation getDefaultLoc() const { return DefaultLoc; } 3827f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne SourceLocation getRParenLoc() const { return RParenLoc; } 3828f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3829f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne const Expr *getAssocExpr(unsigned i) const { 3830f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return cast<Expr>(SubExprs[END_EXPR+i]); 3831f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 3832f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne Expr *getAssocExpr(unsigned i) { return cast<Expr>(SubExprs[END_EXPR+i]); } 3833f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3834f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne const TypeSourceInfo *getAssocTypeSourceInfo(unsigned i) const { 3835f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return AssocTypes[i]; 3836f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 3837f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne TypeSourceInfo *getAssocTypeSourceInfo(unsigned i) { return AssocTypes[i]; } 3838f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3839f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne QualType getAssocType(unsigned i) const { 3840f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne if (const TypeSourceInfo *TS = getAssocTypeSourceInfo(i)) 3841f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return TS->getType(); 3842f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne else 3843f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return QualType(); 3844f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 3845f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3846f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne const Expr *getControllingExpr() const { 3847f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return cast<Expr>(SubExprs[CONTROLLING]); 3848f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 3849f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne Expr *getControllingExpr() { return cast<Expr>(SubExprs[CONTROLLING]); } 3850f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3851f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne /// Whether this generic selection is result-dependent. 3852f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne bool isResultDependent() const { return ResultIndex == -1U; } 3853f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3854f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne /// The zero-based index of the result expression's generic association in 3855f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne /// the generic selection's association list. Defined only if the 3856f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne /// generic selection is not result-dependent. 3857f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne unsigned getResultIndex() const { 3858f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne assert(!isResultDependent() && "Generic selection is result-dependent"); 3859f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return ResultIndex; 3860f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 3861f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3862f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne /// The generic selection's result expression. Defined only if the 3863f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne /// generic selection is not result-dependent. 3864f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne const Expr *getResultExpr() const { return getAssocExpr(getResultIndex()); } 3865f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne Expr *getResultExpr() { return getAssocExpr(getResultIndex()); } 3866f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3867f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne SourceRange getSourceRange() const { 3868f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return SourceRange(GenericLoc, RParenLoc); 3869f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 3870f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne static bool classof(const Stmt *T) { 3871f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return T->getStmtClass() == GenericSelectionExprClass; 3872f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 3873f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne static bool classof(const GenericSelectionExpr *) { return true; } 3874f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3875f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne child_range children() { 3876f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return child_range(SubExprs, SubExprs+END_EXPR+NumAssocs); 3877f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 3878f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 3879f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne friend class ASTStmtReader; 3880f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne}; 3881f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 38824eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff//===----------------------------------------------------------------------===// 38834eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff// Clang Extensions 38844eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff//===----------------------------------------------------------------------===// 38854eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 3886a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner 3887a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// ExtVectorElementExpr - This represents access to specific elements of a 3888a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// vector, and may occur on the left hand side or right hand side. For example 3889a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// the following is legal: "V.xy = V.zw" if V is a 4 element extended vector. 3890a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner/// 389173525de7fd9bdd534382dc89a24f1f76db3e04b9Chris Lattner/// Note that the base may have either vector or pointer to vector type, just 389273525de7fd9bdd534382dc89a24f1f76db3e04b9Chris Lattner/// like a struct field reference. 389373525de7fd9bdd534382dc89a24f1f76db3e04b9Chris Lattner/// 3894a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattnerclass ExtVectorElementExpr : public Expr { 3895a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner Stmt *Base; 3896d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor IdentifierInfo *Accessor; 3897a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner SourceLocation AccessorLoc; 3898a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattnerpublic: 3899f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExtVectorElementExpr(QualType ty, ExprValueKind VK, Expr *base, 3900f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall IdentifierInfo &accessor, SourceLocation loc) 39010943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall : Expr(ExtVectorElementExprClass, ty, VK, 39020943168ac126b8047f30f6bd215fbe7db14d61baJohn McCall (VK == VK_RValue ? OK_Ordinary : OK_VectorComponent), 3903bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->isTypeDependent(), base->isValueDependent(), 3904bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor base->containsUnexpandedParameterPack()), 3905d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor Base(base), Accessor(&accessor), AccessorLoc(loc) {} 39061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3907d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor /// \brief Build an empty vector element expression. 3908d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor explicit ExtVectorElementExpr(EmptyShell Empty) 3909d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor : Expr(ExtVectorElementExprClass, Empty) { } 3910d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 3911a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner const Expr *getBase() const { return cast<Expr>(Base); } 3912a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner Expr *getBase() { return cast<Expr>(Base); } 3913d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setBase(Expr *E) { Base = E; } 3914d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 3915d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor IdentifierInfo &getAccessor() const { return *Accessor; } 3916d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setAccessor(IdentifierInfo *II) { Accessor = II; } 3917d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 3918d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor SourceLocation getAccessorLoc() const { return AccessorLoc; } 3919d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor void setAccessorLoc(SourceLocation L) { AccessorLoc = L; } 3920d3c98a02c73417689deaaa6671ea6df7f2a8a73cDouglas Gregor 3921a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner /// getNumElements - Get the number of components being selected. 3922a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner unsigned getNumElements() const; 39231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3924a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner /// containsDuplicateElements - Return true if any element access is 3925a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner /// repeated. 3926a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner bool containsDuplicateElements() const; 39271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3928a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner /// getEncodedElementAccess - Encode the elements accessed into an llvm 3929a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner /// aggregate Constant of ConstantInt(s). 3930a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner void getEncodedElementAccess(llvm::SmallVectorImpl<unsigned> &Elts) const; 39311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 393263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 3933a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner return SourceRange(getBase()->getLocStart(), AccessorLoc); 3934a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner } 39351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39362140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner /// isArrow - Return true if the base expression is a pointer to vector, 39372140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner /// return false if the base expression is a vector. 39382140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner bool isArrow() const; 39391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 39411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == ExtVectorElementExprClass; 3942a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner } 3943a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner static bool classof(const ExtVectorElementExpr *) { return true; } 39441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3945a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner // Iterators 394663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Base, &Base+1); } 3947a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner}; 3948a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner 3949a09f585a7fdbb01b4bf9de3679fd37005379ca66Chris Lattner 395056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff/// BlockExpr - Adaptor class for mixing a BlockDecl with expressions. 39519c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff/// ^{ statement-body } or ^(int arg1, float arg2){ statement-body } 39524eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffclass BlockExpr : public Expr { 395356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffprotected: 395456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff BlockDecl *TheBlock; 39554eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffpublic: 3956469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall BlockExpr(BlockDecl *BD, QualType ty) 3957f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(BlockExprClass, ty, VK_RValue, OK_Ordinary, 3958bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor ty->isDependentType(), false, false), 3959469a1eb996e1cb0be54f9b210f836afbddcbb2ccJohn McCall TheBlock(BD) {} 39609c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff 396184af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor /// \brief Build an empty block expression. 396284af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor explicit BlockExpr(EmptyShell Empty) : Expr(BlockExprClass, Empty) { } 396384af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor 3964d5cab5435371b8cc74a9e05ebd40b5995ebad149Anders Carlsson const BlockDecl *getBlockDecl() const { return TheBlock; } 396556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff BlockDecl *getBlockDecl() { return TheBlock; } 396684af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor void setBlockDecl(BlockDecl *BD) { TheBlock = BD; } 396784af7c27cdc615ff917a501d61256b4049383c97Douglas Gregor 396856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff // Convenience functions for probing the underlying BlockDecl. 396956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff SourceLocation getCaretLocation() const; 397056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff const Stmt *getBody() const; 397156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Stmt *getBody(); 39729c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff 397363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { 397456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff return SourceRange(getCaretLocation(), getBody()->getLocEnd()); 39759c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff } 39769c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff 397756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff /// getFunctionType - Return the underlying function type for this block. 397856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff const FunctionType *getFunctionType() const; 397956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 39819c3c902835ef7d37300463ad47176ec21a67dc8bSteve Naroff return T->getStmtClass() == BlockExprClass; 39824eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 39834eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff static bool classof(const BlockExpr *) { return true; } 39841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39854eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff // Iterators 398663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 39874eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}; 39881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39896b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// BlockDeclRefExpr - A reference to a local variable declared in an 39906b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall/// enclosing scope. 39914eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffclass BlockDeclRefExpr : public Expr { 39926b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall VarDecl *D; 39934eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff SourceLocation Loc; 39947d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian bool IsByRef : 1; 39957d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian bool ConstQualAdded : 1; 39964eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffpublic: 39976b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall BlockDeclRefExpr(VarDecl *d, QualType t, ExprValueKind VK, 39986b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall SourceLocation l, bool ByRef, bool constAdded = false); 399994cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 400094cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor // \brief Build an empty reference to a declared variable in a 400194cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor // block. 400294cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor explicit BlockDeclRefExpr(EmptyShell Empty) 400394cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor : Expr(BlockDeclRefExprClass, Empty) { } 40041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40056b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall VarDecl *getDecl() { return D; } 40066b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall const VarDecl *getDecl() const { return D; } 40076b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall void setDecl(VarDecl *VD) { D = VD; } 400894cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 400994cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor SourceLocation getLocation() const { return Loc; } 401094cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor void setLocation(SourceLocation L) { Loc = L; } 401194cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor 401263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall SourceRange getSourceRange() const { return SourceRange(Loc); } 40131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40144eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff bool isByRef() const { return IsByRef; } 401594cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor void setByRef(bool BR) { IsByRef = BR; } 40161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40177d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian bool isConstQualAdded() const { return ConstQualAdded; } 40187d5c74ecbbd8719436c071f38657bc8e97ee4a24Fariborz Jahanian void setConstQualAdded(bool C) { ConstQualAdded = C; } 401989f9d3a7651d1225f3f56ae3387c83b98a26da00Fariborz Jahanian 40201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 40211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == BlockDeclRefExprClass; 40224eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 40234eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff static bool classof(const BlockDeclRefExpr *) { return true; } 40241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40254eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff // Iterators 402663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 40274eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}; 40284eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 402961eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner/// AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] 403061eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner/// This AST node provides support for reinterpreting a type to another 403161eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner/// type of the same size. 403261eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattnerclass AsTypeExpr : public Expr { 403361eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattnerprivate: 403461eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner Expr* SrcExpr; 403561eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner QualType DstType; 403661eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner SourceLocation BuiltinLoc, RParenLoc; 403761eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner 403861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattnerpublic: 403961eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner AsTypeExpr(Expr* SrcExpr, QualType DstType, 404061eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner ExprValueKind VK, ExprObjectKind OK, 404161eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner SourceLocation BuiltinLoc, SourceLocation RParenLoc) 404261eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner : Expr(AsTypeExprClass, DstType, VK, OK, false, false, false), 404361eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner SrcExpr(SrcExpr), DstType(DstType), 404461eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {} 404561eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner 404661eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner /// \brief Build an empty __builtin_astype 404761eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {} 404861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner 404961eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner /// getSrcExpr - Return the Expr to be converted. 405061eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner Expr *getSrcExpr() const { return SrcExpr; } 405161eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner QualType getDstType() const { return DstType; } 405261eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner 40537b33c2b3908b178511ccaace8cacb5e5b14552a9Nick Lewycky SourceRange getSourceRange() const { 405461eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner return SourceRange(BuiltinLoc, RParenLoc); 405561eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner } 405661eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner 405761eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner static bool classof(const Stmt *T) { 405861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner return T->getStmtClass() == AsTypeExprClass; 405961eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner } 406061eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner static bool classof(const AsTypeExpr *) { return true; } 406161eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner 406261eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner // Iterators 406361eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner child_range children() { return child_range(); } 406461eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner}; 40655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 40665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 40675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 4068