]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/AST/ExprCXX.cpp
MFV r304159: 7277 zdb should be able to print zfs_dbgmsg's
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / AST / ExprCXX.cpp
1 //===--- ExprCXX.cpp - (C++) Expression AST Node Implementation -----------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the subclesses of Expr class declared in ExprCXX.h
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/Attr.h"
16 #include "clang/AST/DeclCXX.h"
17 #include "clang/AST/DeclTemplate.h"
18 #include "clang/AST/ExprCXX.h"
19 #include "clang/AST/TypeLoc.h"
20 #include "clang/Basic/IdentifierTable.h"
21 using namespace clang;
22
23
24 //===----------------------------------------------------------------------===//
25 //  Child Iterators for iterating over subexpressions/substatements
26 //===----------------------------------------------------------------------===//
27
28 bool CXXTypeidExpr::isPotentiallyEvaluated() const {
29   if (isTypeOperand())
30     return false;
31
32   // C++11 [expr.typeid]p3:
33   //   When typeid is applied to an expression other than a glvalue of
34   //   polymorphic class type, [...] the expression is an unevaluated operand.
35   const Expr *E = getExprOperand();
36   if (const CXXRecordDecl *RD = E->getType()->getAsCXXRecordDecl())
37     if (RD->isPolymorphic() && E->isGLValue())
38       return true;
39
40   return false;
41 }
42
43 QualType CXXTypeidExpr::getTypeOperand(ASTContext &Context) const {
44   assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
45   Qualifiers Quals;
46   return Context.getUnqualifiedArrayType(
47       Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType(), Quals);
48 }
49
50 QualType CXXUuidofExpr::getTypeOperand(ASTContext &Context) const {
51   assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
52   Qualifiers Quals;
53   return Context.getUnqualifiedArrayType(
54       Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType(), Quals);
55 }
56
57 // static
58 const UuidAttr *CXXUuidofExpr::GetUuidAttrOfType(QualType QT,
59                                                  bool *RDHasMultipleGUIDsPtr) {
60   // Optionally remove one level of pointer, reference or array indirection.
61   const Type *Ty = QT.getTypePtr();
62   if (QT->isPointerType() || QT->isReferenceType())
63     Ty = QT->getPointeeType().getTypePtr();
64   else if (QT->isArrayType())
65     Ty = Ty->getBaseElementTypeUnsafe();
66
67   const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
68   if (!RD)
69     return nullptr;
70
71   if (const UuidAttr *Uuid = RD->getMostRecentDecl()->getAttr<UuidAttr>())
72     return Uuid;
73
74   // __uuidof can grab UUIDs from template arguments.
75   if (const ClassTemplateSpecializationDecl *CTSD =
76           dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
77     const TemplateArgumentList &TAL = CTSD->getTemplateArgs();
78     const UuidAttr *UuidForRD = nullptr;
79
80     for (const TemplateArgument &TA : TAL.asArray()) {
81       bool SeenMultipleGUIDs = false;
82
83       const UuidAttr *UuidForTA = nullptr;
84       if (TA.getKind() == TemplateArgument::Type)
85         UuidForTA = GetUuidAttrOfType(TA.getAsType(), &SeenMultipleGUIDs);
86       else if (TA.getKind() == TemplateArgument::Declaration)
87         UuidForTA =
88             GetUuidAttrOfType(TA.getAsDecl()->getType(), &SeenMultipleGUIDs);
89
90       // If the template argument has a UUID, there are three cases:
91       //  - This is the first UUID seen for this RecordDecl.
92       //  - This is a different UUID than previously seen for this RecordDecl.
93       //  - This is the same UUID than previously seen for this RecordDecl.
94       if (UuidForTA) {
95         if (!UuidForRD)
96           UuidForRD = UuidForTA;
97         else if (UuidForRD != UuidForTA)
98           SeenMultipleGUIDs = true;
99       }
100
101       // Seeing multiple UUIDs means that we couldn't find a UUID
102       if (SeenMultipleGUIDs) {
103         if (RDHasMultipleGUIDsPtr)
104           *RDHasMultipleGUIDsPtr = true;
105         return nullptr;
106       }
107     }
108
109     return UuidForRD;
110   }
111
112   return nullptr;
113 }
114
115 StringRef CXXUuidofExpr::getUuidAsStringRef(ASTContext &Context) const {
116   StringRef Uuid;
117   if (isTypeOperand())
118     Uuid = CXXUuidofExpr::GetUuidAttrOfType(getTypeOperand(Context))->getGuid();
119   else {
120     // Special case: __uuidof(0) means an all-zero GUID.
121     Expr *Op = getExprOperand();
122     if (!Op->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull))
123       Uuid = CXXUuidofExpr::GetUuidAttrOfType(Op->getType())->getGuid();
124     else
125       Uuid = "00000000-0000-0000-0000-000000000000";
126   }
127   return Uuid;
128 }
129
130 // CXXScalarValueInitExpr
131 SourceLocation CXXScalarValueInitExpr::getLocStart() const {
132   return TypeInfo ? TypeInfo->getTypeLoc().getBeginLoc() : RParenLoc;
133 }
134
135 // CXXNewExpr
136 CXXNewExpr::CXXNewExpr(const ASTContext &C, bool globalNew,
137                        FunctionDecl *operatorNew, FunctionDecl *operatorDelete,
138                        bool usualArrayDeleteWantsSize,
139                        ArrayRef<Expr*> placementArgs,
140                        SourceRange typeIdParens, Expr *arraySize,
141                        InitializationStyle initializationStyle,
142                        Expr *initializer, QualType ty,
143                        TypeSourceInfo *allocatedTypeInfo,
144                        SourceRange Range, SourceRange directInitRange)
145   : Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary,
146          ty->isDependentType(), ty->isDependentType(),
147          ty->isInstantiationDependentType(),
148          ty->containsUnexpandedParameterPack()),
149     SubExprs(nullptr), OperatorNew(operatorNew), OperatorDelete(operatorDelete),
150     AllocatedTypeInfo(allocatedTypeInfo), TypeIdParens(typeIdParens),
151     Range(Range), DirectInitRange(directInitRange),
152     GlobalNew(globalNew), UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize) {
153   assert((initializer != nullptr || initializationStyle == NoInit) &&
154          "Only NoInit can have no initializer.");
155   StoredInitializationStyle = initializer ? initializationStyle + 1 : 0;
156   AllocateArgsArray(C, arraySize != nullptr, placementArgs.size(),
157                     initializer != nullptr);
158   unsigned i = 0;
159   if (Array) {
160     if (arraySize->isInstantiationDependent())
161       ExprBits.InstantiationDependent = true;
162     
163     if (arraySize->containsUnexpandedParameterPack())
164       ExprBits.ContainsUnexpandedParameterPack = true;
165
166     SubExprs[i++] = arraySize;
167   }
168
169   if (initializer) {
170     if (initializer->isInstantiationDependent())
171       ExprBits.InstantiationDependent = true;
172
173     if (initializer->containsUnexpandedParameterPack())
174       ExprBits.ContainsUnexpandedParameterPack = true;
175
176     SubExprs[i++] = initializer;
177   }
178
179   for (unsigned j = 0; j != placementArgs.size(); ++j) {
180     if (placementArgs[j]->isInstantiationDependent())
181       ExprBits.InstantiationDependent = true;
182     if (placementArgs[j]->containsUnexpandedParameterPack())
183       ExprBits.ContainsUnexpandedParameterPack = true;
184
185     SubExprs[i++] = placementArgs[j];
186   }
187
188   switch (getInitializationStyle()) {
189   case CallInit:
190     this->Range.setEnd(DirectInitRange.getEnd()); break;
191   case ListInit:
192     this->Range.setEnd(getInitializer()->getSourceRange().getEnd()); break;
193   default:
194     if (TypeIdParens.isValid())
195       this->Range.setEnd(TypeIdParens.getEnd());
196     break;
197   }
198 }
199
200 void CXXNewExpr::AllocateArgsArray(const ASTContext &C, bool isArray,
201                                    unsigned numPlaceArgs, bool hasInitializer){
202   assert(SubExprs == nullptr && "SubExprs already allocated");
203   Array = isArray;
204   NumPlacementArgs = numPlaceArgs;
205
206   unsigned TotalSize = Array + hasInitializer + NumPlacementArgs;
207   SubExprs = new (C) Stmt*[TotalSize];
208 }
209
210 bool CXXNewExpr::shouldNullCheckAllocation(const ASTContext &Ctx) const {
211   return getOperatorNew()->getType()->castAs<FunctionProtoType>()->isNothrow(
212              Ctx) &&
213          !getOperatorNew()->isReservedGlobalPlacementOperator();
214 }
215
216 // CXXDeleteExpr
217 QualType CXXDeleteExpr::getDestroyedType() const {
218   const Expr *Arg = getArgument();
219   // The type-to-delete may not be a pointer if it's a dependent type.
220   const QualType ArgType = Arg->getType();
221
222   if (ArgType->isDependentType() && !ArgType->isPointerType())
223     return QualType();
224
225   return ArgType->getAs<PointerType>()->getPointeeType();
226 }
227
228 // CXXPseudoDestructorExpr
229 PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
230  : Type(Info) 
231 {
232   Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
233 }
234
235 CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(const ASTContext &Context,
236                 Expr *Base, bool isArrow, SourceLocation OperatorLoc,
237                 NestedNameSpecifierLoc QualifierLoc, TypeSourceInfo *ScopeType, 
238                 SourceLocation ColonColonLoc, SourceLocation TildeLoc, 
239                 PseudoDestructorTypeStorage DestroyedType)
240   : Expr(CXXPseudoDestructorExprClass,
241          Context.BoundMemberTy,
242          VK_RValue, OK_Ordinary,
243          /*isTypeDependent=*/(Base->isTypeDependent() ||
244            (DestroyedType.getTypeSourceInfo() &&
245             DestroyedType.getTypeSourceInfo()->getType()->isDependentType())),
246          /*isValueDependent=*/Base->isValueDependent(),
247          (Base->isInstantiationDependent() ||
248           (QualifierLoc &&
249            QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent()) ||
250           (ScopeType &&
251            ScopeType->getType()->isInstantiationDependentType()) ||
252           (DestroyedType.getTypeSourceInfo() &&
253            DestroyedType.getTypeSourceInfo()->getType()
254                                              ->isInstantiationDependentType())),
255          // ContainsUnexpandedParameterPack
256          (Base->containsUnexpandedParameterPack() ||
257           (QualifierLoc && 
258            QualifierLoc.getNestedNameSpecifier()
259                                         ->containsUnexpandedParameterPack()) ||
260           (ScopeType && 
261            ScopeType->getType()->containsUnexpandedParameterPack()) ||
262           (DestroyedType.getTypeSourceInfo() &&
263            DestroyedType.getTypeSourceInfo()->getType()
264                                    ->containsUnexpandedParameterPack()))),
265     Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
266     OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
267     ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),
268     DestroyedType(DestroyedType) { }
269
270 QualType CXXPseudoDestructorExpr::getDestroyedType() const {
271   if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
272     return TInfo->getType();
273   
274   return QualType();
275 }
276
277 SourceLocation CXXPseudoDestructorExpr::getLocEnd() const {
278   SourceLocation End = DestroyedType.getLocation();
279   if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
280     End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
281   return End;
282 }
283
284 // UnresolvedLookupExpr
285 UnresolvedLookupExpr *
286 UnresolvedLookupExpr::Create(const ASTContext &C,
287                              CXXRecordDecl *NamingClass,
288                              NestedNameSpecifierLoc QualifierLoc,
289                              SourceLocation TemplateKWLoc,
290                              const DeclarationNameInfo &NameInfo,
291                              bool ADL,
292                              const TemplateArgumentListInfo *Args,
293                              UnresolvedSetIterator Begin,
294                              UnresolvedSetIterator End)
295 {
296   assert(Args || TemplateKWLoc.isValid());
297   unsigned num_args = Args ? Args->size() : 0;
298
299   std::size_t Size =
300       totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(1,
301                                                                       num_args);
302   void *Mem = C.Allocate(Size, llvm::alignOf<UnresolvedLookupExpr>());
303   return new (Mem) UnresolvedLookupExpr(C, NamingClass, QualifierLoc,
304                                         TemplateKWLoc, NameInfo,
305                                         ADL, /*Overload*/ true, Args,
306                                         Begin, End);
307 }
308
309 UnresolvedLookupExpr *
310 UnresolvedLookupExpr::CreateEmpty(const ASTContext &C,
311                                   bool HasTemplateKWAndArgsInfo,
312                                   unsigned NumTemplateArgs) {
313   assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
314   std::size_t Size =
315       totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
316           HasTemplateKWAndArgsInfo, NumTemplateArgs);
317   void *Mem = C.Allocate(Size, llvm::alignOf<UnresolvedLookupExpr>());
318   UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
319   E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
320   return E;
321 }
322
323 OverloadExpr::OverloadExpr(StmtClass K, const ASTContext &C,
324                            NestedNameSpecifierLoc QualifierLoc,
325                            SourceLocation TemplateKWLoc,
326                            const DeclarationNameInfo &NameInfo,
327                            const TemplateArgumentListInfo *TemplateArgs,
328                            UnresolvedSetIterator Begin, 
329                            UnresolvedSetIterator End,
330                            bool KnownDependent,
331                            bool KnownInstantiationDependent,
332                            bool KnownContainsUnexpandedParameterPack)
333   : Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent, 
334          KnownDependent,
335          (KnownInstantiationDependent ||
336           NameInfo.isInstantiationDependent() ||
337           (QualifierLoc &&
338            QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
339          (KnownContainsUnexpandedParameterPack ||
340           NameInfo.containsUnexpandedParameterPack() ||
341           (QualifierLoc && 
342            QualifierLoc.getNestedNameSpecifier()
343                                       ->containsUnexpandedParameterPack()))),
344     NameInfo(NameInfo), QualifierLoc(QualifierLoc),
345     Results(nullptr), NumResults(End - Begin),
346     HasTemplateKWAndArgsInfo(TemplateArgs != nullptr ||
347                              TemplateKWLoc.isValid()) {
348   NumResults = End - Begin;
349   if (NumResults) {
350     // Determine whether this expression is type-dependent.
351     for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) {
352       if ((*I)->getDeclContext()->isDependentContext() ||
353           isa<UnresolvedUsingValueDecl>(*I)) {
354         ExprBits.TypeDependent = true;
355         ExprBits.ValueDependent = true;
356         ExprBits.InstantiationDependent = true;
357       }
358     }
359
360     Results = static_cast<DeclAccessPair *>(
361                                 C.Allocate(sizeof(DeclAccessPair) * NumResults, 
362                                            llvm::alignOf<DeclAccessPair>()));
363     memcpy(Results, Begin.I, NumResults * sizeof(DeclAccessPair));
364   }
365
366   // If we have explicit template arguments, check for dependent
367   // template arguments and whether they contain any unexpanded pack
368   // expansions.
369   if (TemplateArgs) {
370     bool Dependent = false;
371     bool InstantiationDependent = false;
372     bool ContainsUnexpandedParameterPack = false;
373     getTrailingASTTemplateKWAndArgsInfo()->initializeFrom(
374         TemplateKWLoc, *TemplateArgs, getTrailingTemplateArgumentLoc(),
375         Dependent, InstantiationDependent, ContainsUnexpandedParameterPack);
376
377     if (Dependent) {
378       ExprBits.TypeDependent = true;
379       ExprBits.ValueDependent = true;
380     }
381     if (InstantiationDependent)
382       ExprBits.InstantiationDependent = true;
383     if (ContainsUnexpandedParameterPack)
384       ExprBits.ContainsUnexpandedParameterPack = true;
385   } else if (TemplateKWLoc.isValid()) {
386     getTrailingASTTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
387   }
388
389   if (isTypeDependent())
390     setType(C.DependentTy);
391 }
392
393 void OverloadExpr::initializeResults(const ASTContext &C,
394                                      UnresolvedSetIterator Begin,
395                                      UnresolvedSetIterator End) {
396   assert(!Results && "Results already initialized!");
397   NumResults = End - Begin;
398   if (NumResults) {
399      Results = static_cast<DeclAccessPair *>(
400                                C.Allocate(sizeof(DeclAccessPair) * NumResults,
401  
402                                           llvm::alignOf<DeclAccessPair>()));
403      memcpy(Results, Begin.I, NumResults * sizeof(DeclAccessPair));
404   }
405 }
406
407 CXXRecordDecl *OverloadExpr::getNamingClass() const {
408   if (isa<UnresolvedLookupExpr>(this))
409     return cast<UnresolvedLookupExpr>(this)->getNamingClass();
410   else
411     return cast<UnresolvedMemberExpr>(this)->getNamingClass();
412 }
413
414 // DependentScopeDeclRefExpr
415 DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
416                             NestedNameSpecifierLoc QualifierLoc,
417                             SourceLocation TemplateKWLoc,
418                             const DeclarationNameInfo &NameInfo,
419                             const TemplateArgumentListInfo *Args)
420   : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary,
421          true, true,
422          (NameInfo.isInstantiationDependent() ||
423           (QualifierLoc && 
424            QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
425          (NameInfo.containsUnexpandedParameterPack() ||
426           (QualifierLoc && 
427            QualifierLoc.getNestedNameSpecifier()
428                             ->containsUnexpandedParameterPack()))),
429     QualifierLoc(QualifierLoc), NameInfo(NameInfo), 
430     HasTemplateKWAndArgsInfo(Args != nullptr || TemplateKWLoc.isValid())
431 {
432   if (Args) {
433     bool Dependent = true;
434     bool InstantiationDependent = true;
435     bool ContainsUnexpandedParameterPack
436       = ExprBits.ContainsUnexpandedParameterPack;
437     getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
438         TemplateKWLoc, *Args, getTrailingObjects<TemplateArgumentLoc>(),
439         Dependent, InstantiationDependent, ContainsUnexpandedParameterPack);
440     ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
441   } else if (TemplateKWLoc.isValid()) {
442     getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
443         TemplateKWLoc);
444   }
445 }
446
447 DependentScopeDeclRefExpr *
448 DependentScopeDeclRefExpr::Create(const ASTContext &C,
449                                   NestedNameSpecifierLoc QualifierLoc,
450                                   SourceLocation TemplateKWLoc,
451                                   const DeclarationNameInfo &NameInfo,
452                                   const TemplateArgumentListInfo *Args) {
453   assert(QualifierLoc && "should be created for dependent qualifiers");
454   bool HasTemplateKWAndArgsInfo = Args || TemplateKWLoc.isValid();
455   std::size_t Size =
456       totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
457           HasTemplateKWAndArgsInfo, Args ? Args->size() : 0);
458   void *Mem = C.Allocate(Size);
459   return new (Mem) DependentScopeDeclRefExpr(C.DependentTy, QualifierLoc,
460                                              TemplateKWLoc, NameInfo, Args);
461 }
462
463 DependentScopeDeclRefExpr *
464 DependentScopeDeclRefExpr::CreateEmpty(const ASTContext &C,
465                                        bool HasTemplateKWAndArgsInfo,
466                                        unsigned NumTemplateArgs) {
467   assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
468   std::size_t Size =
469       totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
470           HasTemplateKWAndArgsInfo, NumTemplateArgs);
471   void *Mem = C.Allocate(Size);
472   DependentScopeDeclRefExpr *E
473     = new (Mem) DependentScopeDeclRefExpr(QualType(), NestedNameSpecifierLoc(),
474                                           SourceLocation(),
475                                           DeclarationNameInfo(), nullptr);
476   E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
477   return E;
478 }
479
480 SourceLocation CXXConstructExpr::getLocStart() const {
481   if (isa<CXXTemporaryObjectExpr>(this))
482     return cast<CXXTemporaryObjectExpr>(this)->getLocStart();
483   return Loc;
484 }
485
486 SourceLocation CXXConstructExpr::getLocEnd() const {
487   if (isa<CXXTemporaryObjectExpr>(this))
488     return cast<CXXTemporaryObjectExpr>(this)->getLocEnd();
489
490   if (ParenOrBraceRange.isValid())
491     return ParenOrBraceRange.getEnd();
492
493   SourceLocation End = Loc;
494   for (unsigned I = getNumArgs(); I > 0; --I) {
495     const Expr *Arg = getArg(I-1);
496     if (!Arg->isDefaultArgument()) {
497       SourceLocation NewEnd = Arg->getLocEnd();
498       if (NewEnd.isValid()) {
499         End = NewEnd;
500         break;
501       }
502     }
503   }
504
505   return End;
506 }
507
508 SourceRange CXXOperatorCallExpr::getSourceRangeImpl() const {
509   OverloadedOperatorKind Kind = getOperator();
510   if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
511     if (getNumArgs() == 1)
512       // Prefix operator
513       return SourceRange(getOperatorLoc(), getArg(0)->getLocEnd());
514     else
515       // Postfix operator
516       return SourceRange(getArg(0)->getLocStart(), getOperatorLoc());
517   } else if (Kind == OO_Arrow) {
518     return getArg(0)->getSourceRange();
519   } else if (Kind == OO_Call) {
520     return SourceRange(getArg(0)->getLocStart(), getRParenLoc());
521   } else if (Kind == OO_Subscript) {
522     return SourceRange(getArg(0)->getLocStart(), getRParenLoc());
523   } else if (getNumArgs() == 1) {
524     return SourceRange(getOperatorLoc(), getArg(0)->getLocEnd());
525   } else if (getNumArgs() == 2) {
526     return SourceRange(getArg(0)->getLocStart(), getArg(1)->getLocEnd());
527   } else {
528     return getOperatorLoc();
529   }
530 }
531
532 Expr *CXXMemberCallExpr::getImplicitObjectArgument() const {
533   const Expr *Callee = getCallee()->IgnoreParens();
534   if (const MemberExpr *MemExpr = dyn_cast<MemberExpr>(Callee))
535     return MemExpr->getBase();
536   if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(Callee))
537     if (BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI)
538       return BO->getLHS();
539
540   // FIXME: Will eventually need to cope with member pointers.
541   return nullptr;
542 }
543
544 CXXMethodDecl *CXXMemberCallExpr::getMethodDecl() const {
545   if (const MemberExpr *MemExpr = 
546       dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
547     return cast<CXXMethodDecl>(MemExpr->getMemberDecl());
548
549   // FIXME: Will eventually need to cope with member pointers.
550   return nullptr;
551 }
552
553
554 CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() const {
555   Expr* ThisArg = getImplicitObjectArgument();
556   if (!ThisArg)
557     return nullptr;
558
559   if (ThisArg->getType()->isAnyPointerType())
560     return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
561
562   return ThisArg->getType()->getAsCXXRecordDecl();
563 }
564
565
566 //===----------------------------------------------------------------------===//
567 //  Named casts
568 //===----------------------------------------------------------------------===//
569
570 /// getCastName - Get the name of the C++ cast being used, e.g.,
571 /// "static_cast", "dynamic_cast", "reinterpret_cast", or
572 /// "const_cast". The returned pointer must not be freed.
573 const char *CXXNamedCastExpr::getCastName() const {
574   switch (getStmtClass()) {
575   case CXXStaticCastExprClass:      return "static_cast";
576   case CXXDynamicCastExprClass:     return "dynamic_cast";
577   case CXXReinterpretCastExprClass: return "reinterpret_cast";
578   case CXXConstCastExprClass:       return "const_cast";
579   default:                          return "<invalid cast>";
580   }
581 }
582
583 CXXStaticCastExpr *CXXStaticCastExpr::Create(const ASTContext &C, QualType T,
584                                              ExprValueKind VK,
585                                              CastKind K, Expr *Op,
586                                              const CXXCastPath *BasePath,
587                                              TypeSourceInfo *WrittenTy,
588                                              SourceLocation L, 
589                                              SourceLocation RParenLoc,
590                                              SourceRange AngleBrackets) {
591   unsigned PathSize = (BasePath ? BasePath->size() : 0);
592   void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
593   CXXStaticCastExpr *E =
594     new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
595                                    RParenLoc, AngleBrackets);
596   if (PathSize)
597     std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
598                               E->getTrailingObjects<CXXBaseSpecifier *>());
599   return E;
600 }
601
602 CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(const ASTContext &C,
603                                                   unsigned PathSize) {
604   void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
605   return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
606 }
607
608 CXXDynamicCastExpr *CXXDynamicCastExpr::Create(const ASTContext &C, QualType T,
609                                                ExprValueKind VK,
610                                                CastKind K, Expr *Op,
611                                                const CXXCastPath *BasePath,
612                                                TypeSourceInfo *WrittenTy,
613                                                SourceLocation L, 
614                                                SourceLocation RParenLoc,
615                                                SourceRange AngleBrackets) {
616   unsigned PathSize = (BasePath ? BasePath->size() : 0);
617   void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
618   CXXDynamicCastExpr *E =
619     new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
620                                     RParenLoc, AngleBrackets);
621   if (PathSize)
622     std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
623                               E->getTrailingObjects<CXXBaseSpecifier *>());
624   return E;
625 }
626
627 CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(const ASTContext &C,
628                                                     unsigned PathSize) {
629   void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
630   return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
631 }
632
633 /// isAlwaysNull - Return whether the result of the dynamic_cast is proven
634 /// to always be null. For example:
635 ///
636 /// struct A { };
637 /// struct B final : A { };
638 /// struct C { };
639 ///
640 /// C *f(B* b) { return dynamic_cast<C*>(b); }
641 bool CXXDynamicCastExpr::isAlwaysNull() const
642 {
643   QualType SrcType = getSubExpr()->getType();
644   QualType DestType = getType();
645
646   if (const PointerType *SrcPTy = SrcType->getAs<PointerType>()) {
647     SrcType = SrcPTy->getPointeeType();
648     DestType = DestType->castAs<PointerType>()->getPointeeType();
649   }
650
651   if (DestType->isVoidType())
652     return false;
653
654   const CXXRecordDecl *SrcRD = 
655     cast<CXXRecordDecl>(SrcType->castAs<RecordType>()->getDecl());
656
657   if (!SrcRD->hasAttr<FinalAttr>())
658     return false;
659
660   const CXXRecordDecl *DestRD = 
661     cast<CXXRecordDecl>(DestType->castAs<RecordType>()->getDecl());
662
663   return !DestRD->isDerivedFrom(SrcRD);
664 }
665
666 CXXReinterpretCastExpr *
667 CXXReinterpretCastExpr::Create(const ASTContext &C, QualType T,
668                                ExprValueKind VK, CastKind K, Expr *Op,
669                                const CXXCastPath *BasePath,
670                                TypeSourceInfo *WrittenTy, SourceLocation L, 
671                                SourceLocation RParenLoc,
672                                SourceRange AngleBrackets) {
673   unsigned PathSize = (BasePath ? BasePath->size() : 0);
674   void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
675   CXXReinterpretCastExpr *E =
676     new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
677                                         RParenLoc, AngleBrackets);
678   if (PathSize)
679     std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
680                               E->getTrailingObjects<CXXBaseSpecifier *>());
681   return E;
682 }
683
684 CXXReinterpretCastExpr *
685 CXXReinterpretCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) {
686   void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
687   return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
688 }
689
690 CXXConstCastExpr *CXXConstCastExpr::Create(const ASTContext &C, QualType T,
691                                            ExprValueKind VK, Expr *Op,
692                                            TypeSourceInfo *WrittenTy,
693                                            SourceLocation L, 
694                                            SourceLocation RParenLoc,
695                                            SourceRange AngleBrackets) {
696   return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc, AngleBrackets);
697 }
698
699 CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(const ASTContext &C) {
700   return new (C) CXXConstCastExpr(EmptyShell());
701 }
702
703 CXXFunctionalCastExpr *
704 CXXFunctionalCastExpr::Create(const ASTContext &C, QualType T, ExprValueKind VK,
705                               TypeSourceInfo *Written, CastKind K, Expr *Op,
706                               const CXXCastPath *BasePath,
707                               SourceLocation L, SourceLocation R) {
708   unsigned PathSize = (BasePath ? BasePath->size() : 0);
709   void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
710   CXXFunctionalCastExpr *E =
711     new (Buffer) CXXFunctionalCastExpr(T, VK, Written, K, Op, PathSize, L, R);
712   if (PathSize)
713     std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
714                               E->getTrailingObjects<CXXBaseSpecifier *>());
715   return E;
716 }
717
718 CXXFunctionalCastExpr *
719 CXXFunctionalCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) {
720   void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
721   return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
722 }
723
724 SourceLocation CXXFunctionalCastExpr::getLocStart() const {
725   return getTypeInfoAsWritten()->getTypeLoc().getLocStart();
726 }
727
728 SourceLocation CXXFunctionalCastExpr::getLocEnd() const {
729   return RParenLoc.isValid() ? RParenLoc : getSubExpr()->getLocEnd();
730 }
731
732 UserDefinedLiteral::LiteralOperatorKind
733 UserDefinedLiteral::getLiteralOperatorKind() const {
734   if (getNumArgs() == 0)
735     return LOK_Template;
736   if (getNumArgs() == 2)
737     return LOK_String;
738
739   assert(getNumArgs() == 1 && "unexpected #args in literal operator call");
740   QualType ParamTy =
741     cast<FunctionDecl>(getCalleeDecl())->getParamDecl(0)->getType();
742   if (ParamTy->isPointerType())
743     return LOK_Raw;
744   if (ParamTy->isAnyCharacterType())
745     return LOK_Character;
746   if (ParamTy->isIntegerType())
747     return LOK_Integer;
748   if (ParamTy->isFloatingType())
749     return LOK_Floating;
750
751   llvm_unreachable("unknown kind of literal operator");
752 }
753
754 Expr *UserDefinedLiteral::getCookedLiteral() {
755 #ifndef NDEBUG
756   LiteralOperatorKind LOK = getLiteralOperatorKind();
757   assert(LOK != LOK_Template && LOK != LOK_Raw && "not a cooked literal");
758 #endif
759   return getArg(0);
760 }
761
762 const IdentifierInfo *UserDefinedLiteral::getUDSuffix() const {
763   return cast<FunctionDecl>(getCalleeDecl())->getLiteralIdentifier();
764 }
765
766 CXXDefaultInitExpr::CXXDefaultInitExpr(const ASTContext &C, SourceLocation Loc,
767                                        FieldDecl *Field, QualType T)
768     : Expr(CXXDefaultInitExprClass, T.getNonLValueExprType(C),
769            T->isLValueReferenceType() ? VK_LValue : T->isRValueReferenceType()
770                                                         ? VK_XValue
771                                                         : VK_RValue,
772            /*FIXME*/ OK_Ordinary, false, false, false, false),
773       Field(Field), Loc(Loc) {
774   assert(Field->hasInClassInitializer());
775 }
776
777 CXXTemporary *CXXTemporary::Create(const ASTContext &C,
778                                    const CXXDestructorDecl *Destructor) {
779   return new (C) CXXTemporary(Destructor);
780 }
781
782 CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(const ASTContext &C,
783                                                    CXXTemporary *Temp,
784                                                    Expr* SubExpr) {
785   assert((SubExpr->getType()->isRecordType() ||
786           SubExpr->getType()->isArrayType()) &&
787          "Expression bound to a temporary must have record or array type!");
788
789   return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
790 }
791
792 CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(const ASTContext &C,
793                                                CXXConstructorDecl *Cons,
794                                                TypeSourceInfo *Type,
795                                                ArrayRef<Expr*> Args,
796                                                SourceRange ParenOrBraceRange,
797                                                bool HadMultipleCandidates,
798                                                bool ListInitialization,
799                                                bool StdInitListInitialization,
800                                                bool ZeroInitialization)
801   : CXXConstructExpr(C, CXXTemporaryObjectExprClass, 
802                      Type->getType().getNonReferenceType(), 
803                      Type->getTypeLoc().getBeginLoc(),
804                      Cons, false, Args,
805                      HadMultipleCandidates,
806                      ListInitialization,
807                      StdInitListInitialization,
808                      ZeroInitialization,
809                      CXXConstructExpr::CK_Complete, ParenOrBraceRange),
810     Type(Type) {
811 }
812
813 SourceLocation CXXTemporaryObjectExpr::getLocStart() const {
814   return Type->getTypeLoc().getBeginLoc();
815 }
816
817 SourceLocation CXXTemporaryObjectExpr::getLocEnd() const {
818   SourceLocation Loc = getParenOrBraceRange().getEnd();
819   if (Loc.isInvalid() && getNumArgs())
820     Loc = getArg(getNumArgs()-1)->getLocEnd();
821   return Loc;
822 }
823
824 CXXConstructExpr *CXXConstructExpr::Create(const ASTContext &C, QualType T,
825                                            SourceLocation Loc,
826                                            CXXConstructorDecl *D, bool Elidable,
827                                            ArrayRef<Expr*> Args,
828                                            bool HadMultipleCandidates,
829                                            bool ListInitialization,
830                                            bool StdInitListInitialization,
831                                            bool ZeroInitialization,
832                                            ConstructionKind ConstructKind,
833                                            SourceRange ParenOrBraceRange) {
834   return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D, 
835                                   Elidable, Args,
836                                   HadMultipleCandidates, ListInitialization,
837                                   StdInitListInitialization,
838                                   ZeroInitialization, ConstructKind,
839                                   ParenOrBraceRange);
840 }
841
842 CXXConstructExpr::CXXConstructExpr(const ASTContext &C, StmtClass SC,
843                                    QualType T, SourceLocation Loc,
844                                    CXXConstructorDecl *D, bool elidable,
845                                    ArrayRef<Expr*> args,
846                                    bool HadMultipleCandidates,
847                                    bool ListInitialization,
848                                    bool StdInitListInitialization,
849                                    bool ZeroInitialization,
850                                    ConstructionKind ConstructKind,
851                                    SourceRange ParenOrBraceRange)
852   : Expr(SC, T, VK_RValue, OK_Ordinary,
853          T->isDependentType(), T->isDependentType(),
854          T->isInstantiationDependentType(),
855          T->containsUnexpandedParameterPack()),
856     Constructor(D), Loc(Loc), ParenOrBraceRange(ParenOrBraceRange),
857     NumArgs(args.size()),
858     Elidable(elidable), HadMultipleCandidates(HadMultipleCandidates),
859     ListInitialization(ListInitialization),
860     StdInitListInitialization(StdInitListInitialization),
861     ZeroInitialization(ZeroInitialization),
862     ConstructKind(ConstructKind), Args(nullptr)
863 {
864   if (NumArgs) {
865     Args = new (C) Stmt*[args.size()];
866     
867     for (unsigned i = 0; i != args.size(); ++i) {
868       assert(args[i] && "NULL argument in CXXConstructExpr");
869
870       if (args[i]->isValueDependent())
871         ExprBits.ValueDependent = true;
872       if (args[i]->isInstantiationDependent())
873         ExprBits.InstantiationDependent = true;
874       if (args[i]->containsUnexpandedParameterPack())
875         ExprBits.ContainsUnexpandedParameterPack = true;
876   
877       Args[i] = args[i];
878     }
879   }
880 }
881
882 LambdaCapture::LambdaCapture(SourceLocation Loc, bool Implicit,
883                              LambdaCaptureKind Kind, VarDecl *Var,
884                              SourceLocation EllipsisLoc)
885   : DeclAndBits(Var, 0), Loc(Loc), EllipsisLoc(EllipsisLoc)
886 {
887   unsigned Bits = 0;
888   if (Implicit)
889     Bits |= Capture_Implicit;
890   
891   switch (Kind) {
892   case LCK_This:
893     assert(!Var && "'this' capture cannot have a variable!");
894     break;
895
896   case LCK_ByCopy:
897     Bits |= Capture_ByCopy;
898     // Fall through 
899   case LCK_ByRef:
900     assert(Var && "capture must have a variable!");
901     break;
902   case LCK_VLAType:
903     assert(!Var && "VLA type capture cannot have a variable!");
904     Bits |= Capture_ByCopy;
905     break;
906   }
907   DeclAndBits.setInt(Bits);
908 }
909
910 LambdaCaptureKind LambdaCapture::getCaptureKind() const {
911   Decl *D = DeclAndBits.getPointer();
912   bool CapByCopy = DeclAndBits.getInt() & Capture_ByCopy;
913   if (!D)
914     return CapByCopy ? LCK_VLAType : LCK_This;
915
916   return CapByCopy ? LCK_ByCopy : LCK_ByRef;
917 }
918
919 LambdaExpr::LambdaExpr(QualType T, SourceRange IntroducerRange,
920                        LambdaCaptureDefault CaptureDefault,
921                        SourceLocation CaptureDefaultLoc,
922                        ArrayRef<LambdaCapture> Captures, bool ExplicitParams,
923                        bool ExplicitResultType, ArrayRef<Expr *> CaptureInits,
924                        ArrayRef<VarDecl *> ArrayIndexVars,
925                        ArrayRef<unsigned> ArrayIndexStarts,
926                        SourceLocation ClosingBrace,
927                        bool ContainsUnexpandedParameterPack)
928     : Expr(LambdaExprClass, T, VK_RValue, OK_Ordinary, T->isDependentType(),
929            T->isDependentType(), T->isDependentType(),
930            ContainsUnexpandedParameterPack),
931       IntroducerRange(IntroducerRange), CaptureDefaultLoc(CaptureDefaultLoc),
932       NumCaptures(Captures.size()), CaptureDefault(CaptureDefault),
933       ExplicitParams(ExplicitParams), ExplicitResultType(ExplicitResultType),
934       ClosingBrace(ClosingBrace) {
935   assert(CaptureInits.size() == Captures.size() && "Wrong number of arguments");
936   CXXRecordDecl *Class = getLambdaClass();
937   CXXRecordDecl::LambdaDefinitionData &Data = Class->getLambdaData();
938   
939   // FIXME: Propagate "has unexpanded parameter pack" bit.
940   
941   // Copy captures.
942   const ASTContext &Context = Class->getASTContext();
943   Data.NumCaptures = NumCaptures;
944   Data.NumExplicitCaptures = 0;
945   Data.Captures =
946       (LambdaCapture *)Context.Allocate(sizeof(LambdaCapture) * NumCaptures);
947   LambdaCapture *ToCapture = Data.Captures;
948   for (unsigned I = 0, N = Captures.size(); I != N; ++I) {
949     if (Captures[I].isExplicit())
950       ++Data.NumExplicitCaptures;
951     
952     *ToCapture++ = Captures[I];
953   }
954  
955   // Copy initialization expressions for the non-static data members.
956   Stmt **Stored = getStoredStmts();
957   for (unsigned I = 0, N = CaptureInits.size(); I != N; ++I)
958     *Stored++ = CaptureInits[I];
959   
960   // Copy the body of the lambda.
961   *Stored++ = getCallOperator()->getBody();
962
963   // Copy the array index variables, if any.
964   HasArrayIndexVars = !ArrayIndexVars.empty();
965   if (HasArrayIndexVars) {
966     assert(ArrayIndexStarts.size() == NumCaptures);
967     memcpy(getArrayIndexVars(), ArrayIndexVars.data(),
968            sizeof(VarDecl *) * ArrayIndexVars.size());
969     memcpy(getArrayIndexStarts(), ArrayIndexStarts.data(), 
970            sizeof(unsigned) * Captures.size());
971     getArrayIndexStarts()[Captures.size()] = ArrayIndexVars.size();
972   }
973 }
974
975 LambdaExpr *LambdaExpr::Create(
976     const ASTContext &Context, CXXRecordDecl *Class,
977     SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault,
978     SourceLocation CaptureDefaultLoc, ArrayRef<LambdaCapture> Captures,
979     bool ExplicitParams, bool ExplicitResultType, ArrayRef<Expr *> CaptureInits,
980     ArrayRef<VarDecl *> ArrayIndexVars, ArrayRef<unsigned> ArrayIndexStarts,
981     SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack) {
982   // Determine the type of the expression (i.e., the type of the
983   // function object we're creating).
984   QualType T = Context.getTypeDeclType(Class);
985
986   unsigned Size = totalSizeToAlloc<Stmt *, unsigned, VarDecl *>(
987       Captures.size() + 1, ArrayIndexVars.empty() ? 0 : Captures.size() + 1,
988       ArrayIndexVars.size());
989   void *Mem = Context.Allocate(Size);
990   return new (Mem) LambdaExpr(T, IntroducerRange,
991                               CaptureDefault, CaptureDefaultLoc, Captures,
992                               ExplicitParams, ExplicitResultType,
993                               CaptureInits, ArrayIndexVars, ArrayIndexStarts,
994                               ClosingBrace, ContainsUnexpandedParameterPack);
995 }
996
997 LambdaExpr *LambdaExpr::CreateDeserialized(const ASTContext &C,
998                                            unsigned NumCaptures,
999                                            unsigned NumArrayIndexVars) {
1000   unsigned Size = totalSizeToAlloc<Stmt *, unsigned, VarDecl *>(
1001       NumCaptures + 1, NumArrayIndexVars ? NumCaptures + 1 : 0,
1002       NumArrayIndexVars);
1003   void *Mem = C.Allocate(Size);
1004   return new (Mem) LambdaExpr(EmptyShell(), NumCaptures, NumArrayIndexVars > 0);
1005 }
1006
1007 bool LambdaExpr::isInitCapture(const LambdaCapture *C) const {
1008   return (C->capturesVariable() && C->getCapturedVar()->isInitCapture() &&
1009           (getCallOperator() == C->getCapturedVar()->getDeclContext()));
1010 }
1011
1012 LambdaExpr::capture_iterator LambdaExpr::capture_begin() const {
1013   return getLambdaClass()->getLambdaData().Captures;
1014 }
1015
1016 LambdaExpr::capture_iterator LambdaExpr::capture_end() const {
1017   return capture_begin() + NumCaptures;
1018 }
1019
1020 LambdaExpr::capture_range LambdaExpr::captures() const {
1021   return capture_range(capture_begin(), capture_end());
1022 }
1023
1024 LambdaExpr::capture_iterator LambdaExpr::explicit_capture_begin() const {
1025   return capture_begin();
1026 }
1027
1028 LambdaExpr::capture_iterator LambdaExpr::explicit_capture_end() const {
1029   struct CXXRecordDecl::LambdaDefinitionData &Data
1030     = getLambdaClass()->getLambdaData();
1031   return Data.Captures + Data.NumExplicitCaptures;
1032 }
1033
1034 LambdaExpr::capture_range LambdaExpr::explicit_captures() const {
1035   return capture_range(explicit_capture_begin(), explicit_capture_end());
1036 }
1037
1038 LambdaExpr::capture_iterator LambdaExpr::implicit_capture_begin() const {
1039   return explicit_capture_end();
1040 }
1041
1042 LambdaExpr::capture_iterator LambdaExpr::implicit_capture_end() const {
1043   return capture_end();
1044 }
1045
1046 LambdaExpr::capture_range LambdaExpr::implicit_captures() const {
1047   return capture_range(implicit_capture_begin(), implicit_capture_end());
1048 }
1049
1050 ArrayRef<VarDecl *>
1051 LambdaExpr::getCaptureInitIndexVars(const_capture_init_iterator Iter) const {
1052   assert(HasArrayIndexVars && "No array index-var data?");
1053   
1054   unsigned Index = Iter - capture_init_begin();
1055   assert(Index < getLambdaClass()->getLambdaData().NumCaptures &&
1056          "Capture index out-of-range");
1057   VarDecl *const *IndexVars = getArrayIndexVars();
1058   const unsigned *IndexStarts = getArrayIndexStarts();
1059   return llvm::makeArrayRef(IndexVars + IndexStarts[Index],
1060                             IndexVars + IndexStarts[Index + 1]);
1061 }
1062
1063 CXXRecordDecl *LambdaExpr::getLambdaClass() const {
1064   return getType()->getAsCXXRecordDecl();
1065 }
1066
1067 CXXMethodDecl *LambdaExpr::getCallOperator() const {
1068   CXXRecordDecl *Record = getLambdaClass();
1069   return Record->getLambdaCallOperator();  
1070 }
1071
1072 TemplateParameterList *LambdaExpr::getTemplateParameterList() const {
1073   CXXRecordDecl *Record = getLambdaClass();
1074   return Record->getGenericLambdaTemplateParameterList();
1075
1076 }
1077
1078 CompoundStmt *LambdaExpr::getBody() const {
1079   // FIXME: this mutation in getBody is bogus. It should be
1080   // initialized in ASTStmtReader::VisitLambdaExpr, but for reasons I
1081   // don't understand, that doesn't work.
1082   if (!getStoredStmts()[NumCaptures])
1083     *const_cast<clang::Stmt **>(&getStoredStmts()[NumCaptures]) =
1084         getCallOperator()->getBody();
1085
1086   return static_cast<CompoundStmt *>(getStoredStmts()[NumCaptures]);
1087 }
1088
1089 bool LambdaExpr::isMutable() const {
1090   return !getCallOperator()->isConst();
1091 }
1092
1093 ExprWithCleanups::ExprWithCleanups(Expr *subexpr,
1094                                    ArrayRef<CleanupObject> objects)
1095   : Expr(ExprWithCleanupsClass, subexpr->getType(),
1096          subexpr->getValueKind(), subexpr->getObjectKind(),
1097          subexpr->isTypeDependent(), subexpr->isValueDependent(),
1098          subexpr->isInstantiationDependent(),
1099          subexpr->containsUnexpandedParameterPack()),
1100     SubExpr(subexpr) {
1101   ExprWithCleanupsBits.NumObjects = objects.size();
1102   for (unsigned i = 0, e = objects.size(); i != e; ++i)
1103     getTrailingObjects<CleanupObject>()[i] = objects[i];
1104 }
1105
1106 ExprWithCleanups *ExprWithCleanups::Create(const ASTContext &C, Expr *subexpr,
1107                                            ArrayRef<CleanupObject> objects) {
1108   void *buffer = C.Allocate(totalSizeToAlloc<CleanupObject>(objects.size()),
1109                             llvm::alignOf<ExprWithCleanups>());
1110   return new (buffer) ExprWithCleanups(subexpr, objects);
1111 }
1112
1113 ExprWithCleanups::ExprWithCleanups(EmptyShell empty, unsigned numObjects)
1114   : Expr(ExprWithCleanupsClass, empty) {
1115   ExprWithCleanupsBits.NumObjects = numObjects;
1116 }
1117
1118 ExprWithCleanups *ExprWithCleanups::Create(const ASTContext &C,
1119                                            EmptyShell empty,
1120                                            unsigned numObjects) {
1121   void *buffer = C.Allocate(totalSizeToAlloc<CleanupObject>(numObjects),
1122                             llvm::alignOf<ExprWithCleanups>());
1123   return new (buffer) ExprWithCleanups(empty, numObjects);
1124 }
1125
1126 CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
1127                                                  SourceLocation LParenLoc,
1128                                                  ArrayRef<Expr*> Args,
1129                                                  SourceLocation RParenLoc)
1130   : Expr(CXXUnresolvedConstructExprClass, 
1131          Type->getType().getNonReferenceType(),
1132          (Type->getType()->isLValueReferenceType() ? VK_LValue
1133           :Type->getType()->isRValueReferenceType()? VK_XValue
1134           :VK_RValue),
1135          OK_Ordinary,
1136          Type->getType()->isDependentType(), true, true,
1137          Type->getType()->containsUnexpandedParameterPack()),
1138     Type(Type),
1139     LParenLoc(LParenLoc),
1140     RParenLoc(RParenLoc),
1141     NumArgs(Args.size()) {
1142   Expr **StoredArgs = getTrailingObjects<Expr *>();
1143   for (unsigned I = 0; I != Args.size(); ++I) {
1144     if (Args[I]->containsUnexpandedParameterPack())
1145       ExprBits.ContainsUnexpandedParameterPack = true;
1146
1147     StoredArgs[I] = Args[I];
1148   }
1149 }
1150
1151 CXXUnresolvedConstructExpr *
1152 CXXUnresolvedConstructExpr::Create(const ASTContext &C,
1153                                    TypeSourceInfo *Type,
1154                                    SourceLocation LParenLoc,
1155                                    ArrayRef<Expr*> Args,
1156                                    SourceLocation RParenLoc) {
1157   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(Args.size()));
1158   return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc, Args, RParenLoc);
1159 }
1160
1161 CXXUnresolvedConstructExpr *
1162 CXXUnresolvedConstructExpr::CreateEmpty(const ASTContext &C, unsigned NumArgs) {
1163   Stmt::EmptyShell Empty;
1164   void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(NumArgs));
1165   return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
1166 }
1167
1168 SourceLocation CXXUnresolvedConstructExpr::getLocStart() const {
1169   return Type->getTypeLoc().getBeginLoc();
1170 }
1171
1172 CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(
1173     const ASTContext &C, Expr *Base, QualType BaseType, bool IsArrow,
1174     SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
1175     SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
1176     DeclarationNameInfo MemberNameInfo,
1177     const TemplateArgumentListInfo *TemplateArgs)
1178     : Expr(CXXDependentScopeMemberExprClass, C.DependentTy, VK_LValue,
1179            OK_Ordinary, true, true, true,
1180            ((Base && Base->containsUnexpandedParameterPack()) ||
1181             (QualifierLoc &&
1182              QualifierLoc.getNestedNameSpecifier()
1183                  ->containsUnexpandedParameterPack()) ||
1184             MemberNameInfo.containsUnexpandedParameterPack())),
1185       Base(Base), BaseType(BaseType), IsArrow(IsArrow),
1186       HasTemplateKWAndArgsInfo(TemplateArgs != nullptr ||
1187                                TemplateKWLoc.isValid()),
1188       OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
1189       FirstQualifierFoundInScope(FirstQualifierFoundInScope),
1190       MemberNameInfo(MemberNameInfo) {
1191   if (TemplateArgs) {
1192     bool Dependent = true;
1193     bool InstantiationDependent = true;
1194     bool ContainsUnexpandedParameterPack = false;
1195     getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1196         TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1197         Dependent, InstantiationDependent, ContainsUnexpandedParameterPack);
1198     if (ContainsUnexpandedParameterPack)
1199       ExprBits.ContainsUnexpandedParameterPack = true;
1200   } else if (TemplateKWLoc.isValid()) {
1201     getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1202         TemplateKWLoc);
1203   }
1204 }
1205
1206 CXXDependentScopeMemberExpr *
1207 CXXDependentScopeMemberExpr::Create(const ASTContext &C,
1208                                 Expr *Base, QualType BaseType, bool IsArrow,
1209                                 SourceLocation OperatorLoc,
1210                                 NestedNameSpecifierLoc QualifierLoc,
1211                                 SourceLocation TemplateKWLoc,
1212                                 NamedDecl *FirstQualifierFoundInScope,
1213                                 DeclarationNameInfo MemberNameInfo,
1214                                 const TemplateArgumentListInfo *TemplateArgs) {
1215   bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid();
1216   unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->size() : 0;
1217   std::size_t Size =
1218       totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1219           HasTemplateKWAndArgsInfo, NumTemplateArgs);
1220
1221   void *Mem = C.Allocate(Size, llvm::alignOf<CXXDependentScopeMemberExpr>());
1222   return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
1223                                                IsArrow, OperatorLoc,
1224                                                QualifierLoc,
1225                                                TemplateKWLoc,
1226                                                FirstQualifierFoundInScope,
1227                                                MemberNameInfo, TemplateArgs);
1228 }
1229
1230 CXXDependentScopeMemberExpr *
1231 CXXDependentScopeMemberExpr::CreateEmpty(const ASTContext &C,
1232                                          bool HasTemplateKWAndArgsInfo,
1233                                          unsigned NumTemplateArgs) {
1234   assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
1235   std::size_t Size =
1236       totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1237           HasTemplateKWAndArgsInfo, NumTemplateArgs);
1238   void *Mem = C.Allocate(Size, llvm::alignOf<CXXDependentScopeMemberExpr>());
1239   CXXDependentScopeMemberExpr *E
1240     =  new (Mem) CXXDependentScopeMemberExpr(C, nullptr, QualType(),
1241                                              0, SourceLocation(),
1242                                              NestedNameSpecifierLoc(),
1243                                              SourceLocation(), nullptr,
1244                                              DeclarationNameInfo(), nullptr);
1245   E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
1246   return E;
1247 }
1248
1249 bool CXXDependentScopeMemberExpr::isImplicitAccess() const {
1250   if (!Base)
1251     return true;
1252   
1253   return cast<Expr>(Base)->isImplicitCXXThis();
1254 }
1255
1256 static bool hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin,
1257                                             UnresolvedSetIterator end) {
1258   do {
1259     NamedDecl *decl = *begin;
1260     if (isa<UnresolvedUsingValueDecl>(decl))
1261       return false;
1262
1263     // Unresolved member expressions should only contain methods and
1264     // method templates.
1265     if (cast<CXXMethodDecl>(decl->getUnderlyingDecl()->getAsFunction())
1266             ->isStatic())
1267       return false;
1268   } while (++begin != end);
1269
1270   return true;
1271 }
1272
1273 UnresolvedMemberExpr::UnresolvedMemberExpr(const ASTContext &C,
1274                                            bool HasUnresolvedUsing,
1275                                            Expr *Base, QualType BaseType,
1276                                            bool IsArrow,
1277                                            SourceLocation OperatorLoc,
1278                                            NestedNameSpecifierLoc QualifierLoc,
1279                                            SourceLocation TemplateKWLoc,
1280                                    const DeclarationNameInfo &MemberNameInfo,
1281                                    const TemplateArgumentListInfo *TemplateArgs,
1282                                            UnresolvedSetIterator Begin, 
1283                                            UnresolvedSetIterator End)
1284   : OverloadExpr(UnresolvedMemberExprClass, C, QualifierLoc, TemplateKWLoc,
1285                  MemberNameInfo, TemplateArgs, Begin, End,
1286                  // Dependent
1287                  ((Base && Base->isTypeDependent()) ||
1288                   BaseType->isDependentType()),
1289                  ((Base && Base->isInstantiationDependent()) ||
1290                    BaseType->isInstantiationDependentType()),
1291                  // Contains unexpanded parameter pack
1292                  ((Base && Base->containsUnexpandedParameterPack()) ||
1293                   BaseType->containsUnexpandedParameterPack())),
1294     IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
1295     Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
1296
1297   // Check whether all of the members are non-static member functions,
1298   // and if so, mark give this bound-member type instead of overload type.
1299   if (hasOnlyNonStaticMemberFunctions(Begin, End))
1300     setType(C.BoundMemberTy);
1301 }
1302
1303 bool UnresolvedMemberExpr::isImplicitAccess() const {
1304   if (!Base)
1305     return true;
1306   
1307   return cast<Expr>(Base)->isImplicitCXXThis();
1308 }
1309
1310 UnresolvedMemberExpr *UnresolvedMemberExpr::Create(
1311     const ASTContext &C, bool HasUnresolvedUsing, Expr *Base, QualType BaseType,
1312     bool IsArrow, SourceLocation OperatorLoc,
1313     NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
1314     const DeclarationNameInfo &MemberNameInfo,
1315     const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin,
1316     UnresolvedSetIterator End) {
1317   bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid();
1318   std::size_t Size =
1319       totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1320           HasTemplateKWAndArgsInfo, TemplateArgs ? TemplateArgs->size() : 0);
1321
1322   void *Mem = C.Allocate(Size, llvm::alignOf<UnresolvedMemberExpr>());
1323   return new (Mem) UnresolvedMemberExpr(
1324       C, HasUnresolvedUsing, Base, BaseType, IsArrow, OperatorLoc, QualifierLoc,
1325       TemplateKWLoc, MemberNameInfo, TemplateArgs, Begin, End);
1326 }
1327
1328 UnresolvedMemberExpr *
1329 UnresolvedMemberExpr::CreateEmpty(const ASTContext &C,
1330                                   bool HasTemplateKWAndArgsInfo,
1331                                   unsigned NumTemplateArgs) {
1332   assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
1333   std::size_t Size =
1334       totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1335           HasTemplateKWAndArgsInfo, NumTemplateArgs);
1336
1337   void *Mem = C.Allocate(Size, llvm::alignOf<UnresolvedMemberExpr>());
1338   UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
1339   E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
1340   return E;
1341 }
1342
1343 CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
1344   // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
1345
1346   // If there was a nested name specifier, it names the naming class.
1347   // It can't be dependent: after all, we were actually able to do the
1348   // lookup.
1349   CXXRecordDecl *Record = nullptr;
1350   auto *NNS = getQualifier();
1351   if (NNS && NNS->getKind() != NestedNameSpecifier::Super) {
1352     const Type *T = getQualifier()->getAsType();
1353     assert(T && "qualifier in member expression does not name type");
1354     Record = T->getAsCXXRecordDecl();
1355     assert(Record && "qualifier in member expression does not name record");
1356   }
1357   // Otherwise the naming class must have been the base class.
1358   else {
1359     QualType BaseType = getBaseType().getNonReferenceType();
1360     if (isArrow()) {
1361       const PointerType *PT = BaseType->getAs<PointerType>();
1362       assert(PT && "base of arrow member access is not pointer");
1363       BaseType = PT->getPointeeType();
1364     }
1365     
1366     Record = BaseType->getAsCXXRecordDecl();
1367     assert(Record && "base of member expression does not name record");
1368   }
1369   
1370   return Record;
1371 }
1372
1373 SizeOfPackExpr *
1374 SizeOfPackExpr::Create(ASTContext &Context, SourceLocation OperatorLoc,
1375                        NamedDecl *Pack, SourceLocation PackLoc,
1376                        SourceLocation RParenLoc,
1377                        Optional<unsigned> Length,
1378                        ArrayRef<TemplateArgument> PartialArgs) {
1379   void *Storage =
1380       Context.Allocate(totalSizeToAlloc<TemplateArgument>(PartialArgs.size()));
1381   return new (Storage) SizeOfPackExpr(Context.getSizeType(), OperatorLoc, Pack,
1382                                       PackLoc, RParenLoc, Length, PartialArgs);
1383 }
1384
1385 SizeOfPackExpr *SizeOfPackExpr::CreateDeserialized(ASTContext &Context,
1386                                                    unsigned NumPartialArgs) {
1387   void *Storage =
1388       Context.Allocate(totalSizeToAlloc<TemplateArgument>(NumPartialArgs));
1389   return new (Storage) SizeOfPackExpr(EmptyShell(), NumPartialArgs);
1390 }
1391
1392 SubstNonTypeTemplateParmPackExpr::
1393 SubstNonTypeTemplateParmPackExpr(QualType T, 
1394                                  NonTypeTemplateParmDecl *Param,
1395                                  SourceLocation NameLoc,
1396                                  const TemplateArgument &ArgPack)
1397   : Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary, 
1398          true, true, true, true),
1399     Param(Param), Arguments(ArgPack.pack_begin()), 
1400     NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { }
1401
1402 TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const {
1403   return TemplateArgument(llvm::makeArrayRef(Arguments, NumArguments));
1404 }
1405
1406 FunctionParmPackExpr::FunctionParmPackExpr(QualType T, ParmVarDecl *ParamPack,
1407                                            SourceLocation NameLoc,
1408                                            unsigned NumParams,
1409                                            ParmVarDecl *const *Params)
1410     : Expr(FunctionParmPackExprClass, T, VK_LValue, OK_Ordinary, true, true,
1411            true, true),
1412       ParamPack(ParamPack), NameLoc(NameLoc), NumParameters(NumParams) {
1413   if (Params)
1414     std::uninitialized_copy(Params, Params + NumParams,
1415                             getTrailingObjects<ParmVarDecl *>());
1416 }
1417
1418 FunctionParmPackExpr *
1419 FunctionParmPackExpr::Create(const ASTContext &Context, QualType T,
1420                              ParmVarDecl *ParamPack, SourceLocation NameLoc,
1421                              ArrayRef<ParmVarDecl *> Params) {
1422   return new (Context.Allocate(totalSizeToAlloc<ParmVarDecl *>(Params.size())))
1423       FunctionParmPackExpr(T, ParamPack, NameLoc, Params.size(), Params.data());
1424 }
1425
1426 FunctionParmPackExpr *
1427 FunctionParmPackExpr::CreateEmpty(const ASTContext &Context,
1428                                   unsigned NumParams) {
1429   return new (Context.Allocate(totalSizeToAlloc<ParmVarDecl *>(NumParams)))
1430       FunctionParmPackExpr(QualType(), nullptr, SourceLocation(), 0, nullptr);
1431 }
1432
1433 void MaterializeTemporaryExpr::setExtendingDecl(const ValueDecl *ExtendedBy,
1434                                                 unsigned ManglingNumber) {
1435   // We only need extra state if we have to remember more than just the Stmt.
1436   if (!ExtendedBy)
1437     return;
1438
1439   // We may need to allocate extra storage for the mangling number and the
1440   // extended-by ValueDecl.
1441   if (!State.is<ExtraState *>()) {
1442     auto ES = new (ExtendedBy->getASTContext()) ExtraState;
1443     ES->Temporary = State.get<Stmt *>();
1444     State = ES;
1445   }
1446
1447   auto ES = State.get<ExtraState *>();
1448   ES->ExtendingDecl = ExtendedBy;
1449   ES->ManglingNumber = ManglingNumber;
1450 }
1451
1452 TypeTraitExpr::TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind,
1453                              ArrayRef<TypeSourceInfo *> Args,
1454                              SourceLocation RParenLoc,
1455                              bool Value)
1456   : Expr(TypeTraitExprClass, T, VK_RValue, OK_Ordinary,
1457          /*TypeDependent=*/false,
1458          /*ValueDependent=*/false,
1459          /*InstantiationDependent=*/false,
1460          /*ContainsUnexpandedParameterPack=*/false),
1461     Loc(Loc), RParenLoc(RParenLoc)
1462 {
1463   TypeTraitExprBits.Kind = Kind;
1464   TypeTraitExprBits.Value = Value;
1465   TypeTraitExprBits.NumArgs = Args.size();
1466
1467   TypeSourceInfo **ToArgs = getTrailingObjects<TypeSourceInfo *>();
1468
1469   for (unsigned I = 0, N = Args.size(); I != N; ++I) {
1470     if (Args[I]->getType()->isDependentType())
1471       setValueDependent(true);
1472     if (Args[I]->getType()->isInstantiationDependentType())
1473       setInstantiationDependent(true);
1474     if (Args[I]->getType()->containsUnexpandedParameterPack())
1475       setContainsUnexpandedParameterPack(true);
1476     
1477     ToArgs[I] = Args[I];
1478   }
1479 }
1480
1481 TypeTraitExpr *TypeTraitExpr::Create(const ASTContext &C, QualType T,
1482                                      SourceLocation Loc, 
1483                                      TypeTrait Kind,
1484                                      ArrayRef<TypeSourceInfo *> Args,
1485                                      SourceLocation RParenLoc,
1486                                      bool Value) {
1487   void *Mem = C.Allocate(totalSizeToAlloc<TypeSourceInfo *>(Args.size()));
1488   return new (Mem) TypeTraitExpr(T, Loc, Kind, Args, RParenLoc, Value);
1489 }
1490
1491 TypeTraitExpr *TypeTraitExpr::CreateDeserialized(const ASTContext &C,
1492                                                  unsigned NumArgs) {
1493   void *Mem = C.Allocate(totalSizeToAlloc<TypeSourceInfo *>(NumArgs));
1494   return new (Mem) TypeTraitExpr(EmptyShell());
1495 }
1496
1497 void ArrayTypeTraitExpr::anchor() { }