ExprCXX.cpp revision 224145
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                       FunctionDecl *operatorDelete,
53                       bool usualArrayDeleteWantsSize, QualType ty,
54                       TypeSourceInfo *AllocatedTypeInfo,
55                       SourceLocation startLoc, SourceLocation endLoc,
56                       SourceLocation constructorLParen,
57                       SourceLocation constructorRParen)
58  : Expr(CXXNewExprClass, ty, VK_RValue, OK_Ordinary,
59         ty->isDependentType(), ty->isDependentType(),
60         ty->isInstantiationDependentType(),
61         ty->containsUnexpandedParameterPack()),
62    GlobalNew(globalNew), Initializer(initializer),
63    UsualArrayDeleteWantsSize(usualArrayDeleteWantsSize),
64    SubExprs(0), OperatorNew(operatorNew),
65    OperatorDelete(operatorDelete), Constructor(constructor),
66    AllocatedTypeInfo(AllocatedTypeInfo), TypeIdParens(TypeIdParens),
67    StartLoc(startLoc), EndLoc(endLoc), ConstructorLParen(constructorLParen),
68    ConstructorRParen(constructorRParen) {
69  AllocateArgsArray(C, arraySize != 0, numPlaceArgs, numConsArgs);
70  unsigned i = 0;
71  if (Array) {
72    if (arraySize->isInstantiationDependent())
73      ExprBits.InstantiationDependent = true;
74
75    if (arraySize->containsUnexpandedParameterPack())
76      ExprBits.ContainsUnexpandedParameterPack = true;
77
78    SubExprs[i++] = arraySize;
79  }
80
81  for (unsigned j = 0; j < NumPlacementArgs; ++j) {
82    if (placementArgs[j]->isInstantiationDependent())
83      ExprBits.InstantiationDependent = true;
84    if (placementArgs[j]->containsUnexpandedParameterPack())
85      ExprBits.ContainsUnexpandedParameterPack = true;
86
87    SubExprs[i++] = placementArgs[j];
88  }
89
90  for (unsigned j = 0; j < NumConstructorArgs; ++j) {
91    if (constructorArgs[j]->isInstantiationDependent())
92      ExprBits.InstantiationDependent = true;
93    if (constructorArgs[j]->containsUnexpandedParameterPack())
94      ExprBits.ContainsUnexpandedParameterPack = true;
95
96    SubExprs[i++] = constructorArgs[j];
97  }
98}
99
100void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
101                                   unsigned numPlaceArgs, unsigned numConsArgs){
102  assert(SubExprs == 0 && "SubExprs already allocated");
103  Array = isArray;
104  NumPlacementArgs = numPlaceArgs;
105  NumConstructorArgs = numConsArgs;
106
107  unsigned TotalSize = Array + NumPlacementArgs + NumConstructorArgs;
108  SubExprs = new (C) Stmt*[TotalSize];
109}
110
111bool CXXNewExpr::shouldNullCheckAllocation(ASTContext &Ctx) const {
112  return getOperatorNew()->getType()->
113    castAs<FunctionProtoType>()->isNothrow(Ctx);
114}
115
116// CXXDeleteExpr
117QualType CXXDeleteExpr::getDestroyedType() const {
118  const Expr *Arg = getArgument();
119  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
120    if (ICE->getCastKind() != CK_UserDefinedConversion &&
121        ICE->getType()->isVoidPointerType())
122      Arg = ICE->getSubExpr();
123    else
124      break;
125  }
126  // The type-to-delete may not be a pointer if it's a dependent type.
127  const QualType ArgType = Arg->getType();
128
129  if (ArgType->isDependentType() && !ArgType->isPointerType())
130    return QualType();
131
132  return ArgType->getAs<PointerType>()->getPointeeType();
133}
134
135// CXXPseudoDestructorExpr
136PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
137 : Type(Info)
138{
139  Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
140}
141
142CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(ASTContext &Context,
143                Expr *Base, bool isArrow, SourceLocation OperatorLoc,
144                NestedNameSpecifierLoc QualifierLoc, TypeSourceInfo *ScopeType,
145                SourceLocation ColonColonLoc, SourceLocation TildeLoc,
146                PseudoDestructorTypeStorage DestroyedType)
147  : Expr(CXXPseudoDestructorExprClass,
148         Context.getPointerType(Context.getFunctionType(Context.VoidTy, 0, 0,
149                                         FunctionProtoType::ExtProtoInfo())),
150         VK_RValue, OK_Ordinary,
151         /*isTypeDependent=*/(Base->isTypeDependent() ||
152           (DestroyedType.getTypeSourceInfo() &&
153            DestroyedType.getTypeSourceInfo()->getType()->isDependentType())),
154         /*isValueDependent=*/Base->isValueDependent(),
155         (Base->isInstantiationDependent() ||
156          (QualifierLoc &&
157           QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent()) ||
158          (ScopeType &&
159           ScopeType->getType()->isInstantiationDependentType()) ||
160          (DestroyedType.getTypeSourceInfo() &&
161           DestroyedType.getTypeSourceInfo()->getType()
162                                             ->isInstantiationDependentType())),
163         // ContainsUnexpandedParameterPack
164         (Base->containsUnexpandedParameterPack() ||
165          (QualifierLoc &&
166           QualifierLoc.getNestedNameSpecifier()
167                                        ->containsUnexpandedParameterPack()) ||
168          (ScopeType &&
169           ScopeType->getType()->containsUnexpandedParameterPack()) ||
170          (DestroyedType.getTypeSourceInfo() &&
171           DestroyedType.getTypeSourceInfo()->getType()
172                                   ->containsUnexpandedParameterPack()))),
173    Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
174    OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
175    ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),
176    DestroyedType(DestroyedType) { }
177
178QualType CXXPseudoDestructorExpr::getDestroyedType() const {
179  if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
180    return TInfo->getType();
181
182  return QualType();
183}
184
185SourceRange CXXPseudoDestructorExpr::getSourceRange() const {
186  SourceLocation End = DestroyedType.getLocation();
187  if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
188    End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
189  return SourceRange(Base->getLocStart(), End);
190}
191
192
193// UnresolvedLookupExpr
194UnresolvedLookupExpr *
195UnresolvedLookupExpr::Create(ASTContext &C,
196                             CXXRecordDecl *NamingClass,
197                             NestedNameSpecifierLoc QualifierLoc,
198                             const DeclarationNameInfo &NameInfo,
199                             bool ADL,
200                             const TemplateArgumentListInfo &Args,
201                             UnresolvedSetIterator Begin,
202                             UnresolvedSetIterator End)
203{
204  void *Mem = C.Allocate(sizeof(UnresolvedLookupExpr) +
205                         ExplicitTemplateArgumentList::sizeFor(Args));
206  return new (Mem) UnresolvedLookupExpr(C, NamingClass, QualifierLoc, NameInfo,
207                                        ADL, /*Overload*/ true, &Args,
208                                        Begin, End, /*StdIsAssociated=*/false);
209}
210
211UnresolvedLookupExpr *
212UnresolvedLookupExpr::CreateEmpty(ASTContext &C, bool HasExplicitTemplateArgs,
213                                  unsigned NumTemplateArgs) {
214  std::size_t size = sizeof(UnresolvedLookupExpr);
215  if (HasExplicitTemplateArgs)
216    size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
217
218  void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedLookupExpr>());
219  UnresolvedLookupExpr *E = new (Mem) UnresolvedLookupExpr(EmptyShell());
220  E->HasExplicitTemplateArgs = HasExplicitTemplateArgs;
221  return E;
222}
223
224OverloadExpr::OverloadExpr(StmtClass K, ASTContext &C,
225                           NestedNameSpecifierLoc QualifierLoc,
226                           const DeclarationNameInfo &NameInfo,
227                           const TemplateArgumentListInfo *TemplateArgs,
228                           UnresolvedSetIterator Begin,
229                           UnresolvedSetIterator End,
230                           bool KnownDependent,
231                           bool KnownInstantiationDependent,
232                           bool KnownContainsUnexpandedParameterPack)
233  : Expr(K, C.OverloadTy, VK_LValue, OK_Ordinary, KnownDependent,
234         KnownDependent,
235         (KnownInstantiationDependent ||
236          NameInfo.isInstantiationDependent() ||
237          (QualifierLoc &&
238           QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
239         (KnownContainsUnexpandedParameterPack ||
240          NameInfo.containsUnexpandedParameterPack() ||
241          (QualifierLoc &&
242           QualifierLoc.getNestedNameSpecifier()
243                                      ->containsUnexpandedParameterPack()))),
244    Results(0), NumResults(End - Begin), NameInfo(NameInfo),
245    QualifierLoc(QualifierLoc), HasExplicitTemplateArgs(TemplateArgs != 0)
246{
247  NumResults = End - Begin;
248  if (NumResults) {
249    // Determine whether this expression is type-dependent.
250    for (UnresolvedSetImpl::const_iterator I = Begin; I != End; ++I) {
251      if ((*I)->getDeclContext()->isDependentContext() ||
252          isa<UnresolvedUsingValueDecl>(*I)) {
253        ExprBits.TypeDependent = true;
254        ExprBits.ValueDependent = true;
255      }
256    }
257
258    Results = static_cast<DeclAccessPair *>(
259                                C.Allocate(sizeof(DeclAccessPair) * NumResults,
260                                           llvm::alignOf<DeclAccessPair>()));
261    memcpy(Results, &*Begin.getIterator(),
262           NumResults * sizeof(DeclAccessPair));
263  }
264
265  // If we have explicit template arguments, check for dependent
266  // template arguments and whether they contain any unexpanded pack
267  // expansions.
268  if (TemplateArgs) {
269    bool Dependent = false;
270    bool InstantiationDependent = false;
271    bool ContainsUnexpandedParameterPack = false;
272    getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
273                                             InstantiationDependent,
274                                             ContainsUnexpandedParameterPack);
275
276    if (Dependent) {
277      ExprBits.TypeDependent = true;
278      ExprBits.ValueDependent = true;
279    }
280    if (InstantiationDependent)
281      ExprBits.InstantiationDependent = true;
282    if (ContainsUnexpandedParameterPack)
283      ExprBits.ContainsUnexpandedParameterPack = true;
284  }
285
286  if (isTypeDependent())
287    setType(C.DependentTy);
288}
289
290void OverloadExpr::initializeResults(ASTContext &C,
291                                     UnresolvedSetIterator Begin,
292                                     UnresolvedSetIterator End) {
293  assert(Results == 0 && "Results already initialized!");
294  NumResults = End - Begin;
295  if (NumResults) {
296     Results = static_cast<DeclAccessPair *>(
297                               C.Allocate(sizeof(DeclAccessPair) * NumResults,
298
299                                          llvm::alignOf<DeclAccessPair>()));
300     memcpy(Results, &*Begin.getIterator(),
301            NumResults * sizeof(DeclAccessPair));
302  }
303}
304
305CXXRecordDecl *OverloadExpr::getNamingClass() const {
306  if (isa<UnresolvedLookupExpr>(this))
307    return cast<UnresolvedLookupExpr>(this)->getNamingClass();
308  else
309    return cast<UnresolvedMemberExpr>(this)->getNamingClass();
310}
311
312// DependentScopeDeclRefExpr
313DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
314                            NestedNameSpecifierLoc QualifierLoc,
315                            const DeclarationNameInfo &NameInfo,
316                            const TemplateArgumentListInfo *Args)
317  : Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary,
318         true, true,
319         (NameInfo.isInstantiationDependent() ||
320          (QualifierLoc &&
321           QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
322         (NameInfo.containsUnexpandedParameterPack() ||
323          (QualifierLoc &&
324           QualifierLoc.getNestedNameSpecifier()
325                            ->containsUnexpandedParameterPack()))),
326    QualifierLoc(QualifierLoc), NameInfo(NameInfo),
327    HasExplicitTemplateArgs(Args != 0)
328{
329  if (Args) {
330    bool Dependent = true;
331    bool InstantiationDependent = true;
332    bool ContainsUnexpandedParameterPack
333      = ExprBits.ContainsUnexpandedParameterPack;
334
335    reinterpret_cast<ExplicitTemplateArgumentList*>(this+1)
336      ->initializeFrom(*Args, Dependent, InstantiationDependent,
337                       ContainsUnexpandedParameterPack);
338
339    ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
340  }
341}
342
343DependentScopeDeclRefExpr *
344DependentScopeDeclRefExpr::Create(ASTContext &C,
345                                  NestedNameSpecifierLoc QualifierLoc,
346                                  const DeclarationNameInfo &NameInfo,
347                                  const TemplateArgumentListInfo *Args) {
348  std::size_t size = sizeof(DependentScopeDeclRefExpr);
349  if (Args)
350    size += ExplicitTemplateArgumentList::sizeFor(*Args);
351  void *Mem = C.Allocate(size);
352  return new (Mem) DependentScopeDeclRefExpr(C.DependentTy, QualifierLoc,
353                                             NameInfo, Args);
354}
355
356DependentScopeDeclRefExpr *
357DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
358                                       bool HasExplicitTemplateArgs,
359                                       unsigned NumTemplateArgs) {
360  std::size_t size = sizeof(DependentScopeDeclRefExpr);
361  if (HasExplicitTemplateArgs)
362    size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
363  void *Mem = C.Allocate(size);
364  DependentScopeDeclRefExpr *E
365    = new (Mem) DependentScopeDeclRefExpr(QualType(), NestedNameSpecifierLoc(),
366                                          DeclarationNameInfo(), 0);
367  E->HasExplicitTemplateArgs = HasExplicitTemplateArgs;
368  return E;
369}
370
371SourceRange CXXConstructExpr::getSourceRange() const {
372  if (isa<CXXTemporaryObjectExpr>(this))
373    return cast<CXXTemporaryObjectExpr>(this)->getSourceRange();
374
375  if (ParenRange.isValid())
376    return SourceRange(Loc, ParenRange.getEnd());
377
378  SourceLocation End = Loc;
379  for (unsigned I = getNumArgs(); I > 0; --I) {
380    const Expr *Arg = getArg(I-1);
381    if (!Arg->isDefaultArgument()) {
382      SourceLocation NewEnd = Arg->getLocEnd();
383      if (NewEnd.isValid()) {
384        End = NewEnd;
385        break;
386      }
387    }
388  }
389
390  return SourceRange(Loc, End);
391}
392
393SourceRange CXXOperatorCallExpr::getSourceRange() const {
394  OverloadedOperatorKind Kind = getOperator();
395  if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
396    if (getNumArgs() == 1)
397      // Prefix operator
398      return SourceRange(getOperatorLoc(),
399                         getArg(0)->getSourceRange().getEnd());
400    else
401      // Postfix operator
402      return SourceRange(getArg(0)->getSourceRange().getBegin(),
403                         getOperatorLoc());
404  } else if (Kind == OO_Arrow) {
405    return getArg(0)->getSourceRange();
406  } else if (Kind == OO_Call) {
407    return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
408  } else if (Kind == OO_Subscript) {
409    return SourceRange(getArg(0)->getSourceRange().getBegin(), getRParenLoc());
410  } else if (getNumArgs() == 1) {
411    return SourceRange(getOperatorLoc(), getArg(0)->getSourceRange().getEnd());
412  } else if (getNumArgs() == 2) {
413    return SourceRange(getArg(0)->getSourceRange().getBegin(),
414                       getArg(1)->getSourceRange().getEnd());
415  } else {
416    return SourceRange();
417  }
418}
419
420Expr *CXXMemberCallExpr::getImplicitObjectArgument() const {
421  if (const MemberExpr *MemExpr =
422        dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
423    return MemExpr->getBase();
424
425  // FIXME: Will eventually need to cope with member pointers.
426  return 0;
427}
428
429CXXMethodDecl *CXXMemberCallExpr::getMethodDecl() const {
430  if (const MemberExpr *MemExpr =
431      dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
432    return cast<CXXMethodDecl>(MemExpr->getMemberDecl());
433
434  // FIXME: Will eventually need to cope with member pointers.
435  return 0;
436}
437
438
439CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() {
440  Expr* ThisArg = getImplicitObjectArgument();
441  if (!ThisArg)
442    return 0;
443
444  if (ThisArg->getType()->isAnyPointerType())
445    return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
446
447  return ThisArg->getType()->getAsCXXRecordDecl();
448}
449
450
451//===----------------------------------------------------------------------===//
452//  Named casts
453//===----------------------------------------------------------------------===//
454
455/// getCastName - Get the name of the C++ cast being used, e.g.,
456/// "static_cast", "dynamic_cast", "reinterpret_cast", or
457/// "const_cast". The returned pointer must not be freed.
458const char *CXXNamedCastExpr::getCastName() const {
459  switch (getStmtClass()) {
460  case CXXStaticCastExprClass:      return "static_cast";
461  case CXXDynamicCastExprClass:     return "dynamic_cast";
462  case CXXReinterpretCastExprClass: return "reinterpret_cast";
463  case CXXConstCastExprClass:       return "const_cast";
464  default:                          return "<invalid cast>";
465  }
466}
467
468CXXStaticCastExpr *CXXStaticCastExpr::Create(ASTContext &C, QualType T,
469                                             ExprValueKind VK,
470                                             CastKind K, Expr *Op,
471                                             const CXXCastPath *BasePath,
472                                             TypeSourceInfo *WrittenTy,
473                                             SourceLocation L,
474                                             SourceLocation RParenLoc) {
475  unsigned PathSize = (BasePath ? BasePath->size() : 0);
476  void *Buffer = C.Allocate(sizeof(CXXStaticCastExpr)
477                            + PathSize * sizeof(CXXBaseSpecifier*));
478  CXXStaticCastExpr *E =
479    new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
480                                   RParenLoc);
481  if (PathSize) E->setCastPath(*BasePath);
482  return E;
483}
484
485CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(ASTContext &C,
486                                                  unsigned PathSize) {
487  void *Buffer =
488    C.Allocate(sizeof(CXXStaticCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
489  return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
490}
491
492CXXDynamicCastExpr *CXXDynamicCastExpr::Create(ASTContext &C, QualType T,
493                                               ExprValueKind VK,
494                                               CastKind K, Expr *Op,
495                                               const CXXCastPath *BasePath,
496                                               TypeSourceInfo *WrittenTy,
497                                               SourceLocation L,
498                                               SourceLocation RParenLoc) {
499  unsigned PathSize = (BasePath ? BasePath->size() : 0);
500  void *Buffer = C.Allocate(sizeof(CXXDynamicCastExpr)
501                            + PathSize * sizeof(CXXBaseSpecifier*));
502  CXXDynamicCastExpr *E =
503    new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
504                                    RParenLoc);
505  if (PathSize) E->setCastPath(*BasePath);
506  return E;
507}
508
509CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(ASTContext &C,
510                                                    unsigned PathSize) {
511  void *Buffer =
512    C.Allocate(sizeof(CXXDynamicCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
513  return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
514}
515
516/// isAlwaysNull - Return whether the result of the dynamic_cast is proven
517/// to always be null. For example:
518///
519/// struct A { };
520/// struct B final : A { };
521/// struct C { };
522///
523/// C *f(B* b) { return dynamic_cast<C*>(b); }
524bool CXXDynamicCastExpr::isAlwaysNull() const
525{
526  QualType SrcType = getSubExpr()->getType();
527  QualType DestType = getType();
528
529  if (const PointerType *SrcPTy = SrcType->getAs<PointerType>()) {
530    SrcType = SrcPTy->getPointeeType();
531    DestType = DestType->castAs<PointerType>()->getPointeeType();
532  }
533
534  const CXXRecordDecl *SrcRD =
535    cast<CXXRecordDecl>(SrcType->castAs<RecordType>()->getDecl());
536
537  if (!SrcRD->hasAttr<FinalAttr>())
538    return false;
539
540  const CXXRecordDecl *DestRD =
541    cast<CXXRecordDecl>(DestType->castAs<RecordType>()->getDecl());
542
543  return !DestRD->isDerivedFrom(SrcRD);
544}
545
546CXXReinterpretCastExpr *
547CXXReinterpretCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
548                               CastKind K, Expr *Op,
549                               const CXXCastPath *BasePath,
550                               TypeSourceInfo *WrittenTy, SourceLocation L,
551                               SourceLocation RParenLoc) {
552  unsigned PathSize = (BasePath ? BasePath->size() : 0);
553  void *Buffer =
554    C.Allocate(sizeof(CXXReinterpretCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
555  CXXReinterpretCastExpr *E =
556    new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
557                                        RParenLoc);
558  if (PathSize) E->setCastPath(*BasePath);
559  return E;
560}
561
562CXXReinterpretCastExpr *
563CXXReinterpretCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
564  void *Buffer = C.Allocate(sizeof(CXXReinterpretCastExpr)
565                            + PathSize * sizeof(CXXBaseSpecifier*));
566  return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
567}
568
569CXXConstCastExpr *CXXConstCastExpr::Create(ASTContext &C, QualType T,
570                                           ExprValueKind VK, Expr *Op,
571                                           TypeSourceInfo *WrittenTy,
572                                           SourceLocation L,
573                                           SourceLocation RParenLoc) {
574  return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc);
575}
576
577CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(ASTContext &C) {
578  return new (C) CXXConstCastExpr(EmptyShell());
579}
580
581CXXFunctionalCastExpr *
582CXXFunctionalCastExpr::Create(ASTContext &C, QualType T, ExprValueKind VK,
583                              TypeSourceInfo *Written, SourceLocation L,
584                              CastKind K, Expr *Op, const CXXCastPath *BasePath,
585                               SourceLocation R) {
586  unsigned PathSize = (BasePath ? BasePath->size() : 0);
587  void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
588                            + PathSize * sizeof(CXXBaseSpecifier*));
589  CXXFunctionalCastExpr *E =
590    new (Buffer) CXXFunctionalCastExpr(T, VK, Written, L, K, Op, PathSize, R);
591  if (PathSize) E->setCastPath(*BasePath);
592  return E;
593}
594
595CXXFunctionalCastExpr *
596CXXFunctionalCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
597  void *Buffer = C.Allocate(sizeof(CXXFunctionalCastExpr)
598                            + PathSize * sizeof(CXXBaseSpecifier*));
599  return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
600}
601
602
603CXXDefaultArgExpr *
604CXXDefaultArgExpr::Create(ASTContext &C, SourceLocation Loc,
605                          ParmVarDecl *Param, Expr *SubExpr) {
606  void *Mem = C.Allocate(sizeof(CXXDefaultArgExpr) + sizeof(Stmt *));
607  return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
608                                     SubExpr);
609}
610
611CXXTemporary *CXXTemporary::Create(ASTContext &C,
612                                   const CXXDestructorDecl *Destructor) {
613  return new (C) CXXTemporary(Destructor);
614}
615
616CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
617                                                   CXXTemporary *Temp,
618                                                   Expr* SubExpr) {
619  assert(SubExpr->getType()->isRecordType() &&
620         "Expression bound to a temporary must have record type!");
621
622  return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
623}
624
625CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C,
626                                               CXXConstructorDecl *Cons,
627                                               TypeSourceInfo *Type,
628                                               Expr **Args,
629                                               unsigned NumArgs,
630                                               SourceRange parenRange,
631                                               bool ZeroInitialization)
632  : CXXConstructExpr(C, CXXTemporaryObjectExprClass,
633                     Type->getType().getNonReferenceType(),
634                     Type->getTypeLoc().getBeginLoc(),
635                     Cons, false, Args, NumArgs, ZeroInitialization,
636                     CXXConstructExpr::CK_Complete, parenRange),
637    Type(Type) {
638}
639
640SourceRange CXXTemporaryObjectExpr::getSourceRange() const {
641  return SourceRange(Type->getTypeLoc().getBeginLoc(),
642                     getParenRange().getEnd());
643}
644
645CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, QualType T,
646                                           SourceLocation Loc,
647                                           CXXConstructorDecl *D, bool Elidable,
648                                           Expr **Args, unsigned NumArgs,
649                                           bool ZeroInitialization,
650                                           ConstructionKind ConstructKind,
651                                           SourceRange ParenRange) {
652  return new (C) CXXConstructExpr(C, CXXConstructExprClass, T, Loc, D,
653                                  Elidable, Args, NumArgs, ZeroInitialization,
654                                  ConstructKind, ParenRange);
655}
656
657CXXConstructExpr::CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,
658                                   SourceLocation Loc,
659                                   CXXConstructorDecl *D, bool elidable,
660                                   Expr **args, unsigned numargs,
661                                   bool ZeroInitialization,
662                                   ConstructionKind ConstructKind,
663                                   SourceRange ParenRange)
664  : Expr(SC, T, VK_RValue, OK_Ordinary,
665         T->isDependentType(), T->isDependentType(),
666         T->isInstantiationDependentType(),
667         T->containsUnexpandedParameterPack()),
668    Constructor(D), Loc(Loc), ParenRange(ParenRange), Elidable(elidable),
669    ZeroInitialization(ZeroInitialization), ConstructKind(ConstructKind),
670    Args(0), NumArgs(numargs)
671{
672  if (NumArgs) {
673    Args = new (C) Stmt*[NumArgs];
674
675    for (unsigned i = 0; i != NumArgs; ++i) {
676      assert(args[i] && "NULL argument in CXXConstructExpr");
677
678      if (args[i]->isValueDependent())
679        ExprBits.ValueDependent = true;
680      if (args[i]->isInstantiationDependent())
681        ExprBits.InstantiationDependent = true;
682      if (args[i]->containsUnexpandedParameterPack())
683        ExprBits.ContainsUnexpandedParameterPack = true;
684
685      Args[i] = args[i];
686    }
687  }
688}
689
690ExprWithCleanups::ExprWithCleanups(ASTContext &C,
691                                   Expr *subexpr,
692                                   CXXTemporary **temps,
693                                   unsigned numtemps)
694  : Expr(ExprWithCleanupsClass, subexpr->getType(),
695         subexpr->getValueKind(), subexpr->getObjectKind(),
696         subexpr->isTypeDependent(), subexpr->isValueDependent(),
697         subexpr->isInstantiationDependent(),
698         subexpr->containsUnexpandedParameterPack()),
699    SubExpr(subexpr), Temps(0), NumTemps(0) {
700  if (numtemps) {
701    setNumTemporaries(C, numtemps);
702    for (unsigned i = 0; i != numtemps; ++i)
703      Temps[i] = temps[i];
704  }
705}
706
707void ExprWithCleanups::setNumTemporaries(ASTContext &C, unsigned N) {
708  assert(Temps == 0 && "Cannot resize with this");
709  NumTemps = N;
710  Temps = new (C) CXXTemporary*[NumTemps];
711}
712
713
714ExprWithCleanups *ExprWithCleanups::Create(ASTContext &C,
715                                           Expr *SubExpr,
716                                           CXXTemporary **Temps,
717                                           unsigned NumTemps) {
718  return new (C) ExprWithCleanups(C, SubExpr, Temps, NumTemps);
719}
720
721CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
722                                                 SourceLocation LParenLoc,
723                                                 Expr **Args,
724                                                 unsigned NumArgs,
725                                                 SourceLocation RParenLoc)
726  : Expr(CXXUnresolvedConstructExprClass,
727         Type->getType().getNonReferenceType(),
728         (Type->getType()->isLValueReferenceType() ? VK_LValue
729          :Type->getType()->isRValueReferenceType()? VK_XValue
730          :VK_RValue),
731         OK_Ordinary,
732         Type->getType()->isDependentType(), true, true,
733         Type->getType()->containsUnexpandedParameterPack()),
734    Type(Type),
735    LParenLoc(LParenLoc),
736    RParenLoc(RParenLoc),
737    NumArgs(NumArgs) {
738  Stmt **StoredArgs = reinterpret_cast<Stmt **>(this + 1);
739  for (unsigned I = 0; I != NumArgs; ++I) {
740    if (Args[I]->containsUnexpandedParameterPack())
741      ExprBits.ContainsUnexpandedParameterPack = true;
742
743    StoredArgs[I] = Args[I];
744  }
745}
746
747CXXUnresolvedConstructExpr *
748CXXUnresolvedConstructExpr::Create(ASTContext &C,
749                                   TypeSourceInfo *Type,
750                                   SourceLocation LParenLoc,
751                                   Expr **Args,
752                                   unsigned NumArgs,
753                                   SourceLocation RParenLoc) {
754  void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
755                         sizeof(Expr *) * NumArgs);
756  return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc,
757                                              Args, NumArgs, RParenLoc);
758}
759
760CXXUnresolvedConstructExpr *
761CXXUnresolvedConstructExpr::CreateEmpty(ASTContext &C, unsigned NumArgs) {
762  Stmt::EmptyShell Empty;
763  void *Mem = C.Allocate(sizeof(CXXUnresolvedConstructExpr) +
764                         sizeof(Expr *) * NumArgs);
765  return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
766}
767
768SourceRange CXXUnresolvedConstructExpr::getSourceRange() const {
769  return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
770}
771
772CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
773                                                 Expr *Base, QualType BaseType,
774                                                 bool IsArrow,
775                                                 SourceLocation OperatorLoc,
776                                           NestedNameSpecifierLoc QualifierLoc,
777                                          NamedDecl *FirstQualifierFoundInScope,
778                                          DeclarationNameInfo MemberNameInfo,
779                                   const TemplateArgumentListInfo *TemplateArgs)
780  : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
781         VK_LValue, OK_Ordinary, true, true, true,
782         ((Base && Base->containsUnexpandedParameterPack()) ||
783          (QualifierLoc &&
784           QualifierLoc.getNestedNameSpecifier()
785                                       ->containsUnexpandedParameterPack()) ||
786          MemberNameInfo.containsUnexpandedParameterPack())),
787    Base(Base), BaseType(BaseType), IsArrow(IsArrow),
788    HasExplicitTemplateArgs(TemplateArgs != 0),
789    OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
790    FirstQualifierFoundInScope(FirstQualifierFoundInScope),
791    MemberNameInfo(MemberNameInfo) {
792  if (TemplateArgs) {
793    bool Dependent = true;
794    bool InstantiationDependent = true;
795    bool ContainsUnexpandedParameterPack = false;
796    getExplicitTemplateArgs().initializeFrom(*TemplateArgs, Dependent,
797                                             InstantiationDependent,
798                                             ContainsUnexpandedParameterPack);
799    if (ContainsUnexpandedParameterPack)
800      ExprBits.ContainsUnexpandedParameterPack = true;
801  }
802}
803
804CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
805                          Expr *Base, QualType BaseType,
806                          bool IsArrow,
807                          SourceLocation OperatorLoc,
808                          NestedNameSpecifierLoc QualifierLoc,
809                          NamedDecl *FirstQualifierFoundInScope,
810                          DeclarationNameInfo MemberNameInfo)
811  : Expr(CXXDependentScopeMemberExprClass, C.DependentTy,
812         VK_LValue, OK_Ordinary, true, true, true,
813         ((Base && Base->containsUnexpandedParameterPack()) ||
814          (QualifierLoc &&
815           QualifierLoc.getNestedNameSpecifier()->
816                                         containsUnexpandedParameterPack()) ||
817          MemberNameInfo.containsUnexpandedParameterPack())),
818    Base(Base), BaseType(BaseType), IsArrow(IsArrow),
819    HasExplicitTemplateArgs(false), OperatorLoc(OperatorLoc),
820    QualifierLoc(QualifierLoc),
821    FirstQualifierFoundInScope(FirstQualifierFoundInScope),
822    MemberNameInfo(MemberNameInfo) { }
823
824CXXDependentScopeMemberExpr *
825CXXDependentScopeMemberExpr::Create(ASTContext &C,
826                                Expr *Base, QualType BaseType, bool IsArrow,
827                                SourceLocation OperatorLoc,
828                                NestedNameSpecifierLoc QualifierLoc,
829                                NamedDecl *FirstQualifierFoundInScope,
830                                DeclarationNameInfo MemberNameInfo,
831                                const TemplateArgumentListInfo *TemplateArgs) {
832  if (!TemplateArgs)
833    return new (C) CXXDependentScopeMemberExpr(C, Base, BaseType,
834                                               IsArrow, OperatorLoc,
835                                               QualifierLoc,
836                                               FirstQualifierFoundInScope,
837                                               MemberNameInfo);
838
839  std::size_t size = sizeof(CXXDependentScopeMemberExpr);
840  if (TemplateArgs)
841    size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
842
843  void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
844  return new (Mem) CXXDependentScopeMemberExpr(C, Base, BaseType,
845                                               IsArrow, OperatorLoc,
846                                               QualifierLoc,
847                                               FirstQualifierFoundInScope,
848                                               MemberNameInfo, TemplateArgs);
849}
850
851CXXDependentScopeMemberExpr *
852CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C,
853                                         bool HasExplicitTemplateArgs,
854                                         unsigned NumTemplateArgs) {
855  if (!HasExplicitTemplateArgs)
856    return new (C) CXXDependentScopeMemberExpr(C, 0, QualType(),
857                                               0, SourceLocation(),
858                                               NestedNameSpecifierLoc(), 0,
859                                               DeclarationNameInfo());
860
861  std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
862                     ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
863  void *Mem = C.Allocate(size, llvm::alignOf<CXXDependentScopeMemberExpr>());
864  CXXDependentScopeMemberExpr *E
865    =  new (Mem) CXXDependentScopeMemberExpr(C, 0, QualType(),
866                                             0, SourceLocation(),
867                                             NestedNameSpecifierLoc(), 0,
868                                             DeclarationNameInfo(), 0);
869  E->HasExplicitTemplateArgs = true;
870  return E;
871}
872
873bool CXXDependentScopeMemberExpr::isImplicitAccess() const {
874  if (Base == 0)
875    return true;
876
877  return cast<Expr>(Base)->isImplicitCXXThis();
878}
879
880static bool hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin,
881                                            UnresolvedSetIterator end) {
882  do {
883    NamedDecl *decl = *begin;
884    if (isa<UnresolvedUsingValueDecl>(decl))
885      return false;
886    if (isa<UsingShadowDecl>(decl))
887      decl = cast<UsingShadowDecl>(decl)->getUnderlyingDecl();
888
889    // Unresolved member expressions should only contain methods and
890    // method templates.
891    assert(isa<CXXMethodDecl>(decl) || isa<FunctionTemplateDecl>(decl));
892
893    if (isa<FunctionTemplateDecl>(decl))
894      decl = cast<FunctionTemplateDecl>(decl)->getTemplatedDecl();
895    if (cast<CXXMethodDecl>(decl)->isStatic())
896      return false;
897  } while (++begin != end);
898
899  return true;
900}
901
902UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C,
903                                           bool HasUnresolvedUsing,
904                                           Expr *Base, QualType BaseType,
905                                           bool IsArrow,
906                                           SourceLocation OperatorLoc,
907                                           NestedNameSpecifierLoc QualifierLoc,
908                                   const DeclarationNameInfo &MemberNameInfo,
909                                   const TemplateArgumentListInfo *TemplateArgs,
910                                           UnresolvedSetIterator Begin,
911                                           UnresolvedSetIterator End)
912  : OverloadExpr(UnresolvedMemberExprClass, C, QualifierLoc, MemberNameInfo,
913                 TemplateArgs, Begin, End,
914                 // Dependent
915                 ((Base && Base->isTypeDependent()) ||
916                  BaseType->isDependentType()),
917                 ((Base && Base->isInstantiationDependent()) ||
918                   BaseType->isInstantiationDependentType()),
919                 // Contains unexpanded parameter pack
920                 ((Base && Base->containsUnexpandedParameterPack()) ||
921                  BaseType->containsUnexpandedParameterPack())),
922    IsArrow(IsArrow), HasUnresolvedUsing(HasUnresolvedUsing),
923    Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
924
925  // Check whether all of the members are non-static member functions,
926  // and if so, mark give this bound-member type instead of overload type.
927  if (hasOnlyNonStaticMemberFunctions(Begin, End))
928    setType(C.BoundMemberTy);
929}
930
931bool UnresolvedMemberExpr::isImplicitAccess() const {
932  if (Base == 0)
933    return true;
934
935  return cast<Expr>(Base)->isImplicitCXXThis();
936}
937
938UnresolvedMemberExpr *
939UnresolvedMemberExpr::Create(ASTContext &C,
940                             bool HasUnresolvedUsing,
941                             Expr *Base, QualType BaseType, bool IsArrow,
942                             SourceLocation OperatorLoc,
943                             NestedNameSpecifierLoc QualifierLoc,
944                             const DeclarationNameInfo &MemberNameInfo,
945                             const TemplateArgumentListInfo *TemplateArgs,
946                             UnresolvedSetIterator Begin,
947                             UnresolvedSetIterator End) {
948  std::size_t size = sizeof(UnresolvedMemberExpr);
949  if (TemplateArgs)
950    size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
951
952  void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
953  return new (Mem) UnresolvedMemberExpr(C,
954                             HasUnresolvedUsing, Base, BaseType,
955                             IsArrow, OperatorLoc, QualifierLoc,
956                             MemberNameInfo, TemplateArgs, Begin, End);
957}
958
959UnresolvedMemberExpr *
960UnresolvedMemberExpr::CreateEmpty(ASTContext &C, bool HasExplicitTemplateArgs,
961                                  unsigned NumTemplateArgs) {
962  std::size_t size = sizeof(UnresolvedMemberExpr);
963  if (HasExplicitTemplateArgs)
964    size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
965
966  void *Mem = C.Allocate(size, llvm::alignOf<UnresolvedMemberExpr>());
967  UnresolvedMemberExpr *E = new (Mem) UnresolvedMemberExpr(EmptyShell());
968  E->HasExplicitTemplateArgs = HasExplicitTemplateArgs;
969  return E;
970}
971
972CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() const {
973  // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
974
975  // If there was a nested name specifier, it names the naming class.
976  // It can't be dependent: after all, we were actually able to do the
977  // lookup.
978  CXXRecordDecl *Record = 0;
979  if (getQualifier()) {
980    const Type *T = getQualifier()->getAsType();
981    assert(T && "qualifier in member expression does not name type");
982    Record = T->getAsCXXRecordDecl();
983    assert(Record && "qualifier in member expression does not name record");
984  }
985  // Otherwise the naming class must have been the base class.
986  else {
987    QualType BaseType = getBaseType().getNonReferenceType();
988    if (isArrow()) {
989      const PointerType *PT = BaseType->getAs<PointerType>();
990      assert(PT && "base of arrow member access is not pointer");
991      BaseType = PT->getPointeeType();
992    }
993
994    Record = BaseType->getAsCXXRecordDecl();
995    assert(Record && "base of member expression does not name record");
996  }
997
998  return Record;
999}
1000
1001SubstNonTypeTemplateParmPackExpr::
1002SubstNonTypeTemplateParmPackExpr(QualType T,
1003                                 NonTypeTemplateParmDecl *Param,
1004                                 SourceLocation NameLoc,
1005                                 const TemplateArgument &ArgPack)
1006  : Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary,
1007         true, true, true, true),
1008    Param(Param), Arguments(ArgPack.pack_begin()),
1009    NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { }
1010
1011TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const {
1012  return TemplateArgument(Arguments, NumArguments);
1013}
1014
1015
1016