Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/clang/lib/AST/Expr.cpp
35259 views
1
//===--- Expr.cpp - 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 Expr class and subclasses.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "clang/AST/Expr.h"
14
#include "clang/AST/APValue.h"
15
#include "clang/AST/ASTContext.h"
16
#include "clang/AST/Attr.h"
17
#include "clang/AST/ComputeDependence.h"
18
#include "clang/AST/DeclCXX.h"
19
#include "clang/AST/DeclObjC.h"
20
#include "clang/AST/DeclTemplate.h"
21
#include "clang/AST/DependenceFlags.h"
22
#include "clang/AST/EvaluatedExprVisitor.h"
23
#include "clang/AST/ExprCXX.h"
24
#include "clang/AST/IgnoreExpr.h"
25
#include "clang/AST/Mangle.h"
26
#include "clang/AST/RecordLayout.h"
27
#include "clang/AST/StmtVisitor.h"
28
#include "clang/Basic/Builtins.h"
29
#include "clang/Basic/CharInfo.h"
30
#include "clang/Basic/SourceManager.h"
31
#include "clang/Basic/TargetInfo.h"
32
#include "clang/Lex/Lexer.h"
33
#include "clang/Lex/LiteralSupport.h"
34
#include "clang/Lex/Preprocessor.h"
35
#include "llvm/Support/ErrorHandling.h"
36
#include "llvm/Support/Format.h"
37
#include "llvm/Support/raw_ostream.h"
38
#include <algorithm>
39
#include <cstring>
40
#include <optional>
41
using namespace clang;
42
43
const Expr *Expr::getBestDynamicClassTypeExpr() const {
44
const Expr *E = this;
45
while (true) {
46
E = E->IgnoreParenBaseCasts();
47
48
// Follow the RHS of a comma operator.
49
if (auto *BO = dyn_cast<BinaryOperator>(E)) {
50
if (BO->getOpcode() == BO_Comma) {
51
E = BO->getRHS();
52
continue;
53
}
54
}
55
56
// Step into initializer for materialized temporaries.
57
if (auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
58
E = MTE->getSubExpr();
59
continue;
60
}
61
62
break;
63
}
64
65
return E;
66
}
67
68
const CXXRecordDecl *Expr::getBestDynamicClassType() const {
69
const Expr *E = getBestDynamicClassTypeExpr();
70
QualType DerivedType = E->getType();
71
if (const PointerType *PTy = DerivedType->getAs<PointerType>())
72
DerivedType = PTy->getPointeeType();
73
74
if (DerivedType->isDependentType())
75
return nullptr;
76
77
const RecordType *Ty = DerivedType->castAs<RecordType>();
78
Decl *D = Ty->getDecl();
79
return cast<CXXRecordDecl>(D);
80
}
81
82
const Expr *Expr::skipRValueSubobjectAdjustments(
83
SmallVectorImpl<const Expr *> &CommaLHSs,
84
SmallVectorImpl<SubobjectAdjustment> &Adjustments) const {
85
const Expr *E = this;
86
while (true) {
87
E = E->IgnoreParens();
88
89
if (const auto *CE = dyn_cast<CastExpr>(E)) {
90
if ((CE->getCastKind() == CK_DerivedToBase ||
91
CE->getCastKind() == CK_UncheckedDerivedToBase) &&
92
E->getType()->isRecordType()) {
93
E = CE->getSubExpr();
94
const auto *Derived =
95
cast<CXXRecordDecl>(E->getType()->castAs<RecordType>()->getDecl());
96
Adjustments.push_back(SubobjectAdjustment(CE, Derived));
97
continue;
98
}
99
100
if (CE->getCastKind() == CK_NoOp) {
101
E = CE->getSubExpr();
102
continue;
103
}
104
} else if (const auto *ME = dyn_cast<MemberExpr>(E)) {
105
if (!ME->isArrow()) {
106
assert(ME->getBase()->getType()->getAsRecordDecl());
107
if (const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
108
if (!Field->isBitField() && !Field->getType()->isReferenceType()) {
109
E = ME->getBase();
110
Adjustments.push_back(SubobjectAdjustment(Field));
111
continue;
112
}
113
}
114
}
115
} else if (const auto *BO = dyn_cast<BinaryOperator>(E)) {
116
if (BO->getOpcode() == BO_PtrMemD) {
117
assert(BO->getRHS()->isPRValue());
118
E = BO->getLHS();
119
const auto *MPT = BO->getRHS()->getType()->getAs<MemberPointerType>();
120
Adjustments.push_back(SubobjectAdjustment(MPT, BO->getRHS()));
121
continue;
122
}
123
if (BO->getOpcode() == BO_Comma) {
124
CommaLHSs.push_back(BO->getLHS());
125
E = BO->getRHS();
126
continue;
127
}
128
}
129
130
// Nothing changed.
131
break;
132
}
133
return E;
134
}
135
136
bool Expr::isKnownToHaveBooleanValue(bool Semantic) const {
137
const Expr *E = IgnoreParens();
138
139
// If this value has _Bool type, it is obvious 0/1.
140
if (E->getType()->isBooleanType()) return true;
141
// If this is a non-scalar-integer type, we don't care enough to try.
142
if (!E->getType()->isIntegralOrEnumerationType()) return false;
143
144
if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) {
145
switch (UO->getOpcode()) {
146
case UO_Plus:
147
return UO->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
148
case UO_LNot:
149
return true;
150
default:
151
return false;
152
}
153
}
154
155
// Only look through implicit casts. If the user writes
156
// '(int) (a && b)' treat it as an arbitrary int.
157
// FIXME: Should we look through any cast expression in !Semantic mode?
158
if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
159
return CE->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
160
161
if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
162
switch (BO->getOpcode()) {
163
default: return false;
164
case BO_LT: // Relational operators.
165
case BO_GT:
166
case BO_LE:
167
case BO_GE:
168
case BO_EQ: // Equality operators.
169
case BO_NE:
170
case BO_LAnd: // AND operator.
171
case BO_LOr: // Logical OR operator.
172
return true;
173
174
case BO_And: // Bitwise AND operator.
175
case BO_Xor: // Bitwise XOR operator.
176
case BO_Or: // Bitwise OR operator.
177
// Handle things like (x==2)|(y==12).
178
return BO->getLHS()->isKnownToHaveBooleanValue(Semantic) &&
179
BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
180
181
case BO_Comma:
182
case BO_Assign:
183
return BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
184
}
185
}
186
187
if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E))
188
return CO->getTrueExpr()->isKnownToHaveBooleanValue(Semantic) &&
189
CO->getFalseExpr()->isKnownToHaveBooleanValue(Semantic);
190
191
if (isa<ObjCBoolLiteralExpr>(E))
192
return true;
193
194
if (const auto *OVE = dyn_cast<OpaqueValueExpr>(E))
195
return OVE->getSourceExpr()->isKnownToHaveBooleanValue(Semantic);
196
197
if (const FieldDecl *FD = E->getSourceBitField())
198
if (!Semantic && FD->getType()->isUnsignedIntegerType() &&
199
!FD->getBitWidth()->isValueDependent() &&
200
FD->getBitWidthValue(FD->getASTContext()) == 1)
201
return true;
202
203
return false;
204
}
205
206
bool Expr::isFlexibleArrayMemberLike(
207
ASTContext &Ctx,
208
LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel,
209
bool IgnoreTemplateOrMacroSubstitution) const {
210
const Expr *E = IgnoreParens();
211
const Decl *D = nullptr;
212
213
if (const auto *ME = dyn_cast<MemberExpr>(E))
214
D = ME->getMemberDecl();
215
else if (const auto *DRE = dyn_cast<DeclRefExpr>(E))
216
D = DRE->getDecl();
217
else if (const auto *IRE = dyn_cast<ObjCIvarRefExpr>(E))
218
D = IRE->getDecl();
219
220
return Decl::isFlexibleArrayMemberLike(Ctx, D, E->getType(),
221
StrictFlexArraysLevel,
222
IgnoreTemplateOrMacroSubstitution);
223
}
224
225
const ValueDecl *
226
Expr::getAsBuiltinConstantDeclRef(const ASTContext &Context) const {
227
Expr::EvalResult Eval;
228
229
if (EvaluateAsConstantExpr(Eval, Context)) {
230
APValue &Value = Eval.Val;
231
232
if (Value.isMemberPointer())
233
return Value.getMemberPointerDecl();
234
235
if (Value.isLValue() && Value.getLValueOffset().isZero())
236
return Value.getLValueBase().dyn_cast<const ValueDecl *>();
237
}
238
239
return nullptr;
240
}
241
242
// Amusing macro metaprogramming hack: check whether a class provides
243
// a more specific implementation of getExprLoc().
244
//
245
// See also Stmt.cpp:{getBeginLoc(),getEndLoc()}.
246
namespace {
247
/// This implementation is used when a class provides a custom
248
/// implementation of getExprLoc.
249
template <class E, class T>
250
SourceLocation getExprLocImpl(const Expr *expr,
251
SourceLocation (T::*v)() const) {
252
return static_cast<const E*>(expr)->getExprLoc();
253
}
254
255
/// This implementation is used when a class doesn't provide
256
/// a custom implementation of getExprLoc. Overload resolution
257
/// should pick it over the implementation above because it's
258
/// more specialized according to function template partial ordering.
259
template <class E>
260
SourceLocation getExprLocImpl(const Expr *expr,
261
SourceLocation (Expr::*v)() const) {
262
return static_cast<const E *>(expr)->getBeginLoc();
263
}
264
}
265
266
QualType Expr::getEnumCoercedType(const ASTContext &Ctx) const {
267
if (isa<EnumType>(getType()))
268
return getType();
269
if (const auto *ECD = getEnumConstantDecl()) {
270
const auto *ED = cast<EnumDecl>(ECD->getDeclContext());
271
if (ED->isCompleteDefinition())
272
return Ctx.getTypeDeclType(ED);
273
}
274
return getType();
275
}
276
277
SourceLocation Expr::getExprLoc() const {
278
switch (getStmtClass()) {
279
case Stmt::NoStmtClass: llvm_unreachable("statement without class");
280
#define ABSTRACT_STMT(type)
281
#define STMT(type, base) \
282
case Stmt::type##Class: break;
283
#define EXPR(type, base) \
284
case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
285
#include "clang/AST/StmtNodes.inc"
286
}
287
llvm_unreachable("unknown expression kind");
288
}
289
290
//===----------------------------------------------------------------------===//
291
// Primary Expressions.
292
//===----------------------------------------------------------------------===//
293
294
static void AssertResultStorageKind(ConstantResultStorageKind Kind) {
295
assert((Kind == ConstantResultStorageKind::APValue ||
296
Kind == ConstantResultStorageKind::Int64 ||
297
Kind == ConstantResultStorageKind::None) &&
298
"Invalid StorageKind Value");
299
(void)Kind;
300
}
301
302
ConstantResultStorageKind ConstantExpr::getStorageKind(const APValue &Value) {
303
switch (Value.getKind()) {
304
case APValue::None:
305
case APValue::Indeterminate:
306
return ConstantResultStorageKind::None;
307
case APValue::Int:
308
if (!Value.getInt().needsCleanup())
309
return ConstantResultStorageKind::Int64;
310
[[fallthrough]];
311
default:
312
return ConstantResultStorageKind::APValue;
313
}
314
}
315
316
ConstantResultStorageKind
317
ConstantExpr::getStorageKind(const Type *T, const ASTContext &Context) {
318
if (T->isIntegralOrEnumerationType() && Context.getTypeInfo(T).Width <= 64)
319
return ConstantResultStorageKind::Int64;
320
return ConstantResultStorageKind::APValue;
321
}
322
323
ConstantExpr::ConstantExpr(Expr *SubExpr, ConstantResultStorageKind StorageKind,
324
bool IsImmediateInvocation)
325
: FullExpr(ConstantExprClass, SubExpr) {
326
ConstantExprBits.ResultKind = llvm::to_underlying(StorageKind);
327
ConstantExprBits.APValueKind = APValue::None;
328
ConstantExprBits.IsUnsigned = false;
329
ConstantExprBits.BitWidth = 0;
330
ConstantExprBits.HasCleanup = false;
331
ConstantExprBits.IsImmediateInvocation = IsImmediateInvocation;
332
333
if (StorageKind == ConstantResultStorageKind::APValue)
334
::new (getTrailingObjects<APValue>()) APValue();
335
}
336
337
ConstantExpr *ConstantExpr::Create(const ASTContext &Context, Expr *E,
338
ConstantResultStorageKind StorageKind,
339
bool IsImmediateInvocation) {
340
assert(!isa<ConstantExpr>(E));
341
AssertResultStorageKind(StorageKind);
342
343
unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
344
StorageKind == ConstantResultStorageKind::APValue,
345
StorageKind == ConstantResultStorageKind::Int64);
346
void *Mem = Context.Allocate(Size, alignof(ConstantExpr));
347
return new (Mem) ConstantExpr(E, StorageKind, IsImmediateInvocation);
348
}
349
350
ConstantExpr *ConstantExpr::Create(const ASTContext &Context, Expr *E,
351
const APValue &Result) {
352
ConstantResultStorageKind StorageKind = getStorageKind(Result);
353
ConstantExpr *Self = Create(Context, E, StorageKind);
354
Self->SetResult(Result, Context);
355
return Self;
356
}
357
358
ConstantExpr::ConstantExpr(EmptyShell Empty,
359
ConstantResultStorageKind StorageKind)
360
: FullExpr(ConstantExprClass, Empty) {
361
ConstantExprBits.ResultKind = llvm::to_underlying(StorageKind);
362
363
if (StorageKind == ConstantResultStorageKind::APValue)
364
::new (getTrailingObjects<APValue>()) APValue();
365
}
366
367
ConstantExpr *ConstantExpr::CreateEmpty(const ASTContext &Context,
368
ConstantResultStorageKind StorageKind) {
369
AssertResultStorageKind(StorageKind);
370
371
unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
372
StorageKind == ConstantResultStorageKind::APValue,
373
StorageKind == ConstantResultStorageKind::Int64);
374
void *Mem = Context.Allocate(Size, alignof(ConstantExpr));
375
return new (Mem) ConstantExpr(EmptyShell(), StorageKind);
376
}
377
378
void ConstantExpr::MoveIntoResult(APValue &Value, const ASTContext &Context) {
379
assert((unsigned)getStorageKind(Value) <= ConstantExprBits.ResultKind &&
380
"Invalid storage for this value kind");
381
ConstantExprBits.APValueKind = Value.getKind();
382
switch (getResultStorageKind()) {
383
case ConstantResultStorageKind::None:
384
return;
385
case ConstantResultStorageKind::Int64:
386
Int64Result() = *Value.getInt().getRawData();
387
ConstantExprBits.BitWidth = Value.getInt().getBitWidth();
388
ConstantExprBits.IsUnsigned = Value.getInt().isUnsigned();
389
return;
390
case ConstantResultStorageKind::APValue:
391
if (!ConstantExprBits.HasCleanup && Value.needsCleanup()) {
392
ConstantExprBits.HasCleanup = true;
393
Context.addDestruction(&APValueResult());
394
}
395
APValueResult() = std::move(Value);
396
return;
397
}
398
llvm_unreachable("Invalid ResultKind Bits");
399
}
400
401
llvm::APSInt ConstantExpr::getResultAsAPSInt() const {
402
switch (getResultStorageKind()) {
403
case ConstantResultStorageKind::APValue:
404
return APValueResult().getInt();
405
case ConstantResultStorageKind::Int64:
406
return llvm::APSInt(llvm::APInt(ConstantExprBits.BitWidth, Int64Result()),
407
ConstantExprBits.IsUnsigned);
408
default:
409
llvm_unreachable("invalid Accessor");
410
}
411
}
412
413
APValue ConstantExpr::getAPValueResult() const {
414
415
switch (getResultStorageKind()) {
416
case ConstantResultStorageKind::APValue:
417
return APValueResult();
418
case ConstantResultStorageKind::Int64:
419
return APValue(
420
llvm::APSInt(llvm::APInt(ConstantExprBits.BitWidth, Int64Result()),
421
ConstantExprBits.IsUnsigned));
422
case ConstantResultStorageKind::None:
423
if (ConstantExprBits.APValueKind == APValue::Indeterminate)
424
return APValue::IndeterminateValue();
425
return APValue();
426
}
427
llvm_unreachable("invalid ResultKind");
428
}
429
430
DeclRefExpr::DeclRefExpr(const ASTContext &Ctx, ValueDecl *D,
431
bool RefersToEnclosingVariableOrCapture, QualType T,
432
ExprValueKind VK, SourceLocation L,
433
const DeclarationNameLoc &LocInfo,
434
NonOdrUseReason NOUR)
435
: Expr(DeclRefExprClass, T, VK, OK_Ordinary), D(D), DNLoc(LocInfo) {
436
DeclRefExprBits.HasQualifier = false;
437
DeclRefExprBits.HasTemplateKWAndArgsInfo = false;
438
DeclRefExprBits.HasFoundDecl = false;
439
DeclRefExprBits.HadMultipleCandidates = false;
440
DeclRefExprBits.RefersToEnclosingVariableOrCapture =
441
RefersToEnclosingVariableOrCapture;
442
DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = false;
443
DeclRefExprBits.NonOdrUseReason = NOUR;
444
DeclRefExprBits.IsImmediateEscalating = false;
445
DeclRefExprBits.Loc = L;
446
setDependence(computeDependence(this, Ctx));
447
}
448
449
DeclRefExpr::DeclRefExpr(const ASTContext &Ctx,
450
NestedNameSpecifierLoc QualifierLoc,
451
SourceLocation TemplateKWLoc, ValueDecl *D,
452
bool RefersToEnclosingVariableOrCapture,
453
const DeclarationNameInfo &NameInfo, NamedDecl *FoundD,
454
const TemplateArgumentListInfo *TemplateArgs,
455
QualType T, ExprValueKind VK, NonOdrUseReason NOUR)
456
: Expr(DeclRefExprClass, T, VK, OK_Ordinary), D(D),
457
DNLoc(NameInfo.getInfo()) {
458
DeclRefExprBits.Loc = NameInfo.getLoc();
459
DeclRefExprBits.HasQualifier = QualifierLoc ? 1 : 0;
460
if (QualifierLoc)
461
new (getTrailingObjects<NestedNameSpecifierLoc>())
462
NestedNameSpecifierLoc(QualifierLoc);
463
DeclRefExprBits.HasFoundDecl = FoundD ? 1 : 0;
464
if (FoundD)
465
*getTrailingObjects<NamedDecl *>() = FoundD;
466
DeclRefExprBits.HasTemplateKWAndArgsInfo
467
= (TemplateArgs || TemplateKWLoc.isValid()) ? 1 : 0;
468
DeclRefExprBits.RefersToEnclosingVariableOrCapture =
469
RefersToEnclosingVariableOrCapture;
470
DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = false;
471
DeclRefExprBits.NonOdrUseReason = NOUR;
472
if (TemplateArgs) {
473
auto Deps = TemplateArgumentDependence::None;
474
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
475
TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
476
Deps);
477
assert(!(Deps & TemplateArgumentDependence::Dependent) &&
478
"built a DeclRefExpr with dependent template args");
479
} else if (TemplateKWLoc.isValid()) {
480
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
481
TemplateKWLoc);
482
}
483
DeclRefExprBits.IsImmediateEscalating = false;
484
DeclRefExprBits.HadMultipleCandidates = 0;
485
setDependence(computeDependence(this, Ctx));
486
}
487
488
DeclRefExpr *DeclRefExpr::Create(const ASTContext &Context,
489
NestedNameSpecifierLoc QualifierLoc,
490
SourceLocation TemplateKWLoc, ValueDecl *D,
491
bool RefersToEnclosingVariableOrCapture,
492
SourceLocation NameLoc, QualType T,
493
ExprValueKind VK, NamedDecl *FoundD,
494
const TemplateArgumentListInfo *TemplateArgs,
495
NonOdrUseReason NOUR) {
496
return Create(Context, QualifierLoc, TemplateKWLoc, D,
497
RefersToEnclosingVariableOrCapture,
498
DeclarationNameInfo(D->getDeclName(), NameLoc),
499
T, VK, FoundD, TemplateArgs, NOUR);
500
}
501
502
DeclRefExpr *DeclRefExpr::Create(const ASTContext &Context,
503
NestedNameSpecifierLoc QualifierLoc,
504
SourceLocation TemplateKWLoc, ValueDecl *D,
505
bool RefersToEnclosingVariableOrCapture,
506
const DeclarationNameInfo &NameInfo,
507
QualType T, ExprValueKind VK,
508
NamedDecl *FoundD,
509
const TemplateArgumentListInfo *TemplateArgs,
510
NonOdrUseReason NOUR) {
511
// Filter out cases where the found Decl is the same as the value refenenced.
512
if (D == FoundD)
513
FoundD = nullptr;
514
515
bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid();
516
std::size_t Size =
517
totalSizeToAlloc<NestedNameSpecifierLoc, NamedDecl *,
518
ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
519
QualifierLoc ? 1 : 0, FoundD ? 1 : 0,
520
HasTemplateKWAndArgsInfo ? 1 : 0,
521
TemplateArgs ? TemplateArgs->size() : 0);
522
523
void *Mem = Context.Allocate(Size, alignof(DeclRefExpr));
524
return new (Mem) DeclRefExpr(Context, QualifierLoc, TemplateKWLoc, D,
525
RefersToEnclosingVariableOrCapture, NameInfo,
526
FoundD, TemplateArgs, T, VK, NOUR);
527
}
528
529
DeclRefExpr *DeclRefExpr::CreateEmpty(const ASTContext &Context,
530
bool HasQualifier,
531
bool HasFoundDecl,
532
bool HasTemplateKWAndArgsInfo,
533
unsigned NumTemplateArgs) {
534
assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
535
std::size_t Size =
536
totalSizeToAlloc<NestedNameSpecifierLoc, NamedDecl *,
537
ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
538
HasQualifier ? 1 : 0, HasFoundDecl ? 1 : 0, HasTemplateKWAndArgsInfo,
539
NumTemplateArgs);
540
void *Mem = Context.Allocate(Size, alignof(DeclRefExpr));
541
return new (Mem) DeclRefExpr(EmptyShell());
542
}
543
544
void DeclRefExpr::setDecl(ValueDecl *NewD) {
545
D = NewD;
546
if (getType()->isUndeducedType())
547
setType(NewD->getType());
548
setDependence(computeDependence(this, NewD->getASTContext()));
549
}
550
551
SourceLocation DeclRefExpr::getBeginLoc() const {
552
if (hasQualifier())
553
return getQualifierLoc().getBeginLoc();
554
return getNameInfo().getBeginLoc();
555
}
556
SourceLocation DeclRefExpr::getEndLoc() const {
557
if (hasExplicitTemplateArgs())
558
return getRAngleLoc();
559
return getNameInfo().getEndLoc();
560
}
561
562
SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(SourceLocation OpLoc,
563
SourceLocation LParen,
564
SourceLocation RParen,
565
QualType ResultTy,
566
TypeSourceInfo *TSI)
567
: Expr(SYCLUniqueStableNameExprClass, ResultTy, VK_PRValue, OK_Ordinary),
568
OpLoc(OpLoc), LParen(LParen), RParen(RParen) {
569
setTypeSourceInfo(TSI);
570
setDependence(computeDependence(this));
571
}
572
573
SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(EmptyShell Empty,
574
QualType ResultTy)
575
: Expr(SYCLUniqueStableNameExprClass, ResultTy, VK_PRValue, OK_Ordinary) {}
576
577
SYCLUniqueStableNameExpr *
578
SYCLUniqueStableNameExpr::Create(const ASTContext &Ctx, SourceLocation OpLoc,
579
SourceLocation LParen, SourceLocation RParen,
580
TypeSourceInfo *TSI) {
581
QualType ResultTy = Ctx.getPointerType(Ctx.CharTy.withConst());
582
return new (Ctx)
583
SYCLUniqueStableNameExpr(OpLoc, LParen, RParen, ResultTy, TSI);
584
}
585
586
SYCLUniqueStableNameExpr *
587
SYCLUniqueStableNameExpr::CreateEmpty(const ASTContext &Ctx) {
588
QualType ResultTy = Ctx.getPointerType(Ctx.CharTy.withConst());
589
return new (Ctx) SYCLUniqueStableNameExpr(EmptyShell(), ResultTy);
590
}
591
592
std::string SYCLUniqueStableNameExpr::ComputeName(ASTContext &Context) const {
593
return SYCLUniqueStableNameExpr::ComputeName(Context,
594
getTypeSourceInfo()->getType());
595
}
596
597
std::string SYCLUniqueStableNameExpr::ComputeName(ASTContext &Context,
598
QualType Ty) {
599
auto MangleCallback = [](ASTContext &Ctx,
600
const NamedDecl *ND) -> std::optional<unsigned> {
601
if (const auto *RD = dyn_cast<CXXRecordDecl>(ND))
602
return RD->getDeviceLambdaManglingNumber();
603
return std::nullopt;
604
};
605
606
std::unique_ptr<MangleContext> Ctx{ItaniumMangleContext::create(
607
Context, Context.getDiagnostics(), MangleCallback)};
608
609
std::string Buffer;
610
Buffer.reserve(128);
611
llvm::raw_string_ostream Out(Buffer);
612
Ctx->mangleCanonicalTypeName(Ty, Out);
613
614
return Out.str();
615
}
616
617
PredefinedExpr::PredefinedExpr(SourceLocation L, QualType FNTy,
618
PredefinedIdentKind IK, bool IsTransparent,
619
StringLiteral *SL)
620
: Expr(PredefinedExprClass, FNTy, VK_LValue, OK_Ordinary) {
621
PredefinedExprBits.Kind = llvm::to_underlying(IK);
622
assert((getIdentKind() == IK) &&
623
"IdentKind do not fit in PredefinedExprBitfields!");
624
bool HasFunctionName = SL != nullptr;
625
PredefinedExprBits.HasFunctionName = HasFunctionName;
626
PredefinedExprBits.IsTransparent = IsTransparent;
627
PredefinedExprBits.Loc = L;
628
if (HasFunctionName)
629
setFunctionName(SL);
630
setDependence(computeDependence(this));
631
}
632
633
PredefinedExpr::PredefinedExpr(EmptyShell Empty, bool HasFunctionName)
634
: Expr(PredefinedExprClass, Empty) {
635
PredefinedExprBits.HasFunctionName = HasFunctionName;
636
}
637
638
PredefinedExpr *PredefinedExpr::Create(const ASTContext &Ctx, SourceLocation L,
639
QualType FNTy, PredefinedIdentKind IK,
640
bool IsTransparent, StringLiteral *SL) {
641
bool HasFunctionName = SL != nullptr;
642
void *Mem = Ctx.Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
643
alignof(PredefinedExpr));
644
return new (Mem) PredefinedExpr(L, FNTy, IK, IsTransparent, SL);
645
}
646
647
PredefinedExpr *PredefinedExpr::CreateEmpty(const ASTContext &Ctx,
648
bool HasFunctionName) {
649
void *Mem = Ctx.Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
650
alignof(PredefinedExpr));
651
return new (Mem) PredefinedExpr(EmptyShell(), HasFunctionName);
652
}
653
654
StringRef PredefinedExpr::getIdentKindName(PredefinedIdentKind IK) {
655
switch (IK) {
656
case PredefinedIdentKind::Func:
657
return "__func__";
658
case PredefinedIdentKind::Function:
659
return "__FUNCTION__";
660
case PredefinedIdentKind::FuncDName:
661
return "__FUNCDNAME__";
662
case PredefinedIdentKind::LFunction:
663
return "L__FUNCTION__";
664
case PredefinedIdentKind::PrettyFunction:
665
return "__PRETTY_FUNCTION__";
666
case PredefinedIdentKind::FuncSig:
667
return "__FUNCSIG__";
668
case PredefinedIdentKind::LFuncSig:
669
return "L__FUNCSIG__";
670
case PredefinedIdentKind::PrettyFunctionNoVirtual:
671
break;
672
}
673
llvm_unreachable("Unknown ident kind for PredefinedExpr");
674
}
675
676
// FIXME: Maybe this should use DeclPrinter with a special "print predefined
677
// expr" policy instead.
678
std::string PredefinedExpr::ComputeName(PredefinedIdentKind IK,
679
const Decl *CurrentDecl,
680
bool ForceElaboratedPrinting) {
681
ASTContext &Context = CurrentDecl->getASTContext();
682
683
if (IK == PredefinedIdentKind::FuncDName) {
684
if (const NamedDecl *ND = dyn_cast<NamedDecl>(CurrentDecl)) {
685
std::unique_ptr<MangleContext> MC;
686
MC.reset(Context.createMangleContext());
687
688
if (MC->shouldMangleDeclName(ND)) {
689
SmallString<256> Buffer;
690
llvm::raw_svector_ostream Out(Buffer);
691
GlobalDecl GD;
692
if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(ND))
693
GD = GlobalDecl(CD, Ctor_Base);
694
else if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(ND))
695
GD = GlobalDecl(DD, Dtor_Base);
696
else if (ND->hasAttr<CUDAGlobalAttr>())
697
GD = GlobalDecl(cast<FunctionDecl>(ND));
698
else
699
GD = GlobalDecl(ND);
700
MC->mangleName(GD, Out);
701
702
if (!Buffer.empty() && Buffer.front() == '\01')
703
return std::string(Buffer.substr(1));
704
return std::string(Buffer);
705
}
706
return std::string(ND->getIdentifier()->getName());
707
}
708
return "";
709
}
710
if (isa<BlockDecl>(CurrentDecl)) {
711
// For blocks we only emit something if it is enclosed in a function
712
// For top-level block we'd like to include the name of variable, but we
713
// don't have it at this point.
714
auto DC = CurrentDecl->getDeclContext();
715
if (DC->isFileContext())
716
return "";
717
718
SmallString<256> Buffer;
719
llvm::raw_svector_ostream Out(Buffer);
720
if (auto *DCBlock = dyn_cast<BlockDecl>(DC))
721
// For nested blocks, propagate up to the parent.
722
Out << ComputeName(IK, DCBlock);
723
else if (auto *DCDecl = dyn_cast<Decl>(DC))
724
Out << ComputeName(IK, DCDecl) << "_block_invoke";
725
return std::string(Out.str());
726
}
727
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
728
const auto &LO = Context.getLangOpts();
729
bool IsFuncOrFunctionInNonMSVCCompatEnv =
730
((IK == PredefinedIdentKind::Func ||
731
IK == PredefinedIdentKind ::Function) &&
732
!LO.MSVCCompat);
733
bool IsLFunctionInMSVCCommpatEnv =
734
IK == PredefinedIdentKind::LFunction && LO.MSVCCompat;
735
bool IsFuncOrFunctionOrLFunctionOrFuncDName =
736
IK != PredefinedIdentKind::PrettyFunction &&
737
IK != PredefinedIdentKind::PrettyFunctionNoVirtual &&
738
IK != PredefinedIdentKind::FuncSig &&
739
IK != PredefinedIdentKind::LFuncSig;
740
if ((ForceElaboratedPrinting &&
741
(IsFuncOrFunctionInNonMSVCCompatEnv || IsLFunctionInMSVCCommpatEnv)) ||
742
(!ForceElaboratedPrinting && IsFuncOrFunctionOrLFunctionOrFuncDName))
743
return FD->getNameAsString();
744
745
SmallString<256> Name;
746
llvm::raw_svector_ostream Out(Name);
747
748
if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
749
if (MD->isVirtual() && IK != PredefinedIdentKind::PrettyFunctionNoVirtual)
750
Out << "virtual ";
751
if (MD->isStatic())
752
Out << "static ";
753
}
754
755
class PrettyCallbacks final : public PrintingCallbacks {
756
public:
757
PrettyCallbacks(const LangOptions &LO) : LO(LO) {}
758
std::string remapPath(StringRef Path) const override {
759
SmallString<128> p(Path);
760
LO.remapPathPrefix(p);
761
return std::string(p);
762
}
763
764
private:
765
const LangOptions &LO;
766
};
767
PrintingPolicy Policy(Context.getLangOpts());
768
PrettyCallbacks PrettyCB(Context.getLangOpts());
769
Policy.Callbacks = &PrettyCB;
770
if (IK == PredefinedIdentKind::Function && ForceElaboratedPrinting)
771
Policy.SuppressTagKeyword = !LO.MSVCCompat;
772
std::string Proto;
773
llvm::raw_string_ostream POut(Proto);
774
775
const FunctionDecl *Decl = FD;
776
if (const FunctionDecl* Pattern = FD->getTemplateInstantiationPattern())
777
Decl = Pattern;
778
const FunctionType *AFT = Decl->getType()->getAs<FunctionType>();
779
const FunctionProtoType *FT = nullptr;
780
if (FD->hasWrittenPrototype())
781
FT = dyn_cast<FunctionProtoType>(AFT);
782
783
if (IK == PredefinedIdentKind::FuncSig ||
784
IK == PredefinedIdentKind::LFuncSig) {
785
switch (AFT->getCallConv()) {
786
case CC_C: POut << "__cdecl "; break;
787
case CC_X86StdCall: POut << "__stdcall "; break;
788
case CC_X86FastCall: POut << "__fastcall "; break;
789
case CC_X86ThisCall: POut << "__thiscall "; break;
790
case CC_X86VectorCall: POut << "__vectorcall "; break;
791
case CC_X86RegCall: POut << "__regcall "; break;
792
// Only bother printing the conventions that MSVC knows about.
793
default: break;
794
}
795
}
796
797
FD->printQualifiedName(POut, Policy);
798
799
if (IK == PredefinedIdentKind::Function) {
800
POut.flush();
801
Out << Proto;
802
return std::string(Name);
803
}
804
805
POut << "(";
806
if (FT) {
807
for (unsigned i = 0, e = Decl->getNumParams(); i != e; ++i) {
808
if (i) POut << ", ";
809
POut << Decl->getParamDecl(i)->getType().stream(Policy);
810
}
811
812
if (FT->isVariadic()) {
813
if (FD->getNumParams()) POut << ", ";
814
POut << "...";
815
} else if ((IK == PredefinedIdentKind::FuncSig ||
816
IK == PredefinedIdentKind::LFuncSig ||
817
!Context.getLangOpts().CPlusPlus) &&
818
!Decl->getNumParams()) {
819
POut << "void";
820
}
821
}
822
POut << ")";
823
824
if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
825
assert(FT && "We must have a written prototype in this case.");
826
if (FT->isConst())
827
POut << " const";
828
if (FT->isVolatile())
829
POut << " volatile";
830
RefQualifierKind Ref = MD->getRefQualifier();
831
if (Ref == RQ_LValue)
832
POut << " &";
833
else if (Ref == RQ_RValue)
834
POut << " &&";
835
}
836
837
typedef SmallVector<const ClassTemplateSpecializationDecl *, 8> SpecsTy;
838
SpecsTy Specs;
839
const DeclContext *Ctx = FD->getDeclContext();
840
while (isa_and_nonnull<NamedDecl>(Ctx)) {
841
const ClassTemplateSpecializationDecl *Spec
842
= dyn_cast<ClassTemplateSpecializationDecl>(Ctx);
843
if (Spec && !Spec->isExplicitSpecialization())
844
Specs.push_back(Spec);
845
Ctx = Ctx->getParent();
846
}
847
848
std::string TemplateParams;
849
llvm::raw_string_ostream TOut(TemplateParams);
850
for (const ClassTemplateSpecializationDecl *D : llvm::reverse(Specs)) {
851
const TemplateParameterList *Params =
852
D->getSpecializedTemplate()->getTemplateParameters();
853
const TemplateArgumentList &Args = D->getTemplateArgs();
854
assert(Params->size() == Args.size());
855
for (unsigned i = 0, numParams = Params->size(); i != numParams; ++i) {
856
StringRef Param = Params->getParam(i)->getName();
857
if (Param.empty()) continue;
858
TOut << Param << " = ";
859
Args.get(i).print(Policy, TOut,
860
TemplateParameterList::shouldIncludeTypeForArgument(
861
Policy, Params, i));
862
TOut << ", ";
863
}
864
}
865
866
FunctionTemplateSpecializationInfo *FSI
867
= FD->getTemplateSpecializationInfo();
868
if (FSI && !FSI->isExplicitSpecialization()) {
869
const TemplateParameterList* Params
870
= FSI->getTemplate()->getTemplateParameters();
871
const TemplateArgumentList* Args = FSI->TemplateArguments;
872
assert(Params->size() == Args->size());
873
for (unsigned i = 0, e = Params->size(); i != e; ++i) {
874
StringRef Param = Params->getParam(i)->getName();
875
if (Param.empty()) continue;
876
TOut << Param << " = ";
877
Args->get(i).print(Policy, TOut, /*IncludeType*/ true);
878
TOut << ", ";
879
}
880
}
881
882
TOut.flush();
883
if (!TemplateParams.empty()) {
884
// remove the trailing comma and space
885
TemplateParams.resize(TemplateParams.size() - 2);
886
POut << " [" << TemplateParams << "]";
887
}
888
889
POut.flush();
890
891
// Print "auto" for all deduced return types. This includes C++1y return
892
// type deduction and lambdas. For trailing return types resolve the
893
// decltype expression. Otherwise print the real type when this is
894
// not a constructor or destructor.
895
if (isa<CXXMethodDecl>(FD) &&
896
cast<CXXMethodDecl>(FD)->getParent()->isLambda())
897
Proto = "auto " + Proto;
898
else if (FT && FT->getReturnType()->getAs<DecltypeType>())
899
FT->getReturnType()
900
->getAs<DecltypeType>()
901
->getUnderlyingType()
902
.getAsStringInternal(Proto, Policy);
903
else if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD))
904
AFT->getReturnType().getAsStringInternal(Proto, Policy);
905
906
Out << Proto;
907
908
return std::string(Name);
909
}
910
if (const CapturedDecl *CD = dyn_cast<CapturedDecl>(CurrentDecl)) {
911
for (const DeclContext *DC = CD->getParent(); DC; DC = DC->getParent())
912
// Skip to its enclosing function or method, but not its enclosing
913
// CapturedDecl.
914
if (DC->isFunctionOrMethod() && (DC->getDeclKind() != Decl::Captured)) {
915
const Decl *D = Decl::castFromDeclContext(DC);
916
return ComputeName(IK, D);
917
}
918
llvm_unreachable("CapturedDecl not inside a function or method");
919
}
920
if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
921
SmallString<256> Name;
922
llvm::raw_svector_ostream Out(Name);
923
Out << (MD->isInstanceMethod() ? '-' : '+');
924
Out << '[';
925
926
// For incorrect code, there might not be an ObjCInterfaceDecl. Do
927
// a null check to avoid a crash.
928
if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
929
Out << *ID;
930
931
if (const ObjCCategoryImplDecl *CID =
932
dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
933
Out << '(' << *CID << ')';
934
935
Out << ' ';
936
MD->getSelector().print(Out);
937
Out << ']';
938
939
return std::string(Name);
940
}
941
if (isa<TranslationUnitDecl>(CurrentDecl) &&
942
IK == PredefinedIdentKind::PrettyFunction) {
943
// __PRETTY_FUNCTION__ -> "top level", the others produce an empty string.
944
return "top level";
945
}
946
return "";
947
}
948
949
void APNumericStorage::setIntValue(const ASTContext &C,
950
const llvm::APInt &Val) {
951
if (hasAllocation())
952
C.Deallocate(pVal);
953
954
BitWidth = Val.getBitWidth();
955
unsigned NumWords = Val.getNumWords();
956
const uint64_t* Words = Val.getRawData();
957
if (NumWords > 1) {
958
pVal = new (C) uint64_t[NumWords];
959
std::copy(Words, Words + NumWords, pVal);
960
} else if (NumWords == 1)
961
VAL = Words[0];
962
else
963
VAL = 0;
964
}
965
966
IntegerLiteral::IntegerLiteral(const ASTContext &C, const llvm::APInt &V,
967
QualType type, SourceLocation l)
968
: Expr(IntegerLiteralClass, type, VK_PRValue, OK_Ordinary), Loc(l) {
969
assert(type->isIntegerType() && "Illegal type in IntegerLiteral");
970
assert(V.getBitWidth() == C.getIntWidth(type) &&
971
"Integer type is not the correct size for constant.");
972
setValue(C, V);
973
setDependence(ExprDependence::None);
974
}
975
976
IntegerLiteral *
977
IntegerLiteral::Create(const ASTContext &C, const llvm::APInt &V,
978
QualType type, SourceLocation l) {
979
return new (C) IntegerLiteral(C, V, type, l);
980
}
981
982
IntegerLiteral *
983
IntegerLiteral::Create(const ASTContext &C, EmptyShell Empty) {
984
return new (C) IntegerLiteral(Empty);
985
}
986
987
FixedPointLiteral::FixedPointLiteral(const ASTContext &C, const llvm::APInt &V,
988
QualType type, SourceLocation l,
989
unsigned Scale)
990
: Expr(FixedPointLiteralClass, type, VK_PRValue, OK_Ordinary), Loc(l),
991
Scale(Scale) {
992
assert(type->isFixedPointType() && "Illegal type in FixedPointLiteral");
993
assert(V.getBitWidth() == C.getTypeInfo(type).Width &&
994
"Fixed point type is not the correct size for constant.");
995
setValue(C, V);
996
setDependence(ExprDependence::None);
997
}
998
999
FixedPointLiteral *FixedPointLiteral::CreateFromRawInt(const ASTContext &C,
1000
const llvm::APInt &V,
1001
QualType type,
1002
SourceLocation l,
1003
unsigned Scale) {
1004
return new (C) FixedPointLiteral(C, V, type, l, Scale);
1005
}
1006
1007
FixedPointLiteral *FixedPointLiteral::Create(const ASTContext &C,
1008
EmptyShell Empty) {
1009
return new (C) FixedPointLiteral(Empty);
1010
}
1011
1012
std::string FixedPointLiteral::getValueAsString(unsigned Radix) const {
1013
// Currently the longest decimal number that can be printed is the max for an
1014
// unsigned long _Accum: 4294967295.99999999976716935634613037109375
1015
// which is 43 characters.
1016
SmallString<64> S;
1017
FixedPointValueToString(
1018
S, llvm::APSInt::getUnsigned(getValue().getZExtValue()), Scale);
1019
return std::string(S);
1020
}
1021
1022
void CharacterLiteral::print(unsigned Val, CharacterLiteralKind Kind,
1023
raw_ostream &OS) {
1024
switch (Kind) {
1025
case CharacterLiteralKind::Ascii:
1026
break; // no prefix.
1027
case CharacterLiteralKind::Wide:
1028
OS << 'L';
1029
break;
1030
case CharacterLiteralKind::UTF8:
1031
OS << "u8";
1032
break;
1033
case CharacterLiteralKind::UTF16:
1034
OS << 'u';
1035
break;
1036
case CharacterLiteralKind::UTF32:
1037
OS << 'U';
1038
break;
1039
}
1040
1041
StringRef Escaped = escapeCStyle<EscapeChar::Single>(Val);
1042
if (!Escaped.empty()) {
1043
OS << "'" << Escaped << "'";
1044
} else {
1045
// A character literal might be sign-extended, which
1046
// would result in an invalid \U escape sequence.
1047
// FIXME: multicharacter literals such as '\xFF\xFF\xFF\xFF'
1048
// are not correctly handled.
1049
if ((Val & ~0xFFu) == ~0xFFu && Kind == CharacterLiteralKind::Ascii)
1050
Val &= 0xFFu;
1051
if (Val < 256 && isPrintable((unsigned char)Val))
1052
OS << "'" << (char)Val << "'";
1053
else if (Val < 256)
1054
OS << "'\\x" << llvm::format("%02x", Val) << "'";
1055
else if (Val <= 0xFFFF)
1056
OS << "'\\u" << llvm::format("%04x", Val) << "'";
1057
else
1058
OS << "'\\U" << llvm::format("%08x", Val) << "'";
1059
}
1060
}
1061
1062
FloatingLiteral::FloatingLiteral(const ASTContext &C, const llvm::APFloat &V,
1063
bool isexact, QualType Type, SourceLocation L)
1064
: Expr(FloatingLiteralClass, Type, VK_PRValue, OK_Ordinary), Loc(L) {
1065
setSemantics(V.getSemantics());
1066
FloatingLiteralBits.IsExact = isexact;
1067
setValue(C, V);
1068
setDependence(ExprDependence::None);
1069
}
1070
1071
FloatingLiteral::FloatingLiteral(const ASTContext &C, EmptyShell Empty)
1072
: Expr(FloatingLiteralClass, Empty) {
1073
setRawSemantics(llvm::APFloatBase::S_IEEEhalf);
1074
FloatingLiteralBits.IsExact = false;
1075
}
1076
1077
FloatingLiteral *
1078
FloatingLiteral::Create(const ASTContext &C, const llvm::APFloat &V,
1079
bool isexact, QualType Type, SourceLocation L) {
1080
return new (C) FloatingLiteral(C, V, isexact, Type, L);
1081
}
1082
1083
FloatingLiteral *
1084
FloatingLiteral::Create(const ASTContext &C, EmptyShell Empty) {
1085
return new (C) FloatingLiteral(C, Empty);
1086
}
1087
1088
/// getValueAsApproximateDouble - This returns the value as an inaccurate
1089
/// double. Note that this may cause loss of precision, but is useful for
1090
/// debugging dumps, etc.
1091
double FloatingLiteral::getValueAsApproximateDouble() const {
1092
llvm::APFloat V = getValue();
1093
bool ignored;
1094
V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
1095
&ignored);
1096
return V.convertToDouble();
1097
}
1098
1099
unsigned StringLiteral::mapCharByteWidth(TargetInfo const &Target,
1100
StringLiteralKind SK) {
1101
unsigned CharByteWidth = 0;
1102
switch (SK) {
1103
case StringLiteralKind::Ordinary:
1104
case StringLiteralKind::UTF8:
1105
CharByteWidth = Target.getCharWidth();
1106
break;
1107
case StringLiteralKind::Wide:
1108
CharByteWidth = Target.getWCharWidth();
1109
break;
1110
case StringLiteralKind::UTF16:
1111
CharByteWidth = Target.getChar16Width();
1112
break;
1113
case StringLiteralKind::UTF32:
1114
CharByteWidth = Target.getChar32Width();
1115
break;
1116
case StringLiteralKind::Unevaluated:
1117
return sizeof(char); // Host;
1118
}
1119
assert((CharByteWidth & 7) == 0 && "Assumes character size is byte multiple");
1120
CharByteWidth /= 8;
1121
assert((CharByteWidth == 1 || CharByteWidth == 2 || CharByteWidth == 4) &&
1122
"The only supported character byte widths are 1,2 and 4!");
1123
return CharByteWidth;
1124
}
1125
1126
StringLiteral::StringLiteral(const ASTContext &Ctx, StringRef Str,
1127
StringLiteralKind Kind, bool Pascal, QualType Ty,
1128
const SourceLocation *Loc,
1129
unsigned NumConcatenated)
1130
: Expr(StringLiteralClass, Ty, VK_LValue, OK_Ordinary) {
1131
1132
unsigned Length = Str.size();
1133
1134
StringLiteralBits.Kind = llvm::to_underlying(Kind);
1135
StringLiteralBits.NumConcatenated = NumConcatenated;
1136
1137
if (Kind != StringLiteralKind::Unevaluated) {
1138
assert(Ctx.getAsConstantArrayType(Ty) &&
1139
"StringLiteral must be of constant array type!");
1140
unsigned CharByteWidth = mapCharByteWidth(Ctx.getTargetInfo(), Kind);
1141
unsigned ByteLength = Str.size();
1142
assert((ByteLength % CharByteWidth == 0) &&
1143
"The size of the data must be a multiple of CharByteWidth!");
1144
1145
// Avoid the expensive division. The compiler should be able to figure it
1146
// out by itself. However as of clang 7, even with the appropriate
1147
// llvm_unreachable added just here, it is not able to do so.
1148
switch (CharByteWidth) {
1149
case 1:
1150
Length = ByteLength;
1151
break;
1152
case 2:
1153
Length = ByteLength / 2;
1154
break;
1155
case 4:
1156
Length = ByteLength / 4;
1157
break;
1158
default:
1159
llvm_unreachable("Unsupported character width!");
1160
}
1161
1162
StringLiteralBits.CharByteWidth = CharByteWidth;
1163
StringLiteralBits.IsPascal = Pascal;
1164
} else {
1165
assert(!Pascal && "Can't make an unevaluated Pascal string");
1166
StringLiteralBits.CharByteWidth = 1;
1167
StringLiteralBits.IsPascal = false;
1168
}
1169
1170
*getTrailingObjects<unsigned>() = Length;
1171
1172
// Initialize the trailing array of SourceLocation.
1173
// This is safe since SourceLocation is POD-like.
1174
std::memcpy(getTrailingObjects<SourceLocation>(), Loc,
1175
NumConcatenated * sizeof(SourceLocation));
1176
1177
// Initialize the trailing array of char holding the string data.
1178
std::memcpy(getTrailingObjects<char>(), Str.data(), Str.size());
1179
1180
setDependence(ExprDependence::None);
1181
}
1182
1183
StringLiteral::StringLiteral(EmptyShell Empty, unsigned NumConcatenated,
1184
unsigned Length, unsigned CharByteWidth)
1185
: Expr(StringLiteralClass, Empty) {
1186
StringLiteralBits.CharByteWidth = CharByteWidth;
1187
StringLiteralBits.NumConcatenated = NumConcatenated;
1188
*getTrailingObjects<unsigned>() = Length;
1189
}
1190
1191
StringLiteral *StringLiteral::Create(const ASTContext &Ctx, StringRef Str,
1192
StringLiteralKind Kind, bool Pascal,
1193
QualType Ty, const SourceLocation *Loc,
1194
unsigned NumConcatenated) {
1195
void *Mem = Ctx.Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1196
1, NumConcatenated, Str.size()),
1197
alignof(StringLiteral));
1198
return new (Mem)
1199
StringLiteral(Ctx, Str, Kind, Pascal, Ty, Loc, NumConcatenated);
1200
}
1201
1202
StringLiteral *StringLiteral::CreateEmpty(const ASTContext &Ctx,
1203
unsigned NumConcatenated,
1204
unsigned Length,
1205
unsigned CharByteWidth) {
1206
void *Mem = Ctx.Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1207
1, NumConcatenated, Length * CharByteWidth),
1208
alignof(StringLiteral));
1209
return new (Mem)
1210
StringLiteral(EmptyShell(), NumConcatenated, Length, CharByteWidth);
1211
}
1212
1213
void StringLiteral::outputString(raw_ostream &OS) const {
1214
switch (getKind()) {
1215
case StringLiteralKind::Unevaluated:
1216
case StringLiteralKind::Ordinary:
1217
break; // no prefix.
1218
case StringLiteralKind::Wide:
1219
OS << 'L';
1220
break;
1221
case StringLiteralKind::UTF8:
1222
OS << "u8";
1223
break;
1224
case StringLiteralKind::UTF16:
1225
OS << 'u';
1226
break;
1227
case StringLiteralKind::UTF32:
1228
OS << 'U';
1229
break;
1230
}
1231
OS << '"';
1232
static const char Hex[] = "0123456789ABCDEF";
1233
1234
unsigned LastSlashX = getLength();
1235
for (unsigned I = 0, N = getLength(); I != N; ++I) {
1236
uint32_t Char = getCodeUnit(I);
1237
StringRef Escaped = escapeCStyle<EscapeChar::Double>(Char);
1238
if (Escaped.empty()) {
1239
// FIXME: Convert UTF-8 back to codepoints before rendering.
1240
1241
// Convert UTF-16 surrogate pairs back to codepoints before rendering.
1242
// Leave invalid surrogates alone; we'll use \x for those.
1243
if (getKind() == StringLiteralKind::UTF16 && I != N - 1 &&
1244
Char >= 0xd800 && Char <= 0xdbff) {
1245
uint32_t Trail = getCodeUnit(I + 1);
1246
if (Trail >= 0xdc00 && Trail <= 0xdfff) {
1247
Char = 0x10000 + ((Char - 0xd800) << 10) + (Trail - 0xdc00);
1248
++I;
1249
}
1250
}
1251
1252
if (Char > 0xff) {
1253
// If this is a wide string, output characters over 0xff using \x
1254
// escapes. Otherwise, this is a UTF-16 or UTF-32 string, and Char is a
1255
// codepoint: use \x escapes for invalid codepoints.
1256
if (getKind() == StringLiteralKind::Wide ||
1257
(Char >= 0xd800 && Char <= 0xdfff) || Char >= 0x110000) {
1258
// FIXME: Is this the best way to print wchar_t?
1259
OS << "\\x";
1260
int Shift = 28;
1261
while ((Char >> Shift) == 0)
1262
Shift -= 4;
1263
for (/**/; Shift >= 0; Shift -= 4)
1264
OS << Hex[(Char >> Shift) & 15];
1265
LastSlashX = I;
1266
continue;
1267
}
1268
1269
if (Char > 0xffff)
1270
OS << "\\U00"
1271
<< Hex[(Char >> 20) & 15]
1272
<< Hex[(Char >> 16) & 15];
1273
else
1274
OS << "\\u";
1275
OS << Hex[(Char >> 12) & 15]
1276
<< Hex[(Char >> 8) & 15]
1277
<< Hex[(Char >> 4) & 15]
1278
<< Hex[(Char >> 0) & 15];
1279
continue;
1280
}
1281
1282
// If we used \x... for the previous character, and this character is a
1283
// hexadecimal digit, prevent it being slurped as part of the \x.
1284
if (LastSlashX + 1 == I) {
1285
switch (Char) {
1286
case '0': case '1': case '2': case '3': case '4':
1287
case '5': case '6': case '7': case '8': case '9':
1288
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
1289
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
1290
OS << "\"\"";
1291
}
1292
}
1293
1294
assert(Char <= 0xff &&
1295
"Characters above 0xff should already have been handled.");
1296
1297
if (isPrintable(Char))
1298
OS << (char)Char;
1299
else // Output anything hard as an octal escape.
1300
OS << '\\'
1301
<< (char)('0' + ((Char >> 6) & 7))
1302
<< (char)('0' + ((Char >> 3) & 7))
1303
<< (char)('0' + ((Char >> 0) & 7));
1304
} else {
1305
// Handle some common non-printable cases to make dumps prettier.
1306
OS << Escaped;
1307
}
1308
}
1309
OS << '"';
1310
}
1311
1312
/// getLocationOfByte - Return a source location that points to the specified
1313
/// byte of this string literal.
1314
///
1315
/// Strings are amazingly complex. They can be formed from multiple tokens and
1316
/// can have escape sequences in them in addition to the usual trigraph and
1317
/// escaped newline business. This routine handles this complexity.
1318
///
1319
/// The *StartToken sets the first token to be searched in this function and
1320
/// the *StartTokenByteOffset is the byte offset of the first token. Before
1321
/// returning, it updates the *StartToken to the TokNo of the token being found
1322
/// and sets *StartTokenByteOffset to the byte offset of the token in the
1323
/// string.
1324
/// Using these two parameters can reduce the time complexity from O(n^2) to
1325
/// O(n) if one wants to get the location of byte for all the tokens in a
1326
/// string.
1327
///
1328
SourceLocation
1329
StringLiteral::getLocationOfByte(unsigned ByteNo, const SourceManager &SM,
1330
const LangOptions &Features,
1331
const TargetInfo &Target, unsigned *StartToken,
1332
unsigned *StartTokenByteOffset) const {
1333
assert((getKind() == StringLiteralKind::Ordinary ||
1334
getKind() == StringLiteralKind::UTF8 ||
1335
getKind() == StringLiteralKind::Unevaluated) &&
1336
"Only narrow string literals are currently supported");
1337
1338
// Loop over all of the tokens in this string until we find the one that
1339
// contains the byte we're looking for.
1340
unsigned TokNo = 0;
1341
unsigned StringOffset = 0;
1342
if (StartToken)
1343
TokNo = *StartToken;
1344
if (StartTokenByteOffset) {
1345
StringOffset = *StartTokenByteOffset;
1346
ByteNo -= StringOffset;
1347
}
1348
while (true) {
1349
assert(TokNo < getNumConcatenated() && "Invalid byte number!");
1350
SourceLocation StrTokLoc = getStrTokenLoc(TokNo);
1351
1352
// Get the spelling of the string so that we can get the data that makes up
1353
// the string literal, not the identifier for the macro it is potentially
1354
// expanded through.
1355
SourceLocation StrTokSpellingLoc = SM.getSpellingLoc(StrTokLoc);
1356
1357
// Re-lex the token to get its length and original spelling.
1358
std::pair<FileID, unsigned> LocInfo =
1359
SM.getDecomposedLoc(StrTokSpellingLoc);
1360
bool Invalid = false;
1361
StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid);
1362
if (Invalid) {
1363
if (StartTokenByteOffset != nullptr)
1364
*StartTokenByteOffset = StringOffset;
1365
if (StartToken != nullptr)
1366
*StartToken = TokNo;
1367
return StrTokSpellingLoc;
1368
}
1369
1370
const char *StrData = Buffer.data()+LocInfo.second;
1371
1372
// Create a lexer starting at the beginning of this token.
1373
Lexer TheLexer(SM.getLocForStartOfFile(LocInfo.first), Features,
1374
Buffer.begin(), StrData, Buffer.end());
1375
Token TheTok;
1376
TheLexer.LexFromRawLexer(TheTok);
1377
1378
// Use the StringLiteralParser to compute the length of the string in bytes.
1379
StringLiteralParser SLP(TheTok, SM, Features, Target);
1380
unsigned TokNumBytes = SLP.GetStringLength();
1381
1382
// If the byte is in this token, return the location of the byte.
1383
if (ByteNo < TokNumBytes ||
1384
(ByteNo == TokNumBytes && TokNo == getNumConcatenated() - 1)) {
1385
unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo);
1386
1387
// Now that we know the offset of the token in the spelling, use the
1388
// preprocessor to get the offset in the original source.
1389
if (StartTokenByteOffset != nullptr)
1390
*StartTokenByteOffset = StringOffset;
1391
if (StartToken != nullptr)
1392
*StartToken = TokNo;
1393
return Lexer::AdvanceToTokenCharacter(StrTokLoc, Offset, SM, Features);
1394
}
1395
1396
// Move to the next string token.
1397
StringOffset += TokNumBytes;
1398
++TokNo;
1399
ByteNo -= TokNumBytes;
1400
}
1401
}
1402
1403
/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
1404
/// corresponds to, e.g. "sizeof" or "[pre]++".
1405
StringRef UnaryOperator::getOpcodeStr(Opcode Op) {
1406
switch (Op) {
1407
#define UNARY_OPERATION(Name, Spelling) case UO_##Name: return Spelling;
1408
#include "clang/AST/OperationKinds.def"
1409
}
1410
llvm_unreachable("Unknown unary operator");
1411
}
1412
1413
UnaryOperatorKind
1414
UnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) {
1415
switch (OO) {
1416
default: llvm_unreachable("No unary operator for overloaded function");
1417
case OO_PlusPlus: return Postfix ? UO_PostInc : UO_PreInc;
1418
case OO_MinusMinus: return Postfix ? UO_PostDec : UO_PreDec;
1419
case OO_Amp: return UO_AddrOf;
1420
case OO_Star: return UO_Deref;
1421
case OO_Plus: return UO_Plus;
1422
case OO_Minus: return UO_Minus;
1423
case OO_Tilde: return UO_Not;
1424
case OO_Exclaim: return UO_LNot;
1425
case OO_Coawait: return UO_Coawait;
1426
}
1427
}
1428
1429
OverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) {
1430
switch (Opc) {
1431
case UO_PostInc: case UO_PreInc: return OO_PlusPlus;
1432
case UO_PostDec: case UO_PreDec: return OO_MinusMinus;
1433
case UO_AddrOf: return OO_Amp;
1434
case UO_Deref: return OO_Star;
1435
case UO_Plus: return OO_Plus;
1436
case UO_Minus: return OO_Minus;
1437
case UO_Not: return OO_Tilde;
1438
case UO_LNot: return OO_Exclaim;
1439
case UO_Coawait: return OO_Coawait;
1440
default: return OO_None;
1441
}
1442
}
1443
1444
1445
//===----------------------------------------------------------------------===//
1446
// Postfix Operators.
1447
//===----------------------------------------------------------------------===//
1448
1449
CallExpr::CallExpr(StmtClass SC, Expr *Fn, ArrayRef<Expr *> PreArgs,
1450
ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
1451
SourceLocation RParenLoc, FPOptionsOverride FPFeatures,
1452
unsigned MinNumArgs, ADLCallKind UsesADL)
1453
: Expr(SC, Ty, VK, OK_Ordinary), RParenLoc(RParenLoc) {
1454
NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1455
unsigned NumPreArgs = PreArgs.size();
1456
CallExprBits.NumPreArgs = NumPreArgs;
1457
assert((NumPreArgs == getNumPreArgs()) && "NumPreArgs overflow!");
1458
1459
unsigned OffsetToTrailingObjects = offsetToTrailingObjects(SC);
1460
CallExprBits.OffsetToTrailingObjects = OffsetToTrailingObjects;
1461
assert((CallExprBits.OffsetToTrailingObjects == OffsetToTrailingObjects) &&
1462
"OffsetToTrailingObjects overflow!");
1463
1464
CallExprBits.UsesADL = static_cast<bool>(UsesADL);
1465
1466
setCallee(Fn);
1467
for (unsigned I = 0; I != NumPreArgs; ++I)
1468
setPreArg(I, PreArgs[I]);
1469
for (unsigned I = 0; I != Args.size(); ++I)
1470
setArg(I, Args[I]);
1471
for (unsigned I = Args.size(); I != NumArgs; ++I)
1472
setArg(I, nullptr);
1473
1474
this->computeDependence();
1475
1476
CallExprBits.HasFPFeatures = FPFeatures.requiresTrailingStorage();
1477
if (hasStoredFPFeatures())
1478
setStoredFPFeatures(FPFeatures);
1479
}
1480
1481
CallExpr::CallExpr(StmtClass SC, unsigned NumPreArgs, unsigned NumArgs,
1482
bool HasFPFeatures, EmptyShell Empty)
1483
: Expr(SC, Empty), NumArgs(NumArgs) {
1484
CallExprBits.NumPreArgs = NumPreArgs;
1485
assert((NumPreArgs == getNumPreArgs()) && "NumPreArgs overflow!");
1486
1487
unsigned OffsetToTrailingObjects = offsetToTrailingObjects(SC);
1488
CallExprBits.OffsetToTrailingObjects = OffsetToTrailingObjects;
1489
assert((CallExprBits.OffsetToTrailingObjects == OffsetToTrailingObjects) &&
1490
"OffsetToTrailingObjects overflow!");
1491
CallExprBits.HasFPFeatures = HasFPFeatures;
1492
}
1493
1494
CallExpr *CallExpr::Create(const ASTContext &Ctx, Expr *Fn,
1495
ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK,
1496
SourceLocation RParenLoc,
1497
FPOptionsOverride FPFeatures, unsigned MinNumArgs,
1498
ADLCallKind UsesADL) {
1499
unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1500
unsigned SizeOfTrailingObjects = CallExpr::sizeOfTrailingObjects(
1501
/*NumPreArgs=*/0, NumArgs, FPFeatures.requiresTrailingStorage());
1502
void *Mem =
1503
Ctx.Allocate(sizeof(CallExpr) + SizeOfTrailingObjects, alignof(CallExpr));
1504
return new (Mem) CallExpr(CallExprClass, Fn, /*PreArgs=*/{}, Args, Ty, VK,
1505
RParenLoc, FPFeatures, MinNumArgs, UsesADL);
1506
}
1507
1508
CallExpr *CallExpr::CreateTemporary(void *Mem, Expr *Fn, QualType Ty,
1509
ExprValueKind VK, SourceLocation RParenLoc,
1510
ADLCallKind UsesADL) {
1511
assert(!(reinterpret_cast<uintptr_t>(Mem) % alignof(CallExpr)) &&
1512
"Misaligned memory in CallExpr::CreateTemporary!");
1513
return new (Mem) CallExpr(CallExprClass, Fn, /*PreArgs=*/{}, /*Args=*/{}, Ty,
1514
VK, RParenLoc, FPOptionsOverride(),
1515
/*MinNumArgs=*/0, UsesADL);
1516
}
1517
1518
CallExpr *CallExpr::CreateEmpty(const ASTContext &Ctx, unsigned NumArgs,
1519
bool HasFPFeatures, EmptyShell Empty) {
1520
unsigned SizeOfTrailingObjects =
1521
CallExpr::sizeOfTrailingObjects(/*NumPreArgs=*/0, NumArgs, HasFPFeatures);
1522
void *Mem =
1523
Ctx.Allocate(sizeof(CallExpr) + SizeOfTrailingObjects, alignof(CallExpr));
1524
return new (Mem)
1525
CallExpr(CallExprClass, /*NumPreArgs=*/0, NumArgs, HasFPFeatures, Empty);
1526
}
1527
1528
unsigned CallExpr::offsetToTrailingObjects(StmtClass SC) {
1529
switch (SC) {
1530
case CallExprClass:
1531
return sizeof(CallExpr);
1532
case CXXOperatorCallExprClass:
1533
return sizeof(CXXOperatorCallExpr);
1534
case CXXMemberCallExprClass:
1535
return sizeof(CXXMemberCallExpr);
1536
case UserDefinedLiteralClass:
1537
return sizeof(UserDefinedLiteral);
1538
case CUDAKernelCallExprClass:
1539
return sizeof(CUDAKernelCallExpr);
1540
default:
1541
llvm_unreachable("unexpected class deriving from CallExpr!");
1542
}
1543
}
1544
1545
Decl *Expr::getReferencedDeclOfCallee() {
1546
Expr *CEE = IgnoreParenImpCasts();
1547
1548
while (auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(CEE))
1549
CEE = NTTP->getReplacement()->IgnoreParenImpCasts();
1550
1551
// If we're calling a dereference, look at the pointer instead.
1552
while (true) {
1553
if (auto *BO = dyn_cast<BinaryOperator>(CEE)) {
1554
if (BO->isPtrMemOp()) {
1555
CEE = BO->getRHS()->IgnoreParenImpCasts();
1556
continue;
1557
}
1558
} else if (auto *UO = dyn_cast<UnaryOperator>(CEE)) {
1559
if (UO->getOpcode() == UO_Deref || UO->getOpcode() == UO_AddrOf ||
1560
UO->getOpcode() == UO_Plus) {
1561
CEE = UO->getSubExpr()->IgnoreParenImpCasts();
1562
continue;
1563
}
1564
}
1565
break;
1566
}
1567
1568
if (auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1569
return DRE->getDecl();
1570
if (auto *ME = dyn_cast<MemberExpr>(CEE))
1571
return ME->getMemberDecl();
1572
if (auto *BE = dyn_cast<BlockExpr>(CEE))
1573
return BE->getBlockDecl();
1574
1575
return nullptr;
1576
}
1577
1578
/// If this is a call to a builtin, return the builtin ID. If not, return 0.
1579
unsigned CallExpr::getBuiltinCallee() const {
1580
const auto *FDecl = getDirectCallee();
1581
return FDecl ? FDecl->getBuiltinID() : 0;
1582
}
1583
1584
bool CallExpr::isUnevaluatedBuiltinCall(const ASTContext &Ctx) const {
1585
if (unsigned BI = getBuiltinCallee())
1586
return Ctx.BuiltinInfo.isUnevaluated(BI);
1587
return false;
1588
}
1589
1590
QualType CallExpr::getCallReturnType(const ASTContext &Ctx) const {
1591
const Expr *Callee = getCallee();
1592
QualType CalleeType = Callee->getType();
1593
if (const auto *FnTypePtr = CalleeType->getAs<PointerType>()) {
1594
CalleeType = FnTypePtr->getPointeeType();
1595
} else if (const auto *BPT = CalleeType->getAs<BlockPointerType>()) {
1596
CalleeType = BPT->getPointeeType();
1597
} else if (CalleeType->isSpecificPlaceholderType(BuiltinType::BoundMember)) {
1598
if (isa<CXXPseudoDestructorExpr>(Callee->IgnoreParens()))
1599
return Ctx.VoidTy;
1600
1601
if (isa<UnresolvedMemberExpr>(Callee->IgnoreParens()))
1602
return Ctx.DependentTy;
1603
1604
// This should never be overloaded and so should never return null.
1605
CalleeType = Expr::findBoundMemberType(Callee);
1606
assert(!CalleeType.isNull());
1607
} else if (CalleeType->isRecordType()) {
1608
// If the Callee is a record type, then it is a not-yet-resolved
1609
// dependent call to the call operator of that type.
1610
return Ctx.DependentTy;
1611
} else if (CalleeType->isDependentType() ||
1612
CalleeType->isSpecificPlaceholderType(BuiltinType::Overload)) {
1613
return Ctx.DependentTy;
1614
}
1615
1616
const FunctionType *FnType = CalleeType->castAs<FunctionType>();
1617
return FnType->getReturnType();
1618
}
1619
1620
const Attr *CallExpr::getUnusedResultAttr(const ASTContext &Ctx) const {
1621
// If the return type is a struct, union, or enum that is marked nodiscard,
1622
// then return the return type attribute.
1623
if (const TagDecl *TD = getCallReturnType(Ctx)->getAsTagDecl())
1624
if (const auto *A = TD->getAttr<WarnUnusedResultAttr>())
1625
return A;
1626
1627
for (const auto *TD = getCallReturnType(Ctx)->getAs<TypedefType>(); TD;
1628
TD = TD->desugar()->getAs<TypedefType>())
1629
if (const auto *A = TD->getDecl()->getAttr<WarnUnusedResultAttr>())
1630
return A;
1631
1632
// Otherwise, see if the callee is marked nodiscard and return that attribute
1633
// instead.
1634
const Decl *D = getCalleeDecl();
1635
return D ? D->getAttr<WarnUnusedResultAttr>() : nullptr;
1636
}
1637
1638
SourceLocation CallExpr::getBeginLoc() const {
1639
if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(this))
1640
return OCE->getBeginLoc();
1641
1642
SourceLocation begin = getCallee()->getBeginLoc();
1643
if (begin.isInvalid() && getNumArgs() > 0 && getArg(0))
1644
begin = getArg(0)->getBeginLoc();
1645
return begin;
1646
}
1647
SourceLocation CallExpr::getEndLoc() const {
1648
if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(this))
1649
return OCE->getEndLoc();
1650
1651
SourceLocation end = getRParenLoc();
1652
if (end.isInvalid() && getNumArgs() > 0 && getArg(getNumArgs() - 1))
1653
end = getArg(getNumArgs() - 1)->getEndLoc();
1654
return end;
1655
}
1656
1657
OffsetOfExpr *OffsetOfExpr::Create(const ASTContext &C, QualType type,
1658
SourceLocation OperatorLoc,
1659
TypeSourceInfo *tsi,
1660
ArrayRef<OffsetOfNode> comps,
1661
ArrayRef<Expr*> exprs,
1662
SourceLocation RParenLoc) {
1663
void *Mem = C.Allocate(
1664
totalSizeToAlloc<OffsetOfNode, Expr *>(comps.size(), exprs.size()));
1665
1666
return new (Mem) OffsetOfExpr(C, type, OperatorLoc, tsi, comps, exprs,
1667
RParenLoc);
1668
}
1669
1670
OffsetOfExpr *OffsetOfExpr::CreateEmpty(const ASTContext &C,
1671
unsigned numComps, unsigned numExprs) {
1672
void *Mem =
1673
C.Allocate(totalSizeToAlloc<OffsetOfNode, Expr *>(numComps, numExprs));
1674
return new (Mem) OffsetOfExpr(numComps, numExprs);
1675
}
1676
1677
OffsetOfExpr::OffsetOfExpr(const ASTContext &C, QualType type,
1678
SourceLocation OperatorLoc, TypeSourceInfo *tsi,
1679
ArrayRef<OffsetOfNode> comps, ArrayRef<Expr *> exprs,
1680
SourceLocation RParenLoc)
1681
: Expr(OffsetOfExprClass, type, VK_PRValue, OK_Ordinary),
1682
OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
1683
NumComps(comps.size()), NumExprs(exprs.size()) {
1684
for (unsigned i = 0; i != comps.size(); ++i)
1685
setComponent(i, comps[i]);
1686
for (unsigned i = 0; i != exprs.size(); ++i)
1687
setIndexExpr(i, exprs[i]);
1688
1689
setDependence(computeDependence(this));
1690
}
1691
1692
IdentifierInfo *OffsetOfNode::getFieldName() const {
1693
assert(getKind() == Field || getKind() == Identifier);
1694
if (getKind() == Field)
1695
return getField()->getIdentifier();
1696
1697
return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask);
1698
}
1699
1700
UnaryExprOrTypeTraitExpr::UnaryExprOrTypeTraitExpr(
1701
UnaryExprOrTypeTrait ExprKind, Expr *E, QualType resultType,
1702
SourceLocation op, SourceLocation rp)
1703
: Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_PRValue, OK_Ordinary),
1704
OpLoc(op), RParenLoc(rp) {
1705
assert(ExprKind <= UETT_Last && "invalid enum value!");
1706
UnaryExprOrTypeTraitExprBits.Kind = ExprKind;
1707
assert(static_cast<unsigned>(ExprKind) == UnaryExprOrTypeTraitExprBits.Kind &&
1708
"UnaryExprOrTypeTraitExprBits.Kind overflow!");
1709
UnaryExprOrTypeTraitExprBits.IsType = false;
1710
Argument.Ex = E;
1711
setDependence(computeDependence(this));
1712
}
1713
1714
MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
1715
NestedNameSpecifierLoc QualifierLoc,
1716
SourceLocation TemplateKWLoc, ValueDecl *MemberDecl,
1717
DeclAccessPair FoundDecl,
1718
const DeclarationNameInfo &NameInfo,
1719
const TemplateArgumentListInfo *TemplateArgs, QualType T,
1720
ExprValueKind VK, ExprObjectKind OK,
1721
NonOdrUseReason NOUR)
1722
: Expr(MemberExprClass, T, VK, OK), Base(Base), MemberDecl(MemberDecl),
1723
MemberDNLoc(NameInfo.getInfo()), MemberLoc(NameInfo.getLoc()) {
1724
assert(!NameInfo.getName() ||
1725
MemberDecl->getDeclName() == NameInfo.getName());
1726
MemberExprBits.IsArrow = IsArrow;
1727
MemberExprBits.HasQualifier = QualifierLoc.hasQualifier();
1728
MemberExprBits.HasFoundDecl =
1729
FoundDecl.getDecl() != MemberDecl ||
1730
FoundDecl.getAccess() != MemberDecl->getAccess();
1731
MemberExprBits.HasTemplateKWAndArgsInfo =
1732
TemplateArgs || TemplateKWLoc.isValid();
1733
MemberExprBits.HadMultipleCandidates = false;
1734
MemberExprBits.NonOdrUseReason = NOUR;
1735
MemberExprBits.OperatorLoc = OperatorLoc;
1736
1737
if (hasQualifier())
1738
new (getTrailingObjects<NestedNameSpecifierLoc>())
1739
NestedNameSpecifierLoc(QualifierLoc);
1740
if (hasFoundDecl())
1741
*getTrailingObjects<DeclAccessPair>() = FoundDecl;
1742
if (TemplateArgs) {
1743
auto Deps = TemplateArgumentDependence::None;
1744
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1745
TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1746
Deps);
1747
} else if (TemplateKWLoc.isValid()) {
1748
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1749
TemplateKWLoc);
1750
}
1751
setDependence(computeDependence(this));
1752
}
1753
1754
MemberExpr *MemberExpr::Create(
1755
const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
1756
NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
1757
ValueDecl *MemberDecl, DeclAccessPair FoundDecl,
1758
DeclarationNameInfo NameInfo, const TemplateArgumentListInfo *TemplateArgs,
1759
QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR) {
1760
bool HasQualifier = QualifierLoc.hasQualifier();
1761
bool HasFoundDecl = FoundDecl.getDecl() != MemberDecl ||
1762
FoundDecl.getAccess() != MemberDecl->getAccess();
1763
bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid();
1764
std::size_t Size =
1765
totalSizeToAlloc<NestedNameSpecifierLoc, DeclAccessPair,
1766
ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1767
HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1768
TemplateArgs ? TemplateArgs->size() : 0);
1769
1770
void *Mem = C.Allocate(Size, alignof(MemberExpr));
1771
return new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, QualifierLoc,
1772
TemplateKWLoc, MemberDecl, FoundDecl, NameInfo,
1773
TemplateArgs, T, VK, OK, NOUR);
1774
}
1775
1776
MemberExpr *MemberExpr::CreateEmpty(const ASTContext &Context,
1777
bool HasQualifier, bool HasFoundDecl,
1778
bool HasTemplateKWAndArgsInfo,
1779
unsigned NumTemplateArgs) {
1780
assert((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
1781
"template args but no template arg info?");
1782
std::size_t Size =
1783
totalSizeToAlloc<NestedNameSpecifierLoc, DeclAccessPair,
1784
ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
1785
HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1786
NumTemplateArgs);
1787
void *Mem = Context.Allocate(Size, alignof(MemberExpr));
1788
return new (Mem) MemberExpr(EmptyShell());
1789
}
1790
1791
void MemberExpr::setMemberDecl(ValueDecl *NewD) {
1792
MemberDecl = NewD;
1793
if (getType()->isUndeducedType())
1794
setType(NewD->getType());
1795
setDependence(computeDependence(this));
1796
}
1797
1798
SourceLocation MemberExpr::getBeginLoc() const {
1799
if (isImplicitAccess()) {
1800
if (hasQualifier())
1801
return getQualifierLoc().getBeginLoc();
1802
return MemberLoc;
1803
}
1804
1805
// FIXME: We don't want this to happen. Rather, we should be able to
1806
// detect all kinds of implicit accesses more cleanly.
1807
SourceLocation BaseStartLoc = getBase()->getBeginLoc();
1808
if (BaseStartLoc.isValid())
1809
return BaseStartLoc;
1810
return MemberLoc;
1811
}
1812
SourceLocation MemberExpr::getEndLoc() const {
1813
SourceLocation EndLoc = getMemberNameInfo().getEndLoc();
1814
if (hasExplicitTemplateArgs())
1815
EndLoc = getRAngleLoc();
1816
else if (EndLoc.isInvalid())
1817
EndLoc = getBase()->getEndLoc();
1818
return EndLoc;
1819
}
1820
1821
bool CastExpr::CastConsistency() const {
1822
switch (getCastKind()) {
1823
case CK_DerivedToBase:
1824
case CK_UncheckedDerivedToBase:
1825
case CK_DerivedToBaseMemberPointer:
1826
case CK_BaseToDerived:
1827
case CK_BaseToDerivedMemberPointer:
1828
assert(!path_empty() && "Cast kind should have a base path!");
1829
break;
1830
1831
case CK_CPointerToObjCPointerCast:
1832
assert(getType()->isObjCObjectPointerType());
1833
assert(getSubExpr()->getType()->isPointerType());
1834
goto CheckNoBasePath;
1835
1836
case CK_BlockPointerToObjCPointerCast:
1837
assert(getType()->isObjCObjectPointerType());
1838
assert(getSubExpr()->getType()->isBlockPointerType());
1839
goto CheckNoBasePath;
1840
1841
case CK_ReinterpretMemberPointer:
1842
assert(getType()->isMemberPointerType());
1843
assert(getSubExpr()->getType()->isMemberPointerType());
1844
goto CheckNoBasePath;
1845
1846
case CK_BitCast:
1847
// Arbitrary casts to C pointer types count as bitcasts.
1848
// Otherwise, we should only have block and ObjC pointer casts
1849
// here if they stay within the type kind.
1850
if (!getType()->isPointerType()) {
1851
assert(getType()->isObjCObjectPointerType() ==
1852
getSubExpr()->getType()->isObjCObjectPointerType());
1853
assert(getType()->isBlockPointerType() ==
1854
getSubExpr()->getType()->isBlockPointerType());
1855
}
1856
goto CheckNoBasePath;
1857
1858
case CK_AnyPointerToBlockPointerCast:
1859
assert(getType()->isBlockPointerType());
1860
assert(getSubExpr()->getType()->isAnyPointerType() &&
1861
!getSubExpr()->getType()->isBlockPointerType());
1862
goto CheckNoBasePath;
1863
1864
case CK_CopyAndAutoreleaseBlockObject:
1865
assert(getType()->isBlockPointerType());
1866
assert(getSubExpr()->getType()->isBlockPointerType());
1867
goto CheckNoBasePath;
1868
1869
case CK_FunctionToPointerDecay:
1870
assert(getType()->isPointerType());
1871
assert(getSubExpr()->getType()->isFunctionType());
1872
goto CheckNoBasePath;
1873
1874
case CK_AddressSpaceConversion: {
1875
auto Ty = getType();
1876
auto SETy = getSubExpr()->getType();
1877
assert(getValueKindForType(Ty) == Expr::getValueKindForType(SETy));
1878
if (isPRValue() && !Ty->isDependentType() && !SETy->isDependentType()) {
1879
Ty = Ty->getPointeeType();
1880
SETy = SETy->getPointeeType();
1881
}
1882
assert((Ty->isDependentType() || SETy->isDependentType()) ||
1883
(!Ty.isNull() && !SETy.isNull() &&
1884
Ty.getAddressSpace() != SETy.getAddressSpace()));
1885
goto CheckNoBasePath;
1886
}
1887
// These should not have an inheritance path.
1888
case CK_Dynamic:
1889
case CK_ToUnion:
1890
case CK_ArrayToPointerDecay:
1891
case CK_NullToMemberPointer:
1892
case CK_NullToPointer:
1893
case CK_ConstructorConversion:
1894
case CK_IntegralToPointer:
1895
case CK_PointerToIntegral:
1896
case CK_ToVoid:
1897
case CK_VectorSplat:
1898
case CK_IntegralCast:
1899
case CK_BooleanToSignedIntegral:
1900
case CK_IntegralToFloating:
1901
case CK_FloatingToIntegral:
1902
case CK_FloatingCast:
1903
case CK_ObjCObjectLValueCast:
1904
case CK_FloatingRealToComplex:
1905
case CK_FloatingComplexToReal:
1906
case CK_FloatingComplexCast:
1907
case CK_FloatingComplexToIntegralComplex:
1908
case CK_IntegralRealToComplex:
1909
case CK_IntegralComplexToReal:
1910
case CK_IntegralComplexCast:
1911
case CK_IntegralComplexToFloatingComplex:
1912
case CK_ARCProduceObject:
1913
case CK_ARCConsumeObject:
1914
case CK_ARCReclaimReturnedObject:
1915
case CK_ARCExtendBlockObject:
1916
case CK_ZeroToOCLOpaqueType:
1917
case CK_IntToOCLSampler:
1918
case CK_FloatingToFixedPoint:
1919
case CK_FixedPointToFloating:
1920
case CK_FixedPointCast:
1921
case CK_FixedPointToIntegral:
1922
case CK_IntegralToFixedPoint:
1923
case CK_MatrixCast:
1924
case CK_HLSLVectorTruncation:
1925
assert(!getType()->isBooleanType() && "unheralded conversion to bool");
1926
goto CheckNoBasePath;
1927
1928
case CK_Dependent:
1929
case CK_LValueToRValue:
1930
case CK_NoOp:
1931
case CK_AtomicToNonAtomic:
1932
case CK_NonAtomicToAtomic:
1933
case CK_PointerToBoolean:
1934
case CK_IntegralToBoolean:
1935
case CK_FloatingToBoolean:
1936
case CK_MemberPointerToBoolean:
1937
case CK_FloatingComplexToBoolean:
1938
case CK_IntegralComplexToBoolean:
1939
case CK_LValueBitCast: // -> bool&
1940
case CK_LValueToRValueBitCast:
1941
case CK_UserDefinedConversion: // operator bool()
1942
case CK_BuiltinFnToFnPtr:
1943
case CK_FixedPointToBoolean:
1944
case CK_HLSLArrayRValue:
1945
CheckNoBasePath:
1946
assert(path_empty() && "Cast kind should not have a base path!");
1947
break;
1948
}
1949
return true;
1950
}
1951
1952
const char *CastExpr::getCastKindName(CastKind CK) {
1953
switch (CK) {
1954
#define CAST_OPERATION(Name) case CK_##Name: return #Name;
1955
#include "clang/AST/OperationKinds.def"
1956
}
1957
llvm_unreachable("Unhandled cast kind!");
1958
}
1959
1960
namespace {
1961
// Skip over implicit nodes produced as part of semantic analysis.
1962
// Designed for use with IgnoreExprNodes.
1963
static Expr *ignoreImplicitSemaNodes(Expr *E) {
1964
if (auto *Materialize = dyn_cast<MaterializeTemporaryExpr>(E))
1965
return Materialize->getSubExpr();
1966
1967
if (auto *Binder = dyn_cast<CXXBindTemporaryExpr>(E))
1968
return Binder->getSubExpr();
1969
1970
if (auto *Full = dyn_cast<FullExpr>(E))
1971
return Full->getSubExpr();
1972
1973
if (auto *CPLIE = dyn_cast<CXXParenListInitExpr>(E);
1974
CPLIE && CPLIE->getInitExprs().size() == 1)
1975
return CPLIE->getInitExprs()[0];
1976
1977
return E;
1978
}
1979
} // namespace
1980
1981
Expr *CastExpr::getSubExprAsWritten() {
1982
const Expr *SubExpr = nullptr;
1983
1984
for (const CastExpr *E = this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
1985
SubExpr = IgnoreExprNodes(E->getSubExpr(), ignoreImplicitSemaNodes);
1986
1987
// Conversions by constructor and conversion functions have a
1988
// subexpression describing the call; strip it off.
1989
if (E->getCastKind() == CK_ConstructorConversion) {
1990
SubExpr = IgnoreExprNodes(cast<CXXConstructExpr>(SubExpr)->getArg(0),
1991
ignoreImplicitSemaNodes);
1992
} else if (E->getCastKind() == CK_UserDefinedConversion) {
1993
assert((isa<CXXMemberCallExpr>(SubExpr) || isa<BlockExpr>(SubExpr)) &&
1994
"Unexpected SubExpr for CK_UserDefinedConversion.");
1995
if (auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
1996
SubExpr = MCE->getImplicitObjectArgument();
1997
}
1998
}
1999
2000
return const_cast<Expr *>(SubExpr);
2001
}
2002
2003
NamedDecl *CastExpr::getConversionFunction() const {
2004
const Expr *SubExpr = nullptr;
2005
2006
for (const CastExpr *E = this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
2007
SubExpr = IgnoreExprNodes(E->getSubExpr(), ignoreImplicitSemaNodes);
2008
2009
if (E->getCastKind() == CK_ConstructorConversion)
2010
return cast<CXXConstructExpr>(SubExpr)->getConstructor();
2011
2012
if (E->getCastKind() == CK_UserDefinedConversion) {
2013
if (auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2014
return MCE->getMethodDecl();
2015
}
2016
}
2017
2018
return nullptr;
2019
}
2020
2021
CXXBaseSpecifier **CastExpr::path_buffer() {
2022
switch (getStmtClass()) {
2023
#define ABSTRACT_STMT(x)
2024
#define CASTEXPR(Type, Base) \
2025
case Stmt::Type##Class: \
2026
return static_cast<Type *>(this)->getTrailingObjects<CXXBaseSpecifier *>();
2027
#define STMT(Type, Base)
2028
#include "clang/AST/StmtNodes.inc"
2029
default:
2030
llvm_unreachable("non-cast expressions not possible here");
2031
}
2032
}
2033
2034
const FieldDecl *CastExpr::getTargetFieldForToUnionCast(QualType unionType,
2035
QualType opType) {
2036
auto RD = unionType->castAs<RecordType>()->getDecl();
2037
return getTargetFieldForToUnionCast(RD, opType);
2038
}
2039
2040
const FieldDecl *CastExpr::getTargetFieldForToUnionCast(const RecordDecl *RD,
2041
QualType OpType) {
2042
auto &Ctx = RD->getASTContext();
2043
RecordDecl::field_iterator Field, FieldEnd;
2044
for (Field = RD->field_begin(), FieldEnd = RD->field_end();
2045
Field != FieldEnd; ++Field) {
2046
if (Ctx.hasSameUnqualifiedType(Field->getType(), OpType) &&
2047
!Field->isUnnamedBitField()) {
2048
return *Field;
2049
}
2050
}
2051
return nullptr;
2052
}
2053
2054
FPOptionsOverride *CastExpr::getTrailingFPFeatures() {
2055
assert(hasStoredFPFeatures());
2056
switch (getStmtClass()) {
2057
case ImplicitCastExprClass:
2058
return static_cast<ImplicitCastExpr *>(this)
2059
->getTrailingObjects<FPOptionsOverride>();
2060
case CStyleCastExprClass:
2061
return static_cast<CStyleCastExpr *>(this)
2062
->getTrailingObjects<FPOptionsOverride>();
2063
case CXXFunctionalCastExprClass:
2064
return static_cast<CXXFunctionalCastExpr *>(this)
2065
->getTrailingObjects<FPOptionsOverride>();
2066
case CXXStaticCastExprClass:
2067
return static_cast<CXXStaticCastExpr *>(this)
2068
->getTrailingObjects<FPOptionsOverride>();
2069
default:
2070
llvm_unreachable("Cast does not have FPFeatures");
2071
}
2072
}
2073
2074
ImplicitCastExpr *ImplicitCastExpr::Create(const ASTContext &C, QualType T,
2075
CastKind Kind, Expr *Operand,
2076
const CXXCastPath *BasePath,
2077
ExprValueKind VK,
2078
FPOptionsOverride FPO) {
2079
unsigned PathSize = (BasePath ? BasePath->size() : 0);
2080
void *Buffer =
2081
C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2082
PathSize, FPO.requiresTrailingStorage()));
2083
// Per C++ [conv.lval]p3, lvalue-to-rvalue conversions on class and
2084
// std::nullptr_t have special semantics not captured by CK_LValueToRValue.
2085
assert((Kind != CK_LValueToRValue ||
2086
!(T->isNullPtrType() || T->getAsCXXRecordDecl())) &&
2087
"invalid type for lvalue-to-rvalue conversion");
2088
ImplicitCastExpr *E =
2089
new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, FPO, VK);
2090
if (PathSize)
2091
std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
2092
E->getTrailingObjects<CXXBaseSpecifier *>());
2093
return E;
2094
}
2095
2096
ImplicitCastExpr *ImplicitCastExpr::CreateEmpty(const ASTContext &C,
2097
unsigned PathSize,
2098
bool HasFPFeatures) {
2099
void *Buffer =
2100
C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2101
PathSize, HasFPFeatures));
2102
return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize, HasFPFeatures);
2103
}
2104
2105
CStyleCastExpr *CStyleCastExpr::Create(const ASTContext &C, QualType T,
2106
ExprValueKind VK, CastKind K, Expr *Op,
2107
const CXXCastPath *BasePath,
2108
FPOptionsOverride FPO,
2109
TypeSourceInfo *WrittenTy,
2110
SourceLocation L, SourceLocation R) {
2111
unsigned PathSize = (BasePath ? BasePath->size() : 0);
2112
void *Buffer =
2113
C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2114
PathSize, FPO.requiresTrailingStorage()));
2115
CStyleCastExpr *E =
2116
new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, FPO, WrittenTy, L, R);
2117
if (PathSize)
2118
std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
2119
E->getTrailingObjects<CXXBaseSpecifier *>());
2120
return E;
2121
}
2122
2123
CStyleCastExpr *CStyleCastExpr::CreateEmpty(const ASTContext &C,
2124
unsigned PathSize,
2125
bool HasFPFeatures) {
2126
void *Buffer =
2127
C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2128
PathSize, HasFPFeatures));
2129
return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize, HasFPFeatures);
2130
}
2131
2132
/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
2133
/// corresponds to, e.g. "<<=".
2134
StringRef BinaryOperator::getOpcodeStr(Opcode Op) {
2135
switch (Op) {
2136
#define BINARY_OPERATION(Name, Spelling) case BO_##Name: return Spelling;
2137
#include "clang/AST/OperationKinds.def"
2138
}
2139
llvm_unreachable("Invalid OpCode!");
2140
}
2141
2142
BinaryOperatorKind
2143
BinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) {
2144
switch (OO) {
2145
default: llvm_unreachable("Not an overloadable binary operator");
2146
case OO_Plus: return BO_Add;
2147
case OO_Minus: return BO_Sub;
2148
case OO_Star: return BO_Mul;
2149
case OO_Slash: return BO_Div;
2150
case OO_Percent: return BO_Rem;
2151
case OO_Caret: return BO_Xor;
2152
case OO_Amp: return BO_And;
2153
case OO_Pipe: return BO_Or;
2154
case OO_Equal: return BO_Assign;
2155
case OO_Spaceship: return BO_Cmp;
2156
case OO_Less: return BO_LT;
2157
case OO_Greater: return BO_GT;
2158
case OO_PlusEqual: return BO_AddAssign;
2159
case OO_MinusEqual: return BO_SubAssign;
2160
case OO_StarEqual: return BO_MulAssign;
2161
case OO_SlashEqual: return BO_DivAssign;
2162
case OO_PercentEqual: return BO_RemAssign;
2163
case OO_CaretEqual: return BO_XorAssign;
2164
case OO_AmpEqual: return BO_AndAssign;
2165
case OO_PipeEqual: return BO_OrAssign;
2166
case OO_LessLess: return BO_Shl;
2167
case OO_GreaterGreater: return BO_Shr;
2168
case OO_LessLessEqual: return BO_ShlAssign;
2169
case OO_GreaterGreaterEqual: return BO_ShrAssign;
2170
case OO_EqualEqual: return BO_EQ;
2171
case OO_ExclaimEqual: return BO_NE;
2172
case OO_LessEqual: return BO_LE;
2173
case OO_GreaterEqual: return BO_GE;
2174
case OO_AmpAmp: return BO_LAnd;
2175
case OO_PipePipe: return BO_LOr;
2176
case OO_Comma: return BO_Comma;
2177
case OO_ArrowStar: return BO_PtrMemI;
2178
}
2179
}
2180
2181
OverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) {
2182
static const OverloadedOperatorKind OverOps[] = {
2183
/* .* Cannot be overloaded */OO_None, OO_ArrowStar,
2184
OO_Star, OO_Slash, OO_Percent,
2185
OO_Plus, OO_Minus,
2186
OO_LessLess, OO_GreaterGreater,
2187
OO_Spaceship,
2188
OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
2189
OO_EqualEqual, OO_ExclaimEqual,
2190
OO_Amp,
2191
OO_Caret,
2192
OO_Pipe,
2193
OO_AmpAmp,
2194
OO_PipePipe,
2195
OO_Equal, OO_StarEqual,
2196
OO_SlashEqual, OO_PercentEqual,
2197
OO_PlusEqual, OO_MinusEqual,
2198
OO_LessLessEqual, OO_GreaterGreaterEqual,
2199
OO_AmpEqual, OO_CaretEqual,
2200
OO_PipeEqual,
2201
OO_Comma
2202
};
2203
return OverOps[Opc];
2204
}
2205
2206
bool BinaryOperator::isNullPointerArithmeticExtension(ASTContext &Ctx,
2207
Opcode Opc,
2208
const Expr *LHS,
2209
const Expr *RHS) {
2210
if (Opc != BO_Add)
2211
return false;
2212
2213
// Check that we have one pointer and one integer operand.
2214
const Expr *PExp;
2215
if (LHS->getType()->isPointerType()) {
2216
if (!RHS->getType()->isIntegerType())
2217
return false;
2218
PExp = LHS;
2219
} else if (RHS->getType()->isPointerType()) {
2220
if (!LHS->getType()->isIntegerType())
2221
return false;
2222
PExp = RHS;
2223
} else {
2224
return false;
2225
}
2226
2227
// Check that the pointer is a nullptr.
2228
if (!PExp->IgnoreParenCasts()
2229
->isNullPointerConstant(Ctx, Expr::NPC_ValueDependentIsNotNull))
2230
return false;
2231
2232
// Check that the pointee type is char-sized.
2233
const PointerType *PTy = PExp->getType()->getAs<PointerType>();
2234
if (!PTy || !PTy->getPointeeType()->isCharType())
2235
return false;
2236
2237
return true;
2238
}
2239
2240
SourceLocExpr::SourceLocExpr(const ASTContext &Ctx, SourceLocIdentKind Kind,
2241
QualType ResultTy, SourceLocation BLoc,
2242
SourceLocation RParenLoc,
2243
DeclContext *ParentContext)
2244
: Expr(SourceLocExprClass, ResultTy, VK_PRValue, OK_Ordinary),
2245
BuiltinLoc(BLoc), RParenLoc(RParenLoc), ParentContext(ParentContext) {
2246
SourceLocExprBits.Kind = llvm::to_underlying(Kind);
2247
// In dependent contexts, function names may change.
2248
setDependence(MayBeDependent(Kind) && ParentContext->isDependentContext()
2249
? ExprDependence::Value
2250
: ExprDependence::None);
2251
}
2252
2253
StringRef SourceLocExpr::getBuiltinStr() const {
2254
switch (getIdentKind()) {
2255
case SourceLocIdentKind::File:
2256
return "__builtin_FILE";
2257
case SourceLocIdentKind::FileName:
2258
return "__builtin_FILE_NAME";
2259
case SourceLocIdentKind::Function:
2260
return "__builtin_FUNCTION";
2261
case SourceLocIdentKind::FuncSig:
2262
return "__builtin_FUNCSIG";
2263
case SourceLocIdentKind::Line:
2264
return "__builtin_LINE";
2265
case SourceLocIdentKind::Column:
2266
return "__builtin_COLUMN";
2267
case SourceLocIdentKind::SourceLocStruct:
2268
return "__builtin_source_location";
2269
}
2270
llvm_unreachable("unexpected IdentKind!");
2271
}
2272
2273
APValue SourceLocExpr::EvaluateInContext(const ASTContext &Ctx,
2274
const Expr *DefaultExpr) const {
2275
SourceLocation Loc;
2276
const DeclContext *Context;
2277
2278
if (const auto *DIE = dyn_cast_if_present<CXXDefaultInitExpr>(DefaultExpr)) {
2279
Loc = DIE->getUsedLocation();
2280
Context = DIE->getUsedContext();
2281
} else if (const auto *DAE =
2282
dyn_cast_if_present<CXXDefaultArgExpr>(DefaultExpr)) {
2283
Loc = DAE->getUsedLocation();
2284
Context = DAE->getUsedContext();
2285
} else {
2286
Loc = getLocation();
2287
Context = getParentContext();
2288
}
2289
2290
PresumedLoc PLoc = Ctx.getSourceManager().getPresumedLoc(
2291
Ctx.getSourceManager().getExpansionRange(Loc).getEnd());
2292
2293
auto MakeStringLiteral = [&](StringRef Tmp) {
2294
using LValuePathEntry = APValue::LValuePathEntry;
2295
StringLiteral *Res = Ctx.getPredefinedStringLiteralFromCache(Tmp);
2296
// Decay the string to a pointer to the first character.
2297
LValuePathEntry Path[1] = {LValuePathEntry::ArrayIndex(0)};
2298
return APValue(Res, CharUnits::Zero(), Path, /*OnePastTheEnd=*/false);
2299
};
2300
2301
switch (getIdentKind()) {
2302
case SourceLocIdentKind::FileName: {
2303
// __builtin_FILE_NAME() is a Clang-specific extension that expands to the
2304
// the last part of __builtin_FILE().
2305
SmallString<256> FileName;
2306
clang::Preprocessor::processPathToFileName(
2307
FileName, PLoc, Ctx.getLangOpts(), Ctx.getTargetInfo());
2308
return MakeStringLiteral(FileName);
2309
}
2310
case SourceLocIdentKind::File: {
2311
SmallString<256> Path(PLoc.getFilename());
2312
clang::Preprocessor::processPathForFileMacro(Path, Ctx.getLangOpts(),
2313
Ctx.getTargetInfo());
2314
return MakeStringLiteral(Path);
2315
}
2316
case SourceLocIdentKind::Function:
2317
case SourceLocIdentKind::FuncSig: {
2318
const auto *CurDecl = dyn_cast<Decl>(Context);
2319
const auto Kind = getIdentKind() == SourceLocIdentKind::Function
2320
? PredefinedIdentKind::Function
2321
: PredefinedIdentKind::FuncSig;
2322
return MakeStringLiteral(
2323
CurDecl ? PredefinedExpr::ComputeName(Kind, CurDecl) : std::string(""));
2324
}
2325
case SourceLocIdentKind::Line:
2326
return APValue(Ctx.MakeIntValue(PLoc.getLine(), Ctx.UnsignedIntTy));
2327
case SourceLocIdentKind::Column:
2328
return APValue(Ctx.MakeIntValue(PLoc.getColumn(), Ctx.UnsignedIntTy));
2329
case SourceLocIdentKind::SourceLocStruct: {
2330
// Fill in a std::source_location::__impl structure, by creating an
2331
// artificial file-scoped CompoundLiteralExpr, and returning a pointer to
2332
// that.
2333
const CXXRecordDecl *ImplDecl = getType()->getPointeeCXXRecordDecl();
2334
assert(ImplDecl);
2335
2336
// Construct an APValue for the __impl struct, and get or create a Decl
2337
// corresponding to that. Note that we've already verified that the shape of
2338
// the ImplDecl type is as expected.
2339
2340
APValue Value(APValue::UninitStruct(), 0, 4);
2341
for (const FieldDecl *F : ImplDecl->fields()) {
2342
StringRef Name = F->getName();
2343
if (Name == "_M_file_name") {
2344
SmallString<256> Path(PLoc.getFilename());
2345
clang::Preprocessor::processPathForFileMacro(Path, Ctx.getLangOpts(),
2346
Ctx.getTargetInfo());
2347
Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(Path);
2348
} else if (Name == "_M_function_name") {
2349
// Note: this emits the PrettyFunction name -- different than what
2350
// __builtin_FUNCTION() above returns!
2351
const auto *CurDecl = dyn_cast<Decl>(Context);
2352
Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(
2353
CurDecl && !isa<TranslationUnitDecl>(CurDecl)
2354
? StringRef(PredefinedExpr::ComputeName(
2355
PredefinedIdentKind::PrettyFunction, CurDecl))
2356
: "");
2357
} else if (Name == "_M_line") {
2358
llvm::APSInt IntVal = Ctx.MakeIntValue(PLoc.getLine(), F->getType());
2359
Value.getStructField(F->getFieldIndex()) = APValue(IntVal);
2360
} else if (Name == "_M_column") {
2361
llvm::APSInt IntVal = Ctx.MakeIntValue(PLoc.getColumn(), F->getType());
2362
Value.getStructField(F->getFieldIndex()) = APValue(IntVal);
2363
}
2364
}
2365
2366
UnnamedGlobalConstantDecl *GV =
2367
Ctx.getUnnamedGlobalConstantDecl(getType()->getPointeeType(), Value);
2368
2369
return APValue(GV, CharUnits::Zero(), ArrayRef<APValue::LValuePathEntry>{},
2370
false);
2371
}
2372
}
2373
llvm_unreachable("unhandled case");
2374
}
2375
2376
EmbedExpr::EmbedExpr(const ASTContext &Ctx, SourceLocation Loc,
2377
EmbedDataStorage *Data, unsigned Begin,
2378
unsigned NumOfElements)
2379
: Expr(EmbedExprClass, Ctx.IntTy, VK_PRValue, OK_Ordinary),
2380
EmbedKeywordLoc(Loc), Ctx(&Ctx), Data(Data), Begin(Begin),
2381
NumOfElements(NumOfElements) {
2382
setDependence(ExprDependence::None);
2383
FakeChildNode = IntegerLiteral::Create(
2384
Ctx, llvm::APInt::getZero(Ctx.getTypeSize(getType())), getType(), Loc);
2385
}
2386
2387
InitListExpr::InitListExpr(const ASTContext &C, SourceLocation lbraceloc,
2388
ArrayRef<Expr *> initExprs, SourceLocation rbraceloc)
2389
: Expr(InitListExprClass, QualType(), VK_PRValue, OK_Ordinary),
2390
InitExprs(C, initExprs.size()), LBraceLoc(lbraceloc),
2391
RBraceLoc(rbraceloc), AltForm(nullptr, true) {
2392
sawArrayRangeDesignator(false);
2393
InitExprs.insert(C, InitExprs.end(), initExprs.begin(), initExprs.end());
2394
2395
setDependence(computeDependence(this));
2396
}
2397
2398
void InitListExpr::reserveInits(const ASTContext &C, unsigned NumInits) {
2399
if (NumInits > InitExprs.size())
2400
InitExprs.reserve(C, NumInits);
2401
}
2402
2403
void InitListExpr::resizeInits(const ASTContext &C, unsigned NumInits) {
2404
InitExprs.resize(C, NumInits, nullptr);
2405
}
2406
2407
Expr *InitListExpr::updateInit(const ASTContext &C, unsigned Init, Expr *expr) {
2408
if (Init >= InitExprs.size()) {
2409
InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, nullptr);
2410
setInit(Init, expr);
2411
return nullptr;
2412
}
2413
2414
Expr *Result = cast_or_null<Expr>(InitExprs[Init]);
2415
setInit(Init, expr);
2416
return Result;
2417
}
2418
2419
void InitListExpr::setArrayFiller(Expr *filler) {
2420
assert(!hasArrayFiller() && "Filler already set!");
2421
ArrayFillerOrUnionFieldInit = filler;
2422
// Fill out any "holes" in the array due to designated initializers.
2423
Expr **inits = getInits();
2424
for (unsigned i = 0, e = getNumInits(); i != e; ++i)
2425
if (inits[i] == nullptr)
2426
inits[i] = filler;
2427
}
2428
2429
bool InitListExpr::isStringLiteralInit() const {
2430
if (getNumInits() != 1)
2431
return false;
2432
const ArrayType *AT = getType()->getAsArrayTypeUnsafe();
2433
if (!AT || !AT->getElementType()->isIntegerType())
2434
return false;
2435
// It is possible for getInit() to return null.
2436
const Expr *Init = getInit(0);
2437
if (!Init)
2438
return false;
2439
Init = Init->IgnoreParenImpCasts();
2440
return isa<StringLiteral>(Init) || isa<ObjCEncodeExpr>(Init);
2441
}
2442
2443
bool InitListExpr::isTransparent() const {
2444
assert(isSemanticForm() && "syntactic form never semantically transparent");
2445
2446
// A glvalue InitListExpr is always just sugar.
2447
if (isGLValue()) {
2448
assert(getNumInits() == 1 && "multiple inits in glvalue init list");
2449
return true;
2450
}
2451
2452
// Otherwise, we're sugar if and only if we have exactly one initializer that
2453
// is of the same type.
2454
if (getNumInits() != 1 || !getInit(0))
2455
return false;
2456
2457
// Don't confuse aggregate initialization of a struct X { X &x; }; with a
2458
// transparent struct copy.
2459
if (!getInit(0)->isPRValue() && getType()->isRecordType())
2460
return false;
2461
2462
return getType().getCanonicalType() ==
2463
getInit(0)->getType().getCanonicalType();
2464
}
2465
2466
bool InitListExpr::isIdiomaticZeroInitializer(const LangOptions &LangOpts) const {
2467
assert(isSyntacticForm() && "only test syntactic form as zero initializer");
2468
2469
if (LangOpts.CPlusPlus || getNumInits() != 1 || !getInit(0)) {
2470
return false;
2471
}
2472
2473
const IntegerLiteral *Lit = dyn_cast<IntegerLiteral>(getInit(0)->IgnoreImplicit());
2474
return Lit && Lit->getValue() == 0;
2475
}
2476
2477
SourceLocation InitListExpr::getBeginLoc() const {
2478
if (InitListExpr *SyntacticForm = getSyntacticForm())
2479
return SyntacticForm->getBeginLoc();
2480
SourceLocation Beg = LBraceLoc;
2481
if (Beg.isInvalid()) {
2482
// Find the first non-null initializer.
2483
for (InitExprsTy::const_iterator I = InitExprs.begin(),
2484
E = InitExprs.end();
2485
I != E; ++I) {
2486
if (Stmt *S = *I) {
2487
Beg = S->getBeginLoc();
2488
break;
2489
}
2490
}
2491
}
2492
return Beg;
2493
}
2494
2495
SourceLocation InitListExpr::getEndLoc() const {
2496
if (InitListExpr *SyntacticForm = getSyntacticForm())
2497
return SyntacticForm->getEndLoc();
2498
SourceLocation End = RBraceLoc;
2499
if (End.isInvalid()) {
2500
// Find the first non-null initializer from the end.
2501
for (Stmt *S : llvm::reverse(InitExprs)) {
2502
if (S) {
2503
End = S->getEndLoc();
2504
break;
2505
}
2506
}
2507
}
2508
return End;
2509
}
2510
2511
/// getFunctionType - Return the underlying function type for this block.
2512
///
2513
const FunctionProtoType *BlockExpr::getFunctionType() const {
2514
// The block pointer is never sugared, but the function type might be.
2515
return cast<BlockPointerType>(getType())
2516
->getPointeeType()->castAs<FunctionProtoType>();
2517
}
2518
2519
SourceLocation BlockExpr::getCaretLocation() const {
2520
return TheBlock->getCaretLocation();
2521
}
2522
const Stmt *BlockExpr::getBody() const {
2523
return TheBlock->getBody();
2524
}
2525
Stmt *BlockExpr::getBody() {
2526
return TheBlock->getBody();
2527
}
2528
2529
2530
//===----------------------------------------------------------------------===//
2531
// Generic Expression Routines
2532
//===----------------------------------------------------------------------===//
2533
2534
bool Expr::isReadIfDiscardedInCPlusPlus11() const {
2535
// In C++11, discarded-value expressions of a certain form are special,
2536
// according to [expr]p10:
2537
// The lvalue-to-rvalue conversion (4.1) is applied only if the
2538
// expression is a glvalue of volatile-qualified type and it has
2539
// one of the following forms:
2540
if (!isGLValue() || !getType().isVolatileQualified())
2541
return false;
2542
2543
const Expr *E = IgnoreParens();
2544
2545
// - id-expression (5.1.1),
2546
if (isa<DeclRefExpr>(E))
2547
return true;
2548
2549
// - subscripting (5.2.1),
2550
if (isa<ArraySubscriptExpr>(E))
2551
return true;
2552
2553
// - class member access (5.2.5),
2554
if (isa<MemberExpr>(E))
2555
return true;
2556
2557
// - indirection (5.3.1),
2558
if (auto *UO = dyn_cast<UnaryOperator>(E))
2559
if (UO->getOpcode() == UO_Deref)
2560
return true;
2561
2562
if (auto *BO = dyn_cast<BinaryOperator>(E)) {
2563
// - pointer-to-member operation (5.5),
2564
if (BO->isPtrMemOp())
2565
return true;
2566
2567
// - comma expression (5.18) where the right operand is one of the above.
2568
if (BO->getOpcode() == BO_Comma)
2569
return BO->getRHS()->isReadIfDiscardedInCPlusPlus11();
2570
}
2571
2572
// - conditional expression (5.16) where both the second and the third
2573
// operands are one of the above, or
2574
if (auto *CO = dyn_cast<ConditionalOperator>(E))
2575
return CO->getTrueExpr()->isReadIfDiscardedInCPlusPlus11() &&
2576
CO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2577
// The related edge case of "*x ?: *x".
2578
if (auto *BCO =
2579
dyn_cast<BinaryConditionalOperator>(E)) {
2580
if (auto *OVE = dyn_cast<OpaqueValueExpr>(BCO->getTrueExpr()))
2581
return OVE->getSourceExpr()->isReadIfDiscardedInCPlusPlus11() &&
2582
BCO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2583
}
2584
2585
// Objective-C++ extensions to the rule.
2586
if (isa<ObjCIvarRefExpr>(E))
2587
return true;
2588
if (const auto *POE = dyn_cast<PseudoObjectExpr>(E)) {
2589
if (isa<ObjCPropertyRefExpr, ObjCSubscriptRefExpr>(POE->getSyntacticForm()))
2590
return true;
2591
}
2592
2593
return false;
2594
}
2595
2596
/// isUnusedResultAWarning - Return true if this immediate expression should
2597
/// be warned about if the result is unused. If so, fill in Loc and Ranges
2598
/// with location to warn on and the source range[s] to report with the
2599
/// warning.
2600
bool Expr::isUnusedResultAWarning(const Expr *&WarnE, SourceLocation &Loc,
2601
SourceRange &R1, SourceRange &R2,
2602
ASTContext &Ctx) const {
2603
// Don't warn if the expr is type dependent. The type could end up
2604
// instantiating to void.
2605
if (isTypeDependent())
2606
return false;
2607
2608
switch (getStmtClass()) {
2609
default:
2610
if (getType()->isVoidType())
2611
return false;
2612
WarnE = this;
2613
Loc = getExprLoc();
2614
R1 = getSourceRange();
2615
return true;
2616
case ParenExprClass:
2617
return cast<ParenExpr>(this)->getSubExpr()->
2618
isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2619
case GenericSelectionExprClass:
2620
return cast<GenericSelectionExpr>(this)->getResultExpr()->
2621
isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2622
case CoawaitExprClass:
2623
case CoyieldExprClass:
2624
return cast<CoroutineSuspendExpr>(this)->getResumeExpr()->
2625
isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2626
case ChooseExprClass:
2627
return cast<ChooseExpr>(this)->getChosenSubExpr()->
2628
isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2629
case UnaryOperatorClass: {
2630
const UnaryOperator *UO = cast<UnaryOperator>(this);
2631
2632
switch (UO->getOpcode()) {
2633
case UO_Plus:
2634
case UO_Minus:
2635
case UO_AddrOf:
2636
case UO_Not:
2637
case UO_LNot:
2638
case UO_Deref:
2639
break;
2640
case UO_Coawait:
2641
// This is just the 'operator co_await' call inside the guts of a
2642
// dependent co_await call.
2643
case UO_PostInc:
2644
case UO_PostDec:
2645
case UO_PreInc:
2646
case UO_PreDec: // ++/--
2647
return false; // Not a warning.
2648
case UO_Real:
2649
case UO_Imag:
2650
// accessing a piece of a volatile complex is a side-effect.
2651
if (Ctx.getCanonicalType(UO->getSubExpr()->getType())
2652
.isVolatileQualified())
2653
return false;
2654
break;
2655
case UO_Extension:
2656
return UO->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2657
}
2658
WarnE = this;
2659
Loc = UO->getOperatorLoc();
2660
R1 = UO->getSubExpr()->getSourceRange();
2661
return true;
2662
}
2663
case BinaryOperatorClass: {
2664
const BinaryOperator *BO = cast<BinaryOperator>(this);
2665
switch (BO->getOpcode()) {
2666
default:
2667
break;
2668
// Consider the RHS of comma for side effects. LHS was checked by
2669
// Sema::CheckCommaOperands.
2670
case BO_Comma:
2671
// ((foo = <blah>), 0) is an idiom for hiding the result (and
2672
// lvalue-ness) of an assignment written in a macro.
2673
if (IntegerLiteral *IE =
2674
dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens()))
2675
if (IE->getValue() == 0)
2676
return false;
2677
return BO->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2678
// Consider '||', '&&' to have side effects if the LHS or RHS does.
2679
case BO_LAnd:
2680
case BO_LOr:
2681
if (!BO->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx) ||
2682
!BO->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx))
2683
return false;
2684
break;
2685
}
2686
if (BO->isAssignmentOp())
2687
return false;
2688
WarnE = this;
2689
Loc = BO->getOperatorLoc();
2690
R1 = BO->getLHS()->getSourceRange();
2691
R2 = BO->getRHS()->getSourceRange();
2692
return true;
2693
}
2694
case CompoundAssignOperatorClass:
2695
case VAArgExprClass:
2696
case AtomicExprClass:
2697
return false;
2698
2699
case ConditionalOperatorClass: {
2700
// If only one of the LHS or RHS is a warning, the operator might
2701
// be being used for control flow. Only warn if both the LHS and
2702
// RHS are warnings.
2703
const auto *Exp = cast<ConditionalOperator>(this);
2704
return Exp->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx) &&
2705
Exp->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2706
}
2707
case BinaryConditionalOperatorClass: {
2708
const auto *Exp = cast<BinaryConditionalOperator>(this);
2709
return Exp->getFalseExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2710
}
2711
2712
case MemberExprClass:
2713
WarnE = this;
2714
Loc = cast<MemberExpr>(this)->getMemberLoc();
2715
R1 = SourceRange(Loc, Loc);
2716
R2 = cast<MemberExpr>(this)->getBase()->getSourceRange();
2717
return true;
2718
2719
case ArraySubscriptExprClass:
2720
WarnE = this;
2721
Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc();
2722
R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange();
2723
R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange();
2724
return true;
2725
2726
case CXXOperatorCallExprClass: {
2727
// Warn about operator ==,!=,<,>,<=, and >= even when user-defined operator
2728
// overloads as there is no reasonable way to define these such that they
2729
// have non-trivial, desirable side-effects. See the -Wunused-comparison
2730
// warning: operators == and != are commonly typo'ed, and so warning on them
2731
// provides additional value as well. If this list is updated,
2732
// DiagnoseUnusedComparison should be as well.
2733
const CXXOperatorCallExpr *Op = cast<CXXOperatorCallExpr>(this);
2734
switch (Op->getOperator()) {
2735
default:
2736
break;
2737
case OO_EqualEqual:
2738
case OO_ExclaimEqual:
2739
case OO_Less:
2740
case OO_Greater:
2741
case OO_GreaterEqual:
2742
case OO_LessEqual:
2743
if (Op->getCallReturnType(Ctx)->isReferenceType() ||
2744
Op->getCallReturnType(Ctx)->isVoidType())
2745
break;
2746
WarnE = this;
2747
Loc = Op->getOperatorLoc();
2748
R1 = Op->getSourceRange();
2749
return true;
2750
}
2751
2752
// Fallthrough for generic call handling.
2753
[[fallthrough]];
2754
}
2755
case CallExprClass:
2756
case CXXMemberCallExprClass:
2757
case UserDefinedLiteralClass: {
2758
// If this is a direct call, get the callee.
2759
const CallExpr *CE = cast<CallExpr>(this);
2760
if (const Decl *FD = CE->getCalleeDecl()) {
2761
// If the callee has attribute pure, const, or warn_unused_result, warn
2762
// about it. void foo() { strlen("bar"); } should warn.
2763
//
2764
// Note: If new cases are added here, DiagnoseUnusedExprResult should be
2765
// updated to match for QoI.
2766
if (CE->hasUnusedResultAttr(Ctx) ||
2767
FD->hasAttr<PureAttr>() || FD->hasAttr<ConstAttr>()) {
2768
WarnE = this;
2769
Loc = CE->getCallee()->getBeginLoc();
2770
R1 = CE->getCallee()->getSourceRange();
2771
2772
if (unsigned NumArgs = CE->getNumArgs())
2773
R2 = SourceRange(CE->getArg(0)->getBeginLoc(),
2774
CE->getArg(NumArgs - 1)->getEndLoc());
2775
return true;
2776
}
2777
}
2778
return false;
2779
}
2780
2781
// If we don't know precisely what we're looking at, let's not warn.
2782
case UnresolvedLookupExprClass:
2783
case CXXUnresolvedConstructExprClass:
2784
case RecoveryExprClass:
2785
return false;
2786
2787
case CXXTemporaryObjectExprClass:
2788
case CXXConstructExprClass: {
2789
if (const CXXRecordDecl *Type = getType()->getAsCXXRecordDecl()) {
2790
const auto *WarnURAttr = Type->getAttr<WarnUnusedResultAttr>();
2791
if (Type->hasAttr<WarnUnusedAttr>() ||
2792
(WarnURAttr && WarnURAttr->IsCXX11NoDiscard())) {
2793
WarnE = this;
2794
Loc = getBeginLoc();
2795
R1 = getSourceRange();
2796
return true;
2797
}
2798
}
2799
2800
const auto *CE = cast<CXXConstructExpr>(this);
2801
if (const CXXConstructorDecl *Ctor = CE->getConstructor()) {
2802
const auto *WarnURAttr = Ctor->getAttr<WarnUnusedResultAttr>();
2803
if (WarnURAttr && WarnURAttr->IsCXX11NoDiscard()) {
2804
WarnE = this;
2805
Loc = getBeginLoc();
2806
R1 = getSourceRange();
2807
2808
if (unsigned NumArgs = CE->getNumArgs())
2809
R2 = SourceRange(CE->getArg(0)->getBeginLoc(),
2810
CE->getArg(NumArgs - 1)->getEndLoc());
2811
return true;
2812
}
2813
}
2814
2815
return false;
2816
}
2817
2818
case ObjCMessageExprClass: {
2819
const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this);
2820
if (Ctx.getLangOpts().ObjCAutoRefCount &&
2821
ME->isInstanceMessage() &&
2822
!ME->getType()->isVoidType() &&
2823
ME->getMethodFamily() == OMF_init) {
2824
WarnE = this;
2825
Loc = getExprLoc();
2826
R1 = ME->getSourceRange();
2827
return true;
2828
}
2829
2830
if (const ObjCMethodDecl *MD = ME->getMethodDecl())
2831
if (MD->hasAttr<WarnUnusedResultAttr>()) {
2832
WarnE = this;
2833
Loc = getExprLoc();
2834
return true;
2835
}
2836
2837
return false;
2838
}
2839
2840
case ObjCPropertyRefExprClass:
2841
case ObjCSubscriptRefExprClass:
2842
WarnE = this;
2843
Loc = getExprLoc();
2844
R1 = getSourceRange();
2845
return true;
2846
2847
case PseudoObjectExprClass: {
2848
const auto *POE = cast<PseudoObjectExpr>(this);
2849
2850
// For some syntactic forms, we should always warn.
2851
if (isa<ObjCPropertyRefExpr, ObjCSubscriptRefExpr>(
2852
POE->getSyntacticForm())) {
2853
WarnE = this;
2854
Loc = getExprLoc();
2855
R1 = getSourceRange();
2856
return true;
2857
}
2858
2859
// For others, we should never warn.
2860
if (auto *BO = dyn_cast<BinaryOperator>(POE->getSyntacticForm()))
2861
if (BO->isAssignmentOp())
2862
return false;
2863
if (auto *UO = dyn_cast<UnaryOperator>(POE->getSyntacticForm()))
2864
if (UO->isIncrementDecrementOp())
2865
return false;
2866
2867
// Otherwise, warn if the result expression would warn.
2868
const Expr *Result = POE->getResultExpr();
2869
return Result && Result->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2870
}
2871
2872
case StmtExprClass: {
2873
// Statement exprs don't logically have side effects themselves, but are
2874
// sometimes used in macros in ways that give them a type that is unused.
2875
// For example ({ blah; foo(); }) will end up with a type if foo has a type.
2876
// however, if the result of the stmt expr is dead, we don't want to emit a
2877
// warning.
2878
const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt();
2879
if (!CS->body_empty()) {
2880
if (const Expr *E = dyn_cast<Expr>(CS->body_back()))
2881
return E->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2882
if (const LabelStmt *Label = dyn_cast<LabelStmt>(CS->body_back()))
2883
if (const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
2884
return E->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2885
}
2886
2887
if (getType()->isVoidType())
2888
return false;
2889
WarnE = this;
2890
Loc = cast<StmtExpr>(this)->getLParenLoc();
2891
R1 = getSourceRange();
2892
return true;
2893
}
2894
case CXXFunctionalCastExprClass:
2895
case CStyleCastExprClass: {
2896
// Ignore an explicit cast to void, except in C++98 if the operand is a
2897
// volatile glvalue for which we would trigger an implicit read in any
2898
// other language mode. (Such an implicit read always happens as part of
2899
// the lvalue conversion in C, and happens in C++ for expressions of all
2900
// forms where it seems likely the user intended to trigger a volatile
2901
// load.)
2902
const CastExpr *CE = cast<CastExpr>(this);
2903
const Expr *SubE = CE->getSubExpr()->IgnoreParens();
2904
if (CE->getCastKind() == CK_ToVoid) {
2905
if (Ctx.getLangOpts().CPlusPlus && !Ctx.getLangOpts().CPlusPlus11 &&
2906
SubE->isReadIfDiscardedInCPlusPlus11()) {
2907
// Suppress the "unused value" warning for idiomatic usage of
2908
// '(void)var;' used to suppress "unused variable" warnings.
2909
if (auto *DRE = dyn_cast<DeclRefExpr>(SubE))
2910
if (auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2911
if (!VD->isExternallyVisible())
2912
return false;
2913
2914
// The lvalue-to-rvalue conversion would have no effect for an array.
2915
// It's implausible that the programmer expected this to result in a
2916
// volatile array load, so don't warn.
2917
if (SubE->getType()->isArrayType())
2918
return false;
2919
2920
return SubE->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2921
}
2922
return false;
2923
}
2924
2925
// If this is a cast to a constructor conversion, check the operand.
2926
// Otherwise, the result of the cast is unused.
2927
if (CE->getCastKind() == CK_ConstructorConversion)
2928
return CE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2929
if (CE->getCastKind() == CK_Dependent)
2930
return false;
2931
2932
WarnE = this;
2933
if (const CXXFunctionalCastExpr *CXXCE =
2934
dyn_cast<CXXFunctionalCastExpr>(this)) {
2935
Loc = CXXCE->getBeginLoc();
2936
R1 = CXXCE->getSubExpr()->getSourceRange();
2937
} else {
2938
const CStyleCastExpr *CStyleCE = cast<CStyleCastExpr>(this);
2939
Loc = CStyleCE->getLParenLoc();
2940
R1 = CStyleCE->getSubExpr()->getSourceRange();
2941
}
2942
return true;
2943
}
2944
case ImplicitCastExprClass: {
2945
const CastExpr *ICE = cast<ImplicitCastExpr>(this);
2946
2947
// lvalue-to-rvalue conversion on a volatile lvalue is a side-effect.
2948
if (ICE->getCastKind() == CK_LValueToRValue &&
2949
ICE->getSubExpr()->getType().isVolatileQualified())
2950
return false;
2951
2952
return ICE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2953
}
2954
case CXXDefaultArgExprClass:
2955
return (cast<CXXDefaultArgExpr>(this)
2956
->getExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx));
2957
case CXXDefaultInitExprClass:
2958
return (cast<CXXDefaultInitExpr>(this)
2959
->getExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx));
2960
2961
case CXXNewExprClass:
2962
// FIXME: In theory, there might be new expressions that don't have side
2963
// effects (e.g. a placement new with an uninitialized POD).
2964
case CXXDeleteExprClass:
2965
return false;
2966
case MaterializeTemporaryExprClass:
2967
return cast<MaterializeTemporaryExpr>(this)
2968
->getSubExpr()
2969
->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2970
case CXXBindTemporaryExprClass:
2971
return cast<CXXBindTemporaryExpr>(this)->getSubExpr()
2972
->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2973
case ExprWithCleanupsClass:
2974
return cast<ExprWithCleanups>(this)->getSubExpr()
2975
->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2976
}
2977
}
2978
2979
/// isOBJCGCCandidate - Check if an expression is objc gc'able.
2980
/// returns true, if it is; false otherwise.
2981
bool Expr::isOBJCGCCandidate(ASTContext &Ctx) const {
2982
const Expr *E = IgnoreParens();
2983
switch (E->getStmtClass()) {
2984
default:
2985
return false;
2986
case ObjCIvarRefExprClass:
2987
return true;
2988
case Expr::UnaryOperatorClass:
2989
return cast<UnaryOperator>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
2990
case ImplicitCastExprClass:
2991
return cast<ImplicitCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
2992
case MaterializeTemporaryExprClass:
2993
return cast<MaterializeTemporaryExpr>(E)->getSubExpr()->isOBJCGCCandidate(
2994
Ctx);
2995
case CStyleCastExprClass:
2996
return cast<CStyleCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
2997
case DeclRefExprClass: {
2998
const Decl *D = cast<DeclRefExpr>(E)->getDecl();
2999
3000
if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3001
if (VD->hasGlobalStorage())
3002
return true;
3003
QualType T = VD->getType();
3004
// dereferencing to a pointer is always a gc'able candidate,
3005
// unless it is __weak.
3006
return T->isPointerType() &&
3007
(Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak);
3008
}
3009
return false;
3010
}
3011
case MemberExprClass: {
3012
const MemberExpr *M = cast<MemberExpr>(E);
3013
return M->getBase()->isOBJCGCCandidate(Ctx);
3014
}
3015
case ArraySubscriptExprClass:
3016
return cast<ArraySubscriptExpr>(E)->getBase()->isOBJCGCCandidate(Ctx);
3017
}
3018
}
3019
3020
bool Expr::isBoundMemberFunction(ASTContext &Ctx) const {
3021
if (isTypeDependent())
3022
return false;
3023
return ClassifyLValue(Ctx) == Expr::LV_MemberFunction;
3024
}
3025
3026
QualType Expr::findBoundMemberType(const Expr *expr) {
3027
assert(expr->hasPlaceholderType(BuiltinType::BoundMember));
3028
3029
// Bound member expressions are always one of these possibilities:
3030
// x->m x.m x->*y x.*y
3031
// (possibly parenthesized)
3032
3033
expr = expr->IgnoreParens();
3034
if (const MemberExpr *mem = dyn_cast<MemberExpr>(expr)) {
3035
assert(isa<CXXMethodDecl>(mem->getMemberDecl()));
3036
return mem->getMemberDecl()->getType();
3037
}
3038
3039
if (const BinaryOperator *op = dyn_cast<BinaryOperator>(expr)) {
3040
QualType type = op->getRHS()->getType()->castAs<MemberPointerType>()
3041
->getPointeeType();
3042
assert(type->isFunctionType());
3043
return type;
3044
}
3045
3046
assert(isa<UnresolvedMemberExpr>(expr) || isa<CXXPseudoDestructorExpr>(expr));
3047
return QualType();
3048
}
3049
3050
Expr *Expr::IgnoreImpCasts() {
3051
return IgnoreExprNodes(this, IgnoreImplicitCastsSingleStep);
3052
}
3053
3054
Expr *Expr::IgnoreCasts() {
3055
return IgnoreExprNodes(this, IgnoreCastsSingleStep);
3056
}
3057
3058
Expr *Expr::IgnoreImplicit() {
3059
return IgnoreExprNodes(this, IgnoreImplicitSingleStep);
3060
}
3061
3062
Expr *Expr::IgnoreImplicitAsWritten() {
3063
return IgnoreExprNodes(this, IgnoreImplicitAsWrittenSingleStep);
3064
}
3065
3066
Expr *Expr::IgnoreParens() {
3067
return IgnoreExprNodes(this, IgnoreParensSingleStep);
3068
}
3069
3070
Expr *Expr::IgnoreParenImpCasts() {
3071
return IgnoreExprNodes(this, IgnoreParensSingleStep,
3072
IgnoreImplicitCastsExtraSingleStep);
3073
}
3074
3075
Expr *Expr::IgnoreParenCasts() {
3076
return IgnoreExprNodes(this, IgnoreParensSingleStep, IgnoreCastsSingleStep);
3077
}
3078
3079
Expr *Expr::IgnoreConversionOperatorSingleStep() {
3080
if (auto *MCE = dyn_cast<CXXMemberCallExpr>(this)) {
3081
if (isa_and_nonnull<CXXConversionDecl>(MCE->getMethodDecl()))
3082
return MCE->getImplicitObjectArgument();
3083
}
3084
return this;
3085
}
3086
3087
Expr *Expr::IgnoreParenLValueCasts() {
3088
return IgnoreExprNodes(this, IgnoreParensSingleStep,
3089
IgnoreLValueCastsSingleStep);
3090
}
3091
3092
Expr *Expr::IgnoreParenBaseCasts() {
3093
return IgnoreExprNodes(this, IgnoreParensSingleStep,
3094
IgnoreBaseCastsSingleStep);
3095
}
3096
3097
Expr *Expr::IgnoreParenNoopCasts(const ASTContext &Ctx) {
3098
auto IgnoreNoopCastsSingleStep = [&Ctx](Expr *E) {
3099
if (auto *CE = dyn_cast<CastExpr>(E)) {
3100
// We ignore integer <-> casts that are of the same width, ptr<->ptr and
3101
// ptr<->int casts of the same width. We also ignore all identity casts.
3102
Expr *SubExpr = CE->getSubExpr();
3103
bool IsIdentityCast =
3104
Ctx.hasSameUnqualifiedType(E->getType(), SubExpr->getType());
3105
bool IsSameWidthCast = (E->getType()->isPointerType() ||
3106
E->getType()->isIntegralType(Ctx)) &&
3107
(SubExpr->getType()->isPointerType() ||
3108
SubExpr->getType()->isIntegralType(Ctx)) &&
3109
(Ctx.getTypeSize(E->getType()) ==
3110
Ctx.getTypeSize(SubExpr->getType()));
3111
3112
if (IsIdentityCast || IsSameWidthCast)
3113
return SubExpr;
3114
} else if (auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E))
3115
return NTTP->getReplacement();
3116
3117
return E;
3118
};
3119
return IgnoreExprNodes(this, IgnoreParensSingleStep,
3120
IgnoreNoopCastsSingleStep);
3121
}
3122
3123
Expr *Expr::IgnoreUnlessSpelledInSource() {
3124
auto IgnoreImplicitConstructorSingleStep = [](Expr *E) {
3125
if (auto *Cast = dyn_cast<CXXFunctionalCastExpr>(E)) {
3126
auto *SE = Cast->getSubExpr();
3127
if (SE->getSourceRange() == E->getSourceRange())
3128
return SE;
3129
}
3130
3131
if (auto *C = dyn_cast<CXXConstructExpr>(E)) {
3132
auto NumArgs = C->getNumArgs();
3133
if (NumArgs == 1 ||
3134
(NumArgs > 1 && isa<CXXDefaultArgExpr>(C->getArg(1)))) {
3135
Expr *A = C->getArg(0);
3136
if (A->getSourceRange() == E->getSourceRange() || C->isElidable())
3137
return A;
3138
}
3139
}
3140
return E;
3141
};
3142
auto IgnoreImplicitMemberCallSingleStep = [](Expr *E) {
3143
if (auto *C = dyn_cast<CXXMemberCallExpr>(E)) {
3144
Expr *ExprNode = C->getImplicitObjectArgument();
3145
if (ExprNode->getSourceRange() == E->getSourceRange()) {
3146
return ExprNode;
3147
}
3148
if (auto *PE = dyn_cast<ParenExpr>(ExprNode)) {
3149
if (PE->getSourceRange() == C->getSourceRange()) {
3150
return cast<Expr>(PE);
3151
}
3152
}
3153
ExprNode = ExprNode->IgnoreParenImpCasts();
3154
if (ExprNode->getSourceRange() == E->getSourceRange())
3155
return ExprNode;
3156
}
3157
return E;
3158
};
3159
return IgnoreExprNodes(
3160
this, IgnoreImplicitSingleStep, IgnoreImplicitCastsExtraSingleStep,
3161
IgnoreParensOnlySingleStep, IgnoreImplicitConstructorSingleStep,
3162
IgnoreImplicitMemberCallSingleStep);
3163
}
3164
3165
bool Expr::isDefaultArgument() const {
3166
const Expr *E = this;
3167
if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E))
3168
E = M->getSubExpr();
3169
3170
while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
3171
E = ICE->getSubExprAsWritten();
3172
3173
return isa<CXXDefaultArgExpr>(E);
3174
}
3175
3176
/// Skip over any no-op casts and any temporary-binding
3177
/// expressions.
3178
static const Expr *skipTemporaryBindingsNoOpCastsAndParens(const Expr *E) {
3179
if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E))
3180
E = M->getSubExpr();
3181
3182
while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
3183
if (ICE->getCastKind() == CK_NoOp)
3184
E = ICE->getSubExpr();
3185
else
3186
break;
3187
}
3188
3189
while (const CXXBindTemporaryExpr *BE = dyn_cast<CXXBindTemporaryExpr>(E))
3190
E = BE->getSubExpr();
3191
3192
while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
3193
if (ICE->getCastKind() == CK_NoOp)
3194
E = ICE->getSubExpr();
3195
else
3196
break;
3197
}
3198
3199
return E->IgnoreParens();
3200
}
3201
3202
/// isTemporaryObject - Determines if this expression produces a
3203
/// temporary of the given class type.
3204
bool Expr::isTemporaryObject(ASTContext &C, const CXXRecordDecl *TempTy) const {
3205
if (!C.hasSameUnqualifiedType(getType(), C.getTypeDeclType(TempTy)))
3206
return false;
3207
3208
const Expr *E = skipTemporaryBindingsNoOpCastsAndParens(this);
3209
3210
// Temporaries are by definition pr-values of class type.
3211
if (!E->Classify(C).isPRValue()) {
3212
// In this context, property reference is a message call and is pr-value.
3213
if (!isa<ObjCPropertyRefExpr>(E))
3214
return false;
3215
}
3216
3217
// Black-list a few cases which yield pr-values of class type that don't
3218
// refer to temporaries of that type:
3219
3220
// - implicit derived-to-base conversions
3221
if (isa<ImplicitCastExpr>(E)) {
3222
switch (cast<ImplicitCastExpr>(E)->getCastKind()) {
3223
case CK_DerivedToBase:
3224
case CK_UncheckedDerivedToBase:
3225
return false;
3226
default:
3227
break;
3228
}
3229
}
3230
3231
// - member expressions (all)
3232
if (isa<MemberExpr>(E))
3233
return false;
3234
3235
if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E))
3236
if (BO->isPtrMemOp())
3237
return false;
3238
3239
// - opaque values (all)
3240
if (isa<OpaqueValueExpr>(E))
3241
return false;
3242
3243
return true;
3244
}
3245
3246
bool Expr::isImplicitCXXThis() const {
3247
const Expr *E = this;
3248
3249
// Strip away parentheses and casts we don't care about.
3250
while (true) {
3251
if (const ParenExpr *Paren = dyn_cast<ParenExpr>(E)) {
3252
E = Paren->getSubExpr();
3253
continue;
3254
}
3255
3256
if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
3257
if (ICE->getCastKind() == CK_NoOp ||
3258
ICE->getCastKind() == CK_LValueToRValue ||
3259
ICE->getCastKind() == CK_DerivedToBase ||
3260
ICE->getCastKind() == CK_UncheckedDerivedToBase) {
3261
E = ICE->getSubExpr();
3262
continue;
3263
}
3264
}
3265
3266
if (const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) {
3267
if (UnOp->getOpcode() == UO_Extension) {
3268
E = UnOp->getSubExpr();
3269
continue;
3270
}
3271
}
3272
3273
if (const MaterializeTemporaryExpr *M
3274
= dyn_cast<MaterializeTemporaryExpr>(E)) {
3275
E = M->getSubExpr();
3276
continue;
3277
}
3278
3279
break;
3280
}
3281
3282
if (const CXXThisExpr *This = dyn_cast<CXXThisExpr>(E))
3283
return This->isImplicit();
3284
3285
return false;
3286
}
3287
3288
/// hasAnyTypeDependentArguments - Determines if any of the expressions
3289
/// in Exprs is type-dependent.
3290
bool Expr::hasAnyTypeDependentArguments(ArrayRef<Expr *> Exprs) {
3291
for (unsigned I = 0; I < Exprs.size(); ++I)
3292
if (Exprs[I]->isTypeDependent())
3293
return true;
3294
3295
return false;
3296
}
3297
3298
bool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef,
3299
const Expr **Culprit) const {
3300
assert(!isValueDependent() &&
3301
"Expression evaluator can't be called on a dependent expression.");
3302
3303
// This function is attempting whether an expression is an initializer
3304
// which can be evaluated at compile-time. It very closely parallels
3305
// ConstExprEmitter in CGExprConstant.cpp; if they don't match, it
3306
// will lead to unexpected results. Like ConstExprEmitter, it falls back
3307
// to isEvaluatable most of the time.
3308
//
3309
// If we ever capture reference-binding directly in the AST, we can
3310
// kill the second parameter.
3311
3312
if (IsForRef) {
3313
if (auto *EWC = dyn_cast<ExprWithCleanups>(this))
3314
return EWC->getSubExpr()->isConstantInitializer(Ctx, true, Culprit);
3315
if (auto *MTE = dyn_cast<MaterializeTemporaryExpr>(this))
3316
return MTE->getSubExpr()->isConstantInitializer(Ctx, false, Culprit);
3317
EvalResult Result;
3318
if (EvaluateAsLValue(Result, Ctx) && !Result.HasSideEffects)
3319
return true;
3320
if (Culprit)
3321
*Culprit = this;
3322
return false;
3323
}
3324
3325
switch (getStmtClass()) {
3326
default: break;
3327
case Stmt::ExprWithCleanupsClass:
3328
return cast<ExprWithCleanups>(this)->getSubExpr()->isConstantInitializer(
3329
Ctx, IsForRef, Culprit);
3330
case StringLiteralClass:
3331
case ObjCEncodeExprClass:
3332
return true;
3333
case CXXTemporaryObjectExprClass:
3334
case CXXConstructExprClass: {
3335
const CXXConstructExpr *CE = cast<CXXConstructExpr>(this);
3336
3337
if (CE->getConstructor()->isTrivial() &&
3338
CE->getConstructor()->getParent()->hasTrivialDestructor()) {
3339
// Trivial default constructor
3340
if (!CE->getNumArgs()) return true;
3341
3342
// Trivial copy constructor
3343
assert(CE->getNumArgs() == 1 && "trivial ctor with > 1 argument");
3344
return CE->getArg(0)->isConstantInitializer(Ctx, false, Culprit);
3345
}
3346
3347
break;
3348
}
3349
case ConstantExprClass: {
3350
// FIXME: We should be able to return "true" here, but it can lead to extra
3351
// error messages. E.g. in Sema/array-init.c.
3352
const Expr *Exp = cast<ConstantExpr>(this)->getSubExpr();
3353
return Exp->isConstantInitializer(Ctx, false, Culprit);
3354
}
3355
case CompoundLiteralExprClass: {
3356
// This handles gcc's extension that allows global initializers like
3357
// "struct x {int x;} x = (struct x) {};".
3358
// FIXME: This accepts other cases it shouldn't!
3359
const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer();
3360
return Exp->isConstantInitializer(Ctx, false, Culprit);
3361
}
3362
case DesignatedInitUpdateExprClass: {
3363
const DesignatedInitUpdateExpr *DIUE = cast<DesignatedInitUpdateExpr>(this);
3364
return DIUE->getBase()->isConstantInitializer(Ctx, false, Culprit) &&
3365
DIUE->getUpdater()->isConstantInitializer(Ctx, false, Culprit);
3366
}
3367
case InitListExprClass: {
3368
// C++ [dcl.init.aggr]p2:
3369
// The elements of an aggregate are:
3370
// - for an array, the array elements in increasing subscript order, or
3371
// - for a class, the direct base classes in declaration order, followed
3372
// by the direct non-static data members (11.4) that are not members of
3373
// an anonymous union, in declaration order.
3374
const InitListExpr *ILE = cast<InitListExpr>(this);
3375
assert(ILE->isSemanticForm() && "InitListExpr must be in semantic form");
3376
if (ILE->getType()->isArrayType()) {
3377
unsigned numInits = ILE->getNumInits();
3378
for (unsigned i = 0; i < numInits; i++) {
3379
if (!ILE->getInit(i)->isConstantInitializer(Ctx, false, Culprit))
3380
return false;
3381
}
3382
return true;
3383
}
3384
3385
if (ILE->getType()->isRecordType()) {
3386
unsigned ElementNo = 0;
3387
RecordDecl *RD = ILE->getType()->castAs<RecordType>()->getDecl();
3388
3389
// In C++17, bases were added to the list of members used by aggregate
3390
// initialization.
3391
if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3392
for (unsigned i = 0, e = CXXRD->getNumBases(); i < e; i++) {
3393
if (ElementNo < ILE->getNumInits()) {
3394
const Expr *Elt = ILE->getInit(ElementNo++);
3395
if (!Elt->isConstantInitializer(Ctx, false, Culprit))
3396
return false;
3397
}
3398
}
3399
}
3400
3401
for (const auto *Field : RD->fields()) {
3402
// If this is a union, skip all the fields that aren't being initialized.
3403
if (RD->isUnion() && ILE->getInitializedFieldInUnion() != Field)
3404
continue;
3405
3406
// Don't emit anonymous bitfields, they just affect layout.
3407
if (Field->isUnnamedBitField())
3408
continue;
3409
3410
if (ElementNo < ILE->getNumInits()) {
3411
const Expr *Elt = ILE->getInit(ElementNo++);
3412
if (Field->isBitField()) {
3413
// Bitfields have to evaluate to an integer.
3414
EvalResult Result;
3415
if (!Elt->EvaluateAsInt(Result, Ctx)) {
3416
if (Culprit)
3417
*Culprit = Elt;
3418
return false;
3419
}
3420
} else {
3421
bool RefType = Field->getType()->isReferenceType();
3422
if (!Elt->isConstantInitializer(Ctx, RefType, Culprit))
3423
return false;
3424
}
3425
}
3426
}
3427
return true;
3428
}
3429
3430
break;
3431
}
3432
case ImplicitValueInitExprClass:
3433
case NoInitExprClass:
3434
return true;
3435
case ParenExprClass:
3436
return cast<ParenExpr>(this)->getSubExpr()
3437
->isConstantInitializer(Ctx, IsForRef, Culprit);
3438
case GenericSelectionExprClass:
3439
return cast<GenericSelectionExpr>(this)->getResultExpr()
3440
->isConstantInitializer(Ctx, IsForRef, Culprit);
3441
case ChooseExprClass:
3442
if (cast<ChooseExpr>(this)->isConditionDependent()) {
3443
if (Culprit)
3444
*Culprit = this;
3445
return false;
3446
}
3447
return cast<ChooseExpr>(this)->getChosenSubExpr()
3448
->isConstantInitializer(Ctx, IsForRef, Culprit);
3449
case UnaryOperatorClass: {
3450
const UnaryOperator* Exp = cast<UnaryOperator>(this);
3451
if (Exp->getOpcode() == UO_Extension)
3452
return Exp->getSubExpr()->isConstantInitializer(Ctx, false, Culprit);
3453
break;
3454
}
3455
case PackIndexingExprClass: {
3456
return cast<PackIndexingExpr>(this)
3457
->getSelectedExpr()
3458
->isConstantInitializer(Ctx, false, Culprit);
3459
}
3460
case CXXFunctionalCastExprClass:
3461
case CXXStaticCastExprClass:
3462
case ImplicitCastExprClass:
3463
case CStyleCastExprClass:
3464
case ObjCBridgedCastExprClass:
3465
case CXXDynamicCastExprClass:
3466
case CXXReinterpretCastExprClass:
3467
case CXXAddrspaceCastExprClass:
3468
case CXXConstCastExprClass: {
3469
const CastExpr *CE = cast<CastExpr>(this);
3470
3471
// Handle misc casts we want to ignore.
3472
if (CE->getCastKind() == CK_NoOp ||
3473
CE->getCastKind() == CK_LValueToRValue ||
3474
CE->getCastKind() == CK_ToUnion ||
3475
CE->getCastKind() == CK_ConstructorConversion ||
3476
CE->getCastKind() == CK_NonAtomicToAtomic ||
3477
CE->getCastKind() == CK_AtomicToNonAtomic ||
3478
CE->getCastKind() == CK_NullToPointer ||
3479
CE->getCastKind() == CK_IntToOCLSampler)
3480
return CE->getSubExpr()->isConstantInitializer(Ctx, false, Culprit);
3481
3482
break;
3483
}
3484
case MaterializeTemporaryExprClass:
3485
return cast<MaterializeTemporaryExpr>(this)
3486
->getSubExpr()
3487
->isConstantInitializer(Ctx, false, Culprit);
3488
3489
case SubstNonTypeTemplateParmExprClass:
3490
return cast<SubstNonTypeTemplateParmExpr>(this)->getReplacement()
3491
->isConstantInitializer(Ctx, false, Culprit);
3492
case CXXDefaultArgExprClass:
3493
return cast<CXXDefaultArgExpr>(this)->getExpr()
3494
->isConstantInitializer(Ctx, false, Culprit);
3495
case CXXDefaultInitExprClass:
3496
return cast<CXXDefaultInitExpr>(this)->getExpr()
3497
->isConstantInitializer(Ctx, false, Culprit);
3498
}
3499
// Allow certain forms of UB in constant initializers: signed integer
3500
// overflow and floating-point division by zero. We'll give a warning on
3501
// these, but they're common enough that we have to accept them.
3502
if (isEvaluatable(Ctx, SE_AllowUndefinedBehavior))
3503
return true;
3504
if (Culprit)
3505
*Culprit = this;
3506
return false;
3507
}
3508
3509
bool CallExpr::isBuiltinAssumeFalse(const ASTContext &Ctx) const {
3510
unsigned BuiltinID = getBuiltinCallee();
3511
if (BuiltinID != Builtin::BI__assume &&
3512
BuiltinID != Builtin::BI__builtin_assume)
3513
return false;
3514
3515
const Expr* Arg = getArg(0);
3516
bool ArgVal;
3517
return !Arg->isValueDependent() &&
3518
Arg->EvaluateAsBooleanCondition(ArgVal, Ctx) && !ArgVal;
3519
}
3520
3521
bool CallExpr::isCallToStdMove() const {
3522
return getBuiltinCallee() == Builtin::BImove;
3523
}
3524
3525
namespace {
3526
/// Look for any side effects within a Stmt.
3527
class SideEffectFinder : public ConstEvaluatedExprVisitor<SideEffectFinder> {
3528
typedef ConstEvaluatedExprVisitor<SideEffectFinder> Inherited;
3529
const bool IncludePossibleEffects;
3530
bool HasSideEffects;
3531
3532
public:
3533
explicit SideEffectFinder(const ASTContext &Context, bool IncludePossible)
3534
: Inherited(Context),
3535
IncludePossibleEffects(IncludePossible), HasSideEffects(false) { }
3536
3537
bool hasSideEffects() const { return HasSideEffects; }
3538
3539
void VisitDecl(const Decl *D) {
3540
if (!D)
3541
return;
3542
3543
// We assume the caller checks subexpressions (eg, the initializer, VLA
3544
// bounds) for side-effects on our behalf.
3545
if (auto *VD = dyn_cast<VarDecl>(D)) {
3546
// Registering a destructor is a side-effect.
3547
if (IncludePossibleEffects && VD->isThisDeclarationADefinition() &&
3548
VD->needsDestruction(Context))
3549
HasSideEffects = true;
3550
}
3551
}
3552
3553
void VisitDeclStmt(const DeclStmt *DS) {
3554
for (auto *D : DS->decls())
3555
VisitDecl(D);
3556
Inherited::VisitDeclStmt(DS);
3557
}
3558
3559
void VisitExpr(const Expr *E) {
3560
if (!HasSideEffects &&
3561
E->HasSideEffects(Context, IncludePossibleEffects))
3562
HasSideEffects = true;
3563
}
3564
};
3565
}
3566
3567
bool Expr::HasSideEffects(const ASTContext &Ctx,
3568
bool IncludePossibleEffects) const {
3569
// In circumstances where we care about definite side effects instead of
3570
// potential side effects, we want to ignore expressions that are part of a
3571
// macro expansion as a potential side effect.
3572
if (!IncludePossibleEffects && getExprLoc().isMacroID())
3573
return false;
3574
3575
switch (getStmtClass()) {
3576
case NoStmtClass:
3577
#define ABSTRACT_STMT(Type)
3578
#define STMT(Type, Base) case Type##Class:
3579
#define EXPR(Type, Base)
3580
#include "clang/AST/StmtNodes.inc"
3581
llvm_unreachable("unexpected Expr kind");
3582
3583
case DependentScopeDeclRefExprClass:
3584
case CXXUnresolvedConstructExprClass:
3585
case CXXDependentScopeMemberExprClass:
3586
case UnresolvedLookupExprClass:
3587
case UnresolvedMemberExprClass:
3588
case PackExpansionExprClass:
3589
case SubstNonTypeTemplateParmPackExprClass:
3590
case FunctionParmPackExprClass:
3591
case TypoExprClass:
3592
case RecoveryExprClass:
3593
case CXXFoldExprClass:
3594
// Make a conservative assumption for dependent nodes.
3595
return IncludePossibleEffects;
3596
3597
case DeclRefExprClass:
3598
case ObjCIvarRefExprClass:
3599
case PredefinedExprClass:
3600
case IntegerLiteralClass:
3601
case FixedPointLiteralClass:
3602
case FloatingLiteralClass:
3603
case ImaginaryLiteralClass:
3604
case StringLiteralClass:
3605
case CharacterLiteralClass:
3606
case OffsetOfExprClass:
3607
case ImplicitValueInitExprClass:
3608
case UnaryExprOrTypeTraitExprClass:
3609
case AddrLabelExprClass:
3610
case GNUNullExprClass:
3611
case ArrayInitIndexExprClass:
3612
case NoInitExprClass:
3613
case CXXBoolLiteralExprClass:
3614
case CXXNullPtrLiteralExprClass:
3615
case CXXThisExprClass:
3616
case CXXScalarValueInitExprClass:
3617
case TypeTraitExprClass:
3618
case ArrayTypeTraitExprClass:
3619
case ExpressionTraitExprClass:
3620
case CXXNoexceptExprClass:
3621
case SizeOfPackExprClass:
3622
case ObjCStringLiteralClass:
3623
case ObjCEncodeExprClass:
3624
case ObjCBoolLiteralExprClass:
3625
case ObjCAvailabilityCheckExprClass:
3626
case CXXUuidofExprClass:
3627
case OpaqueValueExprClass:
3628
case SourceLocExprClass:
3629
case EmbedExprClass:
3630
case ConceptSpecializationExprClass:
3631
case RequiresExprClass:
3632
case SYCLUniqueStableNameExprClass:
3633
case PackIndexingExprClass:
3634
// These never have a side-effect.
3635
return false;
3636
3637
case ConstantExprClass:
3638
// FIXME: Move this into the "return false;" block above.
3639
return cast<ConstantExpr>(this)->getSubExpr()->HasSideEffects(
3640
Ctx, IncludePossibleEffects);
3641
3642
case CallExprClass:
3643
case CXXOperatorCallExprClass:
3644
case CXXMemberCallExprClass:
3645
case CUDAKernelCallExprClass:
3646
case UserDefinedLiteralClass: {
3647
// We don't know a call definitely has side effects, except for calls
3648
// to pure/const functions that definitely don't.
3649
// If the call itself is considered side-effect free, check the operands.
3650
const Decl *FD = cast<CallExpr>(this)->getCalleeDecl();
3651
bool IsPure = FD && (FD->hasAttr<ConstAttr>() || FD->hasAttr<PureAttr>());
3652
if (IsPure || !IncludePossibleEffects)
3653
break;
3654
return true;
3655
}
3656
3657
case BlockExprClass:
3658
case CXXBindTemporaryExprClass:
3659
if (!IncludePossibleEffects)
3660
break;
3661
return true;
3662
3663
case MSPropertyRefExprClass:
3664
case MSPropertySubscriptExprClass:
3665
case CompoundAssignOperatorClass:
3666
case VAArgExprClass:
3667
case AtomicExprClass:
3668
case CXXThrowExprClass:
3669
case CXXNewExprClass:
3670
case CXXDeleteExprClass:
3671
case CoawaitExprClass:
3672
case DependentCoawaitExprClass:
3673
case CoyieldExprClass:
3674
// These always have a side-effect.
3675
return true;
3676
3677
case StmtExprClass: {
3678
// StmtExprs have a side-effect if any substatement does.
3679
SideEffectFinder Finder(Ctx, IncludePossibleEffects);
3680
Finder.Visit(cast<StmtExpr>(this)->getSubStmt());
3681
return Finder.hasSideEffects();
3682
}
3683
3684
case ExprWithCleanupsClass:
3685
if (IncludePossibleEffects)
3686
if (cast<ExprWithCleanups>(this)->cleanupsHaveSideEffects())
3687
return true;
3688
break;
3689
3690
case ParenExprClass:
3691
case ArraySubscriptExprClass:
3692
case MatrixSubscriptExprClass:
3693
case ArraySectionExprClass:
3694
case OMPArrayShapingExprClass:
3695
case OMPIteratorExprClass:
3696
case MemberExprClass:
3697
case ConditionalOperatorClass:
3698
case BinaryConditionalOperatorClass:
3699
case CompoundLiteralExprClass:
3700
case ExtVectorElementExprClass:
3701
case DesignatedInitExprClass:
3702
case DesignatedInitUpdateExprClass:
3703
case ArrayInitLoopExprClass:
3704
case ParenListExprClass:
3705
case CXXPseudoDestructorExprClass:
3706
case CXXRewrittenBinaryOperatorClass:
3707
case CXXStdInitializerListExprClass:
3708
case SubstNonTypeTemplateParmExprClass:
3709
case MaterializeTemporaryExprClass:
3710
case ShuffleVectorExprClass:
3711
case ConvertVectorExprClass:
3712
case AsTypeExprClass:
3713
case CXXParenListInitExprClass:
3714
// These have a side-effect if any subexpression does.
3715
break;
3716
3717
case UnaryOperatorClass:
3718
if (cast<UnaryOperator>(this)->isIncrementDecrementOp())
3719
return true;
3720
break;
3721
3722
case BinaryOperatorClass:
3723
if (cast<BinaryOperator>(this)->isAssignmentOp())
3724
return true;
3725
break;
3726
3727
case InitListExprClass:
3728
// FIXME: The children for an InitListExpr doesn't include the array filler.
3729
if (const Expr *E = cast<InitListExpr>(this)->getArrayFiller())
3730
if (E->HasSideEffects(Ctx, IncludePossibleEffects))
3731
return true;
3732
break;
3733
3734
case GenericSelectionExprClass:
3735
return cast<GenericSelectionExpr>(this)->getResultExpr()->
3736
HasSideEffects(Ctx, IncludePossibleEffects);
3737
3738
case ChooseExprClass:
3739
return cast<ChooseExpr>(this)->getChosenSubExpr()->HasSideEffects(
3740
Ctx, IncludePossibleEffects);
3741
3742
case CXXDefaultArgExprClass:
3743
return cast<CXXDefaultArgExpr>(this)->getExpr()->HasSideEffects(
3744
Ctx, IncludePossibleEffects);
3745
3746
case CXXDefaultInitExprClass: {
3747
const FieldDecl *FD = cast<CXXDefaultInitExpr>(this)->getField();
3748
if (const Expr *E = FD->getInClassInitializer())
3749
return E->HasSideEffects(Ctx, IncludePossibleEffects);
3750
// If we've not yet parsed the initializer, assume it has side-effects.
3751
return true;
3752
}
3753
3754
case CXXDynamicCastExprClass: {
3755
// A dynamic_cast expression has side-effects if it can throw.
3756
const CXXDynamicCastExpr *DCE = cast<CXXDynamicCastExpr>(this);
3757
if (DCE->getTypeAsWritten()->isReferenceType() &&
3758
DCE->getCastKind() == CK_Dynamic)
3759
return true;
3760
}
3761
[[fallthrough]];
3762
case ImplicitCastExprClass:
3763
case CStyleCastExprClass:
3764
case CXXStaticCastExprClass:
3765
case CXXReinterpretCastExprClass:
3766
case CXXConstCastExprClass:
3767
case CXXAddrspaceCastExprClass:
3768
case CXXFunctionalCastExprClass:
3769
case BuiltinBitCastExprClass: {
3770
// While volatile reads are side-effecting in both C and C++, we treat them
3771
// as having possible (not definite) side-effects. This allows idiomatic
3772
// code to behave without warning, such as sizeof(*v) for a volatile-
3773
// qualified pointer.
3774
if (!IncludePossibleEffects)
3775
break;
3776
3777
const CastExpr *CE = cast<CastExpr>(this);
3778
if (CE->getCastKind() == CK_LValueToRValue &&
3779
CE->getSubExpr()->getType().isVolatileQualified())
3780
return true;
3781
break;
3782
}
3783
3784
case CXXTypeidExprClass: {
3785
const auto *TE = cast<CXXTypeidExpr>(this);
3786
if (!TE->isPotentiallyEvaluated())
3787
return false;
3788
3789
// If this type id expression can throw because of a null pointer, that is a
3790
// side-effect independent of if the operand has a side-effect
3791
if (IncludePossibleEffects && TE->hasNullCheck())
3792
return true;
3793
3794
break;
3795
}
3796
3797
case CXXConstructExprClass:
3798
case CXXTemporaryObjectExprClass: {
3799
const CXXConstructExpr *CE = cast<CXXConstructExpr>(this);
3800
if (!CE->getConstructor()->isTrivial() && IncludePossibleEffects)
3801
return true;
3802
// A trivial constructor does not add any side-effects of its own. Just look
3803
// at its arguments.
3804
break;
3805
}
3806
3807
case CXXInheritedCtorInitExprClass: {
3808
const auto *ICIE = cast<CXXInheritedCtorInitExpr>(this);
3809
if (!ICIE->getConstructor()->isTrivial() && IncludePossibleEffects)
3810
return true;
3811
break;
3812
}
3813
3814
case LambdaExprClass: {
3815
const LambdaExpr *LE = cast<LambdaExpr>(this);
3816
for (Expr *E : LE->capture_inits())
3817
if (E && E->HasSideEffects(Ctx, IncludePossibleEffects))
3818
return true;
3819
return false;
3820
}
3821
3822
case PseudoObjectExprClass: {
3823
// Only look for side-effects in the semantic form, and look past
3824
// OpaqueValueExpr bindings in that form.
3825
const PseudoObjectExpr *PO = cast<PseudoObjectExpr>(this);
3826
for (PseudoObjectExpr::const_semantics_iterator I = PO->semantics_begin(),
3827
E = PO->semantics_end();
3828
I != E; ++I) {
3829
const Expr *Subexpr = *I;
3830
if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(Subexpr))
3831
Subexpr = OVE->getSourceExpr();
3832
if (Subexpr->HasSideEffects(Ctx, IncludePossibleEffects))
3833
return true;
3834
}
3835
return false;
3836
}
3837
3838
case ObjCBoxedExprClass:
3839
case ObjCArrayLiteralClass:
3840
case ObjCDictionaryLiteralClass:
3841
case ObjCSelectorExprClass:
3842
case ObjCProtocolExprClass:
3843
case ObjCIsaExprClass:
3844
case ObjCIndirectCopyRestoreExprClass:
3845
case ObjCSubscriptRefExprClass:
3846
case ObjCBridgedCastExprClass:
3847
case ObjCMessageExprClass:
3848
case ObjCPropertyRefExprClass:
3849
// FIXME: Classify these cases better.
3850
if (IncludePossibleEffects)
3851
return true;
3852
break;
3853
}
3854
3855
// Recurse to children.
3856
for (const Stmt *SubStmt : children())
3857
if (SubStmt &&
3858
cast<Expr>(SubStmt)->HasSideEffects(Ctx, IncludePossibleEffects))
3859
return true;
3860
3861
return false;
3862
}
3863
3864
FPOptions Expr::getFPFeaturesInEffect(const LangOptions &LO) const {
3865
if (auto Call = dyn_cast<CallExpr>(this))
3866
return Call->getFPFeaturesInEffect(LO);
3867
if (auto UO = dyn_cast<UnaryOperator>(this))
3868
return UO->getFPFeaturesInEffect(LO);
3869
if (auto BO = dyn_cast<BinaryOperator>(this))
3870
return BO->getFPFeaturesInEffect(LO);
3871
if (auto Cast = dyn_cast<CastExpr>(this))
3872
return Cast->getFPFeaturesInEffect(LO);
3873
return FPOptions::defaultWithoutTrailingStorage(LO);
3874
}
3875
3876
namespace {
3877
/// Look for a call to a non-trivial function within an expression.
3878
class NonTrivialCallFinder : public ConstEvaluatedExprVisitor<NonTrivialCallFinder>
3879
{
3880
typedef ConstEvaluatedExprVisitor<NonTrivialCallFinder> Inherited;
3881
3882
bool NonTrivial;
3883
3884
public:
3885
explicit NonTrivialCallFinder(const ASTContext &Context)
3886
: Inherited(Context), NonTrivial(false) { }
3887
3888
bool hasNonTrivialCall() const { return NonTrivial; }
3889
3890
void VisitCallExpr(const CallExpr *E) {
3891
if (const CXXMethodDecl *Method
3892
= dyn_cast_or_null<const CXXMethodDecl>(E->getCalleeDecl())) {
3893
if (Method->isTrivial()) {
3894
// Recurse to children of the call.
3895
Inherited::VisitStmt(E);
3896
return;
3897
}
3898
}
3899
3900
NonTrivial = true;
3901
}
3902
3903
void VisitCXXConstructExpr(const CXXConstructExpr *E) {
3904
if (E->getConstructor()->isTrivial()) {
3905
// Recurse to children of the call.
3906
Inherited::VisitStmt(E);
3907
return;
3908
}
3909
3910
NonTrivial = true;
3911
}
3912
3913
void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *E) {
3914
// Destructor of the temporary might be null if destructor declaration
3915
// is not valid.
3916
if (const CXXDestructorDecl *DtorDecl =
3917
E->getTemporary()->getDestructor()) {
3918
if (DtorDecl->isTrivial()) {
3919
Inherited::VisitStmt(E);
3920
return;
3921
}
3922
}
3923
3924
NonTrivial = true;
3925
}
3926
};
3927
}
3928
3929
bool Expr::hasNonTrivialCall(const ASTContext &Ctx) const {
3930
NonTrivialCallFinder Finder(Ctx);
3931
Finder.Visit(this);
3932
return Finder.hasNonTrivialCall();
3933
}
3934
3935
/// isNullPointerConstant - C99 6.3.2.3p3 - Return whether this is a null
3936
/// pointer constant or not, as well as the specific kind of constant detected.
3937
/// Null pointer constants can be integer constant expressions with the
3938
/// value zero, casts of zero to void*, nullptr (C++0X), or __null
3939
/// (a GNU extension).
3940
Expr::NullPointerConstantKind
3941
Expr::isNullPointerConstant(ASTContext &Ctx,
3942
NullPointerConstantValueDependence NPC) const {
3943
if (isValueDependent() &&
3944
(!Ctx.getLangOpts().CPlusPlus11 || Ctx.getLangOpts().MSVCCompat)) {
3945
// Error-dependent expr should never be a null pointer.
3946
if (containsErrors())
3947
return NPCK_NotNull;
3948
switch (NPC) {
3949
case NPC_NeverValueDependent:
3950
llvm_unreachable("Unexpected value dependent expression!");
3951
case NPC_ValueDependentIsNull:
3952
if (isTypeDependent() || getType()->isIntegralType(Ctx))
3953
return NPCK_ZeroExpression;
3954
else
3955
return NPCK_NotNull;
3956
3957
case NPC_ValueDependentIsNotNull:
3958
return NPCK_NotNull;
3959
}
3960
}
3961
3962
// Strip off a cast to void*, if it exists. Except in C++.
3963
if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) {
3964
if (!Ctx.getLangOpts().CPlusPlus) {
3965
// Check that it is a cast to void*.
3966
if (const PointerType *PT = CE->getType()->getAs<PointerType>()) {
3967
QualType Pointee = PT->getPointeeType();
3968
Qualifiers Qs = Pointee.getQualifiers();
3969
// Only (void*)0 or equivalent are treated as nullptr. If pointee type
3970
// has non-default address space it is not treated as nullptr.
3971
// (__generic void*)0 in OpenCL 2.0 should not be treated as nullptr
3972
// since it cannot be assigned to a pointer to constant address space.
3973
if (Ctx.getLangOpts().OpenCL &&
3974
Pointee.getAddressSpace() == Ctx.getDefaultOpenCLPointeeAddrSpace())
3975
Qs.removeAddressSpace();
3976
3977
if (Pointee->isVoidType() && Qs.empty() && // to void*
3978
CE->getSubExpr()->getType()->isIntegerType()) // from int
3979
return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
3980
}
3981
}
3982
} else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) {
3983
// Ignore the ImplicitCastExpr type entirely.
3984
return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
3985
} else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) {
3986
// Accept ((void*)0) as a null pointer constant, as many other
3987
// implementations do.
3988
return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
3989
} else if (const GenericSelectionExpr *GE =
3990
dyn_cast<GenericSelectionExpr>(this)) {
3991
if (GE->isResultDependent())
3992
return NPCK_NotNull;
3993
return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC);
3994
} else if (const ChooseExpr *CE = dyn_cast<ChooseExpr>(this)) {
3995
if (CE->isConditionDependent())
3996
return NPCK_NotNull;
3997
return CE->getChosenSubExpr()->isNullPointerConstant(Ctx, NPC);
3998
} else if (const CXXDefaultArgExpr *DefaultArg
3999
= dyn_cast<CXXDefaultArgExpr>(this)) {
4000
// See through default argument expressions.
4001
return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
4002
} else if (const CXXDefaultInitExpr *DefaultInit
4003
= dyn_cast<CXXDefaultInitExpr>(this)) {
4004
// See through default initializer expressions.
4005
return DefaultInit->getExpr()->isNullPointerConstant(Ctx, NPC);
4006
} else if (isa<GNUNullExpr>(this)) {
4007
// The GNU __null extension is always a null pointer constant.
4008
return NPCK_GNUNull;
4009
} else if (const MaterializeTemporaryExpr *M
4010
= dyn_cast<MaterializeTemporaryExpr>(this)) {
4011
return M->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4012
} else if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(this)) {
4013
if (const Expr *Source = OVE->getSourceExpr())
4014
return Source->isNullPointerConstant(Ctx, NPC);
4015
}
4016
4017
// If the expression has no type information, it cannot be a null pointer
4018
// constant.
4019
if (getType().isNull())
4020
return NPCK_NotNull;
4021
4022
// C++11/C23 nullptr_t is always a null pointer constant.
4023
if (getType()->isNullPtrType())
4024
return NPCK_CXX11_nullptr;
4025
4026
if (const RecordType *UT = getType()->getAsUnionType())
4027
if (!Ctx.getLangOpts().CPlusPlus11 &&
4028
UT && UT->getDecl()->hasAttr<TransparentUnionAttr>())
4029
if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(this)){
4030
const Expr *InitExpr = CLE->getInitializer();
4031
if (const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
4032
return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
4033
}
4034
// This expression must be an integer type.
4035
if (!getType()->isIntegerType() ||
4036
(Ctx.getLangOpts().CPlusPlus && getType()->isEnumeralType()))
4037
return NPCK_NotNull;
4038
4039
if (Ctx.getLangOpts().CPlusPlus11) {
4040
// C++11 [conv.ptr]p1: A null pointer constant is an integer literal with
4041
// value zero or a prvalue of type std::nullptr_t.
4042
// Microsoft mode permits C++98 rules reflecting MSVC behavior.
4043
const IntegerLiteral *Lit = dyn_cast<IntegerLiteral>(this);
4044
if (Lit && !Lit->getValue())
4045
return NPCK_ZeroLiteral;
4046
if (!Ctx.getLangOpts().MSVCCompat || !isCXX98IntegralConstantExpr(Ctx))
4047
return NPCK_NotNull;
4048
} else {
4049
// If we have an integer constant expression, we need to *evaluate* it and
4050
// test for the value 0.
4051
if (!isIntegerConstantExpr(Ctx))
4052
return NPCK_NotNull;
4053
}
4054
4055
if (EvaluateKnownConstInt(Ctx) != 0)
4056
return NPCK_NotNull;
4057
4058
if (isa<IntegerLiteral>(this))
4059
return NPCK_ZeroLiteral;
4060
return NPCK_ZeroExpression;
4061
}
4062
4063
/// If this expression is an l-value for an Objective C
4064
/// property, find the underlying property reference expression.
4065
const ObjCPropertyRefExpr *Expr::getObjCProperty() const {
4066
const Expr *E = this;
4067
while (true) {
4068
assert((E->isLValue() && E->getObjectKind() == OK_ObjCProperty) &&
4069
"expression is not a property reference");
4070
E = E->IgnoreParenCasts();
4071
if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
4072
if (BO->getOpcode() == BO_Comma) {
4073
E = BO->getRHS();
4074
continue;
4075
}
4076
}
4077
4078
break;
4079
}
4080
4081
return cast<ObjCPropertyRefExpr>(E);
4082
}
4083
4084
bool Expr::isObjCSelfExpr() const {
4085
const Expr *E = IgnoreParenImpCasts();
4086
4087
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
4088
if (!DRE)
4089
return false;
4090
4091
const ImplicitParamDecl *Param = dyn_cast<ImplicitParamDecl>(DRE->getDecl());
4092
if (!Param)
4093
return false;
4094
4095
const ObjCMethodDecl *M = dyn_cast<ObjCMethodDecl>(Param->getDeclContext());
4096
if (!M)
4097
return false;
4098
4099
return M->getSelfDecl() == Param;
4100
}
4101
4102
FieldDecl *Expr::getSourceBitField() {
4103
Expr *E = this->IgnoreParens();
4104
4105
while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
4106
if (ICE->getCastKind() == CK_LValueToRValue ||
4107
(ICE->isGLValue() && ICE->getCastKind() == CK_NoOp))
4108
E = ICE->getSubExpr()->IgnoreParens();
4109
else
4110
break;
4111
}
4112
4113
if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
4114
if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
4115
if (Field->isBitField())
4116
return Field;
4117
4118
if (ObjCIvarRefExpr *IvarRef = dyn_cast<ObjCIvarRefExpr>(E)) {
4119
FieldDecl *Ivar = IvarRef->getDecl();
4120
if (Ivar->isBitField())
4121
return Ivar;
4122
}
4123
4124
if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E)) {
4125
if (FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
4126
if (Field->isBitField())
4127
return Field;
4128
4129
if (BindingDecl *BD = dyn_cast<BindingDecl>(DeclRef->getDecl()))
4130
if (Expr *E = BD->getBinding())
4131
return E->getSourceBitField();
4132
}
4133
4134
if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E)) {
4135
if (BinOp->isAssignmentOp() && BinOp->getLHS())
4136
return BinOp->getLHS()->getSourceBitField();
4137
4138
if (BinOp->getOpcode() == BO_Comma && BinOp->getRHS())
4139
return BinOp->getRHS()->getSourceBitField();
4140
}
4141
4142
if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(E))
4143
if (UnOp->isPrefix() && UnOp->isIncrementDecrementOp())
4144
return UnOp->getSubExpr()->getSourceBitField();
4145
4146
return nullptr;
4147
}
4148
4149
EnumConstantDecl *Expr::getEnumConstantDecl() {
4150
Expr *E = this->IgnoreParenImpCasts();
4151
if (auto *DRE = dyn_cast<DeclRefExpr>(E))
4152
return dyn_cast<EnumConstantDecl>(DRE->getDecl());
4153
return nullptr;
4154
}
4155
4156
bool Expr::refersToVectorElement() const {
4157
// FIXME: Why do we not just look at the ObjectKind here?
4158
const Expr *E = this->IgnoreParens();
4159
4160
while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
4161
if (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp)
4162
E = ICE->getSubExpr()->IgnoreParens();
4163
else
4164
break;
4165
}
4166
4167
if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E))
4168
return ASE->getBase()->getType()->isVectorType();
4169
4170
if (isa<ExtVectorElementExpr>(E))
4171
return true;
4172
4173
if (auto *DRE = dyn_cast<DeclRefExpr>(E))
4174
if (auto *BD = dyn_cast<BindingDecl>(DRE->getDecl()))
4175
if (auto *E = BD->getBinding())
4176
return E->refersToVectorElement();
4177
4178
return false;
4179
}
4180
4181
bool Expr::refersToGlobalRegisterVar() const {
4182
const Expr *E = this->IgnoreParenImpCasts();
4183
4184
if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
4185
if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
4186
if (VD->getStorageClass() == SC_Register &&
4187
VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
4188
return true;
4189
4190
return false;
4191
}
4192
4193
bool Expr::isSameComparisonOperand(const Expr* E1, const Expr* E2) {
4194
E1 = E1->IgnoreParens();
4195
E2 = E2->IgnoreParens();
4196
4197
if (E1->getStmtClass() != E2->getStmtClass())
4198
return false;
4199
4200
switch (E1->getStmtClass()) {
4201
default:
4202
return false;
4203
case CXXThisExprClass:
4204
return true;
4205
case DeclRefExprClass: {
4206
// DeclRefExpr without an ImplicitCastExpr can happen for integral
4207
// template parameters.
4208
const auto *DRE1 = cast<DeclRefExpr>(E1);
4209
const auto *DRE2 = cast<DeclRefExpr>(E2);
4210
return DRE1->isPRValue() && DRE2->isPRValue() &&
4211
DRE1->getDecl() == DRE2->getDecl();
4212
}
4213
case ImplicitCastExprClass: {
4214
// Peel off implicit casts.
4215
while (true) {
4216
const auto *ICE1 = dyn_cast<ImplicitCastExpr>(E1);
4217
const auto *ICE2 = dyn_cast<ImplicitCastExpr>(E2);
4218
if (!ICE1 || !ICE2)
4219
return false;
4220
if (ICE1->getCastKind() != ICE2->getCastKind())
4221
return false;
4222
E1 = ICE1->getSubExpr()->IgnoreParens();
4223
E2 = ICE2->getSubExpr()->IgnoreParens();
4224
// The final cast must be one of these types.
4225
if (ICE1->getCastKind() == CK_LValueToRValue ||
4226
ICE1->getCastKind() == CK_ArrayToPointerDecay ||
4227
ICE1->getCastKind() == CK_FunctionToPointerDecay) {
4228
break;
4229
}
4230
}
4231
4232
const auto *DRE1 = dyn_cast<DeclRefExpr>(E1);
4233
const auto *DRE2 = dyn_cast<DeclRefExpr>(E2);
4234
if (DRE1 && DRE2)
4235
return declaresSameEntity(DRE1->getDecl(), DRE2->getDecl());
4236
4237
const auto *Ivar1 = dyn_cast<ObjCIvarRefExpr>(E1);
4238
const auto *Ivar2 = dyn_cast<ObjCIvarRefExpr>(E2);
4239
if (Ivar1 && Ivar2) {
4240
return Ivar1->isFreeIvar() && Ivar2->isFreeIvar() &&
4241
declaresSameEntity(Ivar1->getDecl(), Ivar2->getDecl());
4242
}
4243
4244
const auto *Array1 = dyn_cast<ArraySubscriptExpr>(E1);
4245
const auto *Array2 = dyn_cast<ArraySubscriptExpr>(E2);
4246
if (Array1 && Array2) {
4247
if (!isSameComparisonOperand(Array1->getBase(), Array2->getBase()))
4248
return false;
4249
4250
auto Idx1 = Array1->getIdx();
4251
auto Idx2 = Array2->getIdx();
4252
const auto Integer1 = dyn_cast<IntegerLiteral>(Idx1);
4253
const auto Integer2 = dyn_cast<IntegerLiteral>(Idx2);
4254
if (Integer1 && Integer2) {
4255
if (!llvm::APInt::isSameValue(Integer1->getValue(),
4256
Integer2->getValue()))
4257
return false;
4258
} else {
4259
if (!isSameComparisonOperand(Idx1, Idx2))
4260
return false;
4261
}
4262
4263
return true;
4264
}
4265
4266
// Walk the MemberExpr chain.
4267
while (isa<MemberExpr>(E1) && isa<MemberExpr>(E2)) {
4268
const auto *ME1 = cast<MemberExpr>(E1);
4269
const auto *ME2 = cast<MemberExpr>(E2);
4270
if (!declaresSameEntity(ME1->getMemberDecl(), ME2->getMemberDecl()))
4271
return false;
4272
if (const auto *D = dyn_cast<VarDecl>(ME1->getMemberDecl()))
4273
if (D->isStaticDataMember())
4274
return true;
4275
E1 = ME1->getBase()->IgnoreParenImpCasts();
4276
E2 = ME2->getBase()->IgnoreParenImpCasts();
4277
}
4278
4279
if (isa<CXXThisExpr>(E1) && isa<CXXThisExpr>(E2))
4280
return true;
4281
4282
// A static member variable can end the MemberExpr chain with either
4283
// a MemberExpr or a DeclRefExpr.
4284
auto getAnyDecl = [](const Expr *E) -> const ValueDecl * {
4285
if (const auto *DRE = dyn_cast<DeclRefExpr>(E))
4286
return DRE->getDecl();
4287
if (const auto *ME = dyn_cast<MemberExpr>(E))
4288
return ME->getMemberDecl();
4289
return nullptr;
4290
};
4291
4292
const ValueDecl *VD1 = getAnyDecl(E1);
4293
const ValueDecl *VD2 = getAnyDecl(E2);
4294
return declaresSameEntity(VD1, VD2);
4295
}
4296
}
4297
}
4298
4299
/// isArrow - Return true if the base expression is a pointer to vector,
4300
/// return false if the base expression is a vector.
4301
bool ExtVectorElementExpr::isArrow() const {
4302
return getBase()->getType()->isPointerType();
4303
}
4304
4305
unsigned ExtVectorElementExpr::getNumElements() const {
4306
if (const VectorType *VT = getType()->getAs<VectorType>())
4307
return VT->getNumElements();
4308
return 1;
4309
}
4310
4311
/// containsDuplicateElements - Return true if any element access is repeated.
4312
bool ExtVectorElementExpr::containsDuplicateElements() const {
4313
// FIXME: Refactor this code to an accessor on the AST node which returns the
4314
// "type" of component access, and share with code below and in Sema.
4315
StringRef Comp = Accessor->getName();
4316
4317
// Halving swizzles do not contain duplicate elements.
4318
if (Comp == "hi" || Comp == "lo" || Comp == "even" || Comp == "odd")
4319
return false;
4320
4321
// Advance past s-char prefix on hex swizzles.
4322
if (Comp[0] == 's' || Comp[0] == 'S')
4323
Comp = Comp.substr(1);
4324
4325
for (unsigned i = 0, e = Comp.size(); i != e; ++i)
4326
if (Comp.substr(i + 1).contains(Comp[i]))
4327
return true;
4328
4329
return false;
4330
}
4331
4332
/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray.
4333
void ExtVectorElementExpr::getEncodedElementAccess(
4334
SmallVectorImpl<uint32_t> &Elts) const {
4335
StringRef Comp = Accessor->getName();
4336
bool isNumericAccessor = false;
4337
if (Comp[0] == 's' || Comp[0] == 'S') {
4338
Comp = Comp.substr(1);
4339
isNumericAccessor = true;
4340
}
4341
4342
bool isHi = Comp == "hi";
4343
bool isLo = Comp == "lo";
4344
bool isEven = Comp == "even";
4345
bool isOdd = Comp == "odd";
4346
4347
for (unsigned i = 0, e = getNumElements(); i != e; ++i) {
4348
uint64_t Index;
4349
4350
if (isHi)
4351
Index = e + i;
4352
else if (isLo)
4353
Index = i;
4354
else if (isEven)
4355
Index = 2 * i;
4356
else if (isOdd)
4357
Index = 2 * i + 1;
4358
else
4359
Index = ExtVectorType::getAccessorIdx(Comp[i], isNumericAccessor);
4360
4361
Elts.push_back(Index);
4362
}
4363
}
4364
4365
ShuffleVectorExpr::ShuffleVectorExpr(const ASTContext &C, ArrayRef<Expr *> args,
4366
QualType Type, SourceLocation BLoc,
4367
SourceLocation RP)
4368
: Expr(ShuffleVectorExprClass, Type, VK_PRValue, OK_Ordinary),
4369
BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(args.size()) {
4370
SubExprs = new (C) Stmt*[args.size()];
4371
for (unsigned i = 0; i != args.size(); i++)
4372
SubExprs[i] = args[i];
4373
4374
setDependence(computeDependence(this));
4375
}
4376
4377
void ShuffleVectorExpr::setExprs(const ASTContext &C, ArrayRef<Expr *> Exprs) {
4378
if (SubExprs) C.Deallocate(SubExprs);
4379
4380
this->NumExprs = Exprs.size();
4381
SubExprs = new (C) Stmt*[NumExprs];
4382
memcpy(SubExprs, Exprs.data(), sizeof(Expr *) * Exprs.size());
4383
}
4384
4385
GenericSelectionExpr::GenericSelectionExpr(
4386
const ASTContext &, SourceLocation GenericLoc, Expr *ControllingExpr,
4387
ArrayRef<TypeSourceInfo *> AssocTypes, ArrayRef<Expr *> AssocExprs,
4388
SourceLocation DefaultLoc, SourceLocation RParenLoc,
4389
bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
4390
: Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->getType(),
4391
AssocExprs[ResultIndex]->getValueKind(),
4392
AssocExprs[ResultIndex]->getObjectKind()),
4393
NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4394
IsExprPredicate(true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4395
assert(AssocTypes.size() == AssocExprs.size() &&
4396
"Must have the same number of association expressions"
4397
" and TypeSourceInfo!");
4398
assert(ResultIndex < NumAssocs && "ResultIndex is out-of-bounds!");
4399
4400
GenericSelectionExprBits.GenericLoc = GenericLoc;
4401
getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4402
ControllingExpr;
4403
std::copy(AssocExprs.begin(), AssocExprs.end(),
4404
getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4405
std::copy(AssocTypes.begin(), AssocTypes.end(),
4406
getTrailingObjects<TypeSourceInfo *>() +
4407
getIndexOfStartOfAssociatedTypes());
4408
4409
setDependence(computeDependence(this, ContainsUnexpandedParameterPack));
4410
}
4411
4412
GenericSelectionExpr::GenericSelectionExpr(
4413
const ASTContext &, SourceLocation GenericLoc,
4414
TypeSourceInfo *ControllingType, ArrayRef<TypeSourceInfo *> AssocTypes,
4415
ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc,
4416
SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack,
4417
unsigned ResultIndex)
4418
: Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->getType(),
4419
AssocExprs[ResultIndex]->getValueKind(),
4420
AssocExprs[ResultIndex]->getObjectKind()),
4421
NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4422
IsExprPredicate(false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4423
assert(AssocTypes.size() == AssocExprs.size() &&
4424
"Must have the same number of association expressions"
4425
" and TypeSourceInfo!");
4426
assert(ResultIndex < NumAssocs && "ResultIndex is out-of-bounds!");
4427
4428
GenericSelectionExprBits.GenericLoc = GenericLoc;
4429
getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4430
ControllingType;
4431
std::copy(AssocExprs.begin(), AssocExprs.end(),
4432
getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4433
std::copy(AssocTypes.begin(), AssocTypes.end(),
4434
getTrailingObjects<TypeSourceInfo *>() +
4435
getIndexOfStartOfAssociatedTypes());
4436
4437
setDependence(computeDependence(this, ContainsUnexpandedParameterPack));
4438
}
4439
4440
GenericSelectionExpr::GenericSelectionExpr(
4441
const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr,
4442
ArrayRef<TypeSourceInfo *> AssocTypes, ArrayRef<Expr *> AssocExprs,
4443
SourceLocation DefaultLoc, SourceLocation RParenLoc,
4444
bool ContainsUnexpandedParameterPack)
4445
: Expr(GenericSelectionExprClass, Context.DependentTy, VK_PRValue,
4446
OK_Ordinary),
4447
NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4448
IsExprPredicate(true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4449
assert(AssocTypes.size() == AssocExprs.size() &&
4450
"Must have the same number of association expressions"
4451
" and TypeSourceInfo!");
4452
4453
GenericSelectionExprBits.GenericLoc = GenericLoc;
4454
getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4455
ControllingExpr;
4456
std::copy(AssocExprs.begin(), AssocExprs.end(),
4457
getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4458
std::copy(AssocTypes.begin(), AssocTypes.end(),
4459
getTrailingObjects<TypeSourceInfo *>() +
4460
getIndexOfStartOfAssociatedTypes());
4461
4462
setDependence(computeDependence(this, ContainsUnexpandedParameterPack));
4463
}
4464
4465
GenericSelectionExpr::GenericSelectionExpr(
4466
const ASTContext &Context, SourceLocation GenericLoc,
4467
TypeSourceInfo *ControllingType, ArrayRef<TypeSourceInfo *> AssocTypes,
4468
ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc,
4469
SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack)
4470
: Expr(GenericSelectionExprClass, Context.DependentTy, VK_PRValue,
4471
OK_Ordinary),
4472
NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4473
IsExprPredicate(false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4474
assert(AssocTypes.size() == AssocExprs.size() &&
4475
"Must have the same number of association expressions"
4476
" and TypeSourceInfo!");
4477
4478
GenericSelectionExprBits.GenericLoc = GenericLoc;
4479
getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4480
ControllingType;
4481
std::copy(AssocExprs.begin(), AssocExprs.end(),
4482
getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4483
std::copy(AssocTypes.begin(), AssocTypes.end(),
4484
getTrailingObjects<TypeSourceInfo *>() +
4485
getIndexOfStartOfAssociatedTypes());
4486
4487
setDependence(computeDependence(this, ContainsUnexpandedParameterPack));
4488
}
4489
4490
GenericSelectionExpr::GenericSelectionExpr(EmptyShell Empty, unsigned NumAssocs)
4491
: Expr(GenericSelectionExprClass, Empty), NumAssocs(NumAssocs) {}
4492
4493
GenericSelectionExpr *GenericSelectionExpr::Create(
4494
const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr,
4495
ArrayRef<TypeSourceInfo *> AssocTypes, ArrayRef<Expr *> AssocExprs,
4496
SourceLocation DefaultLoc, SourceLocation RParenLoc,
4497
bool ContainsUnexpandedParameterPack, unsigned ResultIndex) {
4498
unsigned NumAssocs = AssocExprs.size();
4499
void *Mem = Context.Allocate(
4500
totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4501
alignof(GenericSelectionExpr));
4502
return new (Mem) GenericSelectionExpr(
4503
Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4504
RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4505
}
4506
4507
GenericSelectionExpr *GenericSelectionExpr::Create(
4508
const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr,
4509
ArrayRef<TypeSourceInfo *> AssocTypes, ArrayRef<Expr *> AssocExprs,
4510
SourceLocation DefaultLoc, SourceLocation RParenLoc,
4511
bool ContainsUnexpandedParameterPack) {
4512
unsigned NumAssocs = AssocExprs.size();
4513
void *Mem = Context.Allocate(
4514
totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4515
alignof(GenericSelectionExpr));
4516
return new (Mem) GenericSelectionExpr(
4517
Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4518
RParenLoc, ContainsUnexpandedParameterPack);
4519
}
4520
4521
GenericSelectionExpr *GenericSelectionExpr::Create(
4522
const ASTContext &Context, SourceLocation GenericLoc,
4523
TypeSourceInfo *ControllingType, ArrayRef<TypeSourceInfo *> AssocTypes,
4524
ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc,
4525
SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack,
4526
unsigned ResultIndex) {
4527
unsigned NumAssocs = AssocExprs.size();
4528
void *Mem = Context.Allocate(
4529
totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4530
alignof(GenericSelectionExpr));
4531
return new (Mem) GenericSelectionExpr(
4532
Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4533
RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4534
}
4535
4536
GenericSelectionExpr *GenericSelectionExpr::Create(
4537
const ASTContext &Context, SourceLocation GenericLoc,
4538
TypeSourceInfo *ControllingType, ArrayRef<TypeSourceInfo *> AssocTypes,
4539
ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc,
4540
SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack) {
4541
unsigned NumAssocs = AssocExprs.size();
4542
void *Mem = Context.Allocate(
4543
totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4544
alignof(GenericSelectionExpr));
4545
return new (Mem) GenericSelectionExpr(
4546
Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4547
RParenLoc, ContainsUnexpandedParameterPack);
4548
}
4549
4550
GenericSelectionExpr *
4551
GenericSelectionExpr::CreateEmpty(const ASTContext &Context,
4552
unsigned NumAssocs) {
4553
void *Mem = Context.Allocate(
4554
totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4555
alignof(GenericSelectionExpr));
4556
return new (Mem) GenericSelectionExpr(EmptyShell(), NumAssocs);
4557
}
4558
4559
//===----------------------------------------------------------------------===//
4560
// DesignatedInitExpr
4561
//===----------------------------------------------------------------------===//
4562
4563
const IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() const {
4564
assert(isFieldDesignator() && "Only valid on a field designator");
4565
if (FieldInfo.NameOrField & 0x01)
4566
return reinterpret_cast<IdentifierInfo *>(FieldInfo.NameOrField & ~0x01);
4567
return getFieldDecl()->getIdentifier();
4568
}
4569
4570
DesignatedInitExpr::DesignatedInitExpr(const ASTContext &C, QualType Ty,
4571
llvm::ArrayRef<Designator> Designators,
4572
SourceLocation EqualOrColonLoc,
4573
bool GNUSyntax,
4574
ArrayRef<Expr *> IndexExprs, Expr *Init)
4575
: Expr(DesignatedInitExprClass, Ty, Init->getValueKind(),
4576
Init->getObjectKind()),
4577
EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
4578
NumDesignators(Designators.size()), NumSubExprs(IndexExprs.size() + 1) {
4579
this->Designators = new (C) Designator[NumDesignators];
4580
4581
// Record the initializer itself.
4582
child_iterator Child = child_begin();
4583
*Child++ = Init;
4584
4585
// Copy the designators and their subexpressions, computing
4586
// value-dependence along the way.
4587
unsigned IndexIdx = 0;
4588
for (unsigned I = 0; I != NumDesignators; ++I) {
4589
this->Designators[I] = Designators[I];
4590
if (this->Designators[I].isArrayDesignator()) {
4591
// Copy the index expressions into permanent storage.
4592
*Child++ = IndexExprs[IndexIdx++];
4593
} else if (this->Designators[I].isArrayRangeDesignator()) {
4594
// Copy the start/end expressions into permanent storage.
4595
*Child++ = IndexExprs[IndexIdx++];
4596
*Child++ = IndexExprs[IndexIdx++];
4597
}
4598
}
4599
4600
assert(IndexIdx == IndexExprs.size() && "Wrong number of index expressions");
4601
setDependence(computeDependence(this));
4602
}
4603
4604
DesignatedInitExpr *
4605
DesignatedInitExpr::Create(const ASTContext &C,
4606
llvm::ArrayRef<Designator> Designators,
4607
ArrayRef<Expr*> IndexExprs,
4608
SourceLocation ColonOrEqualLoc,
4609
bool UsesColonSyntax, Expr *Init) {
4610
void *Mem = C.Allocate(totalSizeToAlloc<Stmt *>(IndexExprs.size() + 1),
4611
alignof(DesignatedInitExpr));
4612
return new (Mem) DesignatedInitExpr(C, C.VoidTy, Designators,
4613
ColonOrEqualLoc, UsesColonSyntax,
4614
IndexExprs, Init);
4615
}
4616
4617
DesignatedInitExpr *DesignatedInitExpr::CreateEmpty(const ASTContext &C,
4618
unsigned NumIndexExprs) {
4619
void *Mem = C.Allocate(totalSizeToAlloc<Stmt *>(NumIndexExprs + 1),
4620
alignof(DesignatedInitExpr));
4621
return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
4622
}
4623
4624
void DesignatedInitExpr::setDesignators(const ASTContext &C,
4625
const Designator *Desigs,
4626
unsigned NumDesigs) {
4627
Designators = new (C) Designator[NumDesigs];
4628
NumDesignators = NumDesigs;
4629
for (unsigned I = 0; I != NumDesigs; ++I)
4630
Designators[I] = Desigs[I];
4631
}
4632
4633
SourceRange DesignatedInitExpr::getDesignatorsSourceRange() const {
4634
DesignatedInitExpr *DIE = const_cast<DesignatedInitExpr*>(this);
4635
if (size() == 1)
4636
return DIE->getDesignator(0)->getSourceRange();
4637
return SourceRange(DIE->getDesignator(0)->getBeginLoc(),
4638
DIE->getDesignator(size() - 1)->getEndLoc());
4639
}
4640
4641
SourceLocation DesignatedInitExpr::getBeginLoc() const {
4642
auto *DIE = const_cast<DesignatedInitExpr *>(this);
4643
Designator &First = *DIE->getDesignator(0);
4644
if (First.isFieldDesignator()) {
4645
// Skip past implicit designators for anonymous structs/unions, since
4646
// these do not have valid source locations.
4647
for (unsigned int i = 0; i < DIE->size(); i++) {
4648
Designator &Des = *DIE->getDesignator(i);
4649
SourceLocation retval = GNUSyntax ? Des.getFieldLoc() : Des.getDotLoc();
4650
if (!retval.isValid())
4651
continue;
4652
return retval;
4653
}
4654
}
4655
return First.getLBracketLoc();
4656
}
4657
4658
SourceLocation DesignatedInitExpr::getEndLoc() const {
4659
return getInit()->getEndLoc();
4660
}
4661
4662
Expr *DesignatedInitExpr::getArrayIndex(const Designator& D) const {
4663
assert(D.isArrayDesignator() && "Requires array designator");
4664
return getSubExpr(D.getArrayIndex() + 1);
4665
}
4666
4667
Expr *DesignatedInitExpr::getArrayRangeStart(const Designator &D) const {
4668
assert(D.isArrayRangeDesignator() && "Requires array range designator");
4669
return getSubExpr(D.getArrayIndex() + 1);
4670
}
4671
4672
Expr *DesignatedInitExpr::getArrayRangeEnd(const Designator &D) const {
4673
assert(D.isArrayRangeDesignator() && "Requires array range designator");
4674
return getSubExpr(D.getArrayIndex() + 2);
4675
}
4676
4677
/// Replaces the designator at index @p Idx with the series
4678
/// of designators in [First, Last).
4679
void DesignatedInitExpr::ExpandDesignator(const ASTContext &C, unsigned Idx,
4680
const Designator *First,
4681
const Designator *Last) {
4682
unsigned NumNewDesignators = Last - First;
4683
if (NumNewDesignators == 0) {
4684
std::copy_backward(Designators + Idx + 1,
4685
Designators + NumDesignators,
4686
Designators + Idx);
4687
--NumNewDesignators;
4688
return;
4689
}
4690
if (NumNewDesignators == 1) {
4691
Designators[Idx] = *First;
4692
return;
4693
}
4694
4695
Designator *NewDesignators
4696
= new (C) Designator[NumDesignators - 1 + NumNewDesignators];
4697
std::copy(Designators, Designators + Idx, NewDesignators);
4698
std::copy(First, Last, NewDesignators + Idx);
4699
std::copy(Designators + Idx + 1, Designators + NumDesignators,
4700
NewDesignators + Idx + NumNewDesignators);
4701
Designators = NewDesignators;
4702
NumDesignators = NumDesignators - 1 + NumNewDesignators;
4703
}
4704
4705
DesignatedInitUpdateExpr::DesignatedInitUpdateExpr(const ASTContext &C,
4706
SourceLocation lBraceLoc,
4707
Expr *baseExpr,
4708
SourceLocation rBraceLoc)
4709
: Expr(DesignatedInitUpdateExprClass, baseExpr->getType(), VK_PRValue,
4710
OK_Ordinary) {
4711
BaseAndUpdaterExprs[0] = baseExpr;
4712
4713
InitListExpr *ILE =
4714
new (C) InitListExpr(C, lBraceLoc, std::nullopt, rBraceLoc);
4715
ILE->setType(baseExpr->getType());
4716
BaseAndUpdaterExprs[1] = ILE;
4717
4718
// FIXME: this is wrong, set it correctly.
4719
setDependence(ExprDependence::None);
4720
}
4721
4722
SourceLocation DesignatedInitUpdateExpr::getBeginLoc() const {
4723
return getBase()->getBeginLoc();
4724
}
4725
4726
SourceLocation DesignatedInitUpdateExpr::getEndLoc() const {
4727
return getBase()->getEndLoc();
4728
}
4729
4730
ParenListExpr::ParenListExpr(SourceLocation LParenLoc, ArrayRef<Expr *> Exprs,
4731
SourceLocation RParenLoc)
4732
: Expr(ParenListExprClass, QualType(), VK_PRValue, OK_Ordinary),
4733
LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4734
ParenListExprBits.NumExprs = Exprs.size();
4735
4736
for (unsigned I = 0, N = Exprs.size(); I != N; ++I)
4737
getTrailingObjects<Stmt *>()[I] = Exprs[I];
4738
setDependence(computeDependence(this));
4739
}
4740
4741
ParenListExpr::ParenListExpr(EmptyShell Empty, unsigned NumExprs)
4742
: Expr(ParenListExprClass, Empty) {
4743
ParenListExprBits.NumExprs = NumExprs;
4744
}
4745
4746
ParenListExpr *ParenListExpr::Create(const ASTContext &Ctx,
4747
SourceLocation LParenLoc,
4748
ArrayRef<Expr *> Exprs,
4749
SourceLocation RParenLoc) {
4750
void *Mem = Ctx.Allocate(totalSizeToAlloc<Stmt *>(Exprs.size()),
4751
alignof(ParenListExpr));
4752
return new (Mem) ParenListExpr(LParenLoc, Exprs, RParenLoc);
4753
}
4754
4755
ParenListExpr *ParenListExpr::CreateEmpty(const ASTContext &Ctx,
4756
unsigned NumExprs) {
4757
void *Mem =
4758
Ctx.Allocate(totalSizeToAlloc<Stmt *>(NumExprs), alignof(ParenListExpr));
4759
return new (Mem) ParenListExpr(EmptyShell(), NumExprs);
4760
}
4761
4762
BinaryOperator::BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs,
4763
Opcode opc, QualType ResTy, ExprValueKind VK,
4764
ExprObjectKind OK, SourceLocation opLoc,
4765
FPOptionsOverride FPFeatures)
4766
: Expr(BinaryOperatorClass, ResTy, VK, OK) {
4767
BinaryOperatorBits.Opc = opc;
4768
assert(!isCompoundAssignmentOp() &&
4769
"Use CompoundAssignOperator for compound assignments");
4770
BinaryOperatorBits.OpLoc = opLoc;
4771
SubExprs[LHS] = lhs;
4772
SubExprs[RHS] = rhs;
4773
BinaryOperatorBits.HasFPFeatures = FPFeatures.requiresTrailingStorage();
4774
if (hasStoredFPFeatures())
4775
setStoredFPFeatures(FPFeatures);
4776
setDependence(computeDependence(this));
4777
}
4778
4779
BinaryOperator::BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs,
4780
Opcode opc, QualType ResTy, ExprValueKind VK,
4781
ExprObjectKind OK, SourceLocation opLoc,
4782
FPOptionsOverride FPFeatures, bool dead2)
4783
: Expr(CompoundAssignOperatorClass, ResTy, VK, OK) {
4784
BinaryOperatorBits.Opc = opc;
4785
assert(isCompoundAssignmentOp() &&
4786
"Use CompoundAssignOperator for compound assignments");
4787
BinaryOperatorBits.OpLoc = opLoc;
4788
SubExprs[LHS] = lhs;
4789
SubExprs[RHS] = rhs;
4790
BinaryOperatorBits.HasFPFeatures = FPFeatures.requiresTrailingStorage();
4791
if (hasStoredFPFeatures())
4792
setStoredFPFeatures(FPFeatures);
4793
setDependence(computeDependence(this));
4794
}
4795
4796
BinaryOperator *BinaryOperator::CreateEmpty(const ASTContext &C,
4797
bool HasFPFeatures) {
4798
unsigned Extra = sizeOfTrailingObjects(HasFPFeatures);
4799
void *Mem =
4800
C.Allocate(sizeof(BinaryOperator) + Extra, alignof(BinaryOperator));
4801
return new (Mem) BinaryOperator(EmptyShell());
4802
}
4803
4804
BinaryOperator *BinaryOperator::Create(const ASTContext &C, Expr *lhs,
4805
Expr *rhs, Opcode opc, QualType ResTy,
4806
ExprValueKind VK, ExprObjectKind OK,
4807
SourceLocation opLoc,
4808
FPOptionsOverride FPFeatures) {
4809
bool HasFPFeatures = FPFeatures.requiresTrailingStorage();
4810
unsigned Extra = sizeOfTrailingObjects(HasFPFeatures);
4811
void *Mem =
4812
C.Allocate(sizeof(BinaryOperator) + Extra, alignof(BinaryOperator));
4813
return new (Mem)
4814
BinaryOperator(C, lhs, rhs, opc, ResTy, VK, OK, opLoc, FPFeatures);
4815
}
4816
4817
CompoundAssignOperator *
4818
CompoundAssignOperator::CreateEmpty(const ASTContext &C, bool HasFPFeatures) {
4819
unsigned Extra = sizeOfTrailingObjects(HasFPFeatures);
4820
void *Mem = C.Allocate(sizeof(CompoundAssignOperator) + Extra,
4821
alignof(CompoundAssignOperator));
4822
return new (Mem) CompoundAssignOperator(C, EmptyShell(), HasFPFeatures);
4823
}
4824
4825
CompoundAssignOperator *
4826
CompoundAssignOperator::Create(const ASTContext &C, Expr *lhs, Expr *rhs,
4827
Opcode opc, QualType ResTy, ExprValueKind VK,
4828
ExprObjectKind OK, SourceLocation opLoc,
4829
FPOptionsOverride FPFeatures,
4830
QualType CompLHSType, QualType CompResultType) {
4831
bool HasFPFeatures = FPFeatures.requiresTrailingStorage();
4832
unsigned Extra = sizeOfTrailingObjects(HasFPFeatures);
4833
void *Mem = C.Allocate(sizeof(CompoundAssignOperator) + Extra,
4834
alignof(CompoundAssignOperator));
4835
return new (Mem)
4836
CompoundAssignOperator(C, lhs, rhs, opc, ResTy, VK, OK, opLoc, FPFeatures,
4837
CompLHSType, CompResultType);
4838
}
4839
4840
UnaryOperator *UnaryOperator::CreateEmpty(const ASTContext &C,
4841
bool hasFPFeatures) {
4842
void *Mem = C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
4843
alignof(UnaryOperator));
4844
return new (Mem) UnaryOperator(hasFPFeatures, EmptyShell());
4845
}
4846
4847
UnaryOperator::UnaryOperator(const ASTContext &Ctx, Expr *input, Opcode opc,
4848
QualType type, ExprValueKind VK, ExprObjectKind OK,
4849
SourceLocation l, bool CanOverflow,
4850
FPOptionsOverride FPFeatures)
4851
: Expr(UnaryOperatorClass, type, VK, OK), Val(input) {
4852
UnaryOperatorBits.Opc = opc;
4853
UnaryOperatorBits.CanOverflow = CanOverflow;
4854
UnaryOperatorBits.Loc = l;
4855
UnaryOperatorBits.HasFPFeatures = FPFeatures.requiresTrailingStorage();
4856
if (hasStoredFPFeatures())
4857
setStoredFPFeatures(FPFeatures);
4858
setDependence(computeDependence(this, Ctx));
4859
}
4860
4861
UnaryOperator *UnaryOperator::Create(const ASTContext &C, Expr *input,
4862
Opcode opc, QualType type,
4863
ExprValueKind VK, ExprObjectKind OK,
4864
SourceLocation l, bool CanOverflow,
4865
FPOptionsOverride FPFeatures) {
4866
bool HasFPFeatures = FPFeatures.requiresTrailingStorage();
4867
unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
4868
void *Mem = C.Allocate(Size, alignof(UnaryOperator));
4869
return new (Mem)
4870
UnaryOperator(C, input, opc, type, VK, OK, l, CanOverflow, FPFeatures);
4871
}
4872
4873
const OpaqueValueExpr *OpaqueValueExpr::findInCopyConstruct(const Expr *e) {
4874
if (const ExprWithCleanups *ewc = dyn_cast<ExprWithCleanups>(e))
4875
e = ewc->getSubExpr();
4876
if (const MaterializeTemporaryExpr *m = dyn_cast<MaterializeTemporaryExpr>(e))
4877
e = m->getSubExpr();
4878
e = cast<CXXConstructExpr>(e)->getArg(0);
4879
while (const ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e))
4880
e = ice->getSubExpr();
4881
return cast<OpaqueValueExpr>(e);
4882
}
4883
4884
PseudoObjectExpr *PseudoObjectExpr::Create(const ASTContext &Context,
4885
EmptyShell sh,
4886
unsigned numSemanticExprs) {
4887
void *buffer =
4888
Context.Allocate(totalSizeToAlloc<Expr *>(1 + numSemanticExprs),
4889
alignof(PseudoObjectExpr));
4890
return new(buffer) PseudoObjectExpr(sh, numSemanticExprs);
4891
}
4892
4893
PseudoObjectExpr::PseudoObjectExpr(EmptyShell shell, unsigned numSemanticExprs)
4894
: Expr(PseudoObjectExprClass, shell) {
4895
PseudoObjectExprBits.NumSubExprs = numSemanticExprs + 1;
4896
}
4897
4898
PseudoObjectExpr *PseudoObjectExpr::Create(const ASTContext &C, Expr *syntax,
4899
ArrayRef<Expr*> semantics,
4900
unsigned resultIndex) {
4901
assert(syntax && "no syntactic expression!");
4902
assert(semantics.size() && "no semantic expressions!");
4903
4904
QualType type;
4905
ExprValueKind VK;
4906
if (resultIndex == NoResult) {
4907
type = C.VoidTy;
4908
VK = VK_PRValue;
4909
} else {
4910
assert(resultIndex < semantics.size());
4911
type = semantics[resultIndex]->getType();
4912
VK = semantics[resultIndex]->getValueKind();
4913
assert(semantics[resultIndex]->getObjectKind() == OK_Ordinary);
4914
}
4915
4916
void *buffer = C.Allocate(totalSizeToAlloc<Expr *>(semantics.size() + 1),
4917
alignof(PseudoObjectExpr));
4918
return new(buffer) PseudoObjectExpr(type, VK, syntax, semantics,
4919
resultIndex);
4920
}
4921
4922
PseudoObjectExpr::PseudoObjectExpr(QualType type, ExprValueKind VK,
4923
Expr *syntax, ArrayRef<Expr *> semantics,
4924
unsigned resultIndex)
4925
: Expr(PseudoObjectExprClass, type, VK, OK_Ordinary) {
4926
PseudoObjectExprBits.NumSubExprs = semantics.size() + 1;
4927
PseudoObjectExprBits.ResultIndex = resultIndex + 1;
4928
4929
for (unsigned i = 0, e = semantics.size() + 1; i != e; ++i) {
4930
Expr *E = (i == 0 ? syntax : semantics[i-1]);
4931
getSubExprsBuffer()[i] = E;
4932
4933
if (isa<OpaqueValueExpr>(E))
4934
assert(cast<OpaqueValueExpr>(E)->getSourceExpr() != nullptr &&
4935
"opaque-value semantic expressions for pseudo-object "
4936
"operations must have sources");
4937
}
4938
4939
setDependence(computeDependence(this));
4940
}
4941
4942
//===----------------------------------------------------------------------===//
4943
// Child Iterators for iterating over subexpressions/substatements
4944
//===----------------------------------------------------------------------===//
4945
4946
// UnaryExprOrTypeTraitExpr
4947
Stmt::child_range UnaryExprOrTypeTraitExpr::children() {
4948
const_child_range CCR =
4949
const_cast<const UnaryExprOrTypeTraitExpr *>(this)->children();
4950
return child_range(cast_away_const(CCR.begin()), cast_away_const(CCR.end()));
4951
}
4952
4953
Stmt::const_child_range UnaryExprOrTypeTraitExpr::children() const {
4954
// If this is of a type and the type is a VLA type (and not a typedef), the
4955
// size expression of the VLA needs to be treated as an executable expression.
4956
// Why isn't this weirdness documented better in StmtIterator?
4957
if (isArgumentType()) {
4958
if (const VariableArrayType *T =
4959
dyn_cast<VariableArrayType>(getArgumentType().getTypePtr()))
4960
return const_child_range(const_child_iterator(T), const_child_iterator());
4961
return const_child_range(const_child_iterator(), const_child_iterator());
4962
}
4963
return const_child_range(&Argument.Ex, &Argument.Ex + 1);
4964
}
4965
4966
AtomicExpr::AtomicExpr(SourceLocation BLoc, ArrayRef<Expr *> args, QualType t,
4967
AtomicOp op, SourceLocation RP)
4968
: Expr(AtomicExprClass, t, VK_PRValue, OK_Ordinary),
4969
NumSubExprs(args.size()), BuiltinLoc(BLoc), RParenLoc(RP), Op(op) {
4970
assert(args.size() == getNumSubExprs(op) && "wrong number of subexpressions");
4971
for (unsigned i = 0; i != args.size(); i++)
4972
SubExprs[i] = args[i];
4973
setDependence(computeDependence(this));
4974
}
4975
4976
unsigned AtomicExpr::getNumSubExprs(AtomicOp Op) {
4977
switch (Op) {
4978
case AO__c11_atomic_init:
4979
case AO__opencl_atomic_init:
4980
case AO__c11_atomic_load:
4981
case AO__atomic_load_n:
4982
return 2;
4983
4984
case AO__scoped_atomic_load_n:
4985
case AO__opencl_atomic_load:
4986
case AO__hip_atomic_load:
4987
case AO__c11_atomic_store:
4988
case AO__c11_atomic_exchange:
4989
case AO__atomic_load:
4990
case AO__atomic_store:
4991
case AO__atomic_store_n:
4992
case AO__atomic_exchange_n:
4993
case AO__c11_atomic_fetch_add:
4994
case AO__c11_atomic_fetch_sub:
4995
case AO__c11_atomic_fetch_and:
4996
case AO__c11_atomic_fetch_or:
4997
case AO__c11_atomic_fetch_xor:
4998
case AO__c11_atomic_fetch_nand:
4999
case AO__c11_atomic_fetch_max:
5000
case AO__c11_atomic_fetch_min:
5001
case AO__atomic_fetch_add:
5002
case AO__atomic_fetch_sub:
5003
case AO__atomic_fetch_and:
5004
case AO__atomic_fetch_or:
5005
case AO__atomic_fetch_xor:
5006
case AO__atomic_fetch_nand:
5007
case AO__atomic_add_fetch:
5008
case AO__atomic_sub_fetch:
5009
case AO__atomic_and_fetch:
5010
case AO__atomic_or_fetch:
5011
case AO__atomic_xor_fetch:
5012
case AO__atomic_nand_fetch:
5013
case AO__atomic_min_fetch:
5014
case AO__atomic_max_fetch:
5015
case AO__atomic_fetch_min:
5016
case AO__atomic_fetch_max:
5017
return 3;
5018
5019
case AO__scoped_atomic_load:
5020
case AO__scoped_atomic_store:
5021
case AO__scoped_atomic_store_n:
5022
case AO__scoped_atomic_fetch_add:
5023
case AO__scoped_atomic_fetch_sub:
5024
case AO__scoped_atomic_fetch_and:
5025
case AO__scoped_atomic_fetch_or:
5026
case AO__scoped_atomic_fetch_xor:
5027
case AO__scoped_atomic_fetch_nand:
5028
case AO__scoped_atomic_add_fetch:
5029
case AO__scoped_atomic_sub_fetch:
5030
case AO__scoped_atomic_and_fetch:
5031
case AO__scoped_atomic_or_fetch:
5032
case AO__scoped_atomic_xor_fetch:
5033
case AO__scoped_atomic_nand_fetch:
5034
case AO__scoped_atomic_min_fetch:
5035
case AO__scoped_atomic_max_fetch:
5036
case AO__scoped_atomic_fetch_min:
5037
case AO__scoped_atomic_fetch_max:
5038
case AO__scoped_atomic_exchange_n:
5039
case AO__hip_atomic_exchange:
5040
case AO__hip_atomic_fetch_add:
5041
case AO__hip_atomic_fetch_sub:
5042
case AO__hip_atomic_fetch_and:
5043
case AO__hip_atomic_fetch_or:
5044
case AO__hip_atomic_fetch_xor:
5045
case AO__hip_atomic_fetch_min:
5046
case AO__hip_atomic_fetch_max:
5047
case AO__opencl_atomic_store:
5048
case AO__hip_atomic_store:
5049
case AO__opencl_atomic_exchange:
5050
case AO__opencl_atomic_fetch_add:
5051
case AO__opencl_atomic_fetch_sub:
5052
case AO__opencl_atomic_fetch_and:
5053
case AO__opencl_atomic_fetch_or:
5054
case AO__opencl_atomic_fetch_xor:
5055
case AO__opencl_atomic_fetch_min:
5056
case AO__opencl_atomic_fetch_max:
5057
case AO__atomic_exchange:
5058
return 4;
5059
5060
case AO__scoped_atomic_exchange:
5061
case AO__c11_atomic_compare_exchange_strong:
5062
case AO__c11_atomic_compare_exchange_weak:
5063
return 5;
5064
case AO__hip_atomic_compare_exchange_strong:
5065
case AO__opencl_atomic_compare_exchange_strong:
5066
case AO__opencl_atomic_compare_exchange_weak:
5067
case AO__hip_atomic_compare_exchange_weak:
5068
case AO__atomic_compare_exchange:
5069
case AO__atomic_compare_exchange_n:
5070
return 6;
5071
5072
case AO__scoped_atomic_compare_exchange:
5073
case AO__scoped_atomic_compare_exchange_n:
5074
return 7;
5075
}
5076
llvm_unreachable("unknown atomic op");
5077
}
5078
5079
QualType AtomicExpr::getValueType() const {
5080
auto T = getPtr()->getType()->castAs<PointerType>()->getPointeeType();
5081
if (auto AT = T->getAs<AtomicType>())
5082
return AT->getValueType();
5083
return T;
5084
}
5085
5086
QualType ArraySectionExpr::getBaseOriginalType(const Expr *Base) {
5087
unsigned ArraySectionCount = 0;
5088
while (auto *OASE = dyn_cast<ArraySectionExpr>(Base->IgnoreParens())) {
5089
Base = OASE->getBase();
5090
++ArraySectionCount;
5091
}
5092
while (auto *ASE =
5093
dyn_cast<ArraySubscriptExpr>(Base->IgnoreParenImpCasts())) {
5094
Base = ASE->getBase();
5095
++ArraySectionCount;
5096
}
5097
Base = Base->IgnoreParenImpCasts();
5098
auto OriginalTy = Base->getType();
5099
if (auto *DRE = dyn_cast<DeclRefExpr>(Base))
5100
if (auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
5101
OriginalTy = PVD->getOriginalType().getNonReferenceType();
5102
5103
for (unsigned Cnt = 0; Cnt < ArraySectionCount; ++Cnt) {
5104
if (OriginalTy->isAnyPointerType())
5105
OriginalTy = OriginalTy->getPointeeType();
5106
else if (OriginalTy->isArrayType())
5107
OriginalTy = OriginalTy->castAsArrayTypeUnsafe()->getElementType();
5108
else
5109
return {};
5110
}
5111
return OriginalTy;
5112
}
5113
5114
RecoveryExpr::RecoveryExpr(ASTContext &Ctx, QualType T, SourceLocation BeginLoc,
5115
SourceLocation EndLoc, ArrayRef<Expr *> SubExprs)
5116
: Expr(RecoveryExprClass, T.getNonReferenceType(),
5117
T->isDependentType() ? VK_LValue : getValueKindForType(T),
5118
OK_Ordinary),
5119
BeginLoc(BeginLoc), EndLoc(EndLoc), NumExprs(SubExprs.size()) {
5120
assert(!T.isNull());
5121
assert(!llvm::is_contained(SubExprs, nullptr));
5122
5123
llvm::copy(SubExprs, getTrailingObjects<Expr *>());
5124
setDependence(computeDependence(this));
5125
}
5126
5127
RecoveryExpr *RecoveryExpr::Create(ASTContext &Ctx, QualType T,
5128
SourceLocation BeginLoc,
5129
SourceLocation EndLoc,
5130
ArrayRef<Expr *> SubExprs) {
5131
void *Mem = Ctx.Allocate(totalSizeToAlloc<Expr *>(SubExprs.size()),
5132
alignof(RecoveryExpr));
5133
return new (Mem) RecoveryExpr(Ctx, T, BeginLoc, EndLoc, SubExprs);
5134
}
5135
5136
RecoveryExpr *RecoveryExpr::CreateEmpty(ASTContext &Ctx, unsigned NumSubExprs) {
5137
void *Mem = Ctx.Allocate(totalSizeToAlloc<Expr *>(NumSubExprs),
5138
alignof(RecoveryExpr));
5139
return new (Mem) RecoveryExpr(EmptyShell(), NumSubExprs);
5140
}
5141
5142
void OMPArrayShapingExpr::setDimensions(ArrayRef<Expr *> Dims) {
5143
assert(
5144
NumDims == Dims.size() &&
5145
"Preallocated number of dimensions is different from the provided one.");
5146
llvm::copy(Dims, getTrailingObjects<Expr *>());
5147
}
5148
5149
void OMPArrayShapingExpr::setBracketsRanges(ArrayRef<SourceRange> BR) {
5150
assert(
5151
NumDims == BR.size() &&
5152
"Preallocated number of dimensions is different from the provided one.");
5153
llvm::copy(BR, getTrailingObjects<SourceRange>());
5154
}
5155
5156
OMPArrayShapingExpr::OMPArrayShapingExpr(QualType ExprTy, Expr *Op,
5157
SourceLocation L, SourceLocation R,
5158
ArrayRef<Expr *> Dims)
5159
: Expr(OMPArrayShapingExprClass, ExprTy, VK_LValue, OK_Ordinary), LPLoc(L),
5160
RPLoc(R), NumDims(Dims.size()) {
5161
setBase(Op);
5162
setDimensions(Dims);
5163
setDependence(computeDependence(this));
5164
}
5165
5166
OMPArrayShapingExpr *
5167
OMPArrayShapingExpr::Create(const ASTContext &Context, QualType T, Expr *Op,
5168
SourceLocation L, SourceLocation R,
5169
ArrayRef<Expr *> Dims,
5170
ArrayRef<SourceRange> BracketRanges) {
5171
assert(Dims.size() == BracketRanges.size() &&
5172
"Different number of dimensions and brackets ranges.");
5173
void *Mem = Context.Allocate(
5174
totalSizeToAlloc<Expr *, SourceRange>(Dims.size() + 1, Dims.size()),
5175
alignof(OMPArrayShapingExpr));
5176
auto *E = new (Mem) OMPArrayShapingExpr(T, Op, L, R, Dims);
5177
E->setBracketsRanges(BracketRanges);
5178
return E;
5179
}
5180
5181
OMPArrayShapingExpr *OMPArrayShapingExpr::CreateEmpty(const ASTContext &Context,
5182
unsigned NumDims) {
5183
void *Mem = Context.Allocate(
5184
totalSizeToAlloc<Expr *, SourceRange>(NumDims + 1, NumDims),
5185
alignof(OMPArrayShapingExpr));
5186
return new (Mem) OMPArrayShapingExpr(EmptyShell(), NumDims);
5187
}
5188
5189
void OMPIteratorExpr::setIteratorDeclaration(unsigned I, Decl *D) {
5190
assert(I < NumIterators &&
5191
"Idx is greater or equal the number of iterators definitions.");
5192
getTrailingObjects<Decl *>()[I] = D;
5193
}
5194
5195
void OMPIteratorExpr::setAssignmentLoc(unsigned I, SourceLocation Loc) {
5196
assert(I < NumIterators &&
5197
"Idx is greater or equal the number of iterators definitions.");
5198
getTrailingObjects<
5199
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
5200
static_cast<int>(RangeLocOffset::AssignLoc)] = Loc;
5201
}
5202
5203
void OMPIteratorExpr::setIteratorRange(unsigned I, Expr *Begin,
5204
SourceLocation ColonLoc, Expr *End,
5205
SourceLocation SecondColonLoc,
5206
Expr *Step) {
5207
assert(I < NumIterators &&
5208
"Idx is greater or equal the number of iterators definitions.");
5209
getTrailingObjects<Expr *>()[I * static_cast<int>(RangeExprOffset::Total) +
5210
static_cast<int>(RangeExprOffset::Begin)] =
5211
Begin;
5212
getTrailingObjects<Expr *>()[I * static_cast<int>(RangeExprOffset::Total) +
5213
static_cast<int>(RangeExprOffset::End)] = End;
5214
getTrailingObjects<Expr *>()[I * static_cast<int>(RangeExprOffset::Total) +
5215
static_cast<int>(RangeExprOffset::Step)] = Step;
5216
getTrailingObjects<
5217
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
5218
static_cast<int>(RangeLocOffset::FirstColonLoc)] =
5219
ColonLoc;
5220
getTrailingObjects<
5221
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
5222
static_cast<int>(RangeLocOffset::SecondColonLoc)] =
5223
SecondColonLoc;
5224
}
5225
5226
Decl *OMPIteratorExpr::getIteratorDecl(unsigned I) {
5227
return getTrailingObjects<Decl *>()[I];
5228
}
5229
5230
OMPIteratorExpr::IteratorRange OMPIteratorExpr::getIteratorRange(unsigned I) {
5231
IteratorRange Res;
5232
Res.Begin =
5233
getTrailingObjects<Expr *>()[I * static_cast<int>(
5234
RangeExprOffset::Total) +
5235
static_cast<int>(RangeExprOffset::Begin)];
5236
Res.End =
5237
getTrailingObjects<Expr *>()[I * static_cast<int>(
5238
RangeExprOffset::Total) +
5239
static_cast<int>(RangeExprOffset::End)];
5240
Res.Step =
5241
getTrailingObjects<Expr *>()[I * static_cast<int>(
5242
RangeExprOffset::Total) +
5243
static_cast<int>(RangeExprOffset::Step)];
5244
return Res;
5245
}
5246
5247
SourceLocation OMPIteratorExpr::getAssignLoc(unsigned I) const {
5248
return getTrailingObjects<
5249
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
5250
static_cast<int>(RangeLocOffset::AssignLoc)];
5251
}
5252
5253
SourceLocation OMPIteratorExpr::getColonLoc(unsigned I) const {
5254
return getTrailingObjects<
5255
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
5256
static_cast<int>(RangeLocOffset::FirstColonLoc)];
5257
}
5258
5259
SourceLocation OMPIteratorExpr::getSecondColonLoc(unsigned I) const {
5260
return getTrailingObjects<
5261
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
5262
static_cast<int>(RangeLocOffset::SecondColonLoc)];
5263
}
5264
5265
void OMPIteratorExpr::setHelper(unsigned I, const OMPIteratorHelperData &D) {
5266
getTrailingObjects<OMPIteratorHelperData>()[I] = D;
5267
}
5268
5269
OMPIteratorHelperData &OMPIteratorExpr::getHelper(unsigned I) {
5270
return getTrailingObjects<OMPIteratorHelperData>()[I];
5271
}
5272
5273
const OMPIteratorHelperData &OMPIteratorExpr::getHelper(unsigned I) const {
5274
return getTrailingObjects<OMPIteratorHelperData>()[I];
5275
}
5276
5277
OMPIteratorExpr::OMPIteratorExpr(
5278
QualType ExprTy, SourceLocation IteratorKwLoc, SourceLocation L,
5279
SourceLocation R, ArrayRef<OMPIteratorExpr::IteratorDefinition> Data,
5280
ArrayRef<OMPIteratorHelperData> Helpers)
5281
: Expr(OMPIteratorExprClass, ExprTy, VK_LValue, OK_Ordinary),
5282
IteratorKwLoc(IteratorKwLoc), LPLoc(L), RPLoc(R),
5283
NumIterators(Data.size()) {
5284
for (unsigned I = 0, E = Data.size(); I < E; ++I) {
5285
const IteratorDefinition &D = Data[I];
5286
setIteratorDeclaration(I, D.IteratorDecl);
5287
setAssignmentLoc(I, D.AssignmentLoc);
5288
setIteratorRange(I, D.Range.Begin, D.ColonLoc, D.Range.End,
5289
D.SecondColonLoc, D.Range.Step);
5290
setHelper(I, Helpers[I]);
5291
}
5292
setDependence(computeDependence(this));
5293
}
5294
5295
OMPIteratorExpr *
5296
OMPIteratorExpr::Create(const ASTContext &Context, QualType T,
5297
SourceLocation IteratorKwLoc, SourceLocation L,
5298
SourceLocation R,
5299
ArrayRef<OMPIteratorExpr::IteratorDefinition> Data,
5300
ArrayRef<OMPIteratorHelperData> Helpers) {
5301
assert(Data.size() == Helpers.size() &&
5302
"Data and helpers must have the same size.");
5303
void *Mem = Context.Allocate(
5304
totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5305
Data.size(), Data.size() * static_cast<int>(RangeExprOffset::Total),
5306
Data.size() * static_cast<int>(RangeLocOffset::Total),
5307
Helpers.size()),
5308
alignof(OMPIteratorExpr));
5309
return new (Mem) OMPIteratorExpr(T, IteratorKwLoc, L, R, Data, Helpers);
5310
}
5311
5312
OMPIteratorExpr *OMPIteratorExpr::CreateEmpty(const ASTContext &Context,
5313
unsigned NumIterators) {
5314
void *Mem = Context.Allocate(
5315
totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5316
NumIterators, NumIterators * static_cast<int>(RangeExprOffset::Total),
5317
NumIterators * static_cast<int>(RangeLocOffset::Total), NumIterators),
5318
alignof(OMPIteratorExpr));
5319
return new (Mem) OMPIteratorExpr(EmptyShell(), NumIterators);
5320
}
5321
5322