ExprCXX.cpp revision 1548d14f4092a817f7d90ad3e7a65266dc85fbc5
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/Basic/IdentifierTable.h"
15#include "clang/AST/DeclCXX.h"
16#include "clang/AST/DeclTemplate.h"
17#include "clang/AST/ExprCXX.h"
18#include "clang/AST/TypeLoc.h"
19using namespace clang;
20
21
22//===----------------------------------------------------------------------===//
23//  Child Iterators for iterating over subexpressions/substatements
24//===----------------------------------------------------------------------===//
25
26QualType CXXTypeidExpr::getTypeOperand() const {
27  assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
28  return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType()
29                                                        .getUnqualifiedType();
30}
31
32QualType CXXUuidofExpr::getTypeOperand() const {
33  assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
34  return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType()
35                                                        .getUnqualifiedType();
36}
37
38// CXXScalarValueInitExpr
39SourceRange CXXScalarValueInitExpr::getSourceRange() const {
40  SourceLocation Start = RParenLoc;
41  if (TypeInfo)
42    Start = TypeInfo->getTypeLoc().getBeginLoc();
43  return SourceRange(Start, RParenLoc);
44}
45
46// CXXNewExpr
47CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
48                       Expr **placementArgs, unsigned numPlaceArgs,
49                       SourceRange TypeIdParens, Expr *arraySize,
50                       CXXConstructorDecl *constructor, bool initializer,
51                       Expr **constructorArgs, unsigned numConsArgs,
52                       bool HadMultipleCandidates,
53                       FunctionDecl *operatorDelete,
54                       bool usualArrayDeleteWantsSize, QualType ty,
55                       TypeSourceInfo *AllocatedTypeInfo,
56                       SourceLocation startLoc, SourceLocation endLoc,
57                       SourceLocation constructorLParen,
58                       SourceLocation constructorRParen)
59  : Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary,
60         ty->isDependentType(), ty->isDependentType(),
61         ty->isInstantiationDependentType(),
62         ty->containsUnexpandedParameterPack()),
63    GlobalNew(globalNew), Initializer(initializer),
64    UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize),
65    HadMultipleCandidates(HadMultipleCandidates),
66    SubExprs(0), OperatorNew(operatorNew),
67    OperatorDelete(operatorDelete), Constructor(constructor),
68    AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens),
69    StartLoc(startLoc), EndLoc(endLoc), ConstructorLParen(constructorLParen),
70    ConstructorRParen(constructorRParen) {
71  AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
72  unsigned i = 0;
73  if (Array) {
74    if (arraySize->isInstantiationDependent())
75      ExprBits.InstantiationDependent = true;
76
77    if (arraySize->containsUnexpandedParameterPack())
78      ExprBits.ContainsUnexpandedParameterPack = true;
79
80    SubExprs[i++] = arraySize;
81  }
82
83  for (unsigned j = 0; j < NumPlacementArgs; ++j) {
84    if (placementArgs[j]->isInstantiationDependent())
85      ExprBits.InstantiationDependent = true;
86    if (placementArgs[j]->containsUnexpandedParameterPack())
87      ExprBits.ContainsUnexpandedParameterPack = true;
88
89    SubExprs[i++] = placementArgs[j];
90  }
91
92  for (unsigned j = 0; j < NumConstructorArgs; ++j) {
93    if (constructorArgs[j]->isInstantiationDependent())
94      ExprBits.InstantiationDependent = true;
95    if (constructorArgs[j]->containsUnexpandedParameterPack())
96      ExprBits.ContainsUnexpandedParameterPack = true;
97
98    SubExprs[i++] = constructorArgs[j];
99  }
100}
101
102void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
103                                   unsigned numPlaceArgs, unsigned numConsArgs){
104  assert(SubExprs == 0 && "SubExprs already allocated");
105  Array = isArray;
106  NumPlacementArgs = numPlaceArgs;
107  NumConstructorArgs = numConsArgs;
108
109  unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
110  SubExprs = new (C) Stmt*[TotalSize];
111}
112
113bool CXXNewExpr::shouldNullCheckAllocation(ASTContext &Ctx) const {
114  return getOperatorNew()->getType()->
115    castAs<FunctionProtoType>()->isNothrow(Ctx);
116}
117
118// CXXDeleteExpr
119QualType CXXDeleteExpr::getDestroyedType() const {
120  const Expr *Arg = getArgument();
121  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
122    if (ICE->getCastKind() != CK_UserDefinedConversion &&
123        ICE->getType()->isVoidPointerType())
124      Arg = ICE->getSubExpr();
125    else
126      break;
127  }
128  // The type-to-delete may not be a pointer if it's a dependent type.
129  const QualType ArgType = Arg->getType();
130
131  if (ArgType->isDependentType() && !ArgType->isPointerType())
132    return QualType();
133
134  return ArgType->getAs<PointerType>()->getPointeeType();
135}
136
137// CXXPseudoDestructorExpr
138PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
139 : Type(Info)
140{
141  Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
142}
143
144CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context,
145                Expr *Base, bool isArrow, SourceLocation OperatorLoc,
146                NestedNameSpecifierLoc QualifierLoc, TypeSourceInfo *ScopeType,
147                SourceLocation ColonColonLoc, SourceLocation TildeLoc,
148                PseudoDestructorTypeStorage DestroyedType)
149  : Expr(CXXPseudoDestructorExprClass,
150         Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0,
151                                         FunctionProtoType::ExtProtoInfo())),
152         VK_RValue, OK_Ordinary,
153         /*isTypeDependent=*/(Base->isTypeDependent() ||
154           (DestroyedType.getTypeSourceInfo() &&
155            DestroyedType.getTypeSourceInfo()->getType()->isDependentType())),
156         /*isValueDependent=*/Base->isValueDependent(),
157         (Base->isInstantiationDependent() ||
158          (QualifierLoc &&
159           QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent()) ||
160          (ScopeType &&
161           ScopeType->getType()->isInstantiationDependentType()) ||
162          (DestroyedType.getTypeSourceInfo() &&
163           DestroyedType.getTypeSourceInfo()->getType()
164                                             ->isInstantiationDependentType())),
165         // ContainsUnexpandedParameterPack
166         (Base->containsUnexpandedParameterPack() ||
167          (QualifierLoc &&
168           QualifierLoc.getNestedNameSpecifier()
169                                        ->containsUnexpandedParameterPack()) ||
170          (ScopeType &&
171           ScopeType->getType()->containsUnexpandedParameterPack()) ||
172          (DestroyedType.getTypeSourceInfo() &&
173           DestroyedType.getTypeSourceInfo()->getType()
174                                   ->containsUnexpandedParameterPack()))),
175    Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
176    OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
177    ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),
178    DestroyedType(DestroyedType) { }
179
180QualType CXXPseudoDestructorExpr::getDestroyedType() const {
181  if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
182    return TInfo->getType();
183
184  return QualType();
185}
186
187SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
188  SourceLocation End = DestroyedType.getLocation();
189  if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
190    End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
191  return SourceRange(Base->getLocStart(), End);
192}
193
194
195// UnresolvedLookupExpr
196UnresolvedLookupExpr *
197UnresolvedLookupExpr::Create(ASTContext &C,
198                             CXXRecordDecl *NamingClass,
199                             NestedNameSpecifierLoc QualifierLoc,
200                             SourceLocation TemplateKWLoc,
201                             const DeclarationNameInfo &NameInfo,
202                             bool ADL,
203                             const TemplateArgumentListInfo *Args,
204                             UnresolvedSetIterator Begin,
205                             UnresolvedSetIterator End)
206{
207  assert(Args || TemplateKWLoc.isValid());
208  unsigned num_args = Args ? Args->size() : 0;
209  void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
210                         ASTTemplateKWAndArgsInfo::sizeFor(num_args));
211  return new (Mem) UnresolvedLookupExpr(C, NamingClass, QualifierLoc,
212                                        TemplateKWLoc, NameInfo,
213                                        ADL, /*Overload*/ true, Args,
214                                        Begin, End, /*StdIsAssociated=*/false);
215}
216
217UnresolvedLookupExpr *
218UnresolvedLookupExpr::CreateEmpty(ASTContext &C,
219                                  bool HasTemplateKWAndArgsInfo,
220                                  unsigned NumTemplateArgs) {
221  std::size_t size = sizeof(UnresolvedLookupExpr);
222  if (HasTemplateKWAndArgsInfo)
223    size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
224
225  void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>());
226  UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
227  E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
228  return E;
229}
230
231OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C,
232                           NestedNameSpecifierLoc QualifierLoc,
233                           SourceLocation TemplateKWLoc,
234                           const DeclarationNameInfo &NameInfo,
235                           const TemplateArgumentListInfo *TemplateArgs,
236                           UnresolvedSetIterator Begin,
237                           UnresolvedSetIterator End,
238                           bool KnownDependent,
239                           bool KnownInstantiationDependent,
240                           bool KnownContainsUnexpandedParameterPack)
241  : Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent,
242         KnownDependent,
243         (KnownInstantiationDependent ||
244          NameInfo.isInstantiationDependent() ||
245          (QualifierLoc &&
246           QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
247         (KnownContainsUnexpandedParameterPack ||
248          NameInfo.containsUnexpandedParameterPack() ||
249          (QualifierLoc &&
250           QualifierLoc.getNestedNameSpecifier()
251                                      ->containsUnexpandedParameterPack()))),
252    Results(0), NumResults(End - Begin), NameInfo(NameInfo),
253    QualifierLoc(QualifierLoc),
254    HasTemplateKWAndArgsInfo(TemplateArgs != 0 || TemplateKWLoc.isValid())
255{
256  NumResults = End - Begin;
257  if (NumResults) {
258    // Determine whether this expression is type-dependent.
259    for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) {
260      if ((*I)->getDeclContext()->isDependentContext() ||
261          isa<UnresolvedUsingValueDecl>(*I)) {
262        ExprBits.TypeDependent = true;
263        ExprBits.ValueDependent = true;
264      }
265    }
266
267    Results = static_cast<DeclAccessPair *>(
268                                C.Allocate(sizeof(DeclAccessPair) * NumResults,
269                                           llvm::alignOf<DeclAccessPair>()));
270    memcpy(Results, &*Begin.getIterator(),
271           NumResults * sizeof(DeclAccessPair));
272  }
273
274  // If we have explicit template arguments, check for dependent
275  // template arguments and whether they contain any unexpanded pack
276  // expansions.
277  if (TemplateArgs) {
278    bool Dependent = false;
279    bool InstantiationDependent = false;
280    bool ContainsUnexpandedParameterPack = false;
281    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *TemplateArgs,
282                                               Dependent,
283                                               InstantiationDependent,
284                                               ContainsUnexpandedParameterPack);
285
286    if (Dependent) {
287      ExprBits.TypeDependent = true;
288      ExprBits.ValueDependent = true;
289    }
290    if (InstantiationDependent)
291      ExprBits.InstantiationDependent = true;
292    if (ContainsUnexpandedParameterPack)
293      ExprBits.ContainsUnexpandedParameterPack = true;
294  } else if (TemplateKWLoc.isValid()) {
295    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
296  }
297
298  if (isTypeDependent())
299    setType(C.DependentTy);
300}
301
302void OverloadExpr::initializeResults(ASTContext &C,
303                                     UnresolvedSetIterator Begin,
304                                     UnresolvedSetIterator End) {
305  assert(Results == 0 && "Results already initialized!");
306  NumResults = End - Begin;
307  if (NumResults) {
308     Results = static_cast<DeclAccessPair *>(
309                               C.Allocate(sizeof(DeclAccessPair) * NumResults,
310
311                                          llvm::alignOf<DeclAccessPair>()));
312     memcpy(Results, &*Begin.getIterator(),
313            NumResults * sizeof(DeclAccessPair));
314  }
315}
316
317CXXRecordDecl *OverloadExpr::getNamingClass() const {
318  if (isa<UnresolvedLookupExpr>(this))
319    return cast<UnresolvedLookupExpr>(this)->getNamingClass();
320  else
321    return cast<UnresolvedMemberExpr>(this)->getNamingClass();
322}
323
324// DependentScopeDeclRefExpr
325DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
326                            NestedNameSpecifierLoc QualifierLoc,
327                            SourceLocation TemplateKWLoc,
328                            const DeclarationNameInfo &NameInfo,
329                            const TemplateArgumentListInfo *Args)
330  : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary,
331         true, true,
332         (NameInfo.isInstantiationDependent() ||
333          (QualifierLoc &&
334           QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
335         (NameInfo.containsUnexpandedParameterPack() ||
336          (QualifierLoc &&
337           QualifierLoc.getNestedNameSpecifier()
338                            ->containsUnexpandedParameterPack()))),
339    QualifierLoc(QualifierLoc), NameInfo(NameInfo),
340    HasTemplateKWAndArgsInfo(Args != 0 || TemplateKWLoc.isValid())
341{
342  if (Args) {
343    bool Dependent = true;
344    bool InstantiationDependent = true;
345    bool ContainsUnexpandedParameterPack
346      = ExprBits.ContainsUnexpandedParameterPack;
347    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *Args,
348                                               Dependent,
349                                               InstantiationDependent,
350                                               ContainsUnexpandedParameterPack);
351    ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
352  } else if (TemplateKWLoc.isValid()) {
353    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
354  }
355}
356
357DependentScopeDeclRefExpr *
358DependentScopeDeclRefExpr::Create(ASTContext &C,
359                                  NestedNameSpecifierLoc QualifierLoc,
360                                  SourceLocation TemplateKWLoc,
361                                  const DeclarationNameInfo &NameInfo,
362                                  const TemplateArgumentListInfo *Args) {
363  std::size_t size = sizeof(DependentScopeDeclRefExpr);
364  if (Args)
365    size += ASTTemplateKWAndArgsInfo::sizeFor(Args->size());
366  else if (TemplateKWLoc.isValid())
367    size += ASTTemplateKWAndArgsInfo::sizeFor(0);
368  void *Mem = C.Allocate(size);
369  return new (Mem) DependentScopeDeclRefExpr(C.DependentTy, QualifierLoc,
370                                             TemplateKWLoc, NameInfo, Args);
371}
372
373DependentScopeDeclRefExpr *
374DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
375                                       bool HasTemplateKWAndArgsInfo,
376                                       unsigned NumTemplateArgs) {
377  std::size_t size = sizeof(DependentScopeDeclRefExpr);
378  if (HasTemplateKWAndArgsInfo)
379    size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
380  void *Mem = C.Allocate(size);
381  DependentScopeDeclRefExpr *E
382    = new (Mem) DependentScopeDeclRefExpr(QualType(), NestedNameSpecifierLoc(),
383                                          SourceLocation(),
384                                          DeclarationNameInfo(), 0);
385  E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
386  return E;
387}
388
389SourceRange CXXConstructExpr::getSourceRange() const {
390  if (isa<CXXTemporaryObjectExpr>(this))
391    return cast<CXXTemporaryObjectExpr>(this)->getSourceRange();
392
393  if (ParenRange.isValid())
394    return SourceRange(Loc, ParenRange.getEnd());
395
396  SourceLocation End = Loc;
397  for (unsigned I = getNumArgs(); I > 0; --I) {
398    const Expr *Arg = getArg(I-1);
399    if (!Arg->isDefaultArgument()) {
400      SourceLocation NewEnd = Arg->getLocEnd();
401      if (NewEnd.isValid()) {
402        End = NewEnd;
403        break;
404      }
405    }
406  }
407
408  return SourceRange(Loc, End);
409}
410
411SourceRange CXXOperatorCallExpr::getSourceRange() const {
412  OverloadedOperatorKind Kind = getOperator();
413  if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
414    if (getNumArgs() == 1)
415      // Prefix operator
416      return SourceRange(getOperatorLoc(),
417                         getArg(0)->getSourceRange().getEnd());
418    else
419      // Postfix operator
420      return SourceRange(getArg(0)->getSourceRange().getBegin(),
421                         getOperatorLoc());
422  } else if (Kind == OO_Arrow) {
423    return getArg(0)->getSourceRange();
424  } else if (Kind == OO_Call) {
425    return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
426  } else if (Kind == OO_Subscript) {
427    return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
428  } else if (getNumArgs() == 1) {
429    return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
430  } else if (getNumArgs() == 2) {
431    return SourceRange(getArg(0)->getSourceRange().getBegin(),
432                       getArg(1)->getSourceRange().getEnd());
433  } else {
434    return SourceRange();
435  }
436}
437
438Expr *CXXMemberCallExpr::getImplicitObjectArgument() const {
439  if (const MemberExpr *MemExpr =
440        dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
441    return MemExpr->getBase();
442
443  // FIXME: Will eventually need to cope with member pointers.
444  return 0;
445}
446
447CXXMethodDecl *CXXMemberCallExpr::getMethodDecl() const {
448  if (const MemberExpr *MemExpr =
449      dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
450    return cast<CXXMethodDecl>(MemExpr->getMemberDecl());
451
452  // FIXME: Will eventually need to cope with member pointers.
453  return 0;
454}
455
456
457CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() {
458  Expr* ThisArg = getImplicitObjectArgument();
459  if (!ThisArg)
460    return 0;
461
462  if (ThisArg->getType()->isAnyPointerType())
463    return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
464
465  return ThisArg->getType()->getAsCXXRecordDecl();
466}
467
468
469//===----------------------------------------------------------------------===//
470//  Named casts
471//===----------------------------------------------------------------------===//
472
473/// getCastName - Get the name of the C++ cast being used, e.g.,
474/// "static_cast", "dynamic_cast", "reinterpret_cast", or
475/// "const_cast". The returned pointer must not be freed.
476const char *CXXNamedCastExpr::getCastName() const {
477  switch (getStmtClass()) {
478  case CXXStaticCastExprClass:      return "static_cast";
479  case CXXDynamicCastExprClass:     return "dynamic_cast";
480  case CXXReinterpretCastExprClass: return "reinterpret_cast";
481  case CXXConstCastExprClass:       return "const_cast";
482  default:                          return "<invalid cast>";
483  }
484}
485
486CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
487                                             ExprValueKind VK,
488                                             CastKind K, Expr *Op,
489                                             const CXXCastPath *BasePath,
490                                             TypeSourceInfo *WrittenTy,
491                                             SourceLocation L,
492                                             SourceLocation RParenLoc) {
493  unsigned PathSize = (BasePath ? BasePath->size() : 0);
494  void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
495                            + PathSize * sizeof(CXXBaseSpecifier*));
496  CXXStaticCastExpr *E =
497    new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
498                                   RParenLoc);
499  if (PathSize) E->setCastPath(*BasePath);
500  return E;
501}
502
503CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
504                                                  unsigned PathSize) {
505  void *Buffer =
506    C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
507  return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
508}
509
510CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
511                                               ExprValueKind VK,
512                                               CastKind K, Expr *Op,
513                                               const CXXCastPath *BasePath,
514                                               TypeSourceInfo *WrittenTy,
515                                               SourceLocation L,
516                                               SourceLocation RParenLoc) {
517  unsigned PathSize = (BasePath ? BasePath->size() : 0);
518  void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
519                            + PathSize * sizeof(CXXBaseSpecifier*));
520  CXXDynamicCastExpr *E =
521    new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
522                                    RParenLoc);
523  if (PathSize) E->setCastPath(*BasePath);
524  return E;
525}
526
527CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
528                                                    unsigned PathSize) {
529  void *Buffer =
530    C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
531  return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
532}
533
534/// isAlwaysNull - Return whether the result of the dynamic_cast is proven
535/// to always be null. For example:
536///
537/// struct A { };
538/// struct B final : A { };
539/// struct C { };
540///
541/// C *f(B* b) { return dynamic_cast<C*>(b); }
542bool CXXDynamicCastExpr::isAlwaysNull() const
543{
544  QualType SrcType = getSubExpr()->getType();
545  QualType DestType = getType();
546
547  if (const PointerType *SrcPTy = SrcType->getAs<PointerType>()) {
548    SrcType = SrcPTy->getPointeeType();
549    DestType = DestType->castAs<PointerType>()->getPointeeType();
550  }
551
552  const CXXRecordDecl *SrcRD =
553    cast<CXXRecordDecl>(SrcType->castAs<RecordType>()->getDecl());
554
555  if (!SrcRD->hasAttr<FinalAttr>())
556    return false;
557
558  const CXXRecordDecl *DestRD =
559    cast<CXXRecordDecl>(DestType->castAs<RecordType>()->getDecl());
560
561  return !DestRD->isDerivedFrom(SrcRD);
562}
563
564CXXReinterpretCastExpr *
565CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
566                               CastKind K, Expr *Op,
567                               const CXXCastPath *BasePath,
568                               TypeSourceInfo *WrittenTy, SourceLocation L,
569                               SourceLocation RParenLoc) {
570  unsigned PathSize = (BasePath ? BasePath->size() : 0);
571  void *Buffer =
572    C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
573  CXXReinterpretCastExpr *E =
574    new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
575                                        RParenLoc);
576  if (PathSize) E->setCastPath(*BasePath);
577  return E;
578}
579
580CXXReinterpretCastExpr *
581CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
582  void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
583                            + PathSize * sizeof(CXXBaseSpecifier*));
584  return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
585}
586
587CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T,
588                                           ExprValueKind VK, Expr *Op,
589                                           TypeSourceInfo *WrittenTy,
590                                           SourceLocation L,
591                                           SourceLocation RParenLoc) {
592  return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc);
593}
594
595CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
596  return new (C) CXXConstCastExpr(EmptyShell());
597}
598
599CXXFunctionalCastExpr *
600CXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
601                              TypeSourceInfo *Written, SourceLocation L,
602                              CastKind K, Expr *Op, const CXXCastPath *BasePath,
603                               SourceLocation R) {
604  unsigned PathSize = (BasePath ? BasePath->size() : 0);
605  void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
606                            + PathSize * sizeof(CXXBaseSpecifier*));
607  CXXFunctionalCastExpr *E =
608    new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, PathSize, R);
609  if (PathSize) E->setCastPath(*BasePath);
610  return E;
611}
612
613CXXFunctionalCastExpr *
614CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
615  void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
616                            + PathSize * sizeof(CXXBaseSpecifier*));
617  return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
618}
619
620
621CXXDefaultArgExpr *
622CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
623                          ParmVarDecl *Param, Expr *SubExpr) {
624  void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
625  return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
626                                     SubExpr);
627}
628
629CXXTemporary *CXXTemporary::Create(ASTContext &C,
630                                   const CXXDestructorDecl *Destructor) {
631  return new (C) CXXTemporary(Destructor);
632}
633
634CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
635                                                   CXXTemporary *Temp,
636                                                   Expr* SubExpr) {
637  assert((SubExpr->getType()->isRecordType() ||
638          SubExpr->getType()->isArrayType()) &&
639         "Expression bound to a temporary must have record or array type!");
640
641  return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
642}
643
644CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
645                                               CXXConstructorDecl *Cons,
646                                               TypeSourceInfo *Type,
647                                               Expr **Args,
648                                               unsigned NumArgs,
649                                               SourceRange parenRange,
650                                               bool HadMultipleCandidates,
651                                               bool ZeroInitialization)
652  : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
653                     Type->getType().getNonReferenceType(),
654                     Type->getTypeLoc().getBeginLoc(),
655                     Cons, false, Args, NumArgs,
656                     HadMultipleCandidates, /*FIXME*/false, ZeroInitialization,
657                     CXXConstructExpr::CK_Complete, parenRange),
658    Type(Type) {
659}
660
661SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
662  return SourceRange(Type->getTypeLoc().getBeginLoc(),
663                     getParenRange().getEnd());
664}
665
666CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
667                                           SourceLocation Loc,
668                                           CXXConstructorDecl *D, bool Elidable,
669                                           Expr **Args, unsigned NumArgs,
670                                           bool HadMultipleCandidates,
671                                           bool ListInitialization,
672                                           bool ZeroInitialization,
673                                           ConstructionKind ConstructKind,
674                                           SourceRange ParenRange) {
675  return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
676                                  Elidable, Args, NumArgs,
677                                  HadMultipleCandidates, ListInitialization,
678                                  ZeroInitialization, ConstructKind,
679                                  ParenRange);
680}
681
682CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
683                                   SourceLocation Loc,
684                                   CXXConstructorDecl *D, bool elidable,
685                                   Expr **args, unsigned numargs,
686                                   bool HadMultipleCandidates,
687                                   bool ListInitialization,
688                                   bool ZeroInitialization,
689                                   ConstructionKind ConstructKind,
690                                   SourceRange ParenRange)
691  : Expr(SC, T, VK_RValue, OK_Ordinary,
692         T->isDependentType(), T->isDependentType(),
693         T->isInstantiationDependentType(),
694         T->containsUnexpandedParameterPack()),
695    Constructor(D), Loc(Loc), ParenRange(ParenRange),  NumArgs(numargs),
696    Elidable(elidable), HadMultipleCandidates(HadMultipleCandidates),
697    ListInitialization(ListInitialization),
698    ZeroInitialization(ZeroInitialization),
699    ConstructKind(ConstructKind), Args(0)
700{
701  if (NumArgs) {
702    Args = new (C) Stmt*[NumArgs];
703
704    for (unsigned i = 0; i != NumArgs; ++i) {
705      assert(args[i] && "NULL argument in CXXConstructExpr");
706
707      if (args[i]->isValueDependent())
708        ExprBits.ValueDependent = true;
709      if (args[i]->isInstantiationDependent())
710        ExprBits.InstantiationDependent = true;
711      if (args[i]->containsUnexpandedParameterPack())
712        ExprBits.ContainsUnexpandedParameterPack = true;
713
714      Args[i] = args[i];
715    }
716  }
717}
718
719LambdaExpr::Capture::Capture(SourceLocation Loc, bool Implicit,
720                             LambdaCaptureKind Kind, VarDecl *Var,
721                             SourceLocation EllipsisLoc)
722  : VarAndBits(Var, 0), Loc(Loc), EllipsisLoc(EllipsisLoc)
723{
724  unsigned Bits = 0;
725  if (Implicit)
726    Bits |= Capture_Implicit;
727
728  switch (Kind) {
729  case LCK_This:
730    assert(Var == 0 && "'this' capture cannot have a variable!");
731    break;
732
733  case LCK_ByCopy:
734    Bits |= Capture_ByCopy;
735    // Fall through
736  case LCK_ByRef:
737    assert(Var && "capture must have a variable!");
738    break;
739  }
740  VarAndBits.setInt(Bits);
741}
742
743LambdaCaptureKind LambdaExpr::Capture::getCaptureKind() const {
744  if (capturesThis())
745    return LCK_This;
746
747  return (VarAndBits.getInt() & Capture_ByCopy)? LCK_ByCopy : LCK_ByRef;
748}
749
750LambdaExpr::LambdaExpr(QualType T,
751                       SourceRange IntroducerRange,
752                       LambdaCaptureDefault CaptureDefault,
753                       ArrayRef<Capture> Captures,
754                       bool ExplicitParams,
755                       bool ExplicitResultType,
756                       ArrayRef<Expr *> CaptureInits,
757                       ArrayRef<VarDecl *> ArrayIndexVars,
758                       ArrayRef<unsigned> ArrayIndexStarts,
759                       SourceLocation ClosingBrace)
760  : Expr(LambdaExprClass, T, VK_RValue, OK_Ordinary,
761         T->isDependentType(), T->isDependentType(), T->isDependentType(),
762         /*ContainsUnexpandedParameterPack=*/false),
763    IntroducerRange(IntroducerRange),
764    NumCaptures(Captures.size()),
765    CaptureDefault(CaptureDefault),
766    ExplicitParams(ExplicitParams),
767    ExplicitResultType(ExplicitResultType),
768    ClosingBrace(ClosingBrace)
769{
770  assert(CaptureInits.size() == Captures.size() && "Wrong number of arguments");
771  CXXRecordDecl *Class = getLambdaClass();
772  CXXRecordDecl::LambdaDefinitionData &Data = Class->getLambdaData();
773
774  // FIXME: Propagate "has unexpanded parameter pack" bit.
775
776  // Copy captures.
777  ASTContext &Context = Class->getASTContext();
778  Data.NumCaptures = NumCaptures;
779  Data.NumExplicitCaptures = 0;
780  Data.Captures = (Capture *)Context.Allocate(sizeof(Capture) * NumCaptures);
781  Capture *ToCapture = Data.Captures;
782  for (unsigned I = 0, N = Captures.size(); I != N; ++I) {
783    if (Captures[I].isExplicit())
784      ++Data.NumExplicitCaptures;
785
786    *ToCapture++ = Captures[I];
787  }
788
789  // Copy initialization expressions for the non-static data members.
790  Stmt **Stored = getStoredStmts();
791  for (unsigned I = 0, N = CaptureInits.size(); I != N; ++I)
792    *Stored++ = CaptureInits[I];
793
794  // Copy the body of the lambda.
795  *Stored++ = getCallOperator()->getBody();
796
797  // Copy the array index variables, if any.
798  HasArrayIndexVars = !ArrayIndexVars.empty();
799  if (HasArrayIndexVars) {
800    assert(ArrayIndexStarts.size() == NumCaptures);
801    memcpy(getArrayIndexVars(), ArrayIndexVars.data(),
802           sizeof(VarDecl *) * ArrayIndexVars.size());
803    memcpy(getArrayIndexStarts(), ArrayIndexStarts.data(),
804           sizeof(unsigned) * Captures.size());
805    getArrayIndexStarts()[Captures.size()] = ArrayIndexVars.size();
806  }
807}
808
809LambdaExpr *LambdaExpr::Create(ASTContext &Context,
810                               CXXRecordDecl *Class,
811                               SourceRange IntroducerRange,
812                               LambdaCaptureDefault CaptureDefault,
813                               ArrayRef<Capture> Captures,
814                               bool ExplicitParams,
815                               bool ExplicitResultType,
816                               ArrayRef<Expr *> CaptureInits,
817                               ArrayRef<VarDecl *> ArrayIndexVars,
818                               ArrayRef<unsigned> ArrayIndexStarts,
819                               SourceLocation ClosingBrace) {
820  // Determine the type of the expression (i.e., the type of the
821  // function object we're creating).
822  QualType T = Context.getTypeDeclType(Class);
823
824  unsigned Size = sizeof(LambdaExpr) + sizeof(Stmt *) * (Captures.size() + 1);
825  if (!ArrayIndexVars.empty())
826    Size += sizeof(VarDecl *) * ArrayIndexVars.size()
827          + sizeof(unsigned) * (Captures.size() + 1);
828  void *Mem = Context.Allocate(Size);
829  return new (Mem) LambdaExpr(T, IntroducerRange, CaptureDefault,
830                              Captures, ExplicitParams, ExplicitResultType,
831                              CaptureInits, ArrayIndexVars, ArrayIndexStarts,
832                              ClosingBrace);
833}
834
835LambdaExpr *LambdaExpr::CreateDeserialized(ASTContext &C, unsigned NumCaptures,
836                                           unsigned NumArrayIndexVars) {
837  unsigned Size = sizeof(LambdaExpr) + sizeof(Stmt *) * (NumCaptures + 1);
838  if (NumArrayIndexVars)
839    Size += sizeof(VarDecl) * NumArrayIndexVars
840          + sizeof(unsigned) * (NumCaptures + 1);
841  void *Mem = C.Allocate(Size);
842  return new (Mem) LambdaExpr(EmptyShell(), NumCaptures, NumArrayIndexVars > 0);
843}
844
845LambdaExpr::capture_iterator LambdaExpr::capture_begin() const {
846  return getLambdaClass()->getLambdaData().Captures;
847}
848
849LambdaExpr::capture_iterator LambdaExpr::capture_end() const {
850  return capture_begin() + NumCaptures;
851}
852
853LambdaExpr::capture_iterator LambdaExpr::explicit_capture_begin() const {
854  return capture_begin();
855}
856
857LambdaExpr::capture_iterator LambdaExpr::explicit_capture_end() const {
858  struct CXXRecordDecl::LambdaDefinitionData &Data
859    = getLambdaClass()->getLambdaData();
860  return Data.Captures + Data.NumExplicitCaptures;
861}
862
863LambdaExpr::capture_iterator LambdaExpr::implicit_capture_begin() const {
864  return explicit_capture_end();
865}
866
867LambdaExpr::capture_iterator LambdaExpr::implicit_capture_end() const {
868  return capture_end();
869}
870
871ArrayRef<VarDecl *>
872LambdaExpr::getCaptureInitIndexVars(capture_init_iterator Iter) const {
873  assert(HasArrayIndexVars && "No array index-var data?");
874
875  unsigned Index = Iter - capture_init_begin();
876  assert(Index < getLambdaClass()->getLambdaData().NumCaptures &&
877         "Capture index out-of-range");
878  VarDecl **IndexVars = getArrayIndexVars();
879  unsigned *IndexStarts = getArrayIndexStarts();
880  return ArrayRef<VarDecl *>(IndexVars + IndexStarts[Index],
881                             IndexVars + IndexStarts[Index + 1]);
882}
883
884CXXRecordDecl *LambdaExpr::getLambdaClass() const {
885  return getType()->getAsCXXRecordDecl();
886}
887
888CXXMethodDecl *LambdaExpr::getCallOperator() const {
889  CXXRecordDecl *Record = getLambdaClass();
890  DeclarationName Name
891    = Record->getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
892  DeclContext::lookup_result Calls = Record->lookup(Name);
893  assert(Calls.first != Calls.second && "Missing lambda call operator!");
894  CXXMethodDecl *Result = cast<CXXMethodDecl>(*Calls.first++);
895  assert(Calls.first == Calls.second && "More than lambda one call operator?");
896  return Result;
897}
898
899CompoundStmt *LambdaExpr::getBody() const {
900  if (!getStoredStmts()[NumCaptures])
901    getStoredStmts()[NumCaptures] = getCallOperator()->getBody();
902
903  return reinterpret_cast<CompoundStmt *>(getStoredStmts()[NumCaptures]);
904}
905
906bool LambdaExpr::isMutable() const {
907  return (getCallOperator()->getTypeQualifiers() & Qualifiers::Const) == 0;
908}
909
910ExprWithCleanups::ExprWithCleanups(Expr *subexpr,
911                                   ArrayRef<CleanupObject> objects)
912  : Expr(ExprWithCleanupsClass, subexpr->getType(),
913         subexpr->getValueKind(), subexpr->getObjectKind(),
914         subexpr->isTypeDependent(), subexpr->isValueDependent(),
915         subexpr->isInstantiationDependent(),
916         subexpr->containsUnexpandedParameterPack()),
917    SubExpr(subexpr) {
918  ExprWithCleanupsBits.NumObjects = objects.size();
919  for (unsigned i = 0, e = objects.size(); i != e; ++i)
920    getObjectsBuffer()[i] = objects[i];
921}
922
923ExprWithCleanups *ExprWithCleanups::Create(ASTContext &C, Expr *subexpr,
924                                           ArrayRef<CleanupObject> objects) {
925  size_t size = sizeof(ExprWithCleanups)
926              + objects.size() * sizeof(CleanupObject);
927  void *buffer = C.Allocate(size, llvm::alignOf<ExprWithCleanups>());
928  return new (buffer) ExprWithCleanups(subexpr, objects);
929}
930
931ExprWithCleanups::ExprWithCleanups(EmptyShell empty, unsigned numObjects)
932  : Expr(ExprWithCleanupsClass, empty) {
933  ExprWithCleanupsBits.NumObjects = numObjects;
934}
935
936ExprWithCleanups *ExprWithCleanups::Create(ASTContext &C, EmptyShell empty,
937                                           unsigned numObjects) {
938  size_t size = sizeof(ExprWithCleanups) + numObjects * sizeof(CleanupObject);
939  void *buffer = C.Allocate(size, llvm::alignOf<ExprWithCleanups>());
940  return new (buffer) ExprWithCleanups(empty, numObjects);
941}
942
943CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
944                                                 SourceLocation LParenLoc,
945                                                 Expr **Args,
946                                                 unsigned NumArgs,
947                                                 SourceLocation RParenLoc)
948  : Expr(CXXUnresolvedConstructExprClass,
949         Type->getType().getNonReferenceType(),
950         (Type->getType()->isLValueReferenceType() ? VK_LValue
951          :Type->getType()->isRValueReferenceType()? VK_XValue
952          :VK_RValue),
953         OK_Ordinary,
954         Type->getType()->isDependentType(), true, true,
955         Type->getType()->containsUnexpandedParameterPack()),
956    Type(Type),
957    LParenLoc(LParenLoc),
958    RParenLoc(RParenLoc),
959    NumArgs(NumArgs) {
960  Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
961  for (unsigned I = 0; I != NumArgs; ++I) {
962    if (Args[I]->containsUnexpandedParameterPack())
963      ExprBits.ContainsUnexpandedParameterPack = true;
964
965    StoredArgs[I] = Args[I];
966  }
967}
968
969CXXUnresolvedConstructExpr *
970CXXUnresolvedConstructExpr::Create(ASTContext &C,
971                                   TypeSourceInfo *Type,
972                                   SourceLocation LParenLoc,
973                                   Expr **Args,
974                                   unsigned NumArgs,
975                                   SourceLocation RParenLoc) {
976  void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
977                         sizeof(Expr *) * NumArgs);
978  return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
979                                              Args, NumArgs, RParenLoc);
980}
981
982CXXUnresolvedConstructExpr *
983CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
984  Stmt::EmptyShell Empty;
985  void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
986                         sizeof(Expr *) * NumArgs);
987  return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
988}
989
990SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
991  return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
992}
993
994CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
995                                                 Expr *Base, QualType BaseType,
996                                                 bool IsArrow,
997                                                 SourceLocation OperatorLoc,
998                                          NestedNameSpecifierLoc QualifierLoc,
999                                          SourceLocation TemplateKWLoc,
1000                                          NamedDecl *FirstQualifierFoundInScope,
1001                                          DeclarationNameInfo MemberNameInfo,
1002                                   const TemplateArgumentListInfo *TemplateArgs)
1003  : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
1004         VK_LValue, OK_Ordinary, true, true, true,
1005         ((Base && Base->containsUnexpandedParameterPack()) ||
1006          (QualifierLoc &&
1007           QualifierLoc.getNestedNameSpecifier()
1008                                       ->containsUnexpandedParameterPack()) ||
1009          MemberNameInfo.containsUnexpandedParameterPack())),
1010    Base(Base), BaseType(BaseType), IsArrow(IsArrow),
1011    HasTemplateKWAndArgsInfo(TemplateArgs != 0 || TemplateKWLoc.isValid()),
1012    OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
1013    FirstQualifierFoundInScope(FirstQualifierFoundInScope),
1014    MemberNameInfo(MemberNameInfo) {
1015  if (TemplateArgs) {
1016    bool Dependent = true;
1017    bool InstantiationDependent = true;
1018    bool ContainsUnexpandedParameterPack = false;
1019    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *TemplateArgs,
1020                                               Dependent,
1021                                               InstantiationDependent,
1022                                               ContainsUnexpandedParameterPack);
1023    if (ContainsUnexpandedParameterPack)
1024      ExprBits.ContainsUnexpandedParameterPack = true;
1025  } else if (TemplateKWLoc.isValid()) {
1026    getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
1027  }
1028}
1029
1030CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
1031                          Expr *Base, QualType BaseType,
1032                          bool IsArrow,
1033                          SourceLocation OperatorLoc,
1034                          NestedNameSpecifierLoc QualifierLoc,
1035                          NamedDecl *FirstQualifierFoundInScope,
1036                          DeclarationNameInfo MemberNameInfo)
1037  : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
1038         VK_LValue, OK_Ordinary, true, true, true,
1039         ((Base && Base->containsUnexpandedParameterPack()) ||
1040          (QualifierLoc &&
1041           QualifierLoc.getNestedNameSpecifier()->
1042                                         containsUnexpandedParameterPack()) ||
1043          MemberNameInfo.containsUnexpandedParameterPack())),
1044    Base(Base), BaseType(BaseType), IsArrow(IsArrow),
1045    HasTemplateKWAndArgsInfo(false),
1046    OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
1047    FirstQualifierFoundInScope(FirstQualifierFoundInScope),
1048    MemberNameInfo(MemberNameInfo) { }
1049
1050CXXDependentScopeMemberExpr *
1051CXXDependentScopeMemberExpr::Create(ASTContext &C,
1052                                Expr *Base, QualType BaseType, bool IsArrow,
1053                                SourceLocation OperatorLoc,
1054                                NestedNameSpecifierLoc QualifierLoc,
1055                                SourceLocation TemplateKWLoc,
1056                                NamedDecl *FirstQualifierFoundInScope,
1057                                DeclarationNameInfo MemberNameInfo,
1058                                const TemplateArgumentListInfo *TemplateArgs) {
1059  if (!TemplateArgs && !TemplateKWLoc.isValid())
1060    return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
1061                                               IsArrow, OperatorLoc,
1062                                               QualifierLoc,
1063                                               FirstQualifierFoundInScope,
1064                                               MemberNameInfo);
1065
1066  unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->size() : 0;
1067  std::size_t size = sizeof(CXXDependentScopeMemberExpr)
1068    + ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
1069
1070  void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
1071  return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
1072                                               IsArrow, OperatorLoc,
1073                                               QualifierLoc,
1074                                               TemplateKWLoc,
1075                                               FirstQualifierFoundInScope,
1076                                               MemberNameInfo, TemplateArgs);
1077}
1078
1079CXXDependentScopeMemberExpr *
1080CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
1081                                         bool HasTemplateKWAndArgsInfo,
1082                                         unsigned NumTemplateArgs) {
1083  if (!HasTemplateKWAndArgsInfo)
1084    return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
1085                                               0, SourceLocation(),
1086                                               NestedNameSpecifierLoc(), 0,
1087                                               DeclarationNameInfo());
1088
1089  std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
1090                     ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
1091  void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
1092  CXXDependentScopeMemberExpr *E
1093    =  new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
1094                                             0, SourceLocation(),
1095                                             NestedNameSpecifierLoc(),
1096                                             SourceLocation(), 0,
1097                                             DeclarationNameInfo(), 0);
1098  E->HasTemplateKWAndArgsInfo = true;
1099  return E;
1100}
1101
1102bool CXXDependentScopeMemberExpr::isImplicitAccess() const {
1103  if (Base == 0)
1104    return true;
1105
1106  return cast<Expr>(Base)->isImplicitCXXThis();
1107}
1108
1109static bool hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin,
1110                                            UnresolvedSetIterator end) {
1111  do {
1112    NamedDecl *decl = *begin;
1113    if (isa<UnresolvedUsingValueDecl>(decl))
1114      return false;
1115    if (isa<UsingShadowDecl>(decl))
1116      decl = cast<UsingShadowDecl>(decl)->getUnderlyingDecl();
1117
1118    // Unresolved member expressions should only contain methods and
1119    // method templates.
1120    assert(isa<CXXMethodDecl>(decl) || isa<FunctionTemplateDecl>(decl));
1121
1122    if (isa<FunctionTemplateDecl>(decl))
1123      decl = cast<FunctionTemplateDecl>(decl)->getTemplatedDecl();
1124    if (cast<CXXMethodDecl>(decl)->isStatic())
1125      return false;
1126  } while (++begin != end);
1127
1128  return true;
1129}
1130
1131UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C,
1132                                           bool HasUnresolvedUsing,
1133                                           Expr *Base, QualType BaseType,
1134                                           bool IsArrow,
1135                                           SourceLocation OperatorLoc,
1136                                           NestedNameSpecifierLoc QualifierLoc,
1137                                           SourceLocation TemplateKWLoc,
1138                                   const DeclarationNameInfo &MemberNameInfo,
1139                                   const TemplateArgumentListInfo *TemplateArgs,
1140                                           UnresolvedSetIterator Begin,
1141                                           UnresolvedSetIterator End)
1142  : OverloadExpr(UnresolvedMemberExprClass, C, QualifierLoc, TemplateKWLoc,
1143                 MemberNameInfo, TemplateArgs, Begin, End,
1144                 // Dependent
1145                 ((Base && Base->isTypeDependent()) ||
1146                  BaseType->isDependentType()),
1147                 ((Base && Base->isInstantiationDependent()) ||
1148                   BaseType->isInstantiationDependentType()),
1149                 // Contains unexpanded parameter pack
1150                 ((Base && Base->containsUnexpandedParameterPack()) ||
1151                  BaseType->containsUnexpandedParameterPack())),
1152    IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
1153    Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
1154
1155  // Check whether all of the members are non-static member functions,
1156  // and if so, mark give this bound-member type instead of overload type.
1157  if (hasOnlyNonStaticMemberFunctions(Begin, End))
1158    setType(C.BoundMemberTy);
1159}
1160
1161bool UnresolvedMemberExpr::isImplicitAccess() const {
1162  if (Base == 0)
1163    return true;
1164
1165  return cast<Expr>(Base)->isImplicitCXXThis();
1166}
1167
1168UnresolvedMemberExpr *
1169UnresolvedMemberExpr::Create(ASTContext &C,
1170                             bool HasUnresolvedUsing,
1171                             Expr *Base, QualType BaseType, bool IsArrow,
1172                             SourceLocation OperatorLoc,
1173                             NestedNameSpecifierLoc QualifierLoc,
1174                             SourceLocation TemplateKWLoc,
1175                             const DeclarationNameInfo &MemberNameInfo,
1176                             const TemplateArgumentListInfo *TemplateArgs,
1177                             UnresolvedSetIterator Begin,
1178                             UnresolvedSetIterator End) {
1179  std::size_t size = sizeof(UnresolvedMemberExpr);
1180  if (TemplateArgs)
1181    size += ASTTemplateKWAndArgsInfo::sizeFor(TemplateArgs->size());
1182  else if (TemplateKWLoc.isValid())
1183    size += ASTTemplateKWAndArgsInfo::sizeFor(0);
1184
1185  void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
1186  return new (Mem) UnresolvedMemberExpr(C,
1187                             HasUnresolvedUsing, Base, BaseType,
1188                             IsArrow, OperatorLoc, QualifierLoc, TemplateKWLoc,
1189                             MemberNameInfo, TemplateArgs, Begin, End);
1190}
1191
1192UnresolvedMemberExpr *
1193UnresolvedMemberExpr::CreateEmpty(ASTContext &C, bool HasTemplateKWAndArgsInfo,
1194                                  unsigned NumTemplateArgs) {
1195  std::size_t size = sizeof(UnresolvedMemberExpr);
1196  if (HasTemplateKWAndArgsInfo)
1197    size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
1198
1199  void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
1200  UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
1201  E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
1202  return E;
1203}
1204
1205CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
1206  // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
1207
1208  // If there was a nested name specifier, it names the naming class.
1209  // It can't be dependent: after all, we were actually able to do the
1210  // lookup.
1211  CXXRecordDecl *Record = 0;
1212  if (getQualifier()) {
1213    const Type *T = getQualifier()->getAsType();
1214    assert(T && "qualifier in member expression does not name type");
1215    Record = T->getAsCXXRecordDecl();
1216    assert(Record && "qualifier in member expression does not name record");
1217  }
1218  // Otherwise the naming class must have been the base class.
1219  else {
1220    QualType BaseType = getBaseType().getNonReferenceType();
1221    if (isArrow()) {
1222      const PointerType *PT = BaseType->getAs<PointerType>();
1223      assert(PT && "base of arrow member access is not pointer");
1224      BaseType = PT->getPointeeType();
1225    }
1226
1227    Record = BaseType->getAsCXXRecordDecl();
1228    assert(Record && "base of member expression does not name record");
1229  }
1230
1231  return Record;
1232}
1233
1234SubstNonTypeTemplateParmPackExpr::
1235SubstNonTypeTemplateParmPackExpr(QualType T,
1236                                 NonTypeTemplateParmDecl *Param,
1237                                 SourceLocation NameLoc,
1238                                 const TemplateArgument &ArgPack)
1239  : Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary,
1240         true, true, true, true),
1241    Param(Param), Arguments(ArgPack.pack_begin()),
1242    NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { }
1243
1244TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const {
1245  return TemplateArgument(Arguments, NumArguments);
1246}
1247
1248void ArrayTypeTraitExpr::anchor() { }
1249