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