15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- ExprCXX.h - Classes for representing expressions -------*- C++ -*-===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 9010bfc253050626435f006386c0bee4b55329687James Dennett/// 10010bfc253050626435f006386c0bee4b55329687James Dennett/// \file 11010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Defines the clang::Expr interface and subclasses for C++ expressions. 12010bfc253050626435f006386c0bee4b55329687James Dennett/// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_AST_EXPRCXX_H 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_AST_EXPRCXX_H 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 18478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/Decl.h" 194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/DeclCXX.h" 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Expr.h" 210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang/AST/LambdaCapture.h" 22d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall#include "clang/AST/TemplateBase.h" 2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/AST/UnresolvedSet.h" 2401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor#include "clang/Basic/ExpressionTraits.h" 2501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor#include "clang/Basic/TypeTraits.h" 26aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar#include "llvm/Support/Compiler.h" 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 30aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorclass CXXTemporary; 3176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallclass MSPropertyDecl; 32aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorclass TemplateArgumentListInfo; 332fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramerclass UuidAttr; 344c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 351060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek//===--------------------------------------------------------------------===// 361060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek// C++ Expressions. 371060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek//===--------------------------------------------------------------------===// 381060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 393fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// \brief A call to an overloaded operator written using operator 403fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// syntax. 413fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// 423fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// Represents a call to an overloaded operator written using operator 433fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// syntax, e.g., "x + y" or "*p". While semantically equivalent to a 443fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// normal call, this AST node provides better information about the 453fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// syntactic representation of the call. 463fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// 473fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// In a C++ template, this expression node kind will be used whenever 483fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// any of the arguments are type-dependent. In this case, the 493fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// function itself will be a (possibly empty) set of functions and 503fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// function templates that were found by name lookup at template 513fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// definition time. 52b4609806e9232593ece09ce08b630836e825865cDouglas Gregorclass CXXOperatorCallExpr : public CallExpr { 53063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /// \brief The overloaded operator. 54063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OverloadedOperatorKind Operator; 554548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis SourceRange Range; 56063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor 57be9af1288881110e406b87914162eaa59f1e5918Lang Hames // Record the FP_CONTRACT state that applies to this operator call. Only 58be9af1288881110e406b87914162eaa59f1e5918Lang Hames // meaningful for floating point types. For other types this value can be 59be9af1288881110e406b87914162eaa59f1e5918Lang Hames // set to false. 60be9af1288881110e406b87914162eaa59f1e5918Lang Hames unsigned FPContractable : 1; 61be9af1288881110e406b87914162eaa59f1e5918Lang Hames 624548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis SourceRange getSourceRangeImpl() const LLVM_READONLY; 63b4609806e9232593ece09ce08b630836e825865cDouglas Gregorpublic: 641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn, 653b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> args, QualType t, ExprValueKind VK, 66be9af1288881110e406b87914162eaa59f1e5918Lang Hames SourceLocation operatorloc, bool fpContractable) 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : CallExpr(C, CXXOperatorCallExprClass, fn, args, t, VK, operatorloc), 68be9af1288881110e406b87914162eaa59f1e5918Lang Hames Operator(Op), FPContractable(fpContractable) { 694548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis Range = getSourceRangeImpl(); 704548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis } 711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit CXXOperatorCallExpr(ASTContext& C, EmptyShell Empty) : 72ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis CallExpr(C, CXXOperatorCallExprClass, Empty) { } 731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 74b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 75010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the kind of overloaded operator that this 76b4609806e9232593ece09ce08b630836e825865cDouglas Gregor /// expression refers to. 77063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OverloadedOperatorKind getOperator() const { return Operator; } 78b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 79010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the location of the operator symbol in the expression. 80010bfc253050626435f006386c0bee4b55329687James Dennett /// 81010bfc253050626435f006386c0bee4b55329687James Dennett /// When \c getOperator()==OO_Call, this is the location of the right 82010bfc253050626435f006386c0bee4b55329687James Dennett /// parentheses; when \c getOperator()==OO_Subscript, this is the location 83010bfc253050626435f006386c0bee4b55329687James Dennett /// of the right bracket. 84b4609806e9232593ece09ce08b630836e825865cDouglas Gregor SourceLocation getOperatorLoc() const { return getRParenLoc(); } 85b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SourceLocation getExprLoc() const LLVM_READONLY { 870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return (Operator < OO_Plus || Operator >= OO_Arrow || 880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Operator == OO_PlusPlus || Operator == OO_MinusMinus) 890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ? getLocStart() 900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines : getOperatorLoc(); 910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 9365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } 9465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 954548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis SourceRange getSourceRange() const { return Range; } 961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == CXXOperatorCallExprClass; 99b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 1004548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis 101be9af1288881110e406b87914162eaa59f1e5918Lang Hames // Set the FP contractability status of this operator. Only meaningful for 102be9af1288881110e406b87914162eaa59f1e5918Lang Hames // operations on floating point types. 103be9af1288881110e406b87914162eaa59f1e5918Lang Hames void setFPContractable(bool FPC) { FPContractable = FPC; } 104be9af1288881110e406b87914162eaa59f1e5918Lang Hames 105be9af1288881110e406b87914162eaa59f1e5918Lang Hames // Get the FP contractability status of this operator. Only meaningful for 106be9af1288881110e406b87914162eaa59f1e5918Lang Hames // operations on floating point types. 107be9af1288881110e406b87914162eaa59f1e5918Lang Hames bool isFPContractable() const { return FPContractable; } 108be9af1288881110e406b87914162eaa59f1e5918Lang Hames 1094548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis friend class ASTStmtReader; 1104548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis friend class ASTStmtWriter; 111b4609806e9232593ece09ce08b630836e825865cDouglas Gregor}; 112b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 113010bfc253050626435f006386c0bee4b55329687James Dennett/// Represents a call to a member function that 11488a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// may be written either with member call syntax (e.g., "obj.func()" 11588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// or "objptr->func()") or with normal function-call syntax 11688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// ("func()") within a member function that ends up calling a member 11788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// function. The callee in either case is a MemberExpr that contains 11888a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// both the object argument and the member function, while the 11988a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// arguments are the arguments within the parentheses (not including 12088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// the object argument). 12188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorclass CXXMemberCallExpr : public CallExpr { 12288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorpublic: 1233b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer CXXMemberCallExpr(ASTContext &C, Expr *fn, ArrayRef<Expr*> args, 124f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType t, ExprValueKind VK, SourceLocation RP) 1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : CallExpr(C, CXXMemberCallExprClass, fn, args, t, VK, RP) {} 12688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 1271817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner CXXMemberCallExpr(ASTContext &C, EmptyShell Empty) 1281817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner : CallExpr(C, CXXMemberCallExprClass, Empty) { } 1291817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner 130010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieves the implicit object argument for the member call. 131010bfc253050626435f006386c0bee4b55329687James Dennett /// 132010bfc253050626435f006386c0bee4b55329687James Dennett /// For example, in "x.f(5)", this returns the sub-expression "x". 133b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek Expr *getImplicitObjectArgument() const; 134ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 135010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieves the declaration of the called method. 136b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek CXXMethodDecl *getMethodDecl() const; 13788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 138010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieves the CXXRecordDecl for the underlying type of 139010bfc253050626435f006386c0bee4b55329687James Dennett /// the implicit object argument. 140010bfc253050626435f006386c0bee4b55329687James Dennett /// 141010bfc253050626435f006386c0bee4b55329687James Dennett /// Note that this is may not be the same declaration as that of the class 142010bfc253050626435f006386c0bee4b55329687James Dennett /// context of the CXXMethodDecl which this function is calling. 143007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth /// FIXME: Returns 0 for member pointer call exprs. 1440cf3c0eecbff007cea2750c113894b47d9e09f33David Blaikie CXXRecordDecl *getRecordDecl() const; 145007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth 1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation getExprLoc() const LLVM_READONLY { 1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation CLoc = getCallee()->getExprLoc(); 1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (CLoc.isValid()) 1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return CLoc; 1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getLocStart(); 1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 15588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor return T->getStmtClass() == CXXMemberCallExprClass; 15688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor } 15788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor}; 15888a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 159010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a call to a CUDA kernel function. 160e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourneclass CUDAKernelCallExpr : public CallExpr { 161e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourneprivate: 162e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne enum { CONFIG, END_PREARG }; 163e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 164e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournepublic: 165e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne CUDAKernelCallExpr(ASTContext &C, Expr *fn, CallExpr *Config, 1663b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> args, QualType t, ExprValueKind VK, 1673b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer SourceLocation RP) 1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : CallExpr(C, CUDAKernelCallExprClass, fn, Config, args, t, VK, RP) {} 169e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 170e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne CUDAKernelCallExpr(ASTContext &C, EmptyShell Empty) 171e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne : CallExpr(C, CUDAKernelCallExprClass, END_PREARG, Empty) { } 172e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 173e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne const CallExpr *getConfig() const { 174e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return cast_or_null<CallExpr>(getPreArg(CONFIG)); 175e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne } 176e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne CallExpr *getConfig() { return cast_or_null<CallExpr>(getPreArg(CONFIG)); } 1774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \brief Sets the kernel configuration expression. 1794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 1804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Note that this method cannot be called if config has already been set to a 1814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// non-null value. 1824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void setConfig(CallExpr *E) { 1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(!getConfig() && 1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar "Cannot call setConfig if config is not null"); 1854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar setPreArg(CONFIG, E); 1864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar setInstantiationDependent(isInstantiationDependent() || 1874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar E->isInstantiationDependent()); 1884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar setContainsUnexpandedParameterPack(containsUnexpandedParameterPack() || 1894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar E->containsUnexpandedParameterPack()); 1904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 191e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 192e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne static bool classof(const Stmt *T) { 193e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return T->getStmtClass() == CUDAKernelCallExprClass; 194e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne } 195e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne}; 196e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 197010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Abstract class common to all of the C++ "named"/"keyword" casts. 19849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// 19949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This abstract class is inherited by all of the classes 200010bfc253050626435f006386c0bee4b55329687James Dennett/// representing "named" casts: CXXStaticCastExpr for \c static_cast, 201010bfc253050626435f006386c0bee4b55329687James Dennett/// CXXDynamicCastExpr for \c dynamic_cast, CXXReinterpretCastExpr for 202010bfc253050626435f006386c0bee4b55329687James Dennett/// reinterpret_cast, and CXXConstCastExpr for \c const_cast. 20349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXNamedCastExpr : public ExplicitCastExpr { 2041060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekprivate: 2051060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation Loc; // the location of the casting op 2061d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation RParenLoc; // the location of the right parenthesis 207f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets; // range for '<' '>' 208ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 20949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorprotected: 210f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXNamedCastExpr(StmtClass SC, QualType ty, ExprValueKind VK, 211f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CastKind kind, Expr *op, unsigned PathSize, 2121d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor TypeSourceInfo *writtenTy, SourceLocation l, 213f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 214f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets) 2151d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor : ExplicitCastExpr(SC, ty, VK, kind, op, PathSize, writtenTy), Loc(l), 216f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian RParenLoc(RParenLoc), AngleBrackets(AngleBrackets) {} 21749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 218f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit CXXNamedCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize) 219f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : ExplicitCastExpr(SC, Shell, PathSize) { } 220ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 2211d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor friend class ASTStmtReader; 222ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2231060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 22449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor const char *getCastName() const; 22549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 226a3a7b8eea87c90a5a257f685749222b212ddaf36Douglas Gregor /// \brief Retrieve the location of the cast operator keyword, e.g., 227010bfc253050626435f006386c0bee4b55329687James Dennett /// \c static_cast. 228a3a7b8eea87c90a5a257f685749222b212ddaf36Douglas Gregor SourceLocation getOperatorLoc() const { return Loc; } 229a3a7b8eea87c90a5a257f685749222b212ddaf36Douglas Gregor 2301d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor /// \brief Retrieve the location of the closing parenthesis. 2311d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 232ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 23365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 23465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 235f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange getAngleBrackets() const LLVM_READONLY { return AngleBrackets; } 23665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen 2371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 23849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor switch (T->getStmtClass()) { 23949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXStaticCastExprClass: 24049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXDynamicCastExprClass: 24149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXReinterpretCastExprClass: 24249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXConstCastExprClass: 24349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return true; 24449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor default: 24549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return false; 24649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 2471060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 24849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 24949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 250010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A C++ \c static_cast expression (C++ [expr.static.cast]). 2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 25249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a C++ static cast, e.g., 253010bfc253050626435f006386c0bee4b55329687James Dennett/// \c static_cast<int>(1.0). 2544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CXXStaticCastExpr final 2554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public CXXNamedCastExpr, 2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<CXXStaticCastExpr, CXXBaseSpecifier *> { 257f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXStaticCastExpr(QualType ty, ExprValueKind vk, CastKind kind, Expr *op, 258f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned pathSize, TypeSourceInfo *writtenTy, 259f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation l, SourceLocation RParenLoc, 260f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets) 261f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CXXNamedCastExpr(CXXStaticCastExprClass, ty, vk, kind, op, pathSize, 262f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian writtenTy, l, RParenLoc, AngleBrackets) {} 26349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 264f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit CXXStaticCastExpr(EmptyShell Empty, unsigned PathSize) 265f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CXXNamedCastExpr(CXXStaticCastExprClass, Empty, PathSize) { } 266f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 267f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 26832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXStaticCastExpr *Create(const ASTContext &Context, QualType T, 269f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, CastKind K, Expr *Op, 270f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *Path, 271ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *Written, SourceLocation L, 272f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 273f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets); 27432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXStaticCastExpr *CreateEmpty(const ASTContext &Context, 275f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize); 276ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 2771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 27849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXStaticCastExprClass; 27949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 2804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 2824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend class CastExpr; 28349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 28449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 285010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A C++ @c dynamic_cast expression (C++ [expr.dynamic.cast]). 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 28749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a dynamic cast, e.g., 28880747a834cf8b0304b314ede9aba3d6ddb8e9520NAKAMURA Takumi/// \c dynamic_cast<Derived*>(BasePtr). Such a cast may perform a run-time 289010bfc253050626435f006386c0bee4b55329687James Dennett/// check to determine how to perform the type conversion. 2904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CXXDynamicCastExpr final 2914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public CXXNamedCastExpr, 2924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<CXXDynamicCastExpr, CXXBaseSpecifier *> { 293f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXDynamicCastExpr(QualType ty, ExprValueKind VK, CastKind kind, 294f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr *op, unsigned pathSize, TypeSourceInfo *writtenTy, 295f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation l, SourceLocation RParenLoc, 296f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets) 297f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, VK, kind, op, pathSize, 298f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian writtenTy, l, RParenLoc, AngleBrackets) {} 29949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 300f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit CXXDynamicCastExpr(EmptyShell Empty, unsigned pathSize) 301f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CXXNamedCastExpr(CXXDynamicCastExprClass, Empty, pathSize) { } 302f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 303f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 30432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXDynamicCastExpr *Create(const ASTContext &Context, QualType T, 305f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, CastKind Kind, Expr *Op, 306f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *Path, 307ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *Written, SourceLocation L, 308f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 309f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets); 310ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 31132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXDynamicCastExpr *CreateEmpty(const ASTContext &Context, 312f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned pathSize); 313ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 3140fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson bool isAlwaysNull() const; 3150fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson 3161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 31749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXDynamicCastExprClass; 31849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 3194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 3214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend class CastExpr; 32249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 32349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 324010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A C++ @c reinterpret_cast expression (C++ [expr.reinterpret.cast]). 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 32649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a reinterpret cast, e.g., 32749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// @c reinterpret_cast<int>(VoidPtr). 328010bfc253050626435f006386c0bee4b55329687James Dennett/// 329010bfc253050626435f006386c0bee4b55329687James Dennett/// A reinterpret_cast provides a differently-typed view of a value but 330010bfc253050626435f006386c0bee4b55329687James Dennett/// (in Clang, as in most C++ implementations) performs no actual work at 331010bfc253050626435f006386c0bee4b55329687James Dennett/// run time. 3324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CXXReinterpretCastExpr final 3334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public CXXNamedCastExpr, 3344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<CXXReinterpretCastExpr, 3354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXBaseSpecifier *> { 336f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXReinterpretCastExpr(QualType ty, ExprValueKind vk, CastKind kind, 337f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr *op, unsigned pathSize, 338ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *writtenTy, SourceLocation l, 339f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 340f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets) 341f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, vk, kind, op, 342f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian pathSize, writtenTy, l, RParenLoc, AngleBrackets) {} 34349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 344f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXReinterpretCastExpr(EmptyShell Empty, unsigned pathSize) 345f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CXXNamedCastExpr(CXXReinterpretCastExprClass, Empty, pathSize) { } 346f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 347f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 34832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXReinterpretCastExpr *Create(const ASTContext &Context, QualType T, 349f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, CastKind Kind, 350f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr *Op, const CXXCastPath *Path, 351ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *WrittenTy, SourceLocation L, 352f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 353f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets); 35432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXReinterpretCastExpr *CreateEmpty(const ASTContext &Context, 355f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned pathSize); 356ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 35849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXReinterpretCastExprClass; 35949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend class CastExpr; 36349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 36449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 365010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A C++ \c const_cast expression (C++ [expr.const.cast]). 3661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 36749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a const cast, e.g., 368010bfc253050626435f006386c0bee4b55329687James Dennett/// \c const_cast<char*>(PtrToConstChar). 369010bfc253050626435f006386c0bee4b55329687James Dennett/// 370010bfc253050626435f006386c0bee4b55329687James Dennett/// A const_cast can remove type qualifiers but does not change the underlying 371010bfc253050626435f006386c0bee4b55329687James Dennett/// value. 3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CXXConstCastExpr final 3734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public CXXNamedCastExpr, 3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<CXXConstCastExpr, CXXBaseSpecifier *> { 375f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXConstCastExpr(QualType ty, ExprValueKind VK, Expr *op, 376ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *writtenTy, SourceLocation l, 377f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, SourceRange AngleBrackets) 378ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie : CXXNamedCastExpr(CXXConstCastExprClass, ty, VK, CK_NoOp, op, 379f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian 0, writtenTy, l, RParenLoc, AngleBrackets) {} 38049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 381ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig explicit CXXConstCastExpr(EmptyShell Empty) 382f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CXXNamedCastExpr(CXXConstCastExprClass, Empty, 0) { } 383f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 384f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 38532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXConstCastExpr *Create(const ASTContext &Context, QualType T, 386f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, Expr *Op, 387ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *WrittenTy, SourceLocation L, 388f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 389f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets); 39032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXConstCastExpr *CreateEmpty(const ASTContext &Context); 391ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 3921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 39349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXConstCastExprClass; 39449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 3954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 3974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend class CastExpr; 3981060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 3991060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 400010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A call to a literal operator (C++11 [over.literal]) 4019fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// written as a user-defined literal (C++11 [lit.ext]). 4029fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// 4039fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// Represents a user-defined literal, e.g. "foo"_bar or 1.23_xyz. While this 4049fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// is semantically equivalent to a normal call, this AST node provides better 4059fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// information about the syntactic representation of the literal. 4069fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// 4079fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// Since literal operators are never found by ADL and can only be declared at 4089fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// namespace scope, a user-defined literal is never dependent. 4099fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smithclass UserDefinedLiteral : public CallExpr { 4109fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// \brief The location of a ud-suffix within the literal. 4119fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith SourceLocation UDSuffixLoc; 4129fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 4139fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smithpublic: 41432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper UserDefinedLiteral(const ASTContext &C, Expr *Fn, ArrayRef<Expr*> Args, 4159fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith QualType T, ExprValueKind VK, SourceLocation LitEndLoc, 4169fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith SourceLocation SuffixLoc) 4174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : CallExpr(C, UserDefinedLiteralClass, Fn, Args, T, VK, LitEndLoc), 4183b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer UDSuffixLoc(SuffixLoc) {} 41932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper explicit UserDefinedLiteral(const ASTContext &C, EmptyShell Empty) 4209fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith : CallExpr(C, UserDefinedLiteralClass, Empty) {} 4219fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 4229fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// The kind of literal operator which is invoked. 4239fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith enum LiteralOperatorKind { 4249fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_Raw, ///< Raw form: operator "" X (const char *) 4259fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_Template, ///< Raw form: operator "" X<cs...> () 4269fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_Integer, ///< operator "" X (unsigned long long) 4279fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_Floating, ///< operator "" X (long double) 4289fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_String, ///< operator "" X (const CharT *, size_t) 4299fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_Character ///< operator "" X (CharT) 4309fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith }; 4319fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 432010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the kind of literal operator invocation 4339fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// which this expression represents. 4349fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LiteralOperatorKind getLiteralOperatorKind() const; 4359fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 436010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief If this is not a raw user-defined literal, get the 4379fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// underlying cooked literal (representing the literal with the suffix 4389fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// removed). 4399fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith Expr *getCookedLiteral(); 4409fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith const Expr *getCookedLiteral() const { 4419fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return const_cast<UserDefinedLiteral*>(this)->getCookedLiteral(); 4429fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith } 4439fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 4440265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara SourceLocation getLocStart() const { 4450265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara if (getLiteralOperatorKind() == LOK_Template) 4460265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara return getRParenLoc(); 4470265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara return getArg(0)->getLocStart(); 4480265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara } 4490265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara SourceLocation getLocEnd() const { return getRParenLoc(); } 4500265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara 4510265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara 452010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the location of a ud-suffix in the expression. 453010bfc253050626435f006386c0bee4b55329687James Dennett /// 4549fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// For a string literal, there may be multiple identical suffixes. This 4559fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// returns the first. 4560265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara SourceLocation getUDSuffixLoc() const { return UDSuffixLoc; } 4579fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 458010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the ud-suffix specified for this literal. 4599fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith const IdentifierInfo *getUDSuffix() const; 4609fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 4619fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith static bool classof(const Stmt *S) { 4629fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return S->getStmtClass() == UserDefinedLiteralClass; 4639fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith } 4649fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 4659fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith friend class ASTStmtReader; 4669fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith friend class ASTStmtWriter; 4679fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith}; 4689fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 469010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A boolean literal, per ([C++ lex.bool] Boolean literals). 4701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 4711060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXBoolLiteralExpr : public Expr { 4721060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek bool Value; 4731060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation Loc; 4741060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) : 476bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Expr(CXXBoolLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false, 477561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor false, false), 478f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Value(val), Loc(l) {} 4798b0b475b3464b0f70b91ba7d679d23c424677d5eSebastian Redl 480eb7f96141f754150a92433286fa385910a22f494Sam Weinig explicit CXXBoolLiteralExpr(EmptyShell Empty) 481eb7f96141f754150a92433286fa385910a22f494Sam Weinig : Expr(CXXBoolLiteralExprClass, Empty) { } 482eb7f96141f754150a92433286fa385910a22f494Sam Weinig 4831060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek bool getValue() const { return Value; } 484eb7f96141f754150a92433286fa385910a22f494Sam Weinig void setValue(bool V) { Value = V; } 4855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 48665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 48765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 489eb7f96141f754150a92433286fa385910a22f494Sam Weinig SourceLocation getLocation() const { return Loc; } 490eb7f96141f754150a92433286fa385910a22f494Sam Weinig void setLocation(SourceLocation L) { Loc = L; } 491eb7f96141f754150a92433286fa385910a22f494Sam Weinig 4921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 4931060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXBoolLiteralExprClass; 4941060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 4951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4961060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 49787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 49887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 49987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 5001060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 5011060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 502010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief The null pointer literal (C++11 [lex.nullptr]) 503010bfc253050626435f006386c0bee4b55329687James Dennett/// 504010bfc253050626435f006386c0bee4b55329687James Dennett/// Introduced in C++11, the only literal of type \c nullptr_t is \c nullptr. 5056e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlclass CXXNullPtrLiteralExpr : public Expr { 5066e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl SourceLocation Loc; 5076e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlpublic: 5086e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl CXXNullPtrLiteralExpr(QualType Ty, SourceLocation l) : 509bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Expr(CXXNullPtrLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false, 510561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor false, false), 511f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Loc(l) {} 5126e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 513eb7f96141f754150a92433286fa385910a22f494Sam Weinig explicit CXXNullPtrLiteralExpr(EmptyShell Empty) 514eb7f96141f754150a92433286fa385910a22f494Sam Weinig : Expr(CXXNullPtrLiteralExprClass, Empty) { } 515eb7f96141f754150a92433286fa385910a22f494Sam Weinig 51665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 51765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 5186e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 519eb7f96141f754150a92433286fa385910a22f494Sam Weinig SourceLocation getLocation() const { return Loc; } 520eb7f96141f754150a92433286fa385910a22f494Sam Weinig void setLocation(SourceLocation L) { Loc = L; } 521eb7f96141f754150a92433286fa385910a22f494Sam Weinig 5226e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl static bool classof(const Stmt *T) { 5236e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl return T->getStmtClass() == CXXNullPtrLiteralExprClass; 5246e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl } 5256e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 52687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 52787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 52887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 5296e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl}; 5306e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 5317c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith/// \brief Implicit construction of a std::initializer_list<T> object from an 5327c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith/// array temporary within list-initialization (C++11 [dcl.init.list]p5). 5337c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithclass CXXStdInitializerListExpr : public Expr { 5347c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith Stmt *SubExpr; 5357c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5367c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith CXXStdInitializerListExpr(EmptyShell Empty) 5376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(CXXStdInitializerListExprClass, Empty), SubExpr(nullptr) {} 5387c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5397c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithpublic: 5407c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith CXXStdInitializerListExpr(QualType Ty, Expr *SubExpr) 5417c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith : Expr(CXXStdInitializerListExprClass, Ty, VK_RValue, OK_Ordinary, 5427c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith Ty->isDependentType(), SubExpr->isValueDependent(), 5437c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SubExpr->isInstantiationDependent(), 5447c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SubExpr->containsUnexpandedParameterPack()), 5457c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SubExpr(SubExpr) {} 5467c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5477c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith Expr *getSubExpr() { return static_cast<Expr*>(SubExpr); } 5487c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith const Expr *getSubExpr() const { return static_cast<const Expr*>(SubExpr); } 5497c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5507c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SourceLocation getLocStart() const LLVM_READONLY { 5517c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return SubExpr->getLocStart(); 5527c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 5537c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SourceLocation getLocEnd() const LLVM_READONLY { 5547c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return SubExpr->getLocEnd(); 5557c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 5567c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SourceRange getSourceRange() const LLVM_READONLY { 5577c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return SubExpr->getSourceRange(); 5587c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 5597c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5607c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith static bool classof(const Stmt *S) { 5617c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return S->getStmtClass() == CXXStdInitializerListExprClass; 5627c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 5637c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5647c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith child_range children() { return child_range(&SubExpr, &SubExpr + 1); } 5657c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5667c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith friend class ASTReader; 5677c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith friend class ASTStmtReader; 5687c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith}; 5697c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 570010bfc253050626435f006386c0bee4b55329687James Dennett/// A C++ \c typeid expression (C++ [expr.typeid]), which gets 571010bfc253050626435f006386c0bee4b55329687James Dennett/// the \c type_info that corresponds to the supplied type, or the (possibly 572c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// dynamic) type of the supplied expression. 573c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// 574010bfc253050626435f006386c0bee4b55329687James Dennett/// This represents code like \c typeid(int) or \c typeid(*objPtr) 575c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlclass CXXTypeidExpr : public Expr { 576c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlprivate: 57757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand; 578c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl SourceRange Range; 579c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 580c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlpublic: 58157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor CXXTypeidExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R) 582f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary, 58357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor // typeid is never type-dependent (C++ [temp.dep.expr]p4) 58457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor false, 58557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor // typeid is value-dependent if the type or expression are dependent 586bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->getType()->isDependentType(), 587561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Operand->getType()->isInstantiationDependentType(), 588bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->getType()->containsUnexpandedParameterPack()), 58957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor Operand(Operand), Range(R) { } 590ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 59157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor CXXTypeidExpr(QualType Ty, Expr *Operand, SourceRange R) 592f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary, 5932850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl // typeid is never type-dependent (C++ [temp.dep.expr]p4) 594bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false, 5952850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl // typeid is value-dependent if the type or expression are dependent 596bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->isTypeDependent() || Operand->isValueDependent(), 597561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Operand->isInstantiationDependent(), 598bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->containsUnexpandedParameterPack()), 59957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor Operand(Operand), Range(R) { } 600c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 60114ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner CXXTypeidExpr(EmptyShell Empty, bool isExpr) 60214ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner : Expr(CXXTypeidExprClass, Empty) { 60314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner if (isExpr) 6046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Operand = (Expr*)nullptr; 60514ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner else 6066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Operand = (TypeSourceInfo*)nullptr; 60714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner } 608ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 6090d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith /// Determine whether this typeid has a type operand which is potentially 6100d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith /// evaluated, per C++11 [expr.typeid]p3. 6110d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith bool isPotentiallyEvaluated() const; 6120d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith 61357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); } 614ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 61557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor /// \brief Retrieves the type operand of this typeid() expression after 61657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor /// various required adjustments (removing reference types, cv-qualifiers). 617fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer QualType getTypeOperand(ASTContext &Context) const; 61857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor 61957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor /// \brief Retrieve source information for the type operand. 62057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TypeSourceInfo *getTypeOperandSourceInfo() const { 621c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)"); 62257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return Operand.get<TypeSourceInfo *>(); 623c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 62414ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner 62514ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner void setTypeOperandSourceInfo(TypeSourceInfo *TSI) { 62614ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)"); 62714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner Operand = TSI; 62814ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner } 629ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 63014ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner Expr *getExprOperand() const { 631c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)"); 63257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return static_cast<Expr*>(Operand.get<Stmt *>()); 633c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 634ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 635030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner void setExprOperand(Expr *E) { 636030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)"); 637030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner Operand = E; 638030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner } 639ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 64065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } 64165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 642aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar SourceRange getSourceRange() const LLVM_READONLY { return Range; } 64314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner void setSourceRange(SourceRange R) { Range = R; } 644ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 645c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl static bool classof(const Stmt *T) { 646c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl return T->getStmtClass() == CXXTypeidExprClass; 647c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 648c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 649c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl // Iterators 65063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 65187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isTypeOperand()) 65287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 65363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall Stmt **begin = reinterpret_cast<Stmt**>(&Operand); 65463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(begin, begin + 1); 65563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 656c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl}; 657c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 658010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A member reference to an MSPropertyDecl. 659010bfc253050626435f006386c0bee4b55329687James Dennett/// 660010bfc253050626435f006386c0bee4b55329687James Dennett/// This expression always has pseudo-object type, and therefore it is 661010bfc253050626435f006386c0bee4b55329687James Dennett/// typically not encountered in a fully-typechecked expression except 662010bfc253050626435f006386c0bee4b55329687James Dennett/// within the syntactic form of a PseudoObjectExpr. 66376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallclass MSPropertyRefExpr : public Expr { 66476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall Expr *BaseExpr; 66576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall MSPropertyDecl *TheDecl; 66676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceLocation MemberLoc; 66776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall bool IsArrow; 66876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall NestedNameSpecifierLoc QualifierLoc; 66976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 67076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallpublic: 67176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall MSPropertyRefExpr(Expr *baseExpr, MSPropertyDecl *decl, bool isArrow, 67276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall QualType ty, ExprValueKind VK, 67376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall NestedNameSpecifierLoc qualifierLoc, 67476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceLocation nameLoc) 67576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall : Expr(MSPropertyRefExprClass, ty, VK, OK_Ordinary, 67676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall /*type-dependent*/ false, baseExpr->isValueDependent(), 67776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall baseExpr->isInstantiationDependent(), 67876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall baseExpr->containsUnexpandedParameterPack()), 67976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall BaseExpr(baseExpr), TheDecl(decl), 68076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall MemberLoc(nameLoc), IsArrow(isArrow), 68176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall QualifierLoc(qualifierLoc) {} 68276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 68376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall MSPropertyRefExpr(EmptyShell Empty) : Expr(MSPropertyRefExprClass, Empty) {} 68476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 68576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceRange getSourceRange() const LLVM_READONLY { 68676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return SourceRange(getLocStart(), getLocEnd()); 68776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 68876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall bool isImplicitAccess() const { 68976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return getBaseExpr() && getBaseExpr()->isImplicitCXXThis(); 69076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 69176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceLocation getLocStart() const { 69276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall if (!isImplicitAccess()) 69376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return BaseExpr->getLocStart(); 69476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall else if (QualifierLoc) 69576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return QualifierLoc.getBeginLoc(); 69676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall else 69776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return MemberLoc; 69876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 69976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceLocation getLocEnd() const { return getMemberLoc(); } 70076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 70176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall child_range children() { 70276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return child_range((Stmt**)&BaseExpr, (Stmt**)&BaseExpr + 1); 70376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 70476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall static bool classof(const Stmt *T) { 70576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return T->getStmtClass() == MSPropertyRefExprClass; 70676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 70776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 70876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall Expr *getBaseExpr() const { return BaseExpr; } 70976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall MSPropertyDecl *getPropertyDecl() const { return TheDecl; } 71076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall bool isArrow() const { return IsArrow; } 71176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceLocation getMemberLoc() const { return MemberLoc; } 71276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; } 71376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 71476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall friend class ASTStmtReader; 71576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall}; 71676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 71787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// MS property subscript expression. 71887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// MSVC supports 'property' attribute and allows to apply it to the 71987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// declaration of an empty array in a class or structure definition. 72087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// For example: 72187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \code 72287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// __declspec(property(get=GetX, put=PutX)) int x[]; 72387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \endcode 72487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// The above statement indicates that x[] can be used with one or more array 72587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// indices. In this case, i=p->x[a][b] will be turned into i=p->GetX(a, b), and 72687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// p->x[a][b] = i will be turned into p->PutX(a, b, i). 72787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// This is a syntactic pseudo-object expression. 72887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass MSPropertySubscriptExpr : public Expr { 72987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar friend class ASTStmtReader; 73087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar enum { BASE_EXPR, IDX_EXPR, NUM_SUBEXPRS = 2 }; 73187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stmt *SubExprs[NUM_SUBEXPRS]; 73287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation RBracketLoc; 73387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 73487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void setBase(Expr *Base) { SubExprs[BASE_EXPR] = Base; } 73587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void setIdx(Expr *Idx) { SubExprs[IDX_EXPR] = Idx; } 73687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 73787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic: 73887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar MSPropertySubscriptExpr(Expr *Base, Expr *Idx, QualType Ty, ExprValueKind VK, 73987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ExprObjectKind OK, SourceLocation RBracketLoc) 74087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : Expr(MSPropertySubscriptExprClass, Ty, VK, OK, Idx->isTypeDependent(), 74187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Idx->isValueDependent(), Idx->isInstantiationDependent(), 74287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Idx->containsUnexpandedParameterPack()), 74387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar RBracketLoc(RBracketLoc) { 74487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[BASE_EXPR] = Base; 74587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[IDX_EXPR] = Idx; 74687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 74787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 74887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Create an empty array subscript expression. 74987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar explicit MSPropertySubscriptExpr(EmptyShell Shell) 75087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : Expr(MSPropertySubscriptExprClass, Shell) {} 75187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 75287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getBase() { return cast<Expr>(SubExprs[BASE_EXPR]); } 75387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const Expr *getBase() const { return cast<Expr>(SubExprs[BASE_EXPR]); } 75487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 75587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getIdx() { return cast<Expr>(SubExprs[IDX_EXPR]); } 75687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const Expr *getIdx() const { return cast<Expr>(SubExprs[IDX_EXPR]); } 75787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 75887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getLocStart() const LLVM_READONLY { 75987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getBase()->getLocStart(); 76087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 76187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getLocEnd() const LLVM_READONLY { return RBracketLoc; } 76287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 76387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getRBracketLoc() const { return RBracketLoc; } 76487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void setRBracketLoc(SourceLocation L) { RBracketLoc = L; } 76587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 76687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getExprLoc() const LLVM_READONLY { 76787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getBase()->getExprLoc(); 76887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 76987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 77087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar static bool classof(const Stmt *T) { 77187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return T->getStmtClass() == MSPropertySubscriptExprClass; 77287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 77387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 77487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Iterators 77587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 77687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(&SubExprs[0], &SubExprs[0] + NUM_SUBEXPRS); 77787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 77887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}; 77987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 780010bfc253050626435f006386c0bee4b55329687James Dennett/// A Microsoft C++ @c __uuidof expression, which gets 78101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet/// the _GUID that corresponds to the supplied type or expression. 78201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet/// 78301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet/// This represents code like @c __uuidof(COMTYPE) or @c __uuidof(*comPtr) 78401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetclass CXXUuidofExpr : public Expr { 78501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetprivate: 78601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand; 7874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef UuidStr; 78801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SourceRange Range; 78901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 79001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetpublic: 7914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, StringRef UuidStr, 7924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceRange R) 7934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, false, 7944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Operand->getType()->isDependentType(), 7954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Operand->getType()->isInstantiationDependentType(), 7964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Operand->getType()->containsUnexpandedParameterPack()), 7974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Operand(Operand), UuidStr(UuidStr), Range(R) {} 7984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 7994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXUuidofExpr(QualType Ty, Expr *Operand, StringRef UuidStr, SourceRange R) 8004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, false, 8014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Operand->isTypeDependent(), Operand->isInstantiationDependent(), 8024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Operand->containsUnexpandedParameterPack()), 8034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Operand(Operand), UuidStr(UuidStr), Range(R) {} 80401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 80501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet CXXUuidofExpr(EmptyShell Empty, bool isExpr) 80601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet : Expr(CXXUuidofExprClass, Empty) { 80701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (isExpr) 8086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Operand = (Expr*)nullptr; 80901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet else 8106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Operand = (TypeSourceInfo*)nullptr; 81101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 812ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 81301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); } 814ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 81501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// \brief Retrieves the type operand of this __uuidof() expression after 81601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// various required adjustments (removing reference types, cv-qualifiers). 817fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer QualType getTypeOperand(ASTContext &Context) const; 81801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 81901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// \brief Retrieve source information for the type operand. 82001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TypeSourceInfo *getTypeOperandSourceInfo() const { 82101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)"); 82201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return Operand.get<TypeSourceInfo *>(); 82301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 82401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 82501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet void setTypeOperandSourceInfo(TypeSourceInfo *TSI) { 82601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)"); 82701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet Operand = TSI; 82801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 829ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 83001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet Expr *getExprOperand() const { 83101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)"); 83201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return static_cast<Expr*>(Operand.get<Stmt *>()); 83301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 834ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 83501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet void setExprOperand(Expr *E) { 83601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)"); 83701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet Operand = E; 83801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 83901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 8404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void setUuidStr(StringRef US) { UuidStr = US; } 8414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef getUuidStr() const { return UuidStr; } 842c80eb46a0f37bee9597f1b466013a0f6271f9318David Majnemer 84365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } 84465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 845aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar SourceRange getSourceRange() const LLVM_READONLY { return Range; } 84601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet void setSourceRange(SourceRange R) { Range = R; } 847ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 84801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet static bool classof(const Stmt *T) { 84901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return T->getStmtClass() == CXXUuidofExprClass; 85001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 85101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 85201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // Iterators 85363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 85487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isTypeOperand()) 85587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 85663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall Stmt **begin = reinterpret_cast<Stmt**>(&Operand); 85763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(begin, begin + 1); 85863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 85901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet}; 86001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 861010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents the \c this expression in C++. 862010bfc253050626435f006386c0bee4b55329687James Dennett/// 863010bfc253050626435f006386c0bee4b55329687James Dennett/// This is a pointer to the object on which the current member function is 864796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// executing (C++ [expr.prim]p3). Example: 865796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// 866010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 867796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// class Foo { 868796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// public: 869796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// void bar(); 870796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// void test() { this->bar(); } 871796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// }; 872010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 873796da18402f286b897782a298ae3b20c459c102eDouglas Gregorclass CXXThisExpr : public Expr { 874796da18402f286b897782a298ae3b20c459c102eDouglas Gregor SourceLocation Loc; 875828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor bool Implicit : 1; 876ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 877796da18402f286b897782a298ae3b20c459c102eDouglas Gregorpublic: 878828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor CXXThisExpr(SourceLocation L, QualType Type, bool isImplicit) 879f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CXXThisExprClass, Type, VK_RValue, OK_Ordinary, 8802850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl // 'this' is type-dependent if the class type of the enclosing 8812850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl // member function is dependent (C++ [temp.dep.expr]p2) 882bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Type->isDependentType(), Type->isDependentType(), 883561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Type->isInstantiationDependentType(), 884bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /*ContainsUnexpandedParameterPack=*/false), 885828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor Loc(L), Implicit(isImplicit) { } 886796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 8872fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner CXXThisExpr(EmptyShell Empty) : Expr(CXXThisExprClass, Empty) {} 8882fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner 8892fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner SourceLocation getLocation() const { return Loc; } 8902fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner void setLocation(SourceLocation L) { Loc = L; } 8912fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner 89265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 89365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 894796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 895828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor bool isImplicit() const { return Implicit; } 896828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor void setImplicit(bool I) { Implicit = I; } 897ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 8981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 899796da18402f286b897782a298ae3b20c459c102eDouglas Gregor return T->getStmtClass() == CXXThisExprClass; 900796da18402f286b897782a298ae3b20c459c102eDouglas Gregor } 901796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 902796da18402f286b897782a298ae3b20c459c102eDouglas Gregor // Iterators 90387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 90487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 90587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 906796da18402f286b897782a298ae3b20c459c102eDouglas Gregor}; 907796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 908010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A C++ throw-expression (C++ [except.throw]). 9091060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// 910010bfc253050626435f006386c0bee4b55329687James Dennett/// This handles 'throw' (for re-throwing the current exception) and 911010bfc253050626435f006386c0bee4b55329687James Dennett/// 'throw' assignment-expression. When assignment-expression isn't 912010bfc253050626435f006386c0bee4b55329687James Dennett/// present, Op will be null. 9131060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXThrowExpr : public Expr { 9141060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Stmt *Op; 9151060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation ThrowLoc; 916bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// \brief Whether the thrown variable (if any) is in scope. 917bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor unsigned IsThrownVariableInScope : 1; 918ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 919bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor friend class ASTStmtReader; 920ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 9211060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 922010bfc253050626435f006386c0bee4b55329687James Dennett // \p Ty is the void type which is used as the result type of the 923010bfc253050626435f006386c0bee4b55329687James Dennett // expression. The \p l is the location of the throw keyword. \p expr 9241060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // can by null, if the optional expression to throw isn't present. 925bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l, 926bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor bool IsThrownVariableInScope) : 927bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Expr(CXXThrowExprClass, Ty, VK_RValue, OK_Ordinary, false, false, 928561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor expr && expr->isInstantiationDependent(), 929bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor expr && expr->containsUnexpandedParameterPack()), 930bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor Op(expr), ThrowLoc(l), IsThrownVariableInScope(IsThrownVariableInScope) {} 9312fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner CXXThrowExpr(EmptyShell Empty) : Expr(CXXThrowExprClass, Empty) {} 9322fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner 9331060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); } 9341060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr *getSubExpr() { return cast_or_null<Expr>(Op); } 93542e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor 93642e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor SourceLocation getThrowLoc() const { return ThrowLoc; } 9371060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 938bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// \brief Determines whether the variable thrown by this expression (if any!) 939bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// is within the innermost try block. 940bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// 941bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// This information is required to determine whether the NRVO can apply to 942bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// this variable. 943bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor bool isThrownVariableInScope() const { return IsThrownVariableInScope; } 944ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 94565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return ThrowLoc; } 94665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 9476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!getSubExpr()) 94865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return ThrowLoc; 94965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getSubExpr()->getLocEnd(); 9501060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 9511060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 9521060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 9531060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXThrowExprClass; 9541060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 9551060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 9561060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 95763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 95863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Op, Op ? &Op+1 : &Op); 95963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 9601060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 9611060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 962010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A default argument (C++ [dcl.fct.default]). 963010bfc253050626435f006386c0bee4b55329687James Dennett/// 964010bfc253050626435f006386c0bee4b55329687James Dennett/// This wraps up a function call argument that was created from the 965010bfc253050626435f006386c0bee4b55329687James Dennett/// corresponding parameter's default argument, when the call did not 966010bfc253050626435f006386c0bee4b55329687James Dennett/// explicitly supply arguments for all of the parameters. 9674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CXXDefaultArgExpr final : public Expr { 96865222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor /// \brief The parameter whose default is being used. 9694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParmVarDecl *Param; 9701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 971036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor /// \brief The location where the default argument expression was used. 972036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor SourceLocation Loc; 973ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 974036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param) 975ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie : Expr(SC, 97665222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor param->hasUnparsedDefaultArg() 97765222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor ? param->getType().getNonReferenceType() 9782333f7727f97018d6742e1e0938133bcfad967abEli Friedman : param->getDefaultArg()->getType(), 979dfa1edbebeda7ec3a7a9c45e4317de9241aa9883John McCall param->getDefaultArg()->getValueKind(), 980561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor param->getDefaultArg()->getObjectKind(), false, false, false, false), 9814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Param(param), Loc(Loc) { } 982ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 9831060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 984030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner CXXDefaultArgExpr(EmptyShell Empty) : Expr(CXXDefaultArgExprClass, Empty) {} 985030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner 986010bfc253050626435f006386c0bee4b55329687James Dennett // \p Param is the parameter whose default argument is used by this 9871060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // expression. 98832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXDefaultArgExpr *Create(const ASTContext &C, SourceLocation Loc, 989036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor ParmVarDecl *Param) { 990036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return new (C) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param); 991f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson } 9921060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 9931060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Retrieve the parameter that the argument was created from. 9944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ParmVarDecl *getParam() const { return Param; } 9954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ParmVarDecl *getParam() { return Param; } 996ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 9971060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Retrieve the actual argument to the function call. 998ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie const Expr *getExpr() const { 999ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return getParam()->getDefaultArg(); 100065222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor } 1001ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie Expr *getExpr() { 1002ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return getParam()->getDefaultArg(); 100365222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor } 10041060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 1005ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Retrieve the location where this default argument was actually 1006036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor /// used. 1007036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor SourceLocation getUsedLocation() const { return Loc; } 1008ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1009010bfc253050626435f006386c0bee4b55329687James Dennett /// Default argument expressions have no representation in the 1010010bfc253050626435f006386c0bee4b55329687James Dennett /// source, so they have an empty source range. 101165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); } 101265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); } 101363b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer 101463b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer SourceLocation getExprLoc() const LLVM_READONLY { return Loc; } 10151060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 10161060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 10171060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXDefaultArgExprClass; 10181060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 10191060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 10201060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 102187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 102287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 102387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 10248a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis 102560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 10263397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl friend class ASTStmtWriter; 10271060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 1028987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1029010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A use of a default initializer in a constructor or in aggregate 1030010bfc253050626435f006386c0bee4b55329687James Dennett/// initialization. 1031010bfc253050626435f006386c0bee4b55329687James Dennett/// 1032010bfc253050626435f006386c0bee4b55329687James Dennett/// This wraps a use of a C++ default initializer (technically, 1033c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith/// a brace-or-equal-initializer for a non-static data member) when it 1034c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith/// is implicitly used in a mem-initializer-list in a constructor 1035c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith/// (C++11 [class.base.init]p8) or in aggregate initialization 1036c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith/// (C++1y [dcl.init.aggr]p7). 1037c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smithclass CXXDefaultInitExpr : public Expr { 1038c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith /// \brief The field whose default is being used. 1039c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith FieldDecl *Field; 1040c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1041c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith /// \brief The location where the default initializer expression was used. 1042c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith SourceLocation Loc; 1043c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 104432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXDefaultInitExpr(const ASTContext &C, SourceLocation Loc, FieldDecl *Field, 1045c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith QualType T); 1046c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1047c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith CXXDefaultInitExpr(EmptyShell Empty) : Expr(CXXDefaultInitExprClass, Empty) {} 1048c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1049c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smithpublic: 1050010bfc253050626435f006386c0bee4b55329687James Dennett /// \p Field is the non-static data member whose default initializer is used 1051010bfc253050626435f006386c0bee4b55329687James Dennett /// by this expression. 105232b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXDefaultInitExpr *Create(const ASTContext &C, SourceLocation Loc, 1053c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith FieldDecl *Field) { 1054c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith return new (C) CXXDefaultInitExpr(C, Loc, Field, Field->getType()); 1055c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 1056c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1057010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Get the field whose initializer will be used. 1058c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith FieldDecl *getField() { return Field; } 1059c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith const FieldDecl *getField() const { return Field; } 1060c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1061010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Get the initialization expression that will be used. 1062176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const Expr *getExpr() const { 1063176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(Field->getInClassInitializer() && "initializer hasn't been parsed"); 1064176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return Field->getInClassInitializer(); 1065176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1066176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Expr *getExpr() { 1067176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(Field->getInClassInitializer() && "initializer hasn't been parsed"); 1068176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return Field->getInClassInitializer(); 1069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1070c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1071c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 1072c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 1073c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1074c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith static bool classof(const Stmt *T) { 1075c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith return T->getStmtClass() == CXXDefaultInitExprClass; 1076c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 1077c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1078c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith // Iterators 107987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 108087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 108187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 1082c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1083c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith friend class ASTReader; 1084c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith friend class ASTStmtReader; 1085c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith}; 1086c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1087010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a C++ temporary. 1088c1ce477119fed070299668aab24084b17ff5f14bAnders Carlssonclass CXXTemporary { 1089010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief The destructor that needs to be called. 1090b859f35459ae3e1188d1e1b86df08d649695fd86Anders Carlsson const CXXDestructorDecl *Destructor; 10911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1092010bfc253050626435f006386c0bee4b55329687James Dennett explicit CXXTemporary(const CXXDestructorDecl *destructor) 1093c1ce477119fed070299668aab24084b17ff5f14bAnders Carlsson : Destructor(destructor) { } 1094c1ce477119fed070299668aab24084b17ff5f14bAnders Carlsson 1095c1ce477119fed070299668aab24084b17ff5f14bAnders Carlssonpublic: 109632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXTemporary *Create(const ASTContext &C, 1097b859f35459ae3e1188d1e1b86df08d649695fd86Anders Carlsson const CXXDestructorDecl *Destructor); 10981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1099f0721fe438d7e40c168e5d664970e7830bc138fbAnders Carlsson const CXXDestructorDecl *getDestructor() const { return Destructor; } 110076f3f69db1416425070177243e9f390122c553e0Richard Smith void setDestructor(const CXXDestructorDecl *Dtor) { 110176f3f69db1416425070177243e9f390122c553e0Richard Smith Destructor = Dtor; 110276f3f69db1416425070177243e9f390122c553e0Richard Smith } 1103c1ce477119fed070299668aab24084b17ff5f14bAnders Carlsson}; 1104fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 1105ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// \brief Represents binding an expression to a temporary. 1106ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// 1107ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// This ensures the destructor is called for the temporary. It should only be 1108ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// needed for non-POD, non-trivially destructable class types. For example: 1109ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// 1110ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// \code 1111ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// struct S { 1112ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// S() { } // User defined constructor makes S non-POD. 1113ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// ~S() { } // User defined destructor makes it non-trivial. 1114ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// }; 1115ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// void test() { 1116ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// const S &s_ref = S(); // Requires a CXXBindTemporaryExpr. 1117ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// } 1118ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// \endcode 1119fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlssonclass CXXBindTemporaryExpr : public Expr { 1120fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson CXXTemporary *Temp; 11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1122fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson Stmt *SubExpr; 1123fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 1124bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor CXXBindTemporaryExpr(CXXTemporary *temp, Expr* SubExpr) 1125bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(CXXBindTemporaryExprClass, SubExpr->getType(), 1126ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie VK_RValue, OK_Ordinary, SubExpr->isTypeDependent(), 1127bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SubExpr->isValueDependent(), 1128561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor SubExpr->isInstantiationDependent(), 1129bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SubExpr->containsUnexpandedParameterPack()), 1130bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Temp(temp), SubExpr(SubExpr) { } 113188eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson 1132fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlssonpublic: 1133d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner CXXBindTemporaryExpr(EmptyShell Empty) 11346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(CXXBindTemporaryExprClass, Empty), Temp(nullptr), SubExpr(nullptr) {} 1135ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 113632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXBindTemporaryExpr *Create(const ASTContext &C, CXXTemporary *Temp, 1137fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson Expr* SubExpr); 11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 113988eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson CXXTemporary *getTemporary() { return Temp; } 1140f0721fe438d7e40c168e5d664970e7830bc138fbAnders Carlsson const CXXTemporary *getTemporary() const { return Temp; } 1141d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner void setTemporary(CXXTemporary *T) { Temp = T; } 1142f0721fe438d7e40c168e5d664970e7830bc138fbAnders Carlsson 1143fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson const Expr *getSubExpr() const { return cast<Expr>(SubExpr); } 1144fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson Expr *getSubExpr() { return cast<Expr>(SubExpr); } 114588eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson void setSubExpr(Expr *E) { SubExpr = E; } 1146fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 114765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 114865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return SubExpr->getLocStart(); 114996be6917e1c4ba1f4435a14c9e7c6c139571d086Douglas Gregor } 115065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return SubExpr->getLocEnd();} 1151fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 1152fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson // Implement isa/cast/dyncast/etc. 1153fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson static bool classof(const Stmt *T) { 1154fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson return T->getStmtClass() == CXXBindTemporaryExprClass; 1155fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson } 1156fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 1157fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson // Iterators 115863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&SubExpr, &SubExpr + 1); } 1159fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson}; 1160fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 11610982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief Represents a call to a C++ constructor. 116215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlssonclass CXXConstructExpr : public Expr { 116372e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlssonpublic: 116472e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson enum ConstructionKind { 116572e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CK_Complete, 116672e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CK_NonVirtualBase, 1167059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt CK_VirtualBase, 1168059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt CK_Delegating 116972e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson }; 1170ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 117172e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlssonprivate: 117215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson CXXConstructorDecl *Constructor; 117315ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson 117499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceLocation Loc; 11751245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange ParenOrBraceRange; 1176a48e676a717309afa50ae06a3d4674acec025bf9Douglas Gregor unsigned NumArgs : 16; 11774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned Elidable : 1; 11784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned HadMultipleCandidates : 1; 11794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned ListInitialization : 1; 11804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned StdInitListInitialization : 1; 11814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned ZeroInitialization : 1; 118272e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson unsigned ConstructKind : 2; 118315ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson Stmt **Args; 11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void setConstructor(CXXConstructorDecl *C) { Constructor = C; } 11864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1187bd6734e5f6432ce0cc07171c490ffaa094796198Anders Carlssonprotected: 118832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXConstructExpr(const ASTContext &C, StmtClass SC, QualType T, 118999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceLocation Loc, 11904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXConstructorDecl *Ctor, 11914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool Elidable, 11923b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr *> Args, 11937cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates, 11945b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ListInitialization, 1195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool StdInitListInitialization, 11965b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ZeroInitialization, 11975b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ConstructionKind ConstructKind, 11981245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange ParenOrBraceRange); 1199bd6734e5f6432ce0cc07171c490ffaa094796198Anders Carlsson 12006d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis /// \brief Construct an empty C++ construction expression. 12016d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis CXXConstructExpr(StmtClass SC, EmptyShell Empty) 12026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(SC, Empty), Constructor(nullptr), NumArgs(0), Elidable(false), 12035b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl HadMultipleCandidates(false), ListInitialization(false), 12046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ZeroInitialization(false), ConstructKind(0), Args(nullptr) 12055b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl { } 12066d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis 120715ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlssonpublic: 12086d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis /// \brief Construct an empty C++ construction expression. 12096d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis explicit CXXConstructExpr(EmptyShell Empty) 12104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : CXXConstructExpr(CXXConstructExprClass, Empty) {} 12116d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis 121232b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXConstructExpr *Create(const ASTContext &C, QualType T, 121399a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceLocation Loc, 12144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXConstructorDecl *Ctor, 12154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool Elidable, 12163b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr *> Args, 12177cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates, 12185b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ListInitialization, 1219176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool StdInitListInitialization, 12205b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ZeroInitialization, 12215b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ConstructionKind ConstructKind, 12221245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange ParenOrBraceRange); 12231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \brief Get the constructor that this expression will (ultimately) call. 12250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines CXXConstructorDecl *getConstructor() const { return Constructor; } 1226ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 122799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceLocation getLocation() const { return Loc; } 122899a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor void setLocation(SourceLocation Loc) { this->Loc = Loc; } 1229ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1230d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor /// \brief Whether this construction is elidable. 1231d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor bool isElidable() const { return Elidable; } 123239da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor void setElidable(bool E) { Elidable = E; } 12337cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 12347cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara /// \brief Whether the referred constructor was resolved from 12357cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara /// an overloaded set having size greater than 1. 12367cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool hadMultipleCandidates() const { return HadMultipleCandidates; } 12377cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara void setHadMultipleCandidates(bool V) { HadMultipleCandidates = V; } 12387cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 12395b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl /// \brief Whether this constructor call was written as list-initialization. 12405b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool isListInitialization() const { return ListInitialization; } 12415b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl void setListInitialization(bool V) { ListInitialization = V; } 12425b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl 1243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /// \brief Whether this constructor call was written as list-initialization, 1244176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /// but was interpreted as forming a std::initializer_list<T> from the list 1245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /// and passing that as a single constructor argument. 1246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /// See C++11 [over.match.list]p1 bullet 1. 1247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool isStdInitListInitialization() const { return StdInitListInitialization; } 1248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void setStdInitListInitialization(bool V) { StdInitListInitialization = V; } 1249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 125016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor /// \brief Whether this construction first requires 125116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor /// zero-initialization before the initializer is called. 125216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool requiresZeroInitialization() const { return ZeroInitialization; } 125316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor void setRequiresZeroInitialization(bool ZeroInit) { 125416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ZeroInitialization = ZeroInit; 125516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 1256ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1257010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Determine whether this constructor is actually constructing 12589db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor /// a base class (rather than a complete object). 125924eb78e38aba55c507bc3c05c37035a9ab2defa7Anders Carlsson ConstructionKind getConstructionKind() const { 126024eb78e38aba55c507bc3c05c37035a9ab2defa7Anders Carlsson return (ConstructionKind)ConstructKind; 126172e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } 1262ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie void setConstructionKind(ConstructionKind CK) { 126372e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson ConstructKind = CK; 126472e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } 1265ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 126615ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson typedef ExprIterator arg_iterator; 126715ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson typedef ConstExprIterator const_arg_iterator; 1268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines typedef llvm::iterator_range<arg_iterator> arg_range; 1269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines typedef llvm::iterator_range<const_arg_iterator> arg_const_range; 1270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines arg_range arguments() { return arg_range(arg_begin(), arg_end()); } 1272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines arg_const_range arguments() const { 1273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return arg_const_range(arg_begin(), arg_end()); 1274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 12751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 127615ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson arg_iterator arg_begin() { return Args; } 127715ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson arg_iterator arg_end() { return Args + NumArgs; } 127815ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson const_arg_iterator arg_begin() const { return Args; } 127915ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson const_arg_iterator arg_end() const { return Args + NumArgs; } 128015ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson 1281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Expr **getArgs() { return reinterpret_cast<Expr **>(Args); } 1282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *const *getArgs() const { 1283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return const_cast<CXXConstructExpr *>(this)->getArgs(); 1284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 128515ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson unsigned getNumArgs() const { return NumArgs; } 128615ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson 1287010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Return the specified argument. 1288bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson Expr *getArg(unsigned Arg) { 1289bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson assert(Arg < NumArgs && "Arg access out of range!"); 1290bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson return cast<Expr>(Args[Arg]); 1291bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson } 1292bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson const Expr *getArg(unsigned Arg) const { 1293bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson assert(Arg < NumArgs && "Arg access out of range!"); 1294bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson return cast<Expr>(Args[Arg]); 1295bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson } 12961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1297010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Set the specified argument. 12982eeed7bc4fd457ac57ff32ab3b02674588545f65Fariborz Jahanian void setArg(unsigned Arg, Expr *ArgExpr) { 12992eeed7bc4fd457ac57ff32ab3b02674588545f65Fariborz Jahanian assert(Arg < NumArgs && "Arg access out of range!"); 13002eeed7bc4fd457ac57ff32ab3b02674588545f65Fariborz Jahanian Args[Arg] = ArgExpr; 13012eeed7bc4fd457ac57ff32ab3b02674588545f65Fariborz Jahanian } 13022eeed7bc4fd457ac57ff32ab3b02674588545f65Fariborz Jahanian 130365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY; 130465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY; 13051245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange getParenOrBraceRange() const { return ParenOrBraceRange; } 13061245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella void setParenOrBraceRange(SourceRange Range) { ParenOrBraceRange = Range; } 130715ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson 13081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 1309524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlsson return T->getStmtClass() == CXXConstructExprClass || 1310524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlsson T->getStmtClass() == CXXTemporaryObjectExprClass; 131115ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson } 13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 131315ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson // Iterators 131463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 131563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Args[0], &Args[0]+NumArgs); 131663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 13176d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis 131860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 131915ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson}; 132015ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson 13214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief Represents a call to an inherited base class constructor from an 13224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// inheriting constructor. This call implicitly forwards the arguments from 13234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// the enclosing context (an inheriting constructor) to the specified inherited 13244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// base class constructor. 13254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CXXInheritedCtorInitExpr : public Expr { 13264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprivate: 13274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXConstructorDecl *Constructor; 13284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// The location of the using declaration. 13304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation Loc; 13314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Whether this is the construction of a virtual base. 13334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned ConstructsVirtualBase : 1; 13344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Whether the constructor is inherited from a virtual base class of the 13364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// class that we construct. 13374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned InheritedFromVirtualBase : 1; 13384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 13404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \brief Construct a C++ inheriting construction expression. 13414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXInheritedCtorInitExpr(SourceLocation Loc, QualType T, 13424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXConstructorDecl *Ctor, bool ConstructsVirtualBase, 13434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool InheritedFromVirtualBase) 13444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : Expr(CXXInheritedCtorInitExprClass, T, VK_RValue, OK_Ordinary, false, 13454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar false, false, false), 13464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Constructor(Ctor), Loc(Loc), 13474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ConstructsVirtualBase(ConstructsVirtualBase), 13484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar InheritedFromVirtualBase(InheritedFromVirtualBase) { 13494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(!T->isDependentType()); 13504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 13514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \brief Construct an empty C++ inheriting construction expression. 13534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar explicit CXXInheritedCtorInitExpr(EmptyShell Empty) 13544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : Expr(CXXInheritedCtorInitExprClass, Empty), Constructor(nullptr), 13554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ConstructsVirtualBase(false), InheritedFromVirtualBase(false) {} 13564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \brief Get the constructor that this expression will call. 13584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXConstructorDecl *getConstructor() const { return Constructor; } 13594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \brief Determine whether this constructor is actually constructing 13614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// a base class (rather than a complete object). 13624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool constructsVBase() const { return ConstructsVirtualBase; } 13634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXConstructExpr::ConstructionKind getConstructionKind() const { 13644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return ConstructsVirtualBase ? CXXConstructExpr::CK_VirtualBase 13654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : CXXConstructExpr::CK_NonVirtualBase; 13664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 13674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \brief Determine whether the inherited constructor is inherited from a 13694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// virtual base of the object we construct. If so, we are not responsible 13704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// for calling the inherited constructor (the complete object constructor 13714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// does that), and so we don't need to pass any arguments. 13724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool inheritedFromVBase() const { return InheritedFromVirtualBase; } 13734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation getLocation() const LLVM_READONLY { return Loc; } 13754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 13764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 13774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static bool classof(const Stmt *T) { 13794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return T->getStmtClass() == CXXInheritedCtorInitExprClass; 13804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 13814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar child_range children() { 13824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 13834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 13844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend class ASTStmtReader; 13864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 13874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 13880982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief Represents an explicit C++ type conversion that uses "functional" 13890982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// notation (C++ [expr.type.conv]). 13900982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// 13910982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// Example: 1392010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 13930982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// x = int(0.5); 1394010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 13954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CXXFunctionalCastExpr final 13964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public ExplicitCastExpr, 13974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<CXXFunctionalCastExpr, CXXBaseSpecifier *> { 1398cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation LParenLoc; 1399987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation RParenLoc; 1400f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 1401f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXFunctionalCastExpr(QualType ty, ExprValueKind VK, 1402f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall TypeSourceInfo *writtenTy, 1403cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman CastKind kind, Expr *castExpr, unsigned pathSize, 1404cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation lParenLoc, SourceLocation rParenLoc) 1405f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : ExplicitCastExpr(CXXFunctionalCastExprClass, ty, VK, kind, 1406f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall castExpr, pathSize, writtenTy), 1407cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman LParenLoc(lParenLoc), RParenLoc(rParenLoc) {} 14080aebc81e02397a5987aaa8e8c7acbdb01a31d7c3Anders Carlsson 1409f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit CXXFunctionalCastExpr(EmptyShell Shell, unsigned PathSize) 1410f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : ExplicitCastExpr(CXXFunctionalCastExprClass, Shell, PathSize) { } 1411f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 1412f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 141332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXFunctionalCastExpr *Create(const ASTContext &Context, QualType T, 1414f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 1415f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall TypeSourceInfo *Written, 1416f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastKind Kind, Expr *Op, 1417f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *Path, 1418cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation LPLoc, 1419f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall SourceLocation RPLoc); 142032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXFunctionalCastExpr *CreateEmpty(const ASTContext &Context, 1421f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize); 1422ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 1423cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation getLParenLoc() const { return LParenLoc; } 1424cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman void setLParenLoc(SourceLocation L) { LParenLoc = L; } 1425987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation getRParenLoc() const { return RParenLoc; } 1426ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig void setRParenLoc(SourceLocation L) { RParenLoc = L; } 14271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1428cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation getLocStart() const LLVM_READONLY; 1429cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation getLocEnd() const LLVM_READONLY; 143065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen 14311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 14321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == CXXFunctionalCastExprClass; 1433987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis } 14344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 14354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 14364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend class CastExpr; 1437987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}; 1438987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1439506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// @brief Represents a C++ functional cast expression that builds a 1440506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// temporary object. 1441506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// 14421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// This expression type represents a C++ "functional" cast 1443506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// (C++[expr.type.conv]) with N != 1 arguments that invokes a 1444ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// constructor to build a temporary object. With N == 1 arguments the 1445ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor/// functional cast expression will be represented by CXXFunctionalCastExpr. 1446506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// Example: 1447010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 1448506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// struct X { X(int, float); } 1449506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// 1450506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// X create_X() { 1451506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// return X(1, 3.14f); // creates a CXXTemporaryObjectExpr 1452506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// }; 1453010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 1454524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlssonclass CXXTemporaryObjectExpr : public CXXConstructExpr { 1455ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *Type; 1456506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 1457506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregorpublic: 14584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXTemporaryObjectExpr(const ASTContext &C, 14594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CXXConstructorDecl *Cons, 1460ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *Type, 14613b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr *> Args, 14621245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange ParenOrBraceRange, 14637cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates, 1464c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith bool ListInitialization, 1465176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool StdInitListInitialization, 1466c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith bool ZeroInitialization); 14676d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis explicit CXXTemporaryObjectExpr(EmptyShell Empty) 1468ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor : CXXConstructExpr(CXXTemporaryObjectExprClass, Empty), Type() { } 1469506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 1470ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *getTypeSourceInfo() const { return Type; } 1471ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor 147265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY; 147365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY; 1474ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 14751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 1476506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor return T->getStmtClass() == CXXTemporaryObjectExprClass; 1477506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor } 14786d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis 147960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 1480506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor}; 1481506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 148201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// \brief A C++ lambda expression, which produces a function object 148301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// (of unspecified type) that can be invoked later. 148401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// 148501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// Example: 148601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// \code 148701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// void low_pass_filter(std::vector<double> &values, double cutoff) { 148801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// values.erase(std::remove_if(values.begin(), values.end(), 1489d9ffa0c39ff9c71e2729eac4cdcf32b377c1d3b6Dmitri Gribenko/// [=](double value) { return value > cutoff; }); 149001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// } 149101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// \endcode 149201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// 1493ddcd660efccd7dcbe42cf1a5759b37ee5619bf9bJames Dennett/// C++11 lambda expressions can capture local variables, either by copying 149401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// the values of those local variables at the time the function 149501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// object is constructed (not when it is called!) or by holding a 149601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// reference to the local variable. These captures can occur either 149701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// implicitly or can be written explicitly between the square 149801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// brackets ([...]) that start the lambda expression. 1499ddcd660efccd7dcbe42cf1a5759b37ee5619bf9bJames Dennett/// 1500ddcd660efccd7dcbe42cf1a5759b37ee5619bf9bJames Dennett/// C++1y introduces a new form of "capture" called an init-capture that 1501ddcd660efccd7dcbe42cf1a5759b37ee5619bf9bJames Dennett/// includes an initializing expression (rather than capturing a variable), 1502ddcd660efccd7dcbe42cf1a5759b37ee5619bf9bJames Dennett/// and which can never occur implicitly. 15034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass LambdaExpr final 15044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public Expr, 15054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<LambdaExpr, Stmt *, unsigned, VarDecl *> { 150601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief The source range that covers the lambda introducer ([...]). 150701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor SourceRange IntroducerRange; 150801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1509f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett /// \brief The source location of this lambda's capture-default ('=' or '&'). 1510f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett SourceLocation CaptureDefaultLoc; 1511f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett 15127ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor /// \brief The number of captures. 15137ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor unsigned NumCaptures : 16; 15147ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 151501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief The default capture kind, which is a value of type 151601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// LambdaCaptureDefault. 151701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor unsigned CaptureDefault : 2; 151801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 151901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Whether this lambda had an explicit parameter list vs. an 152001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// implicit (and empty) parameter list. 152101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor unsigned ExplicitParams : 1; 152201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1523dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor /// \brief Whether this lambda had the result type explicitly specified. 1524dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor unsigned ExplicitResultType : 1; 1525dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor 1526dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor /// \brief Whether there are any array index variables stored at the end of 1527dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor /// this lambda expression. 15287ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor unsigned HasArrayIndexVars : 1; 15297ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 153001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief The location of the closing brace ('}') that completes 153101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// the lambda. 153201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// 153301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// The location of the brace is also available by looking up the 153401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// function call operator in the lambda class. However, it is 153501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// stored here to improve the performance of getSourceRange(), and 153601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// to avoid having to deserialize the function call operator from a 153701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// module file just to determine the source range. 153801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor SourceLocation ClosingBrace; 153901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 15404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar size_t numTrailingObjects(OverloadToken<Stmt *>) const { 15414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return NumCaptures + 1; 15424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 15437ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 15444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar size_t numTrailingObjects(OverloadToken<unsigned>) const { 15454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return HasArrayIndexVars ? NumCaptures + 1 : 0; 15464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 154701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 154801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Construct a lambda expression. 154901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor LambdaExpr(QualType T, SourceRange IntroducerRange, 155001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor LambdaCaptureDefault CaptureDefault, 15514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation CaptureDefaultLoc, ArrayRef<LambdaCapture> Captures, 15524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool ExplicitParams, bool ExplicitResultType, 15534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<Expr *> CaptureInits, ArrayRef<VarDecl *> ArrayIndexVars, 15544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<unsigned> ArrayIndexStarts, SourceLocation ClosingBrace, 1555612409ece080e814f79e06772c690d603f45fbd6Richard Smith bool ContainsUnexpandedParameterPack); 155601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 15579d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor /// \brief Construct an empty lambda expression. 15589d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor LambdaExpr(EmptyShell Empty, unsigned NumCaptures, bool HasArrayIndexVars) 15599d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor : Expr(LambdaExprClass, Empty), 15609d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor NumCaptures(NumCaptures), CaptureDefault(LCD_None), ExplicitParams(false), 15619d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor ExplicitResultType(false), HasArrayIndexVars(true) { 15626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getStoredStmts()[NumCaptures] = nullptr; 15639d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor } 156487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 15654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stmt **getStoredStmts() { return getTrailingObjects<Stmt *>(); } 156687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 15674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stmt *const *getStoredStmts() const { return getTrailingObjects<Stmt *>(); } 156887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 15697ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor /// \brief Retrieve the mapping from captures to the first array index 15707ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor /// variable. 15714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned *getArrayIndexStarts() { return getTrailingObjects<unsigned>(); } 15720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 157387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const unsigned *getArrayIndexStarts() const { 15744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<unsigned>(); 157587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 157687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 15777ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor /// \brief Retrieve the complete set of array-index variables. 15784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar VarDecl **getArrayIndexVars() { return getTrailingObjects<VarDecl *>(); } 15797ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 158087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar VarDecl *const *getArrayIndexVars() const { 15814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<VarDecl *>(); 158287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 158387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 158401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregorpublic: 158501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Construct a new lambda expression. 15864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static LambdaExpr * 15874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Create(const ASTContext &C, CXXRecordDecl *Class, SourceRange IntroducerRange, 15884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, 15894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<LambdaCapture> Captures, bool ExplicitParams, 15904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool ExplicitResultType, ArrayRef<Expr *> CaptureInits, 15914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<VarDecl *> ArrayIndexVars, 15924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<unsigned> ArrayIndexStarts, SourceLocation ClosingBrace, 15934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool ContainsUnexpandedParameterPack); 159401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 15959d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor /// \brief Construct a new lambda expression that will be deserialized from 15969d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor /// an external source. 159732b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static LambdaExpr *CreateDeserialized(const ASTContext &C, 159832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper unsigned NumCaptures, 15999d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor unsigned NumArrayIndexVars); 1600f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett 160101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Determine the default capture kind for this lambda. 160201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor LambdaCaptureDefault getCaptureDefault() const { 160301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor return static_cast<LambdaCaptureDefault>(CaptureDefault); 160401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 160501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1606f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett /// \brief Retrieve the location of this lambda's capture-default, if any. 1607f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett SourceLocation getCaptureDefaultLoc() const { 1608f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett return CaptureDefaultLoc; 1609f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett } 1610f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett 1611b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar /// \brief Determine whether one of this lambda's captures is an init-capture. 1612b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar bool isInitCapture(const LambdaCapture *Capture) const; 1613b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 161401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief An iterator that walks over the captures of the lambda, 161501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// both implicit and explicit. 16164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar typedef const LambdaCapture *capture_iterator; 161701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 16186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief An iterator over a range of lambda captures. 16196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef llvm::iterator_range<capture_iterator> capture_range; 16206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 16216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Retrieve this lambda's captures. 16226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines capture_range captures() const; 16236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 162401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing to the first lambda capture. 1625da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator capture_begin() const; 162601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 162701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing past the end of the 162801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// sequence of lambda captures. 1629da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator capture_end() const; 163001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 16317ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor /// \brief Determine the number of captures in this lambda. 16327ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor unsigned capture_size() const { return NumCaptures; } 16336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 16346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Retrieve this lambda's explicit captures. 16356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines capture_range explicit_captures() const; 16367ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 163701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing to the first explicit 163801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// lambda capture. 1639da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator explicit_capture_begin() const; 164001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 164101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing past the end of the sequence of 164201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// explicit lambda captures. 1643da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator explicit_capture_end() const; 164401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 16456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Retrieve this lambda's implicit captures. 16466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines capture_range implicit_captures() const; 16476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 164801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing to the first implicit 164901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// lambda capture. 1650da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator implicit_capture_begin() const; 165101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 165201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing past the end of the sequence of 165301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// implicit lambda captures. 1654da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator implicit_capture_end() const; 165501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 165601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Iterator that walks over the capture initialization 165701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// arguments. 165801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor typedef Expr **capture_init_iterator; 165901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 166087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Const iterator that walks over the capture initialization 166187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// arguments. 166287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar typedef Expr *const *const_capture_init_iterator; 166387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1664176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /// \brief Retrieve the initialization expressions for this lambda's captures. 166587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::iterator_range<capture_init_iterator> capture_inits() { 166687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return llvm::make_range(capture_init_begin(), capture_init_end()); 166787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 166887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 166987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Retrieve the initialization expressions for this lambda's captures. 167087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::iterator_range<const_capture_init_iterator> capture_inits() const { 167187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return llvm::make_range(capture_init_begin(), capture_init_end()); 1672176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1673176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 167401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve the first initialization argument for this 167501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// lambda expression (which initializes the first capture field). 167687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar capture_init_iterator capture_init_begin() { 16777ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return reinterpret_cast<Expr **>(getStoredStmts()); 16787ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor } 167901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 168087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Retrieve the first initialization argument for this 168187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// lambda expression (which initializes the first capture field). 168287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const_capture_init_iterator capture_init_begin() const { 168387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return reinterpret_cast<Expr *const *>(getStoredStmts()); 168487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 168587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 168687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Retrieve the iterator pointing one past the last 168787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// initialization argument for this lambda expression. 168887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar capture_init_iterator capture_init_end() { 168987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return capture_init_begin() + NumCaptures; 169087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 169187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 169201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve the iterator pointing one past the last 169376e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor /// initialization argument for this lambda expression. 169487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const_capture_init_iterator capture_init_end() const { 169587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return capture_init_begin() + NumCaptures; 16967ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor } 169701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 169887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Retrieve the set of index variables used in the capture 16999daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor /// initializer of an array captured by copy. 17009daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor /// 170187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \param Iter The iterator that points at the capture initializer for 17029daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor /// which we are extracting the corresponding index variables. 170387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ArrayRef<VarDecl *> 170487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getCaptureInitIndexVars(const_capture_init_iterator Iter) const; 170587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 170601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve the source range covering the lambda introducer, 170701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// which contains the explicit capture list surrounded by square 170801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// brackets ([...]). 170901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor SourceRange getIntroducerRange() const { return IntroducerRange; } 171001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1711010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieve the class that corresponds to the lambda. 1712010bfc253050626435f006386c0bee4b55329687James Dennett /// 1713010bfc253050626435f006386c0bee4b55329687James Dennett /// This is the "closure type" (C++1y [expr.prim.lambda]), and stores the 1714010bfc253050626435f006386c0bee4b55329687James Dennett /// captures in its fields and provides the various operations permitted 1715010bfc253050626435f006386c0bee4b55329687James Dennett /// on a lambda (copying, calling). 171601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CXXRecordDecl *getLambdaClass() const; 171701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 171801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve the function call operator associated with this 171901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// lambda expression. 172001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CXXMethodDecl *getCallOperator() const; 172101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1722fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali /// \brief If this is a generic lambda expression, retrieve the template 1723fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali /// parameter list associated with it, or else return null. 1724fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali TemplateParameterList *getTemplateParameterList() const; 1725fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali 1726fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali /// \brief Whether this is a generic lambda. 1727fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali bool isGenericLambda() const { return getTemplateParameterList(); } 1728fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali 172901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve the body of the lambda. 17309d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor CompoundStmt *getBody() const; 173101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 173201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Determine whether the lambda is mutable, meaning that any 173301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// captures values can be modified. 173401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor bool isMutable() const; 173501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 173601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Determine whether this lambda has an explicit parameter 173701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// list vs. an implicit (empty) parameter list. 173801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor bool hasExplicitParameters() const { return ExplicitParams; } 173901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1740dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor /// \brief Whether this lambda had its result type explicitly specified. 1741dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor bool hasExplicitResultType() const { return ExplicitResultType; } 17429e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 174301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor static bool classof(const Stmt *T) { 174401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor return T->getStmtClass() == LambdaExprClass; 174501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 174601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 174765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 174865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return IntroducerRange.getBegin(); 174901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 175065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return ClosingBrace; } 175101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 17527ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor child_range children() { 17534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Includes initialization exprs plus body stmt 17547ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return child_range(getStoredStmts(), getStoredStmts() + NumCaptures + 1); 17557ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor } 175601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 17574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 175801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor friend class ASTStmtReader; 175901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor friend class ASTStmtWriter; 176001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}; 176101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1762010bfc253050626435f006386c0bee4b55329687James Dennett/// An expression "T()" which creates a value-initialized rvalue of type 1763010bfc253050626435f006386c0bee4b55329687James Dennett/// T, which is a non-class type. See (C++98 [5.2.3p2]). 1764ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregorclass CXXScalarValueInitExpr : public Expr { 1765987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation RParenLoc; 1766ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TypeInfo; 1767987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1768ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor friend class ASTStmtReader; 1769ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1770987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidispublic: 1771ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Create an explicitly-written scalar-value initialization 1772ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor /// expression. 1773176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CXXScalarValueInitExpr(QualType Type, TypeSourceInfo *TypeInfo, 1774176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation rParenLoc) 1775176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : Expr(CXXScalarValueInitExprClass, Type, VK_RValue, OK_Ordinary, 1776176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines false, false, Type->isInstantiationDependentType(), 1777176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Type->containsUnexpandedParameterPack()), 1778176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines RParenLoc(rParenLoc), TypeInfo(TypeInfo) {} 1779ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 1780ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor explicit CXXScalarValueInitExpr(EmptyShell Shell) 1781ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor : Expr(CXXScalarValueInitExprClass, Shell) { } 17821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1783ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *getTypeSourceInfo() const { 1784ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return TypeInfo; 17854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 1786ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1787ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 17884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 178965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY; 179065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 17911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 1793ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor return T->getStmtClass() == CXXScalarValueInitExprClass; 1794987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis } 17951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1796987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis // Iterators 179787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 179887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 179987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 1800987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}; 1801987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1802010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a new-expression for memory allocation and constructor 1803010bfc253050626435f006386c0bee4b55329687James Dennett/// calls, e.g: "new CXXNewExpr(foo)". 18044c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlclass CXXNewExpr : public Expr { 1805010bfc253050626435f006386c0bee4b55329687James Dennett /// Contains an optional array size expression, an optional initialization 1806010bfc253050626435f006386c0bee4b55329687James Dennett /// expression, and any number of optional placement arguments, in that order. 18074c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl Stmt **SubExprs; 18080982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Points to the allocation function used. 18094c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl FunctionDecl *OperatorNew; 18100982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Points to the deallocation function used in case of error. May be 18110982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// null. 18124c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl FunctionDecl *OperatorDelete; 18134c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 18141bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor /// \brief The allocated type-source information, as written in the source. 18151bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor TypeSourceInfo *AllocatedTypeInfo; 1816ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1817ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief If the allocated type was expressed as a parenthesized type-id, 18184bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor /// the source range covering the parenthesized type-id. 18194bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor SourceRange TypeIdParens; 1820ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1821530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie /// \brief Range of the entire new expression. 1822530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie SourceRange Range; 18232aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 18242aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// \brief Source-range of a paren-delimited initializer. 18252aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SourceRange DirectInitRange; 18264c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1827010bfc253050626435f006386c0bee4b55329687James Dennett /// Was the usage ::new, i.e. is the global new to be used? 18284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned GlobalNew : 1; 1829010bfc253050626435f006386c0bee4b55329687James Dennett /// Do we allocate an array? If so, the first SubExpr is the size expression. 18304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned Array : 1; 1831010bfc253050626435f006386c0bee4b55329687James Dennett /// If this is an array allocation, does the usual deallocation 1832010bfc253050626435f006386c0bee4b55329687James Dennett /// function for the allocated type want to know the allocated size? 18334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned UsualArrayDeleteWantsSize : 1; 1834010bfc253050626435f006386c0bee4b55329687James Dennett /// The number of placement new arguments. 1835d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer unsigned NumPlacementArgs : 13; 1836010bfc253050626435f006386c0bee4b55329687James Dennett /// What kind of initializer do we have? Could be none, parens, or braces. 1837010bfc253050626435f006386c0bee4b55329687James Dennett /// In storage, we distinguish between "none, and no initializer expr", and 1838010bfc253050626435f006386c0bee4b55329687James Dennett /// "none, but an implicit initializer expr". 1839d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer unsigned StoredInitializationStyle : 2; 1840d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer 184160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 18422aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl friend class ASTStmtWriter; 18434c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlpublic: 18442aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl enum InitializationStyle { 18452aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl NoInit, ///< New-expression has no initializer as written. 18462aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl CallInit, ///< New-expression has a C++98 paren-delimited initializer. 18472aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl ListInit ///< New-expression has a C++11 list-initializer. 18482aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl }; 18492aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 185032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXNewExpr(const ASTContext &C, bool globalNew, FunctionDecl *operatorNew, 18511548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl FunctionDecl *operatorDelete, bool usualArrayDeleteWantsSize, 18523b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> placementArgs, 18532aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SourceRange typeIdParens, Expr *arraySize, 18542aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl InitializationStyle initializationStyle, Expr *initializer, 18556ec278d1a354517e20f13a877481453ee7940c78John McCall QualType ty, TypeSourceInfo *AllocatedTypeInfo, 1856530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie SourceRange Range, SourceRange directInitRange); 18575921863d8f24084797863b5df37842113bac4352Chris Lattner explicit CXXNewExpr(EmptyShell Shell) 18586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(CXXNewExprClass, Shell), SubExprs(nullptr) { } 18595921863d8f24084797863b5df37842113bac4352Chris Lattner 186032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper void AllocateArgsArray(const ASTContext &C, bool isArray, 186132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper unsigned numPlaceArgs, bool hasInitializer); 1862ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1863cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl QualType getAllocatedType() const { 1864cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl assert(getType()->isPointerType()); 18656217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek return getType()->getAs<PointerType>()->getPointeeType(); 1866cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl } 18674c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 18681bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor TypeSourceInfo *getAllocatedTypeSourceInfo() const { 18691bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor return AllocatedTypeInfo; 18701bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor } 1871c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 1872c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// \brief True if the allocation result needs to be null-checked. 1873010bfc253050626435f006386c0bee4b55329687James Dennett /// 1874010bfc253050626435f006386c0bee4b55329687James Dennett /// C++11 [expr.new]p13: 1875c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// If the allocation function returns null, initialization shall 1876c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// not be done, the deallocation function shall not be called, 1877c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// and the value of the new-expression shall be null. 1878010bfc253050626435f006386c0bee4b55329687James Dennett /// 18790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines /// C++ DR1748: 18800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines /// If the allocation function is a reserved placement allocation 18810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines /// function that returns null, the behavior is undefined. 18820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines /// 1883c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// An allocation function is not allowed to return null unless it 1884c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// has a non-throwing exception-specification. The '03 rule is 1885c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// identical except that the definition of a non-throwing 1886c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// exception specification is just "is it throw()?". 188732b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper bool shouldNullCheckAllocation(const ASTContext &Ctx) const; 1888ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 18894c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl FunctionDecl *getOperatorNew() const { return OperatorNew; } 18905921863d8f24084797863b5df37842113bac4352Chris Lattner void setOperatorNew(FunctionDecl *D) { OperatorNew = D; } 18914c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl FunctionDecl *getOperatorDelete() const { return OperatorDelete; } 18925921863d8f24084797863b5df37842113bac4352Chris Lattner void setOperatorDelete(FunctionDecl *D) { OperatorDelete = D; } 18934c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1894cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl bool isArray() const { return Array; } 1895cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl Expr *getArraySize() { 18966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Array ? cast<Expr>(SubExprs[0]) : nullptr; 1897cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl } 1898cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl const Expr *getArraySize() const { 18996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Array ? cast<Expr>(SubExprs[0]) : nullptr; 1900cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl } 1901cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl 19024c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl unsigned getNumPlacementArgs() const { return NumPlacementArgs; } 1903ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie Expr **getPlacementArgs() { 19042aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return reinterpret_cast<Expr **>(SubExprs + Array + hasInitializer()); 1905aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor } 1906ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 19074c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl Expr *getPlacementArg(unsigned i) { 19084c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl assert(i < NumPlacementArgs && "Index out of range"); 19092aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return getPlacementArgs()[i]; 19104c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 19114c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const Expr *getPlacementArg(unsigned i) const { 19124c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl assert(i < NumPlacementArgs && "Index out of range"); 19132aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return const_cast<CXXNewExpr*>(this)->getPlacementArg(i); 19144c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 19154c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 19164bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor bool isParenTypeId() const { return TypeIdParens.isValid(); } 19174bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor SourceRange getTypeIdParens() const { return TypeIdParens; } 19184bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor 19194c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl bool isGlobalNew() const { return GlobalNew; } 19207cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 19212aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// \brief Whether this new-expression has any initializer at all. 19222aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl bool hasInitializer() const { return StoredInitializationStyle > 0; } 19231548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl 19242aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// \brief The kind of initializer this new-expression has. 19252aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl InitializationStyle getInitializationStyle() const { 19262aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl if (StoredInitializationStyle == 0) 19272aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return NoInit; 19282aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return static_cast<InitializationStyle>(StoredInitializationStyle-1); 19291548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl } 19301548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl 19312aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// \brief The initializer of this new-expression. 19322aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl Expr *getInitializer() { 19336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return hasInitializer() ? cast<Expr>(SubExprs[Array]) : nullptr; 19341548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl } 19352aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl const Expr *getInitializer() const { 19366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return hasInitializer() ? cast<Expr>(SubExprs[Array]) : nullptr; 19371548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl } 19381548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl 1939010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the CXXConstructExpr from this new-expression, or null. 194088920d1a84dc63a3722b1f2b1fb5926c44bd81abRoman Divacky const CXXConstructExpr* getConstructExpr() const { 1941feb1f4a0a71868a271fa284dadfda7a2beeaccffMatt Beaumont-Gay return dyn_cast_or_null<CXXConstructExpr>(getInitializer()); 1942feb1f4a0a71868a271fa284dadfda7a2beeaccffMatt Beaumont-Gay } 1943feb1f4a0a71868a271fa284dadfda7a2beeaccffMatt Beaumont-Gay 19442aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// Answers whether the usual array deallocation function for the 19452aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// allocated type expects the size of the allocation as a 19462aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// parameter. 19472aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl bool doesUsualArrayDeleteWantSize() const { 19482aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return UsualArrayDeleteWantsSize; 19492aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl } 19501548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl 19514c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl typedef ExprIterator arg_iterator; 19524c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl typedef ConstExprIterator const_arg_iterator; 19534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 195487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::iterator_range<arg_iterator> placement_arguments() { 195587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return llvm::make_range(placement_arg_begin(), placement_arg_end()); 195687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 195787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 195887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::iterator_range<const_arg_iterator> placement_arguments() const { 195987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return llvm::make_range(placement_arg_begin(), placement_arg_end()); 196087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 196187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 19624c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl arg_iterator placement_arg_begin() { 19632aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer(); 19644c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 19654c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl arg_iterator placement_arg_end() { 19662aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer() + getNumPlacementArgs(); 19674c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 19684c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const_arg_iterator placement_arg_begin() const { 19692aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer(); 19704c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 19714c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const_arg_iterator placement_arg_end() const { 19722aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer() + getNumPlacementArgs(); 19734c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 1974ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 19755921863d8f24084797863b5df37842113bac4352Chris Lattner typedef Stmt **raw_arg_iterator; 19765921863d8f24084797863b5df37842113bac4352Chris Lattner raw_arg_iterator raw_arg_begin() { return SubExprs; } 19775921863d8f24084797863b5df37842113bac4352Chris Lattner raw_arg_iterator raw_arg_end() { 19782aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer() + getNumPlacementArgs(); 19795921863d8f24084797863b5df37842113bac4352Chris Lattner } 19805921863d8f24084797863b5df37842113bac4352Chris Lattner const_arg_iterator raw_arg_begin() const { return SubExprs; } 19812aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl const_arg_iterator raw_arg_end() const { 19822aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer() + getNumPlacementArgs(); 19832aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl } 19844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1985530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie SourceLocation getStartLoc() const { return Range.getBegin(); } 1986530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie SourceLocation getEndLoc() const { return Range.getEnd(); } 1987428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth 19882aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SourceRange getDirectInitRange() const { return DirectInitRange; } 1989428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth 1990aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar SourceRange getSourceRange() const LLVM_READONLY { 1991530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie return Range; 19924c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 199365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return getStartLoc(); } 199465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); } 19954c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 19964c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl static bool classof(const Stmt *T) { 19974c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl return T->getStmtClass() == CXXNewExprClass; 19984c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 19994c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 20004c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // Iterators 200163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 20022aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return child_range(raw_arg_begin(), raw_arg_end()); 200363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 20044c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}; 20054c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 20060982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief Represents a \c delete expression for memory deallocation and 20070982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// destructor calls, e.g. "delete[] pArray". 20084c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlclass CXXDeleteExpr : public Expr { 2009010bfc253050626435f006386c0bee4b55329687James Dennett /// Points to the operator delete overload that is used. Could be a member. 2010d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer FunctionDecl *OperatorDelete; 2011010bfc253050626435f006386c0bee4b55329687James Dennett /// The pointer expression to be deleted. 2012d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer Stmt *Argument; 2013010bfc253050626435f006386c0bee4b55329687James Dennett /// Location of the expression. 2014d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer SourceLocation Loc; 2015010bfc253050626435f006386c0bee4b55329687James Dennett /// Is this a forced global delete, i.e. "::delete"? 20164c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl bool GlobalDelete : 1; 2017010bfc253050626435f006386c0bee4b55329687James Dennett /// Is this the array form of delete, i.e. "delete[]"? 20184c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl bool ArrayForm : 1; 2019010bfc253050626435f006386c0bee4b55329687James Dennett /// ArrayFormAsWritten can be different from ArrayForm if 'delete' is applied 2020010bfc253050626435f006386c0bee4b55329687James Dennett /// to pointer-to-array type (ArrayFormAsWritten will be false while ArrayForm 2021010bfc253050626435f006386c0bee4b55329687James Dennett /// will be true). 20224076dacf1497fb95cb298b9d964fbdbdaf9bde6cArgyrios Kyrtzidis bool ArrayFormAsWritten : 1; 2023010bfc253050626435f006386c0bee4b55329687James Dennett /// Does the usual deallocation function for the element type require 2024010bfc253050626435f006386c0bee4b55329687James Dennett /// a size_t argument? 20256ec278d1a354517e20f13a877481453ee7940c78John McCall bool UsualArrayDeleteWantsSize : 1; 20264c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlpublic: 20274c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm, 20286ec278d1a354517e20f13a877481453ee7940c78John McCall bool arrayFormAsWritten, bool usualArrayDeleteWantsSize, 20296ec278d1a354517e20f13a877481453ee7940c78John McCall FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc) 2030bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(CXXDeleteExprClass, ty, VK_RValue, OK_Ordinary, false, false, 2031561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor arg->isInstantiationDependent(), 2032bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor arg->containsUnexpandedParameterPack()), 2033d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer OperatorDelete(operatorDelete), Argument(arg), Loc(loc), 2034f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall GlobalDelete(globalDelete), 20354076dacf1497fb95cb298b9d964fbdbdaf9bde6cArgyrios Kyrtzidis ArrayForm(arrayForm), ArrayFormAsWritten(arrayFormAsWritten), 2036d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize) { } 203795fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis explicit CXXDeleteExpr(EmptyShell Shell) 20386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(CXXDeleteExprClass, Shell), OperatorDelete(nullptr), 20396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Argument(nullptr) {} 20404c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 20414c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl bool isGlobalDelete() const { return GlobalDelete; } 20424c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl bool isArrayForm() const { return ArrayForm; } 20434076dacf1497fb95cb298b9d964fbdbdaf9bde6cArgyrios Kyrtzidis bool isArrayFormAsWritten() const { return ArrayFormAsWritten; } 20444c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 20456ec278d1a354517e20f13a877481453ee7940c78John McCall /// Answers whether the usual array deallocation function for the 20466ec278d1a354517e20f13a877481453ee7940c78John McCall /// allocated type expects the size of the allocation as a 20476ec278d1a354517e20f13a877481453ee7940c78John McCall /// parameter. This can be true even if the actual deallocation 20486ec278d1a354517e20f13a877481453ee7940c78John McCall /// function that we're using doesn't want a size. 20496ec278d1a354517e20f13a877481453ee7940c78John McCall bool doesUsualArrayDeleteWantSize() const { 20506ec278d1a354517e20f13a877481453ee7940c78John McCall return UsualArrayDeleteWantsSize; 20516ec278d1a354517e20f13a877481453ee7940c78John McCall } 20526ec278d1a354517e20f13a877481453ee7940c78John McCall 20534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl FunctionDecl *getOperatorDelete() const { return OperatorDelete; } 20544c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 20554c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl Expr *getArgument() { return cast<Expr>(Argument); } 20564c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const Expr *getArgument() const { return cast<Expr>(Argument); } 20574c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 2058010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieve the type being destroyed. 2059010bfc253050626435f006386c0bee4b55329687James Dennett /// 2060010bfc253050626435f006386c0bee4b55329687James Dennett /// If the type being destroyed is a dependent type which may or may not 2061010bfc253050626435f006386c0bee4b55329687James Dennett /// be a pointer, return an invalid type. 20625833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor QualType getDestroyedType() const; 2063ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 206465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 206565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY {return Argument->getLocEnd();} 20664c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 20674c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl static bool classof(const Stmt *T) { 20684c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl return T->getStmtClass() == CXXDeleteExprClass; 20694c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 20704c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 20714c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // Iterators 207263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Argument, &Argument+1); } 2073f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis 2074f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis friend class ASTStmtReader; 20754c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}; 20764c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 20770982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief Stores the type being destroyed by a pseudo-destructor expression. 2078a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregorclass PseudoDestructorTypeStorage { 2079ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Either the type source information or the name of the type, if 2080a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// it couldn't be resolved due to type-dependence. 2081a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor llvm::PointerUnion<TypeSourceInfo *, IdentifierInfo *> Type; 2082ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2083a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// \brief The starting source location of the pseudo-destructor type. 2084a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SourceLocation Location; 2085ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2086a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregorpublic: 2087a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage() { } 2088ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2089a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage(IdentifierInfo *II, SourceLocation Loc) 2090a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor : Type(II), Location(Loc) { } 2091ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2092a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage(TypeSourceInfo *Info); 2093ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2094ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *getTypeSourceInfo() const { 2095ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return Type.dyn_cast<TypeSourceInfo *>(); 2096a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 2097ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2098a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor IdentifierInfo *getIdentifier() const { 2099a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return Type.dyn_cast<IdentifierInfo *>(); 2100a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 2101ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2102a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SourceLocation getLocation() const { return Location; } 2103a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor}; 2104ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2105a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// \brief Represents a C++ pseudo-destructor (C++ [expr.pseudo]). 2106a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// 2107e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// A pseudo-destructor is an expression that looks like a member access to a 2108ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// destructor of a scalar type, except that scalar types don't have 2109e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// destructors. For example: 2110e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// 2111e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// \code 2112e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// typedef int T; 2113e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// void f(int *p) { 2114e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// p->T::~T(); 2115e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// } 2116e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// \endcode 2117a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// 2118e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// Pseudo-destructors typically occur when instantiating templates such as: 2119ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// 2120a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// \code 21211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// template<typename T> 2122a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// void destroy(T* ptr) { 2123e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// ptr->T::~T(); 2124a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// } 2125a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// \endcode 2126a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// 2127e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// for scalar types. A pseudo-destructor expression has no run-time semantics 2128e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// beyond evaluating the base expression. 2129a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorclass CXXPseudoDestructorExpr : public Expr { 2130a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief The base expression (that is being destroyed). 2131a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Stmt *Base; 21321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2133a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Whether the operator was an arrow ('->'); otherwise, it was a 2134a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// period ('.'). 2135a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool IsArrow : 1; 21361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2137a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief The location of the '.' or '->' operator. 2138a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc; 2139ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2140a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief The nested-name-specifier that follows the operator, if present. 2141f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 21421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2143e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// \brief The type that precedes the '::' in a qualified pseudo-destructor 2144e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// expression. 2145e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor TypeSourceInfo *ScopeType; 2146ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2147ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief The location of the '::' in a qualified pseudo-destructor 2148e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// expression. 2149e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor SourceLocation ColonColonLoc; 2150ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2151fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor /// \brief The location of the '~'. 2152fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc; 2153ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2154ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief The type being destroyed, or its name if we were unable to 2155a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// resolve the name. 2156a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage DestroyedType; 21571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2158f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor friend class ASTStmtReader; 2159ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2160a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorpublic: 216132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXPseudoDestructorExpr(const ASTContext &Context, 2162a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Expr *Base, bool isArrow, SourceLocation OperatorLoc, 2163f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 2164e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor TypeSourceInfo *ScopeType, 2165e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor SourceLocation ColonColonLoc, 2166fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc, 2167e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall PseudoDestructorTypeStorage DestroyedType); 21681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2169de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis explicit CXXPseudoDestructorExpr(EmptyShell Shell) 2170de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis : Expr(CXXPseudoDestructorExprClass, Shell), 21716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Base(nullptr), IsArrow(false), QualifierLoc(), ScopeType(nullptr) { } 2172de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis 2173a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Expr *getBase() const { return cast<Expr>(Base); } 21741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Determines whether this member expression actually had 2176a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// a C++ nested-name-specifier prior to the name of the member, e.g., 2177a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// x->Base::foo. 21787247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie bool hasQualifier() const { return QualifierLoc.hasQualifier(); } 21791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2180f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor /// \brief Retrieves the nested-name-specifier that qualifies the type name, 2181f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor /// with source-location information. 2182f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; } 2183ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 21841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief If the member name was qualified, retrieves the 2185a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// nested-name-specifier that precedes the member name. Otherwise, returns 2186010bfc253050626435f006386c0bee4b55329687James Dennett /// null. 2187ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie NestedNameSpecifier *getQualifier() const { 2188ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return QualifierLoc.getNestedNameSpecifier(); 2189f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor } 21901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2191a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Determine whether this pseudo-destructor expression was written 2192a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// using an '->' (otherwise, it used a '.'). 2193a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow() const { return IsArrow; } 2194a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 2195a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Retrieve the location of the '.' or '->' operator. 2196a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation getOperatorLoc() const { return OperatorLoc; } 21971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2198ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Retrieve the scope type in a qualified pseudo-destructor 2199e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// expression. 2200e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// 2201e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// Pseudo-destructor expressions can have extra qualification within them 2202e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// that is not part of the nested-name-specifier, e.g., \c p->T::~T(). 2203e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// Here, if the object type of the expression is (or may be) a scalar type, 2204ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \p T may also be a scalar type and, therefore, cannot be part of a 2205e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// nested-name-specifier. It is stored as the "scope type" of the pseudo- 2206e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// destructor expression. 220726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *getScopeTypeInfo() const { return ScopeType; } 2208ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2209e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// \brief Retrieve the location of the '::' in a qualified pseudo-destructor 2210e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// expression. 2211e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor SourceLocation getColonColonLoc() const { return ColonColonLoc; } 2212ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2213fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor /// \brief Retrieve the location of the '~'. 2214fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation getTildeLoc() const { return TildeLoc; } 2215ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 221626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /// \brief Retrieve the source location information for the type 221726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /// being destroyed. 2218a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// 2219ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// This type-source information is available for non-dependent 2220a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// pseudo-destructor expressions and some dependent pseudo-destructor 2221010bfc253050626435f006386c0bee4b55329687James Dennett /// expressions. Returns null if we only have the identifier for a 2222a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// dependent pseudo-destructor expression. 2223ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *getDestroyedTypeInfo() const { 2224ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return DestroyedType.getTypeSourceInfo(); 2225a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 2226ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2227a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// \brief In a dependent pseudo-destructor expression for which we do not 2228a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// have full type information on the destroyed type, provides the name 2229a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// of the destroyed type. 2230a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor IdentifierInfo *getDestroyedTypeIdentifier() const { 2231a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return DestroyedType.getIdentifier(); 2232a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 2233ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2234a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// \brief Retrieve the type being destroyed. 2235a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor QualType getDestroyedType() const; 2236ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2237a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// \brief Retrieve the starting location of the type being destroyed. 2238ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie SourceLocation getDestroyedTypeLoc() const { 2239ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return DestroyedType.getLocation(); 2240a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 22411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2242de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis /// \brief Set the name of destroyed type for a dependent pseudo-destructor 2243de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis /// expression. 2244de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis void setDestroyedType(IdentifierInfo *II, SourceLocation Loc) { 2245de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis DestroyedType = PseudoDestructorTypeStorage(II, Loc); 2246de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis } 2247de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis 2248de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis /// \brief Set the destroyed type. 2249de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis void setDestroyedType(TypeSourceInfo *Info) { 2250de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis DestroyedType = PseudoDestructorTypeStorage(Info); 2251de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis } 2252de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis 225365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY {return Base->getLocStart();} 225465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY; 22551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 2257a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return T->getStmtClass() == CXXPseudoDestructorExprClass; 2258a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 22591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2260a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor // Iterators 226163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Base, &Base + 1); } 2262a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}; 22631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22644ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// \brief A type trait used in the implementation of various C++11 and 22654ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// Library TR1 trait templates. 22664ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// 22674ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// \code 2268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// __is_pod(int) == true 2269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// __is_enum(std::string) == false 22704ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// __is_trivially_constructible(vector<int>, int*, int*) 22714ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// \endcode 22724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass TypeTraitExpr final 22734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public Expr, 22744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<TypeTraitExpr, TypeSourceInfo *> { 22754ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief The location of the type trait keyword. 22764ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation Loc; 22774ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 22784ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief The location of the closing parenthesis. 22794ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation RParenLoc; 22804ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 22814ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor // Note: The TypeSourceInfos for the arguments are allocated after the 22824ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor // TypeTraitExpr. 22834ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 22844ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind, 22854ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor ArrayRef<TypeSourceInfo *> Args, 22864ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation RParenLoc, 22874ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor bool Value); 22884ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 22894ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeTraitExpr(EmptyShell Empty) : Expr(TypeTraitExprClass, Empty) { } 22904ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 22914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar size_t numTrailingObjects(OverloadToken<TypeSourceInfo *>) const { 22924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getNumArgs(); 22934ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 22944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 22954ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregorpublic: 22964ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Create a new type trait expression. 229732b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static TypeTraitExpr *Create(const ASTContext &C, QualType T, 229832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper SourceLocation Loc, TypeTrait Kind, 22994ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor ArrayRef<TypeSourceInfo *> Args, 23004ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation RParenLoc, 23014ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor bool Value); 23024ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 230332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static TypeTraitExpr *CreateDeserialized(const ASTContext &C, 230432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper unsigned NumArgs); 23054ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 23064ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Determine which type trait this expression uses. 23074ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeTrait getTrait() const { 23084ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return static_cast<TypeTrait>(TypeTraitExprBits.Kind); 23094ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 23104ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 23114ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor bool getValue() const { 23124ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor assert(!isValueDependent()); 23134ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return TypeTraitExprBits.Value; 23144ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 23154ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 23164ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Determine the number of arguments to this type trait. 23174ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor unsigned getNumArgs() const { return TypeTraitExprBits.NumArgs; } 23184ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 23194ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Retrieve the Ith argument. 23204ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeSourceInfo *getArg(unsigned I) const { 23214ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor assert(I < getNumArgs() && "Argument out-of-range"); 23224ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return getArgs()[I]; 23234ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 23244ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 23254ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Retrieve the argument types. 23264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TypeSourceInfo *> getArgs() const { 23274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return llvm::makeArrayRef(getTrailingObjects<TypeSourceInfo *>(), 23284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getNumArgs()); 23294ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 23304ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 233165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 233265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 233365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen 23344ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor static bool classof(const Stmt *T) { 23354ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return T->getStmtClass() == TypeTraitExprClass; 23364ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 23374ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 23384ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor // Iterators 233987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 234087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 234187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 234287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 23434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 23444ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor friend class ASTStmtReader; 23454ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor friend class ASTStmtWriter; 23464ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}; 2347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 23480982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief An Embarcadero array type trait, as used in the implementation of 23490982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// __array_rank and __array_extent. 23500982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// 235121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley/// Example: 2352010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 23530982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// __array_rank(int[10][20]) == 2 23540982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// __array_extent(int, 1) == 20 2355010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 235621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleyclass ArrayTypeTraitExpr : public Expr { 235799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 235899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 23590982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The trait. An ArrayTypeTrait enum in MSVC compat unsigned. 236021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley unsigned ATT : 2; 236121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 23620982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The value of the type trait. Unspecified if dependent. 236321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley uint64_t Value; 236421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 23650982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The array dimension being queried, or -1 if not used. 236621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley Expr *Dimension; 236721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 23680982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The location of the type trait keyword. 236921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley SourceLocation Loc; 237021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 23710982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The location of the closing paren. 237221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley SourceLocation RParen; 237321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 23740982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The type being queried. 237521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley TypeSourceInfo *QueriedType; 237621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 237721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleypublic: 237821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley ArrayTypeTraitExpr(SourceLocation loc, ArrayTypeTrait att, 237921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley TypeSourceInfo *queried, uint64_t value, 238021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley Expr *dimension, SourceLocation rparen, QualType ty) 238121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley : Expr(ArrayTypeTraitExprClass, ty, VK_RValue, OK_Ordinary, 238221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley false, queried->getType()->isDependentType(), 2383561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (queried->getType()->isInstantiationDependentType() || 2384561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (dimension && dimension->isInstantiationDependent())), 238521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley queried->getType()->containsUnexpandedParameterPack()), 238621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley ATT(att), Value(value), Dimension(dimension), 238721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley Loc(loc), RParen(rparen), QueriedType(queried) { } 238821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 238921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 239021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley explicit ArrayTypeTraitExpr(EmptyShell Empty) 239121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley : Expr(ArrayTypeTraitExprClass, Empty), ATT(0), Value(false), 239221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley QueriedType() { } 239321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 239425aaf28c5bec71d5d005df67ee78b908ba5940f4Manuel Klimek virtual ~ArrayTypeTraitExpr() { } 239525aaf28c5bec71d5d005df67ee78b908ba5940f4Manuel Klimek 239665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 239765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParen; } 239821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 239921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley ArrayTypeTrait getTrait() const { return static_cast<ArrayTypeTrait>(ATT); } 240021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 240121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley QualType getQueriedType() const { return QueriedType->getType(); } 240221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 240321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley TypeSourceInfo *getQueriedTypeSourceInfo() const { return QueriedType; } 240421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 240521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley uint64_t getValue() const { assert(!isTypeDependent()); return Value; } 240621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 240721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley Expr *getDimensionExpression() const { return Dimension; } 240821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 240921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley static bool classof(const Stmt *T) { 241021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley return T->getStmtClass() == ArrayTypeTraitExprClass; 241121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley } 241221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 241321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley // Iterators 241487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 241587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 241687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 241721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 241821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley friend class ASTStmtReader; 241921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley}; 242021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 24210982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief An expression trait intrinsic. 24220982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// 2423552622067dc45013d240f73952fece703f5e63bdJohn Wiegley/// Example: 2424010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 24250982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// __is_lvalue_expr(std::cout) == true 24260982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// __is_lvalue_expr(1) == false 2427010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 2428552622067dc45013d240f73952fece703f5e63bdJohn Wiegleyclass ExpressionTraitExpr : public Expr { 2429010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief The trait. A ExpressionTrait enum in MSVC compatible unsigned. 2430552622067dc45013d240f73952fece703f5e63bdJohn Wiegley unsigned ET : 31; 24310982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The value of the type trait. Unspecified if dependent. 24324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned Value : 1; 2433552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 24340982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The location of the type trait keyword. 2435552622067dc45013d240f73952fece703f5e63bdJohn Wiegley SourceLocation Loc; 2436552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 24370982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The location of the closing paren. 2438552622067dc45013d240f73952fece703f5e63bdJohn Wiegley SourceLocation RParen; 2439552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 24400982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The expression being queried. 2441552622067dc45013d240f73952fece703f5e63bdJohn Wiegley Expr* QueriedExpression; 2442552622067dc45013d240f73952fece703f5e63bdJohn Wiegleypublic: 2443ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie ExpressionTraitExpr(SourceLocation loc, ExpressionTrait et, 2444552622067dc45013d240f73952fece703f5e63bdJohn Wiegley Expr *queried, bool value, 2445552622067dc45013d240f73952fece703f5e63bdJohn Wiegley SourceLocation rparen, QualType resultType) 2446552622067dc45013d240f73952fece703f5e63bdJohn Wiegley : Expr(ExpressionTraitExprClass, resultType, VK_RValue, OK_Ordinary, 2447552622067dc45013d240f73952fece703f5e63bdJohn Wiegley false, // Not type-dependent 2448552622067dc45013d240f73952fece703f5e63bdJohn Wiegley // Value-dependent if the argument is type-dependent. 2449552622067dc45013d240f73952fece703f5e63bdJohn Wiegley queried->isTypeDependent(), 2450561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor queried->isInstantiationDependent(), 2451552622067dc45013d240f73952fece703f5e63bdJohn Wiegley queried->containsUnexpandedParameterPack()), 2452ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie ET(et), Value(value), Loc(loc), RParen(rparen), 2453ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie QueriedExpression(queried) { } 2454552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2455552622067dc45013d240f73952fece703f5e63bdJohn Wiegley explicit ExpressionTraitExpr(EmptyShell Empty) 2456552622067dc45013d240f73952fece703f5e63bdJohn Wiegley : Expr(ExpressionTraitExprClass, Empty), ET(0), Value(false), 2457552622067dc45013d240f73952fece703f5e63bdJohn Wiegley QueriedExpression() { } 2458552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 245965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 246065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParen; } 2461552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2462552622067dc45013d240f73952fece703f5e63bdJohn Wiegley ExpressionTrait getTrait() const { return static_cast<ExpressionTrait>(ET); } 2463552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2464552622067dc45013d240f73952fece703f5e63bdJohn Wiegley Expr *getQueriedExpression() const { return QueriedExpression; } 2465552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2466552622067dc45013d240f73952fece703f5e63bdJohn Wiegley bool getValue() const { return Value; } 2467552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2468552622067dc45013d240f73952fece703f5e63bdJohn Wiegley static bool classof(const Stmt *T) { 2469552622067dc45013d240f73952fece703f5e63bdJohn Wiegley return T->getStmtClass() == ExpressionTraitExprClass; 2470552622067dc45013d240f73952fece703f5e63bdJohn Wiegley } 2471552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2472552622067dc45013d240f73952fece703f5e63bdJohn Wiegley // Iterators 247387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 247487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 247587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 2476552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2477552622067dc45013d240f73952fece703f5e63bdJohn Wiegley friend class ASTStmtReader; 2478552622067dc45013d240f73952fece703f5e63bdJohn Wiegley}; 2479552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2480552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 24817bb12da2b0749eeebb21854c77877736969e59f2John McCall/// \brief A reference to an overloaded function set, either an 2482809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett/// \c UnresolvedLookupExpr or an \c UnresolvedMemberExpr. 24834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass OverloadExpr : public Expr { 24840982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The common name of these declarations. 2485d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer DeclarationNameInfo NameInfo; 2486d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer 2487d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer /// \brief The nested-name-specifier that qualifies the name, if any. 2488d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer NestedNameSpecifierLoc QualifierLoc; 2489d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer 2490ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// The results. These are undesugared, which is to say, they may 24917bb12da2b0749eeebb21854c77877736969e59f2John McCall /// include UsingShadowDecls. Access is relative to the naming 24927bb12da2b0749eeebb21854c77877736969e59f2John McCall /// class. 2493928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor // FIXME: Allocate this data after the OverloadExpr subclass. 2494928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor DeclAccessPair *Results; 2495928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor unsigned NumResults; 2496ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 2497a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidisprotected: 2498e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Whether the name includes info for explicit template 2499e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// keyword and arguments. 2500e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo; 2501e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2502e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Return the optional template keyword and arguments info. 25034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTTemplateKWAndArgsInfo * 25044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getTrailingASTTemplateKWAndArgsInfo(); // defined far below. 2505e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2506e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Return the optional template keyword and arguments info. 25074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ASTTemplateKWAndArgsInfo *getTrailingASTTemplateKWAndArgsInfo() const { 25084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return const_cast<OverloadExpr *>(this) 25094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ->getTrailingASTTemplateKWAndArgsInfo(); 2510e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 25117bb12da2b0749eeebb21854c77877736969e59f2John McCall 25124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Return the optional template arguments. 25134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgumentLoc *getTrailingTemplateArgumentLoc(); // defined far below 25144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 251532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper OverloadExpr(StmtClass K, const ASTContext &C, 25164c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 2517e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 25182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2519bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor const TemplateArgumentListInfo *TemplateArgs, 2520bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor UnresolvedSetIterator Begin, UnresolvedSetIterator End, 2521561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor bool KnownDependent, 2522561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor bool KnownInstantiationDependent, 2523561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor bool KnownContainsUnexpandedParameterPack); 25247bb12da2b0749eeebb21854c77877736969e59f2John McCall 2525a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis OverloadExpr(StmtClass K, EmptyShell Empty) 25266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(K, Empty), QualifierLoc(), Results(nullptr), NumResults(0), 2527d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer HasTemplateKWAndArgsInfo(false) { } 2528a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis 252932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper void initializeResults(const ASTContext &C, 2530bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor UnresolvedSetIterator Begin, 2531bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor UnresolvedSetIterator End); 25327bb12da2b0749eeebb21854c77877736969e59f2John McCall 2533bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorpublic: 25349c72c6088d591ace8503b842d39448c2040f3033John McCall struct FindResult { 25359c72c6088d591ace8503b842d39448c2040f3033John McCall OverloadExpr *Expression; 25369c72c6088d591ace8503b842d39448c2040f3033John McCall bool IsAddressOfOperand; 25379c72c6088d591ace8503b842d39448c2040f3033John McCall bool HasFormOfMemberPointer; 25389c72c6088d591ace8503b842d39448c2040f3033John McCall }; 25399c72c6088d591ace8503b842d39448c2040f3033John McCall 2540010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Finds the overloaded expression in the given expression \p E of 25417bb12da2b0749eeebb21854c77877736969e59f2John McCall /// OverloadTy. 25427bb12da2b0749eeebb21854c77877736969e59f2John McCall /// 25439c72c6088d591ace8503b842d39448c2040f3033John McCall /// \return the expression (which must be there) and true if it has 25449c72c6088d591ace8503b842d39448c2040f3033John McCall /// the particular form of a member pointer expression 25459c72c6088d591ace8503b842d39448c2040f3033John McCall static FindResult find(Expr *E) { 25467bb12da2b0749eeebb21854c77877736969e59f2John McCall assert(E->getType()->isSpecificBuiltinType(BuiltinType::Overload)); 25477bb12da2b0749eeebb21854c77877736969e59f2John McCall 25489c72c6088d591ace8503b842d39448c2040f3033John McCall FindResult Result; 25499c72c6088d591ace8503b842d39448c2040f3033John McCall 25507bb12da2b0749eeebb21854c77877736969e59f2John McCall E = E->IgnoreParens(); 25519c72c6088d591ace8503b842d39448c2040f3033John McCall if (isa<UnaryOperator>(E)) { 25529c72c6088d591ace8503b842d39448c2040f3033John McCall assert(cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf); 25539c72c6088d591ace8503b842d39448c2040f3033John McCall E = cast<UnaryOperator>(E)->getSubExpr(); 25549c72c6088d591ace8503b842d39448c2040f3033John McCall OverloadExpr *Ovl = cast<OverloadExpr>(E->IgnoreParens()); 25559c72c6088d591ace8503b842d39448c2040f3033John McCall 25569c72c6088d591ace8503b842d39448c2040f3033John McCall Result.HasFormOfMemberPointer = (E == Ovl && Ovl->getQualifier()); 25579c72c6088d591ace8503b842d39448c2040f3033John McCall Result.IsAddressOfOperand = true; 25589c72c6088d591ace8503b842d39448c2040f3033John McCall Result.Expression = Ovl; 25599c72c6088d591ace8503b842d39448c2040f3033John McCall } else { 25609c72c6088d591ace8503b842d39448c2040f3033John McCall Result.HasFormOfMemberPointer = false; 25619c72c6088d591ace8503b842d39448c2040f3033John McCall Result.IsAddressOfOperand = false; 25629c72c6088d591ace8503b842d39448c2040f3033John McCall Result.Expression = cast<OverloadExpr>(E); 25639c72c6088d591ace8503b842d39448c2040f3033John McCall } 25649c72c6088d591ace8503b842d39448c2040f3033John McCall 25659c72c6088d591ace8503b842d39448c2040f3033John McCall return Result; 25667bb12da2b0749eeebb21854c77877736969e59f2John McCall } 25677bb12da2b0749eeebb21854c77877736969e59f2John McCall 25680982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Gets the naming class of this lookup, if any. 2569e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall CXXRecordDecl *getNamingClass() const; 2570e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall 25717bb12da2b0749eeebb21854c77877736969e59f2John McCall typedef UnresolvedSetImpl::iterator decls_iterator; 2572928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor decls_iterator decls_begin() const { return UnresolvedSetIterator(Results); } 2573ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie decls_iterator decls_end() const { 2574928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor return UnresolvedSetIterator(Results + NumResults); 2575928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor } 25766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::iterator_range<decls_iterator> decls() const { 257787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return llvm::make_range(decls_begin(), decls_end()); 25786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2579ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 25800982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Gets the number of declarations in the unresolved set. 2581928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor unsigned getNumDecls() const { return NumResults; } 25827bb12da2b0749eeebb21854c77877736969e59f2John McCall 25830982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Gets the full name info. 25842577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &getNameInfo() const { return NameInfo; } 25852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 25860982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Gets the name looked up. 25872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName getName() const { return NameInfo.getName(); } 25887bb12da2b0749eeebb21854c77877736969e59f2John McCall 25890982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Gets the location of the name. 25902577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceLocation getNameLoc() const { return NameInfo.getLoc(); } 25917bb12da2b0749eeebb21854c77877736969e59f2John McCall 25920982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Fetches the nested-name qualifier, if one was given. 2593ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie NestedNameSpecifier *getQualifier() const { 2594ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return QualifierLoc.getNestedNameSpecifier(); 25954c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor } 25967bb12da2b0749eeebb21854c77877736969e59f2John McCall 25970982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Fetches the nested-name qualifier with source-location 25980982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// information, if one was given. 25994c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; } 26007bb12da2b0749eeebb21854c77877736969e59f2John McCall 2601e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the template keyword preceding 2602e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// this name, if any. 2603e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getTemplateKeywordLoc() const { 2604e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 26054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingASTTemplateKWAndArgsInfo()->TemplateKWLoc; 2606e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2607e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2608e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the left angle bracket starting the 2609e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the name, if any. 2610e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getLAngleLoc() const { 2611e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 26124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingASTTemplateKWAndArgsInfo()->LAngleLoc; 2613e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2614e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2615e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the right angle bracket ending the 2616e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the name, if any. 2617e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getRAngleLoc() const { 2618e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 26194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingASTTemplateKWAndArgsInfo()->RAngleLoc; 2620e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 26217bb12da2b0749eeebb21854c77877736969e59f2John McCall 26220982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Determines whether the name was preceded by the template keyword. 2623e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } 2624e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 26250982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Determines whether this expression had explicit template arguments. 2626e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } 2627e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 26284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgumentLoc const *getTemplateArgs() const { 26294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!hasExplicitTemplateArgs()) 26304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 26314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return const_cast<OverloadExpr *>(this)->getTrailingTemplateArgumentLoc(); 2632e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 26337bb12da2b0749eeebb21854c77877736969e59f2John McCall 26344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned getNumTemplateArgs() const { 26354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!hasExplicitTemplateArgs()) 26364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return 0; 26377bb12da2b0749eeebb21854c77877736969e59f2John McCall 26384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingASTTemplateKWAndArgsInfo()->NumTemplateArgs; 2639e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2640e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 26414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TemplateArgumentLoc> template_arguments() const { 26424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return {getTemplateArgs(), getNumTemplateArgs()}; 2643e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2644e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 26450982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Copies the template arguments into the given structure. 2646e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 26474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (hasExplicitTemplateArgs()) 26484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getTrailingASTTemplateKWAndArgsInfo()->copyInto(getTemplateArgs(), List); 26497bb12da2b0749eeebb21854c77877736969e59f2John McCall } 26507bb12da2b0749eeebb21854c77877736969e59f2John McCall 26517bb12da2b0749eeebb21854c77877736969e59f2John McCall static bool classof(const Stmt *T) { 26527bb12da2b0749eeebb21854c77877736969e59f2John McCall return T->getStmtClass() == UnresolvedLookupExprClass || 26537bb12da2b0749eeebb21854c77877736969e59f2John McCall T->getStmtClass() == UnresolvedMemberExprClass; 26547bb12da2b0749eeebb21854c77877736969e59f2John McCall } 26554045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 26564045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtReader; 26574045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtWriter; 26587bb12da2b0749eeebb21854c77877736969e59f2John McCall}; 26597bb12da2b0749eeebb21854c77877736969e59f2John McCall 26607bb12da2b0749eeebb21854c77877736969e59f2John McCall/// \brief A reference to a name which we were able to look up during 26610982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// parsing but could not resolve to a specific declaration. 26620982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// 26630982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// This arises in several ways: 2664010bfc253050626435f006386c0bee4b55329687James Dennett/// * we might be waiting for argument-dependent lookup; 2665010bfc253050626435f006386c0bee4b55329687James Dennett/// * the name might resolve to an overloaded function; 26667bb12da2b0749eeebb21854c77877736969e59f2John McCall/// and eventually: 2667010bfc253050626435f006386c0bee4b55329687James Dennett/// * the lookup might have included a function template. 2668010bfc253050626435f006386c0bee4b55329687James Dennett/// 26690982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// These never include UnresolvedUsingValueDecls, which are always class 26700982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// members and therefore appear only in UnresolvedMemberLookupExprs. 26714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass UnresolvedLookupExpr final 26724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public OverloadExpr, 26734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects< 26744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar UnresolvedLookupExpr, ASTTemplateKWAndArgsInfo, TemplateArgumentLoc> { 2675ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// True if these lookup results should be extended by 2676ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// argument-dependent lookup if this is the operand of a function 2677ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// call. 2678ba13543329afac4a0d01304ec2ec4924d99306a6John McCall bool RequiresADL; 2679ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 26807453ed4cb2cab113de3378df371b1c6f1243d832John McCall /// True if these lookup results are overloaded. This is pretty 26817453ed4cb2cab113de3378df371b1c6f1243d832John McCall /// trivially rederivable if we urgently need to kill this field. 26827453ed4cb2cab113de3378df371b1c6f1243d832John McCall bool Overloaded; 26837453ed4cb2cab113de3378df371b1c6f1243d832John McCall 26847bb12da2b0749eeebb21854c77877736969e59f2John McCall /// The naming class (C++ [class.access.base]p5) of the lookup, if 26857bb12da2b0749eeebb21854c77877736969e59f2John McCall /// any. This can generally be recalculated from the context chain, 26867bb12da2b0749eeebb21854c77877736969e59f2John McCall /// but that can be fairly expensive for unqualified lookups. If we 26877bb12da2b0749eeebb21854c77877736969e59f2John McCall /// want to improve memory use here, this could go in a union 26887bb12da2b0749eeebb21854c77877736969e59f2John McCall /// against the qualified-lookup bits. 26897bb12da2b0749eeebb21854c77877736969e59f2John McCall CXXRecordDecl *NamingClass; 2690f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 26914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const { 26924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return HasTemplateKWAndArgsInfo ? 1 : 0; 26934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 26944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 269532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper UnresolvedLookupExpr(const ASTContext &C, 2696928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor CXXRecordDecl *NamingClass, 26974c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 2698e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 26992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2700ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie bool RequiresADL, bool Overloaded, 2701bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor const TemplateArgumentListInfo *TemplateArgs, 2702b1502bcd67fb593a95cbf73ec3814f4015666da0Richard Smith UnresolvedSetIterator Begin, UnresolvedSetIterator End) 2703e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara : OverloadExpr(UnresolvedLookupExprClass, C, QualifierLoc, TemplateKWLoc, 2704e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara NameInfo, TemplateArgs, Begin, End, false, false, false), 2705ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith RequiresADL(RequiresADL), 2706ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith Overloaded(Overloaded), NamingClass(NamingClass) 2707ba13543329afac4a0d01304ec2ec4924d99306a6John McCall {} 2708ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 2709bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis UnresolvedLookupExpr(EmptyShell Empty) 2710bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis : OverloadExpr(UnresolvedLookupExprClass, Empty), 27116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RequiresADL(false), Overloaded(false), NamingClass(nullptr) 2712bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis {} 2713bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis 27144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 27154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend class OverloadExpr; 27164c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor friend class ASTStmtReader; 2717ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2718ba13543329afac4a0d01304ec2ec4924d99306a6John McCallpublic: 271932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static UnresolvedLookupExpr *Create(const ASTContext &C, 2720c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall CXXRecordDecl *NamingClass, 27214c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 27222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 27235a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor bool ADL, bool Overloaded, 2724ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie UnresolvedSetIterator Begin, 2725b1502bcd67fb593a95cbf73ec3814f4015666da0Richard Smith UnresolvedSetIterator End) { 2726e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return new(C) UnresolvedLookupExpr(C, NamingClass, QualifierLoc, 2727e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation(), NameInfo, 27286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ADL, Overloaded, nullptr, Begin, End); 2729ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 2730ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 273132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static UnresolvedLookupExpr *Create(const ASTContext &C, 2732c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall CXXRecordDecl *NamingClass, 27334c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 2734e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 27352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2736f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool ADL, 27379d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara const TemplateArgumentListInfo *Args, 2738ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie UnresolvedSetIterator Begin, 27395a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor UnresolvedSetIterator End); 2740f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 274132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static UnresolvedLookupExpr *CreateEmpty(const ASTContext &C, 2742e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo, 2743bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis unsigned NumTemplateArgs); 2744bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis 2745ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// True if this declaration should be extended by 2746ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// argument-dependent lookup. 2747ba13543329afac4a0d01304ec2ec4924d99306a6John McCall bool requiresADL() const { return RequiresADL; } 2748ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 27497453ed4cb2cab113de3378df371b1c6f1243d832John McCall /// True if this lookup is overloaded. 27507453ed4cb2cab113de3378df371b1c6f1243d832John McCall bool isOverloaded() const { return Overloaded; } 27517453ed4cb2cab113de3378df371b1c6f1243d832John McCall 2752c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall /// Gets the 'naming class' (in the sense of C++0x 2753c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall /// [class.access.base]p5) of the lookup. This is the scope 2754c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall /// that was looked in to find these results. 2755c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall CXXRecordDecl *getNamingClass() const { return NamingClass; } 2756c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall 275765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 275865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen if (NestedNameSpecifierLoc l = getQualifierLoc()) 275965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return l.getBeginLoc(); 276065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getNameInfo().getLocStart(); 276165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen } 276265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 2763ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie if (hasExplicitTemplateArgs()) 276465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getRAngleLoc(); 276565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getNameInfo().getLocEnd(); 2766ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 2767ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 276887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 276987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 277087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 2771ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 2772ba13543329afac4a0d01304ec2ec4924d99306a6John McCall static bool classof(const Stmt *T) { 2773ba13543329afac4a0d01304ec2ec4924d99306a6John McCall return T->getStmtClass() == UnresolvedLookupExprClass; 2774ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 2775ba13543329afac4a0d01304ec2ec4924d99306a6John McCall}; 2776ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 27775953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// \brief A qualified reference to a name whose declaration cannot 27785953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// yet be resolved. 27795953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// 2780ba13543329afac4a0d01304ec2ec4924d99306a6John McCall/// DependentScopeDeclRefExpr is similar to DeclRefExpr in that 2781a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// it expresses a reference to a declaration such as 27825953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// X<T>::value. The difference, however, is that an 2783865d447ac6a4721ab58e898d014a21f2eff74b06John McCall/// DependentScopeDeclRefExpr node is used only within C++ templates when 27845953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// the qualification (e.g., X<T>::) refers to a dependent type. In 27855953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// this case, X<T>::value cannot resolve to a declaration because the 27863d9efecfb174a99ffd1f7a6156f7de3ca855993fJames Dennett/// declaration will differ from one instantiation of X<T> to the 2787865d447ac6a4721ab58e898d014a21f2eff74b06John McCall/// next. Therefore, DependentScopeDeclRefExpr keeps track of the 2788ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// qualifier (X<T>::) and the name of the entity being referenced 2789a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// ("value"). Such expressions will instantiate to a DeclRefExpr once the 2790a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// declaration can be found. 27914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass DependentScopeDeclRefExpr final 27924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public Expr, 27934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<DependentScopeDeclRefExpr, 27944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTTemplateKWAndArgsInfo, 27954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgumentLoc> { 2796ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor /// \brief The nested-name-specifier that qualifies this unresolved 2797ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor /// declaration name. 279800cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc; 2799ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2800010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief The name of the entity we will be referencing. 280100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor DeclarationNameInfo NameInfo; 28025953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 2803e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Whether the name includes info for explicit template 2804e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// keyword and arguments. 2805e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo; 2806e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 28074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const { 28084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return HasTemplateKWAndArgsInfo ? 1 : 0; 2809e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 28101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2811f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall DependentScopeDeclRefExpr(QualType T, 281200cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 2813e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 28142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2815bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor const TemplateArgumentListInfo *Args); 2816f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 2817f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCallpublic: 281832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static DependentScopeDeclRefExpr *Create(const ASTContext &C, 281900cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 2820e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 28212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2822e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara const TemplateArgumentListInfo *TemplateArgs); 28235953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 282432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static DependentScopeDeclRefExpr *CreateEmpty(const ASTContext &C, 2825e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo, 282612dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis unsigned NumTemplateArgs); 282712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis 28285953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor /// \brief Retrieve the name that this expression refers to. 28292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &getNameInfo() const { return NameInfo; } 28302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 28312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// \brief Retrieve the name that this expression refers to. 28322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName getDeclName() const { return NameInfo.getName(); } 28335953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 28345953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor /// \brief Retrieve the location of the name within the expression. 28353d9efecfb174a99ffd1f7a6156f7de3ca855993fJames Dennett /// 28363d9efecfb174a99ffd1f7a6156f7de3ca855993fJames Dennett /// For example, in "X<T>::value" this is the location of "value". 28372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceLocation getLocation() const { return NameInfo.getLoc(); } 28385953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 283900cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor /// \brief Retrieve the nested-name-specifier that qualifies the 284000cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor /// name, with source location information. 284100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; } 2842ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2843ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor /// \brief Retrieve the nested-name-specifier that qualifies this 2844ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor /// declaration. 2845ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie NestedNameSpecifier *getQualifier() const { 2846ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return QualifierLoc.getNestedNameSpecifier(); 284700cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor } 28481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2849e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the template keyword preceding 2850e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// this name, if any. 2851e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getTemplateKeywordLoc() const { 2852e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 28534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc; 2854e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2855e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2856e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the left angle bracket starting the 2857e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the name, if any. 2858e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getLAngleLoc() const { 2859e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 28604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc; 2861e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2862e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2863e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the right angle bracket ending the 2864e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the name, if any. 2865e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getRAngleLoc() const { 2866e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 28674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc; 2868e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2869e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2870e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// Determines whether the name was preceded by the template keyword. 2871e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } 2872e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2873f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// Determines whether this lookup had explicit template arguments. 2874e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } 28751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2876f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// \brief Copies the template arguments (if present) into the given 2877f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// structure. 2878f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 28794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (hasExplicitTemplateArgs()) 28804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto( 28814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getTrailingObjects<TemplateArgumentLoc>(), List); 2882f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 2883ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2884f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentLoc const *getTemplateArgs() const { 28854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!hasExplicitTemplateArgs()) 28864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 28874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 28884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<TemplateArgumentLoc>(); 2889d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 2890d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 2891f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall unsigned getNumTemplateArgs() const { 28924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!hasExplicitTemplateArgs()) 28934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return 0; 28944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 28954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs; 28964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 28974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 28984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TemplateArgumentLoc> template_arguments() const { 28994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return {getTemplateArgs(), getNumTemplateArgs()}; 2900f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 29011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29023d9efecfb174a99ffd1f7a6156f7de3ca855993fJames Dennett /// Note: getLocStart() is the start of the whole DependentScopeDeclRefExpr, 29033d9efecfb174a99ffd1f7a6156f7de3ca855993fJames Dennett /// and differs from getLocation().getStart(). 290465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 290565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return QualifierLoc.getBeginLoc(); 290665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen } 290765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 2908f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (hasExplicitTemplateArgs()) 290965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getRAngleLoc(); 291065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getLocation(); 2911edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor } 29121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 2914f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return T->getStmtClass() == DependentScopeDeclRefExprClass; 2915edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor } 2916f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 291787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 291887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 291987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 29204045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 29214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 29224045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtReader; 29234045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtWriter; 2924edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor}; 29251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2926010bfc253050626435f006386c0bee4b55329687James Dennett/// Represents an expression -- generally a full-expression -- that 29274765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// introduces cleanups to be run at the end of the sub-expression's 29284765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// evaluation. The most common source of expression-introduced 292980ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// cleanups is temporary objects in C++, but several other kinds of 293080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// expressions can create cleanups, including basically every 293180ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// call in ARC that returns an Objective-C pointer. 293280ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// 293380ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// This expression also tracks whether the sub-expression contains a 293480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// potentially-evaluated block literal. The lifetime of a block 293580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// literal is the extent of the enclosing scope. 29364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass ExprWithCleanups final 29374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public Expr, 29384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<ExprWithCleanups, BlockDecl *> { 293980ee6e878a169e6255d4686a91bb696151ff229fJohn McCallpublic: 294080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall /// The type of objects that are kept in the cleanup. 294180ee6e878a169e6255d4686a91bb696151ff229fJohn McCall /// It's useful to remember the set of blocks; we could also 294280ee6e878a169e6255d4686a91bb696151ff229fJohn McCall /// remember the set of temporaries, but there's currently 294380ee6e878a169e6255d4686a91bb696151ff229fJohn McCall /// no need. 294480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall typedef BlockDecl *CleanupObject; 294580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall 294680ee6e878a169e6255d4686a91bb696151ff229fJohn McCallprivate: 294702bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson Stmt *SubExpr; 29481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 294980ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ExprWithCleanups(EmptyShell, unsigned NumObjects); 29504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ExprWithCleanups(Expr *SubExpr, bool CleanupsHaveSideEffects, 29514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<CleanupObject> Objects); 295202bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 29534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 295480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall friend class ASTStmtReader; 2955ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 295688eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlssonpublic: 295732b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static ExprWithCleanups *Create(const ASTContext &C, EmptyShell empty, 295880ee6e878a169e6255d4686a91bb696151ff229fJohn McCall unsigned numObjects); 29591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 296032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static ExprWithCleanups *Create(const ASTContext &C, Expr *subexpr, 29614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool CleanupsHaveSideEffects, 296280ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ArrayRef<CleanupObject> objects); 2963ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 296480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ArrayRef<CleanupObject> getObjects() const { 29654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return llvm::makeArrayRef(getTrailingObjects<CleanupObject>(), 29664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getNumObjects()); 2967f0721fe438d7e40c168e5d664970e7830bc138fbAnders Carlsson } 296880ee6e878a169e6255d4686a91bb696151ff229fJohn McCall 296980ee6e878a169e6255d4686a91bb696151ff229fJohn McCall unsigned getNumObjects() const { return ExprWithCleanupsBits.NumObjects; } 297080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall 297180ee6e878a169e6255d4686a91bb696151ff229fJohn McCall CleanupObject getObject(unsigned i) const { 297280ee6e878a169e6255d4686a91bb696151ff229fJohn McCall assert(i < getNumObjects() && "Index out of range"); 297380ee6e878a169e6255d4686a91bb696151ff229fJohn McCall return getObjects()[i]; 2974d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner } 29751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 297602bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson Expr *getSubExpr() { return cast<Expr>(SubExpr); } 2977f0721fe438d7e40c168e5d664970e7830bc138fbAnders Carlsson const Expr *getSubExpr() const { return cast<Expr>(SubExpr); } 29784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool cleanupsHaveSideEffects() const { 29794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return ExprWithCleanupsBits.CleanupsHaveSideEffects; 29804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 298180ee6e878a169e6255d4686a91bb696151ff229fJohn McCall 2982010bfc253050626435f006386c0bee4b55329687James Dennett /// As with any mutator of the AST, be very careful 298380ee6e878a169e6255d4686a91bb696151ff229fJohn McCall /// when modifying an existing AST to preserve its invariants. 298488eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson void setSubExpr(Expr *E) { SubExpr = E; } 298502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 298665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 298765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return SubExpr->getLocStart(); 298896be6917e1c4ba1f4435a14c9e7c6c139571d086Douglas Gregor } 298965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return SubExpr->getLocEnd();} 299002bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 299102bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson // Implement isa/cast/dyncast/etc. 299202bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson static bool classof(const Stmt *T) { 29934765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall return T->getStmtClass() == ExprWithCleanupsClass; 299402bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson } 299502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 299602bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson // Iterators 299763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&SubExpr, &SubExpr + 1); } 299802bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson}; 299902bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 3000d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// \brief Describes an explicit type conversion that uses functional 3001d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// notion but could not be resolved because one or more arguments are 3002d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// type-dependent. 3003d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// 3004d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// The explicit type conversions expressed by 3005fe865f1f35d1b91f42f58f08a1399b961b71b3bcJames Dennett/// CXXUnresolvedConstructExpr have the form <tt>T(a1, a2, ..., aN)</tt>, 30060982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// where \c T is some type and \c a1, \c a2, ..., \c aN are values, and 30070982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// either \c T is a dependent type or one or more of the <tt>a</tt>'s is 3008d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// type-dependent. For example, this would occur in a template such 3009d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// as: 3010d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// 3011d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// \code 3012d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// template<typename T, typename A1> 3013d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// inline T make_a(const A1& a1) { 3014d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// return T(a1); 3015d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// } 3016d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// \endcode 3017d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// 3018d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// When the returned expression is instantiated, it may resolve to a 3019d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// constructor call, conversion function call, or some kind of type 3020d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// conversion. 30214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CXXUnresolvedConstructExpr final 30224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public Expr, 30234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<CXXUnresolvedConstructExpr, Expr *> { 3024d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief The type being constructed. 3025ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *Type; 3026ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3027d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief The location of the left parentheses ('('). 3028d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation LParenLoc; 3029d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 3030d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief The location of the right parentheses (')'). 3031d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation RParenLoc; 3032d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 3033d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief The number of arguments used to construct the type. 3034d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor unsigned NumArgs; 30351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3036ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CXXUnresolvedConstructExpr(TypeSourceInfo *Type, 3037d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation LParenLoc, 30383b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> Args, 3039d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation RParenLoc); 3040d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 30418dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis CXXUnresolvedConstructExpr(EmptyShell Empty, unsigned NumArgs) 3042ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor : Expr(CXXUnresolvedConstructExprClass, Empty), Type(), NumArgs(NumArgs) { } 30438dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 30444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 3045ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor friend class ASTStmtReader; 3046ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3047d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregorpublic: 304832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXUnresolvedConstructExpr *Create(const ASTContext &C, 3049ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *Type, 3050d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation LParenLoc, 30513b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> Args, 3052d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation RParenLoc); 3053d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 305432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXUnresolvedConstructExpr *CreateEmpty(const ASTContext &C, 30558dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis unsigned NumArgs); 30568dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 3057d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief Retrieve the type that is being constructed, as specified 3058d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// in the source code. 3059ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor QualType getTypeAsWritten() const { return Type->getType(); } 3060d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 3061ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Retrieve the type source information for the type being 3062ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor /// constructed. 3063ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *getTypeSourceInfo() const { return Type; } 3064ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3065d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief Retrieve the location of the left parentheses ('(') that 3066d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// precedes the argument list. 3067d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation getLParenLoc() const { return LParenLoc; } 3068d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor void setLParenLoc(SourceLocation L) { LParenLoc = L; } 3069d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 3070d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief Retrieve the location of the right parentheses (')') that 3071d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// follows the argument list. 3072d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 3073d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 3074d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 3075d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief Retrieve the number of arguments. 3076d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor unsigned arg_size() const { return NumArgs; } 3077d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 3078d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor typedef Expr** arg_iterator; 30794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar arg_iterator arg_begin() { return getTrailingObjects<Expr *>(); } 3080d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor arg_iterator arg_end() { return arg_begin() + NumArgs; } 3081d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 30821dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall typedef const Expr* const * const_arg_iterator; 30834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const_arg_iterator arg_begin() const { return getTrailingObjects<Expr *>(); } 30841dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall const_arg_iterator arg_end() const { 30851dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall return arg_begin() + NumArgs; 30861dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall } 30871dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall 3088d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor Expr *getArg(unsigned I) { 3089d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor assert(I < NumArgs && "Argument index out-of-range"); 3090d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor return *(arg_begin() + I); 3091d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor } 3092d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 30931dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall const Expr *getArg(unsigned I) const { 30941dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall assert(I < NumArgs && "Argument index out-of-range"); 30951dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall return *(arg_begin() + I); 30961dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall } 30971dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall 30988dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis void setArg(unsigned I, Expr *E) { 30998dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis assert(I < NumArgs && "Argument index out-of-range"); 31008dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis *(arg_begin() + I) = E; 31018dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis } 31028dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 310365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY; 3104bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella SourceLocation getLocEnd() const LLVM_READONLY { 31050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!RParenLoc.isValid() && NumArgs > 0) 31060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return getArg(NumArgs - 1)->getLocEnd(); 31070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return RParenLoc; 3108bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella } 3109ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 31101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 3111d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor return T->getStmtClass() == CXXUnresolvedConstructExprClass; 3112d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor } 3113d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 3114d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor // Iterators 311563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 31164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Stmt **begin = reinterpret_cast<Stmt **>(arg_begin()); 311763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(begin, begin + NumArgs); 311863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 3119d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor}; 3120d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 3121ba13543329afac4a0d01304ec2ec4924d99306a6John McCall/// \brief Represents a C++ member access expression where the actual 3122ba13543329afac4a0d01304ec2ec4924d99306a6John McCall/// member referenced could not be resolved because the base 3123ba13543329afac4a0d01304ec2ec4924d99306a6John McCall/// expression or the member name was dependent. 3124aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// 3125aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// Like UnresolvedMemberExprs, these can be either implicit or 3126aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// explicit accesses. It is only possible to get one of these with 3127aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// an implicit access if a qualifier is provided. 31284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CXXDependentScopeMemberExpr final 31294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public Expr, 31304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<CXXDependentScopeMemberExpr, 31314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTTemplateKWAndArgsInfo, 31324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgumentLoc> { 31331c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief The expression for the base pointer or class reference, 3134aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// e.g., the \c x in x.f. Can be null in implicit accesses. 31351c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor Stmt *Base; 31361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3137aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// \brief The type of the base expression. Never null, even for 3138aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// implicit accesses. 3139aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 3140aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 31411c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief Whether this member expression used the '->' operator or 31421c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// the '.' operator. 31433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor bool IsArrow : 1; 31441c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 3145e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Whether this member expression has info for explicit template 3146e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// keyword and arguments. 3147e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo : 1; 31481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31491c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief The location of the '->' or '.' operator. 31501c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor SourceLocation OperatorLoc; 31511c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 3152a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /// \brief The nested-name-specifier that precedes the member name, if any. 31537c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 31541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3155c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// \brief In a qualified member access expression such as t->Base::f, this 31561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// member stores the resolves of name lookup in the context of the member 3157c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// access expression, to be used at instantiation time. 3158c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// 315946bb4f1a3ac9517406887939612eb8df4b7be006Douglas Gregor /// FIXME: This member, along with the QualifierLoc, could 3160c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// be stuck into a structure that is optionally allocated at the end of 3161865d447ac6a4721ab58e898d014a21f2eff74b06John McCall /// the CXXDependentScopeMemberExpr, to save space in the common case. 3162c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierFoundInScope; 31631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31641c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief The member to which this member expression refers, which 31651c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// can be name, overloaded operator, or destructor. 3166010bfc253050626435f006386c0bee4b55329687James Dennett /// 3167a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /// FIXME: could also be a template-id 31682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo MemberNameInfo; 31691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const { 31714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return HasTemplateKWAndArgsInfo ? 1 : 0; 3172e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 3173e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 317432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXDependentScopeMemberExpr(const ASTContext &C, Expr *Base, 317532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper QualType BaseType, bool IsArrow, 317632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper SourceLocation OperatorLoc, 317732b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper NestedNameSpecifierLoc QualifierLoc, 317832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper SourceLocation TemplateKWLoc, 317932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper NamedDecl *FirstQualifierFoundInScope, 318032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper DeclarationNameInfo MemberNameInfo, 318132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper const TemplateArgumentListInfo *TemplateArgs); 31821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31831c0ca59416999129d0439c2661d137ef38e86209Douglas Gregorpublic: 318432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXDependentScopeMemberExpr(const ASTContext &C, Expr *Base, 318532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper QualType BaseType, bool IsArrow, 3186bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SourceLocation OperatorLoc, 31877c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 3188bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor NamedDecl *FirstQualifierFoundInScope, 3189bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor DeclarationNameInfo MemberNameInfo); 31901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3191865d447ac6a4721ab58e898d014a21f2eff74b06John McCall static CXXDependentScopeMemberExpr * 319232b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper Create(const ASTContext &C, Expr *Base, QualType BaseType, bool IsArrow, 319332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, 319432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, 31952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo MemberNameInfo, 3196d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *TemplateArgs); 31971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31988dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis static CXXDependentScopeMemberExpr * 319932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CreateEmpty(const ASTContext &C, bool HasTemplateKWAndArgsInfo, 3200def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor unsigned NumTemplateArgs); 32018dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 3202aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// \brief True if this is an implicit access, i.e. one in which the 3203aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// member being accessed was not written in the source. The source 3204aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// location of the operator is invalid in this case. 32054c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor bool isImplicitAccess() const; 3206aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 32071c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief Retrieve the base object of this member expressions, 32081c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// e.g., the \c x in \c x.m. 3209aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *getBase() const { 3210aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall assert(!isImplicitAccess()); 3211aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return cast<Expr>(Base); 3212aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 32131c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 3214aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType getBaseType() const { return BaseType; } 3215aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 32161c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief Determine whether this member expression used the '->' 32171c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// operator; otherwise, it used the '.' operator. 32181c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor bool isArrow() const { return IsArrow; } 32191c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 32201c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief Retrieve the location of the '->' or '.' operator. 32211c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor SourceLocation getOperatorLoc() const { return OperatorLoc; } 32221c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 3223a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /// \brief Retrieve the nested-name-specifier that qualifies the member 3224a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /// name. 3225ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie NestedNameSpecifier *getQualifier() const { 3226ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return QualifierLoc.getNestedNameSpecifier(); 32277c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor } 32281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32297c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor /// \brief Retrieve the nested-name-specifier that qualifies the member 32307c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor /// name, with source location information. 32317c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; } 3232ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3233ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3234c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// \brief Retrieve the first part of the nested-name-specifier that was 3235c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// found in the scope of the member access expression when the member access 3236c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// was initially parsed. 3237c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// 3238c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// This function only returns a useful result when member access expression 32391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration 32401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// returned by this function describes what was found by unqualified name 3241c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// lookup for the identifier "Base" within the scope of the member access 3242c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// expression itself. At template instantiation time, this information is 3243c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// combined with the results of name lookup into the type of the object 3244c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// expression itself (the class type of x). 32451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *getFirstQualifierFoundInScope() const { 3246c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor return FirstQualifierFoundInScope; 3247c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor } 32481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32491c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief Retrieve the name of the member that this expression 32501c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// refers to. 32512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &getMemberNameInfo() const { 32522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return MemberNameInfo; 32532577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 32542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 32552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// \brief Retrieve the name of the member that this expression 32562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// refers to. 32572577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName getMember() const { return MemberNameInfo.getName(); } 32581c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 32591c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor // \brief Retrieve the location of the name of the member that this 32601c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor // expression refers to. 32612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceLocation getMemberLoc() const { return MemberNameInfo.getLoc(); } 32621c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 3263e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the template keyword preceding the 3264e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// member name, if any. 3265e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getTemplateKeywordLoc() const { 3266e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 32674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc; 3268e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 3269e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 3270e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the left angle bracket starting the 3271e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the member name, if any. 3272e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getLAngleLoc() const { 3273e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 32744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc; 3275e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 3276e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 3277e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the right angle bracket ending the 3278e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the member name, if any. 3279e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getRAngleLoc() const { 3280e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 32814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc; 3282e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 3283e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 3284e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// Determines whether the member name was preceded by the template keyword. 3285e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } 3286e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 32873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Determines whether this member expression actually had a C++ 32883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// template argument list explicitly specified, e.g., x.f<int>. 3289e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } 32901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3291d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// \brief Copies the template arguments (if present) into the given 3292d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// structure. 3293d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 32944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (hasExplicitTemplateArgs()) 32954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto( 32964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getTrailingObjects<TemplateArgumentLoc>(), List); 32978dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis } 32988dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 32993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Retrieve the template arguments provided as part of this 33003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// template-id. 3301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *getTemplateArgs() const { 33024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!hasExplicitTemplateArgs()) 33034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 33044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 33054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<TemplateArgumentLoc>(); 33063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 33071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33083b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Retrieve the number of template arguments provided as part of this 33093b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// template-id. 33101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned getNumTemplateArgs() const { 33114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!hasExplicitTemplateArgs()) 33124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return 0; 33134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 33144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs; 33154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 33164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 33174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TemplateArgumentLoc> template_arguments() const { 33184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return {getTemplateArgs(), getNumTemplateArgs()}; 33193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 33201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 332165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 3322aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!isImplicitAccess()) 332365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return Base->getLocStart(); 332465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen if (getQualifier()) 332565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getQualifierLoc().getBeginLoc(); 332665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return MemberNameInfo.getBeginLoc(); 332765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen } 33284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 332965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 3330aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (hasExplicitTemplateArgs()) 333165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getRAngleLoc(); 333265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return MemberNameInfo.getEndLoc(); 33331c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor } 33341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 3336865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return T->getStmtClass() == CXXDependentScopeMemberExprClass; 33371c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor } 33381c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 33391c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor // Iterators 334063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 334187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isImplicitAccess()) 334287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 334363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Base, &Base + 1); 334463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 33454045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 33464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 33474045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtReader; 33484045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtWriter; 33491c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}; 33501c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 3351129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall/// \brief Represents a C++ member access expression for which lookup 3352aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// produced a set of overloaded functions. 3353aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// 3354aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// The member access may be explicit or implicit: 3355010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 3356aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// struct A { 3357aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// int a, b; 3358aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// int explicitAccess() { return this->a + this->A::b; } 3359aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// int implicitAccess() { return a + A::b; } 3360aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// }; 3361010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 3362aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// 3363aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// In the final AST, an explicit access always becomes a MemberExpr. 3364aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// An implicit access may become either a MemberExpr or a 3365aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// DeclRefExpr, depending on whether the member is static. 33664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass UnresolvedMemberExpr final 33674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public OverloadExpr, 33684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects< 33694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar UnresolvedMemberExpr, ASTTemplateKWAndArgsInfo, TemplateArgumentLoc> { 3370129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Whether this member expression used the '->' operator or 3371129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// the '.' operator. 3372129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool IsArrow : 1; 3373129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3374129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Whether the lookup results contain an unresolved using 3375129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// declaration. 3376129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool HasUnresolvedUsing : 1; 3377129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 33787bb12da2b0749eeebb21854c77877736969e59f2John McCall /// \brief The expression for the base pointer or class reference, 3379010bfc253050626435f006386c0bee4b55329687James Dennett /// e.g., the \c x in x.f. 3380010bfc253050626435f006386c0bee4b55329687James Dennett /// 3381010bfc253050626435f006386c0bee4b55329687James Dennett /// This can be null if this is an 'unbased' member expression. 33827bb12da2b0749eeebb21854c77877736969e59f2John McCall Stmt *Base; 33837bb12da2b0749eeebb21854c77877736969e59f2John McCall 3384010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief The type of the base expression; never null. 33857bb12da2b0749eeebb21854c77877736969e59f2John McCall QualType BaseType; 3386129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3387129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief The location of the '->' or '.' operator. 3388129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc; 3389129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 33904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const { 33914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return HasTemplateKWAndArgsInfo ? 1 : 0; 33924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 33934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 339432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper UnresolvedMemberExpr(const ASTContext &C, bool HasUnresolvedUsing, 3395aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *Base, QualType BaseType, bool IsArrow, 3396129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 33974c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 3398e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 33992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &MemberNameInfo, 34005a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor const TemplateArgumentListInfo *TemplateArgs, 34015a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor UnresolvedSetIterator Begin, UnresolvedSetIterator End); 3402ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3403a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis UnresolvedMemberExpr(EmptyShell Empty) 3404a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis : OverloadExpr(UnresolvedMemberExprClass, Empty), IsArrow(false), 34056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines HasUnresolvedUsing(false), Base(nullptr) { } 3406129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 34074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 34084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend class OverloadExpr; 34094c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor friend class ASTStmtReader; 3410ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3411129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallpublic: 3412129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall static UnresolvedMemberExpr * 341332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper Create(const ASTContext &C, bool HasUnresolvedUsing, 3414aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *Base, QualType BaseType, bool IsArrow, 3415129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 34164c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 3417e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 34182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &MemberNameInfo, 34195a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor const TemplateArgumentListInfo *TemplateArgs, 34205a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor UnresolvedSetIterator Begin, UnresolvedSetIterator End); 3421129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3422a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis static UnresolvedMemberExpr * 342332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CreateEmpty(const ASTContext &C, bool HasTemplateKWAndArgsInfo, 3424def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor unsigned NumTemplateArgs); 3425a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis 3426010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief True if this is an implicit access, i.e., one in which the 3427010bfc253050626435f006386c0bee4b55329687James Dennett /// member being accessed was not written in the source. 3428010bfc253050626435f006386c0bee4b55329687James Dennett /// 3429010bfc253050626435f006386c0bee4b55329687James Dennett /// The source location of the operator is invalid in this case. 34304c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor bool isImplicitAccess() const; 3431aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 3432129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Retrieve the base object of this member expressions, 3433129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// e.g., the \c x in \c x.m. 3434aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *getBase() { 3435aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall assert(!isImplicitAccess()); 3436aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return cast<Expr>(Base); 3437aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 34382f27bf854f0519810b34afd209089cc75536b757John McCall const Expr *getBase() const { 34392f27bf854f0519810b34afd209089cc75536b757John McCall assert(!isImplicitAccess()); 34402f27bf854f0519810b34afd209089cc75536b757John McCall return cast<Expr>(Base); 34412f27bf854f0519810b34afd209089cc75536b757John McCall } 3442129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3443aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType getBaseType() const { return BaseType; } 3444a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis 3445a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis /// \brief Determine whether the lookup results contain an unresolved using 3446a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis /// declaration. 3447a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis bool hasUnresolvedUsing() const { return HasUnresolvedUsing; } 3448aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 3449129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Determine whether this member expression used the '->' 3450129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// operator; otherwise, it used the '.' operator. 3451129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool isArrow() const { return IsArrow; } 3452129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3453129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Retrieve the location of the '->' or '.' operator. 3454129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation getOperatorLoc() const { return OperatorLoc; } 3455129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3456010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieve the naming class of this lookup. 3457c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall CXXRecordDecl *getNamingClass() const; 3458c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall 34592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// \brief Retrieve the full name info for the member that this expression 34602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// refers to. 34612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &getMemberNameInfo() const { return getNameInfo(); } 34622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 3463129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Retrieve the name of the member that this expression 3464129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// refers to. 34657bb12da2b0749eeebb21854c77877736969e59f2John McCall DeclarationName getMemberName() const { return getName(); } 3466129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3467129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // \brief Retrieve the location of the name of the member that this 3468129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // expression refers to. 34697bb12da2b0749eeebb21854c77877736969e59f2John McCall SourceLocation getMemberLoc() const { return getNameLoc(); } 3470129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 347116b0a310f5649d25849d84409841f401e7a9a0e5David Blaikie // \brief Return the preferred location (the member name) for the arrow when 347216b0a310f5649d25849d84409841f401e7a9a0e5David Blaikie // diagnosing a problem with this expression. 347316b0a310f5649d25849d84409841f401e7a9a0e5David Blaikie SourceLocation getExprLoc() const LLVM_READONLY { return getMemberLoc(); } 347416b0a310f5649d25849d84409841f401e7a9a0e5David Blaikie 347565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 3476aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!isImplicitAccess()) 347765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return Base->getLocStart(); 347865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen if (NestedNameSpecifierLoc l = getQualifierLoc()) 347965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return l.getBeginLoc(); 348065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getMemberNameInfo().getLocStart(); 348165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen } 348265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 3483129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (hasExplicitTemplateArgs()) 348465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getRAngleLoc(); 348565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getMemberNameInfo().getLocEnd(); 3486129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 3487129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3488129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall static bool classof(const Stmt *T) { 3489129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return T->getStmtClass() == UnresolvedMemberExprClass; 3490129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 3491129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3492129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Iterators 349363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 349487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isImplicitAccess()) 349587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 349663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Base, &Base + 1); 349763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 3498129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}; 3499129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 35004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarinline ASTTemplateKWAndArgsInfo * 35014967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarOverloadExpr::getTrailingASTTemplateKWAndArgsInfo() { 350287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!HasTemplateKWAndArgsInfo) 350387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return nullptr; 35044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 35054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (isa<UnresolvedLookupExpr>(this)) 35064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return cast<UnresolvedLookupExpr>(this) 35074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ->getTrailingObjects<ASTTemplateKWAndArgsInfo>(); 35084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 35094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return cast<UnresolvedMemberExpr>(this) 35104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ->getTrailingObjects<ASTTemplateKWAndArgsInfo>(); 35114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 35124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 35134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarinline TemplateArgumentLoc *OverloadExpr::getTrailingTemplateArgumentLoc() { 351487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (isa<UnresolvedLookupExpr>(this)) 35154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return cast<UnresolvedLookupExpr>(this) 35164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ->getTrailingObjects<TemplateArgumentLoc>(); 351787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar else 35184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return cast<UnresolvedMemberExpr>(this) 35194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ->getTrailingObjects<TemplateArgumentLoc>(); 352087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 352187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 3522010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]). 35232e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl/// 35242e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl/// The noexcept expression tests whether a given expression might throw. Its 35252e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl/// result is a boolean constant. 35262e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redlclass CXXNoexceptExpr : public Expr { 35272e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl bool Value : 1; 35282e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl Stmt *Operand; 35292e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl SourceRange Range; 35302e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 3531c8aecc2dfb2e393d9eeaedeca22ff8cd7149af81Sebastian Redl friend class ASTStmtReader; 3532c8aecc2dfb2e393d9eeaedeca22ff8cd7149af81Sebastian Redl 35332e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redlpublic: 35342e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val, 35352e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl SourceLocation Keyword, SourceLocation RParen) 3536f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CXXNoexceptExprClass, Ty, VK_RValue, OK_Ordinary, 3537f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /*TypeDependent*/false, 3538bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /*ValueDependent*/Val == CT_Dependent, 3539561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Val == CT_Dependent || Operand->isInstantiationDependent(), 3540bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->containsUnexpandedParameterPack()), 35416b219d082434394c1ac401390ec1d1967727815aSebastian Redl Value(Val == CT_Cannot), Operand(Operand), Range(Keyword, RParen) 35426b219d082434394c1ac401390ec1d1967727815aSebastian Redl { } 35436b219d082434394c1ac401390ec1d1967727815aSebastian Redl 35446b219d082434394c1ac401390ec1d1967727815aSebastian Redl CXXNoexceptExpr(EmptyShell Empty) 35456b219d082434394c1ac401390ec1d1967727815aSebastian Redl : Expr(CXXNoexceptExprClass, Empty) 35462e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl { } 35472e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 35482e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl Expr *getOperand() const { return static_cast<Expr*>(Operand); } 35492e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 355065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } 355165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 3552aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar SourceRange getSourceRange() const LLVM_READONLY { return Range; } 35532e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 35542e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl bool getValue() const { return Value; } 35552e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 35562e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl static bool classof(const Stmt *T) { 35572e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl return T->getStmtClass() == CXXNoexceptExprClass; 35582e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl } 35592e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 35602e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl // Iterators 356163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Operand, &Operand + 1); } 35622e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl}; 35632e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 3564010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a C++11 pack expansion that produces a sequence of 3565be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// expressions. 3566be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// 3567be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// A pack expansion expression contains a pattern (which itself is an 3568be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// expression) followed by an ellipsis. For example: 3569be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// 3570be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// \code 3571be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// template<typename F, typename ...Types> 3572be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// void forward(F f, Types &&...args) { 3573be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// f(static_cast<Types&&>(args)...); 3574be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// } 3575be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// \endcode 3576be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// 3577be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// Here, the argument to the function object \c f is a pack expansion whose 3578ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// pattern is \c static_cast<Types&&>(args). When the \c forward function 3579be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// template is instantiated, the pack expansion will instantiate to zero or 3580be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// or more function arguments to the function object \c f. 3581be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregorclass PackExpansionExpr : public Expr { 3582be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor SourceLocation EllipsisLoc; 3583ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 358467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// \brief The number of expansions that will be produced by this pack 358567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// expansion expression, if known. 358667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// 358767fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// When zero, the number of expansions is not known. Otherwise, this value 358867fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// is the number of expansions + 1. 358967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor unsigned NumExpansions; 3590ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3591be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor Stmt *Pattern; 3592ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3593be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor friend class ASTStmtReader; 359467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor friend class ASTStmtWriter; 3595ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3596be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregorpublic: 359767fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor PackExpansionExpr(QualType T, Expr *Pattern, SourceLocation EllipsisLoc, 3598dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie Optional<unsigned> NumExpansions) 3599ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie : Expr(PackExpansionExprClass, T, Pattern->getValueKind(), 3600ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie Pattern->getObjectKind(), /*TypeDependent=*/true, 3601561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor /*ValueDependent=*/true, /*InstantiationDependent=*/true, 3602561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor /*ContainsUnexpandedParameterPack=*/false), 3603be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor EllipsisLoc(EllipsisLoc), 360467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor NumExpansions(NumExpansions? *NumExpansions + 1 : 0), 3605be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor Pattern(Pattern) { } 3606be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 3607be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor PackExpansionExpr(EmptyShell Empty) : Expr(PackExpansionExprClass, Empty) { } 3608ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3609be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor /// \brief Retrieve the pattern of the pack expansion. 3610be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor Expr *getPattern() { return reinterpret_cast<Expr *>(Pattern); } 3611be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 3612be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor /// \brief Retrieve the pattern of the pack expansion. 3613be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor const Expr *getPattern() const { return reinterpret_cast<Expr *>(Pattern); } 3614be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 3615be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor /// \brief Retrieve the location of the ellipsis that describes this pack 3616be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor /// expansion. 3617be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor SourceLocation getEllipsisLoc() const { return EllipsisLoc; } 3618ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3619ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Determine the number of expansions that will be produced when 362067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// this pack expansion is instantiated, if already known. 3621dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie Optional<unsigned> getNumExpansions() const { 362267fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor if (NumExpansions) 362367fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor return NumExpansions - 1; 3624ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 362566874fb18afbffb8b2ca05576851a64534be3352David Blaikie return None; 362667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor } 3627ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 362865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 362965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return Pattern->getLocStart(); 363063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 363165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return EllipsisLoc; } 3632be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 3633be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor static bool classof(const Stmt *T) { 3634be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor return T->getStmtClass() == PackExpansionExprClass; 3635be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor } 3636ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3637be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor // Iterators 363863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 363963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Pattern, &Pattern + 1); 364063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 3641be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor}; 3642ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 36437bb12da2b0749eeebb21854c77877736969e59f2John McCall 3644ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// \brief Represents an expression that computes the length of a parameter 3645ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// pack. 3646ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// 3647ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \code 3648ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// template<typename ...Types> 3649ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// struct count { 3650ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// static const unsigned value = sizeof...(Types); 3651ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// }; 3652ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \endcode 36534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass SizeOfPackExpr final 36544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public Expr, 36554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<SizeOfPackExpr, TemplateArgument> { 3656010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief The location of the \c sizeof keyword. 3657ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation OperatorLoc; 3658ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3659ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief The location of the name of the parameter pack. 3660ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation PackLoc; 3661ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3662ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief The location of the closing parenthesis. 3663ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation RParenLoc; 3664ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3665ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief The length of the parameter pack, if known. 3666ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// 366787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// When this expression is not value-dependent, this is the length of 366887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// the pack. When the expression was parsed rather than instantiated 366987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// (and thus is value-dependent), this is zero. 367087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// 367187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// After partial substitution into a sizeof...(X) expression (for instance, 367287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// within an alias template or during function template argument deduction), 367387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// we store a trailing array of partially-substituted TemplateArguments, 367487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// and this is the length of that array. 3675ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor unsigned Length; 3676ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 367787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief The parameter pack. 3678ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor NamedDecl *Pack; 3679ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 36804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 3681ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor friend class ASTStmtReader; 3682ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor friend class ASTStmtWriter; 3683ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3684010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Create an expression that computes the length of 368587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// the given parameter pack. 3686ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack, 3687ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation PackLoc, SourceLocation RParenLoc, 368887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Optional<unsigned> Length, ArrayRef<TemplateArgument> PartialArgs) 368987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary, 369087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*TypeDependent=*/false, /*ValueDependent=*/!Length, 369187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*InstantiationDependent=*/!Length, 369287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*ContainsUnexpandedParameterPack=*/false), 369387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc), 369487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Length(Length ? *Length : PartialArgs.size()), Pack(Pack) { 369587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert((!Length || PartialArgs.empty()) && 369687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar "have partial args for non-dependent sizeof... expression"); 36974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgument *Args = getTrailingObjects<TemplateArgument>(); 369887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::uninitialized_copy(PartialArgs.begin(), PartialArgs.end(), Args); 369987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 3700ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 3701ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Create an empty expression. 370287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SizeOfPackExpr(EmptyShell Empty, unsigned NumPartialArgs) 370387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : Expr(SizeOfPackExprClass, Empty), Length(NumPartialArgs), Pack() {} 370487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 370587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic: 370687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar static SizeOfPackExpr *Create(ASTContext &Context, SourceLocation OperatorLoc, 370787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NamedDecl *Pack, SourceLocation PackLoc, 370887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation RParenLoc, 370987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Optional<unsigned> Length = None, 371087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ArrayRef<TemplateArgument> PartialArgs = None); 371187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar static SizeOfPackExpr *CreateDeserialized(ASTContext &Context, 371287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned NumPartialArgs); 3713ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3714ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Determine the location of the 'sizeof' keyword. 3715ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation getOperatorLoc() const { return OperatorLoc; } 3716ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 3717ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Determine the location of the parameter pack. 3718ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation getPackLoc() const { return PackLoc; } 3719ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3720ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Determine the location of the right parenthesis. 3721ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 3722ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3723ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Retrieve the parameter pack. 3724ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor NamedDecl *getPack() const { return Pack; } 3725ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3726ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Retrieve the length of the parameter pack. 3727ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// 3728ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// This routine may only be invoked when the expression is not 3729c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// value-dependent. 3730ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor unsigned getPackLength() const { 3731ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie assert(!isValueDependent() && 3732ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor "Cannot get the length of a value-dependent pack size expression"); 3733ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return Length; 3734ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor } 3735ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 373687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Determine whether this represents a partially-substituted sizeof... 373787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// expression, such as is produced for: 373887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// 373987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// template<typename ...Ts> using X = int[sizeof...(Ts)]; 374087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// template<typename ...Us> void f(X<Us..., 1, 2, 3, Us...>); 374187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool isPartiallySubstituted() const { 374287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return isValueDependent() && Length; 374387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 374487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 374587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /// \brief Get 374687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ArrayRef<TemplateArgument> getPartialArguments() const { 374787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(isPartiallySubstituted()); 37484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const TemplateArgument *Args = getTrailingObjects<TemplateArgument>(); 374987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return llvm::makeArrayRef(Args, Args + Length); 375087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 375187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 375265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return OperatorLoc; } 375365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 3754ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3755ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor static bool classof(const Stmt *T) { 3756ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return T->getStmtClass() == SizeOfPackExprClass; 3757ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor } 3758ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3759ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // Iterators 376087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 376187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 376287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 3763ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}; 3764c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 376591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall/// \brief Represents a reference to a non-type template parameter 376691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall/// that has been substituted with a template argument. 376791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCallclass SubstNonTypeTemplateParmExpr : public Expr { 376891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall /// \brief The replaced parameter. 376991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall NonTypeTemplateParmDecl *Param; 377091a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 377191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall /// \brief The replacement expression. 377291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall Stmt *Replacement; 377391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 377491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall /// \brief The location of the non-type template parameter reference. 377591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall SourceLocation NameLoc; 377691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 37777110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall friend class ASTReader; 37787110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall friend class ASTStmtReader; 3779ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie explicit SubstNonTypeTemplateParmExpr(EmptyShell Empty) 37807110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall : Expr(SubstNonTypeTemplateParmExprClass, Empty) { } 37817110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall 378291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCallpublic: 3783ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie SubstNonTypeTemplateParmExpr(QualType type, 378491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall ExprValueKind valueKind, 378591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall SourceLocation loc, 378691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall NonTypeTemplateParmDecl *param, 378791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall Expr *replacement) 378891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall : Expr(SubstNonTypeTemplateParmExprClass, type, valueKind, OK_Ordinary, 378991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall replacement->isTypeDependent(), replacement->isValueDependent(), 379091a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall replacement->isInstantiationDependent(), 379191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall replacement->containsUnexpandedParameterPack()), 379291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall Param(param), Replacement(replacement), NameLoc(loc) {} 379391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 379491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall SourceLocation getNameLoc() const { return NameLoc; } 379565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; } 379665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; } 379791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 379891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall Expr *getReplacement() const { return cast<Expr>(Replacement); } 3799ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 380091a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall NonTypeTemplateParmDecl *getParameter() const { return Param; } 380191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 380291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall static bool classof(const Stmt *s) { 380391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall return s->getStmtClass() == SubstNonTypeTemplateParmExprClass; 380491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall } 3805ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 380691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall // Iterators 380791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall child_range children() { return child_range(&Replacement, &Replacement+1); } 380891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall}; 380991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 3810c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// \brief Represents a reference to a non-type template parameter pack that 3811c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// has been substituted with a non-template argument pack. 3812c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// 3813c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// When a pack expansion in the source code contains multiple parameter packs 3814c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// and those parameter packs correspond to different levels of template 3815fb7669ee725ec699e2b49b8359c4652536949739Douglas Gregor/// parameter lists, this node is used to represent a non-type template 3816c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// parameter pack from an outer level, which has already had its argument pack 3817c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// substituted but that still lives within a pack expansion that itself 3818c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// could not be instantiated. When actually performing a substitution into 3819c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// that pack expansion (e.g., when all template parameters have corresponding 3820c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// arguments), this type will be replaced with the appropriate underlying 3821c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// expression at the current pack substitution index. 3822c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorclass SubstNonTypeTemplateParmPackExpr : public Expr { 3823c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief The non-type template parameter pack itself. 3824c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor NonTypeTemplateParmDecl *Param; 3825ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3826c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief A pointer to the set of template arguments that this 3827c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// parameter pack is instantiated with. 3828c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor const TemplateArgument *Arguments; 3829ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3830c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief The number of template arguments in \c Arguments. 3831c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor unsigned NumArguments; 3832ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3833c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief The location of the non-type template parameter pack reference. 3834c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SourceLocation NameLoc; 3835ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 38367110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall friend class ASTReader; 3837c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor friend class ASTStmtReader; 3838ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie explicit SubstNonTypeTemplateParmPackExpr(EmptyShell Empty) 38397110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall : Expr(SubstNonTypeTemplateParmPackExprClass, Empty) { } 3840ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3841c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorpublic: 3842ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie SubstNonTypeTemplateParmPackExpr(QualType T, 3843c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor NonTypeTemplateParmDecl *Param, 3844c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SourceLocation NameLoc, 3845c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor const TemplateArgument &ArgPack); 3846ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3847c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief Retrieve the non-type template parameter pack being substituted. 3848c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor NonTypeTemplateParmDecl *getParameterPack() const { return Param; } 3849c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 3850c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief Retrieve the location of the parameter pack name. 3851c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SourceLocation getParameterPackLocation() const { return NameLoc; } 3852ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3853c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief Retrieve the template argument pack containing the substituted 3854c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// template arguments. 3855c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor TemplateArgument getArgumentPack() const; 3856c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 385765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; } 385865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; } 3859ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3860c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor static bool classof(const Stmt *T) { 3861c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor return T->getStmtClass() == SubstNonTypeTemplateParmPackExprClass; 3862c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor } 3863ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3864c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor // Iterators 386587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 386687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 386787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 3868c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor}; 386903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor 38709a4db032ecd991626d236a502e770126db32bd31Richard Smith/// \brief Represents a reference to a function parameter pack that has been 38719a4db032ecd991626d236a502e770126db32bd31Richard Smith/// substituted but not yet expanded. 38729a4db032ecd991626d236a502e770126db32bd31Richard Smith/// 38739a4db032ecd991626d236a502e770126db32bd31Richard Smith/// When a pack expansion contains multiple parameter packs at different levels, 38749a4db032ecd991626d236a502e770126db32bd31Richard Smith/// this node is used to represent a function parameter pack at an outer level 38759a4db032ecd991626d236a502e770126db32bd31Richard Smith/// which we have already substituted to refer to expanded parameters, but where 38769a4db032ecd991626d236a502e770126db32bd31Richard Smith/// the containing pack expansion cannot yet be expanded. 38779a4db032ecd991626d236a502e770126db32bd31Richard Smith/// 38789a4db032ecd991626d236a502e770126db32bd31Richard Smith/// \code 38799a4db032ecd991626d236a502e770126db32bd31Richard Smith/// template<typename...Ts> struct S { 38809a4db032ecd991626d236a502e770126db32bd31Richard Smith/// template<typename...Us> auto f(Ts ...ts) -> decltype(g(Us(ts)...)); 38819a4db032ecd991626d236a502e770126db32bd31Richard Smith/// }; 38829a4db032ecd991626d236a502e770126db32bd31Richard Smith/// template struct S<int, int>; 38839a4db032ecd991626d236a502e770126db32bd31Richard Smith/// \endcode 38844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass FunctionParmPackExpr final 38854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : public Expr, 38864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private llvm::TrailingObjects<FunctionParmPackExpr, ParmVarDecl *> { 38879a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief The function parameter pack which was referenced. 38889a4db032ecd991626d236a502e770126db32bd31Richard Smith ParmVarDecl *ParamPack; 38899a4db032ecd991626d236a502e770126db32bd31Richard Smith 38909a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief The location of the function parameter pack reference. 38919a4db032ecd991626d236a502e770126db32bd31Richard Smith SourceLocation NameLoc; 38929a4db032ecd991626d236a502e770126db32bd31Richard Smith 38939a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief The number of expansions of this pack. 38949a4db032ecd991626d236a502e770126db32bd31Richard Smith unsigned NumParameters; 38959a4db032ecd991626d236a502e770126db32bd31Richard Smith 38969a4db032ecd991626d236a502e770126db32bd31Richard Smith FunctionParmPackExpr(QualType T, ParmVarDecl *ParamPack, 38979a4db032ecd991626d236a502e770126db32bd31Richard Smith SourceLocation NameLoc, unsigned NumParams, 389887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ParmVarDecl *const *Params); 38999a4db032ecd991626d236a502e770126db32bd31Richard Smith 39004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar friend TrailingObjects; 39019a4db032ecd991626d236a502e770126db32bd31Richard Smith friend class ASTReader; 39029a4db032ecd991626d236a502e770126db32bd31Richard Smith friend class ASTStmtReader; 39039a4db032ecd991626d236a502e770126db32bd31Richard Smith 39049a4db032ecd991626d236a502e770126db32bd31Richard Smithpublic: 390532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static FunctionParmPackExpr *Create(const ASTContext &Context, QualType T, 39069a4db032ecd991626d236a502e770126db32bd31Richard Smith ParmVarDecl *ParamPack, 39079a4db032ecd991626d236a502e770126db32bd31Richard Smith SourceLocation NameLoc, 390887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ArrayRef<ParmVarDecl *> Params); 390932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static FunctionParmPackExpr *CreateEmpty(const ASTContext &Context, 39109a4db032ecd991626d236a502e770126db32bd31Richard Smith unsigned NumParams); 39119a4db032ecd991626d236a502e770126db32bd31Richard Smith 39129a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief Get the parameter pack which this expression refers to. 39139a4db032ecd991626d236a502e770126db32bd31Richard Smith ParmVarDecl *getParameterPack() const { return ParamPack; } 39149a4db032ecd991626d236a502e770126db32bd31Richard Smith 39159a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief Get the location of the parameter pack. 39169a4db032ecd991626d236a502e770126db32bd31Richard Smith SourceLocation getParameterPackLocation() const { return NameLoc; } 39179a4db032ecd991626d236a502e770126db32bd31Richard Smith 39189a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief Iterators over the parameters which the parameter pack expanded 39199a4db032ecd991626d236a502e770126db32bd31Richard Smith /// into. 39209a4db032ecd991626d236a502e770126db32bd31Richard Smith typedef ParmVarDecl * const *iterator; 39214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar iterator begin() const { return getTrailingObjects<ParmVarDecl *>(); } 39229a4db032ecd991626d236a502e770126db32bd31Richard Smith iterator end() const { return begin() + NumParameters; } 39239a4db032ecd991626d236a502e770126db32bd31Richard Smith 39249a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief Get the number of parameters in this parameter pack. 39259a4db032ecd991626d236a502e770126db32bd31Richard Smith unsigned getNumExpansions() const { return NumParameters; } 39269a4db032ecd991626d236a502e770126db32bd31Richard Smith 39279a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief Get an expansion of the parameter pack by index. 39289a4db032ecd991626d236a502e770126db32bd31Richard Smith ParmVarDecl *getExpansion(unsigned I) const { return begin()[I]; } 39299a4db032ecd991626d236a502e770126db32bd31Richard Smith 393065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; } 393165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; } 39329a4db032ecd991626d236a502e770126db32bd31Richard Smith 39339a4db032ecd991626d236a502e770126db32bd31Richard Smith static bool classof(const Stmt *T) { 39349a4db032ecd991626d236a502e770126db32bd31Richard Smith return T->getStmtClass() == FunctionParmPackExprClass; 39359a4db032ecd991626d236a502e770126db32bd31Richard Smith } 39369a4db032ecd991626d236a502e770126db32bd31Richard Smith 393787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 393887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(child_iterator(), child_iterator()); 393987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 39409a4db032ecd991626d236a502e770126db32bd31Richard Smith}; 39419a4db032ecd991626d236a502e770126db32bd31Richard Smith 3942010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a prvalue temporary that is written into memory so that 394303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// a reference can bind to it. 394403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// 394503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// Prvalue expressions are materialized when they need to have an address 394603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// in memory for a reference to bind to. This happens when binding a 394703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// reference to the result of a conversion, e.g., 394803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// 394903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// \code 395003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// const int &r = 1.0; 395103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// \endcode 395203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// 395303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// Here, 1.0 is implicitly converted to an \c int. That resulting \c int is 395403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// then materialized via a \c MaterializeTemporaryExpr, and the reference 395503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// binds to the temporary. \c MaterializeTemporaryExprs are always glvalues 395603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// (either an lvalue or an xvalue, depending on the kind of reference binding 395703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// to it), maintaining the invariant that references always bind to glvalues. 3958211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// 3959211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// Reference binding and copy-elision can both extend the lifetime of a 3960211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// temporary. When either happens, the expression will also track the 3961211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// declaration which is responsible for the lifetime extension. 396203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorclass MaterializeTemporaryExpr : public Expr { 39636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesprivate: 39646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct ExtraState { 39656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief The temporary-generating expression whose value will be 39666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// materialized. 39676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Stmt *Temporary; 39686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 39696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief The declaration which lifetime-extended this reference, if any. 39706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// Either a VarDecl, or (for a ctor-initializer) a FieldDecl. 39716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const ValueDecl *ExtendingDecl; 3972ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 39736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned ManglingNumber; 39746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 39756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::PointerUnion<Stmt *, ExtraState *> State; 3976211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 397703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor friend class ASTStmtReader; 397803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor friend class ASTStmtWriter; 3979ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 39806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void initializeExtraState(const ValueDecl *ExtendedBy, 39816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned ManglingNumber); 39826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 398303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorpublic: 3984ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie MaterializeTemporaryExpr(QualType T, Expr *Temporary, 39856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool BoundToLvalueReference) 3986b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor : Expr(MaterializeTemporaryExprClass, T, 398703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor BoundToLvalueReference? VK_LValue : VK_XValue, OK_Ordinary, 398803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor Temporary->isTypeDependent(), Temporary->isValueDependent(), 3989561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Temporary->isInstantiationDependent(), 399003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor Temporary->containsUnexpandedParameterPack()), 39916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines State(Temporary) {} 3992ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3993ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie MaterializeTemporaryExpr(EmptyShell Empty) 399403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor : Expr(MaterializeTemporaryExprClass, Empty) { } 3995ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 39966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Stmt *getTemporary() const { 39976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return State.is<Stmt *>() ? State.get<Stmt *>() 39986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : State.get<ExtraState *>()->Temporary; 39996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 40006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 400103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor /// \brief Retrieve the temporary-generating subexpression whose value will 400203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor /// be materialized into a glvalue. 40036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr *GetTemporaryExpr() const { return static_cast<Expr *>(getTemporary()); } 4004211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 4005211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith /// \brief Retrieve the storage duration for the materialized temporary. 4006211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith StorageDuration getStorageDuration() const { 40076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const ValueDecl *ExtendingDecl = getExtendingDecl(); 4008211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (!ExtendingDecl) 4009211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith return SD_FullExpression; 4010211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // FIXME: This is not necessarily correct for a temporary materialized 4011211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // within a default initializer. 4012211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (isa<FieldDecl>(ExtendingDecl)) 4013211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith return SD_Automatic; 4014211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith return cast<VarDecl>(ExtendingDecl)->getStorageDuration(); 4015211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 4016211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 4017211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith /// \brief Get the declaration which triggered the lifetime-extension of this 4018211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith /// temporary, if any. 40196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const ValueDecl *getExtendingDecl() const { 40206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return State.is<Stmt *>() ? nullptr 40216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : State.get<ExtraState *>()->ExtendingDecl; 40226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 4023211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 40246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setExtendingDecl(const ValueDecl *ExtendedBy, unsigned ManglingNumber); 40256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 40266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned getManglingNumber() const { 40276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return State.is<Stmt *>() ? 0 : State.get<ExtraState *>()->ManglingNumber; 4028211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 4029ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 403003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor /// \brief Determine whether this materialized temporary is bound to an 403103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor /// lvalue reference; otherwise, it's bound to an rvalue reference. 4032ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie bool isBoundToLvalueReference() const { 403303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor return getValueKind() == VK_LValue; 403403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor } 4035ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 403665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 40376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return getTemporary()->getLocStart(); 403865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen } 403965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 40406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return getTemporary()->getLocEnd(); 4041aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar } 4042ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 404303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor static bool classof(const Stmt *T) { 404403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor return T->getStmtClass() == MaterializeTemporaryExprClass; 404503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor } 4046ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 404703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // Iterators 40486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines child_range children() { 40496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (State.is<Stmt *>()) 40506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return child_range(State.getAddrOfPtr1(), State.getAddrOfPtr1() + 1); 40516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 40526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto ES = State.get<ExtraState *>(); 40536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return child_range(&ES->Temporary, &ES->Temporary + 1); 40546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 405503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor}; 4056ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 4057176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief Represents a folding of a pack over an operator. 4058176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// 4059176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// This expression is always dependent and represents a pack expansion of the 4060176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// forms: 4061176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// 4062176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// ( expr op ... ) 4063176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// ( ... op expr ) 4064176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// ( expr op ... op expr ) 4065176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass CXXFoldExpr : public Expr { 4066176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation LParenLoc; 4067176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation EllipsisLoc; 4068176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation RParenLoc; 4069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Stmt *SubExprs[2]; 4070176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BinaryOperatorKind Opcode; 4071176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4072176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines friend class ASTStmtReader; 4073176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines friend class ASTStmtWriter; 4074176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 4075176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CXXFoldExpr(QualType T, SourceLocation LParenLoc, Expr *LHS, 4076176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BinaryOperatorKind Opcode, SourceLocation EllipsisLoc, Expr *RHS, 4077176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation RParenLoc) 4078176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : Expr(CXXFoldExprClass, T, VK_RValue, OK_Ordinary, 4079176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*Dependent*/ true, true, true, 4080176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*ContainsUnexpandedParameterPack*/ false), 4081176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LParenLoc(LParenLoc), EllipsisLoc(EllipsisLoc), RParenLoc(RParenLoc), 4082176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Opcode(Opcode) { 4083176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SubExprs[0] = LHS; 4084176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SubExprs[1] = RHS; 4085176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 4086176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CXXFoldExpr(EmptyShell Empty) : Expr(CXXFoldExprClass, Empty) {} 4087176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4088176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Expr *getLHS() const { return static_cast<Expr*>(SubExprs[0]); } 4089176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Expr *getRHS() const { return static_cast<Expr*>(SubExprs[1]); } 4090176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4091176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /// Does this produce a right-associated sequence of operators? 4092176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool isRightFold() const { 4093176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return getLHS() && getLHS()->containsUnexpandedParameterPack(); 4094176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 4095176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /// Does this produce a left-associated sequence of operators? 4096176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool isLeftFold() const { return !isRightFold(); } 4097176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /// Get the pattern, that is, the operand that contains an unexpanded pack. 4098176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Expr *getPattern() const { return isLeftFold() ? getRHS() : getLHS(); } 4099176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /// Get the operand that doesn't contain a pack, for a binary fold. 4100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Expr *getInit() const { return isLeftFold() ? getLHS() : getRHS(); } 4101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation getEllipsisLoc() const { return EllipsisLoc; } 4103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BinaryOperatorKind getOperator() const { return Opcode; } 4104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation getLocStart() const LLVM_READONLY { 4106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return LParenLoc; 4107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 4108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation getLocEnd() const LLVM_READONLY { 4109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return RParenLoc; 4110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 4111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines static bool classof(const Stmt *T) { 4113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return T->getStmtClass() == CXXFoldExprClass; 4114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 4115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 4116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Iterators 4117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines child_range children() { return child_range(SubExprs, SubExprs + 2); } 4118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 4119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 412087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief Represents an expression that might suspend coroutine execution; 412187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// either a co_await or co_yield expression. 412287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// 412387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Evaluation of this expression first evaluates its 'ready' expression. If 412487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// that returns 'false': 412587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// -- execution of the coroutine is suspended 412687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// -- the 'suspend' expression is evaluated 412787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// -- if the 'suspend' expression returns 'false', the coroutine is 412887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// resumed 412987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// -- otherwise, control passes back to the resumer. 413087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// If the coroutine is not suspended, or when it is resumed, the 'resume' 413187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// expression is evaluated, and its result is the result of the overall 413287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// expression. 413387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass CoroutineSuspendExpr : public Expr { 413487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation KeywordLoc; 413587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 413687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar enum SubExpr { Common, Ready, Suspend, Resume, Count }; 413787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Stmt *SubExprs[SubExpr::Count]; 413887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 413987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar friend class ASTStmtReader; 414087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic: 414187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CoroutineSuspendExpr(StmtClass SC, SourceLocation KeywordLoc, Expr *Common, 414287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *Ready, Expr *Suspend, Expr *Resume) 414387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : Expr(SC, Resume->getType(), Resume->getValueKind(), 414487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Resume->getObjectKind(), Resume->isTypeDependent(), 414587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Resume->isValueDependent(), Common->isInstantiationDependent(), 414687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Common->containsUnexpandedParameterPack()), 414787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar KeywordLoc(KeywordLoc) { 414887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Common] = Common; 414987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Ready] = Ready; 415087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Suspend] = Suspend; 415187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Resume] = Resume; 415287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 415387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CoroutineSuspendExpr(StmtClass SC, SourceLocation KeywordLoc, QualType Ty, 415487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *Common) 415587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : Expr(SC, Ty, VK_RValue, OK_Ordinary, true, true, true, 415687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Common->containsUnexpandedParameterPack()), 415787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar KeywordLoc(KeywordLoc) { 415887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(Common->isTypeDependent() && Ty->isDependentType() && 415987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar "wrong constructor for non-dependent co_await/co_yield expression"); 416087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Common] = Common; 416187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Ready] = nullptr; 416287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Suspend] = nullptr; 416387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Resume] = nullptr; 416487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 416587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CoroutineSuspendExpr(StmtClass SC, EmptyShell Empty) : Expr(SC, Empty) { 416687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Common] = nullptr; 416787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Ready] = nullptr; 416887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Suspend] = nullptr; 416987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SubExprs[SubExpr::Resume] = nullptr; 417087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 417187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 417287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getKeywordLoc() const { return KeywordLoc; } 417387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getCommonExpr() const { 417487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return static_cast<Expr*>(SubExprs[SubExpr::Common]); 417587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 417687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 417787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getReadyExpr() const { 417887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return static_cast<Expr*>(SubExprs[SubExpr::Ready]); 417987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 418087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getSuspendExpr() const { 418187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return static_cast<Expr*>(SubExprs[SubExpr::Suspend]); 418287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 418387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getResumeExpr() const { 418487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return static_cast<Expr*>(SubExprs[SubExpr::Resume]); 418587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 418687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 418787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getLocStart() const LLVM_READONLY { 418887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return KeywordLoc; 418987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 419087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation getLocEnd() const LLVM_READONLY { 419187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getCommonExpr()->getLocEnd(); 419287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 419387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 419487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar child_range children() { 419587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return child_range(SubExprs, SubExprs + SubExpr::Count); 419687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 419787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 419887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar static bool classof(const Stmt *T) { 419987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return T->getStmtClass() == CoawaitExprClass || 420087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar T->getStmtClass() == CoyieldExprClass; 420187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 420287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}; 420387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 420487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief Represents a 'co_await' expression. 420587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass CoawaitExpr : public CoroutineSuspendExpr { 420687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar friend class ASTStmtReader; 420787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic: 420887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand, Expr *Ready, 420987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *Suspend, Expr *Resume) 421087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : CoroutineSuspendExpr(CoawaitExprClass, CoawaitLoc, Operand, Ready, 421187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Suspend, Resume) {} 421287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CoawaitExpr(SourceLocation CoawaitLoc, QualType Ty, Expr *Operand) 421387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : CoroutineSuspendExpr(CoawaitExprClass, CoawaitLoc, Ty, Operand) {} 421487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CoawaitExpr(EmptyShell Empty) 421587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : CoroutineSuspendExpr(CoawaitExprClass, Empty) {} 421687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 421787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getOperand() const { 421887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // FIXME: Dig out the actual operand or store it. 421987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getCommonExpr(); 422087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 422187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 422287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar static bool classof(const Stmt *T) { 422387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return T->getStmtClass() == CoawaitExprClass; 422487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 422587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}; 422687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 422787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief Represents a 'co_yield' expression. 422887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass CoyieldExpr : public CoroutineSuspendExpr { 422987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar friend class ASTStmtReader; 423087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic: 423187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CoyieldExpr(SourceLocation CoyieldLoc, Expr *Operand, Expr *Ready, 423287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *Suspend, Expr *Resume) 423387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : CoroutineSuspendExpr(CoyieldExprClass, CoyieldLoc, Operand, Ready, 423487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Suspend, Resume) {} 423587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CoyieldExpr(SourceLocation CoyieldLoc, QualType Ty, Expr *Operand) 423687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : CoroutineSuspendExpr(CoyieldExprClass, CoyieldLoc, Ty, Operand) {} 423787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CoyieldExpr(EmptyShell Empty) 423887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : CoroutineSuspendExpr(CoyieldExprClass, Empty) {} 423987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 424087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Expr *getOperand() const { 424187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // FIXME: Dig out the actual operand or store it. 424287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return getCommonExpr(); 424387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 424487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 424587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar static bool classof(const Stmt *T) { 424687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return T->getStmtClass() == CoyieldExprClass; 424787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 424887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}; 424987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 42505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 42515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 42525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 4253