1 //===- ExprCXX.cpp - (C++) Expression AST Node Implementation -------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the subclesses of Expr class declared in ExprCXX.h
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "clang/AST/ExprCXX.h"
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/Attr.h"
16 #include "clang/AST/ComputeDependence.h"
17 #include "clang/AST/Decl.h"
18 #include "clang/AST/DeclAccessPair.h"
19 #include "clang/AST/DeclBase.h"
20 #include "clang/AST/DeclCXX.h"
21 #include "clang/AST/DeclTemplate.h"
22 #include "clang/AST/DeclarationName.h"
23 #include "clang/AST/DependenceFlags.h"
24 #include "clang/AST/Expr.h"
25 #include "clang/AST/LambdaCapture.h"
26 #include "clang/AST/NestedNameSpecifier.h"
27 #include "clang/AST/TemplateBase.h"
28 #include "clang/AST/Type.h"
29 #include "clang/AST/TypeLoc.h"
30 #include "clang/Basic/LLVM.h"
31 #include "clang/Basic/OperatorKinds.h"
32 #include "clang/Basic/SourceLocation.h"
33 #include "clang/Basic/Specifiers.h"
34 #include "llvm/ADT/ArrayRef.h"
35 #include "llvm/Support/Casting.h"
36 #include "llvm/Support/ErrorHandling.h"
37 #include <cassert>
38 #include <cstddef>
39 #include <cstring>
40 #include <memory>
41
42 using namespace clang;
43
44 //===----------------------------------------------------------------------===//
45 // Child Iterators for iterating over subexpressions/substatements
46 //===----------------------------------------------------------------------===//
47
isInfixBinaryOp() const48 bool CXXOperatorCallExpr::isInfixBinaryOp() const {
49 // An infix binary operator is any operator with two arguments other than
50 // operator() and operator[]. Note that none of these operators can have
51 // default arguments, so it suffices to check the number of argument
52 // expressions.
53 if (getNumArgs() != 2)
54 return false;
55
56 switch (getOperator()) {
57 case OO_Call: case OO_Subscript:
58 return false;
59 default:
60 return true;
61 }
62 }
63
64 CXXRewrittenBinaryOperator::DecomposedForm
getDecomposedForm() const65 CXXRewrittenBinaryOperator::getDecomposedForm() const {
66 DecomposedForm Result = {};
67 const Expr *E = getSemanticForm()->IgnoreImplicit();
68
69 // Remove an outer '!' if it exists (only happens for a '!=' rewrite).
70 bool SkippedNot = false;
71 if (auto *NotEq = dyn_cast<UnaryOperator>(E)) {
72 assert(NotEq->getOpcode() == UO_LNot);
73 E = NotEq->getSubExpr()->IgnoreImplicit();
74 SkippedNot = true;
75 }
76
77 // Decompose the outer binary operator.
78 if (auto *BO = dyn_cast<BinaryOperator>(E)) {
79 assert(!SkippedNot || BO->getOpcode() == BO_EQ);
80 Result.Opcode = SkippedNot ? BO_NE : BO->getOpcode();
81 Result.LHS = BO->getLHS();
82 Result.RHS = BO->getRHS();
83 Result.InnerBinOp = BO;
84 } else if (auto *BO = dyn_cast<CXXOperatorCallExpr>(E)) {
85 assert(!SkippedNot || BO->getOperator() == OO_EqualEqual);
86 assert(BO->isInfixBinaryOp());
87 switch (BO->getOperator()) {
88 case OO_Less: Result.Opcode = BO_LT; break;
89 case OO_LessEqual: Result.Opcode = BO_LE; break;
90 case OO_Greater: Result.Opcode = BO_GT; break;
91 case OO_GreaterEqual: Result.Opcode = BO_GE; break;
92 case OO_Spaceship: Result.Opcode = BO_Cmp; break;
93 case OO_EqualEqual: Result.Opcode = SkippedNot ? BO_NE : BO_EQ; break;
94 default: llvm_unreachable("unexpected binop in rewritten operator expr");
95 }
96 Result.LHS = BO->getArg(0);
97 Result.RHS = BO->getArg(1);
98 Result.InnerBinOp = BO;
99 } else {
100 llvm_unreachable("unexpected rewritten operator form");
101 }
102
103 // Put the operands in the right order for == and !=, and canonicalize the
104 // <=> subexpression onto the LHS for all other forms.
105 if (isReversed())
106 std::swap(Result.LHS, Result.RHS);
107
108 // If this isn't a spaceship rewrite, we're done.
109 if (Result.Opcode == BO_EQ || Result.Opcode == BO_NE)
110 return Result;
111
112 // Otherwise, we expect a <=> to now be on the LHS.
113 E = Result.LHS->IgnoreImplicitAsWritten();
114 if (auto *BO = dyn_cast<BinaryOperator>(E)) {
115 assert(BO->getOpcode() == BO_Cmp);
116 Result.LHS = BO->getLHS();
117 Result.RHS = BO->getRHS();
118 Result.InnerBinOp = BO;
119 } else if (auto *BO = dyn_cast<CXXOperatorCallExpr>(E)) {
120 assert(BO->getOperator() == OO_Spaceship);
121 Result.LHS = BO->getArg(0);
122 Result.RHS = BO->getArg(1);
123 Result.InnerBinOp = BO;
124 } else {
125 llvm_unreachable("unexpected rewritten operator form");
126 }
127
128 // Put the comparison operands in the right order.
129 if (isReversed())
130 std::swap(Result.LHS, Result.RHS);
131 return Result;
132 }
133
isPotentiallyEvaluated() const134 bool CXXTypeidExpr::isPotentiallyEvaluated() const {
135 if (isTypeOperand())
136 return false;
137
138 // C++11 [expr.typeid]p3:
139 // When typeid is applied to an expression other than a glvalue of
140 // polymorphic class type, [...] the expression is an unevaluated operand.
141 const Expr *E = getExprOperand();
142 if (const CXXRecordDecl *RD = E->getType()->getAsCXXRecordDecl())
143 if (RD->isPolymorphic() && E->isGLValue())
144 return true;
145
146 return false;
147 }
148
isMostDerived(ASTContext & Context) const149 bool CXXTypeidExpr::isMostDerived(ASTContext &Context) const {
150 assert(!isTypeOperand() && "Cannot call isMostDerived for typeid(type)");
151 const Expr *E = getExprOperand()->IgnoreParenNoopCasts(Context);
152 if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
153 QualType Ty = DRE->getDecl()->getType();
154 if (!Ty->isPointerType() && !Ty->isReferenceType())
155 return true;
156 }
157
158 return false;
159 }
160
getTypeOperand(ASTContext & Context) const161 QualType CXXTypeidExpr::getTypeOperand(ASTContext &Context) const {
162 assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
163 Qualifiers Quals;
164 return Context.getUnqualifiedArrayType(
165 Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType(), Quals);
166 }
167
getTypeOperand(ASTContext & Context) const168 QualType CXXUuidofExpr::getTypeOperand(ASTContext &Context) const {
169 assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
170 Qualifiers Quals;
171 return Context.getUnqualifiedArrayType(
172 Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType(), Quals);
173 }
174
175 // CXXScalarValueInitExpr
getBeginLoc() const176 SourceLocation CXXScalarValueInitExpr::getBeginLoc() const {
177 return TypeInfo ? TypeInfo->getTypeLoc().getBeginLoc() : getRParenLoc();
178 }
179
180 // CXXNewExpr
CXXNewExpr(bool IsGlobalNew,FunctionDecl * OperatorNew,FunctionDecl * OperatorDelete,bool ShouldPassAlignment,bool UsualArrayDeleteWantsSize,ArrayRef<Expr * > PlacementArgs,SourceRange TypeIdParens,Optional<Expr * > ArraySize,InitializationStyle InitializationStyle,Expr * Initializer,QualType Ty,TypeSourceInfo * AllocatedTypeInfo,SourceRange Range,SourceRange DirectInitRange)181 CXXNewExpr::CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew,
182 FunctionDecl *OperatorDelete, bool ShouldPassAlignment,
183 bool UsualArrayDeleteWantsSize,
184 ArrayRef<Expr *> PlacementArgs, SourceRange TypeIdParens,
185 Optional<Expr *> ArraySize,
186 InitializationStyle InitializationStyle,
187 Expr *Initializer, QualType Ty,
188 TypeSourceInfo *AllocatedTypeInfo, SourceRange Range,
189 SourceRange DirectInitRange)
190 : Expr(CXXNewExprClass, Ty, VK_RValue, OK_Ordinary),
191 OperatorNew(OperatorNew), OperatorDelete(OperatorDelete),
192 AllocatedTypeInfo(AllocatedTypeInfo), Range(Range),
193 DirectInitRange(DirectInitRange) {
194
195 assert((Initializer != nullptr || InitializationStyle == NoInit) &&
196 "Only NoInit can have no initializer!");
197
198 CXXNewExprBits.IsGlobalNew = IsGlobalNew;
199 CXXNewExprBits.IsArray = ArraySize.hasValue();
200 CXXNewExprBits.ShouldPassAlignment = ShouldPassAlignment;
201 CXXNewExprBits.UsualArrayDeleteWantsSize = UsualArrayDeleteWantsSize;
202 CXXNewExprBits.StoredInitializationStyle =
203 Initializer ? InitializationStyle + 1 : 0;
204 bool IsParenTypeId = TypeIdParens.isValid();
205 CXXNewExprBits.IsParenTypeId = IsParenTypeId;
206 CXXNewExprBits.NumPlacementArgs = PlacementArgs.size();
207
208 if (ArraySize)
209 getTrailingObjects<Stmt *>()[arraySizeOffset()] = *ArraySize;
210 if (Initializer)
211 getTrailingObjects<Stmt *>()[initExprOffset()] = Initializer;
212 for (unsigned I = 0; I != PlacementArgs.size(); ++I)
213 getTrailingObjects<Stmt *>()[placementNewArgsOffset() + I] =
214 PlacementArgs[I];
215 if (IsParenTypeId)
216 getTrailingObjects<SourceRange>()[0] = TypeIdParens;
217
218 switch (getInitializationStyle()) {
219 case CallInit:
220 this->Range.setEnd(DirectInitRange.getEnd());
221 break;
222 case ListInit:
223 this->Range.setEnd(getInitializer()->getSourceRange().getEnd());
224 break;
225 default:
226 if (IsParenTypeId)
227 this->Range.setEnd(TypeIdParens.getEnd());
228 break;
229 }
230
231 setDependence(computeDependence(this));
232 }
233
CXXNewExpr(EmptyShell Empty,bool IsArray,unsigned NumPlacementArgs,bool IsParenTypeId)234 CXXNewExpr::CXXNewExpr(EmptyShell Empty, bool IsArray,
235 unsigned NumPlacementArgs, bool IsParenTypeId)
236 : Expr(CXXNewExprClass, Empty) {
237 CXXNewExprBits.IsArray = IsArray;
238 CXXNewExprBits.NumPlacementArgs = NumPlacementArgs;
239 CXXNewExprBits.IsParenTypeId = IsParenTypeId;
240 }
241
242 CXXNewExpr *
Create(const ASTContext & Ctx,bool IsGlobalNew,FunctionDecl * OperatorNew,FunctionDecl * OperatorDelete,bool ShouldPassAlignment,bool UsualArrayDeleteWantsSize,ArrayRef<Expr * > PlacementArgs,SourceRange TypeIdParens,Optional<Expr * > ArraySize,InitializationStyle InitializationStyle,Expr * Initializer,QualType Ty,TypeSourceInfo * AllocatedTypeInfo,SourceRange Range,SourceRange DirectInitRange)243 CXXNewExpr::Create(const ASTContext &Ctx, bool IsGlobalNew,
244 FunctionDecl *OperatorNew, FunctionDecl *OperatorDelete,
245 bool ShouldPassAlignment, bool UsualArrayDeleteWantsSize,
246 ArrayRef<Expr *> PlacementArgs, SourceRange TypeIdParens,
247 Optional<Expr *> ArraySize,
248 InitializationStyle InitializationStyle, Expr *Initializer,
249 QualType Ty, TypeSourceInfo *AllocatedTypeInfo,
250 SourceRange Range, SourceRange DirectInitRange) {
251 bool IsArray = ArraySize.hasValue();
252 bool HasInit = Initializer != nullptr;
253 unsigned NumPlacementArgs = PlacementArgs.size();
254 bool IsParenTypeId = TypeIdParens.isValid();
255 void *Mem =
256 Ctx.Allocate(totalSizeToAlloc<Stmt *, SourceRange>(
257 IsArray + HasInit + NumPlacementArgs, IsParenTypeId),
258 alignof(CXXNewExpr));
259 return new (Mem)
260 CXXNewExpr(IsGlobalNew, OperatorNew, OperatorDelete, ShouldPassAlignment,
261 UsualArrayDeleteWantsSize, PlacementArgs, TypeIdParens,
262 ArraySize, InitializationStyle, Initializer, Ty,
263 AllocatedTypeInfo, Range, DirectInitRange);
264 }
265
CreateEmpty(const ASTContext & Ctx,bool IsArray,bool HasInit,unsigned NumPlacementArgs,bool IsParenTypeId)266 CXXNewExpr *CXXNewExpr::CreateEmpty(const ASTContext &Ctx, bool IsArray,
267 bool HasInit, unsigned NumPlacementArgs,
268 bool IsParenTypeId) {
269 void *Mem =
270 Ctx.Allocate(totalSizeToAlloc<Stmt *, SourceRange>(
271 IsArray + HasInit + NumPlacementArgs, IsParenTypeId),
272 alignof(CXXNewExpr));
273 return new (Mem)
274 CXXNewExpr(EmptyShell(), IsArray, NumPlacementArgs, IsParenTypeId);
275 }
276
shouldNullCheckAllocation() const277 bool CXXNewExpr::shouldNullCheckAllocation() const {
278 return getOperatorNew()
279 ->getType()
280 ->castAs<FunctionProtoType>()
281 ->isNothrow() &&
282 !getOperatorNew()->isReservedGlobalPlacementOperator();
283 }
284
285 // CXXDeleteExpr
getDestroyedType() const286 QualType CXXDeleteExpr::getDestroyedType() const {
287 const Expr *Arg = getArgument();
288
289 // For a destroying operator delete, we may have implicitly converted the
290 // pointer type to the type of the parameter of the 'operator delete'
291 // function.
292 while (const auto *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
293 if (ICE->getCastKind() == CK_DerivedToBase ||
294 ICE->getCastKind() == CK_UncheckedDerivedToBase ||
295 ICE->getCastKind() == CK_NoOp) {
296 assert((ICE->getCastKind() == CK_NoOp ||
297 getOperatorDelete()->isDestroyingOperatorDelete()) &&
298 "only a destroying operator delete can have a converted arg");
299 Arg = ICE->getSubExpr();
300 } else
301 break;
302 }
303
304 // The type-to-delete may not be a pointer if it's a dependent type.
305 const QualType ArgType = Arg->getType();
306
307 if (ArgType->isDependentType() && !ArgType->isPointerType())
308 return QualType();
309
310 return ArgType->castAs<PointerType>()->getPointeeType();
311 }
312
313 // CXXPseudoDestructorExpr
PseudoDestructorTypeStorage(TypeSourceInfo * Info)314 PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
315 : Type(Info) {
316 Location = Info->getTypeLoc().getLocalSourceRange().getBegin();
317 }
318
CXXPseudoDestructorExpr(const ASTContext & Context,Expr * Base,bool isArrow,SourceLocation OperatorLoc,NestedNameSpecifierLoc QualifierLoc,TypeSourceInfo * ScopeType,SourceLocation ColonColonLoc,SourceLocation TildeLoc,PseudoDestructorTypeStorage DestroyedType)319 CXXPseudoDestructorExpr::CXXPseudoDestructorExpr(
320 const ASTContext &Context, Expr *Base, bool isArrow,
321 SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
322 TypeSourceInfo *ScopeType, SourceLocation ColonColonLoc,
323 SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
324 : Expr(CXXPseudoDestructorExprClass, Context.BoundMemberTy, VK_RValue,
325 OK_Ordinary),
326 Base(static_cast<Stmt *>(Base)), IsArrow(isArrow),
327 OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
328 ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),
329 DestroyedType(DestroyedType) {
330 setDependence(computeDependence(this));
331 }
332
getDestroyedType() const333 QualType CXXPseudoDestructorExpr::getDestroyedType() const {
334 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
335 return TInfo->getType();
336
337 return QualType();
338 }
339
getEndLoc() const340 SourceLocation CXXPseudoDestructorExpr::getEndLoc() const {
341 SourceLocation End = DestroyedType.getLocation();
342 if (TypeSourceInfo *TInfo = DestroyedType.getTypeSourceInfo())
343 End = TInfo->getTypeLoc().getLocalSourceRange().getEnd();
344 return End;
345 }
346
347 // UnresolvedLookupExpr
UnresolvedLookupExpr(const ASTContext & Context,CXXRecordDecl * NamingClass,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,bool RequiresADL,bool Overloaded,const TemplateArgumentListInfo * TemplateArgs,UnresolvedSetIterator Begin,UnresolvedSetIterator End)348 UnresolvedLookupExpr::UnresolvedLookupExpr(
349 const ASTContext &Context, CXXRecordDecl *NamingClass,
350 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
351 const DeclarationNameInfo &NameInfo, bool RequiresADL, bool Overloaded,
352 const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin,
353 UnresolvedSetIterator End)
354 : OverloadExpr(UnresolvedLookupExprClass, Context, QualifierLoc,
355 TemplateKWLoc, NameInfo, TemplateArgs, Begin, End, false,
356 false, false),
357 NamingClass(NamingClass) {
358 UnresolvedLookupExprBits.RequiresADL = RequiresADL;
359 UnresolvedLookupExprBits.Overloaded = Overloaded;
360 }
361
UnresolvedLookupExpr(EmptyShell Empty,unsigned NumResults,bool HasTemplateKWAndArgsInfo)362 UnresolvedLookupExpr::UnresolvedLookupExpr(EmptyShell Empty,
363 unsigned NumResults,
364 bool HasTemplateKWAndArgsInfo)
365 : OverloadExpr(UnresolvedLookupExprClass, Empty, NumResults,
366 HasTemplateKWAndArgsInfo) {}
367
Create(const ASTContext & Context,CXXRecordDecl * NamingClass,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,bool RequiresADL,bool Overloaded,UnresolvedSetIterator Begin,UnresolvedSetIterator End)368 UnresolvedLookupExpr *UnresolvedLookupExpr::Create(
369 const ASTContext &Context, CXXRecordDecl *NamingClass,
370 NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo,
371 bool RequiresADL, bool Overloaded, UnresolvedSetIterator Begin,
372 UnresolvedSetIterator End) {
373 unsigned NumResults = End - Begin;
374 unsigned Size = totalSizeToAlloc<DeclAccessPair, ASTTemplateKWAndArgsInfo,
375 TemplateArgumentLoc>(NumResults, 0, 0);
376 void *Mem = Context.Allocate(Size, alignof(UnresolvedLookupExpr));
377 return new (Mem) UnresolvedLookupExpr(Context, NamingClass, QualifierLoc,
378 SourceLocation(), NameInfo, RequiresADL,
379 Overloaded, nullptr, Begin, End);
380 }
381
Create(const ASTContext & Context,CXXRecordDecl * NamingClass,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,bool RequiresADL,const TemplateArgumentListInfo * Args,UnresolvedSetIterator Begin,UnresolvedSetIterator End)382 UnresolvedLookupExpr *UnresolvedLookupExpr::Create(
383 const ASTContext &Context, CXXRecordDecl *NamingClass,
384 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
385 const DeclarationNameInfo &NameInfo, bool RequiresADL,
386 const TemplateArgumentListInfo *Args, UnresolvedSetIterator Begin,
387 UnresolvedSetIterator End) {
388 assert(Args || TemplateKWLoc.isValid());
389 unsigned NumResults = End - Begin;
390 unsigned NumTemplateArgs = Args ? Args->size() : 0;
391 unsigned Size =
392 totalSizeToAlloc<DeclAccessPair, ASTTemplateKWAndArgsInfo,
393 TemplateArgumentLoc>(NumResults, 1, NumTemplateArgs);
394 void *Mem = Context.Allocate(Size, alignof(UnresolvedLookupExpr));
395 return new (Mem) UnresolvedLookupExpr(Context, NamingClass, QualifierLoc,
396 TemplateKWLoc, NameInfo, RequiresADL,
397 /*Overloaded*/ true, Args, Begin, End);
398 }
399
CreateEmpty(const ASTContext & Context,unsigned NumResults,bool HasTemplateKWAndArgsInfo,unsigned NumTemplateArgs)400 UnresolvedLookupExpr *UnresolvedLookupExpr::CreateEmpty(
401 const ASTContext &Context, unsigned NumResults,
402 bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs) {
403 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
404 unsigned Size = totalSizeToAlloc<DeclAccessPair, ASTTemplateKWAndArgsInfo,
405 TemplateArgumentLoc>(
406 NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
407 void *Mem = Context.Allocate(Size, alignof(UnresolvedLookupExpr));
408 return new (Mem)
409 UnresolvedLookupExpr(EmptyShell(), NumResults, HasTemplateKWAndArgsInfo);
410 }
411
OverloadExpr(StmtClass SC,const ASTContext & Context,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,const TemplateArgumentListInfo * TemplateArgs,UnresolvedSetIterator Begin,UnresolvedSetIterator End,bool KnownDependent,bool KnownInstantiationDependent,bool KnownContainsUnexpandedParameterPack)412 OverloadExpr::OverloadExpr(StmtClass SC, const ASTContext &Context,
413 NestedNameSpecifierLoc QualifierLoc,
414 SourceLocation TemplateKWLoc,
415 const DeclarationNameInfo &NameInfo,
416 const TemplateArgumentListInfo *TemplateArgs,
417 UnresolvedSetIterator Begin,
418 UnresolvedSetIterator End, bool KnownDependent,
419 bool KnownInstantiationDependent,
420 bool KnownContainsUnexpandedParameterPack)
421 : Expr(SC, Context.OverloadTy, VK_LValue, OK_Ordinary), NameInfo(NameInfo),
422 QualifierLoc(QualifierLoc) {
423 unsigned NumResults = End - Begin;
424 OverloadExprBits.NumResults = NumResults;
425 OverloadExprBits.HasTemplateKWAndArgsInfo =
426 (TemplateArgs != nullptr ) || TemplateKWLoc.isValid();
427
428 if (NumResults) {
429 // Copy the results to the trailing array past UnresolvedLookupExpr
430 // or UnresolvedMemberExpr.
431 DeclAccessPair *Results = getTrailingResults();
432 memcpy(Results, Begin.I, NumResults * sizeof(DeclAccessPair));
433 }
434
435 if (TemplateArgs) {
436 auto Deps = TemplateArgumentDependence::None;
437 getTrailingASTTemplateKWAndArgsInfo()->initializeFrom(
438 TemplateKWLoc, *TemplateArgs, getTrailingTemplateArgumentLoc(), Deps);
439 } else if (TemplateKWLoc.isValid()) {
440 getTrailingASTTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
441 }
442
443 setDependence(computeDependence(this, KnownDependent,
444 KnownInstantiationDependent,
445 KnownContainsUnexpandedParameterPack));
446 if (isTypeDependent())
447 setType(Context.DependentTy);
448 }
449
OverloadExpr(StmtClass SC,EmptyShell Empty,unsigned NumResults,bool HasTemplateKWAndArgsInfo)450 OverloadExpr::OverloadExpr(StmtClass SC, EmptyShell Empty, unsigned NumResults,
451 bool HasTemplateKWAndArgsInfo)
452 : Expr(SC, Empty) {
453 OverloadExprBits.NumResults = NumResults;
454 OverloadExprBits.HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
455 }
456
457 // DependentScopeDeclRefExpr
DependentScopeDeclRefExpr(QualType Ty,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,const TemplateArgumentListInfo * Args)458 DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(
459 QualType Ty, NestedNameSpecifierLoc QualifierLoc,
460 SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo,
461 const TemplateArgumentListInfo *Args)
462 : Expr(DependentScopeDeclRefExprClass, Ty, VK_LValue, OK_Ordinary),
463 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {
464 DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo =
465 (Args != nullptr) || TemplateKWLoc.isValid();
466 if (Args) {
467 auto Deps = TemplateArgumentDependence::None;
468 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
469 TemplateKWLoc, *Args, getTrailingObjects<TemplateArgumentLoc>(), Deps);
470 } else if (TemplateKWLoc.isValid()) {
471 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
472 TemplateKWLoc);
473 }
474 setDependence(computeDependence(this));
475 }
476
Create(const ASTContext & Context,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & NameInfo,const TemplateArgumentListInfo * Args)477 DependentScopeDeclRefExpr *DependentScopeDeclRefExpr::Create(
478 const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
479 SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo,
480 const TemplateArgumentListInfo *Args) {
481 assert(QualifierLoc && "should be created for dependent qualifiers");
482 bool HasTemplateKWAndArgsInfo = Args || TemplateKWLoc.isValid();
483 std::size_t Size =
484 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
485 HasTemplateKWAndArgsInfo, Args ? Args->size() : 0);
486 void *Mem = Context.Allocate(Size);
487 return new (Mem) DependentScopeDeclRefExpr(Context.DependentTy, QualifierLoc,
488 TemplateKWLoc, NameInfo, Args);
489 }
490
491 DependentScopeDeclRefExpr *
CreateEmpty(const ASTContext & Context,bool HasTemplateKWAndArgsInfo,unsigned NumTemplateArgs)492 DependentScopeDeclRefExpr::CreateEmpty(const ASTContext &Context,
493 bool HasTemplateKWAndArgsInfo,
494 unsigned NumTemplateArgs) {
495 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
496 std::size_t Size =
497 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
498 HasTemplateKWAndArgsInfo, NumTemplateArgs);
499 void *Mem = Context.Allocate(Size);
500 auto *E = new (Mem) DependentScopeDeclRefExpr(
501 QualType(), NestedNameSpecifierLoc(), SourceLocation(),
502 DeclarationNameInfo(), nullptr);
503 E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo =
504 HasTemplateKWAndArgsInfo;
505 return E;
506 }
507
getBeginLoc() const508 SourceLocation CXXConstructExpr::getBeginLoc() const {
509 if (isa<CXXTemporaryObjectExpr>(this))
510 return cast<CXXTemporaryObjectExpr>(this)->getBeginLoc();
511 return getLocation();
512 }
513
getEndLoc() const514 SourceLocation CXXConstructExpr::getEndLoc() const {
515 if (isa<CXXTemporaryObjectExpr>(this))
516 return cast<CXXTemporaryObjectExpr>(this)->getEndLoc();
517
518 if (ParenOrBraceRange.isValid())
519 return ParenOrBraceRange.getEnd();
520
521 SourceLocation End = getLocation();
522 for (unsigned I = getNumArgs(); I > 0; --I) {
523 const Expr *Arg = getArg(I-1);
524 if (!Arg->isDefaultArgument()) {
525 SourceLocation NewEnd = Arg->getEndLoc();
526 if (NewEnd.isValid()) {
527 End = NewEnd;
528 break;
529 }
530 }
531 }
532
533 return End;
534 }
535
CXXOperatorCallExpr(OverloadedOperatorKind OpKind,Expr * Fn,ArrayRef<Expr * > Args,QualType Ty,ExprValueKind VK,SourceLocation OperatorLoc,FPOptionsOverride FPFeatures,ADLCallKind UsesADL)536 CXXOperatorCallExpr::CXXOperatorCallExpr(OverloadedOperatorKind OpKind,
537 Expr *Fn, ArrayRef<Expr *> Args,
538 QualType Ty, ExprValueKind VK,
539 SourceLocation OperatorLoc,
540 FPOptionsOverride FPFeatures,
541 ADLCallKind UsesADL)
542 : CallExpr(CXXOperatorCallExprClass, Fn, /*PreArgs=*/{}, Args, Ty, VK,
543 OperatorLoc, FPFeatures, /*MinNumArgs=*/0, UsesADL) {
544 CXXOperatorCallExprBits.OperatorKind = OpKind;
545 assert(
546 (CXXOperatorCallExprBits.OperatorKind == static_cast<unsigned>(OpKind)) &&
547 "OperatorKind overflow!");
548 Range = getSourceRangeImpl();
549 }
550
CXXOperatorCallExpr(unsigned NumArgs,bool HasFPFeatures,EmptyShell Empty)551 CXXOperatorCallExpr::CXXOperatorCallExpr(unsigned NumArgs, bool HasFPFeatures,
552 EmptyShell Empty)
553 : CallExpr(CXXOperatorCallExprClass, /*NumPreArgs=*/0, NumArgs,
554 HasFPFeatures, Empty) {}
555
556 CXXOperatorCallExpr *
Create(const ASTContext & Ctx,OverloadedOperatorKind OpKind,Expr * Fn,ArrayRef<Expr * > Args,QualType Ty,ExprValueKind VK,SourceLocation OperatorLoc,FPOptionsOverride FPFeatures,ADLCallKind UsesADL)557 CXXOperatorCallExpr::Create(const ASTContext &Ctx,
558 OverloadedOperatorKind OpKind, Expr *Fn,
559 ArrayRef<Expr *> Args, QualType Ty,
560 ExprValueKind VK, SourceLocation OperatorLoc,
561 FPOptionsOverride FPFeatures, ADLCallKind UsesADL) {
562 // Allocate storage for the trailing objects of CallExpr.
563 unsigned NumArgs = Args.size();
564 unsigned SizeOfTrailingObjects = CallExpr::sizeOfTrailingObjects(
565 /*NumPreArgs=*/0, NumArgs, FPFeatures.requiresTrailingStorage());
566 void *Mem = Ctx.Allocate(sizeof(CXXOperatorCallExpr) + SizeOfTrailingObjects,
567 alignof(CXXOperatorCallExpr));
568 return new (Mem) CXXOperatorCallExpr(OpKind, Fn, Args, Ty, VK, OperatorLoc,
569 FPFeatures, UsesADL);
570 }
571
CreateEmpty(const ASTContext & Ctx,unsigned NumArgs,bool HasFPFeatures,EmptyShell Empty)572 CXXOperatorCallExpr *CXXOperatorCallExpr::CreateEmpty(const ASTContext &Ctx,
573 unsigned NumArgs,
574 bool HasFPFeatures,
575 EmptyShell Empty) {
576 // Allocate storage for the trailing objects of CallExpr.
577 unsigned SizeOfTrailingObjects =
578 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs, HasFPFeatures);
579 void *Mem = Ctx.Allocate(sizeof(CXXOperatorCallExpr) + SizeOfTrailingObjects,
580 alignof(CXXOperatorCallExpr));
581 return new (Mem) CXXOperatorCallExpr(NumArgs, HasFPFeatures, Empty);
582 }
583
getSourceRangeImpl() const584 SourceRange CXXOperatorCallExpr::getSourceRangeImpl() const {
585 OverloadedOperatorKind Kind = getOperator();
586 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
587 if (getNumArgs() == 1)
588 // Prefix operator
589 return SourceRange(getOperatorLoc(), getArg(0)->getEndLoc());
590 else
591 // Postfix operator
592 return SourceRange(getArg(0)->getBeginLoc(), getOperatorLoc());
593 } else if (Kind == OO_Arrow) {
594 return SourceRange(getArg(0)->getBeginLoc(), getOperatorLoc());
595 } else if (Kind == OO_Call) {
596 return SourceRange(getArg(0)->getBeginLoc(), getRParenLoc());
597 } else if (Kind == OO_Subscript) {
598 return SourceRange(getArg(0)->getBeginLoc(), getRParenLoc());
599 } else if (getNumArgs() == 1) {
600 return SourceRange(getOperatorLoc(), getArg(0)->getEndLoc());
601 } else if (getNumArgs() == 2) {
602 return SourceRange(getArg(0)->getBeginLoc(), getArg(1)->getEndLoc());
603 } else {
604 return getOperatorLoc();
605 }
606 }
607
CXXMemberCallExpr(Expr * Fn,ArrayRef<Expr * > Args,QualType Ty,ExprValueKind VK,SourceLocation RP,FPOptionsOverride FPOptions,unsigned MinNumArgs)608 CXXMemberCallExpr::CXXMemberCallExpr(Expr *Fn, ArrayRef<Expr *> Args,
609 QualType Ty, ExprValueKind VK,
610 SourceLocation RP,
611 FPOptionsOverride FPOptions,
612 unsigned MinNumArgs)
613 : CallExpr(CXXMemberCallExprClass, Fn, /*PreArgs=*/{}, Args, Ty, VK, RP,
614 FPOptions, MinNumArgs, NotADL) {}
615
CXXMemberCallExpr(unsigned NumArgs,bool HasFPFeatures,EmptyShell Empty)616 CXXMemberCallExpr::CXXMemberCallExpr(unsigned NumArgs, bool HasFPFeatures,
617 EmptyShell Empty)
618 : CallExpr(CXXMemberCallExprClass, /*NumPreArgs=*/0, NumArgs, HasFPFeatures,
619 Empty) {}
620
Create(const ASTContext & Ctx,Expr * Fn,ArrayRef<Expr * > Args,QualType Ty,ExprValueKind VK,SourceLocation RP,FPOptionsOverride FPFeatures,unsigned MinNumArgs)621 CXXMemberCallExpr *CXXMemberCallExpr::Create(const ASTContext &Ctx, Expr *Fn,
622 ArrayRef<Expr *> Args, QualType Ty,
623 ExprValueKind VK,
624 SourceLocation RP,
625 FPOptionsOverride FPFeatures,
626 unsigned MinNumArgs) {
627 // Allocate storage for the trailing objects of CallExpr.
628 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
629 unsigned SizeOfTrailingObjects = CallExpr::sizeOfTrailingObjects(
630 /*NumPreArgs=*/0, NumArgs, FPFeatures.requiresTrailingStorage());
631 void *Mem = Ctx.Allocate(sizeof(CXXMemberCallExpr) + SizeOfTrailingObjects,
632 alignof(CXXMemberCallExpr));
633 return new (Mem)
634 CXXMemberCallExpr(Fn, Args, Ty, VK, RP, FPFeatures, MinNumArgs);
635 }
636
CreateEmpty(const ASTContext & Ctx,unsigned NumArgs,bool HasFPFeatures,EmptyShell Empty)637 CXXMemberCallExpr *CXXMemberCallExpr::CreateEmpty(const ASTContext &Ctx,
638 unsigned NumArgs,
639 bool HasFPFeatures,
640 EmptyShell Empty) {
641 // Allocate storage for the trailing objects of CallExpr.
642 unsigned SizeOfTrailingObjects =
643 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs, HasFPFeatures);
644 void *Mem = Ctx.Allocate(sizeof(CXXMemberCallExpr) + SizeOfTrailingObjects,
645 alignof(CXXMemberCallExpr));
646 return new (Mem) CXXMemberCallExpr(NumArgs, HasFPFeatures, Empty);
647 }
648
getImplicitObjectArgument() const649 Expr *CXXMemberCallExpr::getImplicitObjectArgument() const {
650 const Expr *Callee = getCallee()->IgnoreParens();
651 if (const auto *MemExpr = dyn_cast<MemberExpr>(Callee))
652 return MemExpr->getBase();
653 if (const auto *BO = dyn_cast<BinaryOperator>(Callee))
654 if (BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI)
655 return BO->getLHS();
656
657 // FIXME: Will eventually need to cope with member pointers.
658 return nullptr;
659 }
660
getObjectType() const661 QualType CXXMemberCallExpr::getObjectType() const {
662 QualType Ty = getImplicitObjectArgument()->getType();
663 if (Ty->isPointerType())
664 Ty = Ty->getPointeeType();
665 return Ty;
666 }
667
getMethodDecl() const668 CXXMethodDecl *CXXMemberCallExpr::getMethodDecl() const {
669 if (const auto *MemExpr = dyn_cast<MemberExpr>(getCallee()->IgnoreParens()))
670 return cast<CXXMethodDecl>(MemExpr->getMemberDecl());
671
672 // FIXME: Will eventually need to cope with member pointers.
673 return nullptr;
674 }
675
getRecordDecl() const676 CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() const {
677 Expr* ThisArg = getImplicitObjectArgument();
678 if (!ThisArg)
679 return nullptr;
680
681 if (ThisArg->getType()->isAnyPointerType())
682 return ThisArg->getType()->getPointeeType()->getAsCXXRecordDecl();
683
684 return ThisArg->getType()->getAsCXXRecordDecl();
685 }
686
687 //===----------------------------------------------------------------------===//
688 // Named casts
689 //===----------------------------------------------------------------------===//
690
691 /// getCastName - Get the name of the C++ cast being used, e.g.,
692 /// "static_cast", "dynamic_cast", "reinterpret_cast", or
693 /// "const_cast". The returned pointer must not be freed.
getCastName() const694 const char *CXXNamedCastExpr::getCastName() const {
695 switch (getStmtClass()) {
696 case CXXStaticCastExprClass: return "static_cast";
697 case CXXDynamicCastExprClass: return "dynamic_cast";
698 case CXXReinterpretCastExprClass: return "reinterpret_cast";
699 case CXXConstCastExprClass: return "const_cast";
700 case CXXAddrspaceCastExprClass: return "addrspace_cast";
701 default: return "<invalid cast>";
702 }
703 }
704
705 CXXStaticCastExpr *
Create(const ASTContext & C,QualType T,ExprValueKind VK,CastKind K,Expr * Op,const CXXCastPath * BasePath,TypeSourceInfo * WrittenTy,FPOptionsOverride FPO,SourceLocation L,SourceLocation RParenLoc,SourceRange AngleBrackets)706 CXXStaticCastExpr::Create(const ASTContext &C, QualType T, ExprValueKind VK,
707 CastKind K, Expr *Op, const CXXCastPath *BasePath,
708 TypeSourceInfo *WrittenTy, FPOptionsOverride FPO,
709 SourceLocation L, SourceLocation RParenLoc,
710 SourceRange AngleBrackets) {
711 unsigned PathSize = (BasePath ? BasePath->size() : 0);
712 void *Buffer =
713 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
714 PathSize, FPO.requiresTrailingStorage()));
715 auto *E = new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy,
716 FPO, L, RParenLoc, AngleBrackets);
717 if (PathSize)
718 std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
719 E->getTrailingObjects<CXXBaseSpecifier *>());
720 return E;
721 }
722
CreateEmpty(const ASTContext & C,unsigned PathSize,bool HasFPFeatures)723 CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(const ASTContext &C,
724 unsigned PathSize,
725 bool HasFPFeatures) {
726 void *Buffer =
727 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
728 PathSize, HasFPFeatures));
729 return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize, HasFPFeatures);
730 }
731
Create(const ASTContext & C,QualType T,ExprValueKind VK,CastKind K,Expr * Op,const CXXCastPath * BasePath,TypeSourceInfo * WrittenTy,SourceLocation L,SourceLocation RParenLoc,SourceRange AngleBrackets)732 CXXDynamicCastExpr *CXXDynamicCastExpr::Create(const ASTContext &C, QualType T,
733 ExprValueKind VK,
734 CastKind K, Expr *Op,
735 const CXXCastPath *BasePath,
736 TypeSourceInfo *WrittenTy,
737 SourceLocation L,
738 SourceLocation RParenLoc,
739 SourceRange AngleBrackets) {
740 unsigned PathSize = (BasePath ? BasePath->size() : 0);
741 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
742 auto *E =
743 new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
744 RParenLoc, AngleBrackets);
745 if (PathSize)
746 std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
747 E->getTrailingObjects<CXXBaseSpecifier *>());
748 return E;
749 }
750
CreateEmpty(const ASTContext & C,unsigned PathSize)751 CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(const ASTContext &C,
752 unsigned PathSize) {
753 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
754 return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
755 }
756
757 /// isAlwaysNull - Return whether the result of the dynamic_cast is proven
758 /// to always be null. For example:
759 ///
760 /// struct A { };
761 /// struct B final : A { };
762 /// struct C { };
763 ///
764 /// C *f(B* b) { return dynamic_cast<C*>(b); }
isAlwaysNull() const765 bool CXXDynamicCastExpr::isAlwaysNull() const
766 {
767 QualType SrcType = getSubExpr()->getType();
768 QualType DestType = getType();
769
770 if (const auto *SrcPTy = SrcType->getAs<PointerType>()) {
771 SrcType = SrcPTy->getPointeeType();
772 DestType = DestType->castAs<PointerType>()->getPointeeType();
773 }
774
775 if (DestType->isVoidType())
776 return false;
777
778 const auto *SrcRD =
779 cast<CXXRecordDecl>(SrcType->castAs<RecordType>()->getDecl());
780
781 if (!SrcRD->hasAttr<FinalAttr>())
782 return false;
783
784 const auto *DestRD =
785 cast<CXXRecordDecl>(DestType->castAs<RecordType>()->getDecl());
786
787 return !DestRD->isDerivedFrom(SrcRD);
788 }
789
790 CXXReinterpretCastExpr *
Create(const ASTContext & C,QualType T,ExprValueKind VK,CastKind K,Expr * Op,const CXXCastPath * BasePath,TypeSourceInfo * WrittenTy,SourceLocation L,SourceLocation RParenLoc,SourceRange AngleBrackets)791 CXXReinterpretCastExpr::Create(const ASTContext &C, QualType T,
792 ExprValueKind VK, CastKind K, Expr *Op,
793 const CXXCastPath *BasePath,
794 TypeSourceInfo *WrittenTy, SourceLocation L,
795 SourceLocation RParenLoc,
796 SourceRange AngleBrackets) {
797 unsigned PathSize = (BasePath ? BasePath->size() : 0);
798 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
799 auto *E =
800 new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
801 RParenLoc, AngleBrackets);
802 if (PathSize)
803 std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
804 E->getTrailingObjects<CXXBaseSpecifier *>());
805 return E;
806 }
807
808 CXXReinterpretCastExpr *
CreateEmpty(const ASTContext & C,unsigned PathSize)809 CXXReinterpretCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) {
810 void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
811 return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
812 }
813
Create(const ASTContext & C,QualType T,ExprValueKind VK,Expr * Op,TypeSourceInfo * WrittenTy,SourceLocation L,SourceLocation RParenLoc,SourceRange AngleBrackets)814 CXXConstCastExpr *CXXConstCastExpr::Create(const ASTContext &C, QualType T,
815 ExprValueKind VK, Expr *Op,
816 TypeSourceInfo *WrittenTy,
817 SourceLocation L,
818 SourceLocation RParenLoc,
819 SourceRange AngleBrackets) {
820 return new (C) CXXConstCastExpr(T, VK, Op, WrittenTy, L, RParenLoc, AngleBrackets);
821 }
822
CreateEmpty(const ASTContext & C)823 CXXConstCastExpr *CXXConstCastExpr::CreateEmpty(const ASTContext &C) {
824 return new (C) CXXConstCastExpr(EmptyShell());
825 }
826
827 CXXAddrspaceCastExpr *
Create(const ASTContext & C,QualType T,ExprValueKind VK,CastKind K,Expr * Op,TypeSourceInfo * WrittenTy,SourceLocation L,SourceLocation RParenLoc,SourceRange AngleBrackets)828 CXXAddrspaceCastExpr::Create(const ASTContext &C, QualType T, ExprValueKind VK,
829 CastKind K, Expr *Op, TypeSourceInfo *WrittenTy,
830 SourceLocation L, SourceLocation RParenLoc,
831 SourceRange AngleBrackets) {
832 return new (C) CXXAddrspaceCastExpr(T, VK, K, Op, WrittenTy, L, RParenLoc,
833 AngleBrackets);
834 }
835
CreateEmpty(const ASTContext & C)836 CXXAddrspaceCastExpr *CXXAddrspaceCastExpr::CreateEmpty(const ASTContext &C) {
837 return new (C) CXXAddrspaceCastExpr(EmptyShell());
838 }
839
Create(const ASTContext & C,QualType T,ExprValueKind VK,TypeSourceInfo * Written,CastKind K,Expr * Op,const CXXCastPath * BasePath,FPOptionsOverride FPO,SourceLocation L,SourceLocation R)840 CXXFunctionalCastExpr *CXXFunctionalCastExpr::Create(
841 const ASTContext &C, QualType T, ExprValueKind VK, TypeSourceInfo *Written,
842 CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO,
843 SourceLocation L, SourceLocation R) {
844 unsigned PathSize = (BasePath ? BasePath->size() : 0);
845 void *Buffer =
846 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
847 PathSize, FPO.requiresTrailingStorage()));
848 auto *E = new (Buffer)
849 CXXFunctionalCastExpr(T, VK, Written, K, Op, PathSize, FPO, L, R);
850 if (PathSize)
851 std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
852 E->getTrailingObjects<CXXBaseSpecifier *>());
853 return E;
854 }
855
CreateEmpty(const ASTContext & C,unsigned PathSize,bool HasFPFeatures)856 CXXFunctionalCastExpr *CXXFunctionalCastExpr::CreateEmpty(const ASTContext &C,
857 unsigned PathSize,
858 bool HasFPFeatures) {
859 void *Buffer =
860 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
861 PathSize, HasFPFeatures));
862 return new (Buffer)
863 CXXFunctionalCastExpr(EmptyShell(), PathSize, HasFPFeatures);
864 }
865
getBeginLoc() const866 SourceLocation CXXFunctionalCastExpr::getBeginLoc() const {
867 return getTypeInfoAsWritten()->getTypeLoc().getBeginLoc();
868 }
869
getEndLoc() const870 SourceLocation CXXFunctionalCastExpr::getEndLoc() const {
871 return RParenLoc.isValid() ? RParenLoc : getSubExpr()->getEndLoc();
872 }
873
UserDefinedLiteral(Expr * Fn,ArrayRef<Expr * > Args,QualType Ty,ExprValueKind VK,SourceLocation LitEndLoc,SourceLocation SuffixLoc,FPOptionsOverride FPFeatures)874 UserDefinedLiteral::UserDefinedLiteral(Expr *Fn, ArrayRef<Expr *> Args,
875 QualType Ty, ExprValueKind VK,
876 SourceLocation LitEndLoc,
877 SourceLocation SuffixLoc,
878 FPOptionsOverride FPFeatures)
879 : CallExpr(UserDefinedLiteralClass, Fn, /*PreArgs=*/{}, Args, Ty, VK,
880 LitEndLoc, FPFeatures, /*MinNumArgs=*/0, NotADL),
881 UDSuffixLoc(SuffixLoc) {}
882
UserDefinedLiteral(unsigned NumArgs,bool HasFPFeatures,EmptyShell Empty)883 UserDefinedLiteral::UserDefinedLiteral(unsigned NumArgs, bool HasFPFeatures,
884 EmptyShell Empty)
885 : CallExpr(UserDefinedLiteralClass, /*NumPreArgs=*/0, NumArgs,
886 HasFPFeatures, Empty) {}
887
Create(const ASTContext & Ctx,Expr * Fn,ArrayRef<Expr * > Args,QualType Ty,ExprValueKind VK,SourceLocation LitEndLoc,SourceLocation SuffixLoc,FPOptionsOverride FPFeatures)888 UserDefinedLiteral *UserDefinedLiteral::Create(const ASTContext &Ctx, Expr *Fn,
889 ArrayRef<Expr *> Args,
890 QualType Ty, ExprValueKind VK,
891 SourceLocation LitEndLoc,
892 SourceLocation SuffixLoc,
893 FPOptionsOverride FPFeatures) {
894 // Allocate storage for the trailing objects of CallExpr.
895 unsigned NumArgs = Args.size();
896 unsigned SizeOfTrailingObjects = CallExpr::sizeOfTrailingObjects(
897 /*NumPreArgs=*/0, NumArgs, FPFeatures.requiresTrailingStorage());
898 void *Mem = Ctx.Allocate(sizeof(UserDefinedLiteral) + SizeOfTrailingObjects,
899 alignof(UserDefinedLiteral));
900 return new (Mem)
901 UserDefinedLiteral(Fn, Args, Ty, VK, LitEndLoc, SuffixLoc, FPFeatures);
902 }
903
CreateEmpty(const ASTContext & Ctx,unsigned NumArgs,bool HasFPOptions,EmptyShell Empty)904 UserDefinedLiteral *UserDefinedLiteral::CreateEmpty(const ASTContext &Ctx,
905 unsigned NumArgs,
906 bool HasFPOptions,
907 EmptyShell Empty) {
908 // Allocate storage for the trailing objects of CallExpr.
909 unsigned SizeOfTrailingObjects =
910 CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs, HasFPOptions);
911 void *Mem = Ctx.Allocate(sizeof(UserDefinedLiteral) + SizeOfTrailingObjects,
912 alignof(UserDefinedLiteral));
913 return new (Mem) UserDefinedLiteral(NumArgs, HasFPOptions, Empty);
914 }
915
916 UserDefinedLiteral::LiteralOperatorKind
getLiteralOperatorKind() const917 UserDefinedLiteral::getLiteralOperatorKind() const {
918 if (getNumArgs() == 0)
919 return LOK_Template;
920 if (getNumArgs() == 2)
921 return LOK_String;
922
923 assert(getNumArgs() == 1 && "unexpected #args in literal operator call");
924 QualType ParamTy =
925 cast<FunctionDecl>(getCalleeDecl())->getParamDecl(0)->getType();
926 if (ParamTy->isPointerType())
927 return LOK_Raw;
928 if (ParamTy->isAnyCharacterType())
929 return LOK_Character;
930 if (ParamTy->isIntegerType())
931 return LOK_Integer;
932 if (ParamTy->isFloatingType())
933 return LOK_Floating;
934
935 llvm_unreachable("unknown kind of literal operator");
936 }
937
getCookedLiteral()938 Expr *UserDefinedLiteral::getCookedLiteral() {
939 #ifndef NDEBUG
940 LiteralOperatorKind LOK = getLiteralOperatorKind();
941 assert(LOK != LOK_Template && LOK != LOK_Raw && "not a cooked literal");
942 #endif
943 return getArg(0);
944 }
945
getUDSuffix() const946 const IdentifierInfo *UserDefinedLiteral::getUDSuffix() const {
947 return cast<FunctionDecl>(getCalleeDecl())->getLiteralIdentifier();
948 }
949
CXXDefaultInitExpr(const ASTContext & Ctx,SourceLocation Loc,FieldDecl * Field,QualType Ty,DeclContext * UsedContext)950 CXXDefaultInitExpr::CXXDefaultInitExpr(const ASTContext &Ctx,
951 SourceLocation Loc, FieldDecl *Field,
952 QualType Ty, DeclContext *UsedContext)
953 : Expr(CXXDefaultInitExprClass, Ty.getNonLValueExprType(Ctx),
954 Ty->isLValueReferenceType()
955 ? VK_LValue
956 : Ty->isRValueReferenceType() ? VK_XValue : VK_RValue,
957 /*FIXME*/ OK_Ordinary),
958 Field(Field), UsedContext(UsedContext) {
959 CXXDefaultInitExprBits.Loc = Loc;
960 assert(Field->hasInClassInitializer());
961
962 setDependence(computeDependence(this));
963 }
964
Create(const ASTContext & C,const CXXDestructorDecl * Destructor)965 CXXTemporary *CXXTemporary::Create(const ASTContext &C,
966 const CXXDestructorDecl *Destructor) {
967 return new (C) CXXTemporary(Destructor);
968 }
969
Create(const ASTContext & C,CXXTemporary * Temp,Expr * SubExpr)970 CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(const ASTContext &C,
971 CXXTemporary *Temp,
972 Expr* SubExpr) {
973 assert((SubExpr->getType()->isRecordType() ||
974 SubExpr->getType()->isArrayType()) &&
975 "Expression bound to a temporary must have record or array type!");
976
977 return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
978 }
979
CXXTemporaryObjectExpr(CXXConstructorDecl * Cons,QualType Ty,TypeSourceInfo * TSI,ArrayRef<Expr * > Args,SourceRange ParenOrBraceRange,bool HadMultipleCandidates,bool ListInitialization,bool StdInitListInitialization,bool ZeroInitialization)980 CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(
981 CXXConstructorDecl *Cons, QualType Ty, TypeSourceInfo *TSI,
982 ArrayRef<Expr *> Args, SourceRange ParenOrBraceRange,
983 bool HadMultipleCandidates, bool ListInitialization,
984 bool StdInitListInitialization, bool ZeroInitialization)
985 : CXXConstructExpr(
986 CXXTemporaryObjectExprClass, Ty, TSI->getTypeLoc().getBeginLoc(),
987 Cons, /* Elidable=*/false, Args, HadMultipleCandidates,
988 ListInitialization, StdInitListInitialization, ZeroInitialization,
989 CXXConstructExpr::CK_Complete, ParenOrBraceRange),
990 TSI(TSI) {}
991
CXXTemporaryObjectExpr(EmptyShell Empty,unsigned NumArgs)992 CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(EmptyShell Empty,
993 unsigned NumArgs)
994 : CXXConstructExpr(CXXTemporaryObjectExprClass, Empty, NumArgs) {}
995
Create(const ASTContext & Ctx,CXXConstructorDecl * Cons,QualType Ty,TypeSourceInfo * TSI,ArrayRef<Expr * > Args,SourceRange ParenOrBraceRange,bool HadMultipleCandidates,bool ListInitialization,bool StdInitListInitialization,bool ZeroInitialization)996 CXXTemporaryObjectExpr *CXXTemporaryObjectExpr::Create(
997 const ASTContext &Ctx, CXXConstructorDecl *Cons, QualType Ty,
998 TypeSourceInfo *TSI, ArrayRef<Expr *> Args, SourceRange ParenOrBraceRange,
999 bool HadMultipleCandidates, bool ListInitialization,
1000 bool StdInitListInitialization, bool ZeroInitialization) {
1001 unsigned SizeOfTrailingObjects = sizeOfTrailingObjects(Args.size());
1002 void *Mem =
1003 Ctx.Allocate(sizeof(CXXTemporaryObjectExpr) + SizeOfTrailingObjects,
1004 alignof(CXXTemporaryObjectExpr));
1005 return new (Mem) CXXTemporaryObjectExpr(
1006 Cons, Ty, TSI, Args, ParenOrBraceRange, HadMultipleCandidates,
1007 ListInitialization, StdInitListInitialization, ZeroInitialization);
1008 }
1009
1010 CXXTemporaryObjectExpr *
CreateEmpty(const ASTContext & Ctx,unsigned NumArgs)1011 CXXTemporaryObjectExpr::CreateEmpty(const ASTContext &Ctx, unsigned NumArgs) {
1012 unsigned SizeOfTrailingObjects = sizeOfTrailingObjects(NumArgs);
1013 void *Mem =
1014 Ctx.Allocate(sizeof(CXXTemporaryObjectExpr) + SizeOfTrailingObjects,
1015 alignof(CXXTemporaryObjectExpr));
1016 return new (Mem) CXXTemporaryObjectExpr(EmptyShell(), NumArgs);
1017 }
1018
getBeginLoc() const1019 SourceLocation CXXTemporaryObjectExpr::getBeginLoc() const {
1020 return getTypeSourceInfo()->getTypeLoc().getBeginLoc();
1021 }
1022
getEndLoc() const1023 SourceLocation CXXTemporaryObjectExpr::getEndLoc() const {
1024 SourceLocation Loc = getParenOrBraceRange().getEnd();
1025 if (Loc.isInvalid() && getNumArgs())
1026 Loc = getArg(getNumArgs() - 1)->getEndLoc();
1027 return Loc;
1028 }
1029
Create(const ASTContext & Ctx,QualType Ty,SourceLocation Loc,CXXConstructorDecl * Ctor,bool Elidable,ArrayRef<Expr * > Args,bool HadMultipleCandidates,bool ListInitialization,bool StdInitListInitialization,bool ZeroInitialization,ConstructionKind ConstructKind,SourceRange ParenOrBraceRange)1030 CXXConstructExpr *CXXConstructExpr::Create(
1031 const ASTContext &Ctx, QualType Ty, SourceLocation Loc,
1032 CXXConstructorDecl *Ctor, bool Elidable, ArrayRef<Expr *> Args,
1033 bool HadMultipleCandidates, bool ListInitialization,
1034 bool StdInitListInitialization, bool ZeroInitialization,
1035 ConstructionKind ConstructKind, SourceRange ParenOrBraceRange) {
1036 unsigned SizeOfTrailingObjects = sizeOfTrailingObjects(Args.size());
1037 void *Mem = Ctx.Allocate(sizeof(CXXConstructExpr) + SizeOfTrailingObjects,
1038 alignof(CXXConstructExpr));
1039 return new (Mem) CXXConstructExpr(
1040 CXXConstructExprClass, Ty, Loc, Ctor, Elidable, Args,
1041 HadMultipleCandidates, ListInitialization, StdInitListInitialization,
1042 ZeroInitialization, ConstructKind, ParenOrBraceRange);
1043 }
1044
CreateEmpty(const ASTContext & Ctx,unsigned NumArgs)1045 CXXConstructExpr *CXXConstructExpr::CreateEmpty(const ASTContext &Ctx,
1046 unsigned NumArgs) {
1047 unsigned SizeOfTrailingObjects = sizeOfTrailingObjects(NumArgs);
1048 void *Mem = Ctx.Allocate(sizeof(CXXConstructExpr) + SizeOfTrailingObjects,
1049 alignof(CXXConstructExpr));
1050 return new (Mem)
1051 CXXConstructExpr(CXXConstructExprClass, EmptyShell(), NumArgs);
1052 }
1053
CXXConstructExpr(StmtClass SC,QualType Ty,SourceLocation Loc,CXXConstructorDecl * Ctor,bool Elidable,ArrayRef<Expr * > Args,bool HadMultipleCandidates,bool ListInitialization,bool StdInitListInitialization,bool ZeroInitialization,ConstructionKind ConstructKind,SourceRange ParenOrBraceRange)1054 CXXConstructExpr::CXXConstructExpr(
1055 StmtClass SC, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor,
1056 bool Elidable, ArrayRef<Expr *> Args, bool HadMultipleCandidates,
1057 bool ListInitialization, bool StdInitListInitialization,
1058 bool ZeroInitialization, ConstructionKind ConstructKind,
1059 SourceRange ParenOrBraceRange)
1060 : Expr(SC, Ty, VK_RValue, OK_Ordinary), Constructor(Ctor),
1061 ParenOrBraceRange(ParenOrBraceRange), NumArgs(Args.size()) {
1062 CXXConstructExprBits.Elidable = Elidable;
1063 CXXConstructExprBits.HadMultipleCandidates = HadMultipleCandidates;
1064 CXXConstructExprBits.ListInitialization = ListInitialization;
1065 CXXConstructExprBits.StdInitListInitialization = StdInitListInitialization;
1066 CXXConstructExprBits.ZeroInitialization = ZeroInitialization;
1067 CXXConstructExprBits.ConstructionKind = ConstructKind;
1068 CXXConstructExprBits.Loc = Loc;
1069
1070 Stmt **TrailingArgs = getTrailingArgs();
1071 for (unsigned I = 0, N = Args.size(); I != N; ++I) {
1072 assert(Args[I] && "NULL argument in CXXConstructExpr!");
1073 TrailingArgs[I] = Args[I];
1074 }
1075
1076 setDependence(computeDependence(this));
1077 }
1078
CXXConstructExpr(StmtClass SC,EmptyShell Empty,unsigned NumArgs)1079 CXXConstructExpr::CXXConstructExpr(StmtClass SC, EmptyShell Empty,
1080 unsigned NumArgs)
1081 : Expr(SC, Empty), NumArgs(NumArgs) {}
1082
LambdaCapture(SourceLocation Loc,bool Implicit,LambdaCaptureKind Kind,VarDecl * Var,SourceLocation EllipsisLoc)1083 LambdaCapture::LambdaCapture(SourceLocation Loc, bool Implicit,
1084 LambdaCaptureKind Kind, VarDecl *Var,
1085 SourceLocation EllipsisLoc)
1086 : DeclAndBits(Var, 0), Loc(Loc), EllipsisLoc(EllipsisLoc) {
1087 unsigned Bits = 0;
1088 if (Implicit)
1089 Bits |= Capture_Implicit;
1090
1091 switch (Kind) {
1092 case LCK_StarThis:
1093 Bits |= Capture_ByCopy;
1094 LLVM_FALLTHROUGH;
1095 case LCK_This:
1096 assert(!Var && "'this' capture cannot have a variable!");
1097 Bits |= Capture_This;
1098 break;
1099
1100 case LCK_ByCopy:
1101 Bits |= Capture_ByCopy;
1102 LLVM_FALLTHROUGH;
1103 case LCK_ByRef:
1104 assert(Var && "capture must have a variable!");
1105 break;
1106 case LCK_VLAType:
1107 assert(!Var && "VLA type capture cannot have a variable!");
1108 break;
1109 }
1110 DeclAndBits.setInt(Bits);
1111 }
1112
getCaptureKind() const1113 LambdaCaptureKind LambdaCapture::getCaptureKind() const {
1114 if (capturesVLAType())
1115 return LCK_VLAType;
1116 bool CapByCopy = DeclAndBits.getInt() & Capture_ByCopy;
1117 if (capturesThis())
1118 return CapByCopy ? LCK_StarThis : LCK_This;
1119 return CapByCopy ? LCK_ByCopy : LCK_ByRef;
1120 }
1121
LambdaExpr(QualType T,SourceRange IntroducerRange,LambdaCaptureDefault CaptureDefault,SourceLocation CaptureDefaultLoc,bool ExplicitParams,bool ExplicitResultType,ArrayRef<Expr * > CaptureInits,SourceLocation ClosingBrace,bool ContainsUnexpandedParameterPack)1122 LambdaExpr::LambdaExpr(QualType T, SourceRange IntroducerRange,
1123 LambdaCaptureDefault CaptureDefault,
1124 SourceLocation CaptureDefaultLoc, bool ExplicitParams,
1125 bool ExplicitResultType, ArrayRef<Expr *> CaptureInits,
1126 SourceLocation ClosingBrace,
1127 bool ContainsUnexpandedParameterPack)
1128 : Expr(LambdaExprClass, T, VK_RValue, OK_Ordinary),
1129 IntroducerRange(IntroducerRange), CaptureDefaultLoc(CaptureDefaultLoc),
1130 ClosingBrace(ClosingBrace) {
1131 LambdaExprBits.NumCaptures = CaptureInits.size();
1132 LambdaExprBits.CaptureDefault = CaptureDefault;
1133 LambdaExprBits.ExplicitParams = ExplicitParams;
1134 LambdaExprBits.ExplicitResultType = ExplicitResultType;
1135
1136 CXXRecordDecl *Class = getLambdaClass();
1137 (void)Class;
1138 assert(capture_size() == Class->capture_size() && "Wrong number of captures");
1139 assert(getCaptureDefault() == Class->getLambdaCaptureDefault());
1140
1141 // Copy initialization expressions for the non-static data members.
1142 Stmt **Stored = getStoredStmts();
1143 for (unsigned I = 0, N = CaptureInits.size(); I != N; ++I)
1144 *Stored++ = CaptureInits[I];
1145
1146 // Copy the body of the lambda.
1147 *Stored++ = getCallOperator()->getBody();
1148
1149 setDependence(computeDependence(this, ContainsUnexpandedParameterPack));
1150 }
1151
LambdaExpr(EmptyShell Empty,unsigned NumCaptures)1152 LambdaExpr::LambdaExpr(EmptyShell Empty, unsigned NumCaptures)
1153 : Expr(LambdaExprClass, Empty) {
1154 LambdaExprBits.NumCaptures = NumCaptures;
1155
1156 // Initially don't initialize the body of the LambdaExpr. The body will
1157 // be lazily deserialized when needed.
1158 getStoredStmts()[NumCaptures] = nullptr; // Not one past the end.
1159 }
1160
Create(const ASTContext & Context,CXXRecordDecl * Class,SourceRange IntroducerRange,LambdaCaptureDefault CaptureDefault,SourceLocation CaptureDefaultLoc,bool ExplicitParams,bool ExplicitResultType,ArrayRef<Expr * > CaptureInits,SourceLocation ClosingBrace,bool ContainsUnexpandedParameterPack)1161 LambdaExpr *LambdaExpr::Create(const ASTContext &Context, CXXRecordDecl *Class,
1162 SourceRange IntroducerRange,
1163 LambdaCaptureDefault CaptureDefault,
1164 SourceLocation CaptureDefaultLoc,
1165 bool ExplicitParams, bool ExplicitResultType,
1166 ArrayRef<Expr *> CaptureInits,
1167 SourceLocation ClosingBrace,
1168 bool ContainsUnexpandedParameterPack) {
1169 // Determine the type of the expression (i.e., the type of the
1170 // function object we're creating).
1171 QualType T = Context.getTypeDeclType(Class);
1172
1173 unsigned Size = totalSizeToAlloc<Stmt *>(CaptureInits.size() + 1);
1174 void *Mem = Context.Allocate(Size);
1175 return new (Mem)
1176 LambdaExpr(T, IntroducerRange, CaptureDefault, CaptureDefaultLoc,
1177 ExplicitParams, ExplicitResultType, CaptureInits, ClosingBrace,
1178 ContainsUnexpandedParameterPack);
1179 }
1180
CreateDeserialized(const ASTContext & C,unsigned NumCaptures)1181 LambdaExpr *LambdaExpr::CreateDeserialized(const ASTContext &C,
1182 unsigned NumCaptures) {
1183 unsigned Size = totalSizeToAlloc<Stmt *>(NumCaptures + 1);
1184 void *Mem = C.Allocate(Size);
1185 return new (Mem) LambdaExpr(EmptyShell(), NumCaptures);
1186 }
1187
initBodyIfNeeded() const1188 void LambdaExpr::initBodyIfNeeded() const {
1189 if (!getStoredStmts()[capture_size()]) {
1190 auto *This = const_cast<LambdaExpr *>(this);
1191 This->getStoredStmts()[capture_size()] = getCallOperator()->getBody();
1192 }
1193 }
1194
getBody() const1195 Stmt *LambdaExpr::getBody() const {
1196 initBodyIfNeeded();
1197 return getStoredStmts()[capture_size()];
1198 }
1199
getCompoundStmtBody() const1200 const CompoundStmt *LambdaExpr::getCompoundStmtBody() const {
1201 Stmt *Body = getBody();
1202 if (const auto *CoroBody = dyn_cast<CoroutineBodyStmt>(Body))
1203 return cast<CompoundStmt>(CoroBody->getBody());
1204 return cast<CompoundStmt>(Body);
1205 }
1206
isInitCapture(const LambdaCapture * C) const1207 bool LambdaExpr::isInitCapture(const LambdaCapture *C) const {
1208 return (C->capturesVariable() && C->getCapturedVar()->isInitCapture() &&
1209 (getCallOperator() == C->getCapturedVar()->getDeclContext()));
1210 }
1211
capture_begin() const1212 LambdaExpr::capture_iterator LambdaExpr::capture_begin() const {
1213 return getLambdaClass()->getLambdaData().Captures;
1214 }
1215
capture_end() const1216 LambdaExpr::capture_iterator LambdaExpr::capture_end() const {
1217 return capture_begin() + capture_size();
1218 }
1219
captures() const1220 LambdaExpr::capture_range LambdaExpr::captures() const {
1221 return capture_range(capture_begin(), capture_end());
1222 }
1223
explicit_capture_begin() const1224 LambdaExpr::capture_iterator LambdaExpr::explicit_capture_begin() const {
1225 return capture_begin();
1226 }
1227
explicit_capture_end() const1228 LambdaExpr::capture_iterator LambdaExpr::explicit_capture_end() const {
1229 struct CXXRecordDecl::LambdaDefinitionData &Data
1230 = getLambdaClass()->getLambdaData();
1231 return Data.Captures + Data.NumExplicitCaptures;
1232 }
1233
explicit_captures() const1234 LambdaExpr::capture_range LambdaExpr::explicit_captures() const {
1235 return capture_range(explicit_capture_begin(), explicit_capture_end());
1236 }
1237
implicit_capture_begin() const1238 LambdaExpr::capture_iterator LambdaExpr::implicit_capture_begin() const {
1239 return explicit_capture_end();
1240 }
1241
implicit_capture_end() const1242 LambdaExpr::capture_iterator LambdaExpr::implicit_capture_end() const {
1243 return capture_end();
1244 }
1245
implicit_captures() const1246 LambdaExpr::capture_range LambdaExpr::implicit_captures() const {
1247 return capture_range(implicit_capture_begin(), implicit_capture_end());
1248 }
1249
getLambdaClass() const1250 CXXRecordDecl *LambdaExpr::getLambdaClass() const {
1251 return getType()->getAsCXXRecordDecl();
1252 }
1253
getCallOperator() const1254 CXXMethodDecl *LambdaExpr::getCallOperator() const {
1255 CXXRecordDecl *Record = getLambdaClass();
1256 return Record->getLambdaCallOperator();
1257 }
1258
getDependentCallOperator() const1259 FunctionTemplateDecl *LambdaExpr::getDependentCallOperator() const {
1260 CXXRecordDecl *Record = getLambdaClass();
1261 return Record->getDependentLambdaCallOperator();
1262 }
1263
getTemplateParameterList() const1264 TemplateParameterList *LambdaExpr::getTemplateParameterList() const {
1265 CXXRecordDecl *Record = getLambdaClass();
1266 return Record->getGenericLambdaTemplateParameterList();
1267 }
1268
getExplicitTemplateParameters() const1269 ArrayRef<NamedDecl *> LambdaExpr::getExplicitTemplateParameters() const {
1270 const CXXRecordDecl *Record = getLambdaClass();
1271 return Record->getLambdaExplicitTemplateParameters();
1272 }
1273
getTrailingRequiresClause() const1274 Expr *LambdaExpr::getTrailingRequiresClause() const {
1275 return getCallOperator()->getTrailingRequiresClause();
1276 }
1277
isMutable() const1278 bool LambdaExpr::isMutable() const { return !getCallOperator()->isConst(); }
1279
children()1280 LambdaExpr::child_range LambdaExpr::children() {
1281 initBodyIfNeeded();
1282 return child_range(getStoredStmts(), getStoredStmts() + capture_size() + 1);
1283 }
1284
children() const1285 LambdaExpr::const_child_range LambdaExpr::children() const {
1286 initBodyIfNeeded();
1287 return const_child_range(getStoredStmts(),
1288 getStoredStmts() + capture_size() + 1);
1289 }
1290
ExprWithCleanups(Expr * subexpr,bool CleanupsHaveSideEffects,ArrayRef<CleanupObject> objects)1291 ExprWithCleanups::ExprWithCleanups(Expr *subexpr,
1292 bool CleanupsHaveSideEffects,
1293 ArrayRef<CleanupObject> objects)
1294 : FullExpr(ExprWithCleanupsClass, subexpr) {
1295 ExprWithCleanupsBits.CleanupsHaveSideEffects = CleanupsHaveSideEffects;
1296 ExprWithCleanupsBits.NumObjects = objects.size();
1297 for (unsigned i = 0, e = objects.size(); i != e; ++i)
1298 getTrailingObjects<CleanupObject>()[i] = objects[i];
1299 }
1300
Create(const ASTContext & C,Expr * subexpr,bool CleanupsHaveSideEffects,ArrayRef<CleanupObject> objects)1301 ExprWithCleanups *ExprWithCleanups::Create(const ASTContext &C, Expr *subexpr,
1302 bool CleanupsHaveSideEffects,
1303 ArrayRef<CleanupObject> objects) {
1304 void *buffer = C.Allocate(totalSizeToAlloc<CleanupObject>(objects.size()),
1305 alignof(ExprWithCleanups));
1306 return new (buffer)
1307 ExprWithCleanups(subexpr, CleanupsHaveSideEffects, objects);
1308 }
1309
ExprWithCleanups(EmptyShell empty,unsigned numObjects)1310 ExprWithCleanups::ExprWithCleanups(EmptyShell empty, unsigned numObjects)
1311 : FullExpr(ExprWithCleanupsClass, empty) {
1312 ExprWithCleanupsBits.NumObjects = numObjects;
1313 }
1314
Create(const ASTContext & C,EmptyShell empty,unsigned numObjects)1315 ExprWithCleanups *ExprWithCleanups::Create(const ASTContext &C,
1316 EmptyShell empty,
1317 unsigned numObjects) {
1318 void *buffer = C.Allocate(totalSizeToAlloc<CleanupObject>(numObjects),
1319 alignof(ExprWithCleanups));
1320 return new (buffer) ExprWithCleanups(empty, numObjects);
1321 }
1322
CXXUnresolvedConstructExpr(QualType T,TypeSourceInfo * TSI,SourceLocation LParenLoc,ArrayRef<Expr * > Args,SourceLocation RParenLoc)1323 CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(QualType T,
1324 TypeSourceInfo *TSI,
1325 SourceLocation LParenLoc,
1326 ArrayRef<Expr *> Args,
1327 SourceLocation RParenLoc)
1328 : Expr(CXXUnresolvedConstructExprClass, T,
1329 (TSI->getType()->isLValueReferenceType()
1330 ? VK_LValue
1331 : TSI->getType()->isRValueReferenceType() ? VK_XValue
1332 : VK_RValue),
1333 OK_Ordinary),
1334 TSI(TSI), LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
1335 CXXUnresolvedConstructExprBits.NumArgs = Args.size();
1336 auto **StoredArgs = getTrailingObjects<Expr *>();
1337 for (unsigned I = 0; I != Args.size(); ++I)
1338 StoredArgs[I] = Args[I];
1339 setDependence(computeDependence(this));
1340 }
1341
Create(const ASTContext & Context,QualType T,TypeSourceInfo * TSI,SourceLocation LParenLoc,ArrayRef<Expr * > Args,SourceLocation RParenLoc)1342 CXXUnresolvedConstructExpr *CXXUnresolvedConstructExpr::Create(
1343 const ASTContext &Context, QualType T, TypeSourceInfo *TSI, SourceLocation LParenLoc,
1344 ArrayRef<Expr *> Args, SourceLocation RParenLoc) {
1345 void *Mem = Context.Allocate(totalSizeToAlloc<Expr *>(Args.size()));
1346 return new (Mem)
1347 CXXUnresolvedConstructExpr(T, TSI, LParenLoc, Args, RParenLoc);
1348 }
1349
1350 CXXUnresolvedConstructExpr *
CreateEmpty(const ASTContext & Context,unsigned NumArgs)1351 CXXUnresolvedConstructExpr::CreateEmpty(const ASTContext &Context,
1352 unsigned NumArgs) {
1353 void *Mem = Context.Allocate(totalSizeToAlloc<Expr *>(NumArgs));
1354 return new (Mem) CXXUnresolvedConstructExpr(EmptyShell(), NumArgs);
1355 }
1356
getBeginLoc() const1357 SourceLocation CXXUnresolvedConstructExpr::getBeginLoc() const {
1358 return TSI->getTypeLoc().getBeginLoc();
1359 }
1360
CXXDependentScopeMemberExpr(const ASTContext & Ctx,Expr * Base,QualType BaseType,bool IsArrow,SourceLocation OperatorLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,NamedDecl * FirstQualifierFoundInScope,DeclarationNameInfo MemberNameInfo,const TemplateArgumentListInfo * TemplateArgs)1361 CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(
1362 const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow,
1363 SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
1364 SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
1365 DeclarationNameInfo MemberNameInfo,
1366 const TemplateArgumentListInfo *TemplateArgs)
1367 : Expr(CXXDependentScopeMemberExprClass, Ctx.DependentTy, VK_LValue,
1368 OK_Ordinary),
1369 Base(Base), BaseType(BaseType), QualifierLoc(QualifierLoc),
1370 MemberNameInfo(MemberNameInfo) {
1371 CXXDependentScopeMemberExprBits.IsArrow = IsArrow;
1372 CXXDependentScopeMemberExprBits.HasTemplateKWAndArgsInfo =
1373 (TemplateArgs != nullptr) || TemplateKWLoc.isValid();
1374 CXXDependentScopeMemberExprBits.HasFirstQualifierFoundInScope =
1375 FirstQualifierFoundInScope != nullptr;
1376 CXXDependentScopeMemberExprBits.OperatorLoc = OperatorLoc;
1377
1378 if (TemplateArgs) {
1379 auto Deps = TemplateArgumentDependence::None;
1380 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1381 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1382 Deps);
1383 } else if (TemplateKWLoc.isValid()) {
1384 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1385 TemplateKWLoc);
1386 }
1387
1388 if (hasFirstQualifierFoundInScope())
1389 *getTrailingObjects<NamedDecl *>() = FirstQualifierFoundInScope;
1390 setDependence(computeDependence(this));
1391 }
1392
CXXDependentScopeMemberExpr(EmptyShell Empty,bool HasTemplateKWAndArgsInfo,bool HasFirstQualifierFoundInScope)1393 CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(
1394 EmptyShell Empty, bool HasTemplateKWAndArgsInfo,
1395 bool HasFirstQualifierFoundInScope)
1396 : Expr(CXXDependentScopeMemberExprClass, Empty) {
1397 CXXDependentScopeMemberExprBits.HasTemplateKWAndArgsInfo =
1398 HasTemplateKWAndArgsInfo;
1399 CXXDependentScopeMemberExprBits.HasFirstQualifierFoundInScope =
1400 HasFirstQualifierFoundInScope;
1401 }
1402
Create(const ASTContext & Ctx,Expr * Base,QualType BaseType,bool IsArrow,SourceLocation OperatorLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,NamedDecl * FirstQualifierFoundInScope,DeclarationNameInfo MemberNameInfo,const TemplateArgumentListInfo * TemplateArgs)1403 CXXDependentScopeMemberExpr *CXXDependentScopeMemberExpr::Create(
1404 const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow,
1405 SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
1406 SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
1407 DeclarationNameInfo MemberNameInfo,
1408 const TemplateArgumentListInfo *TemplateArgs) {
1409 bool HasTemplateKWAndArgsInfo =
1410 (TemplateArgs != nullptr) || TemplateKWLoc.isValid();
1411 unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->size() : 0;
1412 bool HasFirstQualifierFoundInScope = FirstQualifierFoundInScope != nullptr;
1413
1414 unsigned Size = totalSizeToAlloc<ASTTemplateKWAndArgsInfo,
1415 TemplateArgumentLoc, NamedDecl *>(
1416 HasTemplateKWAndArgsInfo, NumTemplateArgs, HasFirstQualifierFoundInScope);
1417
1418 void *Mem = Ctx.Allocate(Size, alignof(CXXDependentScopeMemberExpr));
1419 return new (Mem) CXXDependentScopeMemberExpr(
1420 Ctx, Base, BaseType, IsArrow, OperatorLoc, QualifierLoc, TemplateKWLoc,
1421 FirstQualifierFoundInScope, MemberNameInfo, TemplateArgs);
1422 }
1423
CreateEmpty(const ASTContext & Ctx,bool HasTemplateKWAndArgsInfo,unsigned NumTemplateArgs,bool HasFirstQualifierFoundInScope)1424 CXXDependentScopeMemberExpr *CXXDependentScopeMemberExpr::CreateEmpty(
1425 const ASTContext &Ctx, bool HasTemplateKWAndArgsInfo,
1426 unsigned NumTemplateArgs, bool HasFirstQualifierFoundInScope) {
1427 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
1428
1429 unsigned Size = totalSizeToAlloc<ASTTemplateKWAndArgsInfo,
1430 TemplateArgumentLoc, NamedDecl *>(
1431 HasTemplateKWAndArgsInfo, NumTemplateArgs, HasFirstQualifierFoundInScope);
1432
1433 void *Mem = Ctx.Allocate(Size, alignof(CXXDependentScopeMemberExpr));
1434 return new (Mem) CXXDependentScopeMemberExpr(
1435 EmptyShell(), HasTemplateKWAndArgsInfo, HasFirstQualifierFoundInScope);
1436 }
1437
hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin,UnresolvedSetIterator end)1438 static bool hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin,
1439 UnresolvedSetIterator end) {
1440 do {
1441 NamedDecl *decl = *begin;
1442 if (isa<UnresolvedUsingValueDecl>(decl))
1443 return false;
1444
1445 // Unresolved member expressions should only contain methods and
1446 // method templates.
1447 if (cast<CXXMethodDecl>(decl->getUnderlyingDecl()->getAsFunction())
1448 ->isStatic())
1449 return false;
1450 } while (++begin != end);
1451
1452 return true;
1453 }
1454
UnresolvedMemberExpr(const ASTContext & Context,bool HasUnresolvedUsing,Expr * Base,QualType BaseType,bool IsArrow,SourceLocation OperatorLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & MemberNameInfo,const TemplateArgumentListInfo * TemplateArgs,UnresolvedSetIterator Begin,UnresolvedSetIterator End)1455 UnresolvedMemberExpr::UnresolvedMemberExpr(
1456 const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base,
1457 QualType BaseType, bool IsArrow, SourceLocation OperatorLoc,
1458 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
1459 const DeclarationNameInfo &MemberNameInfo,
1460 const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin,
1461 UnresolvedSetIterator End)
1462 : OverloadExpr(
1463 UnresolvedMemberExprClass, Context, QualifierLoc, TemplateKWLoc,
1464 MemberNameInfo, TemplateArgs, Begin, End,
1465 // Dependent
1466 ((Base && Base->isTypeDependent()) || BaseType->isDependentType()),
1467 ((Base && Base->isInstantiationDependent()) ||
1468 BaseType->isInstantiationDependentType()),
1469 // Contains unexpanded parameter pack
1470 ((Base && Base->containsUnexpandedParameterPack()) ||
1471 BaseType->containsUnexpandedParameterPack())),
1472 Base(Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
1473 UnresolvedMemberExprBits.IsArrow = IsArrow;
1474 UnresolvedMemberExprBits.HasUnresolvedUsing = HasUnresolvedUsing;
1475
1476 // Check whether all of the members are non-static member functions,
1477 // and if so, mark give this bound-member type instead of overload type.
1478 if (hasOnlyNonStaticMemberFunctions(Begin, End))
1479 setType(Context.BoundMemberTy);
1480 }
1481
UnresolvedMemberExpr(EmptyShell Empty,unsigned NumResults,bool HasTemplateKWAndArgsInfo)1482 UnresolvedMemberExpr::UnresolvedMemberExpr(EmptyShell Empty,
1483 unsigned NumResults,
1484 bool HasTemplateKWAndArgsInfo)
1485 : OverloadExpr(UnresolvedMemberExprClass, Empty, NumResults,
1486 HasTemplateKWAndArgsInfo) {}
1487
isImplicitAccess() const1488 bool UnresolvedMemberExpr::isImplicitAccess() const {
1489 if (!Base)
1490 return true;
1491
1492 return cast<Expr>(Base)->isImplicitCXXThis();
1493 }
1494
Create(const ASTContext & Context,bool HasUnresolvedUsing,Expr * Base,QualType BaseType,bool IsArrow,SourceLocation OperatorLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation TemplateKWLoc,const DeclarationNameInfo & MemberNameInfo,const TemplateArgumentListInfo * TemplateArgs,UnresolvedSetIterator Begin,UnresolvedSetIterator End)1495 UnresolvedMemberExpr *UnresolvedMemberExpr::Create(
1496 const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base,
1497 QualType BaseType, bool IsArrow, SourceLocation OperatorLoc,
1498 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
1499 const DeclarationNameInfo &MemberNameInfo,
1500 const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin,
1501 UnresolvedSetIterator End) {
1502 unsigned NumResults = End - Begin;
1503 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid();
1504 unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->size() : 0;
1505 unsigned Size = totalSizeToAlloc<DeclAccessPair, ASTTemplateKWAndArgsInfo,
1506 TemplateArgumentLoc>(
1507 NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
1508 void *Mem = Context.Allocate(Size, alignof(UnresolvedMemberExpr));
1509 return new (Mem) UnresolvedMemberExpr(
1510 Context, HasUnresolvedUsing, Base, BaseType, IsArrow, OperatorLoc,
1511 QualifierLoc, TemplateKWLoc, MemberNameInfo, TemplateArgs, Begin, End);
1512 }
1513
CreateEmpty(const ASTContext & Context,unsigned NumResults,bool HasTemplateKWAndArgsInfo,unsigned NumTemplateArgs)1514 UnresolvedMemberExpr *UnresolvedMemberExpr::CreateEmpty(
1515 const ASTContext &Context, unsigned NumResults,
1516 bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs) {
1517 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
1518 unsigned Size = totalSizeToAlloc<DeclAccessPair, ASTTemplateKWAndArgsInfo,
1519 TemplateArgumentLoc>(
1520 NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
1521 void *Mem = Context.Allocate(Size, alignof(UnresolvedMemberExpr));
1522 return new (Mem)
1523 UnresolvedMemberExpr(EmptyShell(), NumResults, HasTemplateKWAndArgsInfo);
1524 }
1525
getNamingClass()1526 CXXRecordDecl *UnresolvedMemberExpr::getNamingClass() {
1527 // Unlike for UnresolvedLookupExpr, it is very easy to re-derive this.
1528
1529 // If there was a nested name specifier, it names the naming class.
1530 // It can't be dependent: after all, we were actually able to do the
1531 // lookup.
1532 CXXRecordDecl *Record = nullptr;
1533 auto *NNS = getQualifier();
1534 if (NNS && NNS->getKind() != NestedNameSpecifier::Super) {
1535 const Type *T = getQualifier()->getAsType();
1536 assert(T && "qualifier in member expression does not name type");
1537 Record = T->getAsCXXRecordDecl();
1538 assert(Record && "qualifier in member expression does not name record");
1539 }
1540 // Otherwise the naming class must have been the base class.
1541 else {
1542 QualType BaseType = getBaseType().getNonReferenceType();
1543 if (isArrow())
1544 BaseType = BaseType->castAs<PointerType>()->getPointeeType();
1545
1546 Record = BaseType->getAsCXXRecordDecl();
1547 assert(Record && "base of member expression does not name record");
1548 }
1549
1550 return Record;
1551 }
1552
1553 SizeOfPackExpr *
Create(ASTContext & Context,SourceLocation OperatorLoc,NamedDecl * Pack,SourceLocation PackLoc,SourceLocation RParenLoc,Optional<unsigned> Length,ArrayRef<TemplateArgument> PartialArgs)1554 SizeOfPackExpr::Create(ASTContext &Context, SourceLocation OperatorLoc,
1555 NamedDecl *Pack, SourceLocation PackLoc,
1556 SourceLocation RParenLoc,
1557 Optional<unsigned> Length,
1558 ArrayRef<TemplateArgument> PartialArgs) {
1559 void *Storage =
1560 Context.Allocate(totalSizeToAlloc<TemplateArgument>(PartialArgs.size()));
1561 return new (Storage) SizeOfPackExpr(Context.getSizeType(), OperatorLoc, Pack,
1562 PackLoc, RParenLoc, Length, PartialArgs);
1563 }
1564
CreateDeserialized(ASTContext & Context,unsigned NumPartialArgs)1565 SizeOfPackExpr *SizeOfPackExpr::CreateDeserialized(ASTContext &Context,
1566 unsigned NumPartialArgs) {
1567 void *Storage =
1568 Context.Allocate(totalSizeToAlloc<TemplateArgument>(NumPartialArgs));
1569 return new (Storage) SizeOfPackExpr(EmptyShell(), NumPartialArgs);
1570 }
1571
getParameterType(const ASTContext & Context) const1572 QualType SubstNonTypeTemplateParmExpr::getParameterType(
1573 const ASTContext &Context) const {
1574 // Note that, for a class type NTTP, we will have an lvalue of type 'const
1575 // T', so we can't just compute this from the type and value category.
1576 if (isReferenceParameter())
1577 return Context.getLValueReferenceType(getType());
1578 return getType().getUnqualifiedType();
1579 }
1580
SubstNonTypeTemplateParmPackExpr(QualType T,ExprValueKind ValueKind,NonTypeTemplateParmDecl * Param,SourceLocation NameLoc,const TemplateArgument & ArgPack)1581 SubstNonTypeTemplateParmPackExpr::SubstNonTypeTemplateParmPackExpr(
1582 QualType T, ExprValueKind ValueKind, NonTypeTemplateParmDecl *Param,
1583 SourceLocation NameLoc, const TemplateArgument &ArgPack)
1584 : Expr(SubstNonTypeTemplateParmPackExprClass, T, ValueKind, OK_Ordinary),
1585 Param(Param), Arguments(ArgPack.pack_begin()),
1586 NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) {
1587 setDependence(ExprDependence::TypeValueInstantiation |
1588 ExprDependence::UnexpandedPack);
1589 }
1590
getArgumentPack() const1591 TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const {
1592 return TemplateArgument(llvm::makeArrayRef(Arguments, NumArguments));
1593 }
1594
FunctionParmPackExpr(QualType T,VarDecl * ParamPack,SourceLocation NameLoc,unsigned NumParams,VarDecl * const * Params)1595 FunctionParmPackExpr::FunctionParmPackExpr(QualType T, VarDecl *ParamPack,
1596 SourceLocation NameLoc,
1597 unsigned NumParams,
1598 VarDecl *const *Params)
1599 : Expr(FunctionParmPackExprClass, T, VK_LValue, OK_Ordinary),
1600 ParamPack(ParamPack), NameLoc(NameLoc), NumParameters(NumParams) {
1601 if (Params)
1602 std::uninitialized_copy(Params, Params + NumParams,
1603 getTrailingObjects<VarDecl *>());
1604 setDependence(ExprDependence::TypeValueInstantiation |
1605 ExprDependence::UnexpandedPack);
1606 }
1607
1608 FunctionParmPackExpr *
Create(const ASTContext & Context,QualType T,VarDecl * ParamPack,SourceLocation NameLoc,ArrayRef<VarDecl * > Params)1609 FunctionParmPackExpr::Create(const ASTContext &Context, QualType T,
1610 VarDecl *ParamPack, SourceLocation NameLoc,
1611 ArrayRef<VarDecl *> Params) {
1612 return new (Context.Allocate(totalSizeToAlloc<VarDecl *>(Params.size())))
1613 FunctionParmPackExpr(T, ParamPack, NameLoc, Params.size(), Params.data());
1614 }
1615
1616 FunctionParmPackExpr *
CreateEmpty(const ASTContext & Context,unsigned NumParams)1617 FunctionParmPackExpr::CreateEmpty(const ASTContext &Context,
1618 unsigned NumParams) {
1619 return new (Context.Allocate(totalSizeToAlloc<VarDecl *>(NumParams)))
1620 FunctionParmPackExpr(QualType(), nullptr, SourceLocation(), 0, nullptr);
1621 }
1622
MaterializeTemporaryExpr(QualType T,Expr * Temporary,bool BoundToLvalueReference,LifetimeExtendedTemporaryDecl * MTD)1623 MaterializeTemporaryExpr::MaterializeTemporaryExpr(
1624 QualType T, Expr *Temporary, bool BoundToLvalueReference,
1625 LifetimeExtendedTemporaryDecl *MTD)
1626 : Expr(MaterializeTemporaryExprClass, T,
1627 BoundToLvalueReference ? VK_LValue : VK_XValue, OK_Ordinary) {
1628 if (MTD) {
1629 State = MTD;
1630 MTD->ExprWithTemporary = Temporary;
1631 return;
1632 }
1633 State = Temporary;
1634 setDependence(computeDependence(this));
1635 }
1636
setExtendingDecl(ValueDecl * ExtendedBy,unsigned ManglingNumber)1637 void MaterializeTemporaryExpr::setExtendingDecl(ValueDecl *ExtendedBy,
1638 unsigned ManglingNumber) {
1639 // We only need extra state if we have to remember more than just the Stmt.
1640 if (!ExtendedBy)
1641 return;
1642
1643 // We may need to allocate extra storage for the mangling number and the
1644 // extended-by ValueDecl.
1645 if (!State.is<LifetimeExtendedTemporaryDecl *>())
1646 State = LifetimeExtendedTemporaryDecl::Create(
1647 cast<Expr>(State.get<Stmt *>()), ExtendedBy, ManglingNumber);
1648
1649 auto ES = State.get<LifetimeExtendedTemporaryDecl *>();
1650 ES->ExtendingDecl = ExtendedBy;
1651 ES->ManglingNumber = ManglingNumber;
1652 }
1653
isUsableInConstantExpressions(const ASTContext & Context) const1654 bool MaterializeTemporaryExpr::isUsableInConstantExpressions(
1655 const ASTContext &Context) const {
1656 // C++20 [expr.const]p4:
1657 // An object or reference is usable in constant expressions if it is [...]
1658 // a temporary object of non-volatile const-qualified literal type
1659 // whose lifetime is extended to that of a variable that is usable
1660 // in constant expressions
1661 auto *VD = dyn_cast_or_null<VarDecl>(getExtendingDecl());
1662 return VD && getType().isConstant(Context) &&
1663 !getType().isVolatileQualified() &&
1664 getType()->isLiteralType(Context) &&
1665 VD->isUsableInConstantExpressions(Context);
1666 }
1667
TypeTraitExpr(QualType T,SourceLocation Loc,TypeTrait Kind,ArrayRef<TypeSourceInfo * > Args,SourceLocation RParenLoc,bool Value)1668 TypeTraitExpr::TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind,
1669 ArrayRef<TypeSourceInfo *> Args,
1670 SourceLocation RParenLoc, bool Value)
1671 : Expr(TypeTraitExprClass, T, VK_RValue, OK_Ordinary), Loc(Loc),
1672 RParenLoc(RParenLoc) {
1673 assert(Kind <= TT_Last && "invalid enum value!");
1674 TypeTraitExprBits.Kind = Kind;
1675 assert(static_cast<unsigned>(Kind) == TypeTraitExprBits.Kind &&
1676 "TypeTraitExprBits.Kind overflow!");
1677 TypeTraitExprBits.Value = Value;
1678 TypeTraitExprBits.NumArgs = Args.size();
1679 assert(Args.size() == TypeTraitExprBits.NumArgs &&
1680 "TypeTraitExprBits.NumArgs overflow!");
1681
1682 auto **ToArgs = getTrailingObjects<TypeSourceInfo *>();
1683 for (unsigned I = 0, N = Args.size(); I != N; ++I)
1684 ToArgs[I] = Args[I];
1685
1686 setDependence(computeDependence(this));
1687 }
1688
Create(const ASTContext & C,QualType T,SourceLocation Loc,TypeTrait Kind,ArrayRef<TypeSourceInfo * > Args,SourceLocation RParenLoc,bool Value)1689 TypeTraitExpr *TypeTraitExpr::Create(const ASTContext &C, QualType T,
1690 SourceLocation Loc,
1691 TypeTrait Kind,
1692 ArrayRef<TypeSourceInfo *> Args,
1693 SourceLocation RParenLoc,
1694 bool Value) {
1695 void *Mem = C.Allocate(totalSizeToAlloc<TypeSourceInfo *>(Args.size()));
1696 return new (Mem) TypeTraitExpr(T, Loc, Kind, Args, RParenLoc, Value);
1697 }
1698
CreateDeserialized(const ASTContext & C,unsigned NumArgs)1699 TypeTraitExpr *TypeTraitExpr::CreateDeserialized(const ASTContext &C,
1700 unsigned NumArgs) {
1701 void *Mem = C.Allocate(totalSizeToAlloc<TypeSourceInfo *>(NumArgs));
1702 return new (Mem) TypeTraitExpr(EmptyShell());
1703 }
1704
CUDAKernelCallExpr(Expr * Fn,CallExpr * Config,ArrayRef<Expr * > Args,QualType Ty,ExprValueKind VK,SourceLocation RP,FPOptionsOverride FPFeatures,unsigned MinNumArgs)1705 CUDAKernelCallExpr::CUDAKernelCallExpr(Expr *Fn, CallExpr *Config,
1706 ArrayRef<Expr *> Args, QualType Ty,
1707 ExprValueKind VK, SourceLocation RP,
1708 FPOptionsOverride FPFeatures,
1709 unsigned MinNumArgs)
1710 : CallExpr(CUDAKernelCallExprClass, Fn, /*PreArgs=*/Config, Args, Ty, VK,
1711 RP, FPFeatures, MinNumArgs, NotADL) {}
1712
CUDAKernelCallExpr(unsigned NumArgs,bool HasFPFeatures,EmptyShell Empty)1713 CUDAKernelCallExpr::CUDAKernelCallExpr(unsigned NumArgs, bool HasFPFeatures,
1714 EmptyShell Empty)
1715 : CallExpr(CUDAKernelCallExprClass, /*NumPreArgs=*/END_PREARG, NumArgs,
1716 HasFPFeatures, Empty) {}
1717
1718 CUDAKernelCallExpr *
Create(const ASTContext & Ctx,Expr * Fn,CallExpr * Config,ArrayRef<Expr * > Args,QualType Ty,ExprValueKind VK,SourceLocation RP,FPOptionsOverride FPFeatures,unsigned MinNumArgs)1719 CUDAKernelCallExpr::Create(const ASTContext &Ctx, Expr *Fn, CallExpr *Config,
1720 ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
1721 SourceLocation RP, FPOptionsOverride FPFeatures,
1722 unsigned MinNumArgs) {
1723 // Allocate storage for the trailing objects of CallExpr.
1724 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1725 unsigned SizeOfTrailingObjects = CallExpr::sizeOfTrailingObjects(
1726 /*NumPreArgs=*/END_PREARG, NumArgs, FPFeatures.requiresTrailingStorage());
1727 void *Mem = Ctx.Allocate(sizeof(CUDAKernelCallExpr) + SizeOfTrailingObjects,
1728 alignof(CUDAKernelCallExpr));
1729 return new (Mem)
1730 CUDAKernelCallExpr(Fn, Config, Args, Ty, VK, RP, FPFeatures, MinNumArgs);
1731 }
1732
CreateEmpty(const ASTContext & Ctx,unsigned NumArgs,bool HasFPFeatures,EmptyShell Empty)1733 CUDAKernelCallExpr *CUDAKernelCallExpr::CreateEmpty(const ASTContext &Ctx,
1734 unsigned NumArgs,
1735 bool HasFPFeatures,
1736 EmptyShell Empty) {
1737 // Allocate storage for the trailing objects of CallExpr.
1738 unsigned SizeOfTrailingObjects = CallExpr::sizeOfTrailingObjects(
1739 /*NumPreArgs=*/END_PREARG, NumArgs, HasFPFeatures);
1740 void *Mem = Ctx.Allocate(sizeof(CUDAKernelCallExpr) + SizeOfTrailingObjects,
1741 alignof(CUDAKernelCallExpr));
1742 return new (Mem) CUDAKernelCallExpr(NumArgs, HasFPFeatures, Empty);
1743 }
1744