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