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" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Expr.h" 20d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall#include "clang/AST/TemplateBase.h" 2130a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/AST/UnresolvedSet.h" 2201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor#include "clang/Basic/ExpressionTraits.h" 236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/AST/LambdaCapture.h" 2401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor#include "clang/Basic/TypeTraits.h" 25aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar#include "llvm/Support/Compiler.h" 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 29aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorclass CXXConstructorDecl; 30aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorclass CXXDestructorDecl; 31aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorclass CXXMethodDecl; 32aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorclass CXXTemporary; 3376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallclass MSPropertyDecl; 34aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorclass TemplateArgumentListInfo; 352fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramerclass UuidAttr; 364c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 371060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek//===--------------------------------------------------------------------===// 381060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek// C++ Expressions. 391060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek//===--------------------------------------------------------------------===// 401060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 413fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// \brief A call to an overloaded operator written using operator 423fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// syntax. 433fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// 443fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// Represents a call to an overloaded operator written using operator 453fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// syntax, e.g., "x + y" or "*p". While semantically equivalent to a 463fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// normal call, this AST node provides better information about the 473fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// syntactic representation of the call. 483fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// 493fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// In a C++ template, this expression node kind will be used whenever 503fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// any of the arguments are type-dependent. In this case, the 513fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// function itself will be a (possibly empty) set of functions and 523fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// function templates that were found by name lookup at template 533fd95ce225393fe4a3623e429766a8c3f487ff9dDouglas Gregor/// definition time. 54b4609806e9232593ece09ce08b630836e825865cDouglas Gregorclass CXXOperatorCallExpr : public CallExpr { 55063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor /// \brief The overloaded operator. 56063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OverloadedOperatorKind Operator; 574548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis SourceRange Range; 58063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor 59be9af1288881110e406b87914162eaa59f1e5918Lang Hames // Record the FP_CONTRACT state that applies to this operator call. Only 60be9af1288881110e406b87914162eaa59f1e5918Lang Hames // meaningful for floating point types. For other types this value can be 61be9af1288881110e406b87914162eaa59f1e5918Lang Hames // set to false. 62be9af1288881110e406b87914162eaa59f1e5918Lang Hames unsigned FPContractable : 1; 63be9af1288881110e406b87914162eaa59f1e5918Lang Hames 644548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis SourceRange getSourceRangeImpl() const LLVM_READONLY; 65b4609806e9232593ece09ce08b630836e825865cDouglas Gregorpublic: 661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn, 673b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> args, QualType t, ExprValueKind VK, 68be9af1288881110e406b87914162eaa59f1e5918Lang Hames SourceLocation operatorloc, bool fpContractable) 693b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer : CallExpr(C, CXXOperatorCallExprClass, fn, 0, args, t, VK, 70f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall operatorloc), 71be9af1288881110e406b87914162eaa59f1e5918Lang Hames Operator(Op), FPContractable(fpContractable) { 724548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis Range = getSourceRangeImpl(); 734548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis } 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump explicit CXXOperatorCallExpr(ASTContext& C, EmptyShell Empty) : 75ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis CallExpr(C, CXXOperatorCallExprClass, Empty) { } 761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 78010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the kind of overloaded operator that this 79b4609806e9232593ece09ce08b630836e825865cDouglas Gregor /// expression refers to. 80063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor OverloadedOperatorKind getOperator() const { return Operator; } 81b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 82010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the location of the operator symbol in the expression. 83010bfc253050626435f006386c0bee4b55329687James Dennett /// 84010bfc253050626435f006386c0bee4b55329687James Dennett /// When \c getOperator()==OO_Call, this is the location of the right 85010bfc253050626435f006386c0bee4b55329687James Dennett /// parentheses; when \c getOperator()==OO_Subscript, this is the location 86010bfc253050626435f006386c0bee4b55329687James Dennett /// of the right bracket. 87b4609806e9232593ece09ce08b630836e825865cDouglas Gregor SourceLocation getOperatorLoc() const { return getRParenLoc(); } 88b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 8965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } 9065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 914548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis SourceRange getSourceRange() const { return Range; } 921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == CXXOperatorCallExprClass; 95b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 964548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis 97be9af1288881110e406b87914162eaa59f1e5918Lang Hames // Set the FP contractability status of this operator. Only meaningful for 98be9af1288881110e406b87914162eaa59f1e5918Lang Hames // operations on floating point types. 99be9af1288881110e406b87914162eaa59f1e5918Lang Hames void setFPContractable(bool FPC) { FPContractable = FPC; } 100be9af1288881110e406b87914162eaa59f1e5918Lang Hames 101be9af1288881110e406b87914162eaa59f1e5918Lang Hames // Get the FP contractability status of this operator. Only meaningful for 102be9af1288881110e406b87914162eaa59f1e5918Lang Hames // operations on floating point types. 103be9af1288881110e406b87914162eaa59f1e5918Lang Hames bool isFPContractable() const { return FPContractable; } 104be9af1288881110e406b87914162eaa59f1e5918Lang Hames 1054548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis friend class ASTStmtReader; 1064548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis friend class ASTStmtWriter; 107b4609806e9232593ece09ce08b630836e825865cDouglas Gregor}; 108b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 109010bfc253050626435f006386c0bee4b55329687James Dennett/// Represents a call to a member function that 11088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// may be written either with member call syntax (e.g., "obj.func()" 11188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// or "objptr->func()") or with normal function-call syntax 11288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// ("func()") within a member function that ends up calling a member 11388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// function. The callee in either case is a MemberExpr that contains 11488a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// both the object argument and the member function, while the 11588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// arguments are the arguments within the parentheses (not including 11688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor/// the object argument). 11788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorclass CXXMemberCallExpr : public CallExpr { 11888a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorpublic: 1193b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer CXXMemberCallExpr(ASTContext &C, Expr *fn, ArrayRef<Expr*> args, 120f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall QualType t, ExprValueKind VK, SourceLocation RP) 1213b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer : CallExpr(C, CXXMemberCallExprClass, fn, 0, args, t, VK, RP) {} 12288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 1231817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner CXXMemberCallExpr(ASTContext &C, EmptyShell Empty) 1241817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner : CallExpr(C, CXXMemberCallExprClass, Empty) { } 1251817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner 126010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieves the implicit object argument for the member call. 127010bfc253050626435f006386c0bee4b55329687James Dennett /// 128010bfc253050626435f006386c0bee4b55329687James Dennett /// For example, in "x.f(5)", this returns the sub-expression "x". 129b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek Expr *getImplicitObjectArgument() const; 130ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 131010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieves the declaration of the called method. 132b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek CXXMethodDecl *getMethodDecl() const; 13388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 134010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieves the CXXRecordDecl for the underlying type of 135010bfc253050626435f006386c0bee4b55329687James Dennett /// the implicit object argument. 136010bfc253050626435f006386c0bee4b55329687James Dennett /// 137010bfc253050626435f006386c0bee4b55329687James Dennett /// Note that this is may not be the same declaration as that of the class 138010bfc253050626435f006386c0bee4b55329687James Dennett /// context of the CXXMethodDecl which this function is calling. 139007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth /// FIXME: Returns 0 for member pointer call exprs. 1400cf3c0eecbff007cea2750c113894b47d9e09f33David Blaikie CXXRecordDecl *getRecordDecl() const; 141007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth 1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 14388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor return T->getStmtClass() == CXXMemberCallExprClass; 14488a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor } 14588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor}; 14688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 147010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a call to a CUDA kernel function. 148e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourneclass CUDAKernelCallExpr : public CallExpr { 149e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourneprivate: 150e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne enum { CONFIG, END_PREARG }; 151e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 152e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournepublic: 153e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne CUDAKernelCallExpr(ASTContext &C, Expr *fn, CallExpr *Config, 1543b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> args, QualType t, ExprValueKind VK, 1553b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer SourceLocation RP) 1563b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer : CallExpr(C, CUDAKernelCallExprClass, fn, END_PREARG, args, t, VK, RP) { 157e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne setConfig(Config); 158e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne } 159e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 160e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne CUDAKernelCallExpr(ASTContext &C, EmptyShell Empty) 161e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne : CallExpr(C, CUDAKernelCallExprClass, END_PREARG, Empty) { } 162e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 163e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne const CallExpr *getConfig() const { 164e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return cast_or_null<CallExpr>(getPreArg(CONFIG)); 165e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne } 166e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne CallExpr *getConfig() { return cast_or_null<CallExpr>(getPreArg(CONFIG)); } 167e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne void setConfig(CallExpr *E) { setPreArg(CONFIG, E); } 168e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 169e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne static bool classof(const Stmt *T) { 170e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne return T->getStmtClass() == CUDAKernelCallExprClass; 171e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne } 172e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne}; 173e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 174010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Abstract class common to all of the C++ "named"/"keyword" casts. 17549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// 17649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This abstract class is inherited by all of the classes 177010bfc253050626435f006386c0bee4b55329687James Dennett/// representing "named" casts: CXXStaticCastExpr for \c static_cast, 178010bfc253050626435f006386c0bee4b55329687James Dennett/// CXXDynamicCastExpr for \c dynamic_cast, CXXReinterpretCastExpr for 179010bfc253050626435f006386c0bee4b55329687James Dennett/// reinterpret_cast, and CXXConstCastExpr for \c const_cast. 18049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXNamedCastExpr : public ExplicitCastExpr { 1811060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekprivate: 1821060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation Loc; // the location of the casting op 1831d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation RParenLoc; // the location of the right parenthesis 184f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets; // range for '<' '>' 185ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 18649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorprotected: 187f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXNamedCastExpr(StmtClass SC, QualType ty, ExprValueKind VK, 188f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CastKind kind, Expr *op, unsigned PathSize, 1891d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor TypeSourceInfo *writtenTy, SourceLocation l, 190f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 191f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets) 1921d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor : ExplicitCastExpr(SC, ty, VK, kind, op, PathSize, writtenTy), Loc(l), 193f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian RParenLoc(RParenLoc), AngleBrackets(AngleBrackets) {} 19449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 195f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit CXXNamedCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize) 196f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : ExplicitCastExpr(SC, Shell, PathSize) { } 197ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 1981d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor friend class ASTStmtReader; 199ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2001060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 20149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor const char *getCastName() const; 20249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 203a3a7b8eea87c90a5a257f685749222b212ddaf36Douglas Gregor /// \brief Retrieve the location of the cast operator keyword, e.g., 204010bfc253050626435f006386c0bee4b55329687James Dennett /// \c static_cast. 205a3a7b8eea87c90a5a257f685749222b212ddaf36Douglas Gregor SourceLocation getOperatorLoc() const { return Loc; } 206a3a7b8eea87c90a5a257f685749222b212ddaf36Douglas Gregor 2071d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor /// \brief Retrieve the location of the closing parenthesis. 2081d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 209ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 21065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 21165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 212f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange getAngleBrackets() const LLVM_READONLY { return AngleBrackets; } 21365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen 2141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 21549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor switch (T->getStmtClass()) { 21649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXStaticCastExprClass: 21749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXDynamicCastExprClass: 21849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXReinterpretCastExprClass: 21949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor case CXXConstCastExprClass: 22049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return true; 22149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor default: 22249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return false; 22349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 2241060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 22549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 22649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 227010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A C++ \c static_cast expression (C++ [expr.static.cast]). 2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 22949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a C++ static cast, e.g., 230010bfc253050626435f006386c0bee4b55329687James Dennett/// \c static_cast<int>(1.0). 23149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXStaticCastExpr : public CXXNamedCastExpr { 232f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXStaticCastExpr(QualType ty, ExprValueKind vk, CastKind kind, Expr *op, 233f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned pathSize, TypeSourceInfo *writtenTy, 234f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation l, SourceLocation RParenLoc, 235f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets) 236f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CXXNamedCastExpr(CXXStaticCastExprClass, ty, vk, kind, op, pathSize, 237f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian writtenTy, l, RParenLoc, AngleBrackets) {} 23849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 239f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit CXXStaticCastExpr(EmptyShell Empty, unsigned PathSize) 240f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CXXNamedCastExpr(CXXStaticCastExprClass, Empty, PathSize) { } 241f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 242f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 24332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXStaticCastExpr *Create(const ASTContext &Context, QualType T, 244f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, CastKind K, Expr *Op, 245f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *Path, 246ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *Written, SourceLocation L, 247f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 248f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets); 24932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXStaticCastExpr *CreateEmpty(const ASTContext &Context, 250f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize); 251ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 2521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 25349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXStaticCastExprClass; 25449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 25549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 25649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 257010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A C++ @c dynamic_cast expression (C++ [expr.dynamic.cast]). 2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 25949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a dynamic cast, e.g., 26080747a834cf8b0304b314ede9aba3d6ddb8e9520NAKAMURA Takumi/// \c dynamic_cast<Derived*>(BasePtr). Such a cast may perform a run-time 261010bfc253050626435f006386c0bee4b55329687James Dennett/// check to determine how to perform the type conversion. 26249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXDynamicCastExpr : public CXXNamedCastExpr { 263f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXDynamicCastExpr(QualType ty, ExprValueKind VK, CastKind kind, 264f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr *op, unsigned pathSize, TypeSourceInfo *writtenTy, 265f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation l, SourceLocation RParenLoc, 266f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets) 267f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CXXNamedCastExpr(CXXDynamicCastExprClass, ty, VK, kind, op, pathSize, 268f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian writtenTy, l, RParenLoc, AngleBrackets) {} 26949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 270f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit CXXDynamicCastExpr(EmptyShell Empty, unsigned pathSize) 271f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CXXNamedCastExpr(CXXDynamicCastExprClass, Empty, pathSize) { } 272f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 273f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 27432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXDynamicCastExpr *Create(const ASTContext &Context, QualType T, 275f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, CastKind Kind, Expr *Op, 276f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *Path, 277ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *Written, SourceLocation L, 278f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 279f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets); 280ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 28132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXDynamicCastExpr *CreateEmpty(const ASTContext &Context, 282f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned pathSize); 283ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 2840fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson bool isAlwaysNull() const; 2850fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 28749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXDynamicCastExprClass; 28849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 28949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 29049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 291010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A C++ @c reinterpret_cast expression (C++ [expr.reinterpret.cast]). 2921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 29349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a reinterpret cast, e.g., 29449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// @c reinterpret_cast<int>(VoidPtr). 295010bfc253050626435f006386c0bee4b55329687James Dennett/// 296010bfc253050626435f006386c0bee4b55329687James Dennett/// A reinterpret_cast provides a differently-typed view of a value but 297010bfc253050626435f006386c0bee4b55329687James Dennett/// (in Clang, as in most C++ implementations) performs no actual work at 298010bfc253050626435f006386c0bee4b55329687James Dennett/// run time. 29949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXReinterpretCastExpr : public CXXNamedCastExpr { 300f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXReinterpretCastExpr(QualType ty, ExprValueKind vk, CastKind kind, 301f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr *op, unsigned pathSize, 302ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *writtenTy, SourceLocation l, 303f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 304f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets) 305f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : CXXNamedCastExpr(CXXReinterpretCastExprClass, ty, vk, kind, op, 306f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian pathSize, writtenTy, l, RParenLoc, AngleBrackets) {} 30749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 308f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CXXReinterpretCastExpr(EmptyShell Empty, unsigned pathSize) 309f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CXXNamedCastExpr(CXXReinterpretCastExprClass, Empty, pathSize) { } 310f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 311f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 31232b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXReinterpretCastExpr *Create(const ASTContext &Context, QualType T, 313f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, CastKind Kind, 314f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr *Op, const CXXCastPath *Path, 315ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *WrittenTy, SourceLocation L, 316f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 317f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets); 31832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXReinterpretCastExpr *CreateEmpty(const ASTContext &Context, 319f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned pathSize); 320ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 32249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXReinterpretCastExprClass; 32349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 32449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}; 32549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 326010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A C++ \c const_cast expression (C++ [expr.const.cast]). 3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 32849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// This expression node represents a const cast, e.g., 329010bfc253050626435f006386c0bee4b55329687James Dennett/// \c const_cast<char*>(PtrToConstChar). 330010bfc253050626435f006386c0bee4b55329687James Dennett/// 331010bfc253050626435f006386c0bee4b55329687James Dennett/// A const_cast can remove type qualifiers but does not change the underlying 332010bfc253050626435f006386c0bee4b55329687James Dennett/// value. 33349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXConstCastExpr : public CXXNamedCastExpr { 334f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXConstCastExpr(QualType ty, ExprValueKind VK, Expr *op, 335ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *writtenTy, SourceLocation l, 336f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, SourceRange AngleBrackets) 337ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie : CXXNamedCastExpr(CXXConstCastExprClass, ty, VK, CK_NoOp, op, 338f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian 0, writtenTy, l, RParenLoc, AngleBrackets) {} 33949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 340ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig explicit CXXConstCastExpr(EmptyShell Empty) 341f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : CXXNamedCastExpr(CXXConstCastExprClass, Empty, 0) { } 342f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 343f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 34432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXConstCastExpr *Create(const ASTContext &Context, QualType T, 345f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, Expr *Op, 346ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *WrittenTy, SourceLocation L, 347f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceLocation RParenLoc, 348f799ae1afb897151a84a7170951e367d8307ae04Fariborz Jahanian SourceRange AngleBrackets); 34932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXConstCastExpr *CreateEmpty(const ASTContext &Context); 350ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 3511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 35249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor return T->getStmtClass() == CXXConstCastExprClass; 35349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor } 3541060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 3551060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 356010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A call to a literal operator (C++11 [over.literal]) 3579fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// written as a user-defined literal (C++11 [lit.ext]). 3589fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// 3599fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// Represents a user-defined literal, e.g. "foo"_bar or 1.23_xyz. While this 3609fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// is semantically equivalent to a normal call, this AST node provides better 3619fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// information about the syntactic representation of the literal. 3629fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// 3639fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// Since literal operators are never found by ADL and can only be declared at 3649fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith/// namespace scope, a user-defined literal is never dependent. 3659fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smithclass UserDefinedLiteral : public CallExpr { 3669fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// \brief The location of a ud-suffix within the literal. 3679fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith SourceLocation UDSuffixLoc; 3689fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 3699fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smithpublic: 37032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper UserDefinedLiteral(const ASTContext &C, Expr *Fn, ArrayRef<Expr*> Args, 3719fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith QualType T, ExprValueKind VK, SourceLocation LitEndLoc, 3729fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith SourceLocation SuffixLoc) 3733b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer : CallExpr(C, UserDefinedLiteralClass, Fn, 0, Args, T, VK, LitEndLoc), 3743b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer UDSuffixLoc(SuffixLoc) {} 37532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper explicit UserDefinedLiteral(const ASTContext &C, EmptyShell Empty) 3769fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith : CallExpr(C, UserDefinedLiteralClass, Empty) {} 3779fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 3789fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// The kind of literal operator which is invoked. 3799fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith enum LiteralOperatorKind { 3809fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_Raw, ///< Raw form: operator "" X (const char *) 3819fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_Template, ///< Raw form: operator "" X<cs...> () 3829fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_Integer, ///< operator "" X (unsigned long long) 3839fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_Floating, ///< operator "" X (long double) 3849fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_String, ///< operator "" X (const CharT *, size_t) 3859fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LOK_Character ///< operator "" X (CharT) 3869fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith }; 3879fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 388010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the kind of literal operator invocation 3899fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// which this expression represents. 3909fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith LiteralOperatorKind getLiteralOperatorKind() const; 3919fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 392010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief If this is not a raw user-defined literal, get the 3939fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// underlying cooked literal (representing the literal with the suffix 3949fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// removed). 3959fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith Expr *getCookedLiteral(); 3969fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith const Expr *getCookedLiteral() const { 3979fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return const_cast<UserDefinedLiteral*>(this)->getCookedLiteral(); 3989fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith } 3999fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 4000265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara SourceLocation getLocStart() const { 4010265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara if (getLiteralOperatorKind() == LOK_Template) 4020265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara return getRParenLoc(); 4030265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara return getArg(0)->getLocStart(); 4040265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara } 4050265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara SourceLocation getLocEnd() const { return getRParenLoc(); } 4060265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara 4070265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara 408010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the location of a ud-suffix in the expression. 409010bfc253050626435f006386c0bee4b55329687James Dennett /// 4109fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// For a string literal, there may be multiple identical suffixes. This 4119fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith /// returns the first. 4120265555a0fec81102bfb3757cfc7f3d90dbbe409Abramo Bagnara SourceLocation getUDSuffixLoc() const { return UDSuffixLoc; } 4139fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 414010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the ud-suffix specified for this literal. 4159fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith const IdentifierInfo *getUDSuffix() const; 4169fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 4179fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith static bool classof(const Stmt *S) { 4189fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith return S->getStmtClass() == UserDefinedLiteralClass; 4199fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith } 4209fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 4219fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith friend class ASTStmtReader; 4229fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith friend class ASTStmtWriter; 4239fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith}; 4249fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 425010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A boolean literal, per ([C++ lex.bool] Boolean literals). 4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 4271060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXBoolLiteralExpr : public Expr { 4281060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek bool Value; 4291060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation Loc; 4301060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 4311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) : 432bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Expr(CXXBoolLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false, 433561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor false, false), 434f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Value(val), Loc(l) {} 4358b0b475b3464b0f70b91ba7d679d23c424677d5eSebastian Redl 436eb7f96141f754150a92433286fa385910a22f494Sam Weinig explicit CXXBoolLiteralExpr(EmptyShell Empty) 437eb7f96141f754150a92433286fa385910a22f494Sam Weinig : Expr(CXXBoolLiteralExprClass, Empty) { } 438eb7f96141f754150a92433286fa385910a22f494Sam Weinig 4391060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek bool getValue() const { return Value; } 440eb7f96141f754150a92433286fa385910a22f494Sam Weinig void setValue(bool V) { Value = V; } 4415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 44265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 44365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 4441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 445eb7f96141f754150a92433286fa385910a22f494Sam Weinig SourceLocation getLocation() const { return Loc; } 446eb7f96141f754150a92433286fa385910a22f494Sam Weinig void setLocation(SourceLocation L) { Loc = L; } 447eb7f96141f754150a92433286fa385910a22f494Sam Weinig 4481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 4491060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXBoolLiteralExprClass; 4501060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 4511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4521060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 45363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 4541060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 4551060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 456010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief The null pointer literal (C++11 [lex.nullptr]) 457010bfc253050626435f006386c0bee4b55329687James Dennett/// 458010bfc253050626435f006386c0bee4b55329687James Dennett/// Introduced in C++11, the only literal of type \c nullptr_t is \c nullptr. 4596e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlclass CXXNullPtrLiteralExpr : public Expr { 4606e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl SourceLocation Loc; 4616e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlpublic: 4626e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl CXXNullPtrLiteralExpr(QualType Ty, SourceLocation l) : 463bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Expr(CXXNullPtrLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false, 464561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor false, false), 465f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Loc(l) {} 4666e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 467eb7f96141f754150a92433286fa385910a22f494Sam Weinig explicit CXXNullPtrLiteralExpr(EmptyShell Empty) 468eb7f96141f754150a92433286fa385910a22f494Sam Weinig : Expr(CXXNullPtrLiteralExprClass, Empty) { } 469eb7f96141f754150a92433286fa385910a22f494Sam Weinig 47065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 47165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 4726e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 473eb7f96141f754150a92433286fa385910a22f494Sam Weinig SourceLocation getLocation() const { return Loc; } 474eb7f96141f754150a92433286fa385910a22f494Sam Weinig void setLocation(SourceLocation L) { Loc = L; } 475eb7f96141f754150a92433286fa385910a22f494Sam Weinig 4766e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl static bool classof(const Stmt *T) { 4776e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl return T->getStmtClass() == CXXNullPtrLiteralExprClass; 4786e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl } 4796e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 48063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 4816e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl}; 4826e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 4837c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith/// \brief Implicit construction of a std::initializer_list<T> object from an 4847c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith/// array temporary within list-initialization (C++11 [dcl.init.list]p5). 4857c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithclass CXXStdInitializerListExpr : public Expr { 4867c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith Stmt *SubExpr; 4877c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 4887c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith CXXStdInitializerListExpr(EmptyShell Empty) 4896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(CXXStdInitializerListExprClass, Empty), SubExpr(nullptr) {} 4907c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 4917c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithpublic: 4927c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith CXXStdInitializerListExpr(QualType Ty, Expr *SubExpr) 4937c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith : Expr(CXXStdInitializerListExprClass, Ty, VK_RValue, OK_Ordinary, 4947c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith Ty->isDependentType(), SubExpr->isValueDependent(), 4957c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SubExpr->isInstantiationDependent(), 4967c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SubExpr->containsUnexpandedParameterPack()), 4977c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SubExpr(SubExpr) {} 4987c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 4997c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith Expr *getSubExpr() { return static_cast<Expr*>(SubExpr); } 5007c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith const Expr *getSubExpr() const { return static_cast<const Expr*>(SubExpr); } 5017c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5027c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SourceLocation getLocStart() const LLVM_READONLY { 5037c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return SubExpr->getLocStart(); 5047c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 5057c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SourceLocation getLocEnd() const LLVM_READONLY { 5067c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return SubExpr->getLocEnd(); 5077c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 5087c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith SourceRange getSourceRange() const LLVM_READONLY { 5097c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return SubExpr->getSourceRange(); 5107c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 5117c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5127c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith static bool classof(const Stmt *S) { 5137c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith return S->getStmtClass() == CXXStdInitializerListExprClass; 5147c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 5157c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5167c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith child_range children() { return child_range(&SubExpr, &SubExpr + 1); } 5177c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 5187c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith friend class ASTReader; 5197c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith friend class ASTStmtReader; 5207c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith}; 5217c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 522010bfc253050626435f006386c0bee4b55329687James Dennett/// A C++ \c typeid expression (C++ [expr.typeid]), which gets 523010bfc253050626435f006386c0bee4b55329687James Dennett/// the \c type_info that corresponds to the supplied type, or the (possibly 524c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// dynamic) type of the supplied expression. 525c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl/// 526010bfc253050626435f006386c0bee4b55329687James Dennett/// This represents code like \c typeid(int) or \c typeid(*objPtr) 527c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlclass CXXTypeidExpr : public Expr { 528c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlprivate: 52957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand; 530c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl SourceRange Range; 531c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 532c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlpublic: 53357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor CXXTypeidExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R) 534f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary, 53557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor // typeid is never type-dependent (C++ [temp.dep.expr]p4) 53657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor false, 53757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor // typeid is value-dependent if the type or expression are dependent 538bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->getType()->isDependentType(), 539561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Operand->getType()->isInstantiationDependentType(), 540bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->getType()->containsUnexpandedParameterPack()), 54157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor Operand(Operand), Range(R) { } 542ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 54357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor CXXTypeidExpr(QualType Ty, Expr *Operand, SourceRange R) 544f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CXXTypeidExprClass, Ty, VK_LValue, OK_Ordinary, 5452850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl // typeid is never type-dependent (C++ [temp.dep.expr]p4) 546bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false, 5472850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl // typeid is value-dependent if the type or expression are dependent 548bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->isTypeDependent() || Operand->isValueDependent(), 549561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Operand->isInstantiationDependent(), 550bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->containsUnexpandedParameterPack()), 55157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor Operand(Operand), Range(R) { } 552c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 55314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner CXXTypeidExpr(EmptyShell Empty, bool isExpr) 55414ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner : Expr(CXXTypeidExprClass, Empty) { 55514ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner if (isExpr) 5566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Operand = (Expr*)nullptr; 55714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner else 5586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Operand = (TypeSourceInfo*)nullptr; 55914ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner } 560ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 5610d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith /// Determine whether this typeid has a type operand which is potentially 5620d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith /// evaluated, per C++11 [expr.typeid]p3. 5630d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith bool isPotentiallyEvaluated() const; 5640d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith 56557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); } 566ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 56757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor /// \brief Retrieves the type operand of this typeid() expression after 56857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor /// various required adjustments (removing reference types, cv-qualifiers). 569fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer QualType getTypeOperand(ASTContext &Context) const; 57057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor 57157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor /// \brief Retrieve source information for the type operand. 57257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor TypeSourceInfo *getTypeOperandSourceInfo() const { 573c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)"); 57457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return Operand.get<TypeSourceInfo *>(); 575c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 57614ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner 57714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner void setTypeOperandSourceInfo(TypeSourceInfo *TSI) { 57814ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)"); 57914ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner Operand = TSI; 58014ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner } 581ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 58214ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner Expr *getExprOperand() const { 583c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)"); 58457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor return static_cast<Expr*>(Operand.get<Stmt *>()); 585c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 586ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 587030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner void setExprOperand(Expr *E) { 588030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)"); 589030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner Operand = E; 590030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner } 591ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 59265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } 59365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 594aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar SourceRange getSourceRange() const LLVM_READONLY { return Range; } 59514ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner void setSourceRange(SourceRange R) { Range = R; } 596ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 597c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl static bool classof(const Stmt *T) { 598c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl return T->getStmtClass() == CXXTypeidExprClass; 599c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 600c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 601c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl // Iterators 60263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 60363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall if (isTypeOperand()) return child_range(); 60463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall Stmt **begin = reinterpret_cast<Stmt**>(&Operand); 60563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(begin, begin + 1); 60663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 607c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl}; 608c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 609010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A member reference to an MSPropertyDecl. 610010bfc253050626435f006386c0bee4b55329687James Dennett/// 611010bfc253050626435f006386c0bee4b55329687James Dennett/// This expression always has pseudo-object type, and therefore it is 612010bfc253050626435f006386c0bee4b55329687James Dennett/// typically not encountered in a fully-typechecked expression except 613010bfc253050626435f006386c0bee4b55329687James Dennett/// within the syntactic form of a PseudoObjectExpr. 61476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallclass MSPropertyRefExpr : public Expr { 61576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall Expr *BaseExpr; 61676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall MSPropertyDecl *TheDecl; 61776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceLocation MemberLoc; 61876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall bool IsArrow; 61976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall NestedNameSpecifierLoc QualifierLoc; 62076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 62176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallpublic: 62276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall MSPropertyRefExpr(Expr *baseExpr, MSPropertyDecl *decl, bool isArrow, 62376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall QualType ty, ExprValueKind VK, 62476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall NestedNameSpecifierLoc qualifierLoc, 62576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceLocation nameLoc) 62676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall : Expr(MSPropertyRefExprClass, ty, VK, OK_Ordinary, 62776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall /*type-dependent*/ false, baseExpr->isValueDependent(), 62876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall baseExpr->isInstantiationDependent(), 62976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall baseExpr->containsUnexpandedParameterPack()), 63076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall BaseExpr(baseExpr), TheDecl(decl), 63176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall MemberLoc(nameLoc), IsArrow(isArrow), 63276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall QualifierLoc(qualifierLoc) {} 63376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 63476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall MSPropertyRefExpr(EmptyShell Empty) : Expr(MSPropertyRefExprClass, Empty) {} 63576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 63676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceRange getSourceRange() const LLVM_READONLY { 63776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return SourceRange(getLocStart(), getLocEnd()); 63876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 63976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall bool isImplicitAccess() const { 64076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return getBaseExpr() && getBaseExpr()->isImplicitCXXThis(); 64176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 64276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceLocation getLocStart() const { 64376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall if (!isImplicitAccess()) 64476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return BaseExpr->getLocStart(); 64576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall else if (QualifierLoc) 64676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return QualifierLoc.getBeginLoc(); 64776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall else 64876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return MemberLoc; 64976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 65076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceLocation getLocEnd() const { return getMemberLoc(); } 65176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 65276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall child_range children() { 65376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return child_range((Stmt**)&BaseExpr, (Stmt**)&BaseExpr + 1); 65476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 65576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall static bool classof(const Stmt *T) { 65676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall return T->getStmtClass() == MSPropertyRefExprClass; 65776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall } 65876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 65976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall Expr *getBaseExpr() const { return BaseExpr; } 66076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall MSPropertyDecl *getPropertyDecl() const { return TheDecl; } 66176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall bool isArrow() const { return IsArrow; } 66276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall SourceLocation getMemberLoc() const { return MemberLoc; } 66376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; } 66476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 66576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall friend class ASTStmtReader; 66676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall}; 66776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 668010bfc253050626435f006386c0bee4b55329687James Dennett/// A Microsoft C++ @c __uuidof expression, which gets 66901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet/// the _GUID that corresponds to the supplied type or expression. 67001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet/// 67101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet/// This represents code like @c __uuidof(COMTYPE) or @c __uuidof(*comPtr) 67201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetclass CXXUuidofExpr : public Expr { 67301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetprivate: 67401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand; 67501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet SourceRange Range; 67601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 67701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetpublic: 67801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R) 6792e219b8d253dbb901206b14e5643cc9d0edd662bFrancois Pichet : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, 680bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false, Operand->getType()->isDependentType(), 681561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Operand->getType()->isInstantiationDependentType(), 682bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->getType()->containsUnexpandedParameterPack()), 68301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet Operand(Operand), Range(R) { } 684ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 68501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet CXXUuidofExpr(QualType Ty, Expr *Operand, SourceRange R) 6862e219b8d253dbb901206b14e5643cc9d0edd662bFrancois Pichet : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, 687bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor false, Operand->isTypeDependent(), 688561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Operand->isInstantiationDependent(), 689bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->containsUnexpandedParameterPack()), 69001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet Operand(Operand), Range(R) { } 69101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 69201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet CXXUuidofExpr(EmptyShell Empty, bool isExpr) 69301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet : Expr(CXXUuidofExprClass, Empty) { 69401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (isExpr) 6956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Operand = (Expr*)nullptr; 69601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet else 6976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Operand = (TypeSourceInfo*)nullptr; 69801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 699ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 70001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); } 701ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 70201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// \brief Retrieves the type operand of this __uuidof() expression after 70301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// various required adjustments (removing reference types, cv-qualifiers). 704fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer QualType getTypeOperand(ASTContext &Context) const; 70501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 70601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet /// \brief Retrieve source information for the type operand. 70701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TypeSourceInfo *getTypeOperandSourceInfo() const { 70801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)"); 70901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return Operand.get<TypeSourceInfo *>(); 71001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 71101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 71201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet void setTypeOperandSourceInfo(TypeSourceInfo *TSI) { 71301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)"); 71401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet Operand = TSI; 71501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 716ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 71701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet Expr *getExprOperand() const { 71801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)"); 71901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return static_cast<Expr*>(Operand.get<Stmt *>()); 72001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 721ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 72201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet void setExprOperand(Expr *E) { 72301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)"); 72401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet Operand = E; 72501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 72601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 727c80eb46a0f37bee9597f1b466013a0f6271f9318David Majnemer StringRef getUuidAsStringRef(ASTContext &Context) const; 728c80eb46a0f37bee9597f1b466013a0f6271f9318David Majnemer 72965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } 73065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 731aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar SourceRange getSourceRange() const LLVM_READONLY { return Range; } 73201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet void setSourceRange(SourceRange R) { Range = R; } 733ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 73401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet static bool classof(const Stmt *T) { 73501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet return T->getStmtClass() == CXXUuidofExprClass; 73601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 73701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 73829b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemer /// Grabs __declspec(uuid()) off a type, or returns 0 if we cannot resolve to 73929b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemer /// a single GUID. 74029b37a06fc58bb2993d1c35cf7411b6b94b1116aDavid Majnemer static UuidAttr *GetUuidAttrOfType(QualType QT, 7416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool *HasMultipleGUIDsPtr = nullptr); 742c5f804636e367ef744fd24cf88f7c956a5af0434Nico Weber 74301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // Iterators 74463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 74563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall if (isTypeOperand()) return child_range(); 74663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall Stmt **begin = reinterpret_cast<Stmt**>(&Operand); 74763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(begin, begin + 1); 74863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 74901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet}; 75001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 751010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents the \c this expression in C++. 752010bfc253050626435f006386c0bee4b55329687James Dennett/// 753010bfc253050626435f006386c0bee4b55329687James Dennett/// This is a pointer to the object on which the current member function is 754796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// executing (C++ [expr.prim]p3). Example: 755796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// 756010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 757796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// class Foo { 758796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// public: 759796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// void bar(); 760796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// void test() { this->bar(); } 761796da18402f286b897782a298ae3b20c459c102eDouglas Gregor/// }; 762010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 763796da18402f286b897782a298ae3b20c459c102eDouglas Gregorclass CXXThisExpr : public Expr { 764796da18402f286b897782a298ae3b20c459c102eDouglas Gregor SourceLocation Loc; 765828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor bool Implicit : 1; 766ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 767796da18402f286b897782a298ae3b20c459c102eDouglas Gregorpublic: 768828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor CXXThisExpr(SourceLocation L, QualType Type, bool isImplicit) 769f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CXXThisExprClass, Type, VK_RValue, OK_Ordinary, 7702850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl // 'this' is type-dependent if the class type of the enclosing 7712850784bda09416fc7e9d57f5baa36c9351c757cSebastian Redl // member function is dependent (C++ [temp.dep.expr]p2) 772bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Type->isDependentType(), Type->isDependentType(), 773561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Type->isInstantiationDependentType(), 774bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /*ContainsUnexpandedParameterPack=*/false), 775828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor Loc(L), Implicit(isImplicit) { } 776796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 7772fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner CXXThisExpr(EmptyShell Empty) : Expr(CXXThisExprClass, Empty) {} 7782fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner 7792fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner SourceLocation getLocation() const { return Loc; } 7802fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner void setLocation(SourceLocation L) { Loc = L; } 7812fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner 78265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 78365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 784796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 785828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor bool isImplicit() const { return Implicit; } 786828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor void setImplicit(bool I) { Implicit = I; } 787ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 789796da18402f286b897782a298ae3b20c459c102eDouglas Gregor return T->getStmtClass() == CXXThisExprClass; 790796da18402f286b897782a298ae3b20c459c102eDouglas Gregor } 791796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 792796da18402f286b897782a298ae3b20c459c102eDouglas Gregor // Iterators 79363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 794796da18402f286b897782a298ae3b20c459c102eDouglas Gregor}; 795796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 796010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A C++ throw-expression (C++ [except.throw]). 7971060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek/// 798010bfc253050626435f006386c0bee4b55329687James Dennett/// This handles 'throw' (for re-throwing the current exception) and 799010bfc253050626435f006386c0bee4b55329687James Dennett/// 'throw' assignment-expression. When assignment-expression isn't 800010bfc253050626435f006386c0bee4b55329687James Dennett/// present, Op will be null. 8011060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXThrowExpr : public Expr { 8021060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Stmt *Op; 8031060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek SourceLocation ThrowLoc; 804bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// \brief Whether the thrown variable (if any) is in scope. 805bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor unsigned IsThrownVariableInScope : 1; 806ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 807bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor friend class ASTStmtReader; 808ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 8091060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 810010bfc253050626435f006386c0bee4b55329687James Dennett // \p Ty is the void type which is used as the result type of the 811010bfc253050626435f006386c0bee4b55329687James Dennett // expression. The \p l is the location of the throw keyword. \p expr 8121060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // can by null, if the optional expression to throw isn't present. 813bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor CXXThrowExpr(Expr *expr, QualType Ty, SourceLocation l, 814bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor bool IsThrownVariableInScope) : 815bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Expr(CXXThrowExprClass, Ty, VK_RValue, OK_Ordinary, false, false, 816561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor expr && expr->isInstantiationDependent(), 817bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor expr && expr->containsUnexpandedParameterPack()), 818bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor Op(expr), ThrowLoc(l), IsThrownVariableInScope(IsThrownVariableInScope) {} 8192fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner CXXThrowExpr(EmptyShell Empty) : Expr(CXXThrowExprClass, Empty) {} 8202fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner 8211060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek const Expr *getSubExpr() const { return cast_or_null<Expr>(Op); } 8221060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek Expr *getSubExpr() { return cast_or_null<Expr>(Op); } 82342e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor 82442e5b50f4dc897f252e0d476063a7f9846d96624Douglas Gregor SourceLocation getThrowLoc() const { return ThrowLoc; } 8251060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 826bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// \brief Determines whether the variable thrown by this expression (if any!) 827bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// is within the innermost try block. 828bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// 829bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// This information is required to determine whether the NRVO can apply to 830bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor /// this variable. 831bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor bool isThrownVariableInScope() const { return IsThrownVariableInScope; } 832ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 83365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return ThrowLoc; } 83465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 8356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!getSubExpr()) 83665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return ThrowLoc; 83765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getSubExpr()->getLocEnd(); 8381060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 8391060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 8401060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 8411060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXThrowExprClass; 8421060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 8431060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 8441060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 84563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 84663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Op, Op ? &Op+1 : &Op); 84763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 8481060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 8491060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 850010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A default argument (C++ [dcl.fct.default]). 851010bfc253050626435f006386c0bee4b55329687James Dennett/// 852010bfc253050626435f006386c0bee4b55329687James Dennett/// This wraps up a function call argument that was created from the 853010bfc253050626435f006386c0bee4b55329687James Dennett/// corresponding parameter's default argument, when the call did not 854010bfc253050626435f006386c0bee4b55329687James Dennett/// explicitly supply arguments for all of the parameters. 8551060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekclass CXXDefaultArgExpr : public Expr { 85665222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor /// \brief The parameter whose default is being used. 85765222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor /// 858ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// When the bit is set, the subexpression is stored after the 85965222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor /// CXXDefaultArgExpr itself. When the bit is clear, the parameter's 86065222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor /// actual default expression is the subexpression. 86165222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor llvm::PointerIntPair<ParmVarDecl *, 1, bool> Param; 8621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 863036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor /// \brief The location where the default argument expression was used. 864036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor SourceLocation Loc; 865ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 866036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param) 867ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie : Expr(SC, 86865222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor param->hasUnparsedDefaultArg() 86965222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor ? param->getType().getNonReferenceType() 8702333f7727f97018d6742e1e0938133bcfad967abEli Friedman : param->getDefaultArg()->getType(), 871dfa1edbebeda7ec3a7a9c45e4317de9241aa9883John McCall param->getDefaultArg()->getValueKind(), 872561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor param->getDefaultArg()->getObjectKind(), false, false, false, false), 873036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor Param(param, false), Loc(Loc) { } 87465222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor 875ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *param, 876036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor Expr *SubExpr) 877dfa1edbebeda7ec3a7a9c45e4317de9241aa9883John McCall : Expr(SC, SubExpr->getType(), 878dfa1edbebeda7ec3a7a9c45e4317de9241aa9883John McCall SubExpr->getValueKind(), SubExpr->getObjectKind(), 879ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie false, false, false, false), 880bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Param(param, true), Loc(Loc) { 88165222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor *reinterpret_cast<Expr **>(this + 1) = SubExpr; 88265222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor } 883ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 8841060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenekpublic: 885030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner CXXDefaultArgExpr(EmptyShell Empty) : Expr(CXXDefaultArgExprClass, Empty) {} 886030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner 887010bfc253050626435f006386c0bee4b55329687James Dennett // \p Param is the parameter whose default argument is used by this 8881060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // expression. 88932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXDefaultArgExpr *Create(const ASTContext &C, SourceLocation Loc, 890036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor ParmVarDecl *Param) { 891036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor return new (C) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param); 892f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson } 8931060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 894010bfc253050626435f006386c0bee4b55329687James Dennett // \p Param is the parameter whose default argument is used by this 895010bfc253050626435f006386c0bee4b55329687James Dennett // expression, and \p SubExpr is the expression that will actually be used. 89632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXDefaultArgExpr *Create(const ASTContext &C, SourceLocation Loc, 89732b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper ParmVarDecl *Param, Expr *SubExpr); 898ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 8991060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Retrieve the parameter that the argument was created from. 90065222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor const ParmVarDecl *getParam() const { return Param.getPointer(); } 90165222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor ParmVarDecl *getParam() { return Param.getPointer(); } 902ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 9031060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Retrieve the actual argument to the function call. 904ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie const Expr *getExpr() const { 90565222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor if (Param.getInt()) 90665222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor return *reinterpret_cast<Expr const * const*> (this + 1); 907ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return getParam()->getDefaultArg(); 90865222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor } 909ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie Expr *getExpr() { 91065222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor if (Param.getInt()) 91165222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor return *reinterpret_cast<Expr **> (this + 1); 912ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return getParam()->getDefaultArg(); 91365222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor } 9141060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 915ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Retrieve the location where this default argument was actually 916036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor /// used. 917036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor SourceLocation getUsedLocation() const { return Loc; } 918ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 919010bfc253050626435f006386c0bee4b55329687James Dennett /// Default argument expressions have no representation in the 920010bfc253050626435f006386c0bee4b55329687James Dennett /// source, so they have an empty source range. 92165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); } 92265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); } 92363b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer 92463b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer SourceLocation getExprLoc() const LLVM_READONLY { return Loc; } 9251060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 9261060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek static bool classof(const Stmt *T) { 9271060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek return T->getStmtClass() == CXXDefaultArgExprClass; 9281060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek } 9291060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek 9301060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek // Iterators 93163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 9328a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis 93360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 9343397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl friend class ASTStmtWriter; 9351060aff23f72135f8b50034a1e80f16725ebc56cTed Kremenek}; 936987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 937010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief A use of a default initializer in a constructor or in aggregate 938010bfc253050626435f006386c0bee4b55329687James Dennett/// initialization. 939010bfc253050626435f006386c0bee4b55329687James Dennett/// 940010bfc253050626435f006386c0bee4b55329687James Dennett/// This wraps a use of a C++ default initializer (technically, 941c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith/// a brace-or-equal-initializer for a non-static data member) when it 942c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith/// is implicitly used in a mem-initializer-list in a constructor 943c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith/// (C++11 [class.base.init]p8) or in aggregate initialization 944c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith/// (C++1y [dcl.init.aggr]p7). 945c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smithclass CXXDefaultInitExpr : public Expr { 946c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith /// \brief The field whose default is being used. 947c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith FieldDecl *Field; 948c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 949c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith /// \brief The location where the default initializer expression was used. 950c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith SourceLocation Loc; 951c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 95232b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXDefaultInitExpr(const ASTContext &C, SourceLocation Loc, FieldDecl *Field, 953c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith QualType T); 954c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 955c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith CXXDefaultInitExpr(EmptyShell Empty) : Expr(CXXDefaultInitExprClass, Empty) {} 956c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 957c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smithpublic: 958010bfc253050626435f006386c0bee4b55329687James Dennett /// \p Field is the non-static data member whose default initializer is used 959010bfc253050626435f006386c0bee4b55329687James Dennett /// by this expression. 96032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXDefaultInitExpr *Create(const ASTContext &C, SourceLocation Loc, 961c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith FieldDecl *Field) { 962c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith return new (C) CXXDefaultInitExpr(C, Loc, Field, Field->getType()); 963c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 964c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 965010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Get the field whose initializer will be used. 966c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith FieldDecl *getField() { return Field; } 967c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith const FieldDecl *getField() const { return Field; } 968c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 969010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Get the initialization expression that will be used. 970c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith const Expr *getExpr() const { return Field->getInClassInitializer(); } 971c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith Expr *getExpr() { return Field->getInClassInitializer(); } 972c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 973c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 974c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 975c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 976c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith static bool classof(const Stmt *T) { 977c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith return T->getStmtClass() == CXXDefaultInitExprClass; 978c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith } 979c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 980c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith // Iterators 981c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith child_range children() { return child_range(); } 982c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 983c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith friend class ASTReader; 984c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith friend class ASTStmtReader; 985c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith}; 986c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 987010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a C++ temporary. 988c1ce477119fed070299668aab24084b17ff5f14bAnders Carlssonclass CXXTemporary { 989010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief The destructor that needs to be called. 990b859f35459ae3e1188d1e1b86df08d649695fd86Anders Carlsson const CXXDestructorDecl *Destructor; 9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 992010bfc253050626435f006386c0bee4b55329687James Dennett explicit CXXTemporary(const CXXDestructorDecl *destructor) 993c1ce477119fed070299668aab24084b17ff5f14bAnders Carlsson : Destructor(destructor) { } 994c1ce477119fed070299668aab24084b17ff5f14bAnders Carlsson 995c1ce477119fed070299668aab24084b17ff5f14bAnders Carlssonpublic: 99632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXTemporary *Create(const ASTContext &C, 997b859f35459ae3e1188d1e1b86df08d649695fd86Anders Carlsson const CXXDestructorDecl *Destructor); 9981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 999f0721fe438d7e40c168e5d664970e7830bc138fbAnders Carlsson const CXXDestructorDecl *getDestructor() const { return Destructor; } 100076f3f69db1416425070177243e9f390122c553e0Richard Smith void setDestructor(const CXXDestructorDecl *Dtor) { 100176f3f69db1416425070177243e9f390122c553e0Richard Smith Destructor = Dtor; 100276f3f69db1416425070177243e9f390122c553e0Richard Smith } 1003c1ce477119fed070299668aab24084b17ff5f14bAnders Carlsson}; 1004fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 1005ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// \brief Represents binding an expression to a temporary. 1006ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// 1007ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// This ensures the destructor is called for the temporary. It should only be 1008ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// needed for non-POD, non-trivially destructable class types. For example: 1009ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// 1010ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// \code 1011ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// struct S { 1012ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// S() { } // User defined constructor makes S non-POD. 1013ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// ~S() { } // User defined destructor makes it non-trivial. 1014ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// }; 1015ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// void test() { 1016ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// const S &s_ref = S(); // Requires a CXXBindTemporaryExpr. 1017ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// } 1018ddfe960d252a93525692b547945236d361d1929fChandler Carruth/// \endcode 1019fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlssonclass CXXBindTemporaryExpr : public Expr { 1020fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson CXXTemporary *Temp; 10211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1022fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson Stmt *SubExpr; 1023fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 1024bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor CXXBindTemporaryExpr(CXXTemporary *temp, Expr* SubExpr) 1025bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(CXXBindTemporaryExprClass, SubExpr->getType(), 1026ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie VK_RValue, OK_Ordinary, SubExpr->isTypeDependent(), 1027bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SubExpr->isValueDependent(), 1028561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor SubExpr->isInstantiationDependent(), 1029bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SubExpr->containsUnexpandedParameterPack()), 1030bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Temp(temp), SubExpr(SubExpr) { } 103188eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson 1032fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlssonpublic: 1033d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner CXXBindTemporaryExpr(EmptyShell Empty) 10346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(CXXBindTemporaryExprClass, Empty), Temp(nullptr), SubExpr(nullptr) {} 1035ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 103632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXBindTemporaryExpr *Create(const ASTContext &C, CXXTemporary *Temp, 1037fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson Expr* SubExpr); 10381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 103988eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson CXXTemporary *getTemporary() { return Temp; } 1040f0721fe438d7e40c168e5d664970e7830bc138fbAnders Carlsson const CXXTemporary *getTemporary() const { return Temp; } 1041d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner void setTemporary(CXXTemporary *T) { Temp = T; } 1042f0721fe438d7e40c168e5d664970e7830bc138fbAnders Carlsson 1043fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson const Expr *getSubExpr() const { return cast<Expr>(SubExpr); } 1044fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson Expr *getSubExpr() { return cast<Expr>(SubExpr); } 104588eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson void setSubExpr(Expr *E) { SubExpr = E; } 1046fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 104765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 104865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return SubExpr->getLocStart(); 104996be6917e1c4ba1f4435a14c9e7c6c139571d086Douglas Gregor } 105065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return SubExpr->getLocEnd();} 1051fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 1052fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson // Implement isa/cast/dyncast/etc. 1053fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson static bool classof(const Stmt *T) { 1054fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson return T->getStmtClass() == CXXBindTemporaryExprClass; 1055fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson } 1056fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 1057fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson // Iterators 105863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&SubExpr, &SubExpr + 1); } 1059fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson}; 1060fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson 10610982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief Represents a call to a C++ constructor. 106215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlssonclass CXXConstructExpr : public Expr { 106372e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlssonpublic: 106472e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson enum ConstructionKind { 106572e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CK_Complete, 106672e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson CK_NonVirtualBase, 1067059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt CK_VirtualBase, 1068059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt CK_Delegating 106972e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson }; 1070ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 107172e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlssonprivate: 107215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson CXXConstructorDecl *Constructor; 107315ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson 107499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceLocation Loc; 10751245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange ParenOrBraceRange; 1076a48e676a717309afa50ae06a3d4674acec025bf9Douglas Gregor unsigned NumArgs : 16; 107716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool Elidable : 1; 10787cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates : 1; 10795b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ListInitialization : 1; 108016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool ZeroInitialization : 1; 108172e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson unsigned ConstructKind : 2; 108215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson Stmt **Args; 10831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1084bd6734e5f6432ce0cc07171c490ffaa094796198Anders Carlssonprotected: 108532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXConstructExpr(const ASTContext &C, StmtClass SC, QualType T, 108699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceLocation Loc, 1087bd6734e5f6432ce0cc07171c490ffaa094796198Anders Carlsson CXXConstructorDecl *d, bool elidable, 10883b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr *> Args, 10897cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates, 10905b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ListInitialization, 10915b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ZeroInitialization, 10925b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ConstructionKind ConstructKind, 10931245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange ParenOrBraceRange); 1094bd6734e5f6432ce0cc07171c490ffaa094796198Anders Carlsson 10956d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis /// \brief Construct an empty C++ construction expression. 10966d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis CXXConstructExpr(StmtClass SC, EmptyShell Empty) 10976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(SC, Empty), Constructor(nullptr), NumArgs(0), Elidable(false), 10985b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl HadMultipleCandidates(false), ListInitialization(false), 10996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ZeroInitialization(false), ConstructKind(0), Args(nullptr) 11005b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl { } 11016d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis 110215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlssonpublic: 11036d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis /// \brief Construct an empty C++ construction expression. 11046d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis explicit CXXConstructExpr(EmptyShell Empty) 11056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(CXXConstructExprClass, Empty), Constructor(nullptr), 11065b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl NumArgs(0), Elidable(false), HadMultipleCandidates(false), 11075b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ListInitialization(false), ZeroInitialization(false), 11086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ConstructKind(0), Args(nullptr) 11095b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl { } 11106d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis 111132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXConstructExpr *Create(const ASTContext &C, QualType T, 111299a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceLocation Loc, 11131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXConstructorDecl *D, bool Elidable, 11143b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr *> Args, 11157cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates, 11165b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ListInitialization, 11175b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool ZeroInitialization, 11185b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ConstructionKind ConstructKind, 11191245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange ParenOrBraceRange); 11201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1121d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor CXXConstructorDecl* getConstructor() const { return Constructor; } 112239da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor void setConstructor(CXXConstructorDecl *C) { Constructor = C; } 1123ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 112499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor SourceLocation getLocation() const { return Loc; } 112599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor void setLocation(SourceLocation Loc) { this->Loc = Loc; } 1126ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1127d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor /// \brief Whether this construction is elidable. 1128d94546a0a1deef7286c13e49b9584621ae81cc9aDouglas Gregor bool isElidable() const { return Elidable; } 112939da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor void setElidable(bool E) { Elidable = E; } 11307cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 11317cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara /// \brief Whether the referred constructor was resolved from 11327cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara /// an overloaded set having size greater than 1. 11337cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool hadMultipleCandidates() const { return HadMultipleCandidates; } 11347cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara void setHadMultipleCandidates(bool V) { HadMultipleCandidates = V; } 11357cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 11365b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl /// \brief Whether this constructor call was written as list-initialization. 11375b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool isListInitialization() const { return ListInitialization; } 11385b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl void setListInitialization(bool V) { ListInitialization = V; } 11395b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl 114016006c901315fa12a108b4e571f187f4b676e426Douglas Gregor /// \brief Whether this construction first requires 114116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor /// zero-initialization before the initializer is called. 114216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor bool requiresZeroInitialization() const { return ZeroInitialization; } 114316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor void setRequiresZeroInitialization(bool ZeroInit) { 114416006c901315fa12a108b4e571f187f4b676e426Douglas Gregor ZeroInitialization = ZeroInit; 114516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor } 1146ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1147010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Determine whether this constructor is actually constructing 11489db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor /// a base class (rather than a complete object). 114924eb78e38aba55c507bc3c05c37035a9ab2defa7Anders Carlsson ConstructionKind getConstructionKind() const { 115024eb78e38aba55c507bc3c05c37035a9ab2defa7Anders Carlsson return (ConstructionKind)ConstructKind; 115172e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } 1152ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie void setConstructionKind(ConstructionKind CK) { 115372e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson ConstructKind = CK; 115472e96fd181b19b8d01144a685cda6e955584c7eaAnders Carlsson } 1155ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 115615ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson typedef ExprIterator arg_iterator; 115715ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson typedef ConstExprIterator const_arg_iterator; 11581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 115915ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson arg_iterator arg_begin() { return Args; } 116015ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson arg_iterator arg_end() { return Args + NumArgs; } 116115ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson const_arg_iterator arg_begin() const { return Args; } 116215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson const_arg_iterator arg_end() const { return Args + NumArgs; } 116315ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson 1164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Expr **getArgs() { return reinterpret_cast<Expr **>(Args); } 1165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Expr *const *getArgs() const { 1166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return const_cast<CXXConstructExpr *>(this)->getArgs(); 1167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 116815ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson unsigned getNumArgs() const { return NumArgs; } 116915ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson 1170010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Return the specified argument. 1171bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson Expr *getArg(unsigned Arg) { 1172bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson assert(Arg < NumArgs && "Arg access out of range!"); 1173bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson return cast<Expr>(Args[Arg]); 1174bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson } 1175bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson const Expr *getArg(unsigned Arg) const { 1176bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson assert(Arg < NumArgs && "Arg access out of range!"); 1177bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson return cast<Expr>(Args[Arg]); 1178bcb11d01c034f967503bd98f28bdf458c1ab8001Anders Carlsson } 11791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1180010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Set the specified argument. 11812eeed7bc4fd457ac57ff32ab3b02674588545f65Fariborz Jahanian void setArg(unsigned Arg, Expr *ArgExpr) { 11822eeed7bc4fd457ac57ff32ab3b02674588545f65Fariborz Jahanian assert(Arg < NumArgs && "Arg access out of range!"); 11832eeed7bc4fd457ac57ff32ab3b02674588545f65Fariborz Jahanian Args[Arg] = ArgExpr; 11842eeed7bc4fd457ac57ff32ab3b02674588545f65Fariborz Jahanian } 11852eeed7bc4fd457ac57ff32ab3b02674588545f65Fariborz Jahanian 118665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY; 118765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY; 11881245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange getParenOrBraceRange() const { return ParenOrBraceRange; } 11891245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella void setParenOrBraceRange(SourceRange Range) { ParenOrBraceRange = Range; } 119015ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson 11911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 1192524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlsson return T->getStmtClass() == CXXConstructExprClass || 1193524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlsson T->getStmtClass() == CXXTemporaryObjectExprClass; 119415ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson } 11951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 119615ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson // Iterators 119763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 119863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Args[0], &Args[0]+NumArgs); 119963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 12006d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis 120160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 120215ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson}; 120315ef2b5820f9daccc44b9e847163b705b6f5863bAnders Carlsson 12040982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief Represents an explicit C++ type conversion that uses "functional" 12050982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// notation (C++ [expr.type.conv]). 12060982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// 12070982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// Example: 1208010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 12090982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// x = int(0.5); 1210010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 121149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorclass CXXFunctionalCastExpr : public ExplicitCastExpr { 1212cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation LParenLoc; 1213987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation RParenLoc; 1214f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 1215f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall CXXFunctionalCastExpr(QualType ty, ExprValueKind VK, 1216f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall TypeSourceInfo *writtenTy, 1217cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman CastKind kind, Expr *castExpr, unsigned pathSize, 1218cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation lParenLoc, SourceLocation rParenLoc) 1219f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : ExplicitCastExpr(CXXFunctionalCastExprClass, ty, VK, kind, 1220f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall castExpr, pathSize, writtenTy), 1221cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman LParenLoc(lParenLoc), RParenLoc(rParenLoc) {} 12220aebc81e02397a5987aaa8e8c7acbdb01a31d7c3Anders Carlsson 1223f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall explicit CXXFunctionalCastExpr(EmptyShell Shell, unsigned PathSize) 1224f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall : ExplicitCastExpr(CXXFunctionalCastExprClass, Shell, PathSize) { } 1225f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall 1226f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallpublic: 122732b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXFunctionalCastExpr *Create(const ASTContext &Context, QualType T, 1228f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall ExprValueKind VK, 1229f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall TypeSourceInfo *Written, 1230f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall CastKind Kind, Expr *Op, 1231f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall const CXXCastPath *Path, 1232cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation LPLoc, 1233f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall SourceLocation RPLoc); 123432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXFunctionalCastExpr *CreateEmpty(const ASTContext &Context, 1235f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall unsigned PathSize); 1236ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig 1237cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation getLParenLoc() const { return LParenLoc; } 1238cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman void setLParenLoc(SourceLocation L) { LParenLoc = L; } 1239987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation getRParenLoc() const { return RParenLoc; } 1240ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig void setRParenLoc(SourceLocation L) { RParenLoc = L; } 12411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1242cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation getLocStart() const LLVM_READONLY; 1243cdd4b78583120222b82148626119b3e80ae1d291Eli Friedman SourceLocation getLocEnd() const LLVM_READONLY; 124465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen 12451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 12461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return T->getStmtClass() == CXXFunctionalCastExprClass; 1247987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis } 1248987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}; 1249987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1250506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// @brief Represents a C++ functional cast expression that builds a 1251506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// temporary object. 1252506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// 12531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// This expression type represents a C++ "functional" cast 1254506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// (C++[expr.type.conv]) with N != 1 arguments that invokes a 1255ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// constructor to build a temporary object. With N == 1 arguments the 1256ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor/// functional cast expression will be represented by CXXFunctionalCastExpr. 1257506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// Example: 1258010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 1259506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// struct X { X(int, float); } 1260506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// 1261506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// X create_X() { 1262506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// return X(1, 3.14f); // creates a CXXTemporaryObjectExpr 1263506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor/// }; 1264010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 1265524fa13fd81e88533c7a1d4b1232c0de2c97dc7cAnders Carlssonclass CXXTemporaryObjectExpr : public CXXConstructExpr { 1266ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *Type; 1267506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 1268506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregorpublic: 126932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXTemporaryObjectExpr(const ASTContext &C, CXXConstructorDecl *Cons, 1270ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *Type, 12713b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr *> Args, 12721245a54ca6e9c5b14196461dc3f84b24ea6594b1Enea Zaffanella SourceRange ParenOrBraceRange, 12737cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara bool HadMultipleCandidates, 1274c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith bool ListInitialization, 1275c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith bool ZeroInitialization); 12766d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis explicit CXXTemporaryObjectExpr(EmptyShell Empty) 1277ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor : CXXConstructExpr(CXXTemporaryObjectExprClass, Empty), Type() { } 1278506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 1279ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *getTypeSourceInfo() const { return Type; } 1280ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor 128165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY; 128265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY; 1283ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 12841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 1285506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor return T->getStmtClass() == CXXTemporaryObjectExprClass; 1286506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor } 12876d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis 128860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 1289506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor}; 1290506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 129101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// \brief A C++ lambda expression, which produces a function object 129201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// (of unspecified type) that can be invoked later. 129301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// 129401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// Example: 129501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// \code 129601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// void low_pass_filter(std::vector<double> &values, double cutoff) { 129701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// values.erase(std::remove_if(values.begin(), values.end(), 1298d9ffa0c39ff9c71e2729eac4cdcf32b377c1d3b6Dmitri Gribenko/// [=](double value) { return value > cutoff; }); 129901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// } 130001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// \endcode 130101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// 1302ddcd660efccd7dcbe42cf1a5759b37ee5619bf9bJames Dennett/// C++11 lambda expressions can capture local variables, either by copying 130301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// the values of those local variables at the time the function 130401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// object is constructed (not when it is called!) or by holding a 130501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// reference to the local variable. These captures can occur either 130601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// implicitly or can be written explicitly between the square 130701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor/// brackets ([...]) that start the lambda expression. 1308ddcd660efccd7dcbe42cf1a5759b37ee5619bf9bJames Dennett/// 1309ddcd660efccd7dcbe42cf1a5759b37ee5619bf9bJames Dennett/// C++1y introduces a new form of "capture" called an init-capture that 1310ddcd660efccd7dcbe42cf1a5759b37ee5619bf9bJames Dennett/// includes an initializing expression (rather than capturing a variable), 1311ddcd660efccd7dcbe42cf1a5759b37ee5619bf9bJames Dennett/// and which can never occur implicitly. 131201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregorclass LambdaExpr : public Expr { 131301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief The source range that covers the lambda introducer ([...]). 131401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor SourceRange IntroducerRange; 131501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1316f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett /// \brief The source location of this lambda's capture-default ('=' or '&'). 1317f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett SourceLocation CaptureDefaultLoc; 1318f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett 13197ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor /// \brief The number of captures. 13207ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor unsigned NumCaptures : 16; 13217ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 132201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief The default capture kind, which is a value of type 132301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// LambdaCaptureDefault. 132401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor unsigned CaptureDefault : 2; 132501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 132601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Whether this lambda had an explicit parameter list vs. an 132701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// implicit (and empty) parameter list. 132801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor unsigned ExplicitParams : 1; 132901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1330dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor /// \brief Whether this lambda had the result type explicitly specified. 1331dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor unsigned ExplicitResultType : 1; 1332dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor 1333dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor /// \brief Whether there are any array index variables stored at the end of 1334dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor /// this lambda expression. 13357ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor unsigned HasArrayIndexVars : 1; 13367ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 133701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief The location of the closing brace ('}') that completes 133801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// the lambda. 133901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// 134001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// The location of the brace is also available by looking up the 134101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// function call operator in the lambda class. However, it is 134201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// stored here to improve the performance of getSourceRange(), and 134301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// to avoid having to deserialize the function call operator from a 134401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// module file just to determine the source range. 134501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor SourceLocation ClosingBrace; 134601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 13477ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor // Note: The capture initializers are stored directly after the lambda 13487ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor // expression, along with the index variables used to initialize by-copy 13497ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor // array captures. 13507ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 13516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef LambdaCapture Capture; 135201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 135301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Construct a lambda expression. 135401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor LambdaExpr(QualType T, SourceRange IntroducerRange, 135501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor LambdaCaptureDefault CaptureDefault, 1356f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett SourceLocation CaptureDefaultLoc, 135701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ArrayRef<Capture> Captures, 135801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor bool ExplicitParams, 1359dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor bool ExplicitResultType, 136001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ArrayRef<Expr *> CaptureInits, 13619daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor ArrayRef<VarDecl *> ArrayIndexVars, 13629daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor ArrayRef<unsigned> ArrayIndexStarts, 1363612409ece080e814f79e06772c690d603f45fbd6Richard Smith SourceLocation ClosingBrace, 1364612409ece080e814f79e06772c690d603f45fbd6Richard Smith bool ContainsUnexpandedParameterPack); 136501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 13669d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor /// \brief Construct an empty lambda expression. 13679d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor LambdaExpr(EmptyShell Empty, unsigned NumCaptures, bool HasArrayIndexVars) 13689d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor : Expr(LambdaExprClass, Empty), 13699d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor NumCaptures(NumCaptures), CaptureDefault(LCD_None), ExplicitParams(false), 13709d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor ExplicitResultType(false), HasArrayIndexVars(true) { 13716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getStoredStmts()[NumCaptures] = nullptr; 13729d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor } 13739d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor 13747ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor Stmt **getStoredStmts() const { 13757ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return reinterpret_cast<Stmt **>(const_cast<LambdaExpr *>(this) + 1); 13767ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor } 13777ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 13787ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor /// \brief Retrieve the mapping from captures to the first array index 13797ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor /// variable. 13807ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor unsigned *getArrayIndexStarts() const { 13817ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return reinterpret_cast<unsigned *>(getStoredStmts() + NumCaptures + 1); 13827ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor } 13837ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 13847ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor /// \brief Retrieve the complete set of array-index variables. 13857ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor VarDecl **getArrayIndexVars() const { 1386a796b6c4b99116ca31e6e61d8765b321678d580eRichard Smith unsigned ArrayIndexSize = 1387a796b6c4b99116ca31e6e61d8765b321678d580eRichard Smith llvm::RoundUpToAlignment(sizeof(unsigned) * (NumCaptures + 1), 1388a796b6c4b99116ca31e6e61d8765b321678d580eRichard Smith llvm::alignOf<VarDecl*>()); 13897ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return reinterpret_cast<VarDecl **>( 139088d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith reinterpret_cast<char*>(getArrayIndexStarts()) + ArrayIndexSize); 13917ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor } 13927ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 139301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregorpublic: 139401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Construct a new lambda expression. 139532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static LambdaExpr *Create(const ASTContext &C, 139601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CXXRecordDecl *Class, 139701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor SourceRange IntroducerRange, 139801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor LambdaCaptureDefault CaptureDefault, 1399f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett SourceLocation CaptureDefaultLoc, 140001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ArrayRef<Capture> Captures, 140101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor bool ExplicitParams, 1402dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor bool ExplicitResultType, 140301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ArrayRef<Expr *> CaptureInits, 14049daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor ArrayRef<VarDecl *> ArrayIndexVars, 14059daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor ArrayRef<unsigned> ArrayIndexStarts, 1406612409ece080e814f79e06772c690d603f45fbd6Richard Smith SourceLocation ClosingBrace, 1407612409ece080e814f79e06772c690d603f45fbd6Richard Smith bool ContainsUnexpandedParameterPack); 140801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 14099d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor /// \brief Construct a new lambda expression that will be deserialized from 14109d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor /// an external source. 141132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static LambdaExpr *CreateDeserialized(const ASTContext &C, 141232b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper unsigned NumCaptures, 14139d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor unsigned NumArrayIndexVars); 1414f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett 141501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Determine the default capture kind for this lambda. 141601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor LambdaCaptureDefault getCaptureDefault() const { 141701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor return static_cast<LambdaCaptureDefault>(CaptureDefault); 141801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 141901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1420f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett /// \brief Retrieve the location of this lambda's capture-default, if any. 1421f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett SourceLocation getCaptureDefaultLoc() const { 1422f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett return CaptureDefaultLoc; 1423f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett } 1424f68af647dda5cca00b49be27d24f62b0a7fff986James Dennett 142501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief An iterator that walks over the captures of the lambda, 142601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// both implicit and explicit. 142701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor typedef const Capture *capture_iterator; 142801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 14296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief An iterator over a range of lambda captures. 14306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef llvm::iterator_range<capture_iterator> capture_range; 14316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 14326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Retrieve this lambda's captures. 14336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines capture_range captures() const; 14346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 143501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing to the first lambda capture. 1436da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator capture_begin() const; 143701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 143801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing past the end of the 143901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// sequence of lambda captures. 1440da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator capture_end() const; 144101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 14427ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor /// \brief Determine the number of captures in this lambda. 14437ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor unsigned capture_size() const { return NumCaptures; } 14446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 14456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Retrieve this lambda's explicit captures. 14466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines capture_range explicit_captures() const; 14477ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor 144801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing to the first explicit 144901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// lambda capture. 1450da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator explicit_capture_begin() const; 145101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 145201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing past the end of the sequence of 145301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// explicit lambda captures. 1454da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator explicit_capture_end() const; 145501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 14566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Retrieve this lambda's implicit captures. 14576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines capture_range implicit_captures() const; 14586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 145901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing to the first implicit 146001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// lambda capture. 1461da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator implicit_capture_begin() const; 146201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 146301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve an iterator pointing past the end of the sequence of 146401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// implicit lambda captures. 1465da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor capture_iterator implicit_capture_end() const; 146601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 146701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Iterator that walks over the capture initialization 146801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// arguments. 146901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor typedef Expr **capture_init_iterator; 147001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 147101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve the first initialization argument for this 147201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// lambda expression (which initializes the first capture field). 14737ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor capture_init_iterator capture_init_begin() const { 14747ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return reinterpret_cast<Expr **>(getStoredStmts()); 14757ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor } 147601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 147701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve the iterator pointing one past the last 147876e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor /// initialization argument for this lambda expression. 14797ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor capture_init_iterator capture_init_end() const { 14807ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return capture_init_begin() + NumCaptures; 14817ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor } 148201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 14839daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor /// \brief Retrieve the set of index variables used in the capture 14849daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor /// initializer of an array captured by copy. 14859daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor /// 14869daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor /// \param Iter The iterator that points at the capture initializer for 14879daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor /// which we are extracting the corresponding index variables. 14889daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor ArrayRef<VarDecl *> getCaptureInitIndexVars(capture_init_iterator Iter) const; 14899daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor 149001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve the source range covering the lambda introducer, 149101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// which contains the explicit capture list surrounded by square 149201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// brackets ([...]). 149301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor SourceRange getIntroducerRange() const { return IntroducerRange; } 149401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1495010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieve the class that corresponds to the lambda. 1496010bfc253050626435f006386c0bee4b55329687James Dennett /// 1497010bfc253050626435f006386c0bee4b55329687James Dennett /// This is the "closure type" (C++1y [expr.prim.lambda]), and stores the 1498010bfc253050626435f006386c0bee4b55329687James Dennett /// captures in its fields and provides the various operations permitted 1499010bfc253050626435f006386c0bee4b55329687James Dennett /// on a lambda (copying, calling). 150001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CXXRecordDecl *getLambdaClass() const; 150101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 150201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve the function call operator associated with this 150301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// lambda expression. 150401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CXXMethodDecl *getCallOperator() const; 150501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1506fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali /// \brief If this is a generic lambda expression, retrieve the template 1507fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali /// parameter list associated with it, or else return null. 1508fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali TemplateParameterList *getTemplateParameterList() const; 1509fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali 1510fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali /// \brief Whether this is a generic lambda. 1511fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali bool isGenericLambda() const { return getTemplateParameterList(); } 1512fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali 151301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Retrieve the body of the lambda. 15149d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor CompoundStmt *getBody() const; 151501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 151601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Determine whether the lambda is mutable, meaning that any 151701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// captures values can be modified. 151801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor bool isMutable() const; 151901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 152001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// \brief Determine whether this lambda has an explicit parameter 152101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor /// list vs. an implicit (empty) parameter list. 152201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor bool hasExplicitParameters() const { return ExplicitParams; } 152301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1524dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor /// \brief Whether this lambda had its result type explicitly specified. 1525dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor bool hasExplicitResultType() const { return ExplicitResultType; } 15269e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 152701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor static bool classof(const Stmt *T) { 152801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor return T->getStmtClass() == LambdaExprClass; 152901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 153001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 153165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 153265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return IntroducerRange.getBegin(); 153301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 153465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return ClosingBrace; } 153501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 15367ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor child_range children() { 15377ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor return child_range(getStoredStmts(), getStoredStmts() + NumCaptures + 1); 15387ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor } 153901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 154001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor friend class ASTStmtReader; 154101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor friend class ASTStmtWriter; 154201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}; 154301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1544010bfc253050626435f006386c0bee4b55329687James Dennett/// An expression "T()" which creates a value-initialized rvalue of type 1545010bfc253050626435f006386c0bee4b55329687James Dennett/// T, which is a non-class type. See (C++98 [5.2.3p2]). 1546ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregorclass CXXScalarValueInitExpr : public Expr { 1547987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis SourceLocation RParenLoc; 1548ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TypeInfo; 1549987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1550ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor friend class ASTStmtReader; 1551ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1552987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidispublic: 1553ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Create an explicitly-written scalar-value initialization 1554ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor /// expression. 1555ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CXXScalarValueInitExpr(QualType Type, 1556ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *TypeInfo, 1557ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation rParenLoc ) : 1558f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr(CXXScalarValueInitExprClass, Type, VK_RValue, OK_Ordinary, 1559561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor false, false, Type->isInstantiationDependentType(), false), 1560ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor RParenLoc(rParenLoc), TypeInfo(TypeInfo) {} 1561ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor 1562ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor explicit CXXScalarValueInitExpr(EmptyShell Shell) 1563ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor : Expr(CXXScalarValueInitExprClass, Shell) { } 15641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1565ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *getTypeSourceInfo() const { 1566ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor return TypeInfo; 15674c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 1568ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1569ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 15704c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 157165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY; 157265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 15731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 1575ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor return T->getStmtClass() == CXXScalarValueInitExprClass; 1576987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis } 15771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1578987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis // Iterators 157963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 1580987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}; 1581987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1582010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a new-expression for memory allocation and constructor 1583010bfc253050626435f006386c0bee4b55329687James Dennett/// calls, e.g: "new CXXNewExpr(foo)". 15844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlclass CXXNewExpr : public Expr { 1585010bfc253050626435f006386c0bee4b55329687James Dennett /// Contains an optional array size expression, an optional initialization 1586010bfc253050626435f006386c0bee4b55329687James Dennett /// expression, and any number of optional placement arguments, in that order. 15874c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl Stmt **SubExprs; 15880982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Points to the allocation function used. 15894c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl FunctionDecl *OperatorNew; 15900982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Points to the deallocation function used in case of error. May be 15910982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// null. 15924c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl FunctionDecl *OperatorDelete; 15934c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 15941bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor /// \brief The allocated type-source information, as written in the source. 15951bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor TypeSourceInfo *AllocatedTypeInfo; 1596ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1597ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief If the allocated type was expressed as a parenthesized type-id, 15984bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor /// the source range covering the parenthesized type-id. 15994bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor SourceRange TypeIdParens; 1600ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1601530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie /// \brief Range of the entire new expression. 1602530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie SourceRange Range; 16032aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 16042aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// \brief Source-range of a paren-delimited initializer. 16052aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SourceRange DirectInitRange; 16064c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1607010bfc253050626435f006386c0bee4b55329687James Dennett /// Was the usage ::new, i.e. is the global new to be used? 1608d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer bool GlobalNew : 1; 1609010bfc253050626435f006386c0bee4b55329687James Dennett /// Do we allocate an array? If so, the first SubExpr is the size expression. 1610d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer bool Array : 1; 1611010bfc253050626435f006386c0bee4b55329687James Dennett /// If this is an array allocation, does the usual deallocation 1612010bfc253050626435f006386c0bee4b55329687James Dennett /// function for the allocated type want to know the allocated size? 1613d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer bool UsualArrayDeleteWantsSize : 1; 1614010bfc253050626435f006386c0bee4b55329687James Dennett /// The number of placement new arguments. 1615d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer unsigned NumPlacementArgs : 13; 1616010bfc253050626435f006386c0bee4b55329687James Dennett /// What kind of initializer do we have? Could be none, parens, or braces. 1617010bfc253050626435f006386c0bee4b55329687James Dennett /// In storage, we distinguish between "none, and no initializer expr", and 1618010bfc253050626435f006386c0bee4b55329687James Dennett /// "none, but an implicit initializer expr". 1619d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer unsigned StoredInitializationStyle : 2; 1620d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer 162160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl friend class ASTStmtReader; 16222aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl friend class ASTStmtWriter; 16234c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlpublic: 16242aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl enum InitializationStyle { 16252aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl NoInit, ///< New-expression has no initializer as written. 16262aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl CallInit, ///< New-expression has a C++98 paren-delimited initializer. 16272aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl ListInit ///< New-expression has a C++11 list-initializer. 16282aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl }; 16292aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl 163032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXNewExpr(const ASTContext &C, bool globalNew, FunctionDecl *operatorNew, 16311548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl FunctionDecl *operatorDelete, bool usualArrayDeleteWantsSize, 16323b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> placementArgs, 16332aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SourceRange typeIdParens, Expr *arraySize, 16342aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl InitializationStyle initializationStyle, Expr *initializer, 16356ec278d1a354517e20f13a877481453ee7940c78John McCall QualType ty, TypeSourceInfo *AllocatedTypeInfo, 1636530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie SourceRange Range, SourceRange directInitRange); 16375921863d8f24084797863b5df37842113bac4352Chris Lattner explicit CXXNewExpr(EmptyShell Shell) 16386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(CXXNewExprClass, Shell), SubExprs(nullptr) { } 16395921863d8f24084797863b5df37842113bac4352Chris Lattner 164032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper void AllocateArgsArray(const ASTContext &C, bool isArray, 164132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper unsigned numPlaceArgs, bool hasInitializer); 1642ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1643cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl QualType getAllocatedType() const { 1644cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl assert(getType()->isPointerType()); 16456217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek return getType()->getAs<PointerType>()->getPointeeType(); 1646cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl } 16474c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 16481bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor TypeSourceInfo *getAllocatedTypeSourceInfo() const { 16491bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor return AllocatedTypeInfo; 16501bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor } 1651c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 1652c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// \brief True if the allocation result needs to be null-checked. 1653010bfc253050626435f006386c0bee4b55329687James Dennett /// 1654010bfc253050626435f006386c0bee4b55329687James Dennett /// C++11 [expr.new]p13: 1655c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// If the allocation function returns null, initialization shall 1656c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// not be done, the deallocation function shall not be called, 1657c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// and the value of the new-expression shall be null. 1658010bfc253050626435f006386c0bee4b55329687James Dennett /// 1659c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// An allocation function is not allowed to return null unless it 1660c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// has a non-throwing exception-specification. The '03 rule is 1661c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// identical except that the definition of a non-throwing 1662c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall /// exception specification is just "is it throw()?". 166332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper bool shouldNullCheckAllocation(const ASTContext &Ctx) const; 1664ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 16654c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl FunctionDecl *getOperatorNew() const { return OperatorNew; } 16665921863d8f24084797863b5df37842113bac4352Chris Lattner void setOperatorNew(FunctionDecl *D) { OperatorNew = D; } 16674c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl FunctionDecl *getOperatorDelete() const { return OperatorDelete; } 16685921863d8f24084797863b5df37842113bac4352Chris Lattner void setOperatorDelete(FunctionDecl *D) { OperatorDelete = D; } 16694c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1670cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl bool isArray() const { return Array; } 1671cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl Expr *getArraySize() { 16726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Array ? cast<Expr>(SubExprs[0]) : nullptr; 1673cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl } 1674cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl const Expr *getArraySize() const { 16756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Array ? cast<Expr>(SubExprs[0]) : nullptr; 1676cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl } 1677cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl 16784c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl unsigned getNumPlacementArgs() const { return NumPlacementArgs; } 1679ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie Expr **getPlacementArgs() { 16802aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return reinterpret_cast<Expr **>(SubExprs + Array + hasInitializer()); 1681aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor } 1682ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 16834c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl Expr *getPlacementArg(unsigned i) { 16844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl assert(i < NumPlacementArgs && "Index out of range"); 16852aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return getPlacementArgs()[i]; 16864c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 16874c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const Expr *getPlacementArg(unsigned i) const { 16884c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl assert(i < NumPlacementArgs && "Index out of range"); 16892aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return const_cast<CXXNewExpr*>(this)->getPlacementArg(i); 16904c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 16914c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 16924bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor bool isParenTypeId() const { return TypeIdParens.isValid(); } 16934bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor SourceRange getTypeIdParens() const { return TypeIdParens; } 16944bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor 16954c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl bool isGlobalNew() const { return GlobalNew; } 16967cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara 16972aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// \brief Whether this new-expression has any initializer at all. 16982aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl bool hasInitializer() const { return StoredInitializationStyle > 0; } 16991548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl 17002aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// \brief The kind of initializer this new-expression has. 17012aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl InitializationStyle getInitializationStyle() const { 17022aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl if (StoredInitializationStyle == 0) 17032aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return NoInit; 17042aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return static_cast<InitializationStyle>(StoredInitializationStyle-1); 17051548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl } 17061548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl 17072aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// \brief The initializer of this new-expression. 17082aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl Expr *getInitializer() { 17096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return hasInitializer() ? cast<Expr>(SubExprs[Array]) : nullptr; 17101548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl } 17112aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl const Expr *getInitializer() const { 17126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return hasInitializer() ? cast<Expr>(SubExprs[Array]) : nullptr; 17131548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl } 17141548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl 1715010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Returns the CXXConstructExpr from this new-expression, or null. 171688920d1a84dc63a3722b1f2b1fb5926c44bd81abRoman Divacky const CXXConstructExpr* getConstructExpr() const { 1717feb1f4a0a71868a271fa284dadfda7a2beeaccffMatt Beaumont-Gay return dyn_cast_or_null<CXXConstructExpr>(getInitializer()); 1718feb1f4a0a71868a271fa284dadfda7a2beeaccffMatt Beaumont-Gay } 1719feb1f4a0a71868a271fa284dadfda7a2beeaccffMatt Beaumont-Gay 17202aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// Answers whether the usual array deallocation function for the 17212aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// allocated type expects the size of the allocation as a 17222aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl /// parameter. 17232aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl bool doesUsualArrayDeleteWantSize() const { 17242aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return UsualArrayDeleteWantsSize; 17252aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl } 17261548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl 17274c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl typedef ExprIterator arg_iterator; 17284c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl typedef ConstExprIterator const_arg_iterator; 17294c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 17304c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl arg_iterator placement_arg_begin() { 17312aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer(); 17324c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 17334c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl arg_iterator placement_arg_end() { 17342aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer() + getNumPlacementArgs(); 17354c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 17364c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const_arg_iterator placement_arg_begin() const { 17372aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer(); 17384c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 17394c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const_arg_iterator placement_arg_end() const { 17402aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer() + getNumPlacementArgs(); 17414c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 1742ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 17435921863d8f24084797863b5df37842113bac4352Chris Lattner typedef Stmt **raw_arg_iterator; 17445921863d8f24084797863b5df37842113bac4352Chris Lattner raw_arg_iterator raw_arg_begin() { return SubExprs; } 17455921863d8f24084797863b5df37842113bac4352Chris Lattner raw_arg_iterator raw_arg_end() { 17462aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer() + getNumPlacementArgs(); 17475921863d8f24084797863b5df37842113bac4352Chris Lattner } 17485921863d8f24084797863b5df37842113bac4352Chris Lattner const_arg_iterator raw_arg_begin() const { return SubExprs; } 17492aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl const_arg_iterator raw_arg_end() const { 17502aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return SubExprs + Array + hasInitializer() + getNumPlacementArgs(); 17512aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl } 17524c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1753530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie SourceLocation getStartLoc() const { return Range.getBegin(); } 1754530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie SourceLocation getEndLoc() const { return Range.getEnd(); } 1755428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth 17562aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl SourceRange getDirectInitRange() const { return DirectInitRange; } 1757428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth 1758aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar SourceRange getSourceRange() const LLVM_READONLY { 1759530564196fe7e2e30fbc2b0edae45975447583e0David Blaikie return Range; 17604c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 176165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return getStartLoc(); } 176265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); } 17634c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 17644c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl static bool classof(const Stmt *T) { 17654c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl return T->getStmtClass() == CXXNewExprClass; 17664c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 17674c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 17684c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // Iterators 176963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 17702aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl return child_range(raw_arg_begin(), raw_arg_end()); 177163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 17724c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}; 17734c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 17740982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief Represents a \c delete expression for memory deallocation and 17750982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// destructor calls, e.g. "delete[] pArray". 17764c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlclass CXXDeleteExpr : public Expr { 1777010bfc253050626435f006386c0bee4b55329687James Dennett /// Points to the operator delete overload that is used. Could be a member. 1778d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer FunctionDecl *OperatorDelete; 1779010bfc253050626435f006386c0bee4b55329687James Dennett /// The pointer expression to be deleted. 1780d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer Stmt *Argument; 1781010bfc253050626435f006386c0bee4b55329687James Dennett /// Location of the expression. 1782d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer SourceLocation Loc; 1783010bfc253050626435f006386c0bee4b55329687James Dennett /// Is this a forced global delete, i.e. "::delete"? 17844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl bool GlobalDelete : 1; 1785010bfc253050626435f006386c0bee4b55329687James Dennett /// Is this the array form of delete, i.e. "delete[]"? 17864c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl bool ArrayForm : 1; 1787010bfc253050626435f006386c0bee4b55329687James Dennett /// ArrayFormAsWritten can be different from ArrayForm if 'delete' is applied 1788010bfc253050626435f006386c0bee4b55329687James Dennett /// to pointer-to-array type (ArrayFormAsWritten will be false while ArrayForm 1789010bfc253050626435f006386c0bee4b55329687James Dennett /// will be true). 17904076dacf1497fb95cb298b9d964fbdbdaf9bde6cArgyrios Kyrtzidis bool ArrayFormAsWritten : 1; 1791010bfc253050626435f006386c0bee4b55329687James Dennett /// Does the usual deallocation function for the element type require 1792010bfc253050626435f006386c0bee4b55329687James Dennett /// a size_t argument? 17936ec278d1a354517e20f13a877481453ee7940c78John McCall bool UsualArrayDeleteWantsSize : 1; 17944c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlpublic: 17954c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl CXXDeleteExpr(QualType ty, bool globalDelete, bool arrayForm, 17966ec278d1a354517e20f13a877481453ee7940c78John McCall bool arrayFormAsWritten, bool usualArrayDeleteWantsSize, 17976ec278d1a354517e20f13a877481453ee7940c78John McCall FunctionDecl *operatorDelete, Expr *arg, SourceLocation loc) 1798bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor : Expr(CXXDeleteExprClass, ty, VK_RValue, OK_Ordinary, false, false, 1799561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor arg->isInstantiationDependent(), 1800bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor arg->containsUnexpandedParameterPack()), 1801d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer OperatorDelete(operatorDelete), Argument(arg), Loc(loc), 1802f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall GlobalDelete(globalDelete), 18034076dacf1497fb95cb298b9d964fbdbdaf9bde6cArgyrios Kyrtzidis ArrayForm(arrayForm), ArrayFormAsWritten(arrayFormAsWritten), 1804d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize) { } 180595fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis explicit CXXDeleteExpr(EmptyShell Shell) 18066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(CXXDeleteExprClass, Shell), OperatorDelete(nullptr), 18076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Argument(nullptr) {} 18084c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 18094c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl bool isGlobalDelete() const { return GlobalDelete; } 18104c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl bool isArrayForm() const { return ArrayForm; } 18114076dacf1497fb95cb298b9d964fbdbdaf9bde6cArgyrios Kyrtzidis bool isArrayFormAsWritten() const { return ArrayFormAsWritten; } 18124c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 18136ec278d1a354517e20f13a877481453ee7940c78John McCall /// Answers whether the usual array deallocation function for the 18146ec278d1a354517e20f13a877481453ee7940c78John McCall /// allocated type expects the size of the allocation as a 18156ec278d1a354517e20f13a877481453ee7940c78John McCall /// parameter. This can be true even if the actual deallocation 18166ec278d1a354517e20f13a877481453ee7940c78John McCall /// function that we're using doesn't want a size. 18176ec278d1a354517e20f13a877481453ee7940c78John McCall bool doesUsualArrayDeleteWantSize() const { 18186ec278d1a354517e20f13a877481453ee7940c78John McCall return UsualArrayDeleteWantsSize; 18196ec278d1a354517e20f13a877481453ee7940c78John McCall } 18206ec278d1a354517e20f13a877481453ee7940c78John McCall 18214c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl FunctionDecl *getOperatorDelete() const { return OperatorDelete; } 18224c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 18234c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl Expr *getArgument() { return cast<Expr>(Argument); } 18244c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl const Expr *getArgument() const { return cast<Expr>(Argument); } 18254c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1826010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieve the type being destroyed. 1827010bfc253050626435f006386c0bee4b55329687James Dennett /// 1828010bfc253050626435f006386c0bee4b55329687James Dennett /// If the type being destroyed is a dependent type which may or may not 1829010bfc253050626435f006386c0bee4b55329687James Dennett /// be a pointer, return an invalid type. 18305833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor QualType getDestroyedType() const; 1831ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 183265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 183365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY {return Argument->getLocEnd();} 18344c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 18354c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl static bool classof(const Stmt *T) { 18364c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl return T->getStmtClass() == CXXDeleteExprClass; 18374c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 18384c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 18394c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl // Iterators 184063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Argument, &Argument+1); } 1841f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis 1842f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis friend class ASTStmtReader; 18434c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}; 18444c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 18450982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief Stores the type being destroyed by a pseudo-destructor expression. 1846a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregorclass PseudoDestructorTypeStorage { 1847ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Either the type source information or the name of the type, if 1848a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// it couldn't be resolved due to type-dependence. 1849a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor llvm::PointerUnion<TypeSourceInfo *, IdentifierInfo *> Type; 1850ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1851a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// \brief The starting source location of the pseudo-destructor type. 1852a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SourceLocation Location; 1853ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1854a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregorpublic: 1855a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage() { } 1856ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1857a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage(IdentifierInfo *II, SourceLocation Loc) 1858a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor : Type(II), Location(Loc) { } 1859ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1860a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage(TypeSourceInfo *Info); 1861ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1862ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *getTypeSourceInfo() const { 1863ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return Type.dyn_cast<TypeSourceInfo *>(); 1864a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 1865ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1866a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor IdentifierInfo *getIdentifier() const { 1867a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return Type.dyn_cast<IdentifierInfo *>(); 1868a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 1869ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1870a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor SourceLocation getLocation() const { return Location; } 1871a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor}; 1872ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1873a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// \brief Represents a C++ pseudo-destructor (C++ [expr.pseudo]). 1874a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// 1875e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// A pseudo-destructor is an expression that looks like a member access to a 1876ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// destructor of a scalar type, except that scalar types don't have 1877e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// destructors. For example: 1878e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// 1879e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// \code 1880e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// typedef int T; 1881e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// void f(int *p) { 1882e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// p->T::~T(); 1883e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// } 1884e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// \endcode 1885a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// 1886e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// Pseudo-destructors typically occur when instantiating templates such as: 1887ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// 1888a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// \code 18891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// template<typename T> 1890a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// void destroy(T* ptr) { 1891e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// ptr->T::~T(); 1892a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// } 1893a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// \endcode 1894a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor/// 1895e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// for scalar types. A pseudo-destructor expression has no run-time semantics 1896e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor/// beyond evaluating the base expression. 1897a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorclass CXXPseudoDestructorExpr : public Expr { 1898a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief The base expression (that is being destroyed). 1899a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Stmt *Base; 19001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1901a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Whether the operator was an arrow ('->'); otherwise, it was a 1902a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// period ('.'). 1903a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool IsArrow : 1; 19041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1905a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief The location of the '.' or '->' operator. 1906a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc; 1907ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1908a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief The nested-name-specifier that follows the operator, if present. 1909f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 19101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1911e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// \brief The type that precedes the '::' in a qualified pseudo-destructor 1912e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// expression. 1913e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor TypeSourceInfo *ScopeType; 1914ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1915ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief The location of the '::' in a qualified pseudo-destructor 1916e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// expression. 1917e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor SourceLocation ColonColonLoc; 1918ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1919fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor /// \brief The location of the '~'. 1920fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc; 1921ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1922ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief The type being destroyed, or its name if we were unable to 1923a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// resolve the name. 1924a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor PseudoDestructorTypeStorage DestroyedType; 19251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1926f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor friend class ASTStmtReader; 1927ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1928a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorpublic: 192932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXPseudoDestructorExpr(const ASTContext &Context, 1930a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Expr *Base, bool isArrow, SourceLocation OperatorLoc, 1931f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 1932e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor TypeSourceInfo *ScopeType, 1933e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor SourceLocation ColonColonLoc, 1934fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation TildeLoc, 1935e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall PseudoDestructorTypeStorage DestroyedType); 19361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1937de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis explicit CXXPseudoDestructorExpr(EmptyShell Shell) 1938de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis : Expr(CXXPseudoDestructorExprClass, Shell), 19396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Base(nullptr), IsArrow(false), QualifierLoc(), ScopeType(nullptr) { } 1940de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis 1941a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Expr *getBase() const { return cast<Expr>(Base); } 19421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Determines whether this member expression actually had 1944a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// a C++ nested-name-specifier prior to the name of the member, e.g., 1945a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// x->Base::foo. 19467247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie bool hasQualifier() const { return QualifierLoc.hasQualifier(); } 19471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1948f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor /// \brief Retrieves the nested-name-specifier that qualifies the type name, 1949f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor /// with source-location information. 1950f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; } 1951ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 19521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief If the member name was qualified, retrieves the 1953a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// nested-name-specifier that precedes the member name. Otherwise, returns 1954010bfc253050626435f006386c0bee4b55329687James Dennett /// null. 1955ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie NestedNameSpecifier *getQualifier() const { 1956ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return QualifierLoc.getNestedNameSpecifier(); 1957f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor } 19581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1959a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Determine whether this pseudo-destructor expression was written 1960a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// using an '->' (otherwise, it used a '.'). 1961a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow() const { return IsArrow; } 1962a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 1963a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Retrieve the location of the '.' or '->' operator. 1964a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation getOperatorLoc() const { return OperatorLoc; } 19651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1966ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Retrieve the scope type in a qualified pseudo-destructor 1967e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// expression. 1968e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// 1969e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// Pseudo-destructor expressions can have extra qualification within them 1970e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// that is not part of the nested-name-specifier, e.g., \c p->T::~T(). 1971e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// Here, if the object type of the expression is (or may be) a scalar type, 1972ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \p T may also be a scalar type and, therefore, cannot be part of a 1973e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// nested-name-specifier. It is stored as the "scope type" of the pseudo- 1974e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// destructor expression. 197526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor TypeSourceInfo *getScopeTypeInfo() const { return ScopeType; } 1976ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1977e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// \brief Retrieve the location of the '::' in a qualified pseudo-destructor 1978e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor /// expression. 1979e0601ea1220348957dacec5f3dd0707837365290Douglas Gregor SourceLocation getColonColonLoc() const { return ColonColonLoc; } 1980ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1981fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor /// \brief Retrieve the location of the '~'. 1982fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor SourceLocation getTildeLoc() const { return TildeLoc; } 1983ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 198426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /// \brief Retrieve the source location information for the type 198526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor /// being destroyed. 1986a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// 1987ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// This type-source information is available for non-dependent 1988a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// pseudo-destructor expressions and some dependent pseudo-destructor 1989010bfc253050626435f006386c0bee4b55329687James Dennett /// expressions. Returns null if we only have the identifier for a 1990a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// dependent pseudo-destructor expression. 1991ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TypeSourceInfo *getDestroyedTypeInfo() const { 1992ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return DestroyedType.getTypeSourceInfo(); 1993a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 1994ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1995a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// \brief In a dependent pseudo-destructor expression for which we do not 1996a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// have full type information on the destroyed type, provides the name 1997a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// of the destroyed type. 1998a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor IdentifierInfo *getDestroyedTypeIdentifier() const { 1999a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor return DestroyedType.getIdentifier(); 2000a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 2001ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2002a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// \brief Retrieve the type being destroyed. 2003a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor QualType getDestroyedType() const; 2004ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2005a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor /// \brief Retrieve the starting location of the type being destroyed. 2006ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie SourceLocation getDestroyedTypeLoc() const { 2007ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return DestroyedType.getLocation(); 2008a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor } 20091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2010de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis /// \brief Set the name of destroyed type for a dependent pseudo-destructor 2011de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis /// expression. 2012de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis void setDestroyedType(IdentifierInfo *II, SourceLocation Loc) { 2013de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis DestroyedType = PseudoDestructorTypeStorage(II, Loc); 2014de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis } 2015de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis 2016de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis /// \brief Set the destroyed type. 2017de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis void setDestroyedType(TypeSourceInfo *Info) { 2018de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis DestroyedType = PseudoDestructorTypeStorage(Info); 2019de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis } 2020de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis 202165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY {return Base->getLocStart();} 202265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY; 20231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 2025a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return T->getStmtClass() == CXXPseudoDestructorExprClass; 2026a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 20271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2028a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor // Iterators 202963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Base, &Base + 1); } 2030a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}; 20311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20324ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// \brief A type trait used in the implementation of various C++11 and 20334ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// Library TR1 trait templates. 20344ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// 20354ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// \code 2036651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// __is_pod(int) == true 2037651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// __is_enum(std::string) == false 20384ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// __is_trivially_constructible(vector<int>, int*, int*) 20394ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor/// \endcode 20404ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregorclass TypeTraitExpr : public Expr { 20414ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief The location of the type trait keyword. 20424ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation Loc; 20434ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20444ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief The location of the closing parenthesis. 20454ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation RParenLoc; 20464ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20474ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor // Note: The TypeSourceInfos for the arguments are allocated after the 20484ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor // TypeTraitExpr. 20494ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20504ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind, 20514ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor ArrayRef<TypeSourceInfo *> Args, 20524ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation RParenLoc, 20534ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor bool Value); 20544ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20554ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeTraitExpr(EmptyShell Empty) : Expr(TypeTraitExprClass, Empty) { } 20564ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20574ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Retrieve the argument types. 20584ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeSourceInfo **getTypeSourceInfos() { 20594ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return reinterpret_cast<TypeSourceInfo **>(this+1); 20604ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 20614ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20624ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Retrieve the argument types. 20634ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeSourceInfo * const *getTypeSourceInfos() const { 20644ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return reinterpret_cast<TypeSourceInfo * const*>(this+1); 20654ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 20664ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20674ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregorpublic: 20684ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Create a new type trait expression. 206932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static TypeTraitExpr *Create(const ASTContext &C, QualType T, 207032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper SourceLocation Loc, TypeTrait Kind, 20714ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor ArrayRef<TypeSourceInfo *> Args, 20724ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor SourceLocation RParenLoc, 20734ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor bool Value); 20744ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 207532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static TypeTraitExpr *CreateDeserialized(const ASTContext &C, 207632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper unsigned NumArgs); 20774ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20784ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Determine which type trait this expression uses. 20794ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeTrait getTrait() const { 20804ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return static_cast<TypeTrait>(TypeTraitExprBits.Kind); 20814ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 20824ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20834ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor bool getValue() const { 20844ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor assert(!isValueDependent()); 20854ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return TypeTraitExprBits.Value; 20864ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 20874ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20884ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Determine the number of arguments to this type trait. 20894ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor unsigned getNumArgs() const { return TypeTraitExprBits.NumArgs; } 20904ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20914ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Retrieve the Ith argument. 20924ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TypeSourceInfo *getArg(unsigned I) const { 20934ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor assert(I < getNumArgs() && "Argument out-of-range"); 20944ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return getArgs()[I]; 20954ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 20964ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 20974ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor /// \brief Retrieve the argument types. 20984ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor ArrayRef<TypeSourceInfo *> getArgs() const { 20994ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return ArrayRef<TypeSourceInfo *>(getTypeSourceInfos(), getNumArgs()); 21004ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 21014ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 21024ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor typedef TypeSourceInfo **arg_iterator; 21034ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor arg_iterator arg_begin() { 21044ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return getTypeSourceInfos(); 21054ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 21064ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor arg_iterator arg_end() { 21074ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return getTypeSourceInfos() + getNumArgs(); 21084ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 21094ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 21104ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor typedef TypeSourceInfo const * const *arg_const_iterator; 21114ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor arg_const_iterator arg_begin() const { return getTypeSourceInfos(); } 21124ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor arg_const_iterator arg_end() const { 21134ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return getTypeSourceInfos() + getNumArgs(); 21144ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 21154ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 211665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 211765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 211865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen 21194ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor static bool classof(const Stmt *T) { 21204ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor return T->getStmtClass() == TypeTraitExprClass; 21214ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 21224ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 21234ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor // Iterators 21244ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor child_range children() { return child_range(); } 21254ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 21264ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor friend class ASTStmtReader; 21274ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor friend class ASTStmtWriter; 21284ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 21294ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}; 2130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 21310982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief An Embarcadero array type trait, as used in the implementation of 21320982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// __array_rank and __array_extent. 21330982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// 213421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley/// Example: 2135010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 21360982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// __array_rank(int[10][20]) == 2 21370982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// __array_extent(int, 1) == 20 2138010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 213921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleyclass ArrayTypeTraitExpr : public Expr { 214099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 214199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 21420982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The trait. An ArrayTypeTrait enum in MSVC compat unsigned. 214321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley unsigned ATT : 2; 214421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 21450982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The value of the type trait. Unspecified if dependent. 214621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley uint64_t Value; 214721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 21480982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The array dimension being queried, or -1 if not used. 214921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley Expr *Dimension; 215021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 21510982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The location of the type trait keyword. 215221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley SourceLocation Loc; 215321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 21540982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The location of the closing paren. 215521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley SourceLocation RParen; 215621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 21570982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The type being queried. 215821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley TypeSourceInfo *QueriedType; 215921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 216021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleypublic: 216121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley ArrayTypeTraitExpr(SourceLocation loc, ArrayTypeTrait att, 216221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley TypeSourceInfo *queried, uint64_t value, 216321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley Expr *dimension, SourceLocation rparen, QualType ty) 216421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley : Expr(ArrayTypeTraitExprClass, ty, VK_RValue, OK_Ordinary, 216521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley false, queried->getType()->isDependentType(), 2166561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (queried->getType()->isInstantiationDependentType() || 2167561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor (dimension && dimension->isInstantiationDependent())), 216821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley queried->getType()->containsUnexpandedParameterPack()), 216921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley ATT(att), Value(value), Dimension(dimension), 217021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley Loc(loc), RParen(rparen), QueriedType(queried) { } 217121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 217221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 217321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley explicit ArrayTypeTraitExpr(EmptyShell Empty) 217421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley : Expr(ArrayTypeTraitExprClass, Empty), ATT(0), Value(false), 217521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley QueriedType() { } 217621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 217725aaf28c5bec71d5d005df67ee78b908ba5940f4Manuel Klimek virtual ~ArrayTypeTraitExpr() { } 217825aaf28c5bec71d5d005df67ee78b908ba5940f4Manuel Klimek 217965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 218065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParen; } 218121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 218221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley ArrayTypeTrait getTrait() const { return static_cast<ArrayTypeTrait>(ATT); } 218321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 218421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley QualType getQueriedType() const { return QueriedType->getType(); } 218521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 218621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley TypeSourceInfo *getQueriedTypeSourceInfo() const { return QueriedType; } 218721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 218821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley uint64_t getValue() const { assert(!isTypeDependent()); return Value; } 218921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 219021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley Expr *getDimensionExpression() const { return Dimension; } 219121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 219221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley static bool classof(const Stmt *T) { 219321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley return T->getStmtClass() == ArrayTypeTraitExprClass; 219421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley } 219521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 219621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley // Iterators 219721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley child_range children() { return child_range(); } 219821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 219921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley friend class ASTStmtReader; 220021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley}; 220121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 22020982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// \brief An expression trait intrinsic. 22030982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// 2204552622067dc45013d240f73952fece703f5e63bdJohn Wiegley/// Example: 2205010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 22060982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// __is_lvalue_expr(std::cout) == true 22070982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// __is_lvalue_expr(1) == false 2208010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 2209552622067dc45013d240f73952fece703f5e63bdJohn Wiegleyclass ExpressionTraitExpr : public Expr { 2210010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief The trait. A ExpressionTrait enum in MSVC compatible unsigned. 2211552622067dc45013d240f73952fece703f5e63bdJohn Wiegley unsigned ET : 31; 22120982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The value of the type trait. Unspecified if dependent. 2213552622067dc45013d240f73952fece703f5e63bdJohn Wiegley bool Value : 1; 2214552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 22150982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The location of the type trait keyword. 2216552622067dc45013d240f73952fece703f5e63bdJohn Wiegley SourceLocation Loc; 2217552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 22180982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The location of the closing paren. 2219552622067dc45013d240f73952fece703f5e63bdJohn Wiegley SourceLocation RParen; 2220552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 22210982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The expression being queried. 2222552622067dc45013d240f73952fece703f5e63bdJohn Wiegley Expr* QueriedExpression; 2223552622067dc45013d240f73952fece703f5e63bdJohn Wiegleypublic: 2224ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie ExpressionTraitExpr(SourceLocation loc, ExpressionTrait et, 2225552622067dc45013d240f73952fece703f5e63bdJohn Wiegley Expr *queried, bool value, 2226552622067dc45013d240f73952fece703f5e63bdJohn Wiegley SourceLocation rparen, QualType resultType) 2227552622067dc45013d240f73952fece703f5e63bdJohn Wiegley : Expr(ExpressionTraitExprClass, resultType, VK_RValue, OK_Ordinary, 2228552622067dc45013d240f73952fece703f5e63bdJohn Wiegley false, // Not type-dependent 2229552622067dc45013d240f73952fece703f5e63bdJohn Wiegley // Value-dependent if the argument is type-dependent. 2230552622067dc45013d240f73952fece703f5e63bdJohn Wiegley queried->isTypeDependent(), 2231561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor queried->isInstantiationDependent(), 2232552622067dc45013d240f73952fece703f5e63bdJohn Wiegley queried->containsUnexpandedParameterPack()), 2233ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie ET(et), Value(value), Loc(loc), RParen(rparen), 2234ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie QueriedExpression(queried) { } 2235552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2236552622067dc45013d240f73952fece703f5e63bdJohn Wiegley explicit ExpressionTraitExpr(EmptyShell Empty) 2237552622067dc45013d240f73952fece703f5e63bdJohn Wiegley : Expr(ExpressionTraitExprClass, Empty), ET(0), Value(false), 2238552622067dc45013d240f73952fece703f5e63bdJohn Wiegley QueriedExpression() { } 2239552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 224065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 224165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParen; } 2242552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2243552622067dc45013d240f73952fece703f5e63bdJohn Wiegley ExpressionTrait getTrait() const { return static_cast<ExpressionTrait>(ET); } 2244552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2245552622067dc45013d240f73952fece703f5e63bdJohn Wiegley Expr *getQueriedExpression() const { return QueriedExpression; } 2246552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2247552622067dc45013d240f73952fece703f5e63bdJohn Wiegley bool getValue() const { return Value; } 2248552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2249552622067dc45013d240f73952fece703f5e63bdJohn Wiegley static bool classof(const Stmt *T) { 2250552622067dc45013d240f73952fece703f5e63bdJohn Wiegley return T->getStmtClass() == ExpressionTraitExprClass; 2251552622067dc45013d240f73952fece703f5e63bdJohn Wiegley } 2252552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2253552622067dc45013d240f73952fece703f5e63bdJohn Wiegley // Iterators 2254552622067dc45013d240f73952fece703f5e63bdJohn Wiegley child_range children() { return child_range(); } 2255552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2256552622067dc45013d240f73952fece703f5e63bdJohn Wiegley friend class ASTStmtReader; 2257552622067dc45013d240f73952fece703f5e63bdJohn Wiegley}; 2258552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2259552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 22607bb12da2b0749eeebb21854c77877736969e59f2John McCall/// \brief A reference to an overloaded function set, either an 2261809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett/// \c UnresolvedLookupExpr or an \c UnresolvedMemberExpr. 22627bb12da2b0749eeebb21854c77877736969e59f2John McCallclass OverloadExpr : public Expr { 22630982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief The common name of these declarations. 2264d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer DeclarationNameInfo NameInfo; 2265d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer 2266d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer /// \brief The nested-name-specifier that qualifies the name, if any. 2267d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer NestedNameSpecifierLoc QualifierLoc; 2268d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer 2269ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// The results. These are undesugared, which is to say, they may 22707bb12da2b0749eeebb21854c77877736969e59f2John McCall /// include UsingShadowDecls. Access is relative to the naming 22717bb12da2b0749eeebb21854c77877736969e59f2John McCall /// class. 2272928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor // FIXME: Allocate this data after the OverloadExpr subclass. 2273928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor DeclAccessPair *Results; 2274928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor unsigned NumResults; 2275ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 2276a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidisprotected: 2277e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Whether the name includes info for explicit template 2278e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// keyword and arguments. 2279e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo; 2280e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2281e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Return the optional template keyword and arguments info. 2282e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo(); // defined far below. 2283e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2284e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Return the optional template keyword and arguments info. 2285e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara const ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() const { 2286e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return const_cast<OverloadExpr*>(this)->getTemplateKWAndArgsInfo(); 2287e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 22887bb12da2b0749eeebb21854c77877736969e59f2John McCall 228932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper OverloadExpr(StmtClass K, const ASTContext &C, 22904c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 2291e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 22922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2293bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor const TemplateArgumentListInfo *TemplateArgs, 2294bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor UnresolvedSetIterator Begin, UnresolvedSetIterator End, 2295561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor bool KnownDependent, 2296561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor bool KnownInstantiationDependent, 2297561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor bool KnownContainsUnexpandedParameterPack); 22987bb12da2b0749eeebb21854c77877736969e59f2John McCall 2299a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis OverloadExpr(StmtClass K, EmptyShell Empty) 23006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Expr(K, Empty), QualifierLoc(), Results(nullptr), NumResults(0), 2301d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer HasTemplateKWAndArgsInfo(false) { } 2302a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis 230332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper void initializeResults(const ASTContext &C, 2304bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor UnresolvedSetIterator Begin, 2305bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor UnresolvedSetIterator End); 23067bb12da2b0749eeebb21854c77877736969e59f2John McCall 2307bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorpublic: 23089c72c6088d591ace8503b842d39448c2040f3033John McCall struct FindResult { 23099c72c6088d591ace8503b842d39448c2040f3033John McCall OverloadExpr *Expression; 23109c72c6088d591ace8503b842d39448c2040f3033John McCall bool IsAddressOfOperand; 23119c72c6088d591ace8503b842d39448c2040f3033John McCall bool HasFormOfMemberPointer; 23129c72c6088d591ace8503b842d39448c2040f3033John McCall }; 23139c72c6088d591ace8503b842d39448c2040f3033John McCall 2314010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Finds the overloaded expression in the given expression \p E of 23157bb12da2b0749eeebb21854c77877736969e59f2John McCall /// OverloadTy. 23167bb12da2b0749eeebb21854c77877736969e59f2John McCall /// 23179c72c6088d591ace8503b842d39448c2040f3033John McCall /// \return the expression (which must be there) and true if it has 23189c72c6088d591ace8503b842d39448c2040f3033John McCall /// the particular form of a member pointer expression 23199c72c6088d591ace8503b842d39448c2040f3033John McCall static FindResult find(Expr *E) { 23207bb12da2b0749eeebb21854c77877736969e59f2John McCall assert(E->getType()->isSpecificBuiltinType(BuiltinType::Overload)); 23217bb12da2b0749eeebb21854c77877736969e59f2John McCall 23229c72c6088d591ace8503b842d39448c2040f3033John McCall FindResult Result; 23239c72c6088d591ace8503b842d39448c2040f3033John McCall 23247bb12da2b0749eeebb21854c77877736969e59f2John McCall E = E->IgnoreParens(); 23259c72c6088d591ace8503b842d39448c2040f3033John McCall if (isa<UnaryOperator>(E)) { 23269c72c6088d591ace8503b842d39448c2040f3033John McCall assert(cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf); 23279c72c6088d591ace8503b842d39448c2040f3033John McCall E = cast<UnaryOperator>(E)->getSubExpr(); 23289c72c6088d591ace8503b842d39448c2040f3033John McCall OverloadExpr *Ovl = cast<OverloadExpr>(E->IgnoreParens()); 23299c72c6088d591ace8503b842d39448c2040f3033John McCall 23309c72c6088d591ace8503b842d39448c2040f3033John McCall Result.HasFormOfMemberPointer = (E == Ovl && Ovl->getQualifier()); 23319c72c6088d591ace8503b842d39448c2040f3033John McCall Result.IsAddressOfOperand = true; 23329c72c6088d591ace8503b842d39448c2040f3033John McCall Result.Expression = Ovl; 23339c72c6088d591ace8503b842d39448c2040f3033John McCall } else { 23349c72c6088d591ace8503b842d39448c2040f3033John McCall Result.HasFormOfMemberPointer = false; 23359c72c6088d591ace8503b842d39448c2040f3033John McCall Result.IsAddressOfOperand = false; 23369c72c6088d591ace8503b842d39448c2040f3033John McCall Result.Expression = cast<OverloadExpr>(E); 23379c72c6088d591ace8503b842d39448c2040f3033John McCall } 23389c72c6088d591ace8503b842d39448c2040f3033John McCall 23399c72c6088d591ace8503b842d39448c2040f3033John McCall return Result; 23407bb12da2b0749eeebb21854c77877736969e59f2John McCall } 23417bb12da2b0749eeebb21854c77877736969e59f2John McCall 23420982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Gets the naming class of this lookup, if any. 2343e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall CXXRecordDecl *getNamingClass() const; 2344e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall 23457bb12da2b0749eeebb21854c77877736969e59f2John McCall typedef UnresolvedSetImpl::iterator decls_iterator; 2346928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor decls_iterator decls_begin() const { return UnresolvedSetIterator(Results); } 2347ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie decls_iterator decls_end() const { 2348928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor return UnresolvedSetIterator(Results + NumResults); 2349928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor } 23506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::iterator_range<decls_iterator> decls() const { 23516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return llvm::iterator_range<decls_iterator>(decls_begin(), decls_end()); 23526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2353ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 23540982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Gets the number of declarations in the unresolved set. 2355928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor unsigned getNumDecls() const { return NumResults; } 23567bb12da2b0749eeebb21854c77877736969e59f2John McCall 23570982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Gets the full name info. 23582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &getNameInfo() const { return NameInfo; } 23592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 23600982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Gets the name looked up. 23612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName getName() const { return NameInfo.getName(); } 23627bb12da2b0749eeebb21854c77877736969e59f2John McCall 23630982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Gets the location of the name. 23642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceLocation getNameLoc() const { return NameInfo.getLoc(); } 23657bb12da2b0749eeebb21854c77877736969e59f2John McCall 23660982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Fetches the nested-name qualifier, if one was given. 2367ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie NestedNameSpecifier *getQualifier() const { 2368ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return QualifierLoc.getNestedNameSpecifier(); 23694c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor } 23707bb12da2b0749eeebb21854c77877736969e59f2John McCall 23710982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Fetches the nested-name qualifier with source-location 23720982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// information, if one was given. 23734c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; } 23747bb12da2b0749eeebb21854c77877736969e59f2John McCall 2375e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the template keyword preceding 2376e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// this name, if any. 2377e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getTemplateKeywordLoc() const { 2378e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 2379e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getTemplateKWAndArgsInfo()->getTemplateKeywordLoc(); 2380e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2381e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2382e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the left angle bracket starting the 2383e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the name, if any. 2384e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getLAngleLoc() const { 2385e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 2386e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getTemplateKWAndArgsInfo()->LAngleLoc; 2387e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2388e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2389e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the right angle bracket ending the 2390e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the name, if any. 2391e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getRAngleLoc() const { 2392e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 2393e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getTemplateKWAndArgsInfo()->RAngleLoc; 2394e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 23957bb12da2b0749eeebb21854c77877736969e59f2John McCall 23960982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Determines whether the name was preceded by the template keyword. 2397e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } 2398e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 23990982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Determines whether this expression had explicit template arguments. 2400e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } 2401e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2402e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara // Note that, inconsistently with the explicit-template-argument AST 2403e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara // nodes, users are *forbidden* from calling these methods on objects 2404e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara // without explicit template arguments. 2405e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2406e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ASTTemplateArgumentListInfo &getExplicitTemplateArgs() { 2407e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara assert(hasExplicitTemplateArgs()); 2408e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return *getTemplateKWAndArgsInfo(); 2409e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 24107bb12da2b0749eeebb21854c77877736969e59f2John McCall 2411b0c3e0909bb04af0bfb82ad01ab6909649d68ccaArgyrios Kyrtzidis const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const { 24127bb12da2b0749eeebb21854c77877736969e59f2John McCall return const_cast<OverloadExpr*>(this)->getExplicitTemplateArgs(); 24137bb12da2b0749eeebb21854c77877736969e59f2John McCall } 24147bb12da2b0749eeebb21854c77877736969e59f2John McCall 2415e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara TemplateArgumentLoc const *getTemplateArgs() const { 2416e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getExplicitTemplateArgs().getTemplateArgs(); 2417e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2418e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2419e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara unsigned getNumTemplateArgs() const { 2420e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getExplicitTemplateArgs().NumTemplateArgs; 2421e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2422e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 24230982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// \brief Copies the template arguments into the given structure. 2424e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 2425e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara getExplicitTemplateArgs().copyInto(List); 2426e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2427e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2428096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieves the optional explicit template arguments. 24290982205bade2fb4fc984c27b2ab401e683963b10James Dennett /// 2430096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// This points to the same data as getExplicitTemplateArgs(), but 2431096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// returns null if there are no explicit template arguments. 24327d9f07732b85f1b2989c640065512a6af9a0f49aDmitri Gribenko const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() const { 24336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!hasExplicitTemplateArgs()) return nullptr; 2434096832c5ed5b9106fa177ebc148489760c3bc496John McCall return &getExplicitTemplateArgs(); 24357bb12da2b0749eeebb21854c77877736969e59f2John McCall } 24367bb12da2b0749eeebb21854c77877736969e59f2John McCall 24377bb12da2b0749eeebb21854c77877736969e59f2John McCall static bool classof(const Stmt *T) { 24387bb12da2b0749eeebb21854c77877736969e59f2John McCall return T->getStmtClass() == UnresolvedLookupExprClass || 24397bb12da2b0749eeebb21854c77877736969e59f2John McCall T->getStmtClass() == UnresolvedMemberExprClass; 24407bb12da2b0749eeebb21854c77877736969e59f2John McCall } 24414045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 24424045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtReader; 24434045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtWriter; 24447bb12da2b0749eeebb21854c77877736969e59f2John McCall}; 24457bb12da2b0749eeebb21854c77877736969e59f2John McCall 24467bb12da2b0749eeebb21854c77877736969e59f2John McCall/// \brief A reference to a name which we were able to look up during 24470982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// parsing but could not resolve to a specific declaration. 24480982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// 24490982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// This arises in several ways: 2450010bfc253050626435f006386c0bee4b55329687James Dennett/// * we might be waiting for argument-dependent lookup; 2451010bfc253050626435f006386c0bee4b55329687James Dennett/// * the name might resolve to an overloaded function; 24527bb12da2b0749eeebb21854c77877736969e59f2John McCall/// and eventually: 2453010bfc253050626435f006386c0bee4b55329687James Dennett/// * the lookup might have included a function template. 2454010bfc253050626435f006386c0bee4b55329687James Dennett/// 24550982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// These never include UnresolvedUsingValueDecls, which are always class 24560982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// members and therefore appear only in UnresolvedMemberLookupExprs. 24577bb12da2b0749eeebb21854c77877736969e59f2John McCallclass UnresolvedLookupExpr : public OverloadExpr { 2458ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// True if these lookup results should be extended by 2459ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// argument-dependent lookup if this is the operand of a function 2460ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// call. 2461ba13543329afac4a0d01304ec2ec4924d99306a6John McCall bool RequiresADL; 2462ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 24637453ed4cb2cab113de3378df371b1c6f1243d832John McCall /// True if these lookup results are overloaded. This is pretty 24647453ed4cb2cab113de3378df371b1c6f1243d832John McCall /// trivially rederivable if we urgently need to kill this field. 24657453ed4cb2cab113de3378df371b1c6f1243d832John McCall bool Overloaded; 24667453ed4cb2cab113de3378df371b1c6f1243d832John McCall 24677bb12da2b0749eeebb21854c77877736969e59f2John McCall /// The naming class (C++ [class.access.base]p5) of the lookup, if 24687bb12da2b0749eeebb21854c77877736969e59f2John McCall /// any. This can generally be recalculated from the context chain, 24697bb12da2b0749eeebb21854c77877736969e59f2John McCall /// but that can be fairly expensive for unqualified lookups. If we 24707bb12da2b0749eeebb21854c77877736969e59f2John McCall /// want to improve memory use here, this could go in a union 24717bb12da2b0749eeebb21854c77877736969e59f2John McCall /// against the qualified-lookup bits. 24727bb12da2b0749eeebb21854c77877736969e59f2John McCall CXXRecordDecl *NamingClass; 2473f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 247432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper UnresolvedLookupExpr(const ASTContext &C, 2475928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor CXXRecordDecl *NamingClass, 24764c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 2477e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 24782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2479ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie bool RequiresADL, bool Overloaded, 2480bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor const TemplateArgumentListInfo *TemplateArgs, 2481b1502bcd67fb593a95cbf73ec3814f4015666da0Richard Smith UnresolvedSetIterator Begin, UnresolvedSetIterator End) 2482e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara : OverloadExpr(UnresolvedLookupExprClass, C, QualifierLoc, TemplateKWLoc, 2483e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara NameInfo, TemplateArgs, Begin, End, false, false, false), 2484ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith RequiresADL(RequiresADL), 2485ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith Overloaded(Overloaded), NamingClass(NamingClass) 2486ba13543329afac4a0d01304ec2ec4924d99306a6John McCall {} 2487ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 2488bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis UnresolvedLookupExpr(EmptyShell Empty) 2489bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis : OverloadExpr(UnresolvedLookupExprClass, Empty), 24906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RequiresADL(false), Overloaded(false), NamingClass(nullptr) 2491bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis {} 2492bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis 24934c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor friend class ASTStmtReader; 2494ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2495ba13543329afac4a0d01304ec2ec4924d99306a6John McCallpublic: 249632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static UnresolvedLookupExpr *Create(const ASTContext &C, 2497c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall CXXRecordDecl *NamingClass, 24984c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 24992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 25005a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor bool ADL, bool Overloaded, 2501ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie UnresolvedSetIterator Begin, 2502b1502bcd67fb593a95cbf73ec3814f4015666da0Richard Smith UnresolvedSetIterator End) { 2503e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return new(C) UnresolvedLookupExpr(C, NamingClass, QualifierLoc, 2504e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation(), NameInfo, 25056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ADL, Overloaded, nullptr, Begin, End); 2506ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 2507ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 250832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static UnresolvedLookupExpr *Create(const ASTContext &C, 2509c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall CXXRecordDecl *NamingClass, 25104c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 2511e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 25122577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2513f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall bool ADL, 25149d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara const TemplateArgumentListInfo *Args, 2515ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie UnresolvedSetIterator Begin, 25165a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor UnresolvedSetIterator End); 2517f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 251832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static UnresolvedLookupExpr *CreateEmpty(const ASTContext &C, 2519e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo, 2520bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis unsigned NumTemplateArgs); 2521bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis 2522ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// True if this declaration should be extended by 2523ba13543329afac4a0d01304ec2ec4924d99306a6John McCall /// argument-dependent lookup. 2524ba13543329afac4a0d01304ec2ec4924d99306a6John McCall bool requiresADL() const { return RequiresADL; } 2525ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 25267453ed4cb2cab113de3378df371b1c6f1243d832John McCall /// True if this lookup is overloaded. 25277453ed4cb2cab113de3378df371b1c6f1243d832John McCall bool isOverloaded() const { return Overloaded; } 25287453ed4cb2cab113de3378df371b1c6f1243d832John McCall 2529c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall /// Gets the 'naming class' (in the sense of C++0x 2530c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall /// [class.access.base]p5) of the lookup. This is the scope 2531c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall /// that was looked in to find these results. 2532c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall CXXRecordDecl *getNamingClass() const { return NamingClass; } 2533c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall 253465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 253565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen if (NestedNameSpecifierLoc l = getQualifierLoc()) 253665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return l.getBeginLoc(); 253765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getNameInfo().getLocStart(); 253865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen } 253965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 2540ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie if (hasExplicitTemplateArgs()) 254165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getRAngleLoc(); 254265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getNameInfo().getLocEnd(); 2543ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 2544ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 254563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 2546ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 2547ba13543329afac4a0d01304ec2ec4924d99306a6John McCall static bool classof(const Stmt *T) { 2548ba13543329afac4a0d01304ec2ec4924d99306a6John McCall return T->getStmtClass() == UnresolvedLookupExprClass; 2549ba13543329afac4a0d01304ec2ec4924d99306a6John McCall } 2550ba13543329afac4a0d01304ec2ec4924d99306a6John McCall}; 2551ba13543329afac4a0d01304ec2ec4924d99306a6John McCall 25525953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// \brief A qualified reference to a name whose declaration cannot 25535953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// yet be resolved. 25545953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// 2555ba13543329afac4a0d01304ec2ec4924d99306a6John McCall/// DependentScopeDeclRefExpr is similar to DeclRefExpr in that 2556a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// it expresses a reference to a declaration such as 25575953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// X<T>::value. The difference, however, is that an 2558865d447ac6a4721ab58e898d014a21f2eff74b06John McCall/// DependentScopeDeclRefExpr node is used only within C++ templates when 25595953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// the qualification (e.g., X<T>::) refers to a dependent type. In 25605953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor/// this case, X<T>::value cannot resolve to a declaration because the 25613d9efecfb174a99ffd1f7a6156f7de3ca855993fJames Dennett/// declaration will differ from one instantiation of X<T> to the 2562865d447ac6a4721ab58e898d014a21f2eff74b06John McCall/// next. Therefore, DependentScopeDeclRefExpr keeps track of the 2563ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// qualifier (X<T>::) and the name of the entity being referenced 2564a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// ("value"). Such expressions will instantiate to a DeclRefExpr once the 2565a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor/// declaration can be found. 2566865d447ac6a4721ab58e898d014a21f2eff74b06John McCallclass DependentScopeDeclRefExpr : public Expr { 2567ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor /// \brief The nested-name-specifier that qualifies this unresolved 2568ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor /// declaration name. 256900cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc; 2570ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2571010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief The name of the entity we will be referencing. 257200cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor DeclarationNameInfo NameInfo; 25735953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 2574e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Whether the name includes info for explicit template 2575e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// keyword and arguments. 2576e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo; 2577e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2578e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Return the optional template keyword and arguments info. 2579e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() { 25806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!HasTemplateKWAndArgsInfo) return nullptr; 2581e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return reinterpret_cast<ASTTemplateKWAndArgsInfo*>(this + 1); 2582e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2583e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Return the optional template keyword and arguments info. 2584e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara const ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() const { 2585e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return const_cast<DependentScopeDeclRefExpr*>(this) 2586e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ->getTemplateKWAndArgsInfo(); 2587e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 25881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2589f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall DependentScopeDeclRefExpr(QualType T, 259000cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 2591e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 25922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2593bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor const TemplateArgumentListInfo *Args); 2594f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 2595f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCallpublic: 259632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static DependentScopeDeclRefExpr *Create(const ASTContext &C, 259700cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc QualifierLoc, 2598e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 25992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &NameInfo, 2600e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara const TemplateArgumentListInfo *TemplateArgs); 26015953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 260232b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static DependentScopeDeclRefExpr *CreateEmpty(const ASTContext &C, 2603e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo, 260412dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis unsigned NumTemplateArgs); 260512dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis 26065953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor /// \brief Retrieve the name that this expression refers to. 26072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &getNameInfo() const { return NameInfo; } 26082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 26092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// \brief Retrieve the name that this expression refers to. 26102577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName getDeclName() const { return NameInfo.getName(); } 26115953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 26125953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor /// \brief Retrieve the location of the name within the expression. 26133d9efecfb174a99ffd1f7a6156f7de3ca855993fJames Dennett /// 26143d9efecfb174a99ffd1f7a6156f7de3ca855993fJames Dennett /// For example, in "X<T>::value" this is the location of "value". 26152577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceLocation getLocation() const { return NameInfo.getLoc(); } 26165953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 261700cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor /// \brief Retrieve the nested-name-specifier that qualifies the 261800cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor /// name, with source location information. 261900cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; } 2620ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2621ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor /// \brief Retrieve the nested-name-specifier that qualifies this 2622ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor /// declaration. 2623ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie NestedNameSpecifier *getQualifier() const { 2624ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return QualifierLoc.getNestedNameSpecifier(); 262500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor } 26261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2627e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the template keyword preceding 2628e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// this name, if any. 2629e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getTemplateKeywordLoc() const { 2630e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 2631e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getTemplateKWAndArgsInfo()->getTemplateKeywordLoc(); 2632e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2633e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2634e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the left angle bracket starting the 2635e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the name, if any. 2636e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getLAngleLoc() const { 2637e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 2638e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getTemplateKWAndArgsInfo()->LAngleLoc; 2639e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2640e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2641e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the right angle bracket ending the 2642e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the name, if any. 2643e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getRAngleLoc() const { 2644e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 2645e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getTemplateKWAndArgsInfo()->RAngleLoc; 2646e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2647e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2648e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// Determines whether the name was preceded by the template keyword. 2649e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } 2650e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 2651f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// Determines whether this lookup had explicit template arguments. 2652e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } 26531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2654f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // Note that, inconsistently with the explicit-template-argument AST 2655f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // nodes, users are *forbidden* from calling these methods on objects 2656f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall // without explicit template arguments. 26571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2658b0c3e0909bb04af0bfb82ad01ab6909649d68ccaArgyrios Kyrtzidis ASTTemplateArgumentListInfo &getExplicitTemplateArgs() { 265912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis assert(hasExplicitTemplateArgs()); 2660b0c3e0909bb04af0bfb82ad01ab6909649d68ccaArgyrios Kyrtzidis return *reinterpret_cast<ASTTemplateArgumentListInfo*>(this + 1); 266112dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis } 266212dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis 2663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// Gets a reference to the explicit template argument list. 2664b0c3e0909bb04af0bfb82ad01ab6909649d68ccaArgyrios Kyrtzidis const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const { 2665f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall assert(hasExplicitTemplateArgs()); 2666b0c3e0909bb04af0bfb82ad01ab6909649d68ccaArgyrios Kyrtzidis return *reinterpret_cast<const ASTTemplateArgumentListInfo*>(this + 1); 2667f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 26681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2669096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieves the optional explicit template arguments. 2670010bfc253050626435f006386c0bee4b55329687James Dennett /// 2671096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// This points to the same data as getExplicitTemplateArgs(), but 2672096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// returns null if there are no explicit template arguments. 26737d9f07732b85f1b2989c640065512a6af9a0f49aDmitri Gribenko const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() const { 26746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!hasExplicitTemplateArgs()) return nullptr; 2675096832c5ed5b9106fa177ebc148489760c3bc496John McCall return &getExplicitTemplateArgs(); 2676096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 2677096832c5ed5b9106fa177ebc148489760c3bc496John McCall 2678f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// \brief Copies the template arguments (if present) into the given 2679f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall /// structure. 2680f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 2681f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall getExplicitTemplateArgs().copyInto(List); 2682f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 2683ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2684f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall TemplateArgumentLoc const *getTemplateArgs() const { 2685f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getExplicitTemplateArgs().getTemplateArgs(); 2686d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 2687d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 2688f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall unsigned getNumTemplateArgs() const { 2689f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return getExplicitTemplateArgs().NumTemplateArgs; 2690f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall } 26911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26923d9efecfb174a99ffd1f7a6156f7de3ca855993fJames Dennett /// Note: getLocStart() is the start of the whole DependentScopeDeclRefExpr, 26933d9efecfb174a99ffd1f7a6156f7de3ca855993fJames Dennett /// and differs from getLocation().getStart(). 269465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 269565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return QualifierLoc.getBeginLoc(); 269665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen } 269765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 2698f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (hasExplicitTemplateArgs()) 269965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getRAngleLoc(); 270065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getLocation(); 2701edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor } 27021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 2704f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall return T->getStmtClass() == DependentScopeDeclRefExprClass; 2705edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor } 2706f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall 270763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 27084045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 27094045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtReader; 27104045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtWriter; 2711edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor}; 27121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2713010bfc253050626435f006386c0bee4b55329687James Dennett/// Represents an expression -- generally a full-expression -- that 27144765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// introduces cleanups to be run at the end of the sub-expression's 27154765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// evaluation. The most common source of expression-introduced 271680ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// cleanups is temporary objects in C++, but several other kinds of 271780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// expressions can create cleanups, including basically every 271880ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// call in ARC that returns an Objective-C pointer. 271980ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// 272080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// This expression also tracks whether the sub-expression contains a 272180ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// potentially-evaluated block literal. The lifetime of a block 272280ee6e878a169e6255d4686a91bb696151ff229fJohn McCall/// literal is the extent of the enclosing scope. 27234765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallclass ExprWithCleanups : public Expr { 272480ee6e878a169e6255d4686a91bb696151ff229fJohn McCallpublic: 272580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall /// The type of objects that are kept in the cleanup. 272680ee6e878a169e6255d4686a91bb696151ff229fJohn McCall /// It's useful to remember the set of blocks; we could also 272780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall /// remember the set of temporaries, but there's currently 272880ee6e878a169e6255d4686a91bb696151ff229fJohn McCall /// no need. 272980ee6e878a169e6255d4686a91bb696151ff229fJohn McCall typedef BlockDecl *CleanupObject; 273080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall 273180ee6e878a169e6255d4686a91bb696151ff229fJohn McCallprivate: 273202bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson Stmt *SubExpr; 27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 273480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ExprWithCleanups(EmptyShell, unsigned NumObjects); 273580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ExprWithCleanups(Expr *SubExpr, ArrayRef<CleanupObject> Objects); 273602bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 273780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall CleanupObject *getObjectsBuffer() { 273880ee6e878a169e6255d4686a91bb696151ff229fJohn McCall return reinterpret_cast<CleanupObject*>(this + 1); 273980ee6e878a169e6255d4686a91bb696151ff229fJohn McCall } 274080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall const CleanupObject *getObjectsBuffer() const { 274180ee6e878a169e6255d4686a91bb696151ff229fJohn McCall return reinterpret_cast<const CleanupObject*>(this + 1); 274280ee6e878a169e6255d4686a91bb696151ff229fJohn McCall } 274380ee6e878a169e6255d4686a91bb696151ff229fJohn McCall friend class ASTStmtReader; 2744ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 274588eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlssonpublic: 274632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static ExprWithCleanups *Create(const ASTContext &C, EmptyShell empty, 274780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall unsigned numObjects); 27481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 274932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static ExprWithCleanups *Create(const ASTContext &C, Expr *subexpr, 275080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ArrayRef<CleanupObject> objects); 2751ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 275280ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ArrayRef<CleanupObject> getObjects() const { 275380ee6e878a169e6255d4686a91bb696151ff229fJohn McCall return ArrayRef<CleanupObject>(getObjectsBuffer(), getNumObjects()); 2754f0721fe438d7e40c168e5d664970e7830bc138fbAnders Carlsson } 275580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall 275680ee6e878a169e6255d4686a91bb696151ff229fJohn McCall unsigned getNumObjects() const { return ExprWithCleanupsBits.NumObjects; } 275780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall 275880ee6e878a169e6255d4686a91bb696151ff229fJohn McCall CleanupObject getObject(unsigned i) const { 275980ee6e878a169e6255d4686a91bb696151ff229fJohn McCall assert(i < getNumObjects() && "Index out of range"); 276080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall return getObjects()[i]; 2761d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner } 27621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 276302bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson Expr *getSubExpr() { return cast<Expr>(SubExpr); } 2764f0721fe438d7e40c168e5d664970e7830bc138fbAnders Carlsson const Expr *getSubExpr() const { return cast<Expr>(SubExpr); } 276580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall 2766010bfc253050626435f006386c0bee4b55329687James Dennett /// As with any mutator of the AST, be very careful 276780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall /// when modifying an existing AST to preserve its invariants. 276888eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson void setSubExpr(Expr *E) { SubExpr = E; } 276902bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 277065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 277165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return SubExpr->getLocStart(); 277296be6917e1c4ba1f4435a14c9e7c6c139571d086Douglas Gregor } 277365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return SubExpr->getLocEnd();} 277402bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 277502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson // Implement isa/cast/dyncast/etc. 277602bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson static bool classof(const Stmt *T) { 27774765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall return T->getStmtClass() == ExprWithCleanupsClass; 277802bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson } 277902bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 278002bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson // Iterators 278163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&SubExpr, &SubExpr + 1); } 278202bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson}; 278302bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 2784d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// \brief Describes an explicit type conversion that uses functional 2785d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// notion but could not be resolved because one or more arguments are 2786d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// type-dependent. 2787d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// 2788d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// The explicit type conversions expressed by 2789fe865f1f35d1b91f42f58f08a1399b961b71b3bcJames Dennett/// CXXUnresolvedConstructExpr have the form <tt>T(a1, a2, ..., aN)</tt>, 27900982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// where \c T is some type and \c a1, \c a2, ..., \c aN are values, and 27910982205bade2fb4fc984c27b2ab401e683963b10James Dennett/// either \c T is a dependent type or one or more of the <tt>a</tt>'s is 2792d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// type-dependent. For example, this would occur in a template such 2793d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// as: 2794d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// 2795d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// \code 2796d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// template<typename T, typename A1> 2797d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// inline T make_a(const A1& a1) { 2798d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// return T(a1); 2799d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// } 2800d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// \endcode 2801d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// 2802d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// When the returned expression is instantiated, it may resolve to a 2803d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// constructor call, conversion function call, or some kind of type 2804d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor/// conversion. 2805d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregorclass CXXUnresolvedConstructExpr : public Expr { 2806d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief The type being constructed. 2807ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *Type; 2808ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2809d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief The location of the left parentheses ('('). 2810d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation LParenLoc; 2811d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 2812d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief The location of the right parentheses (')'). 2813d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation RParenLoc; 2814d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 2815d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief The number of arguments used to construct the type. 2816d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor unsigned NumArgs; 28171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2818ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor CXXUnresolvedConstructExpr(TypeSourceInfo *Type, 2819d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation LParenLoc, 28203b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> Args, 2821d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation RParenLoc); 2822d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 28238dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis CXXUnresolvedConstructExpr(EmptyShell Empty, unsigned NumArgs) 2824ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor : Expr(CXXUnresolvedConstructExprClass, Empty), Type(), NumArgs(NumArgs) { } 28258dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 2826ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor friend class ASTStmtReader; 2827ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2828d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregorpublic: 282932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXUnresolvedConstructExpr *Create(const ASTContext &C, 2830ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *Type, 2831d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation LParenLoc, 28323b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer ArrayRef<Expr*> Args, 2833d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation RParenLoc); 2834d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 283532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static CXXUnresolvedConstructExpr *CreateEmpty(const ASTContext &C, 28368dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis unsigned NumArgs); 28378dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 2838d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief Retrieve the type that is being constructed, as specified 2839d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// in the source code. 2840ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor QualType getTypeAsWritten() const { return Type->getType(); } 2841d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 2842ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Retrieve the type source information for the type being 2843ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor /// constructed. 2844ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TypeSourceInfo *getTypeSourceInfo() const { return Type; } 2845ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2846d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief Retrieve the location of the left parentheses ('(') that 2847d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// precedes the argument list. 2848d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation getLParenLoc() const { return LParenLoc; } 2849d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor void setLParenLoc(SourceLocation L) { LParenLoc = L; } 2850d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 2851d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief Retrieve the location of the right parentheses (')') that 2852d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// follows the argument list. 2853d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 2854d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor void setRParenLoc(SourceLocation L) { RParenLoc = L; } 2855d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 2856d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor /// \brief Retrieve the number of arguments. 2857d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor unsigned arg_size() const { return NumArgs; } 2858d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 2859d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor typedef Expr** arg_iterator; 2860d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor arg_iterator arg_begin() { return reinterpret_cast<Expr**>(this + 1); } 2861d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor arg_iterator arg_end() { return arg_begin() + NumArgs; } 2862d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 28631dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall typedef const Expr* const * const_arg_iterator; 28641dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall const_arg_iterator arg_begin() const { 28651dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall return reinterpret_cast<const Expr* const *>(this + 1); 28661dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall } 28671dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall const_arg_iterator arg_end() const { 28681dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall return arg_begin() + NumArgs; 28691dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall } 28701dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall 2871d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor Expr *getArg(unsigned I) { 2872d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor assert(I < NumArgs && "Argument index out-of-range"); 2873d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor return *(arg_begin() + I); 2874d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor } 2875d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 28761dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall const Expr *getArg(unsigned I) const { 28771dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall assert(I < NumArgs && "Argument index out-of-range"); 28781dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall return *(arg_begin() + I); 28791dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall } 28801dd7383dc48718c452e71a625b29531dd96fbb9dJohn McCall 28818dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis void setArg(unsigned I, Expr *E) { 28828dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis assert(I < NumArgs && "Argument index out-of-range"); 28838dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis *(arg_begin() + I) = E; 28848dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis } 28858dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 288665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY; 2887bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella SourceLocation getLocEnd() const LLVM_READONLY { 2888bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella assert(RParenLoc.isValid() || NumArgs == 1); 2889bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella return RParenLoc.isValid() ? RParenLoc : getArg(0)->getLocEnd(); 2890bd9cbd22b832ce65a085801259cf2d3df77830e4Enea Zaffanella } 2891ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 28921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 2893d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor return T->getStmtClass() == CXXUnresolvedConstructExprClass; 2894d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor } 2895d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 2896d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor // Iterators 289763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 289863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall Stmt **begin = reinterpret_cast<Stmt**>(this+1); 289963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(begin, begin + NumArgs); 290063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 2901d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor}; 2902d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 2903ba13543329afac4a0d01304ec2ec4924d99306a6John McCall/// \brief Represents a C++ member access expression where the actual 2904ba13543329afac4a0d01304ec2ec4924d99306a6John McCall/// member referenced could not be resolved because the base 2905ba13543329afac4a0d01304ec2ec4924d99306a6John McCall/// expression or the member name was dependent. 2906aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// 2907aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// Like UnresolvedMemberExprs, these can be either implicit or 2908aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// explicit accesses. It is only possible to get one of these with 2909aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// an implicit access if a qualifier is provided. 2910865d447ac6a4721ab58e898d014a21f2eff74b06John McCallclass CXXDependentScopeMemberExpr : public Expr { 29111c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief The expression for the base pointer or class reference, 2912aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// e.g., the \c x in x.f. Can be null in implicit accesses. 29131c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor Stmt *Base; 29141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2915aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// \brief The type of the base expression. Never null, even for 2916aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// implicit accesses. 2917aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType BaseType; 2918aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 29191c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief Whether this member expression used the '->' operator or 29201c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// the '.' operator. 29213b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor bool IsArrow : 1; 29221c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2923e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Whether this member expression has info for explicit template 2924e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// keyword and arguments. 2925e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool HasTemplateKWAndArgsInfo : 1; 29261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29271c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief The location of the '->' or '.' operator. 29281c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor SourceLocation OperatorLoc; 29291c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2930a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /// \brief The nested-name-specifier that precedes the member name, if any. 29317c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc; 29321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2933c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// \brief In a qualified member access expression such as t->Base::f, this 29341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// member stores the resolves of name lookup in the context of the member 2935c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// access expression, to be used at instantiation time. 2936c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// 293746bb4f1a3ac9517406887939612eb8df4b7be006Douglas Gregor /// FIXME: This member, along with the QualifierLoc, could 2938c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// be stuck into a structure that is optionally allocated at the end of 2939865d447ac6a4721ab58e898d014a21f2eff74b06John McCall /// the CXXDependentScopeMemberExpr, to save space in the common case. 2940c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierFoundInScope; 29411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29421c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief The member to which this member expression refers, which 29431c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// can be name, overloaded operator, or destructor. 2944010bfc253050626435f006386c0bee4b55329687James Dennett /// 2945a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /// FIXME: could also be a template-id 29462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo MemberNameInfo; 29471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2948e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Return the optional template keyword and arguments info. 2949e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() { 29506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!HasTemplateKWAndArgsInfo) return nullptr; 2951e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return reinterpret_cast<ASTTemplateKWAndArgsInfo*>(this + 1); 2952e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2953e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Return the optional template keyword and arguments info. 2954e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara const ASTTemplateKWAndArgsInfo *getTemplateKWAndArgsInfo() const { 2955e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return const_cast<CXXDependentScopeMemberExpr*>(this) 2956e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara ->getTemplateKWAndArgsInfo(); 2957e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 2958e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 295932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXDependentScopeMemberExpr(const ASTContext &C, Expr *Base, 296032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper QualType BaseType, bool IsArrow, 296132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper SourceLocation OperatorLoc, 296232b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper NestedNameSpecifierLoc QualifierLoc, 296332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper SourceLocation TemplateKWLoc, 296432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper NamedDecl *FirstQualifierFoundInScope, 296532b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper DeclarationNameInfo MemberNameInfo, 296632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper const TemplateArgumentListInfo *TemplateArgs); 29671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29681c0ca59416999129d0439c2661d137ef38e86209Douglas Gregorpublic: 296932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CXXDependentScopeMemberExpr(const ASTContext &C, Expr *Base, 297032b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper QualType BaseType, bool IsArrow, 2971bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor SourceLocation OperatorLoc, 29727c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 2973bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor NamedDecl *FirstQualifierFoundInScope, 2974bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor DeclarationNameInfo MemberNameInfo); 29751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2976865d447ac6a4721ab58e898d014a21f2eff74b06John McCall static CXXDependentScopeMemberExpr * 297732b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper Create(const ASTContext &C, Expr *Base, QualType BaseType, bool IsArrow, 297832b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, 297932b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, 29802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo MemberNameInfo, 2981d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo *TemplateArgs); 29821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29838dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis static CXXDependentScopeMemberExpr * 298432b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CreateEmpty(const ASTContext &C, bool HasTemplateKWAndArgsInfo, 2985def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor unsigned NumTemplateArgs); 29868dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 2987aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// \brief True if this is an implicit access, i.e. one in which the 2988aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// member being accessed was not written in the source. The source 2989aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall /// location of the operator is invalid in this case. 29904c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor bool isImplicitAccess() const; 2991aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 29921c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief Retrieve the base object of this member expressions, 29931c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// e.g., the \c x in \c x.m. 2994aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *getBase() const { 2995aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall assert(!isImplicitAccess()); 2996aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return cast<Expr>(Base); 2997aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 29981c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 2999aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType getBaseType() const { return BaseType; } 3000aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 30011c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief Determine whether this member expression used the '->' 30021c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// operator; otherwise, it used the '.' operator. 30031c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor bool isArrow() const { return IsArrow; } 30041c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 30051c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief Retrieve the location of the '->' or '.' operator. 30061c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor SourceLocation getOperatorLoc() const { return OperatorLoc; } 30071c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 3008a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /// \brief Retrieve the nested-name-specifier that qualifies the member 3009a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /// name. 3010ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie NestedNameSpecifier *getQualifier() const { 3011ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie return QualifierLoc.getNestedNameSpecifier(); 30127c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor } 30131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30147c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor /// \brief Retrieve the nested-name-specifier that qualifies the member 30157c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor /// name, with source location information. 30167c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; } 3017ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3018ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3019c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// \brief Retrieve the first part of the nested-name-specifier that was 3020c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// found in the scope of the member access expression when the member access 3021c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// was initially parsed. 3022c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// 3023c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// This function only returns a useful result when member access expression 30241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// uses a qualified member name, e.g., "x.Base::f". Here, the declaration 30251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// returned by this function describes what was found by unqualified name 3026c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// lookup for the identifier "Base" within the scope of the member access 3027c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// expression itself. At template instantiation time, this information is 3028c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// combined with the results of name lookup into the type of the object 3029c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor /// expression itself (the class type of x). 30301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *getFirstQualifierFoundInScope() const { 3031c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor return FirstQualifierFoundInScope; 3032c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor } 30331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30341c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// \brief Retrieve the name of the member that this expression 30351c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor /// refers to. 30362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &getMemberNameInfo() const { 30372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return MemberNameInfo; 30382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 30392577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 30402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// \brief Retrieve the name of the member that this expression 30412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// refers to. 30422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationName getMember() const { return MemberNameInfo.getName(); } 30431c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 30441c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor // \brief Retrieve the location of the name of the member that this 30451c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor // expression refers to. 30462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara SourceLocation getMemberLoc() const { return MemberNameInfo.getLoc(); } 30471c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 3048e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the template keyword preceding the 3049e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// member name, if any. 3050e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getTemplateKeywordLoc() const { 3051e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 3052e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getTemplateKWAndArgsInfo()->getTemplateKeywordLoc(); 3053e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 3054e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 3055e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the left angle bracket starting the 3056e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the member name, if any. 3057e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getLAngleLoc() const { 3058e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 3059e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getTemplateKWAndArgsInfo()->LAngleLoc; 3060e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 3061e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 3062e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// \brief Retrieve the location of the right angle bracket ending the 3063e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// explicit template argument list following the member name, if any. 3064e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation getRAngleLoc() const { 3065e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 3066e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return getTemplateKWAndArgsInfo()->RAngleLoc; 3067e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara } 3068e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 3069e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara /// Determines whether the member name was preceded by the template keyword. 3070e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } 3071e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara 30723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Determines whether this member expression actually had a C++ 30733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// template argument list explicitly specified, e.g., x.f<int>. 3074e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } 30751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307636c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis /// \brief Retrieve the explicit template argument list that followed the 307736c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis /// member template name, if any. 3078b0c3e0909bb04af0bfb82ad01ab6909649d68ccaArgyrios Kyrtzidis ASTTemplateArgumentListInfo &getExplicitTemplateArgs() { 3079e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara assert(hasExplicitTemplateArgs()); 3080b0c3e0909bb04af0bfb82ad01ab6909649d68ccaArgyrios Kyrtzidis return *reinterpret_cast<ASTTemplateArgumentListInfo *>(this + 1); 308136c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis } 308236c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis 308336c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis /// \brief Retrieve the explicit template argument list that followed the 308436c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis /// member template name, if any. 3085b0c3e0909bb04af0bfb82ad01ab6909649d68ccaArgyrios Kyrtzidis const ASTTemplateArgumentListInfo &getExplicitTemplateArgs() const { 308636c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis return const_cast<CXXDependentScopeMemberExpr *>(this) 3087096832c5ed5b9106fa177ebc148489760c3bc496John McCall ->getExplicitTemplateArgs(); 3088096832c5ed5b9106fa177ebc148489760c3bc496John McCall } 3089096832c5ed5b9106fa177ebc148489760c3bc496John McCall 3090096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// \brief Retrieves the optional explicit template arguments. 3091010bfc253050626435f006386c0bee4b55329687James Dennett /// 3092096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// This points to the same data as getExplicitTemplateArgs(), but 3093096832c5ed5b9106fa177ebc148489760c3bc496John McCall /// returns null if there are no explicit template arguments. 30947d9f07732b85f1b2989c640065512a6af9a0f49aDmitri Gribenko const ASTTemplateArgumentListInfo *getOptionalExplicitTemplateArgs() const { 30956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!hasExplicitTemplateArgs()) return nullptr; 3096096832c5ed5b9106fa177ebc148489760c3bc496John McCall return &getExplicitTemplateArgs(); 309736c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis } 309836c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis 3099d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// \brief Copies the template arguments (if present) into the given 3100d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall /// structure. 3101d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 3102096832c5ed5b9106fa177ebc148489760c3bc496John McCall getExplicitTemplateArgs().copyInto(List); 3103d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall } 3104d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 31058dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis /// \brief Initializes the template arguments using the given structure. 31068dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis void initializeTemplateArgumentsFrom(const TemplateArgumentListInfo &List) { 3107096832c5ed5b9106fa177ebc148489760c3bc496John McCall getExplicitTemplateArgs().initializeFrom(List); 31088dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis } 31098dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 31103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Retrieve the template arguments provided as part of this 31113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// template-id. 3112833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall const TemplateArgumentLoc *getTemplateArgs() const { 3113096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().getTemplateArgs(); 31143b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 31151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Retrieve the number of template arguments provided as part of this 31173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// template-id. 31181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned getNumTemplateArgs() const { 3119096832c5ed5b9106fa177ebc148489760c3bc496John McCall return getExplicitTemplateArgs().NumTemplateArgs; 31203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 31211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 3123aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!isImplicitAccess()) 312465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return Base->getLocStart(); 312565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen if (getQualifier()) 312665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getQualifierLoc().getBeginLoc(); 312765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return MemberNameInfo.getBeginLoc(); 31281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen } 313065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 3131aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (hasExplicitTemplateArgs()) 313265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getRAngleLoc(); 313365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return MemberNameInfo.getEndLoc(); 31341c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor } 31351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Stmt *T) { 3137865d447ac6a4721ab58e898d014a21f2eff74b06John McCall return T->getStmtClass() == CXXDependentScopeMemberExprClass; 31381c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor } 31391c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 31401c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor // Iterators 314163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 314263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall if (isImplicitAccess()) return child_range(); 314363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Base, &Base + 1); 314463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 31454045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis 31464045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtReader; 31474045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis friend class ASTStmtWriter; 31481c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}; 31491c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 3150129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall/// \brief Represents a C++ member access expression for which lookup 3151aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// produced a set of overloaded functions. 3152aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// 3153aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// The member access may be explicit or implicit: 3154010bfc253050626435f006386c0bee4b55329687James Dennett/// \code 3155aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// struct A { 3156aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// int a, b; 3157aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// int explicitAccess() { return this->a + this->A::b; } 3158aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// int implicitAccess() { return a + A::b; } 3159aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// }; 3160010bfc253050626435f006386c0bee4b55329687James Dennett/// \endcode 3161aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// 3162aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// In the final AST, an explicit access always becomes a MemberExpr. 3163aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// An implicit access may become either a MemberExpr or a 3164aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall/// DeclRefExpr, depending on whether the member is static. 31657bb12da2b0749eeebb21854c77877736969e59f2John McCallclass UnresolvedMemberExpr : public OverloadExpr { 3166129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Whether this member expression used the '->' operator or 3167129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// the '.' operator. 3168129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool IsArrow : 1; 3169129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3170129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Whether the lookup results contain an unresolved using 3171129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// declaration. 3172129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool HasUnresolvedUsing : 1; 3173129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 31747bb12da2b0749eeebb21854c77877736969e59f2John McCall /// \brief The expression for the base pointer or class reference, 3175010bfc253050626435f006386c0bee4b55329687James Dennett /// e.g., the \c x in x.f. 3176010bfc253050626435f006386c0bee4b55329687James Dennett /// 3177010bfc253050626435f006386c0bee4b55329687James Dennett /// This can be null if this is an 'unbased' member expression. 31787bb12da2b0749eeebb21854c77877736969e59f2John McCall Stmt *Base; 31797bb12da2b0749eeebb21854c77877736969e59f2John McCall 3180010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief The type of the base expression; never null. 31817bb12da2b0749eeebb21854c77877736969e59f2John McCall QualType BaseType; 3182129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3183129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief The location of the '->' or '.' operator. 3184129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc; 3185129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 318632b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper UnresolvedMemberExpr(const ASTContext &C, bool HasUnresolvedUsing, 3187aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *Base, QualType BaseType, bool IsArrow, 3188129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 31894c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 3190e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 31912577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &MemberNameInfo, 31925a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor const TemplateArgumentListInfo *TemplateArgs, 31935a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor UnresolvedSetIterator Begin, UnresolvedSetIterator End); 3194ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3195a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis UnresolvedMemberExpr(EmptyShell Empty) 3196a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis : OverloadExpr(UnresolvedMemberExprClass, Empty), IsArrow(false), 31976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines HasUnresolvedUsing(false), Base(nullptr) { } 3198129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 31994c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor friend class ASTStmtReader; 3200ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3201129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallpublic: 3202129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall static UnresolvedMemberExpr * 320332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper Create(const ASTContext &C, bool HasUnresolvedUsing, 3204aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *Base, QualType BaseType, bool IsArrow, 3205129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation OperatorLoc, 32064c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor NestedNameSpecifierLoc QualifierLoc, 3207e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara SourceLocation TemplateKWLoc, 32082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &MemberNameInfo, 32095a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor const TemplateArgumentListInfo *TemplateArgs, 32105a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor UnresolvedSetIterator Begin, UnresolvedSetIterator End); 3211129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3212a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis static UnresolvedMemberExpr * 321332b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper CreateEmpty(const ASTContext &C, bool HasTemplateKWAndArgsInfo, 3214def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor unsigned NumTemplateArgs); 3215a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis 3216010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief True if this is an implicit access, i.e., one in which the 3217010bfc253050626435f006386c0bee4b55329687James Dennett /// member being accessed was not written in the source. 3218010bfc253050626435f006386c0bee4b55329687James Dennett /// 3219010bfc253050626435f006386c0bee4b55329687James Dennett /// The source location of the operator is invalid in this case. 32204c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor bool isImplicitAccess() const; 3221aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 3222129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Retrieve the base object of this member expressions, 3223129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// e.g., the \c x in \c x.m. 3224aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall Expr *getBase() { 3225aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall assert(!isImplicitAccess()); 3226aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall return cast<Expr>(Base); 3227aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 32282f27bf854f0519810b34afd209089cc75536b757John McCall const Expr *getBase() const { 32292f27bf854f0519810b34afd209089cc75536b757John McCall assert(!isImplicitAccess()); 32302f27bf854f0519810b34afd209089cc75536b757John McCall return cast<Expr>(Base); 32312f27bf854f0519810b34afd209089cc75536b757John McCall } 3232129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3233aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall QualType getBaseType() const { return BaseType; } 3234a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis 3235a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis /// \brief Determine whether the lookup results contain an unresolved using 3236a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis /// declaration. 3237a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis bool hasUnresolvedUsing() const { return HasUnresolvedUsing; } 3238aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall 3239129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Determine whether this member expression used the '->' 3240129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// operator; otherwise, it used the '.' operator. 3241129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall bool isArrow() const { return IsArrow; } 3242129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3243129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Retrieve the location of the '->' or '.' operator. 3244129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall SourceLocation getOperatorLoc() const { return OperatorLoc; } 3245129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3246010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Retrieve the naming class of this lookup. 3247c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall CXXRecordDecl *getNamingClass() const; 3248c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall 32492577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// \brief Retrieve the full name info for the member that this expression 32502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara /// refers to. 32512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara const DeclarationNameInfo &getMemberNameInfo() const { return getNameInfo(); } 32522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 3253129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// \brief Retrieve the name of the member that this expression 3254129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall /// refers to. 32557bb12da2b0749eeebb21854c77877736969e59f2John McCall DeclarationName getMemberName() const { return getName(); } 3256129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3257129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // \brief Retrieve the location of the name of the member that this 3258129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // expression refers to. 32597bb12da2b0749eeebb21854c77877736969e59f2John McCall SourceLocation getMemberLoc() const { return getNameLoc(); } 3260129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 326116b0a310f5649d25849d84409841f401e7a9a0e5David Blaikie // \brief Return the preferred location (the member name) for the arrow when 326216b0a310f5649d25849d84409841f401e7a9a0e5David Blaikie // diagnosing a problem with this expression. 326316b0a310f5649d25849d84409841f401e7a9a0e5David Blaikie SourceLocation getExprLoc() const LLVM_READONLY { return getMemberLoc(); } 326416b0a310f5649d25849d84409841f401e7a9a0e5David Blaikie 326565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 3266aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!isImplicitAccess()) 326765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return Base->getLocStart(); 326865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen if (NestedNameSpecifierLoc l = getQualifierLoc()) 326965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return l.getBeginLoc(); 327065d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getMemberNameInfo().getLocStart(); 327165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen } 327265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 3273129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (hasExplicitTemplateArgs()) 327465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getRAngleLoc(); 327565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return getMemberNameInfo().getLocEnd(); 3276129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 3277129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3278129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall static bool classof(const Stmt *T) { 3279129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall return T->getStmtClass() == UnresolvedMemberExprClass; 3280129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 3281129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3282129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // Iterators 328363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 328463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall if (isImplicitAccess()) return child_range(); 328563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Base, &Base + 1); 328663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 3287129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}; 3288129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 3289010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]). 32902e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl/// 32912e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl/// The noexcept expression tests whether a given expression might throw. Its 32922e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl/// result is a boolean constant. 32932e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redlclass CXXNoexceptExpr : public Expr { 32942e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl bool Value : 1; 32952e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl Stmt *Operand; 32962e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl SourceRange Range; 32972e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 3298c8aecc2dfb2e393d9eeaedeca22ff8cd7149af81Sebastian Redl friend class ASTStmtReader; 3299c8aecc2dfb2e393d9eeaedeca22ff8cd7149af81Sebastian Redl 33002e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redlpublic: 33012e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val, 33022e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl SourceLocation Keyword, SourceLocation RParen) 3303f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall : Expr(CXXNoexceptExprClass, Ty, VK_RValue, OK_Ordinary, 3304f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall /*TypeDependent*/false, 3305bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor /*ValueDependent*/Val == CT_Dependent, 3306561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Val == CT_Dependent || Operand->isInstantiationDependent(), 3307bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor Operand->containsUnexpandedParameterPack()), 33086b219d082434394c1ac401390ec1d1967727815aSebastian Redl Value(Val == CT_Cannot), Operand(Operand), Range(Keyword, RParen) 33096b219d082434394c1ac401390ec1d1967727815aSebastian Redl { } 33106b219d082434394c1ac401390ec1d1967727815aSebastian Redl 33116b219d082434394c1ac401390ec1d1967727815aSebastian Redl CXXNoexceptExpr(EmptyShell Empty) 33126b219d082434394c1ac401390ec1d1967727815aSebastian Redl : Expr(CXXNoexceptExprClass, Empty) 33132e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl { } 33142e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 33152e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl Expr *getOperand() const { return static_cast<Expr*>(Operand); } 33162e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 331765d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } 331865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 3319aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar SourceRange getSourceRange() const LLVM_READONLY { return Range; } 33202e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 33212e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl bool getValue() const { return Value; } 33222e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 33232e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl static bool classof(const Stmt *T) { 33242e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl return T->getStmtClass() == CXXNoexceptExprClass; 33252e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl } 33262e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 33272e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl // Iterators 332863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(&Operand, &Operand + 1); } 33292e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl}; 33302e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 3331010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a C++11 pack expansion that produces a sequence of 3332be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// expressions. 3333be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// 3334be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// A pack expansion expression contains a pattern (which itself is an 3335be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// expression) followed by an ellipsis. For example: 3336be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// 3337be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// \code 3338be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// template<typename F, typename ...Types> 3339be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// void forward(F f, Types &&...args) { 3340be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// f(static_cast<Types&&>(args)...); 3341be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// } 3342be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// \endcode 3343be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// 3344be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// Here, the argument to the function object \c f is a pack expansion whose 3345ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// pattern is \c static_cast<Types&&>(args). When the \c forward function 3346be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// template is instantiated, the pack expansion will instantiate to zero or 3347be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor/// or more function arguments to the function object \c f. 3348be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregorclass PackExpansionExpr : public Expr { 3349be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor SourceLocation EllipsisLoc; 3350ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 335167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// \brief The number of expansions that will be produced by this pack 335267fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// expansion expression, if known. 335367fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// 335467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// When zero, the number of expansions is not known. Otherwise, this value 335567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// is the number of expansions + 1. 335667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor unsigned NumExpansions; 3357ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3358be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor Stmt *Pattern; 3359ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3360be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor friend class ASTStmtReader; 336167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor friend class ASTStmtWriter; 3362ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3363be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregorpublic: 336467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor PackExpansionExpr(QualType T, Expr *Pattern, SourceLocation EllipsisLoc, 3365dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie Optional<unsigned> NumExpansions) 3366ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie : Expr(PackExpansionExprClass, T, Pattern->getValueKind(), 3367ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie Pattern->getObjectKind(), /*TypeDependent=*/true, 3368561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor /*ValueDependent=*/true, /*InstantiationDependent=*/true, 3369561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor /*ContainsUnexpandedParameterPack=*/false), 3370be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor EllipsisLoc(EllipsisLoc), 337167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor NumExpansions(NumExpansions? *NumExpansions + 1 : 0), 3372be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor Pattern(Pattern) { } 3373be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 3374be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor PackExpansionExpr(EmptyShell Empty) : Expr(PackExpansionExprClass, Empty) { } 3375ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3376be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor /// \brief Retrieve the pattern of the pack expansion. 3377be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor Expr *getPattern() { return reinterpret_cast<Expr *>(Pattern); } 3378be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 3379be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor /// \brief Retrieve the pattern of the pack expansion. 3380be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor const Expr *getPattern() const { return reinterpret_cast<Expr *>(Pattern); } 3381be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 3382be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor /// \brief Retrieve the location of the ellipsis that describes this pack 3383be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor /// expansion. 3384be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor SourceLocation getEllipsisLoc() const { return EllipsisLoc; } 3385ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3386ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Determine the number of expansions that will be produced when 338767fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor /// this pack expansion is instantiated, if already known. 3388dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie Optional<unsigned> getNumExpansions() const { 338967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor if (NumExpansions) 339067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor return NumExpansions - 1; 3391ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 339266874fb18afbffb8b2ca05576851a64534be3352David Blaikie return None; 339367fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor } 3394ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 339565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 339665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen return Pattern->getLocStart(); 339763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 339865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return EllipsisLoc; } 3399be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 3400be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor static bool classof(const Stmt *T) { 3401be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor return T->getStmtClass() == PackExpansionExprClass; 3402be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor } 3403ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3404be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor // Iterators 340563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { 340663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall return child_range(&Pattern, &Pattern + 1); 340763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall } 3408be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor}; 3409ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3410e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnarainline ASTTemplateKWAndArgsInfo *OverloadExpr::getTemplateKWAndArgsInfo() { 34116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!HasTemplateKWAndArgsInfo) return nullptr; 34127bb12da2b0749eeebb21854c77877736969e59f2John McCall if (isa<UnresolvedLookupExpr>(this)) 3413e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return reinterpret_cast<ASTTemplateKWAndArgsInfo*> 3414e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara (cast<UnresolvedLookupExpr>(this) + 1); 34157bb12da2b0749eeebb21854c77877736969e59f2John McCall else 3416e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara return reinterpret_cast<ASTTemplateKWAndArgsInfo*> 3417e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara (cast<UnresolvedMemberExpr>(this) + 1); 34187bb12da2b0749eeebb21854c77877736969e59f2John McCall} 34197bb12da2b0749eeebb21854c77877736969e59f2John McCall 3420ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// \brief Represents an expression that computes the length of a parameter 3421ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// pack. 3422ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// 3423ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \code 3424ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// template<typename ...Types> 3425ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// struct count { 3426ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// static const unsigned value = sizeof...(Types); 3427ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// }; 3428ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \endcode 3429ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorclass SizeOfPackExpr : public Expr { 3430010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief The location of the \c sizeof keyword. 3431ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation OperatorLoc; 3432ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3433ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief The location of the name of the parameter pack. 3434ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation PackLoc; 3435ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3436ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief The location of the closing parenthesis. 3437ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation RParenLoc; 3438ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3439ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief The length of the parameter pack, if known. 3440ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// 3441ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// When this expression is value-dependent, the length of the parameter pack 3442ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// is unknown. When this expression is not value-dependent, the length is 3443ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// known. 3444ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor unsigned Length; 3445ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3446ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief The parameter pack itself. 3447ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor NamedDecl *Pack; 3448ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3449ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor friend class ASTStmtReader; 3450ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor friend class ASTStmtWriter; 3451ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3452ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorpublic: 3453010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Create a value-dependent expression that computes the length of 3454ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// the given parameter pack. 3455ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack, 3456ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation PackLoc, SourceLocation RParenLoc) 3457ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor : Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary, 3458ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /*TypeDependent=*/false, /*ValueDependent=*/true, 3459561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor /*InstantiationDependent=*/true, 3460ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /*ContainsUnexpandedParameterPack=*/false), 3461ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc), 3462ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor Length(0), Pack(Pack) { } 3463ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 3464010bfc253050626435f006386c0bee4b55329687James Dennett /// \brief Create an expression that computes the length of 3465ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// the given parameter pack, which is already known. 3466ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie SizeOfPackExpr(QualType SizeType, SourceLocation OperatorLoc, NamedDecl *Pack, 3467ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation PackLoc, SourceLocation RParenLoc, 3468ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor unsigned Length) 3469ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor : Expr(SizeOfPackExprClass, SizeType, VK_RValue, OK_Ordinary, 3470ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /*TypeDependent=*/false, /*ValueDependent=*/false, 3471561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor /*InstantiationDependent=*/false, 3472ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /*ContainsUnexpandedParameterPack=*/false), 3473ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc), 3474ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor Length(Length), Pack(Pack) { } 3475ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 3476ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Create an empty expression. 3477ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SizeOfPackExpr(EmptyShell Empty) : Expr(SizeOfPackExprClass, Empty) { } 3478ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3479ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Determine the location of the 'sizeof' keyword. 3480ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation getOperatorLoc() const { return OperatorLoc; } 3481ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 3482ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Determine the location of the parameter pack. 3483ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation getPackLoc() const { return PackLoc; } 3484ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3485ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Determine the location of the right parenthesis. 3486ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor SourceLocation getRParenLoc() const { return RParenLoc; } 3487ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3488ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Retrieve the parameter pack. 3489ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor NamedDecl *getPack() const { return Pack; } 3490ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3491ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// \brief Retrieve the length of the parameter pack. 3492ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor /// 3493ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// This routine may only be invoked when the expression is not 3494c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// value-dependent. 3495ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor unsigned getPackLength() const { 3496ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie assert(!isValueDependent() && 3497ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor "Cannot get the length of a value-dependent pack size expression"); 3498ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return Length; 3499ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor } 3500ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 350165d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return OperatorLoc; } 350265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 3503ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3504ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor static bool classof(const Stmt *T) { 3505ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor return T->getStmtClass() == SizeOfPackExprClass; 3506ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor } 3507ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3508ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor // Iterators 350963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 3510ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}; 3511c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 351291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall/// \brief Represents a reference to a non-type template parameter 351391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall/// that has been substituted with a template argument. 351491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCallclass SubstNonTypeTemplateParmExpr : public Expr { 351591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall /// \brief The replaced parameter. 351691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall NonTypeTemplateParmDecl *Param; 351791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 351891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall /// \brief The replacement expression. 351991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall Stmt *Replacement; 352091a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 352191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall /// \brief The location of the non-type template parameter reference. 352291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall SourceLocation NameLoc; 352391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 35247110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall friend class ASTReader; 35257110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall friend class ASTStmtReader; 3526ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie explicit SubstNonTypeTemplateParmExpr(EmptyShell Empty) 35277110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall : Expr(SubstNonTypeTemplateParmExprClass, Empty) { } 35287110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall 352991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCallpublic: 3530ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie SubstNonTypeTemplateParmExpr(QualType type, 353191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall ExprValueKind valueKind, 353291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall SourceLocation loc, 353391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall NonTypeTemplateParmDecl *param, 353491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall Expr *replacement) 353591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall : Expr(SubstNonTypeTemplateParmExprClass, type, valueKind, OK_Ordinary, 353691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall replacement->isTypeDependent(), replacement->isValueDependent(), 353791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall replacement->isInstantiationDependent(), 353891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall replacement->containsUnexpandedParameterPack()), 353991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall Param(param), Replacement(replacement), NameLoc(loc) {} 354091a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 354191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall SourceLocation getNameLoc() const { return NameLoc; } 354265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; } 354365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; } 354491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 354591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall Expr *getReplacement() const { return cast<Expr>(Replacement); } 3546ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 354791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall NonTypeTemplateParmDecl *getParameter() const { return Param; } 354891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 354991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall static bool classof(const Stmt *s) { 355091a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall return s->getStmtClass() == SubstNonTypeTemplateParmExprClass; 355191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall } 3552ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 355391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall // Iterators 355491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall child_range children() { return child_range(&Replacement, &Replacement+1); } 355591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall}; 355691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 3557c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// \brief Represents a reference to a non-type template parameter pack that 3558c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// has been substituted with a non-template argument pack. 3559c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// 3560c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// When a pack expansion in the source code contains multiple parameter packs 3561c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// and those parameter packs correspond to different levels of template 3562fb7669ee725ec699e2b49b8359c4652536949739Douglas Gregor/// parameter lists, this node is used to represent a non-type template 3563c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// parameter pack from an outer level, which has already had its argument pack 3564c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// substituted but that still lives within a pack expansion that itself 3565c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// could not be instantiated. When actually performing a substitution into 3566c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// that pack expansion (e.g., when all template parameters have corresponding 3567c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// arguments), this type will be replaced with the appropriate underlying 3568c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor/// expression at the current pack substitution index. 3569c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorclass SubstNonTypeTemplateParmPackExpr : public Expr { 3570c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief The non-type template parameter pack itself. 3571c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor NonTypeTemplateParmDecl *Param; 3572ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3573c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief A pointer to the set of template arguments that this 3574c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// parameter pack is instantiated with. 3575c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor const TemplateArgument *Arguments; 3576ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3577c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief The number of template arguments in \c Arguments. 3578c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor unsigned NumArguments; 3579ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3580c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief The location of the non-type template parameter pack reference. 3581c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SourceLocation NameLoc; 3582ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 35837110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall friend class ASTReader; 3584c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor friend class ASTStmtReader; 3585ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie explicit SubstNonTypeTemplateParmPackExpr(EmptyShell Empty) 35867110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall : Expr(SubstNonTypeTemplateParmPackExprClass, Empty) { } 3587ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3588c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorpublic: 3589ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie SubstNonTypeTemplateParmPackExpr(QualType T, 3590c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor NonTypeTemplateParmDecl *Param, 3591c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SourceLocation NameLoc, 3592c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor const TemplateArgument &ArgPack); 3593ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3594c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief Retrieve the non-type template parameter pack being substituted. 3595c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor NonTypeTemplateParmDecl *getParameterPack() const { return Param; } 3596c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 3597c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief Retrieve the location of the parameter pack name. 3598c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SourceLocation getParameterPackLocation() const { return NameLoc; } 3599ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3600c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// \brief Retrieve the template argument pack containing the substituted 3601c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor /// template arguments. 3602c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor TemplateArgument getArgumentPack() const; 3603c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 360465d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; } 360565d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; } 3606ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3607c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor static bool classof(const Stmt *T) { 3608c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor return T->getStmtClass() == SubstNonTypeTemplateParmPackExprClass; 3609c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor } 3610ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3611c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor // Iterators 361263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall child_range children() { return child_range(); } 3613c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor}; 361403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor 36159a4db032ecd991626d236a502e770126db32bd31Richard Smith/// \brief Represents a reference to a function parameter pack that has been 36169a4db032ecd991626d236a502e770126db32bd31Richard Smith/// substituted but not yet expanded. 36179a4db032ecd991626d236a502e770126db32bd31Richard Smith/// 36189a4db032ecd991626d236a502e770126db32bd31Richard Smith/// When a pack expansion contains multiple parameter packs at different levels, 36199a4db032ecd991626d236a502e770126db32bd31Richard Smith/// this node is used to represent a function parameter pack at an outer level 36209a4db032ecd991626d236a502e770126db32bd31Richard Smith/// which we have already substituted to refer to expanded parameters, but where 36219a4db032ecd991626d236a502e770126db32bd31Richard Smith/// the containing pack expansion cannot yet be expanded. 36229a4db032ecd991626d236a502e770126db32bd31Richard Smith/// 36239a4db032ecd991626d236a502e770126db32bd31Richard Smith/// \code 36249a4db032ecd991626d236a502e770126db32bd31Richard Smith/// template<typename...Ts> struct S { 36259a4db032ecd991626d236a502e770126db32bd31Richard Smith/// template<typename...Us> auto f(Ts ...ts) -> decltype(g(Us(ts)...)); 36269a4db032ecd991626d236a502e770126db32bd31Richard Smith/// }; 36279a4db032ecd991626d236a502e770126db32bd31Richard Smith/// template struct S<int, int>; 36289a4db032ecd991626d236a502e770126db32bd31Richard Smith/// \endcode 36299a4db032ecd991626d236a502e770126db32bd31Richard Smithclass FunctionParmPackExpr : public Expr { 36309a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief The function parameter pack which was referenced. 36319a4db032ecd991626d236a502e770126db32bd31Richard Smith ParmVarDecl *ParamPack; 36329a4db032ecd991626d236a502e770126db32bd31Richard Smith 36339a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief The location of the function parameter pack reference. 36349a4db032ecd991626d236a502e770126db32bd31Richard Smith SourceLocation NameLoc; 36359a4db032ecd991626d236a502e770126db32bd31Richard Smith 36369a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief The number of expansions of this pack. 36379a4db032ecd991626d236a502e770126db32bd31Richard Smith unsigned NumParameters; 36389a4db032ecd991626d236a502e770126db32bd31Richard Smith 36399a4db032ecd991626d236a502e770126db32bd31Richard Smith FunctionParmPackExpr(QualType T, ParmVarDecl *ParamPack, 36409a4db032ecd991626d236a502e770126db32bd31Richard Smith SourceLocation NameLoc, unsigned NumParams, 36419a4db032ecd991626d236a502e770126db32bd31Richard Smith Decl * const *Params); 36429a4db032ecd991626d236a502e770126db32bd31Richard Smith 36439a4db032ecd991626d236a502e770126db32bd31Richard Smith friend class ASTReader; 36449a4db032ecd991626d236a502e770126db32bd31Richard Smith friend class ASTStmtReader; 36459a4db032ecd991626d236a502e770126db32bd31Richard Smith 36469a4db032ecd991626d236a502e770126db32bd31Richard Smithpublic: 364732b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static FunctionParmPackExpr *Create(const ASTContext &Context, QualType T, 36489a4db032ecd991626d236a502e770126db32bd31Richard Smith ParmVarDecl *ParamPack, 36499a4db032ecd991626d236a502e770126db32bd31Richard Smith SourceLocation NameLoc, 3650cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<Decl *> Params); 365132b5a1e82f535d43e94332183cd330f4a39b2dbdCraig Topper static FunctionParmPackExpr *CreateEmpty(const ASTContext &Context, 36529a4db032ecd991626d236a502e770126db32bd31Richard Smith unsigned NumParams); 36539a4db032ecd991626d236a502e770126db32bd31Richard Smith 36549a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief Get the parameter pack which this expression refers to. 36559a4db032ecd991626d236a502e770126db32bd31Richard Smith ParmVarDecl *getParameterPack() const { return ParamPack; } 36569a4db032ecd991626d236a502e770126db32bd31Richard Smith 36579a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief Get the location of the parameter pack. 36589a4db032ecd991626d236a502e770126db32bd31Richard Smith SourceLocation getParameterPackLocation() const { return NameLoc; } 36599a4db032ecd991626d236a502e770126db32bd31Richard Smith 36609a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief Iterators over the parameters which the parameter pack expanded 36619a4db032ecd991626d236a502e770126db32bd31Richard Smith /// into. 36629a4db032ecd991626d236a502e770126db32bd31Richard Smith typedef ParmVarDecl * const *iterator; 36639a4db032ecd991626d236a502e770126db32bd31Richard Smith iterator begin() const { return reinterpret_cast<iterator>(this+1); } 36649a4db032ecd991626d236a502e770126db32bd31Richard Smith iterator end() const { return begin() + NumParameters; } 36659a4db032ecd991626d236a502e770126db32bd31Richard Smith 36669a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief Get the number of parameters in this parameter pack. 36679a4db032ecd991626d236a502e770126db32bd31Richard Smith unsigned getNumExpansions() const { return NumParameters; } 36689a4db032ecd991626d236a502e770126db32bd31Richard Smith 36699a4db032ecd991626d236a502e770126db32bd31Richard Smith /// \brief Get an expansion of the parameter pack by index. 36709a4db032ecd991626d236a502e770126db32bd31Richard Smith ParmVarDecl *getExpansion(unsigned I) const { return begin()[I]; } 36719a4db032ecd991626d236a502e770126db32bd31Richard Smith 367265d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { return NameLoc; } 367365d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { return NameLoc; } 36749a4db032ecd991626d236a502e770126db32bd31Richard Smith 36759a4db032ecd991626d236a502e770126db32bd31Richard Smith static bool classof(const Stmt *T) { 36769a4db032ecd991626d236a502e770126db32bd31Richard Smith return T->getStmtClass() == FunctionParmPackExprClass; 36779a4db032ecd991626d236a502e770126db32bd31Richard Smith } 36789a4db032ecd991626d236a502e770126db32bd31Richard Smith 36799a4db032ecd991626d236a502e770126db32bd31Richard Smith child_range children() { return child_range(); } 36809a4db032ecd991626d236a502e770126db32bd31Richard Smith}; 36819a4db032ecd991626d236a502e770126db32bd31Richard Smith 3682010bfc253050626435f006386c0bee4b55329687James Dennett/// \brief Represents a prvalue temporary that is written into memory so that 368303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// a reference can bind to it. 368403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// 368503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// Prvalue expressions are materialized when they need to have an address 368603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// in memory for a reference to bind to. This happens when binding a 368703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// reference to the result of a conversion, e.g., 368803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// 368903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// \code 369003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// const int &r = 1.0; 369103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// \endcode 369203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// 369303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// Here, 1.0 is implicitly converted to an \c int. That resulting \c int is 369403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// then materialized via a \c MaterializeTemporaryExpr, and the reference 369503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// binds to the temporary. \c MaterializeTemporaryExprs are always glvalues 369603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// (either an lvalue or an xvalue, depending on the kind of reference binding 369703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor/// to it), maintaining the invariant that references always bind to glvalues. 3698211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// 3699211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// Reference binding and copy-elision can both extend the lifetime of a 3700211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// temporary. When either happens, the expression will also track the 3701211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith/// declaration which is responsible for the lifetime extension. 370203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorclass MaterializeTemporaryExpr : public Expr { 37036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesprivate: 37046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct ExtraState { 37056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief The temporary-generating expression whose value will be 37066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// materialized. 37076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Stmt *Temporary; 37086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 37096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief The declaration which lifetime-extended this reference, if any. 37106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// Either a VarDecl, or (for a ctor-initializer) a FieldDecl. 37116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const ValueDecl *ExtendingDecl; 3712ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 37136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned ManglingNumber; 37146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 37156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::PointerUnion<Stmt *, ExtraState *> State; 3716211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 371703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor friend class ASTStmtReader; 371803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor friend class ASTStmtWriter; 3719ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 37206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void initializeExtraState(const ValueDecl *ExtendedBy, 37216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned ManglingNumber); 37226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 372303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorpublic: 3724ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie MaterializeTemporaryExpr(QualType T, Expr *Temporary, 37256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool BoundToLvalueReference) 3726b4b7b5034bb8304ed03416635bf64c75c39889fcDouglas Gregor : Expr(MaterializeTemporaryExprClass, T, 372703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor BoundToLvalueReference? VK_LValue : VK_XValue, OK_Ordinary, 372803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor Temporary->isTypeDependent(), Temporary->isValueDependent(), 3729561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor Temporary->isInstantiationDependent(), 373003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor Temporary->containsUnexpandedParameterPack()), 37316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines State(Temporary) {} 3732ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 3733ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie MaterializeTemporaryExpr(EmptyShell Empty) 373403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor : Expr(MaterializeTemporaryExprClass, Empty) { } 3735ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 37366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Stmt *getTemporary() const { 37376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return State.is<Stmt *>() ? State.get<Stmt *>() 37386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : State.get<ExtraState *>()->Temporary; 37396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 37406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 374103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor /// \brief Retrieve the temporary-generating subexpression whose value will 374203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor /// be materialized into a glvalue. 37436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Expr *GetTemporaryExpr() const { return static_cast<Expr *>(getTemporary()); } 3744211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 3745211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith /// \brief Retrieve the storage duration for the materialized temporary. 3746211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith StorageDuration getStorageDuration() const { 37476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const ValueDecl *ExtendingDecl = getExtendingDecl(); 3748211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (!ExtendingDecl) 3749211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith return SD_FullExpression; 3750211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // FIXME: This is not necessarily correct for a temporary materialized 3751211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith // within a default initializer. 3752211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith if (isa<FieldDecl>(ExtendingDecl)) 3753211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith return SD_Automatic; 3754211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith return cast<VarDecl>(ExtendingDecl)->getStorageDuration(); 3755211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 3756211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 3757211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith /// \brief Get the declaration which triggered the lifetime-extension of this 3758211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith /// temporary, if any. 37596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const ValueDecl *getExtendingDecl() const { 37606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return State.is<Stmt *>() ? nullptr 37616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : State.get<ExtraState *>()->ExtendingDecl; 37626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3763211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith 37646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setExtendingDecl(const ValueDecl *ExtendedBy, unsigned ManglingNumber); 37656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 37666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned getManglingNumber() const { 37676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return State.is<Stmt *>() ? 0 : State.get<ExtraState *>()->ManglingNumber; 3768211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 3769ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 377003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor /// \brief Determine whether this materialized temporary is bound to an 377103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor /// lvalue reference; otherwise, it's bound to an rvalue reference. 3772ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie bool isBoundToLvalueReference() const { 377303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor return getValueKind() == VK_LValue; 377403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor } 3775ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 377665d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocStart() const LLVM_READONLY { 37776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return getTemporary()->getLocStart(); 377865d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen } 377965d78312ce026092cb6e7b1d4d06f05e18d02aa0Erik Verbruggen SourceLocation getLocEnd() const LLVM_READONLY { 37806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return getTemporary()->getLocEnd(); 3781aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar } 3782ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 378303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor static bool classof(const Stmt *T) { 378403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor return T->getStmtClass() == MaterializeTemporaryExprClass; 378503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor } 3786ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 378703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor // Iterators 37886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines child_range children() { 37896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (State.is<Stmt *>()) 37906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return child_range(State.getAddrOfPtr1(), State.getAddrOfPtr1() + 1); 37916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 37926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto ES = State.get<ExtraState *>(); 37936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return child_range(&ES->Temporary, &ES->Temporary + 1); 37946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 379503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor}; 3796ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 37975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 37985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 37995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 3800