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