Bug Summary

File:tools/clang/lib/AST/ExprCXX.cpp
Warning:line 1581, column 19
Access to field 'Temporary' results in a dereference of a null pointer (loaded from variable 'ES')

Annotated Source Code

Press '?' to see keyboard shortcuts

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