1a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//===--- ExprCXX.cpp - (C++) Expression AST Node Implementation -----------===//
2a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//
3a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//                     The LLVM Compiler Infrastructure
4a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
7a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//
8a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//===----------------------------------------------------------------------===//
9a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//
10a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek// This file implements the subclesses of Expr class declared in ExprCXX.h
11a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//
12a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//===----------------------------------------------------------------------===//
13a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek
14b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/Basic/IdentifierTable.h"
15471c8b49982d1132f30b0b0da27fef94fd6e4f67Benjamin Kramer#include "clang/AST/ASTContext.h"
16b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/AST/DeclCXX.h"
17edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor#include "clang/AST/DeclTemplate.h"
18a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek#include "clang/AST/ExprCXX.h"
1926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor#include "clang/AST/TypeLoc.h"
20a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenekusing namespace clang;
21a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek
2257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor
23a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//===----------------------------------------------------------------------===//
24a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//  Child Iterators for iterating over subexpressions/substatements
25a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek//===----------------------------------------------------------------------===//
26a758d09482a1ba2eccc327365e51036e2c105820Ted Kremenek
270d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smithbool CXXTypeidExpr::isPotentiallyEvaluated() const {
280d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith  if (isTypeOperand())
290d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith    return false;
300d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith
310d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith  // C++11 [expr.typeid]p3:
320d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith  //   When typeid is applied to an expression other than a glvalue of
330d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith  //   polymorphic class type, [...] the expression is an unevaluated operand.
340d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith  const Expr *E = getExprOperand();
350d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith  if (const CXXRecordDecl *RD = E->getType()->getAsCXXRecordDecl())
360d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith    if (RD->isPolymorphic() && E->isGLValue())
370d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith      return true;
380d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith
390d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith  return false;
400d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith}
410d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith
4257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas GregorQualType CXXTypeidExpr::getTypeOperand() const {
4357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
4457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType()
4557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                                        .getUnqualifiedType();
4657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor}
4757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor
4801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetQualType CXXUuidofExpr::getTypeOperand() const {
4901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
5001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType()
5101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                                        .getUnqualifiedType();
5201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet}
5301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
54ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor// CXXScalarValueInitExpr
55ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorSourceRange CXXScalarValueInitExpr::getSourceRange() const {
56ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  SourceLocation Start = RParenLoc;
57ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (TypeInfo)
58ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    Start = TypeInfo->getTypeLoc().getBeginLoc();
59ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return SourceRange(Start, RParenLoc);
60ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor}
61ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor
624c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl// CXXNewExpr
63ad7fe864862305c2f71e047cdf6706ef43aebdc0Ted KremenekCXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
641548d14f4092a817f7d90ad3e7a65266dc85fbc5Sebastian Redl                       FunctionDecl *operatorDelete,
652aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl                       bool usualArrayDeleteWantsSize,
663b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer                       ArrayRef<Expr*> placementArgs,
672aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl                       SourceRange typeIdParens, Expr *arraySize,
682aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl                       InitializationStyle initializationStyle,
692aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl                       Expr *initializer, QualType ty,
702aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl                       TypeSourceInfo *allocatedTypeInfo,
712aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl                       SourceLocation startLoc, SourceRange directInitRange)
72f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary,
73bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         ty->isDependentType(), ty->isDependentType(),
74561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor         ty->isInstantiationDependentType(),
75bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         ty->containsUnexpandedParameterPack()),
762aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    SubExprs(0), OperatorNew(operatorNew), OperatorDelete(operatorDelete),
772aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    AllocatedTypeInfo(allocatedTypeInfo), TypeIdParens(typeIdParens),
78d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer    StartLoc(startLoc), DirectInitRange(directInitRange),
79d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer    GlobalNew(globalNew), UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize) {
802aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  assert((initializer != 0 || initializationStyle == NoInit) &&
812aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl         "Only NoInit can have no initializer.");
822aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  StoredInitializationStyle = initializer ? initializationStyle + 1 : 0;
833b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer  AllocateArgsArray(C, arraySize != 0, placementArgs.size(), initializer != 0);
844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  unsigned i = 0;
85bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  if (Array) {
86561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    if (arraySize->isInstantiationDependent())
87561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor      ExprBits.InstantiationDependent = true;
88561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
89bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (arraySize->containsUnexpandedParameterPack())
90bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
91bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
92cee63fbf0e64ac526582312bf8cf33263fc5c16eSebastian Redl    SubExprs[i++] = arraySize;
93bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
94bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
952aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  if (initializer) {
962aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    if (initializer->isInstantiationDependent())
97561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor      ExprBits.InstantiationDependent = true;
982aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl
992aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    if (initializer->containsUnexpandedParameterPack())
100bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
101bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
1022aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    SubExprs[i++] = initializer;
103bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
104bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
1053b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer  for (unsigned j = 0; j != placementArgs.size(); ++j) {
1062aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    if (placementArgs[j]->isInstantiationDependent())
107561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor      ExprBits.InstantiationDependent = true;
1082aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    if (placementArgs[j]->containsUnexpandedParameterPack())
109bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
110bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
1112aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    SubExprs[i++] = placementArgs[j];
112bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
1134c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}
1144c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
1155921863d8f24084797863b5df37842113bac4352Chris Lattnervoid CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
1162aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl                                   unsigned numPlaceArgs, bool hasInitializer){
1175921863d8f24084797863b5df37842113bac4352Chris Lattner  assert(SubExprs == 0 && "SubExprs already allocated");
1185921863d8f24084797863b5df37842113bac4352Chris Lattner  Array = isArray;
1195921863d8f24084797863b5df37842113bac4352Chris Lattner  NumPlacementArgs = numPlaceArgs;
1202aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl
1212aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  unsigned TotalSize = Array + hasInitializer + NumPlacementArgs;
1225921863d8f24084797863b5df37842113bac4352Chris Lattner  SubExprs = new (C) Stmt*[TotalSize];
1235921863d8f24084797863b5df37842113bac4352Chris Lattner}
1245921863d8f24084797863b5df37842113bac4352Chris Lattner
1258026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redlbool CXXNewExpr::shouldNullCheckAllocation(ASTContext &Ctx) const {
126c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  return getOperatorNew()->getType()->
1278026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl    castAs<FunctionProtoType>()->isNothrow(Ctx);
128c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall}
1295921863d8f24084797863b5df37842113bac4352Chris Lattner
1302aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian RedlSourceLocation CXXNewExpr::getEndLoc() const {
1312aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  switch (getInitializationStyle()) {
1322aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  case NoInit:
1332aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    return AllocatedTypeInfo->getTypeLoc().getEndLoc();
1342aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  case CallInit:
1352aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    return DirectInitRange.getEnd();
1362aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  case ListInit:
1372aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    return getInitializer()->getSourceRange().getEnd();
1382aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  }
139ebc6af1279178e1d5f4dcd9f1bbf0f06d89e3a53Matt Beaumont-Gay  llvm_unreachable("bogus initialization style");
1402aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl}
1412aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl
1424c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl// CXXDeleteExpr
1435833b0b831d6afae2885e6af420e2bda639652e6Douglas GregorQualType CXXDeleteExpr::getDestroyedType() const {
1445833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor  const Expr *Arg = getArgument();
1450fa0b78c82b864be1f956ca4af9564db7c8bb5b6Craig Silverstein  // The type-to-delete may not be a pointer if it's a dependent type.
146c87fa06caeaec2d6cb9772a187708a8bf6cf187cCraig Silverstein  const QualType ArgType = Arg->getType();
147a437ad3ec5b407ede394d74e6f9f463fa3657dbeCraig Silverstein
148a437ad3ec5b407ede394d74e6f9f463fa3657dbeCraig Silverstein  if (ArgType->isDependentType() && !ArgType->isPointerType())
149a437ad3ec5b407ede394d74e6f9f463fa3657dbeCraig Silverstein    return QualType();
1505833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor
1510fa0b78c82b864be1f956ca4af9564db7c8bb5b6Craig Silverstein  return ArgType->getAs<PointerType>()->getPointeeType();
1525833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor}
1535833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor
154a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor// CXXPseudoDestructorExpr
155a2e7dd2f4a50d835351153aee568d35ccc986310Douglas GregorPseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
156a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor : Type(Info)
157a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor{
158bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara  Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
159a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor}
160a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor
161e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCallCXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context,
162f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                Expr *Base, bool isArrow, SourceLocation OperatorLoc,
163f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                NestedNameSpecifierLoc QualifierLoc, TypeSourceInfo *ScopeType,
164f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                SourceLocation ColonColonLoc, SourceLocation TildeLoc,
165f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                PseudoDestructorTypeStorage DestroyedType)
166e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  : Expr(CXXPseudoDestructorExprClass,
167e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall         Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0,
168e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall                                         FunctionProtoType::ExtProtoInfo())),
169e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall         VK_RValue, OK_Ordinary,
170e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall         /*isTypeDependent=*/(Base->isTypeDependent() ||
171e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall           (DestroyedType.getTypeSourceInfo() &&
172e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall            DestroyedType.getTypeSourceInfo()->getType()->isDependentType())),
173bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         /*isValueDependent=*/Base->isValueDependent(),
174561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor         (Base->isInstantiationDependent() ||
175561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor          (QualifierLoc &&
176561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor           QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent()) ||
177561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor          (ScopeType &&
178561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor           ScopeType->getType()->isInstantiationDependentType()) ||
179561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor          (DestroyedType.getTypeSourceInfo() &&
180561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor           DestroyedType.getTypeSourceInfo()->getType()
181561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor                                             ->isInstantiationDependentType())),
182bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         // ContainsUnexpandedParameterPack
183bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         (Base->containsUnexpandedParameterPack() ||
184f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor          (QualifierLoc &&
185f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor           QualifierLoc.getNestedNameSpecifier()
186f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                        ->containsUnexpandedParameterPack()) ||
187bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          (ScopeType &&
188bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           ScopeType->getType()->containsUnexpandedParameterPack()) ||
189bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          (DestroyedType.getTypeSourceInfo() &&
190bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor           DestroyedType.getTypeSourceInfo()->getType()
191bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                   ->containsUnexpandedParameterPack()))),
192e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
193f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor    OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
194e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),
195e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall    DestroyedType(DestroyedType) { }
196e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
197a2e7dd2f4a50d835351153aee568d35ccc986310Douglas GregorQualType CXXPseudoDestructorExpr::getDestroyedType() const {
198a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
199a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    return TInfo->getType();
200a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor
201a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  return QualType();
202a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor}
203a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor
20426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorSourceRange CXXPseudoDestructorExpr::getSourceRange() const {
205a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  SourceLocation End = DestroyedType.getLocation();
206a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
207bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara    End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
208a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  return SourceRange(Base->getLocStart(), End);
20926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor}
21026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
211ba13543329afac4a0d01304ec2ec4924d99306a6John McCall// UnresolvedLookupExpr
212f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCallUnresolvedLookupExpr *
213bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorUnresolvedLookupExpr::Create(ASTContext &C,
214c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall                             CXXRecordDecl *NamingClass,
2154c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor                             NestedNameSpecifierLoc QualifierLoc,
216e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                             SourceLocation TemplateKWLoc,
2172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             const DeclarationNameInfo &NameInfo,
2182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             bool ADL,
2199d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara                             const TemplateArgumentListInfo *Args,
2209d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara                             UnresolvedSetIterator Begin,
2219d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara                             UnresolvedSetIterator End)
222f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall{
2239d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara  assert(Args || TemplateKWLoc.isValid());
2249d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara  unsigned num_args = Args ? Args->size() : 0;
225e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
2269d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara                         ASTTemplateKWAndArgsInfo::sizeFor(num_args));
227e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  return new (Mem) UnresolvedLookupExpr(C, NamingClass, QualifierLoc,
228e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                        TemplateKWLoc, NameInfo,
2299d9922af13edf3ddf8804a41a98d997324fdd58eAbramo Bagnara                                        ADL, /*Overload*/ true, Args,
230ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith                                        Begin, End, /*StdIsAssociated=*/false);
231f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall}
232f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
233bd65bb511c26549c96b829c1282e4c877588564aArgyrios KyrtzidisUnresolvedLookupExpr *
234e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraUnresolvedLookupExpr::CreateEmpty(ASTContext &C,
235e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                  bool HasTemplateKWAndArgsInfo,
236def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                  unsigned NumTemplateArgs) {
237bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  std::size_t size = sizeof(UnresolvedLookupExpr);
238e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (HasTemplateKWAndArgsInfo)
239e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
240bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
2413248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>());
242bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
243e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
244bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  return E;
245bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis}
246bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
247bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorOverloadExpr::OverloadExpr(StmtClass K, ASTContext &C,
2484c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor                           NestedNameSpecifierLoc QualifierLoc,
249e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                           SourceLocation TemplateKWLoc,
2502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                           const DeclarationNameInfo &NameInfo,
251bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                           const TemplateArgumentListInfo *TemplateArgs,
252928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor                           UnresolvedSetIterator Begin,
253bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                           UnresolvedSetIterator End,
254bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                           bool KnownDependent,
255561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor                           bool KnownInstantiationDependent,
256bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                           bool KnownContainsUnexpandedParameterPack)
257bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent,
258bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         KnownDependent,
259561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor         (KnownInstantiationDependent ||
260561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor          NameInfo.isInstantiationDependent() ||
261561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor          (QualifierLoc &&
262561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor           QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
263bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         (KnownContainsUnexpandedParameterPack ||
264bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          NameInfo.containsUnexpandedParameterPack() ||
2654c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor          (QualifierLoc &&
2664c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor           QualifierLoc.getNestedNameSpecifier()
2674c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor                                      ->containsUnexpandedParameterPack()))),
268d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer    NameInfo(NameInfo), QualifierLoc(QualifierLoc),
269d162cf102449d817a35ae6755b102edcf9d4583bBenjamin Kramer    Results(0), NumResults(End - Begin),
270e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    HasTemplateKWAndArgsInfo(TemplateArgs != 0 || TemplateKWLoc.isValid())
271928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor{
272a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  NumResults = End - Begin;
273928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor  if (NumResults) {
274bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    // Determine whether this expression is type-dependent.
275bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) {
276bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if ((*I)->getDeclContext()->isDependentContext() ||
277bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          isa<UnresolvedUsingValueDecl>(*I)) {
278bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.TypeDependent = true;
279bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ValueDependent = true;
2807657fd7d34426e7df6e84aa6e3d73be532a75f78Richard Smith        ExprBits.InstantiationDependent = true;
281bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      }
282bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    }
283bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
284928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor    Results = static_cast<DeclAccessPair *>(
285928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor                                C.Allocate(sizeof(DeclAccessPair) * NumResults,
2863248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner                                           llvm::alignOf<DeclAccessPair>()));
287928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor    memcpy(Results, &*Begin.getIterator(),
288a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis           NumResults * sizeof(DeclAccessPair));
289928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor  }
290a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
291bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  // If we have explicit template arguments, check for dependent
292bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  // template arguments and whether they contain any unexpanded pack
293bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  // expansions.
294bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  if (TemplateArgs) {
295bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    bool Dependent = false;
296561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    bool InstantiationDependent = false;
297bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    bool ContainsUnexpandedParameterPack = false;
298e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *TemplateArgs,
299e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               Dependent,
300e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               InstantiationDependent,
301e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               ContainsUnexpandedParameterPack);
302bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
303bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Dependent) {
304561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor      ExprBits.TypeDependent = true;
305561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor      ExprBits.ValueDependent = true;
306561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    }
307561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    if (InstantiationDependent)
308561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor      ExprBits.InstantiationDependent = true;
309bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (ContainsUnexpandedParameterPack)
310bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
311e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  } else if (TemplateKWLoc.isValid()) {
312e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
313bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
314f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
315bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  if (isTypeDependent())
316bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    setType(C.DependentTy);
317bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor}
318f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
319bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorvoid OverloadExpr::initializeResults(ASTContext &C,
320bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                     UnresolvedSetIterator Begin,
321bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                     UnresolvedSetIterator End) {
322bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  assert(Results == 0 && "Results already initialized!");
323bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  NumResults = End - Begin;
324bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  if (NumResults) {
325bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor     Results = static_cast<DeclAccessPair *>(
326bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                               C.Allocate(sizeof(DeclAccessPair) * NumResults,
327bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
328bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                          llvm::alignOf<DeclAccessPair>()));
329bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor     memcpy(Results, &*Begin.getIterator(),
330bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor            NumResults * sizeof(DeclAccessPair));
331bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
332f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall}
333f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
334e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCallCXXRecordDecl *OverloadExpr::getNamingClass() const {
335e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall  if (isa<UnresolvedLookupExpr>(this))
336e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall    return cast<UnresolvedLookupExpr>(this)->getNamingClass();
337e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall  else
338e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall    return cast<UnresolvedMemberExpr>(this)->getNamingClass();
339e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall}
340e9ee23edd17c4bb7f271e67f8790792b4de677fcJohn McCall
341865d447ac6a4721ab58e898d014a21f2eff74b06John McCall// DependentScopeDeclRefExpr
342bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorDependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
34300cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor                            NestedNameSpecifierLoc QualifierLoc,
344e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                            SourceLocation TemplateKWLoc,
345bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                            const DeclarationNameInfo &NameInfo,
346bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                            const TemplateArgumentListInfo *Args)
347bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary,
348bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         true, true,
349561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor         (NameInfo.isInstantiationDependent() ||
350561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor          (QualifierLoc &&
351561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor           QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
352bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         (NameInfo.containsUnexpandedParameterPack() ||
35300cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor          (QualifierLoc &&
35400cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor           QualifierLoc.getNestedNameSpecifier()
35500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor                            ->containsUnexpandedParameterPack()))),
35600cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor    QualifierLoc(QualifierLoc), NameInfo(NameInfo),
357e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    HasTemplateKWAndArgsInfo(Args != 0 || TemplateKWLoc.isValid())
358bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor{
359bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  if (Args) {
360bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    bool Dependent = true;
361561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    bool InstantiationDependent = true;
362bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    bool ContainsUnexpandedParameterPack
363bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      = ExprBits.ContainsUnexpandedParameterPack;
364e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *Args,
365e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               Dependent,
366e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               InstantiationDependent,
367e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               ContainsUnexpandedParameterPack);
368bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
369e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  } else if (TemplateKWLoc.isValid()) {
370e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
371bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
372bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor}
373bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
374f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCallDependentScopeDeclRefExpr *
375f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCallDependentScopeDeclRefExpr::Create(ASTContext &C,
37600cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor                                  NestedNameSpecifierLoc QualifierLoc,
377e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                  SourceLocation TemplateKWLoc,
3782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                  const DeclarationNameInfo &NameInfo,
379f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                  const TemplateArgumentListInfo *Args) {
380f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  std::size_t size = sizeof(DependentScopeDeclRefExpr);
381f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Args)
382e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    size += ASTTemplateKWAndArgsInfo::sizeFor(Args->size());
383e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  else if (TemplateKWLoc.isValid())
384e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    size += ASTTemplateKWAndArgsInfo::sizeFor(0);
385bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  void *Mem = C.Allocate(size);
386e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  return new (Mem) DependentScopeDeclRefExpr(C.DependentTy, QualifierLoc,
387e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                             TemplateKWLoc, NameInfo, Args);
388f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall}
389f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
39012dffcddb60380c5bed4f085a1f51534afda3b87Argyrios KyrtzidisDependentScopeDeclRefExpr *
39112dffcddb60380c5bed4f085a1f51534afda3b87Argyrios KyrtzidisDependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
392e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                       bool HasTemplateKWAndArgsInfo,
39312dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis                                       unsigned NumTemplateArgs) {
39412dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  std::size_t size = sizeof(DependentScopeDeclRefExpr);
395e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (HasTemplateKWAndArgsInfo)
396e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
39712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  void *Mem = C.Allocate(size);
398e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  DependentScopeDeclRefExpr *E
39900cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor    = new (Mem) DependentScopeDeclRefExpr(QualType(), NestedNameSpecifierLoc(),
400e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                          SourceLocation(),
401def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                          DeclarationNameInfo(), 0);
402e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
403def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  return E;
40412dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis}
40512dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
406428edafa9eb80e01dd40aab31d4166a787a741e1Chandler CarruthSourceRange CXXConstructExpr::getSourceRange() const {
4072882eca5a184c78f793188083f6ce539740a5cf2John McCall  if (isa<CXXTemporaryObjectExpr>(this))
4082882eca5a184c78f793188083f6ce539740a5cf2John McCall    return cast<CXXTemporaryObjectExpr>(this)->getSourceRange();
4092882eca5a184c78f793188083f6ce539740a5cf2John McCall
41040749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor  if (ParenRange.isValid())
41140749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor    return SourceRange(Loc, ParenRange.getEnd());
41240749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor
41340749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor  SourceLocation End = Loc;
41440749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor  for (unsigned I = getNumArgs(); I > 0; --I) {
41540749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor    const Expr *Arg = getArg(I-1);
41640749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor    if (!Arg->isDefaultArgument()) {
41740749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor      SourceLocation NewEnd = Arg->getLocEnd();
41840749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor      if (NewEnd.isValid()) {
41940749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor        End = NewEnd;
42040749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor        break;
42140749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor      }
42240749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor    }
42340749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor  }
42440749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor
42540749ee585abc84fbb3c8fdbd8aaac062f153062Douglas Gregor  return SourceRange(Loc, End);
426e383768f7f5d45ca4af0b1c11cbf072de18bce98Ted Kremenek}
427e383768f7f5d45ca4af0b1c11cbf072de18bce98Ted Kremenek
4284548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios KyrtzidisSourceRange CXXOperatorCallExpr::getSourceRangeImpl() const {
429b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  OverloadedOperatorKind Kind = getOperator();
430b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
431b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    if (getNumArgs() == 1)
432b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      // Prefix operator
4333539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis      return SourceRange(getOperatorLoc(), getArg(0)->getLocEnd());
434b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    else
435b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      // Postfix operator
4363539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis      return SourceRange(getArg(0)->getLocStart(), getOperatorLoc());
437d7650610b39947ad8ea8273e7e5099894f71bb08Chandler Carruth  } else if (Kind == OO_Arrow) {
438d7650610b39947ad8ea8273e7e5099894f71bb08Chandler Carruth    return getArg(0)->getSourceRange();
439b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Kind == OO_Call) {
4403539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis    return SourceRange(getArg(0)->getLocStart(), getRParenLoc());
441b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Kind == OO_Subscript) {
4423539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis    return SourceRange(getArg(0)->getLocStart(), getRParenLoc());
443b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (getNumArgs() == 1) {
4443539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis    return SourceRange(getOperatorLoc(), getArg(0)->getLocEnd());
445b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (getNumArgs() == 2) {
4463539b0c5a38ab61fac136724512309333d91ee48Argyrios Kyrtzidis    return SourceRange(getArg(0)->getLocStart(), getArg(1)->getLocEnd());
447b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else {
4484548ca2912e5f2b78a20e50c58d8a1a9c5e9e67cArgyrios Kyrtzidis    return getOperatorLoc();
449b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  }
450b4609806e9232593ece09ce08b630836e825865cDouglas Gregor}
451b4609806e9232593ece09ce08b630836e825865cDouglas Gregor
452b277159055933e610bbc80262b600d3ad7e0595cTed KremenekExpr *CXXMemberCallExpr::getImplicitObjectArgument() const {
45351e87c5fa1d506058ed594b4290b06775ec74a8eJordan Rose  const Expr *Callee = getCallee()->IgnoreParens();
45451e87c5fa1d506058ed594b4290b06775ec74a8eJordan Rose  if (const MemberExpr *MemExpr = dyn_cast<MemberExpr>(Callee))
45588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor    return MemExpr->getBase();
45651e87c5fa1d506058ed594b4290b06775ec74a8eJordan Rose  if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(Callee))
45751e87c5fa1d506058ed594b4290b06775ec74a8eJordan Rose    if (BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI)
45851e87c5fa1d506058ed594b4290b06775ec74a8eJordan Rose      return BO->getLHS();
45988a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
46088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  // FIXME: Will eventually need to cope with member pointers.
46188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  return 0;
46288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor}
46388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
464b277159055933e610bbc80262b600d3ad7e0595cTed KremenekCXXMethodDecl *CXXMemberCallExpr::getMethodDecl() const {
465b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  if (const MemberExpr *MemExpr =
466b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek      dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
467b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek    return cast<CXXMethodDecl>(MemExpr->getMemberDecl());
468b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek
469b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  // FIXME: Will eventually need to cope with member pointers.
470b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek  return 0;
471b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek}
472b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek
473b277159055933e610bbc80262b600d3ad7e0595cTed Kremenek
4740cf3c0eecbff007cea2750c113894b47d9e09f33David BlaikieCXXRecordDecl *CXXMemberCallExpr::getRecordDecl() const {
475007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth  Expr* ThisArg = getImplicitObjectArgument();
476007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth  if (!ThisArg)
477007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth    return 0;
478007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth
479007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth  if (ThisArg->getType()->isAnyPointerType())
480007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth    return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
481007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth
482007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth  return ThisArg->getType()->getAsCXXRecordDecl();
483007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth}
484007a9b1c632bfaac20e41c60cbe07fdc6d0e647cChandler Carruth
48500b98c229ef28a5e82943bb23d09fb46d24ca381Douglas Gregor
48649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor//===----------------------------------------------------------------------===//
48749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor//  Named casts
48849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor//===----------------------------------------------------------------------===//
48949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
49049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// getCastName - Get the name of the C++ cast being used, e.g.,
49149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// "static_cast", "dynamic_cast", "reinterpret_cast", or
49249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor/// "const_cast". The returned pointer must not be freed.
49349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorconst char *CXXNamedCastExpr::getCastName() const {
49449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  switch (getStmtClass()) {
49549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  case CXXStaticCastExprClass:      return "static_cast";
49649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  case CXXDynamicCastExprClass:     return "dynamic_cast";
49749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  case CXXReinterpretCastExprClass: return "reinterpret_cast";
49849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  case CXXConstCastExprClass:       return "const_cast";
49949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  default:                          return "<invalid cast>";
50049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  }
50149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
502506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor
503f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
504f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                             ExprValueKind VK,
505f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                             CastKind K, Expr *Op,
506f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                             const CXXCastPath *BasePath,
507f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                             TypeSourceInfo *WrittenTy,
5081d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                                             SourceLocation L,
5091d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                                             SourceLocation RParenLoc) {
510f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned PathSize = (BasePath ? BasePath->size() : 0);
511f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
512f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                            + PathSize * sizeof(CXXBaseSpecifier*));
513f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CXXStaticCastExpr *E =
5141d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor    new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
5151d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                                   RParenLoc);
516f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (PathSize) E->setCastPath(*BasePath);
517f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return E;
518f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
519f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
520f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
521f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                                  unsigned PathSize) {
522f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
523f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
524f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
525f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
526f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
527f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
528f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                               ExprValueKind VK,
529f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                               CastKind K, Expr *Op,
530f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                               const CXXCastPath *BasePath,
531f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                               TypeSourceInfo *WrittenTy,
5321d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                                               SourceLocation L,
5331d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                                               SourceLocation RParenLoc) {
534f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned PathSize = (BasePath ? BasePath->size() : 0);
535f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
536f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                            + PathSize * sizeof(CXXBaseSpecifier*));
537f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CXXDynamicCastExpr *E =
5381d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor    new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
5391d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                                    RParenLoc);
540f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (PathSize) E->setCastPath(*BasePath);
541f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return E;
542f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
543f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
544f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
545f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                                    unsigned PathSize) {
546f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
547f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
548f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
549f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
550f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
5510fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// isAlwaysNull - Return whether the result of the dynamic_cast is proven
5520fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// to always be null. For example:
5530fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson///
5540fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// struct A { };
5550fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// struct B final : A { };
5560fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// struct C { };
5570fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson///
5580fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson/// C *f(B* b) { return dynamic_cast<C*>(b); }
5590fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlssonbool CXXDynamicCastExpr::isAlwaysNull() const
5600fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson{
5610fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson  QualType SrcType = getSubExpr()->getType();
5620fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson  QualType DestType = getType();
5630fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson
5640fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson  if (const PointerType *SrcPTy = SrcType->getAs<PointerType>()) {
5650fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson    SrcType = SrcPTy->getPointeeType();
5660fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson    DestType = DestType->castAs<PointerType>()->getPointeeType();
5670fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson  }
5680fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson
5695ca8639f97663255880f0da81f1026a06a14d003Sean Hunt  if (DestType->isVoidType())
5705ca8639f97663255880f0da81f1026a06a14d003Sean Hunt    return false;
5715ca8639f97663255880f0da81f1026a06a14d003Sean Hunt
5720fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson  const CXXRecordDecl *SrcRD =
5730fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson    cast<CXXRecordDecl>(SrcType->castAs<RecordType>()->getDecl());
5740fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson
5753532936f4f50c15fcec4d00f4cbb81a7a9dd9b7eJakob Stoklund Olesen  if (!SrcRD->hasAttr<FinalAttr>())
5763532936f4f50c15fcec4d00f4cbb81a7a9dd9b7eJakob Stoklund Olesen    return false;
5773532936f4f50c15fcec4d00f4cbb81a7a9dd9b7eJakob Stoklund Olesen
5780fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson  const CXXRecordDecl *DestRD =
5790fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson    cast<CXXRecordDecl>(DestType->castAs<RecordType>()->getDecl());
5800fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson
5810fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson  return !DestRD->isDerivedFrom(SrcRD);
5820fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson}
5830fee330f5754ca4b248e5bb7363e834668aff06dAnders Carlsson
584f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXReinterpretCastExpr *
585f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCallCXXReinterpretCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
586f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               CastKind K, Expr *Op,
587f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                               const CXXCastPath *BasePath,
5881d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                               TypeSourceInfo *WrittenTy, SourceLocation L,
5891d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                               SourceLocation RParenLoc) {
590f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned PathSize = (BasePath ? BasePath->size() : 0);
591f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
592f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
593f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CXXReinterpretCastExpr *E =
5941d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor    new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
5951d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                                        RParenLoc);
596f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (PathSize) E->setCastPath(*BasePath);
597f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return E;
598f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
599f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
600f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXReinterpretCastExpr *
601f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
602f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
603f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                            + PathSize * sizeof(CXXBaseSpecifier*));
604f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
605f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
606f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
607f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCallCXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T,
608f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                           ExprValueKind VK, Expr *Op,
609f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                           TypeSourceInfo *WrittenTy,
6101d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                                           SourceLocation L,
6111d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor                                           SourceLocation RParenLoc) {
6121d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor  return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc);
613f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
614f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
615f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
616f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return new (C) CXXConstCastExpr(EmptyShell());
617f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
618f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
619f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXFunctionalCastExpr *
620f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCallCXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
621f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                              TypeSourceInfo *Written, SourceLocation L,
622f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                              CastKind K, Expr *Op, const CXXCastPath *BasePath,
623f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                               SourceLocation R) {
624f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned PathSize = (BasePath ? BasePath->size() : 0);
625f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
626f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                            + PathSize * sizeof(CXXBaseSpecifier*));
627f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CXXFunctionalCastExpr *E =
628f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, PathSize, R);
629f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (PathSize) E->setCastPath(*BasePath);
630f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return E;
631f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
632f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
633f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXFunctionalCastExpr *
634f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
635f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
636f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                            + PathSize * sizeof(CXXBaseSpecifier*));
637f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
638f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
639f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
6409fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard SmithUserDefinedLiteral::LiteralOperatorKind
6419fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard SmithUserDefinedLiteral::getLiteralOperatorKind() const {
6429fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  if (getNumArgs() == 0)
6439fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    return LOK_Template;
6449fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  if (getNumArgs() == 2)
6459fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    return LOK_String;
6469fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith
6479fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  assert(getNumArgs() == 1 && "unexpected #args in literal operator call");
6489fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  QualType ParamTy =
6499fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    cast<FunctionDecl>(getCalleeDecl())->getParamDecl(0)->getType();
6509fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  if (ParamTy->isPointerType())
6519fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    return LOK_Raw;
6529fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  if (ParamTy->isAnyCharacterType())
6539fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    return LOK_Character;
6549fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  if (ParamTy->isIntegerType())
6559fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    return LOK_Integer;
6569fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  if (ParamTy->isFloatingType())
6579fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    return LOK_Floating;
6589fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith
6599fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  llvm_unreachable("unknown kind of literal operator");
6609fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith}
6619fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith
6629fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard SmithExpr *UserDefinedLiteral::getCookedLiteral() {
6639fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith#ifndef NDEBUG
6649fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  LiteralOperatorKind LOK = getLiteralOperatorKind();
6659fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  assert(LOK != LOK_Template && LOK != LOK_Raw && "not a cooked literal");
6669fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith#endif
6679fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  return getArg(0);
6689fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith}
6699fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith
6709fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smithconst IdentifierInfo *UserDefinedLiteral::getUDSuffix() const {
6719fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  return cast<FunctionDecl>(getCalleeDecl())->getLiteralIdentifier();
6729fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith}
673f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
67465222e82d97af2120b3952d19cbd3cd923f4b43eDouglas GregorCXXDefaultArgExpr *
675036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas GregorCXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
676036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                          ParmVarDecl *Param, Expr *SubExpr) {
67765222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
678036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
679036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                     SubExpr);
68065222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor}
68165222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor
6821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCXXTemporary *CXXTemporary::Create(ASTContext &C,
683b859f35459ae3e1188d1e1b86df08d649695fd86Anders Carlsson                                   const CXXDestructorDecl *Destructor) {
68488eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson  return new (C) CXXTemporary(Destructor);
68588eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson}
68688eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson
6871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
688fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson                                                   CXXTemporary *Temp,
689fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson                                                   Expr* SubExpr) {
690bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne  assert((SubExpr->getType()->isRecordType() ||
691bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne          SubExpr->getType()->isArrayType()) &&
692bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne         "Expression bound to a temporary must have record or array type!");
693fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson
694bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
695fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson}
696fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson
6978e587a15da6d3457a418239d5eb4146fcbd209f3Anders CarlssonCXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
69826de54983e7977fad615c94012f2f67d0d1cf404Anders Carlsson                                               CXXConstructorDecl *Cons,
699ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               TypeSourceInfo *Type,
7003b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer                                               ArrayRef<Expr*> Args,
701428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                               SourceRange parenRange,
7027cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara                                               bool HadMultipleCandidates,
7031c63b9c15d48cb8c833a4b2d6fd6c496c0766e88Douglas Gregor                                               bool ZeroInitialization)
704ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
705ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                     Type->getType().getNonReferenceType(),
706ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                     Type->getTypeLoc().getBeginLoc(),
7073b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer                     Cons, false, Args,
7085b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl                     HadMultipleCandidates, /*FIXME*/false, ZeroInitialization,
709428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                     CXXConstructExpr::CK_Complete, parenRange),
710428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth    Type(Type) {
711ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor}
712ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor
713ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorSourceRange CXXTemporaryObjectExpr::getSourceRange() const {
714428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  return SourceRange(Type->getTypeLoc().getBeginLoc(),
715428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                     getParenRange().getEnd());
716506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor}
71719d28a650ca6d98f7907ad891557fccca7baaea8Anders Carlsson
7181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
71999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor                                           SourceLocation Loc,
7208e587a15da6d3457a418239d5eb4146fcbd209f3Anders Carlsson                                           CXXConstructorDecl *D, bool Elidable,
7213b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer                                           ArrayRef<Expr*> Args,
7227cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara                                           bool HadMultipleCandidates,
7235b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl                                           bool ListInitialization,
7249db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor                                           bool ZeroInitialization,
725428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                           ConstructionKind ConstructKind,
726428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                           SourceRange ParenRange) {
72799a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor  return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
7283b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer                                  Elidable, Args,
7295b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl                                  HadMultipleCandidates, ListInitialization,
7305b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl                                  ZeroInitialization, ConstructKind,
7315b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl                                  ParenRange);
732e349bea668622ef31bd51a229960a73d69940709Anders Carlsson}
733e349bea668622ef31bd51a229960a73d69940709Anders Carlsson
7341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
73599a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor                                   SourceLocation Loc,
7368e587a15da6d3457a418239d5eb4146fcbd209f3Anders Carlsson                                   CXXConstructorDecl *D, bool elidable,
7373b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer                                   ArrayRef<Expr*> args,
7387cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara                                   bool HadMultipleCandidates,
7395b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl                                   bool ListInitialization,
7407cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara                                   bool ZeroInitialization,
741428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                   ConstructionKind ConstructKind,
742428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                   SourceRange ParenRange)
743bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(SC, T, VK_RValue, OK_Ordinary,
744bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         T->isDependentType(), T->isDependentType(),
745561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor         T->isInstantiationDependentType(),
746bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         T->containsUnexpandedParameterPack()),
7473b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer    Constructor(D), Loc(Loc), ParenRange(ParenRange),  NumArgs(args.size()),
7487cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara    Elidable(elidable), HadMultipleCandidates(HadMultipleCandidates),
7495b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl    ListInitialization(ListInitialization),
7507cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara    ZeroInitialization(ZeroInitialization),
751a48e676a717309afa50ae06a3d4674acec025bf9Douglas Gregor    ConstructKind(ConstructKind), Args(0)
75216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor{
75316006c901315fa12a108b4e571f187f4b676e426Douglas Gregor  if (NumArgs) {
7543b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer    Args = new (C) Stmt*[args.size()];
75516006c901315fa12a108b4e571f187f4b676e426Douglas Gregor
7563b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer    for (unsigned i = 0; i != args.size(); ++i) {
75716006c901315fa12a108b4e571f187f4b676e426Douglas Gregor      assert(args[i] && "NULL argument in CXXConstructExpr");
758bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
759bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (args[i]->isValueDependent())
760bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ValueDependent = true;
761561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor      if (args[i]->isInstantiationDependent())
762561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor        ExprBits.InstantiationDependent = true;
763bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (args[i]->containsUnexpandedParameterPack())
764bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ContainsUnexpandedParameterPack = true;
765bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
76616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor      Args[i] = args[i];
767e349bea668622ef31bd51a229960a73d69940709Anders Carlsson    }
76816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor  }
769e349bea668622ef31bd51a229960a73d69940709Anders Carlsson}
770e349bea668622ef31bd51a229960a73d69940709Anders Carlsson
77101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorLambdaExpr::Capture::Capture(SourceLocation Loc, bool Implicit,
77201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                             LambdaCaptureKind Kind, VarDecl *Var,
77301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                             SourceLocation EllipsisLoc)
77401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  : VarAndBits(Var, 0), Loc(Loc), EllipsisLoc(EllipsisLoc)
77501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor{
77601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  unsigned Bits = 0;
77701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  if (Implicit)
77801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    Bits |= Capture_Implicit;
77901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
78001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  switch (Kind) {
78101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  case LCK_This:
78201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    assert(Var == 0 && "'this' capture cannot have a variable!");
78301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    break;
78401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
78501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  case LCK_ByCopy:
78601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    Bits |= Capture_ByCopy;
78701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    // Fall through
78801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  case LCK_ByRef:
78901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    assert(Var && "capture must have a variable!");
79001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    break;
79101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  }
79201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  VarAndBits.setInt(Bits);
79301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}
79401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
79501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorLambdaCaptureKind LambdaExpr::Capture::getCaptureKind() const {
79601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  if (capturesThis())
79701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    return LCK_This;
79801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
79901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  return (VarAndBits.getInt() & Capture_ByCopy)? LCK_ByCopy : LCK_ByRef;
80001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}
80101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
80201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorLambdaExpr::LambdaExpr(QualType T,
80301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                       SourceRange IntroducerRange,
80401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                       LambdaCaptureDefault CaptureDefault,
80501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                       ArrayRef<Capture> Captures,
80601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                       bool ExplicitParams,
807dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor                       bool ExplicitResultType,
80801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                       ArrayRef<Expr *> CaptureInits,
8097ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor                       ArrayRef<VarDecl *> ArrayIndexVars,
8107ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor                       ArrayRef<unsigned> ArrayIndexStarts,
811612409ece080e814f79e06772c690d603f45fbd6Richard Smith                       SourceLocation ClosingBrace,
812612409ece080e814f79e06772c690d603f45fbd6Richard Smith                       bool ContainsUnexpandedParameterPack)
81301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  : Expr(LambdaExprClass, T, VK_RValue, OK_Ordinary,
81401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor         T->isDependentType(), T->isDependentType(), T->isDependentType(),
815612409ece080e814f79e06772c690d603f45fbd6Richard Smith         ContainsUnexpandedParameterPack),
81601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    IntroducerRange(IntroducerRange),
8177ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor    NumCaptures(Captures.size()),
81801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    CaptureDefault(CaptureDefault),
81901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    ExplicitParams(ExplicitParams),
820dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor    ExplicitResultType(ExplicitResultType),
82101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    ClosingBrace(ClosingBrace)
82201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor{
82301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  assert(CaptureInits.size() == Captures.size() && "Wrong number of arguments");
824da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor  CXXRecordDecl *Class = getLambdaClass();
825da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor  CXXRecordDecl::LambdaDefinitionData &Data = Class->getLambdaData();
826da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor
827da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor  // FIXME: Propagate "has unexpanded parameter pack" bit.
8287ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor
8297ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  // Copy captures.
8307ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  ASTContext &Context = Class->getASTContext();
8317ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  Data.NumCaptures = NumCaptures;
8327ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  Data.NumExplicitCaptures = 0;
8337ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  Data.Captures = (Capture *)Context.Allocate(sizeof(Capture) * NumCaptures);
8347ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  Capture *ToCapture = Data.Captures;
8357ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  for (unsigned I = 0, N = Captures.size(); I != N; ++I) {
8367ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor    if (Captures[I].isExplicit())
8377ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor      ++Data.NumExplicitCaptures;
8387ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor
8397ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor    *ToCapture++ = Captures[I];
8407ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  }
8417ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor
8427ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  // Copy initialization expressions for the non-static data members.
8437ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  Stmt **Stored = getStoredStmts();
8447ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  for (unsigned I = 0, N = CaptureInits.size(); I != N; ++I)
8457ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor    *Stored++ = CaptureInits[I];
8467ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor
8477ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  // Copy the body of the lambda.
8487ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  *Stored++ = getCallOperator()->getBody();
8497ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor
8507ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  // Copy the array index variables, if any.
8517ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  HasArrayIndexVars = !ArrayIndexVars.empty();
8527ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  if (HasArrayIndexVars) {
8537ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor    assert(ArrayIndexStarts.size() == NumCaptures);
8547ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor    memcpy(getArrayIndexVars(), ArrayIndexVars.data(),
8557ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor           sizeof(VarDecl *) * ArrayIndexVars.size());
8567ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor    memcpy(getArrayIndexStarts(), ArrayIndexStarts.data(),
8577ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor           sizeof(unsigned) * Captures.size());
8587ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor    getArrayIndexStarts()[Captures.size()] = ArrayIndexVars.size();
8595878cbcfaa90b8515550db86033fd5a0efab971dDouglas Gregor  }
86001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}
86101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
86201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorLambdaExpr *LambdaExpr::Create(ASTContext &Context,
86301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                               CXXRecordDecl *Class,
86401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                               SourceRange IntroducerRange,
86501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                               LambdaCaptureDefault CaptureDefault,
86601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                               ArrayRef<Capture> Captures,
86701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                               bool ExplicitParams,
868dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor                               bool ExplicitResultType,
86901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                               ArrayRef<Expr *> CaptureInits,
8707ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor                               ArrayRef<VarDecl *> ArrayIndexVars,
8717ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor                               ArrayRef<unsigned> ArrayIndexStarts,
872612409ece080e814f79e06772c690d603f45fbd6Richard Smith                               SourceLocation ClosingBrace,
873612409ece080e814f79e06772c690d603f45fbd6Richard Smith                               bool ContainsUnexpandedParameterPack) {
87401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  // Determine the type of the expression (i.e., the type of the
87501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  // function object we're creating).
87601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  QualType T = Context.getTypeDeclType(Class);
87701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
8787ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  unsigned Size = sizeof(LambdaExpr) + sizeof(Stmt *) * (Captures.size() + 1);
87988d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith  if (!ArrayIndexVars.empty()) {
88088d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith    Size += sizeof(unsigned) * (Captures.size() + 1);
88188d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith    // Realign for following VarDecl array.
882a796b6c4b99116ca31e6e61d8765b321678d580eRichard Smith    Size = llvm::RoundUpToAlignment(Size, llvm::alignOf<VarDecl*>());
88388d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith    Size += sizeof(VarDecl *) * ArrayIndexVars.size();
88488d2f678e70ab9360f09f3534d9223e6ec20f129Richard Smith  }
8857ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  void *Mem = Context.Allocate(Size);
8867ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  return new (Mem) LambdaExpr(T, IntroducerRange, CaptureDefault,
887dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor                              Captures, ExplicitParams, ExplicitResultType,
888dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor                              CaptureInits, ArrayIndexVars, ArrayIndexStarts,
889612409ece080e814f79e06772c690d603f45fbd6Richard Smith                              ClosingBrace, ContainsUnexpandedParameterPack);
89001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}
89101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
8929d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas GregorLambdaExpr *LambdaExpr::CreateDeserialized(ASTContext &C, unsigned NumCaptures,
8939d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor                                           unsigned NumArrayIndexVars) {
8949d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor  unsigned Size = sizeof(LambdaExpr) + sizeof(Stmt *) * (NumCaptures + 1);
8959d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor  if (NumArrayIndexVars)
8969d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor    Size += sizeof(VarDecl) * NumArrayIndexVars
8979d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor          + sizeof(unsigned) * (NumCaptures + 1);
8989d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor  void *Mem = C.Allocate(Size);
8999d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor  return new (Mem) LambdaExpr(EmptyShell(), NumCaptures, NumArrayIndexVars > 0);
9009d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor}
9019d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor
902da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::capture_begin() const {
9037ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  return getLambdaClass()->getLambdaData().Captures;
904da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor}
905da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor
906da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::capture_end() const {
9077ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  return capture_begin() + NumCaptures;
908da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor}
909da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor
910da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::explicit_capture_begin() const {
911da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor  return capture_begin();
912da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor}
913da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor
914da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::explicit_capture_end() const {
915da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor  struct CXXRecordDecl::LambdaDefinitionData &Data
916da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor    = getLambdaClass()->getLambdaData();
9177ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  return Data.Captures + Data.NumExplicitCaptures;
918da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor}
919da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor
920da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::implicit_capture_begin() const {
921da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor  return explicit_capture_end();
922da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor}
923da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor
924da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas GregorLambdaExpr::capture_iterator LambdaExpr::implicit_capture_end() const {
925da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor  return capture_end();
926da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor}
927da8962a6198bc4bf09a38209db99551b2b0a41a0Douglas Gregor
9289daa7bfdff7256cef693d7bf10084881bcb9253cDouglas GregorArrayRef<VarDecl *>
9299daa7bfdff7256cef693d7bf10084881bcb9253cDouglas GregorLambdaExpr::getCaptureInitIndexVars(capture_init_iterator Iter) const {
9307ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  assert(HasArrayIndexVars && "No array index-var data?");
9319daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor
9329daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor  unsigned Index = Iter - capture_init_begin();
93343a1b00153a60e3bab1ff66e4674b1bc13d23817Matt Beaumont-Gay  assert(Index < getLambdaClass()->getLambdaData().NumCaptures &&
93443a1b00153a60e3bab1ff66e4674b1bc13d23817Matt Beaumont-Gay         "Capture index out-of-range");
9357ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  VarDecl **IndexVars = getArrayIndexVars();
9367ae282fde0a12635893931ebf31b35b0d5d5cab3Douglas Gregor  unsigned *IndexStarts = getArrayIndexStarts();
9379daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor  return ArrayRef<VarDecl *>(IndexVars + IndexStarts[Index],
9389daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor                             IndexVars + IndexStarts[Index + 1]);
9399daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor}
9409daa7bfdff7256cef693d7bf10084881bcb9253cDouglas Gregor
94101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorCXXRecordDecl *LambdaExpr::getLambdaClass() const {
94201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  return getType()->getAsCXXRecordDecl();
94301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}
94401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
94501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas GregorCXXMethodDecl *LambdaExpr::getCallOperator() const {
94601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  CXXRecordDecl *Record = getLambdaClass();
94701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  DeclarationName Name
94801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    = Record->getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
94901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  DeclContext::lookup_result Calls = Record->lookup(Name);
95001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  assert(Calls.first != Calls.second && "Missing lambda call operator!");
95101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  CXXMethodDecl *Result = cast<CXXMethodDecl>(*Calls.first++);
95201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  assert(Calls.first == Calls.second && "More than lambda one call operator?");
95301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  return Result;
95401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}
95501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
9569d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas GregorCompoundStmt *LambdaExpr::getBody() const {
9579d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor  if (!getStoredStmts()[NumCaptures])
9589d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor    getStoredStmts()[NumCaptures] = getCallOperator()->getBody();
9599d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor
9609d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor  return reinterpret_cast<CompoundStmt *>(getStoredStmts()[NumCaptures]);
9619d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor}
9629d36f5dc4121f0f931211ea2d0a74d299eb82b23Douglas Gregor
96301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregorbool LambdaExpr::isMutable() const {
9644ef832ffc1147ce2f9777f9fad650cb3139a1d00David Blaikie  return !getCallOperator()->isConst();
96501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}
96601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
96780ee6e878a169e6255d4686a91bb696151ff229fJohn McCallExprWithCleanups::ExprWithCleanups(Expr *subexpr,
96880ee6e878a169e6255d4686a91bb696151ff229fJohn McCall                                   ArrayRef<CleanupObject> objects)
9694765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall  : Expr(ExprWithCleanupsClass, subexpr->getType(),
970f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall         subexpr->getValueKind(), subexpr->getObjectKind(),
971bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         subexpr->isTypeDependent(), subexpr->isValueDependent(),
972561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor         subexpr->isInstantiationDependent(),
973bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         subexpr->containsUnexpandedParameterPack()),
97480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall    SubExpr(subexpr) {
97580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  ExprWithCleanupsBits.NumObjects = objects.size();
97680ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  for (unsigned i = 0, e = objects.size(); i != e; ++i)
97780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall    getObjectsBuffer()[i] = objects[i];
97802bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson}
97902bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
98080ee6e878a169e6255d4686a91bb696151ff229fJohn McCallExprWithCleanups *ExprWithCleanups::Create(ASTContext &C, Expr *subexpr,
98180ee6e878a169e6255d4686a91bb696151ff229fJohn McCall                                           ArrayRef<CleanupObject> objects) {
98280ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  size_t size = sizeof(ExprWithCleanups)
98380ee6e878a169e6255d4686a91bb696151ff229fJohn McCall              + objects.size() * sizeof(CleanupObject);
98480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  void *buffer = C.Allocate(size, llvm::alignOf<ExprWithCleanups>());
98580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  return new (buffer) ExprWithCleanups(subexpr, objects);
986d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
987d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
98880ee6e878a169e6255d4686a91bb696151ff229fJohn McCallExprWithCleanups::ExprWithCleanups(EmptyShell empty, unsigned numObjects)
98980ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  : Expr(ExprWithCleanupsClass, empty) {
99080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  ExprWithCleanupsBits.NumObjects = numObjects;
99180ee6e878a169e6255d4686a91bb696151ff229fJohn McCall}
992d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
99380ee6e878a169e6255d4686a91bb696151ff229fJohn McCallExprWithCleanups *ExprWithCleanups::Create(ASTContext &C, EmptyShell empty,
99480ee6e878a169e6255d4686a91bb696151ff229fJohn McCall                                           unsigned numObjects) {
99580ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  size_t size = sizeof(ExprWithCleanups) + numObjects * sizeof(CleanupObject);
99680ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  void *buffer = C.Allocate(size, llvm::alignOf<ExprWithCleanups>());
99780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  return new (buffer) ExprWithCleanups(empty, numObjects);
99888eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson}
99988eaf075c56672761b72cc50957db4a35bf24ebdAnders Carlsson
1000ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorCXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
1001d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor                                                 SourceLocation LParenLoc,
10023b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer                                                 ArrayRef<Expr*> Args,
1003d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor                                                 SourceLocation RParenLoc)
1004ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  : Expr(CXXUnresolvedConstructExprClass,
1005ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor         Type->getType().getNonReferenceType(),
1006032c86921177031ecbb46c398b3e710758ba915eDouglas Gregor         (Type->getType()->isLValueReferenceType() ? VK_LValue
1007032c86921177031ecbb46c398b3e710758ba915eDouglas Gregor          :Type->getType()->isRValueReferenceType()? VK_XValue
1008032c86921177031ecbb46c398b3e710758ba915eDouglas Gregor          :VK_RValue),
1009032c86921177031ecbb46c398b3e710758ba915eDouglas Gregor         OK_Ordinary,
1010561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor         Type->getType()->isDependentType(), true, true,
1011bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         Type->getType()->containsUnexpandedParameterPack()),
1012ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    Type(Type),
1013d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor    LParenLoc(LParenLoc),
1014d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor    RParenLoc(RParenLoc),
10153b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer    NumArgs(Args.size()) {
1016d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
10173b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer  for (unsigned I = 0; I != Args.size(); ++I) {
1018bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->containsUnexpandedParameterPack())
1019bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
1020bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
1021bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    StoredArgs[I] = Args[I];
1022bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
1023d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor}
1024d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor
1025d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas GregorCXXUnresolvedConstructExpr *
10261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCXXUnresolvedConstructExpr::Create(ASTContext &C,
1027ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                   TypeSourceInfo *Type,
1028d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor                                   SourceLocation LParenLoc,
10293b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer                                   ArrayRef<Expr*> Args,
1030d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor                                   SourceLocation RParenLoc) {
1031d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
10323b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer                         sizeof(Expr *) * Args.size());
10333b6bef9a213249c6ab6d67c07b1ac6380961be3eBenjamin Kramer  return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc, Args, RParenLoc);
1034d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor}
1035d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor
10368dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios KyrtzidisCXXUnresolvedConstructExpr *
10378dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios KyrtzidisCXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
10388dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  Stmt::EmptyShell Empty;
10398dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
10408dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis                         sizeof(Expr *) * NumArgs);
10418dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
10428dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
10438dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1044ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorSourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
1045ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
1046ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor}
1047ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor
1048865d447ac6a4721ab58e898d014a21f2eff74b06John McCallCXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
1049aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                 Expr *Base, QualType BaseType,
1050aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                 bool IsArrow,
10513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                 SourceLocation OperatorLoc,
1052e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                          NestedNameSpecifierLoc QualifierLoc,
1053e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                          SourceLocation TemplateKWLoc,
10543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                          NamedDecl *FirstQualifierFoundInScope,
10552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                          DeclarationNameInfo MemberNameInfo,
1056d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                   const TemplateArgumentListInfo *TemplateArgs)
1057f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
1058561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor         VK_LValue, OK_Ordinary, true, true, true,
1059bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         ((Base && Base->containsUnexpandedParameterPack()) ||
10607c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor          (QualifierLoc &&
10617c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor           QualifierLoc.getNestedNameSpecifier()
10627c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                       ->containsUnexpandedParameterPack()) ||
1063bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          MemberNameInfo.containsUnexpandedParameterPack())),
1064aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base(Base), BaseType(BaseType), IsArrow(IsArrow),
1065e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    HasTemplateKWAndArgsInfo(TemplateArgs != 0 || TemplateKWLoc.isValid()),
10667c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
10673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    FirstQualifierFoundInScope(FirstQualifierFoundInScope),
10682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    MemberNameInfo(MemberNameInfo) {
1069bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  if (TemplateArgs) {
1070bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    bool Dependent = true;
1071561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    bool InstantiationDependent = true;
1072bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    bool ContainsUnexpandedParameterPack = false;
1073e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *TemplateArgs,
1074e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               Dependent,
1075e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               InstantiationDependent,
1076e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               ContainsUnexpandedParameterPack);
1077bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (ContainsUnexpandedParameterPack)
1078bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
1079e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  } else if (TemplateKWLoc.isValid()) {
1080e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
1081bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
10823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor}
10833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
1084bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorCXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
1085bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                          Expr *Base, QualType BaseType,
1086bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                          bool IsArrow,
1087bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                          SourceLocation OperatorLoc,
10887c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                          NestedNameSpecifierLoc QualifierLoc,
1089bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                          NamedDecl *FirstQualifierFoundInScope,
1090bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                          DeclarationNameInfo MemberNameInfo)
1091bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
1092561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor         VK_LValue, OK_Ordinary, true, true, true,
1093bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         ((Base && Base->containsUnexpandedParameterPack()) ||
10947c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor          (QualifierLoc &&
10957c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor           QualifierLoc.getNestedNameSpecifier()->
10967c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                         containsUnexpandedParameterPack()) ||
1097bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          MemberNameInfo.containsUnexpandedParameterPack())),
1098bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    Base(Base), BaseType(BaseType), IsArrow(IsArrow),
1099e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    HasTemplateKWAndArgsInfo(false),
1100e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
1101bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    FirstQualifierFoundInScope(FirstQualifierFoundInScope),
1102bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    MemberNameInfo(MemberNameInfo) { }
1103bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
1104865d447ac6a4721ab58e898d014a21f2eff74b06John McCallCXXDependentScopeMemberExpr *
1105865d447ac6a4721ab58e898d014a21f2eff74b06John McCallCXXDependentScopeMemberExpr::Create(ASTContext &C,
1106aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                Expr *Base, QualType BaseType, bool IsArrow,
11073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                SourceLocation OperatorLoc,
11087c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                NestedNameSpecifierLoc QualifierLoc,
1109e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                SourceLocation TemplateKWLoc,
11103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                NamedDecl *FirstQualifierFoundInScope,
11112577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                DeclarationNameInfo MemberNameInfo,
1112d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                const TemplateArgumentListInfo *TemplateArgs) {
1113e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (!TemplateArgs && !TemplateKWLoc.isValid())
1114aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
1115aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               IsArrow, OperatorLoc,
11167c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                               QualifierLoc,
1117aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               FirstQualifierFoundInScope,
11182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                               MemberNameInfo);
11191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1120e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->size() : 0;
1121e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  std::size_t size = sizeof(CXXDependentScopeMemberExpr)
1122e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    + ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
1123d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
11243248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
1125aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
1126aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               IsArrow, OperatorLoc,
11277c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                               QualifierLoc,
1128e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               TemplateKWLoc,
1129aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               FirstQualifierFoundInScope,
11302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                               MemberNameInfo, TemplateArgs);
11313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor}
11323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
11338dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios KyrtzidisCXXDependentScopeMemberExpr *
11348dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios KyrtzidisCXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
1135e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                         bool HasTemplateKWAndArgsInfo,
11368dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis                                         unsigned NumTemplateArgs) {
1137e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (!HasTemplateKWAndArgsInfo)
11388dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
1139e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                               0, SourceLocation(),
11407c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                               NestedNameSpecifierLoc(), 0,
11412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                               DeclarationNameInfo());
11428dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
11438dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
1144e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                     ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
11453248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
11468dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  CXXDependentScopeMemberExpr *E
11478dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    =  new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
1148e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                             0, SourceLocation(),
1149e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                             NestedNameSpecifierLoc(),
1150e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                             SourceLocation(), 0,
11512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                             DeclarationNameInfo(), 0);
1152e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  E->HasTemplateKWAndArgsInfo = true;
11538dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  return E;
11548dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
11558dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
11564c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregorbool CXXDependentScopeMemberExpr::isImplicitAccess() const {
11574c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  if (Base == 0)
11584c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    return true;
11594c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor
116075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  return cast<Expr>(Base)->isImplicitCXXThis();
11614c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor}
11624c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor
1163864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCallstatic bool hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin,
1164864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall                                            UnresolvedSetIterator end) {
1165864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  do {
1166864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    NamedDecl *decl = *begin;
1167864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    if (isa<UnresolvedUsingValueDecl>(decl))
1168864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall      return false;
1169864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    if (isa<UsingShadowDecl>(decl))
1170864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall      decl = cast<UsingShadowDecl>(decl)->getUnderlyingDecl();
1171864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
1172864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    // Unresolved member expressions should only contain methods and
1173864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    // method templates.
1174864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    assert(isa<CXXMethodDecl>(decl) || isa<FunctionTemplateDecl>(decl));
1175864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
1176864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    if (isa<FunctionTemplateDecl>(decl))
1177864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall      decl = cast<FunctionTemplateDecl>(decl)->getTemplatedDecl();
1178864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    if (cast<CXXMethodDecl>(decl)->isStatic())
1179864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall      return false;
1180864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  } while (++begin != end);
1181864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
1182864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  return true;
1183864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall}
1184864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
1185bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorUnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C,
1186129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                           bool HasUnresolvedUsing,
1187aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                           Expr *Base, QualType BaseType,
1188aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                           bool IsArrow,
1189129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                           SourceLocation OperatorLoc,
11904c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor                                           NestedNameSpecifierLoc QualifierLoc,
1191e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                           SourceLocation TemplateKWLoc,
11922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                   const DeclarationNameInfo &MemberNameInfo,
11935a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor                                   const TemplateArgumentListInfo *TemplateArgs,
11945a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor                                           UnresolvedSetIterator Begin,
11955a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor                                           UnresolvedSetIterator End)
1196e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  : OverloadExpr(UnresolvedMemberExprClass, C, QualifierLoc, TemplateKWLoc,
1197e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                 MemberNameInfo, TemplateArgs, Begin, End,
1198bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                 // Dependent
1199bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                 ((Base && Base->isTypeDependent()) ||
1200bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                  BaseType->isDependentType()),
1201561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor                 ((Base && Base->isInstantiationDependent()) ||
1202561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor                   BaseType->isInstantiationDependentType()),
1203bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                 // Contains unexpanded parameter pack
1204bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                 ((Base && Base->containsUnexpandedParameterPack()) ||
1205bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                  BaseType->containsUnexpandedParameterPack())),
12067bb12da2b0749eeebb21854c77877736969e59f2John McCall    IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
12077bb12da2b0749eeebb21854c77877736969e59f2John McCall    Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
1208864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
1209864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  // Check whether all of the members are non-static member functions,
1210864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  // and if so, mark give this bound-member type instead of overload type.
1211864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  if (hasOnlyNonStaticMemberFunctions(Begin, End))
1212864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    setType(C.BoundMemberTy);
1213129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
1214129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
12154c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregorbool UnresolvedMemberExpr::isImplicitAccess() const {
12164c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  if (Base == 0)
12174c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    return true;
12184c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor
121975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  return cast<Expr>(Base)->isImplicitCXXThis();
12204c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor}
12214c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor
1222129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallUnresolvedMemberExpr *
1223bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorUnresolvedMemberExpr::Create(ASTContext &C,
1224129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                             bool HasUnresolvedUsing,
1225aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                             Expr *Base, QualType BaseType, bool IsArrow,
1226129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                             SourceLocation OperatorLoc,
12274c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor                             NestedNameSpecifierLoc QualifierLoc,
1228e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                             SourceLocation TemplateKWLoc,
12292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             const DeclarationNameInfo &MemberNameInfo,
12305a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor                             const TemplateArgumentListInfo *TemplateArgs,
12315a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor                             UnresolvedSetIterator Begin,
12325a84dec38cfa9e084377a3167b474c79283c82faDouglas Gregor                             UnresolvedSetIterator End) {
1233129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  std::size_t size = sizeof(UnresolvedMemberExpr);
1234129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (TemplateArgs)
1235e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    size += ASTTemplateKWAndArgsInfo::sizeFor(TemplateArgs->size());
1236e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  else if (TemplateKWLoc.isValid())
1237e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    size += ASTTemplateKWAndArgsInfo::sizeFor(0);
1238129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
12393248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
1240928e6fcf66fc4f342bcf7cc96bf56986c9c2a833Douglas Gregor  return new (Mem) UnresolvedMemberExpr(C,
1241bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                             HasUnresolvedUsing, Base, BaseType,
1242e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                             IsArrow, OperatorLoc, QualifierLoc, TemplateKWLoc,
12432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             MemberNameInfo, TemplateArgs, Begin, End);
1244129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
1245129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
1246a77eb0862507b900a10fa352af1568e639ed10b1Argyrios KyrtzidisUnresolvedMemberExpr *
1247e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraUnresolvedMemberExpr::CreateEmpty(ASTContext &C, bool HasTemplateKWAndArgsInfo,
1248def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                  unsigned NumTemplateArgs) {
1249a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  std::size_t size = sizeof(UnresolvedMemberExpr);
1250e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (HasTemplateKWAndArgsInfo)
1251e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
1252a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
12533248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
1254a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
1255e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
1256a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  return E;
1257a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1258a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1259c373d48502ca7683ab55385f5bd624d778eb288dJohn McCallCXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
1260c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
1261c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall
1262c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  // If there was a nested name specifier, it names the naming class.
1263c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  // It can't be dependent: after all, we were actually able to do the
1264c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  // lookup.
1265c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  CXXRecordDecl *Record = 0;
12667bb12da2b0749eeebb21854c77877736969e59f2John McCall  if (getQualifier()) {
1267f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    const Type *T = getQualifier()->getAsType();
1268c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall    assert(T && "qualifier in member expression does not name type");
1269c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor    Record = T->getAsCXXRecordDecl();
1270c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor    assert(Record && "qualifier in member expression does not name record");
1271c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  }
1272c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  // Otherwise the naming class must have been the base class.
1273c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  else {
1274c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall    QualType BaseType = getBaseType().getNonReferenceType();
1275c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall    if (isArrow()) {
1276c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall      const PointerType *PT = BaseType->getAs<PointerType>();
1277c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall      assert(PT && "base of arrow member access is not pointer");
1278c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall      BaseType = PT->getPointeeType();
1279c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall    }
1280c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall
1281c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor    Record = BaseType->getAsCXXRecordDecl();
1282c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor    assert(Record && "base of member expression does not name record");
1283c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  }
1284c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall
1285c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  return Record;
1286c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall}
1287c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall
1288c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorSubstNonTypeTemplateParmPackExpr::
1289c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorSubstNonTypeTemplateParmPackExpr(QualType T,
1290c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                 NonTypeTemplateParmDecl *Param,
1291c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                 SourceLocation NameLoc,
1292c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                 const TemplateArgument &ArgPack)
1293c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  : Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary,
1294561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor         true, true, true, true),
1295c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    Param(Param), Arguments(ArgPack.pack_begin()),
1296c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { }
1297c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
1298c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorTemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const {
1299c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  return TemplateArgument(Arguments, NumArguments);
1300c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor}
1301c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
13024ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas GregorTypeTraitExpr::TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind,
13034ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor                             ArrayRef<TypeSourceInfo *> Args,
13044ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor                             SourceLocation RParenLoc,
13054ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor                             bool Value)
13064ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  : Expr(TypeTraitExprClass, T, VK_RValue, OK_Ordinary,
13074ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor         /*TypeDependent=*/false,
13084ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor         /*ValueDependent=*/false,
13094ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor         /*InstantiationDependent=*/false,
13104ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor         /*ContainsUnexpandedParameterPack=*/false),
13114ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    Loc(Loc), RParenLoc(RParenLoc)
13124ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor{
13134ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  TypeTraitExprBits.Kind = Kind;
13144ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  TypeTraitExprBits.Value = Value;
13154ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  TypeTraitExprBits.NumArgs = Args.size();
13164ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
13174ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  TypeSourceInfo **ToArgs = getTypeSourceInfos();
13184ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
13194ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  for (unsigned I = 0, N = Args.size(); I != N; ++I) {
13204ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    if (Args[I]->getType()->isDependentType())
13214ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor      setValueDependent(true);
13224ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    if (Args[I]->getType()->isInstantiationDependentType())
13234ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor      setInstantiationDependent(true);
13244ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    if (Args[I]->getType()->containsUnexpandedParameterPack())
13254ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor      setContainsUnexpandedParameterPack(true);
13264ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
13274ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    ToArgs[I] = Args[I];
13284ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  }
13294ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}
13304ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
13314ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas GregorTypeTraitExpr *TypeTraitExpr::Create(ASTContext &C, QualType T,
13324ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor                                     SourceLocation Loc,
13334ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor                                     TypeTrait Kind,
13344ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor                                     ArrayRef<TypeSourceInfo *> Args,
13354ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor                                     SourceLocation RParenLoc,
13364ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor                                     bool Value) {
13374ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  unsigned Size = sizeof(TypeTraitExpr) + sizeof(TypeSourceInfo*) * Args.size();
13384ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  void *Mem = C.Allocate(Size);
13394ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  return new (Mem) TypeTraitExpr(T, Loc, Kind, Args, RParenLoc, Value);
13404ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}
13414ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
13424ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas GregorTypeTraitExpr *TypeTraitExpr::CreateDeserialized(ASTContext &C,
13434ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor                                                 unsigned NumArgs) {
13444ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  unsigned Size = sizeof(TypeTraitExpr) + sizeof(TypeSourceInfo*) * NumArgs;
13454ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  void *Mem = C.Allocate(Size);
13464ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  return new (Mem) TypeTraitExpr(EmptyShell());
13474ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}
13484ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
134999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ArrayTypeTraitExpr::anchor() { }
1350