1 //===--- Expr.h - Classes for representing expressions ----------*- C++ -*-===// 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 defines the Expr interface and subclasses. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_AST_EXPR_H 14 #define LLVM_CLANG_AST_EXPR_H 15 16 #include "clang/AST/APNumericStorage.h" 17 #include "clang/AST/APValue.h" 18 #include "clang/AST/ASTVector.h" 19 #include "clang/AST/ComputeDependence.h" 20 #include "clang/AST/Decl.h" 21 #include "clang/AST/DeclAccessPair.h" 22 #include "clang/AST/DependenceFlags.h" 23 #include "clang/AST/OperationKinds.h" 24 #include "clang/AST/Stmt.h" 25 #include "clang/AST/TemplateBase.h" 26 #include "clang/AST/Type.h" 27 #include "clang/Basic/CharInfo.h" 28 #include "clang/Basic/LangOptions.h" 29 #include "clang/Basic/SyncScope.h" 30 #include "clang/Basic/TypeTraits.h" 31 #include "llvm/ADT/APFloat.h" 32 #include "llvm/ADT/APSInt.h" 33 #include "llvm/ADT/SmallVector.h" 34 #include "llvm/ADT/StringRef.h" 35 #include "llvm/ADT/iterator.h" 36 #include "llvm/ADT/iterator_range.h" 37 #include "llvm/Support/AtomicOrdering.h" 38 #include "llvm/Support/Compiler.h" 39 #include "llvm/Support/TrailingObjects.h" 40 #include <optional> 41 42 namespace clang { 43 class APValue; 44 class ASTContext; 45 class BlockDecl; 46 class CXXBaseSpecifier; 47 class CXXMemberCallExpr; 48 class CXXOperatorCallExpr; 49 class CastExpr; 50 class Decl; 51 class IdentifierInfo; 52 class MaterializeTemporaryExpr; 53 class NamedDecl; 54 class ObjCPropertyRefExpr; 55 class OpaqueValueExpr; 56 class ParmVarDecl; 57 class StringLiteral; 58 class TargetInfo; 59 class ValueDecl; 60 61 /// A simple array of base specifiers. 62 typedef SmallVector<CXXBaseSpecifier*, 4> CXXCastPath; 63 64 /// An adjustment to be made to the temporary created when emitting a 65 /// reference binding, which accesses a particular subobject of that temporary. 66 struct SubobjectAdjustment { 67 enum { 68 DerivedToBaseAdjustment, 69 FieldAdjustment, 70 MemberPointerAdjustment 71 } Kind; 72 73 struct DTB { 74 const CastExpr *BasePath; 75 const CXXRecordDecl *DerivedClass; 76 }; 77 78 struct P { 79 const MemberPointerType *MPT; 80 Expr *RHS; 81 }; 82 83 union { 84 struct DTB DerivedToBase; 85 const FieldDecl *Field; 86 struct P Ptr; 87 }; 88 89 SubobjectAdjustment(const CastExpr *BasePath, 90 const CXXRecordDecl *DerivedClass) 91 : Kind(DerivedToBaseAdjustment) { 92 DerivedToBase.BasePath = BasePath; 93 DerivedToBase.DerivedClass = DerivedClass; 94 } 95 96 SubobjectAdjustment(const FieldDecl *Field) : Kind(FieldAdjustment) { 97 this->Field = Field; 98 } 99 100 SubobjectAdjustment(const MemberPointerType *MPT, Expr *RHS) 101 : Kind(MemberPointerAdjustment) { 102 this->Ptr.MPT = MPT; 103 this->Ptr.RHS = RHS; 104 } 105 }; 106 107 /// This represents one expression. Note that Expr's are subclasses of Stmt. 108 /// This allows an expression to be transparently used any place a Stmt is 109 /// required. 110 class Expr : public ValueStmt { 111 QualType TR; 112 113 public: 114 Expr() = delete; 115 Expr(const Expr&) = delete; 116 Expr(Expr &&) = delete; 117 Expr &operator=(const Expr&) = delete; 118 Expr &operator=(Expr&&) = delete; 119 120 protected: 121 Expr(StmtClass SC, QualType T, ExprValueKind VK, ExprObjectKind OK) 122 : ValueStmt(SC) { 123 ExprBits.Dependent = 0; 124 ExprBits.ValueKind = VK; 125 ExprBits.ObjectKind = OK; 126 assert(ExprBits.ObjectKind == OK && "truncated kind"); 127 setType(T); 128 } 129 130 /// Construct an empty expression. 131 explicit Expr(StmtClass SC, EmptyShell) : ValueStmt(SC) { } 132 133 /// Each concrete expr subclass is expected to compute its dependence and call 134 /// this in the constructor. 135 void setDependence(ExprDependence Deps) { 136 ExprBits.Dependent = static_cast<unsigned>(Deps); 137 } 138 friend class ASTImporter; // Sets dependence directly. 139 friend class ASTStmtReader; // Sets dependence directly. 140 141 public: 142 QualType getType() const { return TR; } 143 void setType(QualType t) { 144 // In C++, the type of an expression is always adjusted so that it 145 // will not have reference type (C++ [expr]p6). Use 146 // QualType::getNonReferenceType() to retrieve the non-reference 147 // type. Additionally, inspect Expr::isLvalue to determine whether 148 // an expression that is adjusted in this manner should be 149 // considered an lvalue. 150 assert((t.isNull() || !t->isReferenceType()) && 151 "Expressions can't have reference type"); 152 153 TR = t; 154 } 155 156 /// If this expression is an enumeration constant, return the 157 /// enumeration type under which said constant was declared. 158 /// Otherwise return the expression's type. 159 /// Note this effectively circumvents the weak typing of C's enum constants 160 QualType getEnumCoercedType(const ASTContext &Ctx) const; 161 162 ExprDependence getDependence() const { 163 return static_cast<ExprDependence>(ExprBits.Dependent); 164 } 165 166 /// Determines whether the value of this expression depends on 167 /// - a template parameter (C++ [temp.dep.constexpr]) 168 /// - or an error, whose resolution is unknown 169 /// 170 /// For example, the array bound of "Chars" in the following example is 171 /// value-dependent. 172 /// @code 173 /// template<int Size, char (&Chars)[Size]> struct meta_string; 174 /// @endcode 175 bool isValueDependent() const { 176 return static_cast<bool>(getDependence() & ExprDependence::Value); 177 } 178 179 /// Determines whether the type of this expression depends on 180 /// - a template parameter (C++ [temp.dep.expr], which means that its type 181 /// could change from one template instantiation to the next) 182 /// - or an error 183 /// 184 /// For example, the expressions "x" and "x + y" are type-dependent in 185 /// the following code, but "y" is not type-dependent: 186 /// @code 187 /// template<typename T> 188 /// void add(T x, int y) { 189 /// x + y; 190 /// } 191 /// @endcode 192 bool isTypeDependent() const { 193 return static_cast<bool>(getDependence() & ExprDependence::Type); 194 } 195 196 /// Whether this expression is instantiation-dependent, meaning that 197 /// it depends in some way on 198 /// - a template parameter (even if neither its type nor (constant) value 199 /// can change due to the template instantiation) 200 /// - or an error 201 /// 202 /// In the following example, the expression \c sizeof(sizeof(T() + T())) is 203 /// instantiation-dependent (since it involves a template parameter \c T), but 204 /// is neither type- nor value-dependent, since the type of the inner 205 /// \c sizeof is known (\c std::size_t) and therefore the size of the outer 206 /// \c sizeof is known. 207 /// 208 /// \code 209 /// template<typename T> 210 /// void f(T x, T y) { 211 /// sizeof(sizeof(T() + T()); 212 /// } 213 /// \endcode 214 /// 215 /// \code 216 /// void func(int) { 217 /// func(); // the expression is instantiation-dependent, because it depends 218 /// // on an error. 219 /// } 220 /// \endcode 221 bool isInstantiationDependent() const { 222 return static_cast<bool>(getDependence() & ExprDependence::Instantiation); 223 } 224 225 /// Whether this expression contains an unexpanded parameter 226 /// pack (for C++11 variadic templates). 227 /// 228 /// Given the following function template: 229 /// 230 /// \code 231 /// template<typename F, typename ...Types> 232 /// void forward(const F &f, Types &&...args) { 233 /// f(static_cast<Types&&>(args)...); 234 /// } 235 /// \endcode 236 /// 237 /// The expressions \c args and \c static_cast<Types&&>(args) both 238 /// contain parameter packs. 239 bool containsUnexpandedParameterPack() const { 240 return static_cast<bool>(getDependence() & ExprDependence::UnexpandedPack); 241 } 242 243 /// Whether this expression contains subexpressions which had errors, e.g. a 244 /// TypoExpr. 245 bool containsErrors() const { 246 return static_cast<bool>(getDependence() & ExprDependence::Error); 247 } 248 249 /// getExprLoc - Return the preferred location for the arrow when diagnosing 250 /// a problem with a generic expression. 251 SourceLocation getExprLoc() const LLVM_READONLY; 252 253 /// Determine whether an lvalue-to-rvalue conversion should implicitly be 254 /// applied to this expression if it appears as a discarded-value expression 255 /// in C++11 onwards. This applies to certain forms of volatile glvalues. 256 bool isReadIfDiscardedInCPlusPlus11() const; 257 258 /// isUnusedResultAWarning - Return true if this immediate expression should 259 /// be warned about if the result is unused. If so, fill in expr, location, 260 /// and ranges with expr to warn on and source locations/ranges appropriate 261 /// for a warning. 262 bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc, 263 SourceRange &R1, SourceRange &R2, 264 ASTContext &Ctx) const; 265 266 /// isLValue - True if this expression is an "l-value" according to 267 /// the rules of the current language. C and C++ give somewhat 268 /// different rules for this concept, but in general, the result of 269 /// an l-value expression identifies a specific object whereas the 270 /// result of an r-value expression is a value detached from any 271 /// specific storage. 272 /// 273 /// C++11 divides the concept of "r-value" into pure r-values 274 /// ("pr-values") and so-called expiring values ("x-values"), which 275 /// identify specific objects that can be safely cannibalized for 276 /// their resources. 277 bool isLValue() const { return getValueKind() == VK_LValue; } 278 bool isPRValue() const { return getValueKind() == VK_PRValue; } 279 bool isXValue() const { return getValueKind() == VK_XValue; } 280 bool isGLValue() const { return getValueKind() != VK_PRValue; } 281 282 enum LValueClassification { 283 LV_Valid, 284 LV_NotObjectType, 285 LV_IncompleteVoidType, 286 LV_DuplicateVectorComponents, 287 LV_InvalidExpression, 288 LV_InvalidMessageExpression, 289 LV_MemberFunction, 290 LV_SubObjCPropertySetting, 291 LV_ClassTemporary, 292 LV_ArrayTemporary 293 }; 294 /// Reasons why an expression might not be an l-value. 295 LValueClassification ClassifyLValue(ASTContext &Ctx) const; 296 297 enum isModifiableLvalueResult { 298 MLV_Valid, 299 MLV_NotObjectType, 300 MLV_IncompleteVoidType, 301 MLV_DuplicateVectorComponents, 302 MLV_InvalidExpression, 303 MLV_LValueCast, // Specialized form of MLV_InvalidExpression. 304 MLV_IncompleteType, 305 MLV_ConstQualified, 306 MLV_ConstQualifiedField, 307 MLV_ConstAddrSpace, 308 MLV_ArrayType, 309 MLV_NoSetterProperty, 310 MLV_MemberFunction, 311 MLV_SubObjCPropertySetting, 312 MLV_InvalidMessageExpression, 313 MLV_ClassTemporary, 314 MLV_ArrayTemporary 315 }; 316 /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, 317 /// does not have an incomplete type, does not have a const-qualified type, 318 /// and if it is a structure or union, does not have any member (including, 319 /// recursively, any member or element of all contained aggregates or unions) 320 /// with a const-qualified type. 321 /// 322 /// \param Loc [in,out] - A source location which *may* be filled 323 /// in with the location of the expression making this a 324 /// non-modifiable lvalue, if specified. 325 isModifiableLvalueResult 326 isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc = nullptr) const; 327 328 /// The return type of classify(). Represents the C++11 expression 329 /// taxonomy. 330 class Classification { 331 public: 332 /// The various classification results. Most of these mean prvalue. 333 enum Kinds { 334 CL_LValue, 335 CL_XValue, 336 CL_Function, // Functions cannot be lvalues in C. 337 CL_Void, // Void cannot be an lvalue in C. 338 CL_AddressableVoid, // Void expression whose address can be taken in C. 339 CL_DuplicateVectorComponents, // A vector shuffle with dupes. 340 CL_MemberFunction, // An expression referring to a member function 341 CL_SubObjCPropertySetting, 342 CL_ClassTemporary, // A temporary of class type, or subobject thereof. 343 CL_ArrayTemporary, // A temporary of array type. 344 CL_ObjCMessageRValue, // ObjC message is an rvalue 345 CL_PRValue // A prvalue for any other reason, of any other type 346 }; 347 /// The results of modification testing. 348 enum ModifiableType { 349 CM_Untested, // testModifiable was false. 350 CM_Modifiable, 351 CM_RValue, // Not modifiable because it's an rvalue 352 CM_Function, // Not modifiable because it's a function; C++ only 353 CM_LValueCast, // Same as CM_RValue, but indicates GCC cast-as-lvalue ext 354 CM_NoSetterProperty,// Implicit assignment to ObjC property without setter 355 CM_ConstQualified, 356 CM_ConstQualifiedField, 357 CM_ConstAddrSpace, 358 CM_ArrayType, 359 CM_IncompleteType 360 }; 361 362 private: 363 friend class Expr; 364 365 unsigned short Kind; 366 unsigned short Modifiable; 367 368 explicit Classification(Kinds k, ModifiableType m) 369 : Kind(k), Modifiable(m) 370 {} 371 372 public: 373 Classification() {} 374 375 Kinds getKind() const { return static_cast<Kinds>(Kind); } 376 ModifiableType getModifiable() const { 377 assert(Modifiable != CM_Untested && "Did not test for modifiability."); 378 return static_cast<ModifiableType>(Modifiable); 379 } 380 bool isLValue() const { return Kind == CL_LValue; } 381 bool isXValue() const { return Kind == CL_XValue; } 382 bool isGLValue() const { return Kind <= CL_XValue; } 383 bool isPRValue() const { return Kind >= CL_Function; } 384 bool isRValue() const { return Kind >= CL_XValue; } 385 bool isModifiable() const { return getModifiable() == CM_Modifiable; } 386 387 /// Create a simple, modifiable lvalue 388 static Classification makeSimpleLValue() { 389 return Classification(CL_LValue, CM_Modifiable); 390 } 391 392 }; 393 /// Classify - Classify this expression according to the C++11 394 /// expression taxonomy. 395 /// 396 /// C++11 defines ([basic.lval]) a new taxonomy of expressions to replace the 397 /// old lvalue vs rvalue. This function determines the type of expression this 398 /// is. There are three expression types: 399 /// - lvalues are classical lvalues as in C++03. 400 /// - prvalues are equivalent to rvalues in C++03. 401 /// - xvalues are expressions yielding unnamed rvalue references, e.g. a 402 /// function returning an rvalue reference. 403 /// lvalues and xvalues are collectively referred to as glvalues, while 404 /// prvalues and xvalues together form rvalues. 405 Classification Classify(ASTContext &Ctx) const { 406 return ClassifyImpl(Ctx, nullptr); 407 } 408 409 /// ClassifyModifiable - Classify this expression according to the 410 /// C++11 expression taxonomy, and see if it is valid on the left side 411 /// of an assignment. 412 /// 413 /// This function extends classify in that it also tests whether the 414 /// expression is modifiable (C99 6.3.2.1p1). 415 /// \param Loc A source location that might be filled with a relevant location 416 /// if the expression is not modifiable. 417 Classification ClassifyModifiable(ASTContext &Ctx, SourceLocation &Loc) const{ 418 return ClassifyImpl(Ctx, &Loc); 419 } 420 421 /// Returns the set of floating point options that apply to this expression. 422 /// Only meaningful for operations on floating point values. 423 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const; 424 425 /// getValueKindForType - Given a formal return or parameter type, 426 /// give its value kind. 427 static ExprValueKind getValueKindForType(QualType T) { 428 if (const ReferenceType *RT = T->getAs<ReferenceType>()) 429 return (isa<LValueReferenceType>(RT) 430 ? VK_LValue 431 : (RT->getPointeeType()->isFunctionType() 432 ? VK_LValue : VK_XValue)); 433 return VK_PRValue; 434 } 435 436 /// getValueKind - The value kind that this expression produces. 437 ExprValueKind getValueKind() const { 438 return static_cast<ExprValueKind>(ExprBits.ValueKind); 439 } 440 441 /// getObjectKind - The object kind that this expression produces. 442 /// Object kinds are meaningful only for expressions that yield an 443 /// l-value or x-value. 444 ExprObjectKind getObjectKind() const { 445 return static_cast<ExprObjectKind>(ExprBits.ObjectKind); 446 } 447 448 bool isOrdinaryOrBitFieldObject() const { 449 ExprObjectKind OK = getObjectKind(); 450 return (OK == OK_Ordinary || OK == OK_BitField); 451 } 452 453 /// setValueKind - Set the value kind produced by this expression. 454 void setValueKind(ExprValueKind Cat) { ExprBits.ValueKind = Cat; } 455 456 /// setObjectKind - Set the object kind produced by this expression. 457 void setObjectKind(ExprObjectKind Cat) { ExprBits.ObjectKind = Cat; } 458 459 private: 460 Classification ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const; 461 462 public: 463 464 /// Returns true if this expression is a gl-value that 465 /// potentially refers to a bit-field. 466 /// 467 /// In C++, whether a gl-value refers to a bitfield is essentially 468 /// an aspect of the value-kind type system. 469 bool refersToBitField() const { return getObjectKind() == OK_BitField; } 470 471 /// If this expression refers to a bit-field, retrieve the 472 /// declaration of that bit-field. 473 /// 474 /// Note that this returns a non-null pointer in subtly different 475 /// places than refersToBitField returns true. In particular, this can 476 /// return a non-null pointer even for r-values loaded from 477 /// bit-fields, but it will return null for a conditional bit-field. 478 FieldDecl *getSourceBitField(); 479 480 /// If this expression refers to an enum constant, retrieve its declaration 481 EnumConstantDecl *getEnumConstantDecl(); 482 483 const EnumConstantDecl *getEnumConstantDecl() const { 484 return const_cast<Expr *>(this)->getEnumConstantDecl(); 485 } 486 487 const FieldDecl *getSourceBitField() const { 488 return const_cast<Expr*>(this)->getSourceBitField(); 489 } 490 491 Decl *getReferencedDeclOfCallee(); 492 const Decl *getReferencedDeclOfCallee() const { 493 return const_cast<Expr*>(this)->getReferencedDeclOfCallee(); 494 } 495 496 /// If this expression is an l-value for an Objective C 497 /// property, find the underlying property reference expression. 498 const ObjCPropertyRefExpr *getObjCProperty() const; 499 500 /// Check if this expression is the ObjC 'self' implicit parameter. 501 bool isObjCSelfExpr() const; 502 503 /// Returns whether this expression refers to a vector element. 504 bool refersToVectorElement() const; 505 506 /// Returns whether this expression refers to a matrix element. 507 bool refersToMatrixElement() const { 508 return getObjectKind() == OK_MatrixComponent; 509 } 510 511 /// Returns whether this expression refers to a global register 512 /// variable. 513 bool refersToGlobalRegisterVar() const; 514 515 /// Returns whether this expression has a placeholder type. 516 bool hasPlaceholderType() const { 517 return getType()->isPlaceholderType(); 518 } 519 520 /// Returns whether this expression has a specific placeholder type. 521 bool hasPlaceholderType(BuiltinType::Kind K) const { 522 assert(BuiltinType::isPlaceholderTypeKind(K)); 523 if (const BuiltinType *BT = dyn_cast<BuiltinType>(getType())) 524 return BT->getKind() == K; 525 return false; 526 } 527 528 /// isKnownToHaveBooleanValue - Return true if this is an integer expression 529 /// that is known to return 0 or 1. This happens for _Bool/bool expressions 530 /// but also int expressions which are produced by things like comparisons in 531 /// C. 532 /// 533 /// \param Semantic If true, only return true for expressions that are known 534 /// to be semantically boolean, which might not be true even for expressions 535 /// that are known to evaluate to 0/1. For instance, reading an unsigned 536 /// bit-field with width '1' will evaluate to 0/1, but doesn't necessarily 537 /// semantically correspond to a bool. 538 bool isKnownToHaveBooleanValue(bool Semantic = true) const; 539 540 /// Check whether this array fits the idiom of a flexible array member, 541 /// depending on the value of -fstrict-flex-array. 542 /// When IgnoreTemplateOrMacroSubstitution is set, it doesn't consider sizes 543 /// resulting from the substitution of a macro or a template as special sizes. 544 bool isFlexibleArrayMemberLike( 545 ASTContext &Context, 546 LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, 547 bool IgnoreTemplateOrMacroSubstitution = false) const; 548 549 /// isIntegerConstantExpr - Return the value if this expression is a valid 550 /// integer constant expression. If not a valid i-c-e, return std::nullopt 551 /// and fill in Loc (if specified) with the location of the invalid 552 /// expression. 553 /// 554 /// Note: This does not perform the implicit conversions required by C++11 555 /// [expr.const]p5. 556 std::optional<llvm::APSInt> 557 getIntegerConstantExpr(const ASTContext &Ctx, 558 SourceLocation *Loc = nullptr) const; 559 bool isIntegerConstantExpr(const ASTContext &Ctx, 560 SourceLocation *Loc = nullptr) const; 561 562 /// isCXX98IntegralConstantExpr - Return true if this expression is an 563 /// integral constant expression in C++98. Can only be used in C++. 564 bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const; 565 566 /// isCXX11ConstantExpr - Return true if this expression is a constant 567 /// expression in C++11. Can only be used in C++. 568 /// 569 /// Note: This does not perform the implicit conversions required by C++11 570 /// [expr.const]p5. 571 bool isCXX11ConstantExpr(const ASTContext &Ctx, APValue *Result = nullptr, 572 SourceLocation *Loc = nullptr) const; 573 574 /// isPotentialConstantExpr - Return true if this function's definition 575 /// might be usable in a constant expression in C++11, if it were marked 576 /// constexpr. Return false if the function can never produce a constant 577 /// expression, along with diagnostics describing why not. 578 static bool isPotentialConstantExpr(const FunctionDecl *FD, 579 SmallVectorImpl< 580 PartialDiagnosticAt> &Diags); 581 582 /// isPotentialConstantExprUnevaluated - Return true if this expression might 583 /// be usable in a constant expression in C++11 in an unevaluated context, if 584 /// it were in function FD marked constexpr. Return false if the function can 585 /// never produce a constant expression, along with diagnostics describing 586 /// why not. 587 static bool isPotentialConstantExprUnevaluated(Expr *E, 588 const FunctionDecl *FD, 589 SmallVectorImpl< 590 PartialDiagnosticAt> &Diags); 591 592 /// isConstantInitializer - Returns true if this expression can be emitted to 593 /// IR as a constant, and thus can be used as a constant initializer in C. 594 /// If this expression is not constant and Culprit is non-null, 595 /// it is used to store the address of first non constant expr. 596 bool isConstantInitializer(ASTContext &Ctx, bool ForRef, 597 const Expr **Culprit = nullptr) const; 598 599 /// If this expression is an unambiguous reference to a single declaration, 600 /// in the style of __builtin_function_start, return that declaration. Note 601 /// that this may return a non-static member function or field in C++ if this 602 /// expression is a member pointer constant. 603 const ValueDecl *getAsBuiltinConstantDeclRef(const ASTContext &Context) const; 604 605 /// EvalStatus is a struct with detailed info about an evaluation in progress. 606 struct EvalStatus { 607 /// Whether the evaluated expression has side effects. 608 /// For example, (f() && 0) can be folded, but it still has side effects. 609 bool HasSideEffects = false; 610 611 /// Whether the evaluation hit undefined behavior. 612 /// For example, 1.0 / 0.0 can be folded to Inf, but has undefined behavior. 613 /// Likewise, INT_MAX + 1 can be folded to INT_MIN, but has UB. 614 bool HasUndefinedBehavior = false; 615 616 /// Diag - If this is non-null, it will be filled in with a stack of notes 617 /// indicating why evaluation failed (or why it failed to produce a constant 618 /// expression). 619 /// If the expression is unfoldable, the notes will indicate why it's not 620 /// foldable. If the expression is foldable, but not a constant expression, 621 /// the notes will describes why it isn't a constant expression. If the 622 /// expression *is* a constant expression, no notes will be produced. 623 /// 624 /// FIXME: this causes significant performance concerns and should be 625 /// refactored at some point. Not all evaluations of the constant 626 /// expression interpreter will display the given diagnostics, this means 627 /// those kinds of uses are paying the expense of generating a diagnostic 628 /// (which may include expensive operations like converting APValue objects 629 /// to a string representation). 630 SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr; 631 632 EvalStatus() = default; 633 634 // hasSideEffects - Return true if the evaluated expression has 635 // side effects. 636 bool hasSideEffects() const { 637 return HasSideEffects; 638 } 639 }; 640 641 /// EvalResult is a struct with detailed info about an evaluated expression. 642 struct EvalResult : EvalStatus { 643 /// Val - This is the value the expression can be folded to. 644 APValue Val; 645 646 // isGlobalLValue - Return true if the evaluated lvalue expression 647 // is global. 648 bool isGlobalLValue() const; 649 }; 650 651 /// EvaluateAsRValue - Return true if this is a constant which we can fold to 652 /// an rvalue using any crazy technique (that has nothing to do with language 653 /// standards) that we want to, even if the expression has side-effects. If 654 /// this function returns true, it returns the folded constant in Result. If 655 /// the expression is a glvalue, an lvalue-to-rvalue conversion will be 656 /// applied. 657 bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, 658 bool InConstantContext = false) const; 659 660 /// EvaluateAsBooleanCondition - Return true if this is a constant 661 /// which we can fold and convert to a boolean condition using 662 /// any crazy technique that we want to, even if the expression has 663 /// side-effects. 664 bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx, 665 bool InConstantContext = false) const; 666 667 enum SideEffectsKind { 668 SE_NoSideEffects, ///< Strictly evaluate the expression. 669 SE_AllowUndefinedBehavior, ///< Allow UB that we can give a value, but not 670 ///< arbitrary unmodeled side effects. 671 SE_AllowSideEffects ///< Allow any unmodeled side effect. 672 }; 673 674 /// EvaluateAsInt - Return true if this is a constant which we can fold and 675 /// convert to an integer, using any crazy technique that we want to. 676 bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, 677 SideEffectsKind AllowSideEffects = SE_NoSideEffects, 678 bool InConstantContext = false) const; 679 680 /// EvaluateAsFloat - Return true if this is a constant which we can fold and 681 /// convert to a floating point value, using any crazy technique that we 682 /// want to. 683 bool EvaluateAsFloat(llvm::APFloat &Result, const ASTContext &Ctx, 684 SideEffectsKind AllowSideEffects = SE_NoSideEffects, 685 bool InConstantContext = false) const; 686 687 /// EvaluateAsFixedPoint - Return true if this is a constant which we can fold 688 /// and convert to a fixed point value. 689 bool EvaluateAsFixedPoint(EvalResult &Result, const ASTContext &Ctx, 690 SideEffectsKind AllowSideEffects = SE_NoSideEffects, 691 bool InConstantContext = false) const; 692 693 /// isEvaluatable - Call EvaluateAsRValue to see if this expression can be 694 /// constant folded without side-effects, but discard the result. 695 bool isEvaluatable(const ASTContext &Ctx, 696 SideEffectsKind AllowSideEffects = SE_NoSideEffects) const; 697 698 /// HasSideEffects - This routine returns true for all those expressions 699 /// which have any effect other than producing a value. Example is a function 700 /// call, volatile variable read, or throwing an exception. If 701 /// IncludePossibleEffects is false, this call treats certain expressions with 702 /// potential side effects (such as function call-like expressions, 703 /// instantiation-dependent expressions, or invocations from a macro) as not 704 /// having side effects. 705 bool HasSideEffects(const ASTContext &Ctx, 706 bool IncludePossibleEffects = true) const; 707 708 /// Determine whether this expression involves a call to any function 709 /// that is not trivial. 710 bool hasNonTrivialCall(const ASTContext &Ctx) const; 711 712 /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded 713 /// integer. This must be called on an expression that constant folds to an 714 /// integer. 715 llvm::APSInt EvaluateKnownConstInt( 716 const ASTContext &Ctx, 717 SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const; 718 719 llvm::APSInt EvaluateKnownConstIntCheckOverflow( 720 const ASTContext &Ctx, 721 SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const; 722 723 void EvaluateForOverflow(const ASTContext &Ctx) const; 724 725 /// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an 726 /// lvalue with link time known address, with no side-effects. 727 bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx, 728 bool InConstantContext = false) const; 729 730 /// EvaluateAsInitializer - Evaluate an expression as if it were the 731 /// initializer of the given declaration. Returns true if the initializer 732 /// can be folded to a constant, and produces any relevant notes. In C++11, 733 /// notes will be produced if the expression is not a constant expression. 734 bool EvaluateAsInitializer(APValue &Result, const ASTContext &Ctx, 735 const VarDecl *VD, 736 SmallVectorImpl<PartialDiagnosticAt> &Notes, 737 bool IsConstantInitializer) const; 738 739 /// EvaluateWithSubstitution - Evaluate an expression as if from the context 740 /// of a call to the given function with the given arguments, inside an 741 /// unevaluated context. Returns true if the expression could be folded to a 742 /// constant. 743 bool EvaluateWithSubstitution(APValue &Value, ASTContext &Ctx, 744 const FunctionDecl *Callee, 745 ArrayRef<const Expr*> Args, 746 const Expr *This = nullptr) const; 747 748 enum class ConstantExprKind { 749 /// An integer constant expression (an array bound, enumerator, case value, 750 /// bit-field width, or similar) or similar. 751 Normal, 752 /// A non-class template argument. Such a value is only used for mangling, 753 /// not for code generation, so can refer to dllimported functions. 754 NonClassTemplateArgument, 755 /// A class template argument. Such a value is used for code generation. 756 ClassTemplateArgument, 757 /// An immediate invocation. The destruction of the end result of this 758 /// evaluation is not part of the evaluation, but all other temporaries 759 /// are destroyed. 760 ImmediateInvocation, 761 }; 762 763 /// Evaluate an expression that is required to be a constant expression. Does 764 /// not check the syntactic constraints for C and C++98 constant expressions. 765 bool EvaluateAsConstantExpr( 766 EvalResult &Result, const ASTContext &Ctx, 767 ConstantExprKind Kind = ConstantExprKind::Normal) const; 768 769 /// If the current Expr is a pointer, this will try to statically 770 /// determine the number of bytes available where the pointer is pointing. 771 /// Returns true if all of the above holds and we were able to figure out the 772 /// size, false otherwise. 773 /// 774 /// \param Type - How to evaluate the size of the Expr, as defined by the 775 /// "type" parameter of __builtin_object_size 776 bool tryEvaluateObjectSize(uint64_t &Result, ASTContext &Ctx, 777 unsigned Type) const; 778 779 /// If the current Expr is a pointer, this will try to statically 780 /// determine the strlen of the string pointed to. 781 /// Returns true if all of the above holds and we were able to figure out the 782 /// strlen, false otherwise. 783 bool tryEvaluateStrLen(uint64_t &Result, ASTContext &Ctx) const; 784 785 bool EvaluateCharRangeAsString(std::string &Result, 786 const Expr *SizeExpression, 787 const Expr *PtrExpression, ASTContext &Ctx, 788 EvalResult &Status) const; 789 790 /// If the current Expr can be evaluated to a pointer to a null-terminated 791 /// constant string, return the constant string (without the terminating 792 /// null). 793 std::optional<std::string> tryEvaluateString(ASTContext &Ctx) const; 794 795 /// Enumeration used to describe the kind of Null pointer constant 796 /// returned from \c isNullPointerConstant(). 797 enum NullPointerConstantKind { 798 /// Expression is not a Null pointer constant. 799 NPCK_NotNull = 0, 800 801 /// Expression is a Null pointer constant built from a zero integer 802 /// expression that is not a simple, possibly parenthesized, zero literal. 803 /// C++ Core Issue 903 will classify these expressions as "not pointers" 804 /// once it is adopted. 805 /// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903 806 NPCK_ZeroExpression, 807 808 /// Expression is a Null pointer constant built from a literal zero. 809 NPCK_ZeroLiteral, 810 811 /// Expression is a C++11 nullptr. 812 NPCK_CXX11_nullptr, 813 814 /// Expression is a GNU-style __null constant. 815 NPCK_GNUNull 816 }; 817 818 /// Enumeration used to describe how \c isNullPointerConstant() 819 /// should cope with value-dependent expressions. 820 enum NullPointerConstantValueDependence { 821 /// Specifies that the expression should never be value-dependent. 822 NPC_NeverValueDependent = 0, 823 824 /// Specifies that a value-dependent expression of integral or 825 /// dependent type should be considered a null pointer constant. 826 NPC_ValueDependentIsNull, 827 828 /// Specifies that a value-dependent expression should be considered 829 /// to never be a null pointer constant. 830 NPC_ValueDependentIsNotNull 831 }; 832 833 /// isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to 834 /// a Null pointer constant. The return value can further distinguish the 835 /// kind of NULL pointer constant that was detected. 836 NullPointerConstantKind isNullPointerConstant( 837 ASTContext &Ctx, 838 NullPointerConstantValueDependence NPC) const; 839 840 /// isOBJCGCCandidate - Return true if this expression may be used in a read/ 841 /// write barrier. 842 bool isOBJCGCCandidate(ASTContext &Ctx) const; 843 844 /// Returns true if this expression is a bound member function. 845 bool isBoundMemberFunction(ASTContext &Ctx) const; 846 847 /// Given an expression of bound-member type, find the type 848 /// of the member. Returns null if this is an *overloaded* bound 849 /// member expression. 850 static QualType findBoundMemberType(const Expr *expr); 851 852 /// Skip past any invisible AST nodes which might surround this 853 /// statement, such as ExprWithCleanups or ImplicitCastExpr nodes, 854 /// but also injected CXXMemberExpr and CXXConstructExpr which represent 855 /// implicit conversions. 856 Expr *IgnoreUnlessSpelledInSource(); 857 const Expr *IgnoreUnlessSpelledInSource() const { 858 return const_cast<Expr *>(this)->IgnoreUnlessSpelledInSource(); 859 } 860 861 /// Skip past any implicit casts which might surround this expression until 862 /// reaching a fixed point. Skips: 863 /// * ImplicitCastExpr 864 /// * FullExpr 865 Expr *IgnoreImpCasts() LLVM_READONLY; 866 const Expr *IgnoreImpCasts() const { 867 return const_cast<Expr *>(this)->IgnoreImpCasts(); 868 } 869 870 /// Skip past any casts which might surround this expression until reaching 871 /// a fixed point. Skips: 872 /// * CastExpr 873 /// * FullExpr 874 /// * MaterializeTemporaryExpr 875 /// * SubstNonTypeTemplateParmExpr 876 Expr *IgnoreCasts() LLVM_READONLY; 877 const Expr *IgnoreCasts() const { 878 return const_cast<Expr *>(this)->IgnoreCasts(); 879 } 880 881 /// Skip past any implicit AST nodes which might surround this expression 882 /// until reaching a fixed point. Skips: 883 /// * What IgnoreImpCasts() skips 884 /// * MaterializeTemporaryExpr 885 /// * CXXBindTemporaryExpr 886 Expr *IgnoreImplicit() LLVM_READONLY; 887 const Expr *IgnoreImplicit() const { 888 return const_cast<Expr *>(this)->IgnoreImplicit(); 889 } 890 891 /// Skip past any implicit AST nodes which might surround this expression 892 /// until reaching a fixed point. Same as IgnoreImplicit, except that it 893 /// also skips over implicit calls to constructors and conversion functions. 894 /// 895 /// FIXME: Should IgnoreImplicit do this? 896 Expr *IgnoreImplicitAsWritten() LLVM_READONLY; 897 const Expr *IgnoreImplicitAsWritten() const { 898 return const_cast<Expr *>(this)->IgnoreImplicitAsWritten(); 899 } 900 901 /// Skip past any parentheses which might surround this expression until 902 /// reaching a fixed point. Skips: 903 /// * ParenExpr 904 /// * UnaryOperator if `UO_Extension` 905 /// * GenericSelectionExpr if `!isResultDependent()` 906 /// * ChooseExpr if `!isConditionDependent()` 907 /// * ConstantExpr 908 Expr *IgnoreParens() LLVM_READONLY; 909 const Expr *IgnoreParens() const { 910 return const_cast<Expr *>(this)->IgnoreParens(); 911 } 912 913 /// Skip past any parentheses and implicit casts which might surround this 914 /// expression until reaching a fixed point. 915 /// FIXME: IgnoreParenImpCasts really ought to be equivalent to 916 /// IgnoreParens() + IgnoreImpCasts() until reaching a fixed point. However 917 /// this is currently not the case. Instead IgnoreParenImpCasts() skips: 918 /// * What IgnoreParens() skips 919 /// * What IgnoreImpCasts() skips 920 /// * MaterializeTemporaryExpr 921 /// * SubstNonTypeTemplateParmExpr 922 Expr *IgnoreParenImpCasts() LLVM_READONLY; 923 const Expr *IgnoreParenImpCasts() const { 924 return const_cast<Expr *>(this)->IgnoreParenImpCasts(); 925 } 926 927 /// Skip past any parentheses and casts which might surround this expression 928 /// until reaching a fixed point. Skips: 929 /// * What IgnoreParens() skips 930 /// * What IgnoreCasts() skips 931 Expr *IgnoreParenCasts() LLVM_READONLY; 932 const Expr *IgnoreParenCasts() const { 933 return const_cast<Expr *>(this)->IgnoreParenCasts(); 934 } 935 936 /// Skip conversion operators. If this Expr is a call to a conversion 937 /// operator, return the argument. 938 Expr *IgnoreConversionOperatorSingleStep() LLVM_READONLY; 939 const Expr *IgnoreConversionOperatorSingleStep() const { 940 return const_cast<Expr *>(this)->IgnoreConversionOperatorSingleStep(); 941 } 942 943 /// Skip past any parentheses and lvalue casts which might surround this 944 /// expression until reaching a fixed point. Skips: 945 /// * What IgnoreParens() skips 946 /// * What IgnoreCasts() skips, except that only lvalue-to-rvalue 947 /// casts are skipped 948 /// FIXME: This is intended purely as a temporary workaround for code 949 /// that hasn't yet been rewritten to do the right thing about those 950 /// casts, and may disappear along with the last internal use. 951 Expr *IgnoreParenLValueCasts() LLVM_READONLY; 952 const Expr *IgnoreParenLValueCasts() const { 953 return const_cast<Expr *>(this)->IgnoreParenLValueCasts(); 954 } 955 956 /// Skip past any parentheses and casts which do not change the value 957 /// (including ptr->int casts of the same size) until reaching a fixed point. 958 /// Skips: 959 /// * What IgnoreParens() skips 960 /// * CastExpr which do not change the value 961 /// * SubstNonTypeTemplateParmExpr 962 Expr *IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY; 963 const Expr *IgnoreParenNoopCasts(const ASTContext &Ctx) const { 964 return const_cast<Expr *>(this)->IgnoreParenNoopCasts(Ctx); 965 } 966 967 /// Skip past any parentheses and derived-to-base casts until reaching a 968 /// fixed point. Skips: 969 /// * What IgnoreParens() skips 970 /// * CastExpr which represent a derived-to-base cast (CK_DerivedToBase, 971 /// CK_UncheckedDerivedToBase and CK_NoOp) 972 Expr *IgnoreParenBaseCasts() LLVM_READONLY; 973 const Expr *IgnoreParenBaseCasts() const { 974 return const_cast<Expr *>(this)->IgnoreParenBaseCasts(); 975 } 976 977 /// Determine whether this expression is a default function argument. 978 /// 979 /// Default arguments are implicitly generated in the abstract syntax tree 980 /// by semantic analysis for function calls, object constructions, etc. in 981 /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes; 982 /// this routine also looks through any implicit casts to determine whether 983 /// the expression is a default argument. 984 bool isDefaultArgument() const; 985 986 /// Determine whether the result of this expression is a 987 /// temporary object of the given class type. 988 bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const; 989 990 /// Whether this expression is an implicit reference to 'this' in C++. 991 bool isImplicitCXXThis() const; 992 993 static bool hasAnyTypeDependentArguments(ArrayRef<Expr *> Exprs); 994 995 /// For an expression of class type or pointer to class type, 996 /// return the most derived class decl the expression is known to refer to. 997 /// 998 /// If this expression is a cast, this method looks through it to find the 999 /// most derived decl that can be inferred from the expression. 1000 /// This is valid because derived-to-base conversions have undefined 1001 /// behavior if the object isn't dynamically of the derived type. 1002 const CXXRecordDecl *getBestDynamicClassType() const; 1003 1004 /// Get the inner expression that determines the best dynamic class. 1005 /// If this is a prvalue, we guarantee that it is of the most-derived type 1006 /// for the object itself. 1007 const Expr *getBestDynamicClassTypeExpr() const; 1008 1009 /// Walk outwards from an expression we want to bind a reference to and 1010 /// find the expression whose lifetime needs to be extended. Record 1011 /// the LHSs of comma expressions and adjustments needed along the path. 1012 const Expr *skipRValueSubobjectAdjustments( 1013 SmallVectorImpl<const Expr *> &CommaLHS, 1014 SmallVectorImpl<SubobjectAdjustment> &Adjustments) const; 1015 const Expr *skipRValueSubobjectAdjustments() const { 1016 SmallVector<const Expr *, 8> CommaLHSs; 1017 SmallVector<SubobjectAdjustment, 8> Adjustments; 1018 return skipRValueSubobjectAdjustments(CommaLHSs, Adjustments); 1019 } 1020 1021 /// Checks that the two Expr's will refer to the same value as a comparison 1022 /// operand. The caller must ensure that the values referenced by the Expr's 1023 /// are not modified between E1 and E2 or the result my be invalid. 1024 static bool isSameComparisonOperand(const Expr* E1, const Expr* E2); 1025 1026 static bool classof(const Stmt *T) { 1027 return T->getStmtClass() >= firstExprConstant && 1028 T->getStmtClass() <= lastExprConstant; 1029 } 1030 }; 1031 // PointerLikeTypeTraits is specialized so it can be used with a forward-decl of 1032 // Expr. Verify that we got it right. 1033 static_assert(llvm::PointerLikeTypeTraits<Expr *>::NumLowBitsAvailable <= 1034 llvm::detail::ConstantLog2<alignof(Expr)>::value, 1035 "PointerLikeTypeTraits<Expr*> assumes too much alignment."); 1036 1037 using ConstantExprKind = Expr::ConstantExprKind; 1038 1039 //===----------------------------------------------------------------------===// 1040 // Wrapper Expressions. 1041 //===----------------------------------------------------------------------===// 1042 1043 /// FullExpr - Represents a "full-expression" node. 1044 class FullExpr : public Expr { 1045 protected: 1046 Stmt *SubExpr; 1047 1048 FullExpr(StmtClass SC, Expr *subexpr) 1049 : Expr(SC, subexpr->getType(), subexpr->getValueKind(), 1050 subexpr->getObjectKind()), 1051 SubExpr(subexpr) { 1052 setDependence(computeDependence(this)); 1053 } 1054 FullExpr(StmtClass SC, EmptyShell Empty) 1055 : Expr(SC, Empty) {} 1056 public: 1057 const Expr *getSubExpr() const { return cast<Expr>(SubExpr); } 1058 Expr *getSubExpr() { return cast<Expr>(SubExpr); } 1059 1060 /// As with any mutator of the AST, be very careful when modifying an 1061 /// existing AST to preserve its invariants. 1062 void setSubExpr(Expr *E) { SubExpr = E; } 1063 1064 static bool classof(const Stmt *T) { 1065 return T->getStmtClass() >= firstFullExprConstant && 1066 T->getStmtClass() <= lastFullExprConstant; 1067 } 1068 }; 1069 1070 /// Describes the kind of result that can be tail-allocated. 1071 enum class ConstantResultStorageKind { None, Int64, APValue }; 1072 1073 /// ConstantExpr - An expression that occurs in a constant context and 1074 /// optionally the result of evaluating the expression. 1075 class ConstantExpr final 1076 : public FullExpr, 1077 private llvm::TrailingObjects<ConstantExpr, APValue, uint64_t> { 1078 static_assert(std::is_same<uint64_t, llvm::APInt::WordType>::value, 1079 "ConstantExpr assumes that llvm::APInt::WordType is uint64_t " 1080 "for tail-allocated storage"); 1081 friend TrailingObjects; 1082 friend class ASTStmtReader; 1083 friend class ASTStmtWriter; 1084 1085 size_t numTrailingObjects(OverloadToken<APValue>) const { 1086 return getResultStorageKind() == ConstantResultStorageKind::APValue; 1087 } 1088 size_t numTrailingObjects(OverloadToken<uint64_t>) const { 1089 return getResultStorageKind() == ConstantResultStorageKind::Int64; 1090 } 1091 1092 uint64_t &Int64Result() { 1093 assert(getResultStorageKind() == ConstantResultStorageKind::Int64 && 1094 "invalid accessor"); 1095 return *getTrailingObjects<uint64_t>(); 1096 } 1097 const uint64_t &Int64Result() const { 1098 return const_cast<ConstantExpr *>(this)->Int64Result(); 1099 } 1100 APValue &APValueResult() { 1101 assert(getResultStorageKind() == ConstantResultStorageKind::APValue && 1102 "invalid accessor"); 1103 return *getTrailingObjects<APValue>(); 1104 } 1105 APValue &APValueResult() const { 1106 return const_cast<ConstantExpr *>(this)->APValueResult(); 1107 } 1108 1109 ConstantExpr(Expr *SubExpr, ConstantResultStorageKind StorageKind, 1110 bool IsImmediateInvocation); 1111 ConstantExpr(EmptyShell Empty, ConstantResultStorageKind StorageKind); 1112 1113 public: 1114 static ConstantExpr *Create(const ASTContext &Context, Expr *E, 1115 const APValue &Result); 1116 static ConstantExpr * 1117 Create(const ASTContext &Context, Expr *E, 1118 ConstantResultStorageKind Storage = ConstantResultStorageKind::None, 1119 bool IsImmediateInvocation = false); 1120 static ConstantExpr *CreateEmpty(const ASTContext &Context, 1121 ConstantResultStorageKind StorageKind); 1122 1123 static ConstantResultStorageKind getStorageKind(const APValue &Value); 1124 static ConstantResultStorageKind getStorageKind(const Type *T, 1125 const ASTContext &Context); 1126 1127 SourceLocation getBeginLoc() const LLVM_READONLY { 1128 return SubExpr->getBeginLoc(); 1129 } 1130 SourceLocation getEndLoc() const LLVM_READONLY { 1131 return SubExpr->getEndLoc(); 1132 } 1133 1134 static bool classof(const Stmt *T) { 1135 return T->getStmtClass() == ConstantExprClass; 1136 } 1137 1138 void SetResult(APValue Value, const ASTContext &Context) { 1139 MoveIntoResult(Value, Context); 1140 } 1141 void MoveIntoResult(APValue &Value, const ASTContext &Context); 1142 1143 APValue::ValueKind getResultAPValueKind() const { 1144 return static_cast<APValue::ValueKind>(ConstantExprBits.APValueKind); 1145 } 1146 ConstantResultStorageKind getResultStorageKind() const { 1147 return static_cast<ConstantResultStorageKind>(ConstantExprBits.ResultKind); 1148 } 1149 bool isImmediateInvocation() const { 1150 return ConstantExprBits.IsImmediateInvocation; 1151 } 1152 bool hasAPValueResult() const { 1153 return ConstantExprBits.APValueKind != APValue::None; 1154 } 1155 APValue getAPValueResult() const; 1156 llvm::APSInt getResultAsAPSInt() const; 1157 // Iterators 1158 child_range children() { return child_range(&SubExpr, &SubExpr+1); } 1159 const_child_range children() const { 1160 return const_child_range(&SubExpr, &SubExpr + 1); 1161 } 1162 }; 1163 1164 //===----------------------------------------------------------------------===// 1165 // Primary Expressions. 1166 //===----------------------------------------------------------------------===// 1167 1168 /// OpaqueValueExpr - An expression referring to an opaque object of a 1169 /// fixed type and value class. These don't correspond to concrete 1170 /// syntax; instead they're used to express operations (usually copy 1171 /// operations) on values whose source is generally obvious from 1172 /// context. 1173 class OpaqueValueExpr : public Expr { 1174 friend class ASTStmtReader; 1175 Expr *SourceExpr; 1176 1177 public: 1178 OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK, 1179 ExprObjectKind OK = OK_Ordinary, Expr *SourceExpr = nullptr) 1180 : Expr(OpaqueValueExprClass, T, VK, OK), SourceExpr(SourceExpr) { 1181 setIsUnique(false); 1182 OpaqueValueExprBits.Loc = Loc; 1183 setDependence(computeDependence(this)); 1184 } 1185 1186 /// Given an expression which invokes a copy constructor --- i.e. a 1187 /// CXXConstructExpr, possibly wrapped in an ExprWithCleanups --- 1188 /// find the OpaqueValueExpr that's the source of the construction. 1189 static const OpaqueValueExpr *findInCopyConstruct(const Expr *expr); 1190 1191 explicit OpaqueValueExpr(EmptyShell Empty) 1192 : Expr(OpaqueValueExprClass, Empty) {} 1193 1194 /// Retrieve the location of this expression. 1195 SourceLocation getLocation() const { return OpaqueValueExprBits.Loc; } 1196 1197 SourceLocation getBeginLoc() const LLVM_READONLY { 1198 return SourceExpr ? SourceExpr->getBeginLoc() : getLocation(); 1199 } 1200 SourceLocation getEndLoc() const LLVM_READONLY { 1201 return SourceExpr ? SourceExpr->getEndLoc() : getLocation(); 1202 } 1203 SourceLocation getExprLoc() const LLVM_READONLY { 1204 return SourceExpr ? SourceExpr->getExprLoc() : getLocation(); 1205 } 1206 1207 child_range children() { 1208 return child_range(child_iterator(), child_iterator()); 1209 } 1210 1211 const_child_range children() const { 1212 return const_child_range(const_child_iterator(), const_child_iterator()); 1213 } 1214 1215 /// The source expression of an opaque value expression is the 1216 /// expression which originally generated the value. This is 1217 /// provided as a convenience for analyses that don't wish to 1218 /// precisely model the execution behavior of the program. 1219 /// 1220 /// The source expression is typically set when building the 1221 /// expression which binds the opaque value expression in the first 1222 /// place. 1223 Expr *getSourceExpr() const { return SourceExpr; } 1224 1225 void setIsUnique(bool V) { 1226 assert((!V || SourceExpr) && 1227 "unique OVEs are expected to have source expressions"); 1228 OpaqueValueExprBits.IsUnique = V; 1229 } 1230 1231 bool isUnique() const { return OpaqueValueExprBits.IsUnique; } 1232 1233 static bool classof(const Stmt *T) { 1234 return T->getStmtClass() == OpaqueValueExprClass; 1235 } 1236 }; 1237 1238 /// A reference to a declared variable, function, enum, etc. 1239 /// [C99 6.5.1p2] 1240 /// 1241 /// This encodes all the information about how a declaration is referenced 1242 /// within an expression. 1243 /// 1244 /// There are several optional constructs attached to DeclRefExprs only when 1245 /// they apply in order to conserve memory. These are laid out past the end of 1246 /// the object, and flags in the DeclRefExprBitfield track whether they exist: 1247 /// 1248 /// DeclRefExprBits.HasQualifier: 1249 /// Specifies when this declaration reference expression has a C++ 1250 /// nested-name-specifier. 1251 /// DeclRefExprBits.HasFoundDecl: 1252 /// Specifies when this declaration reference expression has a record of 1253 /// a NamedDecl (different from the referenced ValueDecl) which was found 1254 /// during name lookup and/or overload resolution. 1255 /// DeclRefExprBits.HasTemplateKWAndArgsInfo: 1256 /// Specifies when this declaration reference expression has an explicit 1257 /// C++ template keyword and/or template argument list. 1258 /// DeclRefExprBits.RefersToEnclosingVariableOrCapture 1259 /// Specifies when this declaration reference expression (validly) 1260 /// refers to an enclosed local or a captured variable. 1261 class DeclRefExpr final 1262 : public Expr, 1263 private llvm::TrailingObjects<DeclRefExpr, NestedNameSpecifierLoc, 1264 NamedDecl *, ASTTemplateKWAndArgsInfo, 1265 TemplateArgumentLoc> { 1266 friend class ASTStmtReader; 1267 friend class ASTStmtWriter; 1268 friend TrailingObjects; 1269 1270 /// The declaration that we are referencing. 1271 ValueDecl *D; 1272 1273 /// Provides source/type location info for the declaration name 1274 /// embedded in D. 1275 DeclarationNameLoc DNLoc; 1276 1277 size_t numTrailingObjects(OverloadToken<NestedNameSpecifierLoc>) const { 1278 return hasQualifier(); 1279 } 1280 1281 size_t numTrailingObjects(OverloadToken<NamedDecl *>) const { 1282 return hasFoundDecl(); 1283 } 1284 1285 size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const { 1286 return hasTemplateKWAndArgsInfo(); 1287 } 1288 1289 /// Test whether there is a distinct FoundDecl attached to the end of 1290 /// this DRE. 1291 bool hasFoundDecl() const { return DeclRefExprBits.HasFoundDecl; } 1292 1293 DeclRefExpr(const ASTContext &Ctx, NestedNameSpecifierLoc QualifierLoc, 1294 SourceLocation TemplateKWLoc, ValueDecl *D, 1295 bool RefersToEnclosingVariableOrCapture, 1296 const DeclarationNameInfo &NameInfo, NamedDecl *FoundD, 1297 const TemplateArgumentListInfo *TemplateArgs, QualType T, 1298 ExprValueKind VK, NonOdrUseReason NOUR); 1299 1300 /// Construct an empty declaration reference expression. 1301 explicit DeclRefExpr(EmptyShell Empty) : Expr(DeclRefExprClass, Empty) {} 1302 1303 public: 1304 DeclRefExpr(const ASTContext &Ctx, ValueDecl *D, 1305 bool RefersToEnclosingVariableOrCapture, QualType T, 1306 ExprValueKind VK, SourceLocation L, 1307 const DeclarationNameLoc &LocInfo = DeclarationNameLoc(), 1308 NonOdrUseReason NOUR = NOUR_None); 1309 1310 static DeclRefExpr * 1311 Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, 1312 SourceLocation TemplateKWLoc, ValueDecl *D, 1313 bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, 1314 QualType T, ExprValueKind VK, NamedDecl *FoundD = nullptr, 1315 const TemplateArgumentListInfo *TemplateArgs = nullptr, 1316 NonOdrUseReason NOUR = NOUR_None); 1317 1318 static DeclRefExpr * 1319 Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, 1320 SourceLocation TemplateKWLoc, ValueDecl *D, 1321 bool RefersToEnclosingVariableOrCapture, 1322 const DeclarationNameInfo &NameInfo, QualType T, ExprValueKind VK, 1323 NamedDecl *FoundD = nullptr, 1324 const TemplateArgumentListInfo *TemplateArgs = nullptr, 1325 NonOdrUseReason NOUR = NOUR_None); 1326 1327 /// Construct an empty declaration reference expression. 1328 static DeclRefExpr *CreateEmpty(const ASTContext &Context, bool HasQualifier, 1329 bool HasFoundDecl, 1330 bool HasTemplateKWAndArgsInfo, 1331 unsigned NumTemplateArgs); 1332 1333 ValueDecl *getDecl() { return D; } 1334 const ValueDecl *getDecl() const { return D; } 1335 void setDecl(ValueDecl *NewD); 1336 1337 DeclarationNameInfo getNameInfo() const { 1338 return DeclarationNameInfo(getDecl()->getDeclName(), getLocation(), DNLoc); 1339 } 1340 1341 SourceLocation getLocation() const { return DeclRefExprBits.Loc; } 1342 void setLocation(SourceLocation L) { DeclRefExprBits.Loc = L; } 1343 SourceLocation getBeginLoc() const LLVM_READONLY; 1344 SourceLocation getEndLoc() const LLVM_READONLY; 1345 1346 /// Determine whether this declaration reference was preceded by a 1347 /// C++ nested-name-specifier, e.g., \c N::foo. 1348 bool hasQualifier() const { return DeclRefExprBits.HasQualifier; } 1349 1350 /// If the name was qualified, retrieves the nested-name-specifier 1351 /// that precedes the name, with source-location information. 1352 NestedNameSpecifierLoc getQualifierLoc() const { 1353 if (!hasQualifier()) 1354 return NestedNameSpecifierLoc(); 1355 return *getTrailingObjects<NestedNameSpecifierLoc>(); 1356 } 1357 1358 /// If the name was qualified, retrieves the nested-name-specifier 1359 /// that precedes the name. Otherwise, returns NULL. 1360 NestedNameSpecifier *getQualifier() const { 1361 return getQualifierLoc().getNestedNameSpecifier(); 1362 } 1363 1364 /// Get the NamedDecl through which this reference occurred. 1365 /// 1366 /// This Decl may be different from the ValueDecl actually referred to in the 1367 /// presence of using declarations, etc. It always returns non-NULL, and may 1368 /// simple return the ValueDecl when appropriate. 1369 1370 NamedDecl *getFoundDecl() { 1371 return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D; 1372 } 1373 1374 /// Get the NamedDecl through which this reference occurred. 1375 /// See non-const variant. 1376 const NamedDecl *getFoundDecl() const { 1377 return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D; 1378 } 1379 1380 bool hasTemplateKWAndArgsInfo() const { 1381 return DeclRefExprBits.HasTemplateKWAndArgsInfo; 1382 } 1383 1384 /// Retrieve the location of the template keyword preceding 1385 /// this name, if any. 1386 SourceLocation getTemplateKeywordLoc() const { 1387 if (!hasTemplateKWAndArgsInfo()) 1388 return SourceLocation(); 1389 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc; 1390 } 1391 1392 /// Retrieve the location of the left angle bracket starting the 1393 /// explicit template argument list following the name, if any. 1394 SourceLocation getLAngleLoc() const { 1395 if (!hasTemplateKWAndArgsInfo()) 1396 return SourceLocation(); 1397 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc; 1398 } 1399 1400 /// Retrieve the location of the right angle bracket ending the 1401 /// explicit template argument list following the name, if any. 1402 SourceLocation getRAngleLoc() const { 1403 if (!hasTemplateKWAndArgsInfo()) 1404 return SourceLocation(); 1405 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc; 1406 } 1407 1408 /// Determines whether the name in this declaration reference 1409 /// was preceded by the template keyword. 1410 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } 1411 1412 /// Determines whether this declaration reference was followed by an 1413 /// explicit template argument list. 1414 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } 1415 1416 /// Copies the template arguments (if present) into the given 1417 /// structure. 1418 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 1419 if (hasExplicitTemplateArgs()) 1420 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto( 1421 getTrailingObjects<TemplateArgumentLoc>(), List); 1422 } 1423 1424 /// Retrieve the template arguments provided as part of this 1425 /// template-id. 1426 const TemplateArgumentLoc *getTemplateArgs() const { 1427 if (!hasExplicitTemplateArgs()) 1428 return nullptr; 1429 return getTrailingObjects<TemplateArgumentLoc>(); 1430 } 1431 1432 /// Retrieve the number of template arguments provided as part of this 1433 /// template-id. 1434 unsigned getNumTemplateArgs() const { 1435 if (!hasExplicitTemplateArgs()) 1436 return 0; 1437 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs; 1438 } 1439 1440 ArrayRef<TemplateArgumentLoc> template_arguments() const { 1441 return {getTemplateArgs(), getNumTemplateArgs()}; 1442 } 1443 1444 /// Returns true if this expression refers to a function that 1445 /// was resolved from an overloaded set having size greater than 1. 1446 bool hadMultipleCandidates() const { 1447 return DeclRefExprBits.HadMultipleCandidates; 1448 } 1449 /// Sets the flag telling whether this expression refers to 1450 /// a function that was resolved from an overloaded set having size 1451 /// greater than 1. 1452 void setHadMultipleCandidates(bool V = true) { 1453 DeclRefExprBits.HadMultipleCandidates = V; 1454 } 1455 1456 /// Is this expression a non-odr-use reference, and if so, why? 1457 NonOdrUseReason isNonOdrUse() const { 1458 return static_cast<NonOdrUseReason>(DeclRefExprBits.NonOdrUseReason); 1459 } 1460 1461 /// Does this DeclRefExpr refer to an enclosing local or a captured 1462 /// variable? 1463 bool refersToEnclosingVariableOrCapture() const { 1464 return DeclRefExprBits.RefersToEnclosingVariableOrCapture; 1465 } 1466 1467 bool isImmediateEscalating() const { 1468 return DeclRefExprBits.IsImmediateEscalating; 1469 } 1470 1471 void setIsImmediateEscalating(bool Set) { 1472 DeclRefExprBits.IsImmediateEscalating = Set; 1473 } 1474 1475 bool isCapturedByCopyInLambdaWithExplicitObjectParameter() const { 1476 return DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter; 1477 } 1478 1479 void setCapturedByCopyInLambdaWithExplicitObjectParameter( 1480 bool Set, const ASTContext &Context) { 1481 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = Set; 1482 setDependence(computeDependence(this, Context)); 1483 } 1484 1485 static bool classof(const Stmt *T) { 1486 return T->getStmtClass() == DeclRefExprClass; 1487 } 1488 1489 // Iterators 1490 child_range children() { 1491 return child_range(child_iterator(), child_iterator()); 1492 } 1493 1494 const_child_range children() const { 1495 return const_child_range(const_child_iterator(), const_child_iterator()); 1496 } 1497 }; 1498 1499 class IntegerLiteral : public Expr, public APIntStorage { 1500 SourceLocation Loc; 1501 1502 /// Construct an empty integer literal. 1503 explicit IntegerLiteral(EmptyShell Empty) 1504 : Expr(IntegerLiteralClass, Empty) { } 1505 1506 public: 1507 // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy, 1508 // or UnsignedLongLongTy 1509 IntegerLiteral(const ASTContext &C, const llvm::APInt &V, QualType type, 1510 SourceLocation l); 1511 1512 /// Returns a new integer literal with value 'V' and type 'type'. 1513 /// \param type - either IntTy, LongTy, LongLongTy, UnsignedIntTy, 1514 /// UnsignedLongTy, or UnsignedLongLongTy which should match the size of V 1515 /// \param V - the value that the returned integer literal contains. 1516 static IntegerLiteral *Create(const ASTContext &C, const llvm::APInt &V, 1517 QualType type, SourceLocation l); 1518 /// Returns a new empty integer literal. 1519 static IntegerLiteral *Create(const ASTContext &C, EmptyShell Empty); 1520 1521 SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; } 1522 SourceLocation getEndLoc() const LLVM_READONLY { return Loc; } 1523 1524 /// Retrieve the location of the literal. 1525 SourceLocation getLocation() const { return Loc; } 1526 1527 void setLocation(SourceLocation Location) { Loc = Location; } 1528 1529 static bool classof(const Stmt *T) { 1530 return T->getStmtClass() == IntegerLiteralClass; 1531 } 1532 1533 // Iterators 1534 child_range children() { 1535 return child_range(child_iterator(), child_iterator()); 1536 } 1537 const_child_range children() const { 1538 return const_child_range(const_child_iterator(), const_child_iterator()); 1539 } 1540 }; 1541 1542 class FixedPointLiteral : public Expr, public APIntStorage { 1543 SourceLocation Loc; 1544 unsigned Scale; 1545 1546 /// \brief Construct an empty fixed-point literal. 1547 explicit FixedPointLiteral(EmptyShell Empty) 1548 : Expr(FixedPointLiteralClass, Empty) {} 1549 1550 public: 1551 FixedPointLiteral(const ASTContext &C, const llvm::APInt &V, QualType type, 1552 SourceLocation l, unsigned Scale); 1553 1554 // Store the int as is without any bit shifting. 1555 static FixedPointLiteral *CreateFromRawInt(const ASTContext &C, 1556 const llvm::APInt &V, 1557 QualType type, SourceLocation l, 1558 unsigned Scale); 1559 1560 /// Returns an empty fixed-point literal. 1561 static FixedPointLiteral *Create(const ASTContext &C, EmptyShell Empty); 1562 1563 SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; } 1564 SourceLocation getEndLoc() const LLVM_READONLY { return Loc; } 1565 1566 /// \brief Retrieve the location of the literal. 1567 SourceLocation getLocation() const { return Loc; } 1568 1569 void setLocation(SourceLocation Location) { Loc = Location; } 1570 1571 unsigned getScale() const { return Scale; } 1572 void setScale(unsigned S) { Scale = S; } 1573 1574 static bool classof(const Stmt *T) { 1575 return T->getStmtClass() == FixedPointLiteralClass; 1576 } 1577 1578 std::string getValueAsString(unsigned Radix) const; 1579 1580 // Iterators 1581 child_range children() { 1582 return child_range(child_iterator(), child_iterator()); 1583 } 1584 const_child_range children() const { 1585 return const_child_range(const_child_iterator(), const_child_iterator()); 1586 } 1587 }; 1588 1589 enum class CharacterLiteralKind { Ascii, Wide, UTF8, UTF16, UTF32 }; 1590 1591 class CharacterLiteral : public Expr { 1592 unsigned Value; 1593 SourceLocation Loc; 1594 public: 1595 // type should be IntTy 1596 CharacterLiteral(unsigned value, CharacterLiteralKind kind, QualType type, 1597 SourceLocation l) 1598 : Expr(CharacterLiteralClass, type, VK_PRValue, OK_Ordinary), 1599 Value(value), Loc(l) { 1600 CharacterLiteralBits.Kind = llvm::to_underlying(kind); 1601 setDependence(ExprDependence::None); 1602 } 1603 1604 /// Construct an empty character literal. 1605 CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { } 1606 1607 SourceLocation getLocation() const { return Loc; } 1608 CharacterLiteralKind getKind() const { 1609 return static_cast<CharacterLiteralKind>(CharacterLiteralBits.Kind); 1610 } 1611 1612 SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; } 1613 SourceLocation getEndLoc() const LLVM_READONLY { return Loc; } 1614 1615 unsigned getValue() const { return Value; } 1616 1617 void setLocation(SourceLocation Location) { Loc = Location; } 1618 void setKind(CharacterLiteralKind kind) { 1619 CharacterLiteralBits.Kind = llvm::to_underlying(kind); 1620 } 1621 void setValue(unsigned Val) { Value = Val; } 1622 1623 static bool classof(const Stmt *T) { 1624 return T->getStmtClass() == CharacterLiteralClass; 1625 } 1626 1627 static void print(unsigned val, CharacterLiteralKind Kind, raw_ostream &OS); 1628 1629 // Iterators 1630 child_range children() { 1631 return child_range(child_iterator(), child_iterator()); 1632 } 1633 const_child_range children() const { 1634 return const_child_range(const_child_iterator(), const_child_iterator()); 1635 } 1636 }; 1637 1638 class FloatingLiteral : public Expr, private APFloatStorage { 1639 SourceLocation Loc; 1640 1641 FloatingLiteral(const ASTContext &C, const llvm::APFloat &V, bool isexact, 1642 QualType Type, SourceLocation L); 1643 1644 /// Construct an empty floating-point literal. 1645 explicit FloatingLiteral(const ASTContext &C, EmptyShell Empty); 1646 1647 public: 1648 static FloatingLiteral *Create(const ASTContext &C, const llvm::APFloat &V, 1649 bool isexact, QualType Type, SourceLocation L); 1650 static FloatingLiteral *Create(const ASTContext &C, EmptyShell Empty); 1651 1652 llvm::APFloat getValue() const { 1653 return APFloatStorage::getValue(getSemantics()); 1654 } 1655 void setValue(const ASTContext &C, const llvm::APFloat &Val) { 1656 assert(&getSemantics() == &Val.getSemantics() && "Inconsistent semantics"); 1657 APFloatStorage::setValue(C, Val); 1658 } 1659 1660 /// Get a raw enumeration value representing the floating-point semantics of 1661 /// this literal (32-bit IEEE, x87, ...), suitable for serialization. 1662 llvm::APFloatBase::Semantics getRawSemantics() const { 1663 return static_cast<llvm::APFloatBase::Semantics>( 1664 FloatingLiteralBits.Semantics); 1665 } 1666 1667 /// Set the raw enumeration value representing the floating-point semantics of 1668 /// this literal (32-bit IEEE, x87, ...), suitable for serialization. 1669 void setRawSemantics(llvm::APFloatBase::Semantics Sem) { 1670 FloatingLiteralBits.Semantics = Sem; 1671 } 1672 1673 /// Return the APFloat semantics this literal uses. 1674 const llvm::fltSemantics &getSemantics() const { 1675 return llvm::APFloatBase::EnumToSemantics( 1676 static_cast<llvm::APFloatBase::Semantics>( 1677 FloatingLiteralBits.Semantics)); 1678 } 1679 1680 /// Set the APFloat semantics this literal uses. 1681 void setSemantics(const llvm::fltSemantics &Sem) { 1682 FloatingLiteralBits.Semantics = llvm::APFloatBase::SemanticsToEnum(Sem); 1683 } 1684 1685 bool isExact() const { return FloatingLiteralBits.IsExact; } 1686 void setExact(bool E) { FloatingLiteralBits.IsExact = E; } 1687 1688 /// getValueAsApproximateDouble - This returns the value as an inaccurate 1689 /// double. Note that this may cause loss of precision, but is useful for 1690 /// debugging dumps, etc. 1691 double getValueAsApproximateDouble() const; 1692 1693 SourceLocation getLocation() const { return Loc; } 1694 void setLocation(SourceLocation L) { Loc = L; } 1695 1696 SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; } 1697 SourceLocation getEndLoc() const LLVM_READONLY { return Loc; } 1698 1699 static bool classof(const Stmt *T) { 1700 return T->getStmtClass() == FloatingLiteralClass; 1701 } 1702 1703 // Iterators 1704 child_range children() { 1705 return child_range(child_iterator(), child_iterator()); 1706 } 1707 const_child_range children() const { 1708 return const_child_range(const_child_iterator(), const_child_iterator()); 1709 } 1710 }; 1711 1712 /// ImaginaryLiteral - We support imaginary integer and floating point literals, 1713 /// like "1.0i". We represent these as a wrapper around FloatingLiteral and 1714 /// IntegerLiteral classes. Instances of this class always have a Complex type 1715 /// whose element type matches the subexpression. 1716 /// 1717 class ImaginaryLiteral : public Expr { 1718 Stmt *Val; 1719 public: 1720 ImaginaryLiteral(Expr *val, QualType Ty) 1721 : Expr(ImaginaryLiteralClass, Ty, VK_PRValue, OK_Ordinary), Val(val) { 1722 setDependence(ExprDependence::None); 1723 } 1724 1725 /// Build an empty imaginary literal. 1726 explicit ImaginaryLiteral(EmptyShell Empty) 1727 : Expr(ImaginaryLiteralClass, Empty) { } 1728 1729 const Expr *getSubExpr() const { return cast<Expr>(Val); } 1730 Expr *getSubExpr() { return cast<Expr>(Val); } 1731 void setSubExpr(Expr *E) { Val = E; } 1732 1733 SourceLocation getBeginLoc() const LLVM_READONLY { 1734 return Val->getBeginLoc(); 1735 } 1736 SourceLocation getEndLoc() const LLVM_READONLY { return Val->getEndLoc(); } 1737 1738 static bool classof(const Stmt *T) { 1739 return T->getStmtClass() == ImaginaryLiteralClass; 1740 } 1741 1742 // Iterators 1743 child_range children() { return child_range(&Val, &Val+1); } 1744 const_child_range children() const { 1745 return const_child_range(&Val, &Val + 1); 1746 } 1747 }; 1748 1749 enum class StringLiteralKind { 1750 Ordinary, 1751 Wide, 1752 UTF8, 1753 UTF16, 1754 UTF32, 1755 Unevaluated 1756 }; 1757 1758 /// StringLiteral - This represents a string literal expression, e.g. "foo" 1759 /// or L"bar" (wide strings). The actual string data can be obtained with 1760 /// getBytes() and is NOT null-terminated. The length of the string data is 1761 /// determined by calling getByteLength(). 1762 /// 1763 /// The C type for a string is always a ConstantArrayType. In C++, the char 1764 /// type is const qualified, in C it is not. 1765 /// 1766 /// Note that strings in C can be formed by concatenation of multiple string 1767 /// literal pptokens in translation phase #6. This keeps track of the locations 1768 /// of each of these pieces. 1769 /// 1770 /// Strings in C can also be truncated and extended by assigning into arrays, 1771 /// e.g. with constructs like: 1772 /// char X[2] = "foobar"; 1773 /// In this case, getByteLength() will return 6, but the string literal will 1774 /// have type "char[2]". 1775 class StringLiteral final 1776 : public Expr, 1777 private llvm::TrailingObjects<StringLiteral, unsigned, SourceLocation, 1778 char> { 1779 friend class ASTStmtReader; 1780 friend TrailingObjects; 1781 1782 /// StringLiteral is followed by several trailing objects. They are in order: 1783 /// 1784 /// * A single unsigned storing the length in characters of this string. The 1785 /// length in bytes is this length times the width of a single character. 1786 /// Always present and stored as a trailing objects because storing it in 1787 /// StringLiteral would increase the size of StringLiteral by sizeof(void *) 1788 /// due to alignment requirements. If you add some data to StringLiteral, 1789 /// consider moving it inside StringLiteral. 1790 /// 1791 /// * An array of getNumConcatenated() SourceLocation, one for each of the 1792 /// token this string is made of. 1793 /// 1794 /// * An array of getByteLength() char used to store the string data. 1795 1796 unsigned numTrailingObjects(OverloadToken<unsigned>) const { return 1; } 1797 unsigned numTrailingObjects(OverloadToken<SourceLocation>) const { 1798 return getNumConcatenated(); 1799 } 1800 1801 unsigned numTrailingObjects(OverloadToken<char>) const { 1802 return getByteLength(); 1803 } 1804 1805 char *getStrDataAsChar() { return getTrailingObjects<char>(); } 1806 const char *getStrDataAsChar() const { return getTrailingObjects<char>(); } 1807 1808 const uint16_t *getStrDataAsUInt16() const { 1809 return reinterpret_cast<const uint16_t *>(getTrailingObjects<char>()); 1810 } 1811 1812 const uint32_t *getStrDataAsUInt32() const { 1813 return reinterpret_cast<const uint32_t *>(getTrailingObjects<char>()); 1814 } 1815 1816 /// Build a string literal. 1817 StringLiteral(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, 1818 bool Pascal, QualType Ty, const SourceLocation *Loc, 1819 unsigned NumConcatenated); 1820 1821 /// Build an empty string literal. 1822 StringLiteral(EmptyShell Empty, unsigned NumConcatenated, unsigned Length, 1823 unsigned CharByteWidth); 1824 1825 /// Map a target and string kind to the appropriate character width. 1826 static unsigned mapCharByteWidth(TargetInfo const &Target, 1827 StringLiteralKind SK); 1828 1829 /// Set one of the string literal token. 1830 void setStrTokenLoc(unsigned TokNum, SourceLocation L) { 1831 assert(TokNum < getNumConcatenated() && "Invalid tok number"); 1832 getTrailingObjects<SourceLocation>()[TokNum] = L; 1833 } 1834 1835 public: 1836 /// This is the "fully general" constructor that allows representation of 1837 /// strings formed from multiple concatenated tokens. 1838 static StringLiteral *Create(const ASTContext &Ctx, StringRef Str, 1839 StringLiteralKind Kind, bool Pascal, QualType Ty, 1840 const SourceLocation *Loc, 1841 unsigned NumConcatenated); 1842 1843 /// Simple constructor for string literals made from one token. 1844 static StringLiteral *Create(const ASTContext &Ctx, StringRef Str, 1845 StringLiteralKind Kind, bool Pascal, QualType Ty, 1846 SourceLocation Loc) { 1847 return Create(Ctx, Str, Kind, Pascal, Ty, &Loc, 1); 1848 } 1849 1850 /// Construct an empty string literal. 1851 static StringLiteral *CreateEmpty(const ASTContext &Ctx, 1852 unsigned NumConcatenated, unsigned Length, 1853 unsigned CharByteWidth); 1854 1855 StringRef getString() const { 1856 assert((isUnevaluated() || getCharByteWidth() == 1) && 1857 "This function is used in places that assume strings use char"); 1858 return StringRef(getStrDataAsChar(), getByteLength()); 1859 } 1860 1861 /// Allow access to clients that need the byte representation, such as 1862 /// ASTWriterStmt::VisitStringLiteral(). 1863 StringRef getBytes() const { 1864 // FIXME: StringRef may not be the right type to use as a result for this. 1865 return StringRef(getStrDataAsChar(), getByteLength()); 1866 } 1867 1868 void outputString(raw_ostream &OS) const; 1869 1870 uint32_t getCodeUnit(size_t i) const { 1871 assert(i < getLength() && "out of bounds access"); 1872 switch (getCharByteWidth()) { 1873 case 1: 1874 return static_cast<unsigned char>(getStrDataAsChar()[i]); 1875 case 2: 1876 return getStrDataAsUInt16()[i]; 1877 case 4: 1878 return getStrDataAsUInt32()[i]; 1879 } 1880 llvm_unreachable("Unsupported character width!"); 1881 } 1882 1883 // Get code unit but preserve sign info. 1884 int64_t getCodeUnitS(size_t I, uint64_t BitWidth) const { 1885 int64_t V = getCodeUnit(I); 1886 if (isOrdinary() || isWide()) { 1887 unsigned Width = getCharByteWidth() * BitWidth; 1888 llvm::APInt AInt(Width, (uint64_t)V); 1889 V = AInt.getSExtValue(); 1890 } 1891 return V; 1892 } 1893 1894 unsigned getByteLength() const { return getCharByteWidth() * getLength(); } 1895 unsigned getLength() const { return *getTrailingObjects<unsigned>(); } 1896 unsigned getCharByteWidth() const { return StringLiteralBits.CharByteWidth; } 1897 1898 StringLiteralKind getKind() const { 1899 return static_cast<StringLiteralKind>(StringLiteralBits.Kind); 1900 } 1901 1902 bool isOrdinary() const { return getKind() == StringLiteralKind::Ordinary; } 1903 bool isWide() const { return getKind() == StringLiteralKind::Wide; } 1904 bool isUTF8() const { return getKind() == StringLiteralKind::UTF8; } 1905 bool isUTF16() const { return getKind() == StringLiteralKind::UTF16; } 1906 bool isUTF32() const { return getKind() == StringLiteralKind::UTF32; } 1907 bool isUnevaluated() const { return getKind() == StringLiteralKind::Unevaluated; } 1908 bool isPascal() const { return StringLiteralBits.IsPascal; } 1909 1910 bool containsNonAscii() const { 1911 for (auto c : getString()) 1912 if (!isASCII(c)) 1913 return true; 1914 return false; 1915 } 1916 1917 bool containsNonAsciiOrNull() const { 1918 for (auto c : getString()) 1919 if (!isASCII(c) || !c) 1920 return true; 1921 return false; 1922 } 1923 1924 /// getNumConcatenated - Get the number of string literal tokens that were 1925 /// concatenated in translation phase #6 to form this string literal. 1926 unsigned getNumConcatenated() const { 1927 return StringLiteralBits.NumConcatenated; 1928 } 1929 1930 /// Get one of the string literal token. 1931 SourceLocation getStrTokenLoc(unsigned TokNum) const { 1932 assert(TokNum < getNumConcatenated() && "Invalid tok number"); 1933 return getTrailingObjects<SourceLocation>()[TokNum]; 1934 } 1935 1936 /// getLocationOfByte - Return a source location that points to the specified 1937 /// byte of this string literal. 1938 /// 1939 /// Strings are amazingly complex. They can be formed from multiple tokens 1940 /// and can have escape sequences in them in addition to the usual trigraph 1941 /// and escaped newline business. This routine handles this complexity. 1942 /// 1943 SourceLocation 1944 getLocationOfByte(unsigned ByteNo, const SourceManager &SM, 1945 const LangOptions &Features, const TargetInfo &Target, 1946 unsigned *StartToken = nullptr, 1947 unsigned *StartTokenByteOffset = nullptr) const; 1948 1949 typedef const SourceLocation *tokloc_iterator; 1950 1951 tokloc_iterator tokloc_begin() const { 1952 return getTrailingObjects<SourceLocation>(); 1953 } 1954 1955 tokloc_iterator tokloc_end() const { 1956 return getTrailingObjects<SourceLocation>() + getNumConcatenated(); 1957 } 1958 1959 SourceLocation getBeginLoc() const LLVM_READONLY { return *tokloc_begin(); } 1960 SourceLocation getEndLoc() const LLVM_READONLY { return *(tokloc_end() - 1); } 1961 1962 static bool classof(const Stmt *T) { 1963 return T->getStmtClass() == StringLiteralClass; 1964 } 1965 1966 // Iterators 1967 child_range children() { 1968 return child_range(child_iterator(), child_iterator()); 1969 } 1970 const_child_range children() const { 1971 return const_child_range(const_child_iterator(), const_child_iterator()); 1972 } 1973 }; 1974 1975 enum class PredefinedIdentKind { 1976 Func, 1977 Function, 1978 LFunction, // Same as Function, but as wide string. 1979 FuncDName, 1980 FuncSig, 1981 LFuncSig, // Same as FuncSig, but as wide string 1982 PrettyFunction, 1983 /// The same as PrettyFunction, except that the 1984 /// 'virtual' keyword is omitted for virtual member functions. 1985 PrettyFunctionNoVirtual 1986 }; 1987 1988 /// [C99 6.4.2.2] - A predefined identifier such as __func__. 1989 class PredefinedExpr final 1990 : public Expr, 1991 private llvm::TrailingObjects<PredefinedExpr, Stmt *> { 1992 friend class ASTStmtReader; 1993 friend TrailingObjects; 1994 1995 // PredefinedExpr is optionally followed by a single trailing 1996 // "Stmt *" for the predefined identifier. It is present if and only if 1997 // hasFunctionName() is true and is always a "StringLiteral *". 1998 1999 PredefinedExpr(SourceLocation L, QualType FNTy, PredefinedIdentKind IK, 2000 bool IsTransparent, StringLiteral *SL); 2001 2002 explicit PredefinedExpr(EmptyShell Empty, bool HasFunctionName); 2003 2004 /// True if this PredefinedExpr has storage for a function name. 2005 bool hasFunctionName() const { return PredefinedExprBits.HasFunctionName; } 2006 2007 void setFunctionName(StringLiteral *SL) { 2008 assert(hasFunctionName() && 2009 "This PredefinedExpr has no storage for a function name!"); 2010 *getTrailingObjects<Stmt *>() = SL; 2011 } 2012 2013 public: 2014 /// Create a PredefinedExpr. 2015 /// 2016 /// If IsTransparent, the PredefinedExpr is transparently handled as a 2017 /// StringLiteral. 2018 static PredefinedExpr *Create(const ASTContext &Ctx, SourceLocation L, 2019 QualType FNTy, PredefinedIdentKind IK, 2020 bool IsTransparent, StringLiteral *SL); 2021 2022 /// Create an empty PredefinedExpr. 2023 static PredefinedExpr *CreateEmpty(const ASTContext &Ctx, 2024 bool HasFunctionName); 2025 2026 PredefinedIdentKind getIdentKind() const { 2027 return static_cast<PredefinedIdentKind>(PredefinedExprBits.Kind); 2028 } 2029 2030 bool isTransparent() const { return PredefinedExprBits.IsTransparent; } 2031 2032 SourceLocation getLocation() const { return PredefinedExprBits.Loc; } 2033 void setLocation(SourceLocation L) { PredefinedExprBits.Loc = L; } 2034 2035 StringLiteral *getFunctionName() { 2036 return hasFunctionName() 2037 ? static_cast<StringLiteral *>(*getTrailingObjects<Stmt *>()) 2038 : nullptr; 2039 } 2040 2041 const StringLiteral *getFunctionName() const { 2042 return hasFunctionName() 2043 ? static_cast<StringLiteral *>(*getTrailingObjects<Stmt *>()) 2044 : nullptr; 2045 } 2046 2047 static StringRef getIdentKindName(PredefinedIdentKind IK); 2048 StringRef getIdentKindName() const { 2049 return getIdentKindName(getIdentKind()); 2050 } 2051 2052 static std::string ComputeName(PredefinedIdentKind IK, 2053 const Decl *CurrentDecl, 2054 bool ForceElaboratedPrinting = false); 2055 2056 SourceLocation getBeginLoc() const { return getLocation(); } 2057 SourceLocation getEndLoc() const { return getLocation(); } 2058 2059 static bool classof(const Stmt *T) { 2060 return T->getStmtClass() == PredefinedExprClass; 2061 } 2062 2063 // Iterators 2064 child_range children() { 2065 return child_range(getTrailingObjects<Stmt *>(), 2066 getTrailingObjects<Stmt *>() + hasFunctionName()); 2067 } 2068 2069 const_child_range children() const { 2070 return const_child_range(getTrailingObjects<Stmt *>(), 2071 getTrailingObjects<Stmt *>() + hasFunctionName()); 2072 } 2073 }; 2074 2075 /// This expression type represents an asterisk in an OpenACC Size-Expr, used in 2076 /// the 'tile' and 'gang' clauses. It is of 'int' type, but should not be 2077 /// evaluated. 2078 class OpenACCAsteriskSizeExpr final : public Expr { 2079 friend class ASTStmtReader; 2080 SourceLocation AsteriskLoc; 2081 2082 OpenACCAsteriskSizeExpr(SourceLocation AsteriskLoc, QualType IntTy) 2083 : Expr(OpenACCAsteriskSizeExprClass, IntTy, VK_PRValue, OK_Ordinary), 2084 AsteriskLoc(AsteriskLoc) {} 2085 2086 void setAsteriskLocation(SourceLocation Loc) { AsteriskLoc = Loc; } 2087 2088 public: 2089 static OpenACCAsteriskSizeExpr *Create(const ASTContext &C, 2090 SourceLocation Loc); 2091 static OpenACCAsteriskSizeExpr *CreateEmpty(const ASTContext &C); 2092 2093 SourceLocation getBeginLoc() const { return AsteriskLoc; } 2094 SourceLocation getEndLoc() const { return AsteriskLoc; } 2095 SourceLocation getLocation() const { return AsteriskLoc; } 2096 2097 static bool classof(const Stmt *T) { 2098 return T->getStmtClass() == OpenACCAsteriskSizeExprClass; 2099 } 2100 // Iterators 2101 child_range children() { 2102 return child_range(child_iterator(), child_iterator()); 2103 } 2104 2105 const_child_range children() const { 2106 return const_child_range(const_child_iterator(), const_child_iterator()); 2107 } 2108 }; 2109 2110 // This represents a use of the __builtin_sycl_unique_stable_name, which takes a 2111 // type-id, and at CodeGen time emits a unique string representation of the 2112 // type in a way that permits us to properly encode information about the SYCL 2113 // kernels. 2114 class SYCLUniqueStableNameExpr final : public Expr { 2115 friend class ASTStmtReader; 2116 SourceLocation OpLoc, LParen, RParen; 2117 TypeSourceInfo *TypeInfo; 2118 2119 SYCLUniqueStableNameExpr(EmptyShell Empty, QualType ResultTy); 2120 SYCLUniqueStableNameExpr(SourceLocation OpLoc, SourceLocation LParen, 2121 SourceLocation RParen, QualType ResultTy, 2122 TypeSourceInfo *TSI); 2123 2124 void setTypeSourceInfo(TypeSourceInfo *Ty) { TypeInfo = Ty; } 2125 2126 void setLocation(SourceLocation L) { OpLoc = L; } 2127 void setLParenLocation(SourceLocation L) { LParen = L; } 2128 void setRParenLocation(SourceLocation L) { RParen = L; } 2129 2130 public: 2131 TypeSourceInfo *getTypeSourceInfo() { return TypeInfo; } 2132 2133 const TypeSourceInfo *getTypeSourceInfo() const { return TypeInfo; } 2134 2135 static SYCLUniqueStableNameExpr * 2136 Create(const ASTContext &Ctx, SourceLocation OpLoc, SourceLocation LParen, 2137 SourceLocation RParen, TypeSourceInfo *TSI); 2138 2139 static SYCLUniqueStableNameExpr *CreateEmpty(const ASTContext &Ctx); 2140 2141 SourceLocation getBeginLoc() const { return getLocation(); } 2142 SourceLocation getEndLoc() const { return RParen; } 2143 SourceLocation getLocation() const { return OpLoc; } 2144 SourceLocation getLParenLocation() const { return LParen; } 2145 SourceLocation getRParenLocation() const { return RParen; } 2146 2147 static bool classof(const Stmt *T) { 2148 return T->getStmtClass() == SYCLUniqueStableNameExprClass; 2149 } 2150 2151 // Iterators 2152 child_range children() { 2153 return child_range(child_iterator(), child_iterator()); 2154 } 2155 2156 const_child_range children() const { 2157 return const_child_range(const_child_iterator(), const_child_iterator()); 2158 } 2159 2160 // Convenience function to generate the name of the currently stored type. 2161 std::string ComputeName(ASTContext &Context) const; 2162 2163 // Get the generated name of the type. Note that this only works after all 2164 // kernels have been instantiated. 2165 static std::string ComputeName(ASTContext &Context, QualType Ty); 2166 }; 2167 2168 /// ParenExpr - This represents a parenthesized expression, e.g. "(1)". This 2169 /// AST node is only formed if full location information is requested. 2170 class ParenExpr : public Expr { 2171 SourceLocation L, R; 2172 Stmt *Val; 2173 2174 public: 2175 ParenExpr(SourceLocation l, SourceLocation r, Expr *val) 2176 : Expr(ParenExprClass, val->getType(), val->getValueKind(), 2177 val->getObjectKind()), 2178 L(l), R(r), Val(val) { 2179 ParenExprBits.ProducedByFoldExpansion = false; 2180 setDependence(computeDependence(this)); 2181 } 2182 2183 /// Construct an empty parenthesized expression. 2184 explicit ParenExpr(EmptyShell Empty) 2185 : Expr(ParenExprClass, Empty) { } 2186 2187 const Expr *getSubExpr() const { return cast<Expr>(Val); } 2188 Expr *getSubExpr() { return cast<Expr>(Val); } 2189 void setSubExpr(Expr *E) { Val = E; } 2190 2191 SourceLocation getBeginLoc() const LLVM_READONLY { return L; } 2192 SourceLocation getEndLoc() const LLVM_READONLY { return R; } 2193 2194 /// Get the location of the left parentheses '('. 2195 SourceLocation getLParen() const { return L; } 2196 void setLParen(SourceLocation Loc) { L = Loc; } 2197 2198 /// Get the location of the right parentheses ')'. 2199 SourceLocation getRParen() const { return R; } 2200 void setRParen(SourceLocation Loc) { R = Loc; } 2201 2202 static bool classof(const Stmt *T) { 2203 return T->getStmtClass() == ParenExprClass; 2204 } 2205 2206 // Iterators 2207 child_range children() { return child_range(&Val, &Val+1); } 2208 const_child_range children() const { 2209 return const_child_range(&Val, &Val + 1); 2210 } 2211 2212 bool isProducedByFoldExpansion() const { 2213 return ParenExprBits.ProducedByFoldExpansion != 0; 2214 } 2215 void setIsProducedByFoldExpansion(bool ProducedByFoldExpansion = true) { 2216 ParenExprBits.ProducedByFoldExpansion = ProducedByFoldExpansion; 2217 } 2218 }; 2219 2220 /// UnaryOperator - This represents the unary-expression's (except sizeof and 2221 /// alignof), the postinc/postdec operators from postfix-expression, and various 2222 /// extensions. 2223 /// 2224 /// Notes on various nodes: 2225 /// 2226 /// Real/Imag - These return the real/imag part of a complex operand. If 2227 /// applied to a non-complex value, the former returns its operand and the 2228 /// later returns zero in the type of the operand. 2229 /// 2230 class UnaryOperator final 2231 : public Expr, 2232 private llvm::TrailingObjects<UnaryOperator, FPOptionsOverride> { 2233 Stmt *Val; 2234 2235 size_t numTrailingObjects(OverloadToken<FPOptionsOverride>) const { 2236 return UnaryOperatorBits.HasFPFeatures ? 1 : 0; 2237 } 2238 2239 FPOptionsOverride &getTrailingFPFeatures() { 2240 assert(UnaryOperatorBits.HasFPFeatures); 2241 return *getTrailingObjects<FPOptionsOverride>(); 2242 } 2243 2244 const FPOptionsOverride &getTrailingFPFeatures() const { 2245 assert(UnaryOperatorBits.HasFPFeatures); 2246 return *getTrailingObjects<FPOptionsOverride>(); 2247 } 2248 2249 public: 2250 typedef UnaryOperatorKind Opcode; 2251 2252 protected: 2253 UnaryOperator(const ASTContext &Ctx, Expr *input, Opcode opc, QualType type, 2254 ExprValueKind VK, ExprObjectKind OK, SourceLocation l, 2255 bool CanOverflow, FPOptionsOverride FPFeatures); 2256 2257 /// Build an empty unary operator. 2258 explicit UnaryOperator(bool HasFPFeatures, EmptyShell Empty) 2259 : Expr(UnaryOperatorClass, Empty) { 2260 UnaryOperatorBits.Opc = UO_AddrOf; 2261 UnaryOperatorBits.HasFPFeatures = HasFPFeatures; 2262 } 2263 2264 public: 2265 static UnaryOperator *CreateEmpty(const ASTContext &C, bool hasFPFeatures); 2266 2267 static UnaryOperator *Create(const ASTContext &C, Expr *input, Opcode opc, 2268 QualType type, ExprValueKind VK, 2269 ExprObjectKind OK, SourceLocation l, 2270 bool CanOverflow, FPOptionsOverride FPFeatures); 2271 2272 Opcode getOpcode() const { 2273 return static_cast<Opcode>(UnaryOperatorBits.Opc); 2274 } 2275 void setOpcode(Opcode Opc) { UnaryOperatorBits.Opc = Opc; } 2276 2277 Expr *getSubExpr() const { return cast<Expr>(Val); } 2278 void setSubExpr(Expr *E) { Val = E; } 2279 2280 /// getOperatorLoc - Return the location of the operator. 2281 SourceLocation getOperatorLoc() const { return UnaryOperatorBits.Loc; } 2282 void setOperatorLoc(SourceLocation L) { UnaryOperatorBits.Loc = L; } 2283 2284 /// Returns true if the unary operator can cause an overflow. For instance, 2285 /// signed int i = INT_MAX; i++; 2286 /// signed char c = CHAR_MAX; c++; 2287 /// Due to integer promotions, c++ is promoted to an int before the postfix 2288 /// increment, and the result is an int that cannot overflow. However, i++ 2289 /// can overflow. 2290 bool canOverflow() const { return UnaryOperatorBits.CanOverflow; } 2291 void setCanOverflow(bool C) { UnaryOperatorBits.CanOverflow = C; } 2292 2293 /// Get the FP contractibility status of this operator. Only meaningful for 2294 /// operations on floating point types. 2295 bool isFPContractableWithinStatement(const LangOptions &LO) const { 2296 return getFPFeaturesInEffect(LO).allowFPContractWithinStatement(); 2297 } 2298 2299 /// Get the FENV_ACCESS status of this operator. Only meaningful for 2300 /// operations on floating point types. 2301 bool isFEnvAccessOn(const LangOptions &LO) const { 2302 return getFPFeaturesInEffect(LO).getAllowFEnvAccess(); 2303 } 2304 2305 /// isPostfix - Return true if this is a postfix operation, like x++. 2306 static bool isPostfix(Opcode Op) { 2307 return Op == UO_PostInc || Op == UO_PostDec; 2308 } 2309 2310 /// isPrefix - Return true if this is a prefix operation, like --x. 2311 static bool isPrefix(Opcode Op) { 2312 return Op == UO_PreInc || Op == UO_PreDec; 2313 } 2314 2315 bool isPrefix() const { return isPrefix(getOpcode()); } 2316 bool isPostfix() const { return isPostfix(getOpcode()); } 2317 2318 static bool isIncrementOp(Opcode Op) { 2319 return Op == UO_PreInc || Op == UO_PostInc; 2320 } 2321 bool isIncrementOp() const { 2322 return isIncrementOp(getOpcode()); 2323 } 2324 2325 static bool isDecrementOp(Opcode Op) { 2326 return Op == UO_PreDec || Op == UO_PostDec; 2327 } 2328 bool isDecrementOp() const { 2329 return isDecrementOp(getOpcode()); 2330 } 2331 2332 static bool isIncrementDecrementOp(Opcode Op) { return Op <= UO_PreDec; } 2333 bool isIncrementDecrementOp() const { 2334 return isIncrementDecrementOp(getOpcode()); 2335 } 2336 2337 static bool isArithmeticOp(Opcode Op) { 2338 return Op >= UO_Plus && Op <= UO_LNot; 2339 } 2340 bool isArithmeticOp() const { return isArithmeticOp(getOpcode()); } 2341 2342 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 2343 /// corresponds to, e.g. "sizeof" or "[pre]++" 2344 static StringRef getOpcodeStr(Opcode Op); 2345 2346 /// Retrieve the unary opcode that corresponds to the given 2347 /// overloaded operator. 2348 static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix); 2349 2350 /// Retrieve the overloaded operator kind that corresponds to 2351 /// the given unary opcode. 2352 static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); 2353 2354 SourceLocation getBeginLoc() const LLVM_READONLY { 2355 return isPostfix() ? Val->getBeginLoc() : getOperatorLoc(); 2356 } 2357 SourceLocation getEndLoc() const LLVM_READONLY { 2358 return isPostfix() ? getOperatorLoc() : Val->getEndLoc(); 2359 } 2360 SourceLocation getExprLoc() const { return getOperatorLoc(); } 2361 2362 static bool classof(const Stmt *T) { 2363 return T->getStmtClass() == UnaryOperatorClass; 2364 } 2365 2366 // Iterators 2367 child_range children() { return child_range(&Val, &Val+1); } 2368 const_child_range children() const { 2369 return const_child_range(&Val, &Val + 1); 2370 } 2371 2372 /// Is FPFeatures in Trailing Storage? 2373 bool hasStoredFPFeatures() const { return UnaryOperatorBits.HasFPFeatures; } 2374 2375 /// Get FPFeatures from trailing storage. 2376 FPOptionsOverride getStoredFPFeatures() const { 2377 return getTrailingFPFeatures(); 2378 } 2379 2380 /// Get the store FPOptionsOverride or default if not stored. 2381 FPOptionsOverride getStoredFPFeaturesOrDefault() const { 2382 return hasStoredFPFeatures() ? getStoredFPFeatures() : FPOptionsOverride(); 2383 } 2384 2385 protected: 2386 /// Set FPFeatures in trailing storage, used by Serialization & ASTImporter. 2387 void setStoredFPFeatures(FPOptionsOverride F) { getTrailingFPFeatures() = F; } 2388 2389 public: 2390 /// Get the FP features status of this operator. Only meaningful for 2391 /// operations on floating point types. 2392 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const { 2393 if (UnaryOperatorBits.HasFPFeatures) 2394 return getStoredFPFeatures().applyOverrides(LO); 2395 return FPOptions::defaultWithoutTrailingStorage(LO); 2396 } 2397 FPOptionsOverride getFPOptionsOverride() const { 2398 if (UnaryOperatorBits.HasFPFeatures) 2399 return getStoredFPFeatures(); 2400 return FPOptionsOverride(); 2401 } 2402 2403 friend TrailingObjects; 2404 friend class ASTNodeImporter; 2405 friend class ASTReader; 2406 friend class ASTStmtReader; 2407 friend class ASTStmtWriter; 2408 }; 2409 2410 /// Helper class for OffsetOfExpr. 2411 2412 // __builtin_offsetof(type, identifier(.identifier|[expr])*) 2413 class OffsetOfNode { 2414 public: 2415 /// The kind of offsetof node we have. 2416 enum Kind { 2417 /// An index into an array. 2418 Array = 0x00, 2419 /// A field. 2420 Field = 0x01, 2421 /// A field in a dependent type, known only by its name. 2422 Identifier = 0x02, 2423 /// An implicit indirection through a C++ base class, when the 2424 /// field found is in a base class. 2425 Base = 0x03 2426 }; 2427 2428 private: 2429 enum { MaskBits = 2, Mask = 0x03 }; 2430 2431 /// The source range that covers this part of the designator. 2432 SourceRange Range; 2433 2434 /// The data describing the designator, which comes in three 2435 /// different forms, depending on the lower two bits. 2436 /// - An unsigned index into the array of Expr*'s stored after this node 2437 /// in memory, for [constant-expression] designators. 2438 /// - A FieldDecl*, for references to a known field. 2439 /// - An IdentifierInfo*, for references to a field with a given name 2440 /// when the class type is dependent. 2441 /// - A CXXBaseSpecifier*, for references that look at a field in a 2442 /// base class. 2443 uintptr_t Data; 2444 2445 public: 2446 /// Create an offsetof node that refers to an array element. 2447 OffsetOfNode(SourceLocation LBracketLoc, unsigned Index, 2448 SourceLocation RBracketLoc) 2449 : Range(LBracketLoc, RBracketLoc), Data((Index << 2) | Array) {} 2450 2451 /// Create an offsetof node that refers to a field. 2452 OffsetOfNode(SourceLocation DotLoc, FieldDecl *Field, SourceLocation NameLoc) 2453 : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc), 2454 Data(reinterpret_cast<uintptr_t>(Field) | OffsetOfNode::Field) {} 2455 2456 /// Create an offsetof node that refers to an identifier. 2457 OffsetOfNode(SourceLocation DotLoc, IdentifierInfo *Name, 2458 SourceLocation NameLoc) 2459 : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc), 2460 Data(reinterpret_cast<uintptr_t>(Name) | Identifier) {} 2461 2462 /// Create an offsetof node that refers into a C++ base class. 2463 explicit OffsetOfNode(const CXXBaseSpecifier *Base) 2464 : Data(reinterpret_cast<uintptr_t>(Base) | OffsetOfNode::Base) {} 2465 2466 /// Determine what kind of offsetof node this is. 2467 Kind getKind() const { return static_cast<Kind>(Data & Mask); } 2468 2469 /// For an array element node, returns the index into the array 2470 /// of expressions. 2471 unsigned getArrayExprIndex() const { 2472 assert(getKind() == Array); 2473 return Data >> 2; 2474 } 2475 2476 /// For a field offsetof node, returns the field. 2477 FieldDecl *getField() const { 2478 assert(getKind() == Field); 2479 return reinterpret_cast<FieldDecl *>(Data & ~(uintptr_t)Mask); 2480 } 2481 2482 /// For a field or identifier offsetof node, returns the name of 2483 /// the field. 2484 IdentifierInfo *getFieldName() const; 2485 2486 /// For a base class node, returns the base specifier. 2487 CXXBaseSpecifier *getBase() const { 2488 assert(getKind() == Base); 2489 return reinterpret_cast<CXXBaseSpecifier *>(Data & ~(uintptr_t)Mask); 2490 } 2491 2492 /// Retrieve the source range that covers this offsetof node. 2493 /// 2494 /// For an array element node, the source range contains the locations of 2495 /// the square brackets. For a field or identifier node, the source range 2496 /// contains the location of the period (if there is one) and the 2497 /// identifier. 2498 SourceRange getSourceRange() const LLVM_READONLY { return Range; } 2499 SourceLocation getBeginLoc() const LLVM_READONLY { return Range.getBegin(); } 2500 SourceLocation getEndLoc() const LLVM_READONLY { return Range.getEnd(); } 2501 }; 2502 2503 /// OffsetOfExpr - [C99 7.17] - This represents an expression of the form 2504 /// offsetof(record-type, member-designator). For example, given: 2505 /// @code 2506 /// struct S { 2507 /// float f; 2508 /// double d; 2509 /// }; 2510 /// struct T { 2511 /// int i; 2512 /// struct S s[10]; 2513 /// }; 2514 /// @endcode 2515 /// we can represent and evaluate the expression @c offsetof(struct T, s[2].d). 2516 2517 class OffsetOfExpr final 2518 : public Expr, 2519 private llvm::TrailingObjects<OffsetOfExpr, OffsetOfNode, Expr *> { 2520 SourceLocation OperatorLoc, RParenLoc; 2521 // Base type; 2522 TypeSourceInfo *TSInfo; 2523 // Number of sub-components (i.e. instances of OffsetOfNode). 2524 unsigned NumComps; 2525 // Number of sub-expressions (i.e. array subscript expressions). 2526 unsigned NumExprs; 2527 2528 size_t numTrailingObjects(OverloadToken<OffsetOfNode>) const { 2529 return NumComps; 2530 } 2531 2532 OffsetOfExpr(const ASTContext &C, QualType type, 2533 SourceLocation OperatorLoc, TypeSourceInfo *tsi, 2534 ArrayRef<OffsetOfNode> comps, ArrayRef<Expr*> exprs, 2535 SourceLocation RParenLoc); 2536 2537 explicit OffsetOfExpr(unsigned numComps, unsigned numExprs) 2538 : Expr(OffsetOfExprClass, EmptyShell()), 2539 TSInfo(nullptr), NumComps(numComps), NumExprs(numExprs) {} 2540 2541 public: 2542 2543 static OffsetOfExpr *Create(const ASTContext &C, QualType type, 2544 SourceLocation OperatorLoc, TypeSourceInfo *tsi, 2545 ArrayRef<OffsetOfNode> comps, 2546 ArrayRef<Expr*> exprs, SourceLocation RParenLoc); 2547 2548 static OffsetOfExpr *CreateEmpty(const ASTContext &C, 2549 unsigned NumComps, unsigned NumExprs); 2550 2551 /// getOperatorLoc - Return the location of the operator. 2552 SourceLocation getOperatorLoc() const { return OperatorLoc; } 2553 void setOperatorLoc(SourceLocation L) { OperatorLoc = L; } 2554 2555 /// Return the location of the right parentheses. 2556 SourceLocation getRParenLoc() const { return RParenLoc; } 2557 void setRParenLoc(SourceLocation R) { RParenLoc = R; } 2558 2559 TypeSourceInfo *getTypeSourceInfo() const { 2560 return TSInfo; 2561 } 2562 void setTypeSourceInfo(TypeSourceInfo *tsi) { 2563 TSInfo = tsi; 2564 } 2565 2566 const OffsetOfNode &getComponent(unsigned Idx) const { 2567 assert(Idx < NumComps && "Subscript out of range"); 2568 return getTrailingObjects<OffsetOfNode>()[Idx]; 2569 } 2570 2571 void setComponent(unsigned Idx, OffsetOfNode ON) { 2572 assert(Idx < NumComps && "Subscript out of range"); 2573 getTrailingObjects<OffsetOfNode>()[Idx] = ON; 2574 } 2575 2576 unsigned getNumComponents() const { 2577 return NumComps; 2578 } 2579 2580 Expr* getIndexExpr(unsigned Idx) { 2581 assert(Idx < NumExprs && "Subscript out of range"); 2582 return getTrailingObjects<Expr *>()[Idx]; 2583 } 2584 2585 const Expr *getIndexExpr(unsigned Idx) const { 2586 assert(Idx < NumExprs && "Subscript out of range"); 2587 return getTrailingObjects<Expr *>()[Idx]; 2588 } 2589 2590 void setIndexExpr(unsigned Idx, Expr* E) { 2591 assert(Idx < NumComps && "Subscript out of range"); 2592 getTrailingObjects<Expr *>()[Idx] = E; 2593 } 2594 2595 unsigned getNumExpressions() const { 2596 return NumExprs; 2597 } 2598 2599 SourceLocation getBeginLoc() const LLVM_READONLY { return OperatorLoc; } 2600 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } 2601 2602 static bool classof(const Stmt *T) { 2603 return T->getStmtClass() == OffsetOfExprClass; 2604 } 2605 2606 // Iterators 2607 child_range children() { 2608 Stmt **begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>()); 2609 return child_range(begin, begin + NumExprs); 2610 } 2611 const_child_range children() const { 2612 Stmt *const *begin = 2613 reinterpret_cast<Stmt *const *>(getTrailingObjects<Expr *>()); 2614 return const_child_range(begin, begin + NumExprs); 2615 } 2616 friend TrailingObjects; 2617 }; 2618 2619 /// UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) 2620 /// expression operand. Used for sizeof/alignof (C99 6.5.3.4) and 2621 /// vec_step (OpenCL 1.1 6.11.12). 2622 class UnaryExprOrTypeTraitExpr : public Expr { 2623 union { 2624 TypeSourceInfo *Ty; 2625 Stmt *Ex; 2626 } Argument; 2627 SourceLocation OpLoc, RParenLoc; 2628 2629 public: 2630 UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo, 2631 QualType resultType, SourceLocation op, 2632 SourceLocation rp) 2633 : Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_PRValue, 2634 OK_Ordinary), 2635 OpLoc(op), RParenLoc(rp) { 2636 assert(ExprKind <= UETT_Last && "invalid enum value!"); 2637 UnaryExprOrTypeTraitExprBits.Kind = ExprKind; 2638 assert(static_cast<unsigned>(ExprKind) == 2639 UnaryExprOrTypeTraitExprBits.Kind && 2640 "UnaryExprOrTypeTraitExprBits.Kind overflow!"); 2641 UnaryExprOrTypeTraitExprBits.IsType = true; 2642 Argument.Ty = TInfo; 2643 setDependence(computeDependence(this)); 2644 } 2645 2646 UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, Expr *E, 2647 QualType resultType, SourceLocation op, 2648 SourceLocation rp); 2649 2650 /// Construct an empty sizeof/alignof expression. 2651 explicit UnaryExprOrTypeTraitExpr(EmptyShell Empty) 2652 : Expr(UnaryExprOrTypeTraitExprClass, Empty) { } 2653 2654 UnaryExprOrTypeTrait getKind() const { 2655 return static_cast<UnaryExprOrTypeTrait>(UnaryExprOrTypeTraitExprBits.Kind); 2656 } 2657 void setKind(UnaryExprOrTypeTrait K) { 2658 assert(K <= UETT_Last && "invalid enum value!"); 2659 UnaryExprOrTypeTraitExprBits.Kind = K; 2660 assert(static_cast<unsigned>(K) == UnaryExprOrTypeTraitExprBits.Kind && 2661 "UnaryExprOrTypeTraitExprBits.Kind overflow!"); 2662 } 2663 2664 bool isArgumentType() const { return UnaryExprOrTypeTraitExprBits.IsType; } 2665 QualType getArgumentType() const { 2666 return getArgumentTypeInfo()->getType(); 2667 } 2668 TypeSourceInfo *getArgumentTypeInfo() const { 2669 assert(isArgumentType() && "calling getArgumentType() when arg is expr"); 2670 return Argument.Ty; 2671 } 2672 Expr *getArgumentExpr() { 2673 assert(!isArgumentType() && "calling getArgumentExpr() when arg is type"); 2674 return static_cast<Expr*>(Argument.Ex); 2675 } 2676 const Expr *getArgumentExpr() const { 2677 return const_cast<UnaryExprOrTypeTraitExpr*>(this)->getArgumentExpr(); 2678 } 2679 2680 void setArgument(Expr *E) { 2681 Argument.Ex = E; 2682 UnaryExprOrTypeTraitExprBits.IsType = false; 2683 } 2684 void setArgument(TypeSourceInfo *TInfo) { 2685 Argument.Ty = TInfo; 2686 UnaryExprOrTypeTraitExprBits.IsType = true; 2687 } 2688 2689 /// Gets the argument type, or the type of the argument expression, whichever 2690 /// is appropriate. 2691 QualType getTypeOfArgument() const { 2692 return isArgumentType() ? getArgumentType() : getArgumentExpr()->getType(); 2693 } 2694 2695 SourceLocation getOperatorLoc() const { return OpLoc; } 2696 void setOperatorLoc(SourceLocation L) { OpLoc = L; } 2697 2698 SourceLocation getRParenLoc() const { return RParenLoc; } 2699 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 2700 2701 SourceLocation getBeginLoc() const LLVM_READONLY { return OpLoc; } 2702 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } 2703 2704 static bool classof(const Stmt *T) { 2705 return T->getStmtClass() == UnaryExprOrTypeTraitExprClass; 2706 } 2707 2708 // Iterators 2709 child_range children(); 2710 const_child_range children() const; 2711 }; 2712 2713 //===----------------------------------------------------------------------===// 2714 // Postfix Operators. 2715 //===----------------------------------------------------------------------===// 2716 2717 /// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting. 2718 class ArraySubscriptExpr : public Expr { 2719 enum { LHS, RHS, END_EXPR }; 2720 Stmt *SubExprs[END_EXPR]; 2721 2722 bool lhsIsBase() const { return getRHS()->getType()->isIntegerType(); } 2723 2724 public: 2725 ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t, ExprValueKind VK, 2726 ExprObjectKind OK, SourceLocation rbracketloc) 2727 : Expr(ArraySubscriptExprClass, t, VK, OK) { 2728 SubExprs[LHS] = lhs; 2729 SubExprs[RHS] = rhs; 2730 ArrayOrMatrixSubscriptExprBits.RBracketLoc = rbracketloc; 2731 setDependence(computeDependence(this)); 2732 } 2733 2734 /// Create an empty array subscript expression. 2735 explicit ArraySubscriptExpr(EmptyShell Shell) 2736 : Expr(ArraySubscriptExprClass, Shell) { } 2737 2738 /// An array access can be written A[4] or 4[A] (both are equivalent). 2739 /// - getBase() and getIdx() always present the normalized view: A[4]. 2740 /// In this case getBase() returns "A" and getIdx() returns "4". 2741 /// - getLHS() and getRHS() present the syntactic view. e.g. for 2742 /// 4[A] getLHS() returns "4". 2743 /// Note: Because vector element access is also written A[4] we must 2744 /// predicate the format conversion in getBase and getIdx only on the 2745 /// the type of the RHS, as it is possible for the LHS to be a vector of 2746 /// integer type 2747 Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); } 2748 const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 2749 void setLHS(Expr *E) { SubExprs[LHS] = E; } 2750 2751 Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); } 2752 const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 2753 void setRHS(Expr *E) { SubExprs[RHS] = E; } 2754 2755 Expr *getBase() { return lhsIsBase() ? getLHS() : getRHS(); } 2756 const Expr *getBase() const { return lhsIsBase() ? getLHS() : getRHS(); } 2757 2758 Expr *getIdx() { return lhsIsBase() ? getRHS() : getLHS(); } 2759 const Expr *getIdx() const { return lhsIsBase() ? getRHS() : getLHS(); } 2760 2761 SourceLocation getBeginLoc() const LLVM_READONLY { 2762 return getLHS()->getBeginLoc(); 2763 } 2764 SourceLocation getEndLoc() const { return getRBracketLoc(); } 2765 2766 SourceLocation getRBracketLoc() const { 2767 return ArrayOrMatrixSubscriptExprBits.RBracketLoc; 2768 } 2769 void setRBracketLoc(SourceLocation L) { 2770 ArrayOrMatrixSubscriptExprBits.RBracketLoc = L; 2771 } 2772 2773 SourceLocation getExprLoc() const LLVM_READONLY { 2774 return getBase()->getExprLoc(); 2775 } 2776 2777 static bool classof(const Stmt *T) { 2778 return T->getStmtClass() == ArraySubscriptExprClass; 2779 } 2780 2781 // Iterators 2782 child_range children() { 2783 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 2784 } 2785 const_child_range children() const { 2786 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); 2787 } 2788 }; 2789 2790 /// MatrixSubscriptExpr - Matrix subscript expression for the MatrixType 2791 /// extension. 2792 /// MatrixSubscriptExpr can be either incomplete (only Base and RowIdx are set 2793 /// so far, the type is IncompleteMatrixIdx) or complete (Base, RowIdx and 2794 /// ColumnIdx refer to valid expressions). Incomplete matrix expressions only 2795 /// exist during the initial construction of the AST. 2796 class MatrixSubscriptExpr : public Expr { 2797 enum { BASE, ROW_IDX, COLUMN_IDX, END_EXPR }; 2798 Stmt *SubExprs[END_EXPR]; 2799 2800 public: 2801 MatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, QualType T, 2802 SourceLocation RBracketLoc) 2803 : Expr(MatrixSubscriptExprClass, T, Base->getValueKind(), 2804 OK_MatrixComponent) { 2805 SubExprs[BASE] = Base; 2806 SubExprs[ROW_IDX] = RowIdx; 2807 SubExprs[COLUMN_IDX] = ColumnIdx; 2808 ArrayOrMatrixSubscriptExprBits.RBracketLoc = RBracketLoc; 2809 setDependence(computeDependence(this)); 2810 } 2811 2812 /// Create an empty matrix subscript expression. 2813 explicit MatrixSubscriptExpr(EmptyShell Shell) 2814 : Expr(MatrixSubscriptExprClass, Shell) {} 2815 2816 bool isIncomplete() const { 2817 bool IsIncomplete = hasPlaceholderType(BuiltinType::IncompleteMatrixIdx); 2818 assert((SubExprs[COLUMN_IDX] || IsIncomplete) && 2819 "expressions without column index must be marked as incomplete"); 2820 return IsIncomplete; 2821 } 2822 Expr *getBase() { return cast<Expr>(SubExprs[BASE]); } 2823 const Expr *getBase() const { return cast<Expr>(SubExprs[BASE]); } 2824 void setBase(Expr *E) { SubExprs[BASE] = E; } 2825 2826 Expr *getRowIdx() { return cast<Expr>(SubExprs[ROW_IDX]); } 2827 const Expr *getRowIdx() const { return cast<Expr>(SubExprs[ROW_IDX]); } 2828 void setRowIdx(Expr *E) { SubExprs[ROW_IDX] = E; } 2829 2830 Expr *getColumnIdx() { return cast_or_null<Expr>(SubExprs[COLUMN_IDX]); } 2831 const Expr *getColumnIdx() const { 2832 assert(!isIncomplete() && 2833 "cannot get the column index of an incomplete expression"); 2834 return cast<Expr>(SubExprs[COLUMN_IDX]); 2835 } 2836 void setColumnIdx(Expr *E) { SubExprs[COLUMN_IDX] = E; } 2837 2838 SourceLocation getBeginLoc() const LLVM_READONLY { 2839 return getBase()->getBeginLoc(); 2840 } 2841 2842 SourceLocation getEndLoc() const { return getRBracketLoc(); } 2843 2844 SourceLocation getExprLoc() const LLVM_READONLY { 2845 return getBase()->getExprLoc(); 2846 } 2847 2848 SourceLocation getRBracketLoc() const { 2849 return ArrayOrMatrixSubscriptExprBits.RBracketLoc; 2850 } 2851 void setRBracketLoc(SourceLocation L) { 2852 ArrayOrMatrixSubscriptExprBits.RBracketLoc = L; 2853 } 2854 2855 static bool classof(const Stmt *T) { 2856 return T->getStmtClass() == MatrixSubscriptExprClass; 2857 } 2858 2859 // Iterators 2860 child_range children() { 2861 return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); 2862 } 2863 const_child_range children() const { 2864 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); 2865 } 2866 }; 2867 2868 /// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]). 2869 /// CallExpr itself represents a normal function call, e.g., "f(x, 2)", 2870 /// while its subclasses may represent alternative syntax that (semantically) 2871 /// results in a function call. For example, CXXOperatorCallExpr is 2872 /// a subclass for overloaded operator calls that use operator syntax, e.g., 2873 /// "str1 + str2" to resolve to a function call. 2874 class CallExpr : public Expr { 2875 enum { FN = 0, PREARGS_START = 1 }; 2876 2877 /// The number of arguments in the call expression. 2878 unsigned NumArgs; 2879 2880 /// The location of the right parentheses. This has a different meaning for 2881 /// the derived classes of CallExpr. 2882 SourceLocation RParenLoc; 2883 2884 // CallExpr store some data in trailing objects. However since CallExpr 2885 // is used a base of other expression classes we cannot use 2886 // llvm::TrailingObjects. Instead we manually perform the pointer arithmetic 2887 // and casts. 2888 // 2889 // The trailing objects are in order: 2890 // 2891 // * A single "Stmt *" for the callee expression. 2892 // 2893 // * An array of getNumPreArgs() "Stmt *" for the pre-argument expressions. 2894 // 2895 // * An array of getNumArgs() "Stmt *" for the argument expressions. 2896 // 2897 // * An optional of type FPOptionsOverride. 2898 // 2899 // Note that we store the offset in bytes from the this pointer to the start 2900 // of the trailing objects. It would be perfectly possible to compute it 2901 // based on the dynamic kind of the CallExpr. However 1.) we have plenty of 2902 // space in the bit-fields of Stmt. 2.) It was benchmarked to be faster to 2903 // compute this once and then load the offset from the bit-fields of Stmt, 2904 // instead of re-computing the offset each time the trailing objects are 2905 // accessed. 2906 2907 /// Return a pointer to the start of the trailing array of "Stmt *". 2908 Stmt **getTrailingStmts() { 2909 return reinterpret_cast<Stmt **>(reinterpret_cast<char *>(this) + 2910 CallExprBits.OffsetToTrailingObjects); 2911 } 2912 Stmt *const *getTrailingStmts() const { 2913 return const_cast<CallExpr *>(this)->getTrailingStmts(); 2914 } 2915 2916 /// Map a statement class to the appropriate offset in bytes from the 2917 /// this pointer to the trailing objects. 2918 static unsigned offsetToTrailingObjects(StmtClass SC); 2919 2920 unsigned getSizeOfTrailingStmts() const { 2921 return (1 + getNumPreArgs() + getNumArgs()) * sizeof(Stmt *); 2922 } 2923 2924 size_t getOffsetOfTrailingFPFeatures() const { 2925 assert(hasStoredFPFeatures()); 2926 return CallExprBits.OffsetToTrailingObjects + getSizeOfTrailingStmts(); 2927 } 2928 2929 public: 2930 enum class ADLCallKind : bool { NotADL, UsesADL }; 2931 static constexpr ADLCallKind NotADL = ADLCallKind::NotADL; 2932 static constexpr ADLCallKind UsesADL = ADLCallKind::UsesADL; 2933 2934 protected: 2935 /// Build a call expression, assuming that appropriate storage has been 2936 /// allocated for the trailing objects. 2937 CallExpr(StmtClass SC, Expr *Fn, ArrayRef<Expr *> PreArgs, 2938 ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK, 2939 SourceLocation RParenLoc, FPOptionsOverride FPFeatures, 2940 unsigned MinNumArgs, ADLCallKind UsesADL); 2941 2942 /// Build an empty call expression, for deserialization. 2943 CallExpr(StmtClass SC, unsigned NumPreArgs, unsigned NumArgs, 2944 bool hasFPFeatures, EmptyShell Empty); 2945 2946 /// Return the size in bytes needed for the trailing objects. 2947 /// Used by the derived classes to allocate the right amount of storage. 2948 static unsigned sizeOfTrailingObjects(unsigned NumPreArgs, unsigned NumArgs, 2949 bool HasFPFeatures) { 2950 return (1 + NumPreArgs + NumArgs) * sizeof(Stmt *) + 2951 HasFPFeatures * sizeof(FPOptionsOverride); 2952 } 2953 2954 Stmt *getPreArg(unsigned I) { 2955 assert(I < getNumPreArgs() && "Prearg access out of range!"); 2956 return getTrailingStmts()[PREARGS_START + I]; 2957 } 2958 const Stmt *getPreArg(unsigned I) const { 2959 assert(I < getNumPreArgs() && "Prearg access out of range!"); 2960 return getTrailingStmts()[PREARGS_START + I]; 2961 } 2962 void setPreArg(unsigned I, Stmt *PreArg) { 2963 assert(I < getNumPreArgs() && "Prearg access out of range!"); 2964 getTrailingStmts()[PREARGS_START + I] = PreArg; 2965 } 2966 2967 unsigned getNumPreArgs() const { return CallExprBits.NumPreArgs; } 2968 2969 /// Return a pointer to the trailing FPOptions 2970 FPOptionsOverride *getTrailingFPFeatures() { 2971 assert(hasStoredFPFeatures()); 2972 return reinterpret_cast<FPOptionsOverride *>( 2973 reinterpret_cast<char *>(this) + CallExprBits.OffsetToTrailingObjects + 2974 getSizeOfTrailingStmts()); 2975 } 2976 const FPOptionsOverride *getTrailingFPFeatures() const { 2977 assert(hasStoredFPFeatures()); 2978 return reinterpret_cast<const FPOptionsOverride *>( 2979 reinterpret_cast<const char *>(this) + 2980 CallExprBits.OffsetToTrailingObjects + getSizeOfTrailingStmts()); 2981 } 2982 2983 public: 2984 /// Create a call expression. 2985 /// \param Fn The callee expression, 2986 /// \param Args The argument array, 2987 /// \param Ty The type of the call expression (which is *not* the return 2988 /// type in general), 2989 /// \param VK The value kind of the call expression (lvalue, rvalue, ...), 2990 /// \param RParenLoc The location of the right parenthesis in the call 2991 /// expression. 2992 /// \param FPFeatures Floating-point features associated with the call, 2993 /// \param MinNumArgs Specifies the minimum number of arguments. The actual 2994 /// number of arguments will be the greater of Args.size() 2995 /// and MinNumArgs. This is used in a few places to allocate 2996 /// enough storage for the default arguments. 2997 /// \param UsesADL Specifies whether the callee was found through 2998 /// argument-dependent lookup. 2999 /// 3000 /// Note that you can use CreateTemporary if you need a temporary call 3001 /// expression on the stack. 3002 static CallExpr *Create(const ASTContext &Ctx, Expr *Fn, 3003 ArrayRef<Expr *> Args, QualType Ty, ExprValueKind VK, 3004 SourceLocation RParenLoc, 3005 FPOptionsOverride FPFeatures, unsigned MinNumArgs = 0, 3006 ADLCallKind UsesADL = NotADL); 3007 3008 /// Create a temporary call expression with no arguments in the memory 3009 /// pointed to by Mem. Mem must points to at least sizeof(CallExpr) 3010 /// + sizeof(Stmt *) bytes of storage, aligned to alignof(CallExpr): 3011 /// 3012 /// \code{.cpp} 3013 /// alignas(CallExpr) char Buffer[sizeof(CallExpr) + sizeof(Stmt *)]; 3014 /// CallExpr *TheCall = CallExpr::CreateTemporary(Buffer, etc); 3015 /// \endcode 3016 static CallExpr *CreateTemporary(void *Mem, Expr *Fn, QualType Ty, 3017 ExprValueKind VK, SourceLocation RParenLoc, 3018 ADLCallKind UsesADL = NotADL); 3019 3020 /// Create an empty call expression, for deserialization. 3021 static CallExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, 3022 bool HasFPFeatures, EmptyShell Empty); 3023 3024 Expr *getCallee() { return cast<Expr>(getTrailingStmts()[FN]); } 3025 const Expr *getCallee() const { return cast<Expr>(getTrailingStmts()[FN]); } 3026 void setCallee(Expr *F) { getTrailingStmts()[FN] = F; } 3027 3028 ADLCallKind getADLCallKind() const { 3029 return static_cast<ADLCallKind>(CallExprBits.UsesADL); 3030 } 3031 void setADLCallKind(ADLCallKind V = UsesADL) { 3032 CallExprBits.UsesADL = static_cast<bool>(V); 3033 } 3034 bool usesADL() const { return getADLCallKind() == UsesADL; } 3035 3036 bool hasStoredFPFeatures() const { return CallExprBits.HasFPFeatures; } 3037 3038 bool isCoroElideSafe() const { return CallExprBits.IsCoroElideSafe; } 3039 void setCoroElideSafe(bool V = true) { CallExprBits.IsCoroElideSafe = V; } 3040 3041 Decl *getCalleeDecl() { return getCallee()->getReferencedDeclOfCallee(); } 3042 const Decl *getCalleeDecl() const { 3043 return getCallee()->getReferencedDeclOfCallee(); 3044 } 3045 3046 /// If the callee is a FunctionDecl, return it. Otherwise return null. 3047 FunctionDecl *getDirectCallee() { 3048 return dyn_cast_or_null<FunctionDecl>(getCalleeDecl()); 3049 } 3050 const FunctionDecl *getDirectCallee() const { 3051 return dyn_cast_or_null<FunctionDecl>(getCalleeDecl()); 3052 } 3053 3054 /// getNumArgs - Return the number of actual arguments to this call. 3055 unsigned getNumArgs() const { return NumArgs; } 3056 3057 /// Retrieve the call arguments. 3058 Expr **getArgs() { 3059 return reinterpret_cast<Expr **>(getTrailingStmts() + PREARGS_START + 3060 getNumPreArgs()); 3061 } 3062 const Expr *const *getArgs() const { 3063 return reinterpret_cast<const Expr *const *>( 3064 getTrailingStmts() + PREARGS_START + getNumPreArgs()); 3065 } 3066 3067 /// getArg - Return the specified argument. 3068 Expr *getArg(unsigned Arg) { 3069 assert(Arg < getNumArgs() && "Arg access out of range!"); 3070 return getArgs()[Arg]; 3071 } 3072 const Expr *getArg(unsigned Arg) const { 3073 assert(Arg < getNumArgs() && "Arg access out of range!"); 3074 return getArgs()[Arg]; 3075 } 3076 3077 /// setArg - Set the specified argument. 3078 /// ! the dependence bits might be stale after calling this setter, it is 3079 /// *caller*'s responsibility to recompute them by calling 3080 /// computeDependence(). 3081 void setArg(unsigned Arg, Expr *ArgExpr) { 3082 assert(Arg < getNumArgs() && "Arg access out of range!"); 3083 getArgs()[Arg] = ArgExpr; 3084 } 3085 3086 /// Compute and set dependence bits. 3087 void computeDependence() { 3088 setDependence(clang::computeDependence( 3089 this, llvm::ArrayRef( 3090 reinterpret_cast<Expr **>(getTrailingStmts() + PREARGS_START), 3091 getNumPreArgs()))); 3092 } 3093 3094 /// Reduce the number of arguments in this call expression. This is used for 3095 /// example during error recovery to drop extra arguments. There is no way 3096 /// to perform the opposite because: 1.) We don't track how much storage 3097 /// we have for the argument array 2.) This would potentially require growing 3098 /// the argument array, something we cannot support since the arguments are 3099 /// stored in a trailing array. 3100 void shrinkNumArgs(unsigned NewNumArgs) { 3101 assert((NewNumArgs <= getNumArgs()) && 3102 "shrinkNumArgs cannot increase the number of arguments!"); 3103 NumArgs = NewNumArgs; 3104 } 3105 3106 /// Bluntly set a new number of arguments without doing any checks whatsoever. 3107 /// Only used during construction of a CallExpr in a few places in Sema. 3108 /// FIXME: Find a way to remove it. 3109 void setNumArgsUnsafe(unsigned NewNumArgs) { NumArgs = NewNumArgs; } 3110 3111 typedef ExprIterator arg_iterator; 3112 typedef ConstExprIterator const_arg_iterator; 3113 typedef llvm::iterator_range<arg_iterator> arg_range; 3114 typedef llvm::iterator_range<const_arg_iterator> const_arg_range; 3115 3116 arg_range arguments() { return arg_range(arg_begin(), arg_end()); } 3117 const_arg_range arguments() const { 3118 return const_arg_range(arg_begin(), arg_end()); 3119 } 3120 3121 arg_iterator arg_begin() { 3122 return getTrailingStmts() + PREARGS_START + getNumPreArgs(); 3123 } 3124 arg_iterator arg_end() { return arg_begin() + getNumArgs(); } 3125 3126 const_arg_iterator arg_begin() const { 3127 return getTrailingStmts() + PREARGS_START + getNumPreArgs(); 3128 } 3129 const_arg_iterator arg_end() const { return arg_begin() + getNumArgs(); } 3130 3131 /// This method provides fast access to all the subexpressions of 3132 /// a CallExpr without going through the slower virtual child_iterator 3133 /// interface. This provides efficient reverse iteration of the 3134 /// subexpressions. This is currently used for CFG construction. 3135 ArrayRef<Stmt *> getRawSubExprs() { 3136 return llvm::ArrayRef(getTrailingStmts(), 3137 PREARGS_START + getNumPreArgs() + getNumArgs()); 3138 } 3139 3140 /// Get FPOptionsOverride from trailing storage. 3141 FPOptionsOverride getStoredFPFeatures() const { 3142 assert(hasStoredFPFeatures()); 3143 return *getTrailingFPFeatures(); 3144 } 3145 /// Set FPOptionsOverride in trailing storage. Used only by Serialization. 3146 void setStoredFPFeatures(FPOptionsOverride F) { 3147 assert(hasStoredFPFeatures()); 3148 *getTrailingFPFeatures() = F; 3149 } 3150 3151 /// Get the store FPOptionsOverride or default if not stored. 3152 FPOptionsOverride getStoredFPFeaturesOrDefault() const { 3153 return hasStoredFPFeatures() ? getStoredFPFeatures() : FPOptionsOverride(); 3154 } 3155 3156 /// Get the FP features status of this operator. Only meaningful for 3157 /// operations on floating point types. 3158 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const { 3159 if (hasStoredFPFeatures()) 3160 return getStoredFPFeatures().applyOverrides(LO); 3161 return FPOptions::defaultWithoutTrailingStorage(LO); 3162 } 3163 3164 FPOptionsOverride getFPFeatures() const { 3165 if (hasStoredFPFeatures()) 3166 return getStoredFPFeatures(); 3167 return FPOptionsOverride(); 3168 } 3169 3170 /// getBuiltinCallee - If this is a call to a builtin, return the builtin ID 3171 /// of the callee. If not, return 0. 3172 unsigned getBuiltinCallee() const; 3173 3174 /// Returns \c true if this is a call to a builtin which does not 3175 /// evaluate side-effects within its arguments. 3176 bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const; 3177 3178 /// getCallReturnType - Get the return type of the call expr. This is not 3179 /// always the type of the expr itself, if the return type is a reference 3180 /// type. 3181 QualType getCallReturnType(const ASTContext &Ctx) const; 3182 3183 /// Returns the WarnUnusedResultAttr that is either declared on the called 3184 /// function, or its return type declaration, together with a NamedDecl that 3185 /// refers to the declaration the attribute is attached onto. 3186 std::pair<const NamedDecl *, const Attr *> 3187 getUnusedResultAttr(const ASTContext &Ctx) const; 3188 3189 /// Returns true if this call expression should warn on unused results. 3190 bool hasUnusedResultAttr(const ASTContext &Ctx) const { 3191 return getUnusedResultAttr(Ctx).second != nullptr; 3192 } 3193 3194 SourceLocation getRParenLoc() const { return RParenLoc; } 3195 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 3196 3197 SourceLocation getBeginLoc() const LLVM_READONLY; 3198 SourceLocation getEndLoc() const LLVM_READONLY; 3199 3200 /// Return true if this is a call to __assume() or __builtin_assume() with 3201 /// a non-value-dependent constant parameter evaluating as false. 3202 bool isBuiltinAssumeFalse(const ASTContext &Ctx) const; 3203 3204 /// Used by Sema to implement MSVC-compatible delayed name lookup. 3205 /// (Usually Exprs themselves should set dependence). 3206 void markDependentForPostponedNameLookup() { 3207 setDependence(getDependence() | ExprDependence::TypeValueInstantiation); 3208 } 3209 3210 bool isCallToStdMove() const; 3211 3212 static bool classof(const Stmt *T) { 3213 return T->getStmtClass() >= firstCallExprConstant && 3214 T->getStmtClass() <= lastCallExprConstant; 3215 } 3216 3217 // Iterators 3218 child_range children() { 3219 return child_range(getTrailingStmts(), getTrailingStmts() + PREARGS_START + 3220 getNumPreArgs() + getNumArgs()); 3221 } 3222 3223 const_child_range children() const { 3224 return const_child_range(getTrailingStmts(), 3225 getTrailingStmts() + PREARGS_START + 3226 getNumPreArgs() + getNumArgs()); 3227 } 3228 }; 3229 3230 /// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F. 3231 /// 3232 class MemberExpr final 3233 : public Expr, 3234 private llvm::TrailingObjects<MemberExpr, NestedNameSpecifierLoc, 3235 DeclAccessPair, ASTTemplateKWAndArgsInfo, 3236 TemplateArgumentLoc> { 3237 friend class ASTReader; 3238 friend class ASTStmtReader; 3239 friend class ASTStmtWriter; 3240 friend TrailingObjects; 3241 3242 /// Base - the expression for the base pointer or structure references. In 3243 /// X.F, this is "X". 3244 Stmt *Base; 3245 3246 /// MemberDecl - This is the decl being referenced by the field/member name. 3247 /// In X.F, this is the decl referenced by F. 3248 ValueDecl *MemberDecl; 3249 3250 /// MemberDNLoc - Provides source/type location info for the 3251 /// declaration name embedded in MemberDecl. 3252 DeclarationNameLoc MemberDNLoc; 3253 3254 /// MemberLoc - This is the location of the member name. 3255 SourceLocation MemberLoc; 3256 3257 size_t numTrailingObjects(OverloadToken<NestedNameSpecifierLoc>) const { 3258 return hasQualifier(); 3259 } 3260 3261 size_t numTrailingObjects(OverloadToken<DeclAccessPair>) const { 3262 return hasFoundDecl(); 3263 } 3264 3265 size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const { 3266 return hasTemplateKWAndArgsInfo(); 3267 } 3268 3269 bool hasFoundDecl() const { return MemberExprBits.HasFoundDecl; } 3270 3271 bool hasTemplateKWAndArgsInfo() const { 3272 return MemberExprBits.HasTemplateKWAndArgsInfo; 3273 } 3274 3275 MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc, 3276 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, 3277 ValueDecl *MemberDecl, DeclAccessPair FoundDecl, 3278 const DeclarationNameInfo &NameInfo, 3279 const TemplateArgumentListInfo *TemplateArgs, QualType T, 3280 ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR); 3281 MemberExpr(EmptyShell Empty) 3282 : Expr(MemberExprClass, Empty), Base(), MemberDecl() {} 3283 3284 public: 3285 static MemberExpr *Create(const ASTContext &C, Expr *Base, bool IsArrow, 3286 SourceLocation OperatorLoc, 3287 NestedNameSpecifierLoc QualifierLoc, 3288 SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, 3289 DeclAccessPair FoundDecl, 3290 DeclarationNameInfo MemberNameInfo, 3291 const TemplateArgumentListInfo *TemplateArgs, 3292 QualType T, ExprValueKind VK, ExprObjectKind OK, 3293 NonOdrUseReason NOUR); 3294 3295 /// Create an implicit MemberExpr, with no location, qualifier, template 3296 /// arguments, and so on. Suitable only for non-static member access. 3297 static MemberExpr *CreateImplicit(const ASTContext &C, Expr *Base, 3298 bool IsArrow, ValueDecl *MemberDecl, 3299 QualType T, ExprValueKind VK, 3300 ExprObjectKind OK) { 3301 return Create(C, Base, IsArrow, SourceLocation(), NestedNameSpecifierLoc(), 3302 SourceLocation(), MemberDecl, 3303 DeclAccessPair::make(MemberDecl, MemberDecl->getAccess()), 3304 DeclarationNameInfo(), nullptr, T, VK, OK, NOUR_None); 3305 } 3306 3307 static MemberExpr *CreateEmpty(const ASTContext &Context, bool HasQualifier, 3308 bool HasFoundDecl, 3309 bool HasTemplateKWAndArgsInfo, 3310 unsigned NumTemplateArgs); 3311 3312 void setBase(Expr *E) { Base = E; } 3313 Expr *getBase() const { return cast<Expr>(Base); } 3314 3315 /// Retrieve the member declaration to which this expression refers. 3316 /// 3317 /// The returned declaration will be a FieldDecl or (in C++) a VarDecl (for 3318 /// static data members), a CXXMethodDecl, or an EnumConstantDecl. 3319 ValueDecl *getMemberDecl() const { return MemberDecl; } 3320 void setMemberDecl(ValueDecl *D); 3321 3322 /// Retrieves the declaration found by lookup. 3323 DeclAccessPair getFoundDecl() const { 3324 if (!hasFoundDecl()) 3325 return DeclAccessPair::make(getMemberDecl(), 3326 getMemberDecl()->getAccess()); 3327 return *getTrailingObjects<DeclAccessPair>(); 3328 } 3329 3330 /// Determines whether this member expression actually had 3331 /// a C++ nested-name-specifier prior to the name of the member, e.g., 3332 /// x->Base::foo. 3333 bool hasQualifier() const { return MemberExprBits.HasQualifier; } 3334 3335 /// If the member name was qualified, retrieves the 3336 /// nested-name-specifier that precedes the member name, with source-location 3337 /// information. 3338 NestedNameSpecifierLoc getQualifierLoc() const { 3339 if (!hasQualifier()) 3340 return NestedNameSpecifierLoc(); 3341 return *getTrailingObjects<NestedNameSpecifierLoc>(); 3342 } 3343 3344 /// If the member name was qualified, retrieves the 3345 /// nested-name-specifier that precedes the member name. Otherwise, returns 3346 /// NULL. 3347 NestedNameSpecifier *getQualifier() const { 3348 return getQualifierLoc().getNestedNameSpecifier(); 3349 } 3350 3351 /// Retrieve the location of the template keyword preceding 3352 /// the member name, if any. 3353 SourceLocation getTemplateKeywordLoc() const { 3354 if (!hasTemplateKWAndArgsInfo()) 3355 return SourceLocation(); 3356 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc; 3357 } 3358 3359 /// Retrieve the location of the left angle bracket starting the 3360 /// explicit template argument list following the member name, if any. 3361 SourceLocation getLAngleLoc() const { 3362 if (!hasTemplateKWAndArgsInfo()) 3363 return SourceLocation(); 3364 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc; 3365 } 3366 3367 /// Retrieve the location of the right angle bracket ending the 3368 /// explicit template argument list following the member name, if any. 3369 SourceLocation getRAngleLoc() const { 3370 if (!hasTemplateKWAndArgsInfo()) 3371 return SourceLocation(); 3372 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc; 3373 } 3374 3375 /// Determines whether the member name was preceded by the template keyword. 3376 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } 3377 3378 /// Determines whether the member name was followed by an 3379 /// explicit template argument list. 3380 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } 3381 3382 /// Copies the template arguments (if present) into the given 3383 /// structure. 3384 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 3385 if (hasExplicitTemplateArgs()) 3386 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto( 3387 getTrailingObjects<TemplateArgumentLoc>(), List); 3388 } 3389 3390 /// Retrieve the template arguments provided as part of this 3391 /// template-id. 3392 const TemplateArgumentLoc *getTemplateArgs() const { 3393 if (!hasExplicitTemplateArgs()) 3394 return nullptr; 3395 3396 return getTrailingObjects<TemplateArgumentLoc>(); 3397 } 3398 3399 /// Retrieve the number of template arguments provided as part of this 3400 /// template-id. 3401 unsigned getNumTemplateArgs() const { 3402 if (!hasExplicitTemplateArgs()) 3403 return 0; 3404 3405 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs; 3406 } 3407 3408 ArrayRef<TemplateArgumentLoc> template_arguments() const { 3409 return {getTemplateArgs(), getNumTemplateArgs()}; 3410 } 3411 3412 /// Retrieve the member declaration name info. 3413 DeclarationNameInfo getMemberNameInfo() const { 3414 return DeclarationNameInfo(MemberDecl->getDeclName(), 3415 MemberLoc, MemberDNLoc); 3416 } 3417 3418 SourceLocation getOperatorLoc() const { return MemberExprBits.OperatorLoc; } 3419 3420 bool isArrow() const { return MemberExprBits.IsArrow; } 3421 void setArrow(bool A) { MemberExprBits.IsArrow = A; } 3422 3423 /// getMemberLoc - Return the location of the "member", in X->F, it is the 3424 /// location of 'F'. 3425 SourceLocation getMemberLoc() const { return MemberLoc; } 3426 void setMemberLoc(SourceLocation L) { MemberLoc = L; } 3427 3428 SourceLocation getBeginLoc() const LLVM_READONLY; 3429 SourceLocation getEndLoc() const LLVM_READONLY; 3430 3431 SourceLocation getExprLoc() const LLVM_READONLY { return MemberLoc; } 3432 3433 /// Determine whether the base of this explicit is implicit. 3434 bool isImplicitAccess() const { 3435 return getBase() && getBase()->isImplicitCXXThis(); 3436 } 3437 3438 /// Returns true if this member expression refers to a method that 3439 /// was resolved from an overloaded set having size greater than 1. 3440 bool hadMultipleCandidates() const { 3441 return MemberExprBits.HadMultipleCandidates; 3442 } 3443 /// Sets the flag telling whether this expression refers to 3444 /// a method that was resolved from an overloaded set having size 3445 /// greater than 1. 3446 void setHadMultipleCandidates(bool V = true) { 3447 MemberExprBits.HadMultipleCandidates = V; 3448 } 3449 3450 /// Returns true if virtual dispatch is performed. 3451 /// If the member access is fully qualified, (i.e. X::f()), virtual 3452 /// dispatching is not performed. In -fapple-kext mode qualified 3453 /// calls to virtual method will still go through the vtable. 3454 bool performsVirtualDispatch(const LangOptions &LO) const { 3455 return LO.AppleKext || !hasQualifier(); 3456 } 3457 3458 /// Is this expression a non-odr-use reference, and if so, why? 3459 /// This is only meaningful if the named member is a static member. 3460 NonOdrUseReason isNonOdrUse() const { 3461 return static_cast<NonOdrUseReason>(MemberExprBits.NonOdrUseReason); 3462 } 3463 3464 static bool classof(const Stmt *T) { 3465 return T->getStmtClass() == MemberExprClass; 3466 } 3467 3468 // Iterators 3469 child_range children() { return child_range(&Base, &Base+1); } 3470 const_child_range children() const { 3471 return const_child_range(&Base, &Base + 1); 3472 } 3473 }; 3474 3475 /// CompoundLiteralExpr - [C99 6.5.2.5] 3476 /// 3477 class CompoundLiteralExpr : public Expr { 3478 /// LParenLoc - If non-null, this is the location of the left paren in a 3479 /// compound literal like "(int){4}". This can be null if this is a 3480 /// synthesized compound expression. 3481 SourceLocation LParenLoc; 3482 3483 /// The type as written. This can be an incomplete array type, in 3484 /// which case the actual expression type will be different. 3485 /// The int part of the pair stores whether this expr is file scope. 3486 llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfoAndScope; 3487 Stmt *Init; 3488 public: 3489 CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo, 3490 QualType T, ExprValueKind VK, Expr *init, bool fileScope) 3491 : Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary), 3492 LParenLoc(lparenloc), TInfoAndScope(tinfo, fileScope), Init(init) { 3493 setDependence(computeDependence(this)); 3494 } 3495 3496 /// Construct an empty compound literal. 3497 explicit CompoundLiteralExpr(EmptyShell Empty) 3498 : Expr(CompoundLiteralExprClass, Empty) { } 3499 3500 const Expr *getInitializer() const { return cast<Expr>(Init); } 3501 Expr *getInitializer() { return cast<Expr>(Init); } 3502 void setInitializer(Expr *E) { Init = E; } 3503 3504 bool isFileScope() const { return TInfoAndScope.getInt(); } 3505 void setFileScope(bool FS) { TInfoAndScope.setInt(FS); } 3506 3507 SourceLocation getLParenLoc() const { return LParenLoc; } 3508 void setLParenLoc(SourceLocation L) { LParenLoc = L; } 3509 3510 TypeSourceInfo *getTypeSourceInfo() const { 3511 return TInfoAndScope.getPointer(); 3512 } 3513 void setTypeSourceInfo(TypeSourceInfo *tinfo) { 3514 TInfoAndScope.setPointer(tinfo); 3515 } 3516 3517 SourceLocation getBeginLoc() const LLVM_READONLY { 3518 // FIXME: Init should never be null. 3519 if (!Init) 3520 return SourceLocation(); 3521 if (LParenLoc.isInvalid()) 3522 return Init->getBeginLoc(); 3523 return LParenLoc; 3524 } 3525 SourceLocation getEndLoc() const LLVM_READONLY { 3526 // FIXME: Init should never be null. 3527 if (!Init) 3528 return SourceLocation(); 3529 return Init->getEndLoc(); 3530 } 3531 3532 static bool classof(const Stmt *T) { 3533 return T->getStmtClass() == CompoundLiteralExprClass; 3534 } 3535 3536 // Iterators 3537 child_range children() { return child_range(&Init, &Init+1); } 3538 const_child_range children() const { 3539 return const_child_range(&Init, &Init + 1); 3540 } 3541 }; 3542 3543 /// CastExpr - Base class for type casts, including both implicit 3544 /// casts (ImplicitCastExpr) and explicit casts that have some 3545 /// representation in the source code (ExplicitCastExpr's derived 3546 /// classes). 3547 class CastExpr : public Expr { 3548 Stmt *Op; 3549 3550 bool CastConsistency() const; 3551 3552 const CXXBaseSpecifier * const *path_buffer() const { 3553 return const_cast<CastExpr*>(this)->path_buffer(); 3554 } 3555 CXXBaseSpecifier **path_buffer(); 3556 3557 friend class ASTStmtReader; 3558 3559 protected: 3560 CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind, 3561 Expr *op, unsigned BasePathSize, bool HasFPFeatures) 3562 : Expr(SC, ty, VK, OK_Ordinary), Op(op) { 3563 CastExprBits.Kind = kind; 3564 CastExprBits.PartOfExplicitCast = false; 3565 CastExprBits.BasePathSize = BasePathSize; 3566 assert((CastExprBits.BasePathSize == BasePathSize) && 3567 "BasePathSize overflow!"); 3568 assert(CastConsistency()); 3569 CastExprBits.HasFPFeatures = HasFPFeatures; 3570 } 3571 3572 /// Construct an empty cast. 3573 CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize, 3574 bool HasFPFeatures) 3575 : Expr(SC, Empty) { 3576 CastExprBits.PartOfExplicitCast = false; 3577 CastExprBits.BasePathSize = BasePathSize; 3578 CastExprBits.HasFPFeatures = HasFPFeatures; 3579 assert((CastExprBits.BasePathSize == BasePathSize) && 3580 "BasePathSize overflow!"); 3581 } 3582 3583 /// Return a pointer to the trailing FPOptions. 3584 /// \pre hasStoredFPFeatures() == true 3585 FPOptionsOverride *getTrailingFPFeatures(); 3586 const FPOptionsOverride *getTrailingFPFeatures() const { 3587 return const_cast<CastExpr *>(this)->getTrailingFPFeatures(); 3588 } 3589 3590 public: 3591 CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; } 3592 void setCastKind(CastKind K) { CastExprBits.Kind = K; } 3593 3594 static const char *getCastKindName(CastKind CK); 3595 const char *getCastKindName() const { return getCastKindName(getCastKind()); } 3596 3597 Expr *getSubExpr() { return cast<Expr>(Op); } 3598 const Expr *getSubExpr() const { return cast<Expr>(Op); } 3599 void setSubExpr(Expr *E) { Op = E; } 3600 3601 /// Retrieve the cast subexpression as it was written in the source 3602 /// code, looking through any implicit casts or other intermediate nodes 3603 /// introduced by semantic analysis. 3604 Expr *getSubExprAsWritten(); 3605 const Expr *getSubExprAsWritten() const { 3606 return const_cast<CastExpr *>(this)->getSubExprAsWritten(); 3607 } 3608 3609 /// If this cast applies a user-defined conversion, retrieve the conversion 3610 /// function that it invokes. 3611 NamedDecl *getConversionFunction() const; 3612 3613 typedef CXXBaseSpecifier **path_iterator; 3614 typedef const CXXBaseSpecifier *const *path_const_iterator; 3615 bool path_empty() const { return path_size() == 0; } 3616 unsigned path_size() const { return CastExprBits.BasePathSize; } 3617 path_iterator path_begin() { return path_buffer(); } 3618 path_iterator path_end() { return path_buffer() + path_size(); } 3619 path_const_iterator path_begin() const { return path_buffer(); } 3620 path_const_iterator path_end() const { return path_buffer() + path_size(); } 3621 3622 /// Path through the class hierarchy taken by casts between base and derived 3623 /// classes (see implementation of `CastConsistency()` for a full list of 3624 /// cast kinds that have a path). 3625 /// 3626 /// For each derived-to-base edge in the path, the path contains a 3627 /// `CXXBaseSpecifier` for the base class of that edge; the entries are 3628 /// ordered from derived class to base class. 3629 /// 3630 /// For example, given classes `Base`, `Intermediate : public Base` and 3631 /// `Derived : public Intermediate`, the path for a cast from `Derived *` to 3632 /// `Base *` contains two entries: One for `Intermediate`, and one for `Base`, 3633 /// in that order. 3634 llvm::iterator_range<path_iterator> path() { 3635 return llvm::make_range(path_begin(), path_end()); 3636 } 3637 llvm::iterator_range<path_const_iterator> path() const { 3638 return llvm::make_range(path_begin(), path_end()); 3639 } 3640 3641 const FieldDecl *getTargetUnionField() const { 3642 assert(getCastKind() == CK_ToUnion); 3643 return getTargetFieldForToUnionCast(getType(), getSubExpr()->getType()); 3644 } 3645 3646 bool hasStoredFPFeatures() const { return CastExprBits.HasFPFeatures; } 3647 3648 /// Get FPOptionsOverride from trailing storage. 3649 FPOptionsOverride getStoredFPFeatures() const { 3650 assert(hasStoredFPFeatures()); 3651 return *getTrailingFPFeatures(); 3652 } 3653 3654 /// Get the store FPOptionsOverride or default if not stored. 3655 FPOptionsOverride getStoredFPFeaturesOrDefault() const { 3656 return hasStoredFPFeatures() ? getStoredFPFeatures() : FPOptionsOverride(); 3657 } 3658 3659 /// Get the FP features status of this operation. Only meaningful for 3660 /// operations on floating point types. 3661 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const { 3662 if (hasStoredFPFeatures()) 3663 return getStoredFPFeatures().applyOverrides(LO); 3664 return FPOptions::defaultWithoutTrailingStorage(LO); 3665 } 3666 3667 FPOptionsOverride getFPFeatures() const { 3668 if (hasStoredFPFeatures()) 3669 return getStoredFPFeatures(); 3670 return FPOptionsOverride(); 3671 } 3672 3673 /// Return 3674 // True : if this conversion changes the volatile-ness of a gl-value. 3675 // Qualification conversions on gl-values currently use CK_NoOp, but 3676 // it's important to recognize volatile-changing conversions in 3677 // clients code generation that normally eagerly peephole loads. Note 3678 // that the query is answering for this specific node; Sema may 3679 // produce multiple cast nodes for any particular conversion sequence. 3680 // False : Otherwise. 3681 bool changesVolatileQualification() const { 3682 return (isGLValue() && (getType().isVolatileQualified() != 3683 getSubExpr()->getType().isVolatileQualified())); 3684 } 3685 3686 static const FieldDecl *getTargetFieldForToUnionCast(QualType unionType, 3687 QualType opType); 3688 static const FieldDecl *getTargetFieldForToUnionCast(const RecordDecl *RD, 3689 QualType opType); 3690 3691 static bool classof(const Stmt *T) { 3692 return T->getStmtClass() >= firstCastExprConstant && 3693 T->getStmtClass() <= lastCastExprConstant; 3694 } 3695 3696 // Iterators 3697 child_range children() { return child_range(&Op, &Op+1); } 3698 const_child_range children() const { return const_child_range(&Op, &Op + 1); } 3699 }; 3700 3701 /// ImplicitCastExpr - Allows us to explicitly represent implicit type 3702 /// conversions, which have no direct representation in the original 3703 /// source code. For example: converting T[]->T*, void f()->void 3704 /// (*f)(), float->double, short->int, etc. 3705 /// 3706 /// In C, implicit casts always produce rvalues. However, in C++, an 3707 /// implicit cast whose result is being bound to a reference will be 3708 /// an lvalue or xvalue. For example: 3709 /// 3710 /// @code 3711 /// class Base { }; 3712 /// class Derived : public Base { }; 3713 /// Derived &&ref(); 3714 /// void f(Derived d) { 3715 /// Base& b = d; // initializer is an ImplicitCastExpr 3716 /// // to an lvalue of type Base 3717 /// Base&& r = ref(); // initializer is an ImplicitCastExpr 3718 /// // to an xvalue of type Base 3719 /// } 3720 /// @endcode 3721 class ImplicitCastExpr final 3722 : public CastExpr, 3723 private llvm::TrailingObjects<ImplicitCastExpr, CXXBaseSpecifier *, 3724 FPOptionsOverride> { 3725 3726 ImplicitCastExpr(QualType ty, CastKind kind, Expr *op, 3727 unsigned BasePathLength, FPOptionsOverride FPO, 3728 ExprValueKind VK) 3729 : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength, 3730 FPO.requiresTrailingStorage()) { 3731 setDependence(computeDependence(this)); 3732 if (hasStoredFPFeatures()) 3733 *getTrailingFPFeatures() = FPO; 3734 } 3735 3736 /// Construct an empty implicit cast. 3737 explicit ImplicitCastExpr(EmptyShell Shell, unsigned PathSize, 3738 bool HasFPFeatures) 3739 : CastExpr(ImplicitCastExprClass, Shell, PathSize, HasFPFeatures) {} 3740 3741 unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const { 3742 return path_size(); 3743 } 3744 3745 public: 3746 enum OnStack_t { OnStack }; 3747 ImplicitCastExpr(OnStack_t _, QualType ty, CastKind kind, Expr *op, 3748 ExprValueKind VK, FPOptionsOverride FPO) 3749 : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0, 3750 FPO.requiresTrailingStorage()) { 3751 if (hasStoredFPFeatures()) 3752 *getTrailingFPFeatures() = FPO; 3753 } 3754 3755 bool isPartOfExplicitCast() const { return CastExprBits.PartOfExplicitCast; } 3756 void setIsPartOfExplicitCast(bool PartOfExplicitCast) { 3757 CastExprBits.PartOfExplicitCast = PartOfExplicitCast; 3758 } 3759 3760 static ImplicitCastExpr *Create(const ASTContext &Context, QualType T, 3761 CastKind Kind, Expr *Operand, 3762 const CXXCastPath *BasePath, 3763 ExprValueKind Cat, FPOptionsOverride FPO); 3764 3765 static ImplicitCastExpr *CreateEmpty(const ASTContext &Context, 3766 unsigned PathSize, bool HasFPFeatures); 3767 3768 SourceLocation getBeginLoc() const LLVM_READONLY { 3769 return getSubExpr()->getBeginLoc(); 3770 } 3771 SourceLocation getEndLoc() const LLVM_READONLY { 3772 return getSubExpr()->getEndLoc(); 3773 } 3774 3775 static bool classof(const Stmt *T) { 3776 return T->getStmtClass() == ImplicitCastExprClass; 3777 } 3778 3779 friend TrailingObjects; 3780 friend class CastExpr; 3781 }; 3782 3783 /// ExplicitCastExpr - An explicit cast written in the source 3784 /// code. 3785 /// 3786 /// This class is effectively an abstract class, because it provides 3787 /// the basic representation of an explicitly-written cast without 3788 /// specifying which kind of cast (C cast, functional cast, static 3789 /// cast, etc.) was written; specific derived classes represent the 3790 /// particular style of cast and its location information. 3791 /// 3792 /// Unlike implicit casts, explicit cast nodes have two different 3793 /// types: the type that was written into the source code, and the 3794 /// actual type of the expression as determined by semantic 3795 /// analysis. These types may differ slightly. For example, in C++ one 3796 /// can cast to a reference type, which indicates that the resulting 3797 /// expression will be an lvalue or xvalue. The reference type, however, 3798 /// will not be used as the type of the expression. 3799 class ExplicitCastExpr : public CastExpr { 3800 /// TInfo - Source type info for the (written) type 3801 /// this expression is casting to. 3802 TypeSourceInfo *TInfo; 3803 3804 protected: 3805 ExplicitCastExpr(StmtClass SC, QualType exprTy, ExprValueKind VK, 3806 CastKind kind, Expr *op, unsigned PathSize, 3807 bool HasFPFeatures, TypeSourceInfo *writtenTy) 3808 : CastExpr(SC, exprTy, VK, kind, op, PathSize, HasFPFeatures), 3809 TInfo(writtenTy) { 3810 setDependence(computeDependence(this)); 3811 } 3812 3813 /// Construct an empty explicit cast. 3814 ExplicitCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize, 3815 bool HasFPFeatures) 3816 : CastExpr(SC, Shell, PathSize, HasFPFeatures) {} 3817 3818 public: 3819 /// getTypeInfoAsWritten - Returns the type source info for the type 3820 /// that this expression is casting to. 3821 TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; } 3822 void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; } 3823 3824 /// getTypeAsWritten - Returns the type that this expression is 3825 /// casting to, as written in the source code. 3826 QualType getTypeAsWritten() const { return TInfo->getType(); } 3827 3828 static bool classof(const Stmt *T) { 3829 return T->getStmtClass() >= firstExplicitCastExprConstant && 3830 T->getStmtClass() <= lastExplicitCastExprConstant; 3831 } 3832 }; 3833 3834 /// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style 3835 /// cast in C++ (C++ [expr.cast]), which uses the syntax 3836 /// (Type)expr. For example: @c (int)f. 3837 class CStyleCastExpr final 3838 : public ExplicitCastExpr, 3839 private llvm::TrailingObjects<CStyleCastExpr, CXXBaseSpecifier *, 3840 FPOptionsOverride> { 3841 SourceLocation LPLoc; // the location of the left paren 3842 SourceLocation RPLoc; // the location of the right paren 3843 3844 CStyleCastExpr(QualType exprTy, ExprValueKind vk, CastKind kind, Expr *op, 3845 unsigned PathSize, FPOptionsOverride FPO, 3846 TypeSourceInfo *writtenTy, SourceLocation l, SourceLocation r) 3847 : ExplicitCastExpr(CStyleCastExprClass, exprTy, vk, kind, op, PathSize, 3848 FPO.requiresTrailingStorage(), writtenTy), 3849 LPLoc(l), RPLoc(r) { 3850 if (hasStoredFPFeatures()) 3851 *getTrailingFPFeatures() = FPO; 3852 } 3853 3854 /// Construct an empty C-style explicit cast. 3855 explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize, 3856 bool HasFPFeatures) 3857 : ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize, HasFPFeatures) {} 3858 3859 unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>) const { 3860 return path_size(); 3861 } 3862 3863 public: 3864 static CStyleCastExpr * 3865 Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, 3866 Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, 3867 TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R); 3868 3869 static CStyleCastExpr *CreateEmpty(const ASTContext &Context, 3870 unsigned PathSize, bool HasFPFeatures); 3871 3872 SourceLocation getLParenLoc() const { return LPLoc; } 3873 void setLParenLoc(SourceLocation L) { LPLoc = L; } 3874 3875 SourceLocation getRParenLoc() const { return RPLoc; } 3876 void setRParenLoc(SourceLocation L) { RPLoc = L; } 3877 3878 SourceLocation getBeginLoc() const LLVM_READONLY { return LPLoc; } 3879 SourceLocation getEndLoc() const LLVM_READONLY { 3880 return getSubExpr()->getEndLoc(); 3881 } 3882 3883 static bool classof(const Stmt *T) { 3884 return T->getStmtClass() == CStyleCastExprClass; 3885 } 3886 3887 friend TrailingObjects; 3888 friend class CastExpr; 3889 }; 3890 3891 /// A builtin binary operation expression such as "x + y" or "x <= y". 3892 /// 3893 /// This expression node kind describes a builtin binary operation, 3894 /// such as "x + y" for integer values "x" and "y". The operands will 3895 /// already have been converted to appropriate types (e.g., by 3896 /// performing promotions or conversions). 3897 /// 3898 /// In C++, where operators may be overloaded, a different kind of 3899 /// expression node (CXXOperatorCallExpr) is used to express the 3900 /// invocation of an overloaded operator with operator syntax. Within 3901 /// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is 3902 /// used to store an expression "x + y" depends on the subexpressions 3903 /// for x and y. If neither x or y is type-dependent, and the "+" 3904 /// operator resolves to a built-in operation, BinaryOperator will be 3905 /// used to express the computation (x and y may still be 3906 /// value-dependent). If either x or y is type-dependent, or if the 3907 /// "+" resolves to an overloaded operator, CXXOperatorCallExpr will 3908 /// be used to express the computation. 3909 class BinaryOperator : public Expr { 3910 enum { LHS, RHS, END_EXPR }; 3911 Stmt *SubExprs[END_EXPR]; 3912 3913 public: 3914 typedef BinaryOperatorKind Opcode; 3915 3916 protected: 3917 size_t offsetOfTrailingStorage() const; 3918 3919 /// Return a pointer to the trailing FPOptions 3920 FPOptionsOverride *getTrailingFPFeatures() { 3921 assert(BinaryOperatorBits.HasFPFeatures); 3922 return reinterpret_cast<FPOptionsOverride *>( 3923 reinterpret_cast<char *>(this) + offsetOfTrailingStorage()); 3924 } 3925 const FPOptionsOverride *getTrailingFPFeatures() const { 3926 assert(BinaryOperatorBits.HasFPFeatures); 3927 return reinterpret_cast<const FPOptionsOverride *>( 3928 reinterpret_cast<const char *>(this) + offsetOfTrailingStorage()); 3929 } 3930 3931 /// Build a binary operator, assuming that appropriate storage has been 3932 /// allocated for the trailing objects when needed. 3933 BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc, 3934 QualType ResTy, ExprValueKind VK, ExprObjectKind OK, 3935 SourceLocation opLoc, FPOptionsOverride FPFeatures); 3936 3937 /// Construct an empty binary operator. 3938 explicit BinaryOperator(EmptyShell Empty) : Expr(BinaryOperatorClass, Empty) { 3939 BinaryOperatorBits.Opc = BO_Comma; 3940 BinaryOperatorBits.ExcludedOverflowPattern = false; 3941 } 3942 3943 public: 3944 static BinaryOperator *CreateEmpty(const ASTContext &C, bool hasFPFeatures); 3945 3946 static BinaryOperator *Create(const ASTContext &C, Expr *lhs, Expr *rhs, 3947 Opcode opc, QualType ResTy, ExprValueKind VK, 3948 ExprObjectKind OK, SourceLocation opLoc, 3949 FPOptionsOverride FPFeatures); 3950 SourceLocation getExprLoc() const { return getOperatorLoc(); } 3951 SourceLocation getOperatorLoc() const { return BinaryOperatorBits.OpLoc; } 3952 void setOperatorLoc(SourceLocation L) { BinaryOperatorBits.OpLoc = L; } 3953 3954 Opcode getOpcode() const { 3955 return static_cast<Opcode>(BinaryOperatorBits.Opc); 3956 } 3957 void setOpcode(Opcode Opc) { BinaryOperatorBits.Opc = Opc; } 3958 3959 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 3960 void setLHS(Expr *E) { SubExprs[LHS] = E; } 3961 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 3962 void setRHS(Expr *E) { SubExprs[RHS] = E; } 3963 3964 SourceLocation getBeginLoc() const LLVM_READONLY { 3965 return getLHS()->getBeginLoc(); 3966 } 3967 SourceLocation getEndLoc() const LLVM_READONLY { 3968 return getRHS()->getEndLoc(); 3969 } 3970 3971 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 3972 /// corresponds to, e.g. "<<=". 3973 static StringRef getOpcodeStr(Opcode Op); 3974 3975 StringRef getOpcodeStr() const { return getOpcodeStr(getOpcode()); } 3976 3977 /// Retrieve the binary opcode that corresponds to the given 3978 /// overloaded operator. 3979 static Opcode getOverloadedOpcode(OverloadedOperatorKind OO); 3980 3981 /// Retrieve the overloaded operator kind that corresponds to 3982 /// the given binary opcode. 3983 static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); 3984 3985 /// predicates to categorize the respective opcodes. 3986 static bool isPtrMemOp(Opcode Opc) { 3987 return Opc == BO_PtrMemD || Opc == BO_PtrMemI; 3988 } 3989 bool isPtrMemOp() const { return isPtrMemOp(getOpcode()); } 3990 3991 static bool isMultiplicativeOp(Opcode Opc) { 3992 return Opc >= BO_Mul && Opc <= BO_Rem; 3993 } 3994 bool isMultiplicativeOp() const { return isMultiplicativeOp(getOpcode()); } 3995 static bool isAdditiveOp(Opcode Opc) { return Opc == BO_Add || Opc==BO_Sub; } 3996 bool isAdditiveOp() const { return isAdditiveOp(getOpcode()); } 3997 static bool isShiftOp(Opcode Opc) { return Opc == BO_Shl || Opc == BO_Shr; } 3998 bool isShiftOp() const { return isShiftOp(getOpcode()); } 3999 4000 static bool isBitwiseOp(Opcode Opc) { return Opc >= BO_And && Opc <= BO_Or; } 4001 bool isBitwiseOp() const { return isBitwiseOp(getOpcode()); } 4002 4003 static bool isRelationalOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_GE; } 4004 bool isRelationalOp() const { return isRelationalOp(getOpcode()); } 4005 4006 static bool isEqualityOp(Opcode Opc) { return Opc == BO_EQ || Opc == BO_NE; } 4007 bool isEqualityOp() const { return isEqualityOp(getOpcode()); } 4008 4009 static bool isComparisonOp(Opcode Opc) { return Opc >= BO_Cmp && Opc<=BO_NE; } 4010 bool isComparisonOp() const { return isComparisonOp(getOpcode()); } 4011 4012 static bool isCommaOp(Opcode Opc) { return Opc == BO_Comma; } 4013 bool isCommaOp() const { return isCommaOp(getOpcode()); } 4014 4015 static Opcode negateComparisonOp(Opcode Opc) { 4016 switch (Opc) { 4017 default: 4018 llvm_unreachable("Not a comparison operator."); 4019 case BO_LT: return BO_GE; 4020 case BO_GT: return BO_LE; 4021 case BO_LE: return BO_GT; 4022 case BO_GE: return BO_LT; 4023 case BO_EQ: return BO_NE; 4024 case BO_NE: return BO_EQ; 4025 } 4026 } 4027 4028 static Opcode reverseComparisonOp(Opcode Opc) { 4029 switch (Opc) { 4030 default: 4031 llvm_unreachable("Not a comparison operator."); 4032 case BO_LT: return BO_GT; 4033 case BO_GT: return BO_LT; 4034 case BO_LE: return BO_GE; 4035 case BO_GE: return BO_LE; 4036 case BO_EQ: 4037 case BO_NE: 4038 return Opc; 4039 } 4040 } 4041 4042 static bool isLogicalOp(Opcode Opc) { return Opc == BO_LAnd || Opc==BO_LOr; } 4043 bool isLogicalOp() const { return isLogicalOp(getOpcode()); } 4044 4045 static bool isAssignmentOp(Opcode Opc) { 4046 return Opc >= BO_Assign && Opc <= BO_OrAssign; 4047 } 4048 bool isAssignmentOp() const { return isAssignmentOp(getOpcode()); } 4049 4050 static bool isCompoundAssignmentOp(Opcode Opc) { 4051 return Opc > BO_Assign && Opc <= BO_OrAssign; 4052 } 4053 bool isCompoundAssignmentOp() const { 4054 return isCompoundAssignmentOp(getOpcode()); 4055 } 4056 static Opcode getOpForCompoundAssignment(Opcode Opc) { 4057 assert(isCompoundAssignmentOp(Opc)); 4058 if (Opc >= BO_AndAssign) 4059 return Opcode(unsigned(Opc) - BO_AndAssign + BO_And); 4060 else 4061 return Opcode(unsigned(Opc) - BO_MulAssign + BO_Mul); 4062 } 4063 4064 static bool isShiftAssignOp(Opcode Opc) { 4065 return Opc == BO_ShlAssign || Opc == BO_ShrAssign; 4066 } 4067 bool isShiftAssignOp() const { 4068 return isShiftAssignOp(getOpcode()); 4069 } 4070 4071 /// Return true if a binary operator using the specified opcode and operands 4072 /// would match the 'p = (i8*)nullptr + n' idiom for casting a pointer-sized 4073 /// integer to a pointer. 4074 static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc, 4075 const Expr *LHS, 4076 const Expr *RHS); 4077 4078 static bool classof(const Stmt *S) { 4079 return S->getStmtClass() >= firstBinaryOperatorConstant && 4080 S->getStmtClass() <= lastBinaryOperatorConstant; 4081 } 4082 4083 // Iterators 4084 child_range children() { 4085 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 4086 } 4087 const_child_range children() const { 4088 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); 4089 } 4090 4091 /// Set and fetch the bit that shows whether FPFeatures needs to be 4092 /// allocated in Trailing Storage 4093 void setHasStoredFPFeatures(bool B) { BinaryOperatorBits.HasFPFeatures = B; } 4094 bool hasStoredFPFeatures() const { return BinaryOperatorBits.HasFPFeatures; } 4095 4096 /// Set and get the bit that informs arithmetic overflow sanitizers whether 4097 /// or not they should exclude certain BinaryOperators from instrumentation 4098 void setExcludedOverflowPattern(bool B) { 4099 BinaryOperatorBits.ExcludedOverflowPattern = B; 4100 } 4101 bool hasExcludedOverflowPattern() const { 4102 return BinaryOperatorBits.ExcludedOverflowPattern; 4103 } 4104 4105 /// Get FPFeatures from trailing storage 4106 FPOptionsOverride getStoredFPFeatures() const { 4107 assert(hasStoredFPFeatures()); 4108 return *getTrailingFPFeatures(); 4109 } 4110 /// Set FPFeatures in trailing storage, used only by Serialization 4111 void setStoredFPFeatures(FPOptionsOverride F) { 4112 assert(BinaryOperatorBits.HasFPFeatures); 4113 *getTrailingFPFeatures() = F; 4114 } 4115 /// Get the store FPOptionsOverride or default if not stored. 4116 FPOptionsOverride getStoredFPFeaturesOrDefault() const { 4117 return hasStoredFPFeatures() ? getStoredFPFeatures() : FPOptionsOverride(); 4118 } 4119 4120 /// Get the FP features status of this operator. Only meaningful for 4121 /// operations on floating point types. 4122 FPOptions getFPFeaturesInEffect(const LangOptions &LO) const { 4123 if (BinaryOperatorBits.HasFPFeatures) 4124 return getStoredFPFeatures().applyOverrides(LO); 4125 return FPOptions::defaultWithoutTrailingStorage(LO); 4126 } 4127 4128 // This is used in ASTImporter 4129 FPOptionsOverride getFPFeatures() const { 4130 if (BinaryOperatorBits.HasFPFeatures) 4131 return getStoredFPFeatures(); 4132 return FPOptionsOverride(); 4133 } 4134 4135 /// Get the FP contractibility status of this operator. Only meaningful for 4136 /// operations on floating point types. 4137 bool isFPContractableWithinStatement(const LangOptions &LO) const { 4138 return getFPFeaturesInEffect(LO).allowFPContractWithinStatement(); 4139 } 4140 4141 /// Get the FENV_ACCESS status of this operator. Only meaningful for 4142 /// operations on floating point types. 4143 bool isFEnvAccessOn(const LangOptions &LO) const { 4144 return getFPFeaturesInEffect(LO).getAllowFEnvAccess(); 4145 } 4146 4147 protected: 4148 BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc, 4149 QualType ResTy, ExprValueKind VK, ExprObjectKind OK, 4150 SourceLocation opLoc, FPOptionsOverride FPFeatures, 4151 bool dead2); 4152 4153 /// Construct an empty BinaryOperator, SC is CompoundAssignOperator. 4154 BinaryOperator(StmtClass SC, EmptyShell Empty) : Expr(SC, Empty) { 4155 BinaryOperatorBits.Opc = BO_MulAssign; 4156 } 4157 4158 /// Return the size in bytes needed for the trailing objects. 4159 /// Used to allocate the right amount of storage. 4160 static unsigned sizeOfTrailingObjects(bool HasFPFeatures) { 4161 return HasFPFeatures * sizeof(FPOptionsOverride); 4162 } 4163 }; 4164 4165 /// CompoundAssignOperator - For compound assignments (e.g. +=), we keep 4166 /// track of the type the operation is performed in. Due to the semantics of 4167 /// these operators, the operands are promoted, the arithmetic performed, an 4168 /// implicit conversion back to the result type done, then the assignment takes 4169 /// place. This captures the intermediate type which the computation is done 4170 /// in. 4171 class CompoundAssignOperator : public BinaryOperator { 4172 QualType ComputationLHSType; 4173 QualType ComputationResultType; 4174 4175 /// Construct an empty CompoundAssignOperator. 4176 explicit CompoundAssignOperator(const ASTContext &C, EmptyShell Empty, 4177 bool hasFPFeatures) 4178 : BinaryOperator(CompoundAssignOperatorClass, Empty) {} 4179 4180 protected: 4181 CompoundAssignOperator(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, 4182 QualType ResType, ExprValueKind VK, ExprObjectKind OK, 4183 SourceLocation OpLoc, FPOptionsOverride FPFeatures, 4184 QualType CompLHSType, QualType CompResultType) 4185 : BinaryOperator(C, lhs, rhs, opc, ResType, VK, OK, OpLoc, FPFeatures, 4186 true), 4187 ComputationLHSType(CompLHSType), ComputationResultType(CompResultType) { 4188 assert(isCompoundAssignmentOp() && 4189 "Only should be used for compound assignments"); 4190 } 4191 4192 public: 4193 static CompoundAssignOperator *CreateEmpty(const ASTContext &C, 4194 bool hasFPFeatures); 4195 4196 static CompoundAssignOperator * 4197 Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 4198 ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, 4199 FPOptionsOverride FPFeatures, QualType CompLHSType = QualType(), 4200 QualType CompResultType = QualType()); 4201 4202 // The two computation types are the type the LHS is converted 4203 // to for the computation and the type of the result; the two are 4204 // distinct in a few cases (specifically, int+=ptr and ptr-=ptr). 4205 QualType getComputationLHSType() const { return ComputationLHSType; } 4206 void setComputationLHSType(QualType T) { ComputationLHSType = T; } 4207 4208 QualType getComputationResultType() const { return ComputationResultType; } 4209 void setComputationResultType(QualType T) { ComputationResultType = T; } 4210 4211 static bool classof(const Stmt *S) { 4212 return S->getStmtClass() == CompoundAssignOperatorClass; 4213 } 4214 }; 4215 4216 inline size_t BinaryOperator::offsetOfTrailingStorage() const { 4217 assert(BinaryOperatorBits.HasFPFeatures); 4218 return isa<CompoundAssignOperator>(this) ? sizeof(CompoundAssignOperator) 4219 : sizeof(BinaryOperator); 4220 } 4221 4222 /// AbstractConditionalOperator - An abstract base class for 4223 /// ConditionalOperator and BinaryConditionalOperator. 4224 class AbstractConditionalOperator : public Expr { 4225 SourceLocation QuestionLoc, ColonLoc; 4226 friend class ASTStmtReader; 4227 4228 protected: 4229 AbstractConditionalOperator(StmtClass SC, QualType T, ExprValueKind VK, 4230 ExprObjectKind OK, SourceLocation qloc, 4231 SourceLocation cloc) 4232 : Expr(SC, T, VK, OK), QuestionLoc(qloc), ColonLoc(cloc) {} 4233 4234 AbstractConditionalOperator(StmtClass SC, EmptyShell Empty) 4235 : Expr(SC, Empty) { } 4236 4237 public: 4238 /// getCond - Return the expression representing the condition for 4239 /// the ?: operator. 4240 Expr *getCond() const; 4241 4242 /// getTrueExpr - Return the subexpression representing the value of 4243 /// the expression if the condition evaluates to true. 4244 Expr *getTrueExpr() const; 4245 4246 /// getFalseExpr - Return the subexpression representing the value of 4247 /// the expression if the condition evaluates to false. This is 4248 /// the same as getRHS. 4249 Expr *getFalseExpr() const; 4250 4251 SourceLocation getQuestionLoc() const { return QuestionLoc; } 4252 SourceLocation getColonLoc() const { return ColonLoc; } 4253 4254 static bool classof(const Stmt *T) { 4255 return T->getStmtClass() == ConditionalOperatorClass || 4256 T->getStmtClass() == BinaryConditionalOperatorClass; 4257 } 4258 }; 4259 4260 /// ConditionalOperator - The ?: ternary operator. The GNU "missing 4261 /// middle" extension is a BinaryConditionalOperator. 4262 class ConditionalOperator : public AbstractConditionalOperator { 4263 enum { COND, LHS, RHS, END_EXPR }; 4264 Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 4265 4266 friend class ASTStmtReader; 4267 public: 4268 ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs, 4269 SourceLocation CLoc, Expr *rhs, QualType t, 4270 ExprValueKind VK, ExprObjectKind OK) 4271 : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK, QLoc, 4272 CLoc) { 4273 SubExprs[COND] = cond; 4274 SubExprs[LHS] = lhs; 4275 SubExprs[RHS] = rhs; 4276 setDependence(computeDependence(this)); 4277 } 4278 4279 /// Build an empty conditional operator. 4280 explicit ConditionalOperator(EmptyShell Empty) 4281 : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { } 4282 4283 /// getCond - Return the expression representing the condition for 4284 /// the ?: operator. 4285 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 4286 4287 /// getTrueExpr - Return the subexpression representing the value of 4288 /// the expression if the condition evaluates to true. 4289 Expr *getTrueExpr() const { return cast<Expr>(SubExprs[LHS]); } 4290 4291 /// getFalseExpr - Return the subexpression representing the value of 4292 /// the expression if the condition evaluates to false. This is 4293 /// the same as getRHS. 4294 Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); } 4295 4296 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 4297 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 4298 4299 SourceLocation getBeginLoc() const LLVM_READONLY { 4300 return getCond()->getBeginLoc(); 4301 } 4302 SourceLocation getEndLoc() const LLVM_READONLY { 4303 return getRHS()->getEndLoc(); 4304 } 4305 4306 static bool classof(const Stmt *T) { 4307 return T->getStmtClass() == ConditionalOperatorClass; 4308 } 4309 4310 // Iterators 4311 child_range children() { 4312 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 4313 } 4314 const_child_range children() const { 4315 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); 4316 } 4317 }; 4318 4319 /// BinaryConditionalOperator - The GNU extension to the conditional 4320 /// operator which allows the middle operand to be omitted. 4321 /// 4322 /// This is a different expression kind on the assumption that almost 4323 /// every client ends up needing to know that these are different. 4324 class BinaryConditionalOperator : public AbstractConditionalOperator { 4325 enum { COMMON, COND, LHS, RHS, NUM_SUBEXPRS }; 4326 4327 /// - the common condition/left-hand-side expression, which will be 4328 /// evaluated as the opaque value 4329 /// - the condition, expressed in terms of the opaque value 4330 /// - the left-hand-side, expressed in terms of the opaque value 4331 /// - the right-hand-side 4332 Stmt *SubExprs[NUM_SUBEXPRS]; 4333 OpaqueValueExpr *OpaqueValue; 4334 4335 friend class ASTStmtReader; 4336 public: 4337 BinaryConditionalOperator(Expr *common, OpaqueValueExpr *opaqueValue, 4338 Expr *cond, Expr *lhs, Expr *rhs, 4339 SourceLocation qloc, SourceLocation cloc, 4340 QualType t, ExprValueKind VK, ExprObjectKind OK) 4341 : AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK, 4342 qloc, cloc), 4343 OpaqueValue(opaqueValue) { 4344 SubExprs[COMMON] = common; 4345 SubExprs[COND] = cond; 4346 SubExprs[LHS] = lhs; 4347 SubExprs[RHS] = rhs; 4348 assert(OpaqueValue->getSourceExpr() == common && "Wrong opaque value"); 4349 setDependence(computeDependence(this)); 4350 } 4351 4352 /// Build an empty conditional operator. 4353 explicit BinaryConditionalOperator(EmptyShell Empty) 4354 : AbstractConditionalOperator(BinaryConditionalOperatorClass, Empty) { } 4355 4356 /// getCommon - Return the common expression, written to the 4357 /// left of the condition. The opaque value will be bound to the 4358 /// result of this expression. 4359 Expr *getCommon() const { return cast<Expr>(SubExprs[COMMON]); } 4360 4361 /// getOpaqueValue - Return the opaque value placeholder. 4362 OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; } 4363 4364 /// getCond - Return the condition expression; this is defined 4365 /// in terms of the opaque value. 4366 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 4367 4368 /// getTrueExpr - Return the subexpression which will be 4369 /// evaluated if the condition evaluates to true; this is defined 4370 /// in terms of the opaque value. 4371 Expr *getTrueExpr() const { 4372 return cast<Expr>(SubExprs[LHS]); 4373 } 4374 4375 /// getFalseExpr - Return the subexpression which will be 4376 /// evaluated if the condition evaluates to false; this is 4377 /// defined in terms of the opaque value. 4378 Expr *getFalseExpr() const { 4379 return cast<Expr>(SubExprs[RHS]); 4380 } 4381 4382 SourceLocation getBeginLoc() const LLVM_READONLY { 4383 return getCommon()->getBeginLoc(); 4384 } 4385 SourceLocation getEndLoc() const LLVM_READONLY { 4386 return getFalseExpr()->getEndLoc(); 4387 } 4388 4389 static bool classof(const Stmt *T) { 4390 return T->getStmtClass() == BinaryConditionalOperatorClass; 4391 } 4392 4393 // Iterators 4394 child_range children() { 4395 return child_range(SubExprs, SubExprs + NUM_SUBEXPRS); 4396 } 4397 const_child_range children() const { 4398 return const_child_range(SubExprs, SubExprs + NUM_SUBEXPRS); 4399 } 4400 }; 4401 4402 inline Expr *AbstractConditionalOperator::getCond() const { 4403 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 4404 return co->getCond(); 4405 return cast<BinaryConditionalOperator>(this)->getCond(); 4406 } 4407 4408 inline Expr *AbstractConditionalOperator::getTrueExpr() const { 4409 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 4410 return co->getTrueExpr(); 4411 return cast<BinaryConditionalOperator>(this)->getTrueExpr(); 4412 } 4413 4414 inline Expr *AbstractConditionalOperator::getFalseExpr() const { 4415 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 4416 return co->getFalseExpr(); 4417 return cast<BinaryConditionalOperator>(this)->getFalseExpr(); 4418 } 4419 4420 /// AddrLabelExpr - The GNU address of label extension, representing &&label. 4421 class AddrLabelExpr : public Expr { 4422 SourceLocation AmpAmpLoc, LabelLoc; 4423 LabelDecl *Label; 4424 public: 4425 AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelDecl *L, 4426 QualType t) 4427 : Expr(AddrLabelExprClass, t, VK_PRValue, OK_Ordinary), AmpAmpLoc(AALoc), 4428 LabelLoc(LLoc), Label(L) { 4429 setDependence(ExprDependence::None); 4430 } 4431 4432 /// Build an empty address of a label expression. 4433 explicit AddrLabelExpr(EmptyShell Empty) 4434 : Expr(AddrLabelExprClass, Empty) { } 4435 4436 SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; } 4437 void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; } 4438 SourceLocation getLabelLoc() const { return LabelLoc; } 4439 void setLabelLoc(SourceLocation L) { LabelLoc = L; } 4440 4441 SourceLocation getBeginLoc() const LLVM_READONLY { return AmpAmpLoc; } 4442 SourceLocation getEndLoc() const LLVM_READONLY { return LabelLoc; } 4443 4444 LabelDecl *getLabel() const { return Label; } 4445 void setLabel(LabelDecl *L) { Label = L; } 4446 4447 static bool classof(const Stmt *T) { 4448 return T->getStmtClass() == AddrLabelExprClass; 4449 } 4450 4451 // Iterators 4452 child_range children() { 4453 return child_range(child_iterator(), child_iterator()); 4454 } 4455 const_child_range children() const { 4456 return const_child_range(const_child_iterator(), const_child_iterator()); 4457 } 4458 }; 4459 4460 /// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}). 4461 /// The StmtExpr contains a single CompoundStmt node, which it evaluates and 4462 /// takes the value of the last subexpression. 4463 /// 4464 /// A StmtExpr is always an r-value; values "returned" out of a 4465 /// StmtExpr will be copied. 4466 class StmtExpr : public Expr { 4467 Stmt *SubStmt; 4468 SourceLocation LParenLoc, RParenLoc; 4469 public: 4470 StmtExpr(CompoundStmt *SubStmt, QualType T, SourceLocation LParenLoc, 4471 SourceLocation RParenLoc, unsigned TemplateDepth) 4472 : Expr(StmtExprClass, T, VK_PRValue, OK_Ordinary), SubStmt(SubStmt), 4473 LParenLoc(LParenLoc), RParenLoc(RParenLoc) { 4474 setDependence(computeDependence(this, TemplateDepth)); 4475 // FIXME: A templated statement expression should have an associated 4476 // DeclContext so that nested declarations always have a dependent context. 4477 StmtExprBits.TemplateDepth = TemplateDepth; 4478 } 4479 4480 /// Build an empty statement expression. 4481 explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { } 4482 4483 CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); } 4484 const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); } 4485 void setSubStmt(CompoundStmt *S) { SubStmt = S; } 4486 4487 SourceLocation getBeginLoc() const LLVM_READONLY { return LParenLoc; } 4488 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } 4489 4490 SourceLocation getLParenLoc() const { return LParenLoc; } 4491 void setLParenLoc(SourceLocation L) { LParenLoc = L; } 4492 SourceLocation getRParenLoc() const { return RParenLoc; } 4493 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 4494 4495 unsigned getTemplateDepth() const { return StmtExprBits.TemplateDepth; } 4496 4497 static bool classof(const Stmt *T) { 4498 return T->getStmtClass() == StmtExprClass; 4499 } 4500 4501 // Iterators 4502 child_range children() { return child_range(&SubStmt, &SubStmt+1); } 4503 const_child_range children() const { 4504 return const_child_range(&SubStmt, &SubStmt + 1); 4505 } 4506 }; 4507 4508 /// ShuffleVectorExpr - clang-specific builtin-in function 4509 /// __builtin_shufflevector. 4510 /// This AST node represents a operator that does a constant 4511 /// shuffle, similar to LLVM's shufflevector instruction. It takes 4512 /// two vectors and a variable number of constant indices, 4513 /// and returns the appropriately shuffled vector. 4514 class ShuffleVectorExpr : public Expr { 4515 SourceLocation BuiltinLoc, RParenLoc; 4516 4517 // SubExprs - the list of values passed to the __builtin_shufflevector 4518 // function. The first two are vectors, and the rest are constant 4519 // indices. The number of values in this list is always 4520 // 2+the number of indices in the vector type. 4521 Stmt **SubExprs; 4522 unsigned NumExprs; 4523 4524 public: 4525 ShuffleVectorExpr(const ASTContext &C, ArrayRef<Expr*> args, QualType Type, 4526 SourceLocation BLoc, SourceLocation RP); 4527 4528 /// Build an empty vector-shuffle expression. 4529 explicit ShuffleVectorExpr(EmptyShell Empty) 4530 : Expr(ShuffleVectorExprClass, Empty), SubExprs(nullptr) { } 4531 4532 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 4533 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 4534 4535 SourceLocation getRParenLoc() const { return RParenLoc; } 4536 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 4537 4538 SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } 4539 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } 4540 4541 static bool classof(const Stmt *T) { 4542 return T->getStmtClass() == ShuffleVectorExprClass; 4543 } 4544 4545 /// getNumSubExprs - Return the size of the SubExprs array. This includes the 4546 /// constant expression, the actual arguments passed in, and the function 4547 /// pointers. 4548 unsigned getNumSubExprs() const { return NumExprs; } 4549 4550 /// Retrieve the array of expressions. 4551 Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); } 4552 4553 /// getExpr - Return the Expr at the specified index. 4554 Expr *getExpr(unsigned Index) { 4555 assert((Index < NumExprs) && "Arg access out of range!"); 4556 return cast<Expr>(SubExprs[Index]); 4557 } 4558 const Expr *getExpr(unsigned Index) const { 4559 assert((Index < NumExprs) && "Arg access out of range!"); 4560 return cast<Expr>(SubExprs[Index]); 4561 } 4562 4563 void setExprs(const ASTContext &C, ArrayRef<Expr *> Exprs); 4564 4565 llvm::APSInt getShuffleMaskIdx(const ASTContext &Ctx, unsigned N) const { 4566 assert((N < NumExprs - 2) && "Shuffle idx out of range!"); 4567 return getExpr(N+2)->EvaluateKnownConstInt(Ctx); 4568 } 4569 4570 // Iterators 4571 child_range children() { 4572 return child_range(&SubExprs[0], &SubExprs[0]+NumExprs); 4573 } 4574 const_child_range children() const { 4575 return const_child_range(&SubExprs[0], &SubExprs[0] + NumExprs); 4576 } 4577 }; 4578 4579 /// ConvertVectorExpr - Clang builtin function __builtin_convertvector 4580 /// This AST node provides support for converting a vector type to another 4581 /// vector type of the same arity. 4582 class ConvertVectorExpr : public Expr { 4583 private: 4584 Stmt *SrcExpr; 4585 TypeSourceInfo *TInfo; 4586 SourceLocation BuiltinLoc, RParenLoc; 4587 4588 friend class ASTReader; 4589 friend class ASTStmtReader; 4590 explicit ConvertVectorExpr(EmptyShell Empty) : Expr(ConvertVectorExprClass, Empty) {} 4591 4592 public: 4593 ConvertVectorExpr(Expr *SrcExpr, TypeSourceInfo *TI, QualType DstType, 4594 ExprValueKind VK, ExprObjectKind OK, 4595 SourceLocation BuiltinLoc, SourceLocation RParenLoc) 4596 : Expr(ConvertVectorExprClass, DstType, VK, OK), SrcExpr(SrcExpr), 4597 TInfo(TI), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) { 4598 setDependence(computeDependence(this)); 4599 } 4600 4601 /// getSrcExpr - Return the Expr to be converted. 4602 Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); } 4603 4604 /// getTypeSourceInfo - Return the destination type. 4605 TypeSourceInfo *getTypeSourceInfo() const { 4606 return TInfo; 4607 } 4608 void setTypeSourceInfo(TypeSourceInfo *ti) { 4609 TInfo = ti; 4610 } 4611 4612 /// getBuiltinLoc - Return the location of the __builtin_convertvector token. 4613 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 4614 4615 /// getRParenLoc - Return the location of final right parenthesis. 4616 SourceLocation getRParenLoc() const { return RParenLoc; } 4617 4618 SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } 4619 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } 4620 4621 static bool classof(const Stmt *T) { 4622 return T->getStmtClass() == ConvertVectorExprClass; 4623 } 4624 4625 // Iterators 4626 child_range children() { return child_range(&SrcExpr, &SrcExpr+1); } 4627 const_child_range children() const { 4628 return const_child_range(&SrcExpr, &SrcExpr + 1); 4629 } 4630 }; 4631 4632 /// ChooseExpr - GNU builtin-in function __builtin_choose_expr. 4633 /// This AST node is similar to the conditional operator (?:) in C, with 4634 /// the following exceptions: 4635 /// - the test expression must be a integer constant expression. 4636 /// - the expression returned acts like the chosen subexpression in every 4637 /// visible way: the type is the same as that of the chosen subexpression, 4638 /// and all predicates (whether it's an l-value, whether it's an integer 4639 /// constant expression, etc.) return the same result as for the chosen 4640 /// sub-expression. 4641 class ChooseExpr : public Expr { 4642 enum { COND, LHS, RHS, END_EXPR }; 4643 Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 4644 SourceLocation BuiltinLoc, RParenLoc; 4645 bool CondIsTrue; 4646 public: 4647 ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, QualType t, 4648 ExprValueKind VK, ExprObjectKind OK, SourceLocation RP, 4649 bool condIsTrue) 4650 : Expr(ChooseExprClass, t, VK, OK), BuiltinLoc(BLoc), RParenLoc(RP), 4651 CondIsTrue(condIsTrue) { 4652 SubExprs[COND] = cond; 4653 SubExprs[LHS] = lhs; 4654 SubExprs[RHS] = rhs; 4655 4656 setDependence(computeDependence(this)); 4657 } 4658 4659 /// Build an empty __builtin_choose_expr. 4660 explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { } 4661 4662 /// isConditionTrue - Return whether the condition is true (i.e. not 4663 /// equal to zero). 4664 bool isConditionTrue() const { 4665 assert(!isConditionDependent() && 4666 "Dependent condition isn't true or false"); 4667 return CondIsTrue; 4668 } 4669 void setIsConditionTrue(bool isTrue) { CondIsTrue = isTrue; } 4670 4671 bool isConditionDependent() const { 4672 return getCond()->isTypeDependent() || getCond()->isValueDependent(); 4673 } 4674 4675 /// getChosenSubExpr - Return the subexpression chosen according to the 4676 /// condition. 4677 Expr *getChosenSubExpr() const { 4678 return isConditionTrue() ? getLHS() : getRHS(); 4679 } 4680 4681 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 4682 void setCond(Expr *E) { SubExprs[COND] = E; } 4683 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 4684 void setLHS(Expr *E) { SubExprs[LHS] = E; } 4685 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 4686 void setRHS(Expr *E) { SubExprs[RHS] = E; } 4687 4688 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 4689 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 4690 4691 SourceLocation getRParenLoc() const { return RParenLoc; } 4692 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 4693 4694 SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } 4695 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } 4696 4697 static bool classof(const Stmt *T) { 4698 return T->getStmtClass() == ChooseExprClass; 4699 } 4700 4701 // Iterators 4702 child_range children() { 4703 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 4704 } 4705 const_child_range children() const { 4706 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); 4707 } 4708 }; 4709 4710 /// GNUNullExpr - Implements the GNU __null extension, which is a name 4711 /// for a null pointer constant that has integral type (e.g., int or 4712 /// long) and is the same size and alignment as a pointer. The __null 4713 /// extension is typically only used by system headers, which define 4714 /// NULL as __null in C++ rather than using 0 (which is an integer 4715 /// that may not match the size of a pointer). 4716 class GNUNullExpr : public Expr { 4717 /// TokenLoc - The location of the __null keyword. 4718 SourceLocation TokenLoc; 4719 4720 public: 4721 GNUNullExpr(QualType Ty, SourceLocation Loc) 4722 : Expr(GNUNullExprClass, Ty, VK_PRValue, OK_Ordinary), TokenLoc(Loc) { 4723 setDependence(ExprDependence::None); 4724 } 4725 4726 /// Build an empty GNU __null expression. 4727 explicit GNUNullExpr(EmptyShell Empty) : Expr(GNUNullExprClass, Empty) { } 4728 4729 /// getTokenLocation - The location of the __null token. 4730 SourceLocation getTokenLocation() const { return TokenLoc; } 4731 void setTokenLocation(SourceLocation L) { TokenLoc = L; } 4732 4733 SourceLocation getBeginLoc() const LLVM_READONLY { return TokenLoc; } 4734 SourceLocation getEndLoc() const LLVM_READONLY { return TokenLoc; } 4735 4736 static bool classof(const Stmt *T) { 4737 return T->getStmtClass() == GNUNullExprClass; 4738 } 4739 4740 // Iterators 4741 child_range children() { 4742 return child_range(child_iterator(), child_iterator()); 4743 } 4744 const_child_range children() const { 4745 return const_child_range(const_child_iterator(), const_child_iterator()); 4746 } 4747 }; 4748 4749 /// Represents a call to the builtin function \c __builtin_va_arg. 4750 class VAArgExpr : public Expr { 4751 Stmt *Val; 4752 llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfo; 4753 SourceLocation BuiltinLoc, RParenLoc; 4754 public: 4755 VAArgExpr(SourceLocation BLoc, Expr *e, TypeSourceInfo *TInfo, 4756 SourceLocation RPLoc, QualType t, bool IsMS) 4757 : Expr(VAArgExprClass, t, VK_PRValue, OK_Ordinary), Val(e), 4758 TInfo(TInfo, IsMS), BuiltinLoc(BLoc), RParenLoc(RPLoc) { 4759 setDependence(computeDependence(this)); 4760 } 4761 4762 /// Create an empty __builtin_va_arg expression. 4763 explicit VAArgExpr(EmptyShell Empty) 4764 : Expr(VAArgExprClass, Empty), Val(nullptr), TInfo(nullptr, false) {} 4765 4766 const Expr *getSubExpr() const { return cast<Expr>(Val); } 4767 Expr *getSubExpr() { return cast<Expr>(Val); } 4768 void setSubExpr(Expr *E) { Val = E; } 4769 4770 /// Returns whether this is really a Win64 ABI va_arg expression. 4771 bool isMicrosoftABI() const { return TInfo.getInt(); } 4772 void setIsMicrosoftABI(bool IsMS) { TInfo.setInt(IsMS); } 4773 4774 TypeSourceInfo *getWrittenTypeInfo() const { return TInfo.getPointer(); } 4775 void setWrittenTypeInfo(TypeSourceInfo *TI) { TInfo.setPointer(TI); } 4776 4777 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 4778 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 4779 4780 SourceLocation getRParenLoc() const { return RParenLoc; } 4781 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 4782 4783 SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } 4784 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } 4785 4786 static bool classof(const Stmt *T) { 4787 return T->getStmtClass() == VAArgExprClass; 4788 } 4789 4790 // Iterators 4791 child_range children() { return child_range(&Val, &Val+1); } 4792 const_child_range children() const { 4793 return const_child_range(&Val, &Val + 1); 4794 } 4795 }; 4796 4797 enum class SourceLocIdentKind { 4798 Function, 4799 FuncSig, 4800 File, 4801 FileName, 4802 Line, 4803 Column, 4804 SourceLocStruct 4805 }; 4806 4807 /// Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), 4808 /// __builtin_FUNCTION(), __builtin_FUNCSIG(), __builtin_FILE(), 4809 /// __builtin_FILE_NAME() or __builtin_source_location(). 4810 class SourceLocExpr final : public Expr { 4811 SourceLocation BuiltinLoc, RParenLoc; 4812 DeclContext *ParentContext; 4813 4814 public: 4815 SourceLocExpr(const ASTContext &Ctx, SourceLocIdentKind Type, 4816 QualType ResultTy, SourceLocation BLoc, 4817 SourceLocation RParenLoc, DeclContext *Context); 4818 4819 /// Build an empty call expression. 4820 explicit SourceLocExpr(EmptyShell Empty) : Expr(SourceLocExprClass, Empty) {} 4821 4822 /// Return the result of evaluating this SourceLocExpr in the specified 4823 /// (and possibly null) default argument or initialization context. 4824 APValue EvaluateInContext(const ASTContext &Ctx, 4825 const Expr *DefaultExpr) const; 4826 4827 /// Return a string representing the name of the specific builtin function. 4828 StringRef getBuiltinStr() const; 4829 4830 SourceLocIdentKind getIdentKind() const { 4831 return static_cast<SourceLocIdentKind>(SourceLocExprBits.Kind); 4832 } 4833 4834 bool isIntType() const { 4835 switch (getIdentKind()) { 4836 case SourceLocIdentKind::File: 4837 case SourceLocIdentKind::FileName: 4838 case SourceLocIdentKind::Function: 4839 case SourceLocIdentKind::FuncSig: 4840 case SourceLocIdentKind::SourceLocStruct: 4841 return false; 4842 case SourceLocIdentKind::Line: 4843 case SourceLocIdentKind::Column: 4844 return true; 4845 } 4846 llvm_unreachable("unknown source location expression kind"); 4847 } 4848 4849 /// If the SourceLocExpr has been resolved return the subexpression 4850 /// representing the resolved value. Otherwise return null. 4851 const DeclContext *getParentContext() const { return ParentContext; } 4852 DeclContext *getParentContext() { return ParentContext; } 4853 4854 SourceLocation getLocation() const { return BuiltinLoc; } 4855 SourceLocation getBeginLoc() const { return BuiltinLoc; } 4856 SourceLocation getEndLoc() const { return RParenLoc; } 4857 4858 child_range children() { 4859 return child_range(child_iterator(), child_iterator()); 4860 } 4861 4862 const_child_range children() const { 4863 return const_child_range(child_iterator(), child_iterator()); 4864 } 4865 4866 static bool classof(const Stmt *T) { 4867 return T->getStmtClass() == SourceLocExprClass; 4868 } 4869 4870 static bool MayBeDependent(SourceLocIdentKind Kind) { 4871 switch (Kind) { 4872 case SourceLocIdentKind::Function: 4873 case SourceLocIdentKind::FuncSig: 4874 case SourceLocIdentKind::SourceLocStruct: 4875 return true; 4876 default: 4877 return false; 4878 } 4879 } 4880 4881 private: 4882 friend class ASTStmtReader; 4883 }; 4884 4885 /// Stores data related to a single #embed directive. 4886 struct EmbedDataStorage { 4887 StringLiteral *BinaryData; 4888 size_t getDataElementCount() const { return BinaryData->getByteLength(); } 4889 }; 4890 4891 /// Represents a reference to #emded data. By default, this references the whole 4892 /// range. Otherwise it represents a subrange of data imported by #embed 4893 /// directive. Needed to handle nested initializer lists with #embed directives. 4894 /// Example: 4895 /// struct S { 4896 /// int x, y; 4897 /// }; 4898 /// 4899 /// struct T { 4900 /// int x[2]; 4901 /// struct S s 4902 /// }; 4903 /// 4904 /// struct T t[] = { 4905 /// #embed "data" // data contains 10 elements; 4906 /// }; 4907 /// 4908 /// The resulting semantic form of initializer list will contain (EE stands 4909 /// for EmbedExpr): 4910 /// { {EE(first two data elements), {EE(3rd element), EE(4th element) }}, 4911 /// { {EE(5th and 6th element), {EE(7th element), EE(8th element) }}, 4912 /// { {EE(9th and 10th element), { zeroinitializer }}} 4913 /// 4914 /// EmbedExpr inside of a semantic initializer list and referencing more than 4915 /// one element can only appear for arrays of scalars. 4916 class EmbedExpr final : public Expr { 4917 SourceLocation EmbedKeywordLoc; 4918 IntegerLiteral *FakeChildNode = nullptr; 4919 const ASTContext *Ctx = nullptr; 4920 EmbedDataStorage *Data; 4921 unsigned Begin = 0; 4922 unsigned NumOfElements; 4923 4924 public: 4925 EmbedExpr(const ASTContext &Ctx, SourceLocation Loc, EmbedDataStorage *Data, 4926 unsigned Begin, unsigned NumOfElements); 4927 explicit EmbedExpr(EmptyShell Empty) : Expr(SourceLocExprClass, Empty) {} 4928 4929 SourceLocation getLocation() const { return EmbedKeywordLoc; } 4930 SourceLocation getBeginLoc() const { return EmbedKeywordLoc; } 4931 SourceLocation getEndLoc() const { return EmbedKeywordLoc; } 4932 4933 StringLiteral *getDataStringLiteral() const { return Data->BinaryData; } 4934 EmbedDataStorage *getData() const { return Data; } 4935 4936 unsigned getStartingElementPos() const { return Begin; } 4937 size_t getDataElementCount() const { return NumOfElements; } 4938 4939 // Allows accessing every byte of EmbedExpr data and iterating over it. 4940 // An Iterator knows the EmbedExpr that it refers to, and an offset value 4941 // within the data. 4942 // Dereferencing an Iterator results in construction of IntegerLiteral AST 4943 // node filled with byte of data of the corresponding EmbedExpr within offset 4944 // that the Iterator currently has. 4945 template <bool Const> 4946 class ChildElementIter 4947 : public llvm::iterator_facade_base< 4948 ChildElementIter<Const>, std::random_access_iterator_tag, 4949 std::conditional_t<Const, const IntegerLiteral *, 4950 IntegerLiteral *>> { 4951 friend class EmbedExpr; 4952 4953 EmbedExpr *EExpr = nullptr; 4954 unsigned long long CurOffset = ULLONG_MAX; 4955 using BaseTy = typename ChildElementIter::iterator_facade_base; 4956 4957 ChildElementIter(EmbedExpr *E) : EExpr(E) { 4958 if (E) 4959 CurOffset = E->getStartingElementPos(); 4960 } 4961 4962 public: 4963 ChildElementIter() : CurOffset(ULLONG_MAX) {} 4964 typename BaseTy::reference operator*() const { 4965 assert(EExpr && CurOffset != ULLONG_MAX && 4966 "trying to dereference an invalid iterator"); 4967 IntegerLiteral *N = EExpr->FakeChildNode; 4968 StringRef DataRef = EExpr->Data->BinaryData->getBytes(); 4969 N->setValue(*EExpr->Ctx, 4970 llvm::APInt(N->getValue().getBitWidth(), DataRef[CurOffset], 4971 N->getType()->isSignedIntegerType())); 4972 // We want to return a reference to the fake child node in the 4973 // EmbedExpr, not the local variable N. 4974 return const_cast<typename BaseTy::reference>(EExpr->FakeChildNode); 4975 } 4976 typename BaseTy::pointer operator->() const { return **this; } 4977 using BaseTy::operator++; 4978 ChildElementIter &operator++() { 4979 assert(EExpr && "trying to increment an invalid iterator"); 4980 assert(CurOffset != ULLONG_MAX && 4981 "Already at the end of what we can iterate over"); 4982 if (++CurOffset >= 4983 EExpr->getDataElementCount() + EExpr->getStartingElementPos()) { 4984 CurOffset = ULLONG_MAX; 4985 EExpr = nullptr; 4986 } 4987 return *this; 4988 } 4989 bool operator==(ChildElementIter Other) const { 4990 return (EExpr == Other.EExpr && CurOffset == Other.CurOffset); 4991 } 4992 }; // class ChildElementIter 4993 4994 public: 4995 using fake_child_range = llvm::iterator_range<ChildElementIter<false>>; 4996 using const_fake_child_range = llvm::iterator_range<ChildElementIter<true>>; 4997 4998 fake_child_range underlying_data_elements() { 4999 return fake_child_range(ChildElementIter<false>(this), 5000 ChildElementIter<false>()); 5001 } 5002 5003 const_fake_child_range underlying_data_elements() const { 5004 return const_fake_child_range( 5005 ChildElementIter<true>(const_cast<EmbedExpr *>(this)), 5006 ChildElementIter<true>()); 5007 } 5008 5009 child_range children() { 5010 return child_range(child_iterator(), child_iterator()); 5011 } 5012 5013 const_child_range children() const { 5014 return const_child_range(const_child_iterator(), const_child_iterator()); 5015 } 5016 5017 static bool classof(const Stmt *T) { 5018 return T->getStmtClass() == EmbedExprClass; 5019 } 5020 5021 ChildElementIter<false> begin() { return ChildElementIter<false>(this); } 5022 5023 ChildElementIter<true> begin() const { 5024 return ChildElementIter<true>(const_cast<EmbedExpr *>(this)); 5025 } 5026 5027 template <typename Call, typename... Targs> 5028 bool doForEachDataElement(Call &&C, unsigned &StartingIndexInArray, 5029 Targs &&...Fargs) const { 5030 for (auto It : underlying_data_elements()) { 5031 if (!std::invoke(std::forward<Call>(C), const_cast<IntegerLiteral *>(It), 5032 StartingIndexInArray, std::forward<Targs>(Fargs)...)) 5033 return false; 5034 StartingIndexInArray++; 5035 } 5036 return true; 5037 } 5038 5039 private: 5040 friend class ASTStmtReader; 5041 }; 5042 5043 /// Describes an C or C++ initializer list. 5044 /// 5045 /// InitListExpr describes an initializer list, which can be used to 5046 /// initialize objects of different types, including 5047 /// struct/class/union types, arrays, and vectors. For example: 5048 /// 5049 /// @code 5050 /// struct foo x = { 1, { 2, 3 } }; 5051 /// @endcode 5052 /// 5053 /// Prior to semantic analysis, an initializer list will represent the 5054 /// initializer list as written by the user, but will have the 5055 /// placeholder type "void". This initializer list is called the 5056 /// syntactic form of the initializer, and may contain C99 designated 5057 /// initializers (represented as DesignatedInitExprs), initializations 5058 /// of subobject members without explicit braces, and so on. Clients 5059 /// interested in the original syntax of the initializer list should 5060 /// use the syntactic form of the initializer list. 5061 /// 5062 /// After semantic analysis, the initializer list will represent the 5063 /// semantic form of the initializer, where the initializations of all 5064 /// subobjects are made explicit with nested InitListExpr nodes and 5065 /// C99 designators have been eliminated by placing the designated 5066 /// initializations into the subobject they initialize. Additionally, 5067 /// any "holes" in the initialization, where no initializer has been 5068 /// specified for a particular subobject, will be replaced with 5069 /// implicitly-generated ImplicitValueInitExpr expressions that 5070 /// value-initialize the subobjects. Note, however, that the 5071 /// initializer lists may still have fewer initializers than there are 5072 /// elements to initialize within the object. 5073 /// 5074 /// After semantic analysis has completed, given an initializer list, 5075 /// method isSemanticForm() returns true if and only if this is the 5076 /// semantic form of the initializer list (note: the same AST node 5077 /// may at the same time be the syntactic form). 5078 /// Given the semantic form of the initializer list, one can retrieve 5079 /// the syntactic form of that initializer list (when different) 5080 /// using method getSyntacticForm(); the method returns null if applied 5081 /// to a initializer list which is already in syntactic form. 5082 /// Similarly, given the syntactic form (i.e., an initializer list such 5083 /// that isSemanticForm() returns false), one can retrieve the semantic 5084 /// form using method getSemanticForm(). 5085 /// Since many initializer lists have the same syntactic and semantic forms, 5086 /// getSyntacticForm() may return NULL, indicating that the current 5087 /// semantic initializer list also serves as its syntactic form. 5088 class InitListExpr : public Expr { 5089 // FIXME: Eliminate this vector in favor of ASTContext allocation 5090 typedef ASTVector<Stmt *> InitExprsTy; 5091 InitExprsTy InitExprs; 5092 SourceLocation LBraceLoc, RBraceLoc; 5093 5094 /// The alternative form of the initializer list (if it exists). 5095 /// The int part of the pair stores whether this initializer list is 5096 /// in semantic form. If not null, the pointer points to: 5097 /// - the syntactic form, if this is in semantic form; 5098 /// - the semantic form, if this is in syntactic form. 5099 llvm::PointerIntPair<InitListExpr *, 1, bool> AltForm; 5100 5101 /// Either: 5102 /// If this initializer list initializes an array with more elements than 5103 /// there are initializers in the list, specifies an expression to be used 5104 /// for value initialization of the rest of the elements. 5105 /// Or 5106 /// If this initializer list initializes a union, specifies which 5107 /// field within the union will be initialized. 5108 llvm::PointerUnion<Expr *, FieldDecl *> ArrayFillerOrUnionFieldInit; 5109 5110 public: 5111 InitListExpr(const ASTContext &C, SourceLocation lbraceloc, 5112 ArrayRef<Expr*> initExprs, SourceLocation rbraceloc); 5113 5114 /// Build an empty initializer list. 5115 explicit InitListExpr(EmptyShell Empty) 5116 : Expr(InitListExprClass, Empty), AltForm(nullptr, true) { } 5117 5118 unsigned getNumInits() const { return InitExprs.size(); } 5119 5120 /// Retrieve the set of initializers. 5121 Expr **getInits() { return reinterpret_cast<Expr **>(InitExprs.data()); } 5122 5123 /// Retrieve the set of initializers. 5124 Expr * const *getInits() const { 5125 return reinterpret_cast<Expr * const *>(InitExprs.data()); 5126 } 5127 5128 ArrayRef<Expr *> inits() { return llvm::ArrayRef(getInits(), getNumInits()); } 5129 5130 ArrayRef<Expr *> inits() const { 5131 return llvm::ArrayRef(getInits(), getNumInits()); 5132 } 5133 5134 const Expr *getInit(unsigned Init) const { 5135 assert(Init < getNumInits() && "Initializer access out of range!"); 5136 return cast_or_null<Expr>(InitExprs[Init]); 5137 } 5138 5139 Expr *getInit(unsigned Init) { 5140 assert(Init < getNumInits() && "Initializer access out of range!"); 5141 return cast_or_null<Expr>(InitExprs[Init]); 5142 } 5143 5144 void setInit(unsigned Init, Expr *expr) { 5145 assert(Init < getNumInits() && "Initializer access out of range!"); 5146 InitExprs[Init] = expr; 5147 5148 if (expr) 5149 setDependence(getDependence() | expr->getDependence()); 5150 } 5151 5152 /// Mark the semantic form of the InitListExpr as error when the semantic 5153 /// analysis fails. 5154 void markError() { 5155 assert(isSemanticForm()); 5156 setDependence(getDependence() | ExprDependence::ErrorDependent); 5157 } 5158 5159 /// Reserve space for some number of initializers. 5160 void reserveInits(const ASTContext &C, unsigned NumInits); 5161 5162 /// Specify the number of initializers 5163 /// 5164 /// If there are more than @p NumInits initializers, the remaining 5165 /// initializers will be destroyed. If there are fewer than @p 5166 /// NumInits initializers, NULL expressions will be added for the 5167 /// unknown initializers. 5168 void resizeInits(const ASTContext &Context, unsigned NumInits); 5169 5170 /// Updates the initializer at index @p Init with the new 5171 /// expression @p expr, and returns the old expression at that 5172 /// location. 5173 /// 5174 /// When @p Init is out of range for this initializer list, the 5175 /// initializer list will be extended with NULL expressions to 5176 /// accommodate the new entry. 5177 Expr *updateInit(const ASTContext &C, unsigned Init, Expr *expr); 5178 5179 /// If this initializer list initializes an array with more elements 5180 /// than there are initializers in the list, specifies an expression to be 5181 /// used for value initialization of the rest of the elements. 5182 Expr *getArrayFiller() { 5183 return dyn_cast_if_present<Expr *>(ArrayFillerOrUnionFieldInit); 5184 } 5185 const Expr *getArrayFiller() const { 5186 return const_cast<InitListExpr *>(this)->getArrayFiller(); 5187 } 5188 void setArrayFiller(Expr *filler); 5189 5190 /// Return true if this is an array initializer and its array "filler" 5191 /// has been set. 5192 bool hasArrayFiller() const { return getArrayFiller(); } 5193 5194 /// Determine whether this initializer list contains a designated initializer. 5195 bool hasDesignatedInit() const { 5196 return std::any_of(begin(), end(), [](const Stmt *S) { 5197 return isa<DesignatedInitExpr>(S); 5198 }); 5199 } 5200 5201 /// If this initializes a union, specifies which field in the 5202 /// union to initialize. 5203 /// 5204 /// Typically, this field is the first named field within the 5205 /// union. However, a designated initializer can specify the 5206 /// initialization of a different field within the union. 5207 FieldDecl *getInitializedFieldInUnion() { 5208 return dyn_cast_if_present<FieldDecl *>(ArrayFillerOrUnionFieldInit); 5209 } 5210 const FieldDecl *getInitializedFieldInUnion() const { 5211 return const_cast<InitListExpr *>(this)->getInitializedFieldInUnion(); 5212 } 5213 void setInitializedFieldInUnion(FieldDecl *FD) { 5214 assert((FD == nullptr 5215 || getInitializedFieldInUnion() == nullptr 5216 || getInitializedFieldInUnion() == FD) 5217 && "Only one field of a union may be initialized at a time!"); 5218 ArrayFillerOrUnionFieldInit = FD; 5219 } 5220 5221 // Explicit InitListExpr's originate from source code (and have valid source 5222 // locations). Implicit InitListExpr's are created by the semantic analyzer. 5223 // FIXME: This is wrong; InitListExprs created by semantic analysis have 5224 // valid source locations too! 5225 bool isExplicit() const { 5226 return LBraceLoc.isValid() && RBraceLoc.isValid(); 5227 } 5228 5229 /// Is this an initializer for an array of characters, initialized by a string 5230 /// literal or an @encode? 5231 bool isStringLiteralInit() const; 5232 5233 /// Is this a transparent initializer list (that is, an InitListExpr that is 5234 /// purely syntactic, and whose semantics are that of the sole contained 5235 /// initializer)? 5236 bool isTransparent() const; 5237 5238 /// Is this the zero initializer {0} in a language which considers it 5239 /// idiomatic? 5240 bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const; 5241 5242 SourceLocation getLBraceLoc() const { return LBraceLoc; } 5243 void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; } 5244 SourceLocation getRBraceLoc() const { return RBraceLoc; } 5245 void setRBraceLoc(SourceLocation Loc) { RBraceLoc = Loc; } 5246 5247 bool isSemanticForm() const { return AltForm.getInt(); } 5248 InitListExpr *getSemanticForm() const { 5249 return isSemanticForm() ? nullptr : AltForm.getPointer(); 5250 } 5251 bool isSyntacticForm() const { 5252 return !AltForm.getInt() || !AltForm.getPointer(); 5253 } 5254 InitListExpr *getSyntacticForm() const { 5255 return isSemanticForm() ? AltForm.getPointer() : nullptr; 5256 } 5257 5258 void setSyntacticForm(InitListExpr *Init) { 5259 AltForm.setPointer(Init); 5260 AltForm.setInt(true); 5261 Init->AltForm.setPointer(this); 5262 Init->AltForm.setInt(false); 5263 } 5264 5265 bool hadArrayRangeDesignator() const { 5266 return InitListExprBits.HadArrayRangeDesignator != 0; 5267 } 5268 void sawArrayRangeDesignator(bool ARD = true) { 5269 InitListExprBits.HadArrayRangeDesignator = ARD; 5270 } 5271 5272 SourceLocation getBeginLoc() const LLVM_READONLY; 5273 SourceLocation getEndLoc() const LLVM_READONLY; 5274 5275 static bool classof(const Stmt *T) { 5276 return T->getStmtClass() == InitListExprClass; 5277 } 5278 5279 // Iterators 5280 child_range children() { 5281 const_child_range CCR = const_cast<const InitListExpr *>(this)->children(); 5282 return child_range(cast_away_const(CCR.begin()), 5283 cast_away_const(CCR.end())); 5284 } 5285 5286 const_child_range children() const { 5287 // FIXME: This does not include the array filler expression. 5288 if (InitExprs.empty()) 5289 return const_child_range(const_child_iterator(), const_child_iterator()); 5290 return const_child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size()); 5291 } 5292 5293 typedef InitExprsTy::iterator iterator; 5294 typedef InitExprsTy::const_iterator const_iterator; 5295 typedef InitExprsTy::reverse_iterator reverse_iterator; 5296 typedef InitExprsTy::const_reverse_iterator const_reverse_iterator; 5297 5298 iterator begin() { return InitExprs.begin(); } 5299 const_iterator begin() const { return InitExprs.begin(); } 5300 iterator end() { return InitExprs.end(); } 5301 const_iterator end() const { return InitExprs.end(); } 5302 reverse_iterator rbegin() { return InitExprs.rbegin(); } 5303 const_reverse_iterator rbegin() const { return InitExprs.rbegin(); } 5304 reverse_iterator rend() { return InitExprs.rend(); } 5305 const_reverse_iterator rend() const { return InitExprs.rend(); } 5306 5307 friend class ASTStmtReader; 5308 friend class ASTStmtWriter; 5309 }; 5310 5311 /// Represents a C99 designated initializer expression. 5312 /// 5313 /// A designated initializer expression (C99 6.7.8) contains one or 5314 /// more designators (which can be field designators, array 5315 /// designators, or GNU array-range designators) followed by an 5316 /// expression that initializes the field or element(s) that the 5317 /// designators refer to. For example, given: 5318 /// 5319 /// @code 5320 /// struct point { 5321 /// double x; 5322 /// double y; 5323 /// }; 5324 /// struct point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 5325 /// @endcode 5326 /// 5327 /// The InitListExpr contains three DesignatedInitExprs, the first of 5328 /// which covers @c [2].y=1.0. This DesignatedInitExpr will have two 5329 /// designators, one array designator for @c [2] followed by one field 5330 /// designator for @c .y. The initialization expression will be 1.0. 5331 class DesignatedInitExpr final 5332 : public Expr, 5333 private llvm::TrailingObjects<DesignatedInitExpr, Stmt *> { 5334 public: 5335 /// Forward declaration of the Designator class. 5336 class Designator; 5337 5338 private: 5339 /// The location of the '=' or ':' prior to the actual initializer 5340 /// expression. 5341 SourceLocation EqualOrColonLoc; 5342 5343 /// Whether this designated initializer used the GNU deprecated 5344 /// syntax rather than the C99 '=' syntax. 5345 LLVM_PREFERRED_TYPE(bool) 5346 unsigned GNUSyntax : 1; 5347 5348 /// The number of designators in this initializer expression. 5349 unsigned NumDesignators : 15; 5350 5351 /// The number of subexpressions of this initializer expression, 5352 /// which contains both the initializer and any additional 5353 /// expressions used by array and array-range designators. 5354 unsigned NumSubExprs : 16; 5355 5356 /// The designators in this designated initialization 5357 /// expression. 5358 Designator *Designators; 5359 5360 DesignatedInitExpr(const ASTContext &C, QualType Ty, 5361 llvm::ArrayRef<Designator> Designators, 5362 SourceLocation EqualOrColonLoc, bool GNUSyntax, 5363 ArrayRef<Expr *> IndexExprs, Expr *Init); 5364 5365 explicit DesignatedInitExpr(unsigned NumSubExprs) 5366 : Expr(DesignatedInitExprClass, EmptyShell()), 5367 NumDesignators(0), NumSubExprs(NumSubExprs), Designators(nullptr) { } 5368 5369 public: 5370 /// Represents a single C99 designator. 5371 /// 5372 /// @todo This class is infuriatingly similar to clang::Designator, 5373 /// but minor differences (storing indices vs. storing pointers) 5374 /// keep us from reusing it. Try harder, later, to rectify these 5375 /// differences. 5376 class Designator { 5377 /// A field designator, e.g., ".x". 5378 struct FieldDesignatorInfo { 5379 /// Refers to the field that is being initialized. The low bit 5380 /// of this field determines whether this is actually a pointer 5381 /// to an IdentifierInfo (if 1) or a FieldDecl (if 0). When 5382 /// initially constructed, a field designator will store an 5383 /// IdentifierInfo*. After semantic analysis has resolved that 5384 /// name, the field designator will instead store a FieldDecl*. 5385 uintptr_t NameOrField; 5386 5387 /// The location of the '.' in the designated initializer. 5388 SourceLocation DotLoc; 5389 5390 /// The location of the field name in the designated initializer. 5391 SourceLocation FieldLoc; 5392 5393 FieldDesignatorInfo(const IdentifierInfo *II, SourceLocation DotLoc, 5394 SourceLocation FieldLoc) 5395 : NameOrField(reinterpret_cast<uintptr_t>(II) | 0x1), DotLoc(DotLoc), 5396 FieldLoc(FieldLoc) {} 5397 }; 5398 5399 /// An array or GNU array-range designator, e.g., "[9]" or "[10...15]". 5400 struct ArrayOrRangeDesignatorInfo { 5401 /// Location of the first index expression within the designated 5402 /// initializer expression's list of subexpressions. 5403 unsigned Index; 5404 5405 /// The location of the '[' starting the array range designator. 5406 SourceLocation LBracketLoc; 5407 5408 /// The location of the ellipsis separating the start and end 5409 /// indices. Only valid for GNU array-range designators. 5410 SourceLocation EllipsisLoc; 5411 5412 /// The location of the ']' terminating the array range designator. 5413 SourceLocation RBracketLoc; 5414 5415 ArrayOrRangeDesignatorInfo(unsigned Index, SourceLocation LBracketLoc, 5416 SourceLocation RBracketLoc) 5417 : Index(Index), LBracketLoc(LBracketLoc), RBracketLoc(RBracketLoc) {} 5418 5419 ArrayOrRangeDesignatorInfo(unsigned Index, 5420 SourceLocation LBracketLoc, 5421 SourceLocation EllipsisLoc, 5422 SourceLocation RBracketLoc) 5423 : Index(Index), LBracketLoc(LBracketLoc), EllipsisLoc(EllipsisLoc), 5424 RBracketLoc(RBracketLoc) {} 5425 }; 5426 5427 /// The kind of designator this describes. 5428 enum DesignatorKind { 5429 FieldDesignator, 5430 ArrayDesignator, 5431 ArrayRangeDesignator 5432 }; 5433 5434 DesignatorKind Kind; 5435 5436 union { 5437 /// A field designator, e.g., ".x". 5438 struct FieldDesignatorInfo FieldInfo; 5439 5440 /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". 5441 struct ArrayOrRangeDesignatorInfo ArrayOrRangeInfo; 5442 }; 5443 5444 Designator(DesignatorKind Kind) : Kind(Kind) {} 5445 5446 public: 5447 Designator() {} 5448 5449 bool isFieldDesignator() const { return Kind == FieldDesignator; } 5450 bool isArrayDesignator() const { return Kind == ArrayDesignator; } 5451 bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; } 5452 5453 //===------------------------------------------------------------------===// 5454 // FieldDesignatorInfo 5455 5456 /// Creates a field designator. 5457 static Designator CreateFieldDesignator(const IdentifierInfo *FieldName, 5458 SourceLocation DotLoc, 5459 SourceLocation FieldLoc) { 5460 Designator D(FieldDesignator); 5461 new (&D.FieldInfo) FieldDesignatorInfo(FieldName, DotLoc, FieldLoc); 5462 return D; 5463 } 5464 5465 const IdentifierInfo *getFieldName() const; 5466 5467 FieldDecl *getFieldDecl() const { 5468 assert(isFieldDesignator() && "Only valid on a field designator"); 5469 if (FieldInfo.NameOrField & 0x01) 5470 return nullptr; 5471 return reinterpret_cast<FieldDecl *>(FieldInfo.NameOrField); 5472 } 5473 5474 void setFieldDecl(FieldDecl *FD) { 5475 assert(isFieldDesignator() && "Only valid on a field designator"); 5476 FieldInfo.NameOrField = reinterpret_cast<uintptr_t>(FD); 5477 } 5478 5479 SourceLocation getDotLoc() const { 5480 assert(isFieldDesignator() && "Only valid on a field designator"); 5481 return FieldInfo.DotLoc; 5482 } 5483 5484 SourceLocation getFieldLoc() const { 5485 assert(isFieldDesignator() && "Only valid on a field designator"); 5486 return FieldInfo.FieldLoc; 5487 } 5488 5489 //===------------------------------------------------------------------===// 5490 // ArrayOrRangeDesignator 5491 5492 /// Creates an array designator. 5493 static Designator CreateArrayDesignator(unsigned Index, 5494 SourceLocation LBracketLoc, 5495 SourceLocation RBracketLoc) { 5496 Designator D(ArrayDesignator); 5497 new (&D.ArrayOrRangeInfo) ArrayOrRangeDesignatorInfo(Index, LBracketLoc, 5498 RBracketLoc); 5499 return D; 5500 } 5501 5502 /// Creates a GNU array-range designator. 5503 static Designator CreateArrayRangeDesignator(unsigned Index, 5504 SourceLocation LBracketLoc, 5505 SourceLocation EllipsisLoc, 5506 SourceLocation RBracketLoc) { 5507 Designator D(ArrayRangeDesignator); 5508 new (&D.ArrayOrRangeInfo) ArrayOrRangeDesignatorInfo(Index, LBracketLoc, 5509 EllipsisLoc, 5510 RBracketLoc); 5511 return D; 5512 } 5513 5514 unsigned getArrayIndex() const { 5515 assert((isArrayDesignator() || isArrayRangeDesignator()) && 5516 "Only valid on an array or array-range designator"); 5517 return ArrayOrRangeInfo.Index; 5518 } 5519 5520 SourceLocation getLBracketLoc() const { 5521 assert((isArrayDesignator() || isArrayRangeDesignator()) && 5522 "Only valid on an array or array-range designator"); 5523 return ArrayOrRangeInfo.LBracketLoc; 5524 } 5525 5526 SourceLocation getEllipsisLoc() const { 5527 assert(isArrayRangeDesignator() && 5528 "Only valid on an array-range designator"); 5529 return ArrayOrRangeInfo.EllipsisLoc; 5530 } 5531 5532 SourceLocation getRBracketLoc() const { 5533 assert((isArrayDesignator() || isArrayRangeDesignator()) && 5534 "Only valid on an array or array-range designator"); 5535 return ArrayOrRangeInfo.RBracketLoc; 5536 } 5537 5538 SourceLocation getBeginLoc() const LLVM_READONLY { 5539 if (isFieldDesignator()) 5540 return getDotLoc().isInvalid() ? getFieldLoc() : getDotLoc(); 5541 return getLBracketLoc(); 5542 } 5543 5544 SourceLocation getEndLoc() const LLVM_READONLY { 5545 return isFieldDesignator() ? getFieldLoc() : getRBracketLoc(); 5546 } 5547 5548 SourceRange getSourceRange() const LLVM_READONLY { 5549 return SourceRange(getBeginLoc(), getEndLoc()); 5550 } 5551 }; 5552 5553 static DesignatedInitExpr *Create(const ASTContext &C, 5554 llvm::ArrayRef<Designator> Designators, 5555 ArrayRef<Expr*> IndexExprs, 5556 SourceLocation EqualOrColonLoc, 5557 bool GNUSyntax, Expr *Init); 5558 5559 static DesignatedInitExpr *CreateEmpty(const ASTContext &C, 5560 unsigned NumIndexExprs); 5561 5562 /// Returns the number of designators in this initializer. 5563 unsigned size() const { return NumDesignators; } 5564 5565 // Iterator access to the designators. 5566 llvm::MutableArrayRef<Designator> designators() { 5567 return {Designators, NumDesignators}; 5568 } 5569 5570 llvm::ArrayRef<Designator> designators() const { 5571 return {Designators, NumDesignators}; 5572 } 5573 5574 Designator *getDesignator(unsigned Idx) { return &designators()[Idx]; } 5575 const Designator *getDesignator(unsigned Idx) const { 5576 return &designators()[Idx]; 5577 } 5578 5579 void setDesignators(const ASTContext &C, const Designator *Desigs, 5580 unsigned NumDesigs); 5581 5582 Expr *getArrayIndex(const Designator &D) const; 5583 Expr *getArrayRangeStart(const Designator &D) const; 5584 Expr *getArrayRangeEnd(const Designator &D) const; 5585 5586 /// Retrieve the location of the '=' that precedes the 5587 /// initializer value itself, if present. 5588 SourceLocation getEqualOrColonLoc() const { return EqualOrColonLoc; } 5589 void setEqualOrColonLoc(SourceLocation L) { EqualOrColonLoc = L; } 5590 5591 /// Whether this designated initializer should result in direct-initialization 5592 /// of the designated subobject (eg, '{.foo{1, 2, 3}}'). 5593 bool isDirectInit() const { return EqualOrColonLoc.isInvalid(); } 5594 5595 /// Determines whether this designated initializer used the 5596 /// deprecated GNU syntax for designated initializers. 5597 bool usesGNUSyntax() const { return GNUSyntax; } 5598 void setGNUSyntax(bool GNU) { GNUSyntax = GNU; } 5599 5600 /// Retrieve the initializer value. 5601 Expr *getInit() const { 5602 return cast<Expr>(*const_cast<DesignatedInitExpr*>(this)->child_begin()); 5603 } 5604 5605 void setInit(Expr *init) { 5606 *child_begin() = init; 5607 } 5608 5609 /// Retrieve the total number of subexpressions in this 5610 /// designated initializer expression, including the actual 5611 /// initialized value and any expressions that occur within array 5612 /// and array-range designators. 5613 unsigned getNumSubExprs() const { return NumSubExprs; } 5614 5615 Expr *getSubExpr(unsigned Idx) const { 5616 assert(Idx < NumSubExprs && "Subscript out of range"); 5617 return cast<Expr>(getTrailingObjects<Stmt *>()[Idx]); 5618 } 5619 5620 void setSubExpr(unsigned Idx, Expr *E) { 5621 assert(Idx < NumSubExprs && "Subscript out of range"); 5622 getTrailingObjects<Stmt *>()[Idx] = E; 5623 } 5624 5625 /// Replaces the designator at index @p Idx with the series 5626 /// of designators in [First, Last). 5627 void ExpandDesignator(const ASTContext &C, unsigned Idx, 5628 const Designator *First, const Designator *Last); 5629 5630 SourceRange getDesignatorsSourceRange() const; 5631 5632 SourceLocation getBeginLoc() const LLVM_READONLY; 5633 SourceLocation getEndLoc() const LLVM_READONLY; 5634 5635 static bool classof(const Stmt *T) { 5636 return T->getStmtClass() == DesignatedInitExprClass; 5637 } 5638 5639 // Iterators 5640 child_range children() { 5641 Stmt **begin = getTrailingObjects<Stmt *>(); 5642 return child_range(begin, begin + NumSubExprs); 5643 } 5644 const_child_range children() const { 5645 Stmt * const *begin = getTrailingObjects<Stmt *>(); 5646 return const_child_range(begin, begin + NumSubExprs); 5647 } 5648 5649 friend TrailingObjects; 5650 }; 5651 5652 /// Represents a place-holder for an object not to be initialized by 5653 /// anything. 5654 /// 5655 /// This only makes sense when it appears as part of an updater of a 5656 /// DesignatedInitUpdateExpr (see below). The base expression of a DIUE 5657 /// initializes a big object, and the NoInitExpr's mark the spots within the 5658 /// big object not to be overwritten by the updater. 5659 /// 5660 /// \see DesignatedInitUpdateExpr 5661 class NoInitExpr : public Expr { 5662 public: 5663 explicit NoInitExpr(QualType ty) 5664 : Expr(NoInitExprClass, ty, VK_PRValue, OK_Ordinary) { 5665 setDependence(computeDependence(this)); 5666 } 5667 5668 explicit NoInitExpr(EmptyShell Empty) 5669 : Expr(NoInitExprClass, Empty) { } 5670 5671 static bool classof(const Stmt *T) { 5672 return T->getStmtClass() == NoInitExprClass; 5673 } 5674 5675 SourceLocation getBeginLoc() const LLVM_READONLY { return SourceLocation(); } 5676 SourceLocation getEndLoc() const LLVM_READONLY { return SourceLocation(); } 5677 5678 // Iterators 5679 child_range children() { 5680 return child_range(child_iterator(), child_iterator()); 5681 } 5682 const_child_range children() const { 5683 return const_child_range(const_child_iterator(), const_child_iterator()); 5684 } 5685 }; 5686 5687 // In cases like: 5688 // struct Q { int a, b, c; }; 5689 // Q *getQ(); 5690 // void foo() { 5691 // struct A { Q q; } a = { *getQ(), .q.b = 3 }; 5692 // } 5693 // 5694 // We will have an InitListExpr for a, with type A, and then a 5695 // DesignatedInitUpdateExpr for "a.q" with type Q. The "base" for this DIUE 5696 // is the call expression *getQ(); the "updater" for the DIUE is ".q.b = 3" 5697 // 5698 class DesignatedInitUpdateExpr : public Expr { 5699 // BaseAndUpdaterExprs[0] is the base expression; 5700 // BaseAndUpdaterExprs[1] is an InitListExpr overwriting part of the base. 5701 Stmt *BaseAndUpdaterExprs[2]; 5702 5703 public: 5704 DesignatedInitUpdateExpr(const ASTContext &C, SourceLocation lBraceLoc, 5705 Expr *baseExprs, SourceLocation rBraceLoc); 5706 5707 explicit DesignatedInitUpdateExpr(EmptyShell Empty) 5708 : Expr(DesignatedInitUpdateExprClass, Empty) { } 5709 5710 SourceLocation getBeginLoc() const LLVM_READONLY; 5711 SourceLocation getEndLoc() const LLVM_READONLY; 5712 5713 static bool classof(const Stmt *T) { 5714 return T->getStmtClass() == DesignatedInitUpdateExprClass; 5715 } 5716 5717 Expr *getBase() const { return cast<Expr>(BaseAndUpdaterExprs[0]); } 5718 void setBase(Expr *Base) { BaseAndUpdaterExprs[0] = Base; } 5719 5720 InitListExpr *getUpdater() const { 5721 return cast<InitListExpr>(BaseAndUpdaterExprs[1]); 5722 } 5723 void setUpdater(Expr *Updater) { BaseAndUpdaterExprs[1] = Updater; } 5724 5725 // Iterators 5726 // children = the base and the updater 5727 child_range children() { 5728 return child_range(&BaseAndUpdaterExprs[0], &BaseAndUpdaterExprs[0] + 2); 5729 } 5730 const_child_range children() const { 5731 return const_child_range(&BaseAndUpdaterExprs[0], 5732 &BaseAndUpdaterExprs[0] + 2); 5733 } 5734 }; 5735 5736 /// Represents a loop initializing the elements of an array. 5737 /// 5738 /// The need to initialize the elements of an array occurs in a number of 5739 /// contexts: 5740 /// 5741 /// * in the implicit copy/move constructor for a class with an array member 5742 /// * when a lambda-expression captures an array by value 5743 /// * when a decomposition declaration decomposes an array 5744 /// 5745 /// There are two subexpressions: a common expression (the source array) 5746 /// that is evaluated once up-front, and a per-element initializer that 5747 /// runs once for each array element. 5748 /// 5749 /// Within the per-element initializer, the common expression may be referenced 5750 /// via an OpaqueValueExpr, and the current index may be obtained via an 5751 /// ArrayInitIndexExpr. 5752 class ArrayInitLoopExpr : public Expr { 5753 Stmt *SubExprs[2]; 5754 5755 explicit ArrayInitLoopExpr(EmptyShell Empty) 5756 : Expr(ArrayInitLoopExprClass, Empty), SubExprs{} {} 5757 5758 public: 5759 explicit ArrayInitLoopExpr(QualType T, Expr *CommonInit, Expr *ElementInit) 5760 : Expr(ArrayInitLoopExprClass, T, VK_PRValue, OK_Ordinary), 5761 SubExprs{CommonInit, ElementInit} { 5762 setDependence(computeDependence(this)); 5763 } 5764 5765 /// Get the common subexpression shared by all initializations (the source 5766 /// array). 5767 OpaqueValueExpr *getCommonExpr() const { 5768 return cast<OpaqueValueExpr>(SubExprs[0]); 5769 } 5770 5771 /// Get the initializer to use for each array element. 5772 Expr *getSubExpr() const { return cast<Expr>(SubExprs[1]); } 5773 5774 llvm::APInt getArraySize() const { 5775 return cast<ConstantArrayType>(getType()->castAsArrayTypeUnsafe()) 5776 ->getSize(); 5777 } 5778 5779 static bool classof(const Stmt *S) { 5780 return S->getStmtClass() == ArrayInitLoopExprClass; 5781 } 5782 5783 SourceLocation getBeginLoc() const LLVM_READONLY { 5784 return getCommonExpr()->getBeginLoc(); 5785 } 5786 SourceLocation getEndLoc() const LLVM_READONLY { 5787 return getCommonExpr()->getEndLoc(); 5788 } 5789 5790 child_range children() { 5791 return child_range(SubExprs, SubExprs + 2); 5792 } 5793 const_child_range children() const { 5794 return const_child_range(SubExprs, SubExprs + 2); 5795 } 5796 5797 friend class ASTReader; 5798 friend class ASTStmtReader; 5799 friend class ASTStmtWriter; 5800 }; 5801 5802 /// Represents the index of the current element of an array being 5803 /// initialized by an ArrayInitLoopExpr. This can only appear within the 5804 /// subexpression of an ArrayInitLoopExpr. 5805 class ArrayInitIndexExpr : public Expr { 5806 explicit ArrayInitIndexExpr(EmptyShell Empty) 5807 : Expr(ArrayInitIndexExprClass, Empty) {} 5808 5809 public: 5810 explicit ArrayInitIndexExpr(QualType T) 5811 : Expr(ArrayInitIndexExprClass, T, VK_PRValue, OK_Ordinary) { 5812 setDependence(ExprDependence::None); 5813 } 5814 5815 static bool classof(const Stmt *S) { 5816 return S->getStmtClass() == ArrayInitIndexExprClass; 5817 } 5818 5819 SourceLocation getBeginLoc() const LLVM_READONLY { return SourceLocation(); } 5820 SourceLocation getEndLoc() const LLVM_READONLY { return SourceLocation(); } 5821 5822 child_range children() { 5823 return child_range(child_iterator(), child_iterator()); 5824 } 5825 const_child_range children() const { 5826 return const_child_range(const_child_iterator(), const_child_iterator()); 5827 } 5828 5829 friend class ASTReader; 5830 friend class ASTStmtReader; 5831 }; 5832 5833 /// Represents an implicitly-generated value initialization of 5834 /// an object of a given type. 5835 /// 5836 /// Implicit value initializations occur within semantic initializer 5837 /// list expressions (InitListExpr) as placeholders for subobject 5838 /// initializations not explicitly specified by the user. 5839 /// 5840 /// \see InitListExpr 5841 class ImplicitValueInitExpr : public Expr { 5842 public: 5843 explicit ImplicitValueInitExpr(QualType ty) 5844 : Expr(ImplicitValueInitExprClass, ty, VK_PRValue, OK_Ordinary) { 5845 setDependence(computeDependence(this)); 5846 } 5847 5848 /// Construct an empty implicit value initialization. 5849 explicit ImplicitValueInitExpr(EmptyShell Empty) 5850 : Expr(ImplicitValueInitExprClass, Empty) { } 5851 5852 static bool classof(const Stmt *T) { 5853 return T->getStmtClass() == ImplicitValueInitExprClass; 5854 } 5855 5856 SourceLocation getBeginLoc() const LLVM_READONLY { return SourceLocation(); } 5857 SourceLocation getEndLoc() const LLVM_READONLY { return SourceLocation(); } 5858 5859 // Iterators 5860 child_range children() { 5861 return child_range(child_iterator(), child_iterator()); 5862 } 5863 const_child_range children() const { 5864 return const_child_range(const_child_iterator(), const_child_iterator()); 5865 } 5866 }; 5867 5868 class ParenListExpr final 5869 : public Expr, 5870 private llvm::TrailingObjects<ParenListExpr, Stmt *> { 5871 friend class ASTStmtReader; 5872 friend TrailingObjects; 5873 5874 /// The location of the left and right parentheses. 5875 SourceLocation LParenLoc, RParenLoc; 5876 5877 /// Build a paren list. 5878 ParenListExpr(SourceLocation LParenLoc, ArrayRef<Expr *> Exprs, 5879 SourceLocation RParenLoc); 5880 5881 /// Build an empty paren list. 5882 ParenListExpr(EmptyShell Empty, unsigned NumExprs); 5883 5884 public: 5885 /// Create a paren list. 5886 static ParenListExpr *Create(const ASTContext &Ctx, SourceLocation LParenLoc, 5887 ArrayRef<Expr *> Exprs, 5888 SourceLocation RParenLoc); 5889 5890 /// Create an empty paren list. 5891 static ParenListExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumExprs); 5892 5893 /// Return the number of expressions in this paren list. 5894 unsigned getNumExprs() const { return ParenListExprBits.NumExprs; } 5895 5896 Expr *getExpr(unsigned Init) { 5897 assert(Init < getNumExprs() && "Initializer access out of range!"); 5898 return getExprs()[Init]; 5899 } 5900 5901 const Expr *getExpr(unsigned Init) const { 5902 return const_cast<ParenListExpr *>(this)->getExpr(Init); 5903 } 5904 5905 Expr **getExprs() { 5906 return reinterpret_cast<Expr **>(getTrailingObjects<Stmt *>()); 5907 } 5908 5909 ArrayRef<Expr *> exprs() { return llvm::ArrayRef(getExprs(), getNumExprs()); } 5910 5911 SourceLocation getLParenLoc() const { return LParenLoc; } 5912 SourceLocation getRParenLoc() const { return RParenLoc; } 5913 SourceLocation getBeginLoc() const { return getLParenLoc(); } 5914 SourceLocation getEndLoc() const { return getRParenLoc(); } 5915 5916 static bool classof(const Stmt *T) { 5917 return T->getStmtClass() == ParenListExprClass; 5918 } 5919 5920 // Iterators 5921 child_range children() { 5922 return child_range(getTrailingObjects<Stmt *>(), 5923 getTrailingObjects<Stmt *>() + getNumExprs()); 5924 } 5925 const_child_range children() const { 5926 return const_child_range(getTrailingObjects<Stmt *>(), 5927 getTrailingObjects<Stmt *>() + getNumExprs()); 5928 } 5929 }; 5930 5931 /// Represents a C11 generic selection. 5932 /// 5933 /// A generic selection (C11 6.5.1.1) contains an unevaluated controlling 5934 /// expression, followed by one or more generic associations. Each generic 5935 /// association specifies a type name and an expression, or "default" and an 5936 /// expression (in which case it is known as a default generic association). 5937 /// The type and value of the generic selection are identical to those of its 5938 /// result expression, which is defined as the expression in the generic 5939 /// association with a type name that is compatible with the type of the 5940 /// controlling expression, or the expression in the default generic association 5941 /// if no types are compatible. For example: 5942 /// 5943 /// @code 5944 /// _Generic(X, double: 1, float: 2, default: 3) 5945 /// @endcode 5946 /// 5947 /// The above expression evaluates to 1 if 1.0 is substituted for X, 2 if 1.0f 5948 /// or 3 if "hello". 5949 /// 5950 /// As an extension, generic selections are allowed in C++, where the following 5951 /// additional semantics apply: 5952 /// 5953 /// Any generic selection whose controlling expression is type-dependent or 5954 /// which names a dependent type in its association list is result-dependent, 5955 /// which means that the choice of result expression is dependent. 5956 /// Result-dependent generic associations are both type- and value-dependent. 5957 /// 5958 /// We also allow an extended form in both C and C++ where the controlling 5959 /// predicate for the selection expression is a type rather than an expression. 5960 /// This type argument form does not perform any conversions for the 5961 /// controlling type, which makes it suitable for use with qualified type 5962 /// associations, which is not possible with the expression form. 5963 class GenericSelectionExpr final 5964 : public Expr, 5965 private llvm::TrailingObjects<GenericSelectionExpr, Stmt *, 5966 TypeSourceInfo *> { 5967 friend class ASTStmtReader; 5968 friend class ASTStmtWriter; 5969 friend TrailingObjects; 5970 5971 /// The number of association expressions and the index of the result 5972 /// expression in the case where the generic selection expression is not 5973 /// result-dependent. The result index is equal to ResultDependentIndex 5974 /// if and only if the generic selection expression is result-dependent. 5975 unsigned NumAssocs : 15; 5976 unsigned ResultIndex : 15; // NB: ResultDependentIndex is tied to this width. 5977 LLVM_PREFERRED_TYPE(bool) 5978 unsigned IsExprPredicate : 1; 5979 enum : unsigned { 5980 ResultDependentIndex = 0x7FFF 5981 }; 5982 5983 unsigned getIndexOfControllingExpression() const { 5984 // If controlled by an expression, the first offset into the Stmt * 5985 // trailing array is the controlling expression, the associated expressions 5986 // follow this. 5987 assert(isExprPredicate() && "Asking for the controlling expression of a " 5988 "selection expr predicated by a type"); 5989 return 0; 5990 } 5991 5992 unsigned getIndexOfControllingType() const { 5993 // If controlled by a type, the first offset into the TypeSourceInfo * 5994 // trailing array is the controlling type, the associated types follow this. 5995 assert(isTypePredicate() && "Asking for the controlling type of a " 5996 "selection expr predicated by an expression"); 5997 return 0; 5998 } 5999 6000 unsigned getIndexOfStartOfAssociatedExprs() const { 6001 // If the predicate is a type, then the associated expressions are the only 6002 // Stmt * in the trailing array, otherwise we need to offset past the 6003 // predicate expression. 6004 return (int)isExprPredicate(); 6005 } 6006 6007 unsigned getIndexOfStartOfAssociatedTypes() const { 6008 // If the predicate is a type, then the associated types follow it in the 6009 // trailing array. Otherwise, the associated types are the only 6010 // TypeSourceInfo * in the trailing array. 6011 return (int)isTypePredicate(); 6012 } 6013 6014 6015 /// The location of the "default" and of the right parenthesis. 6016 SourceLocation DefaultLoc, RParenLoc; 6017 6018 // GenericSelectionExpr is followed by several trailing objects. 6019 // They are (in order): 6020 // 6021 // * A single Stmt * for the controlling expression or a TypeSourceInfo * for 6022 // the controlling type, depending on the result of isTypePredicate() or 6023 // isExprPredicate(). 6024 // * An array of getNumAssocs() Stmt * for the association expressions. 6025 // * An array of getNumAssocs() TypeSourceInfo *, one for each of the 6026 // association expressions. 6027 unsigned numTrailingObjects(OverloadToken<Stmt *>) const { 6028 // Add one to account for the controlling expression; the remainder 6029 // are the associated expressions. 6030 return getNumAssocs() + (int)isExprPredicate(); 6031 } 6032 6033 unsigned numTrailingObjects(OverloadToken<TypeSourceInfo *>) const { 6034 // Add one to account for the controlling type predicate, the remainder 6035 // are the associated types. 6036 return getNumAssocs() + (int)isTypePredicate(); 6037 } 6038 6039 template <bool Const> class AssociationIteratorTy; 6040 /// Bundle together an association expression and its TypeSourceInfo. 6041 /// The Const template parameter is for the const and non-const versions 6042 /// of AssociationTy. 6043 template <bool Const> class AssociationTy { 6044 friend class GenericSelectionExpr; 6045 template <bool OtherConst> friend class AssociationIteratorTy; 6046 using ExprPtrTy = std::conditional_t<Const, const Expr *, Expr *>; 6047 using TSIPtrTy = 6048 std::conditional_t<Const, const TypeSourceInfo *, TypeSourceInfo *>; 6049 ExprPtrTy E; 6050 TSIPtrTy TSI; 6051 bool Selected; 6052 AssociationTy(ExprPtrTy E, TSIPtrTy TSI, bool Selected) 6053 : E(E), TSI(TSI), Selected(Selected) {} 6054 6055 public: 6056 ExprPtrTy getAssociationExpr() const { return E; } 6057 TSIPtrTy getTypeSourceInfo() const { return TSI; } 6058 QualType getType() const { return TSI ? TSI->getType() : QualType(); } 6059 bool isSelected() const { return Selected; } 6060 AssociationTy *operator->() { return this; } 6061 const AssociationTy *operator->() const { return this; } 6062 }; // class AssociationTy 6063 6064 /// Iterator over const and non-const Association objects. The Association 6065 /// objects are created on the fly when the iterator is dereferenced. 6066 /// This abstract over how exactly the association expressions and the 6067 /// corresponding TypeSourceInfo * are stored. 6068 template <bool Const> 6069 class AssociationIteratorTy 6070 : public llvm::iterator_facade_base< 6071 AssociationIteratorTy<Const>, std::input_iterator_tag, 6072 AssociationTy<Const>, std::ptrdiff_t, AssociationTy<Const>, 6073 AssociationTy<Const>> { 6074 friend class GenericSelectionExpr; 6075 // FIXME: This iterator could conceptually be a random access iterator, and 6076 // it would be nice if we could strengthen the iterator category someday. 6077 // However this iterator does not satisfy two requirements of forward 6078 // iterators: 6079 // a) reference = T& or reference = const T& 6080 // b) If It1 and It2 are both dereferenceable, then It1 == It2 if and only 6081 // if *It1 and *It2 are bound to the same objects. 6082 // An alternative design approach was discussed during review; 6083 // store an Association object inside the iterator, and return a reference 6084 // to it when dereferenced. This idea was discarded because of nasty 6085 // lifetime issues: 6086 // AssociationIterator It = ...; 6087 // const Association &Assoc = *It++; // Oops, Assoc is dangling. 6088 using BaseTy = typename AssociationIteratorTy::iterator_facade_base; 6089 using StmtPtrPtrTy = 6090 std::conditional_t<Const, const Stmt *const *, Stmt **>; 6091 using TSIPtrPtrTy = std::conditional_t<Const, const TypeSourceInfo *const *, 6092 TypeSourceInfo **>; 6093 StmtPtrPtrTy E = nullptr; 6094 TSIPtrPtrTy TSI; // Kept in sync with E. 6095 unsigned Offset = 0, SelectedOffset = 0; 6096 AssociationIteratorTy(StmtPtrPtrTy E, TSIPtrPtrTy TSI, unsigned Offset, 6097 unsigned SelectedOffset) 6098 : E(E), TSI(TSI), Offset(Offset), SelectedOffset(SelectedOffset) {} 6099 6100 public: 6101 AssociationIteratorTy() : E(nullptr), TSI(nullptr) {} 6102 typename BaseTy::reference operator*() const { 6103 return AssociationTy<Const>(cast<Expr>(*E), *TSI, 6104 Offset == SelectedOffset); 6105 } 6106 typename BaseTy::pointer operator->() const { return **this; } 6107 using BaseTy::operator++; 6108 AssociationIteratorTy &operator++() { 6109 ++E; 6110 ++TSI; 6111 ++Offset; 6112 return *this; 6113 } 6114 bool operator==(AssociationIteratorTy Other) const { return E == Other.E; } 6115 }; // class AssociationIterator 6116 6117 /// Build a non-result-dependent generic selection expression accepting an 6118 /// expression predicate. 6119 GenericSelectionExpr(const ASTContext &Context, SourceLocation GenericLoc, 6120 Expr *ControllingExpr, 6121 ArrayRef<TypeSourceInfo *> AssocTypes, 6122 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, 6123 SourceLocation RParenLoc, 6124 bool ContainsUnexpandedParameterPack, 6125 unsigned ResultIndex); 6126 6127 /// Build a result-dependent generic selection expression accepting an 6128 /// expression predicate. 6129 GenericSelectionExpr(const ASTContext &Context, SourceLocation GenericLoc, 6130 Expr *ControllingExpr, 6131 ArrayRef<TypeSourceInfo *> AssocTypes, 6132 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, 6133 SourceLocation RParenLoc, 6134 bool ContainsUnexpandedParameterPack); 6135 6136 /// Build a non-result-dependent generic selection expression accepting a 6137 /// type predicate. 6138 GenericSelectionExpr(const ASTContext &Context, SourceLocation GenericLoc, 6139 TypeSourceInfo *ControllingType, 6140 ArrayRef<TypeSourceInfo *> AssocTypes, 6141 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, 6142 SourceLocation RParenLoc, 6143 bool ContainsUnexpandedParameterPack, 6144 unsigned ResultIndex); 6145 6146 /// Build a result-dependent generic selection expression accepting a type 6147 /// predicate. 6148 GenericSelectionExpr(const ASTContext &Context, SourceLocation GenericLoc, 6149 TypeSourceInfo *ControllingType, 6150 ArrayRef<TypeSourceInfo *> AssocTypes, 6151 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, 6152 SourceLocation RParenLoc, 6153 bool ContainsUnexpandedParameterPack); 6154 6155 /// Build an empty generic selection expression for deserialization. 6156 explicit GenericSelectionExpr(EmptyShell Empty, unsigned NumAssocs); 6157 6158 public: 6159 /// Create a non-result-dependent generic selection expression accepting an 6160 /// expression predicate. 6161 static GenericSelectionExpr * 6162 Create(const ASTContext &Context, SourceLocation GenericLoc, 6163 Expr *ControllingExpr, ArrayRef<TypeSourceInfo *> AssocTypes, 6164 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, 6165 SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, 6166 unsigned ResultIndex); 6167 6168 /// Create a result-dependent generic selection expression accepting an 6169 /// expression predicate. 6170 static GenericSelectionExpr * 6171 Create(const ASTContext &Context, SourceLocation GenericLoc, 6172 Expr *ControllingExpr, ArrayRef<TypeSourceInfo *> AssocTypes, 6173 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, 6174 SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack); 6175 6176 /// Create a non-result-dependent generic selection expression accepting a 6177 /// type predicate. 6178 static GenericSelectionExpr * 6179 Create(const ASTContext &Context, SourceLocation GenericLoc, 6180 TypeSourceInfo *ControllingType, ArrayRef<TypeSourceInfo *> AssocTypes, 6181 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, 6182 SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, 6183 unsigned ResultIndex); 6184 6185 /// Create a result-dependent generic selection expression accepting a type 6186 /// predicate 6187 static GenericSelectionExpr * 6188 Create(const ASTContext &Context, SourceLocation GenericLoc, 6189 TypeSourceInfo *ControllingType, ArrayRef<TypeSourceInfo *> AssocTypes, 6190 ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, 6191 SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack); 6192 6193 /// Create an empty generic selection expression for deserialization. 6194 static GenericSelectionExpr *CreateEmpty(const ASTContext &Context, 6195 unsigned NumAssocs); 6196 6197 using Association = AssociationTy<false>; 6198 using ConstAssociation = AssociationTy<true>; 6199 using AssociationIterator = AssociationIteratorTy<false>; 6200 using ConstAssociationIterator = AssociationIteratorTy<true>; 6201 using association_range = llvm::iterator_range<AssociationIterator>; 6202 using const_association_range = 6203 llvm::iterator_range<ConstAssociationIterator>; 6204 6205 /// The number of association expressions. 6206 unsigned getNumAssocs() const { return NumAssocs; } 6207 6208 /// The zero-based index of the result expression's generic association in 6209 /// the generic selection's association list. Defined only if the 6210 /// generic selection is not result-dependent. 6211 unsigned getResultIndex() const { 6212 assert(!isResultDependent() && 6213 "Generic selection is result-dependent but getResultIndex called!"); 6214 return ResultIndex; 6215 } 6216 6217 /// Whether this generic selection is result-dependent. 6218 bool isResultDependent() const { return ResultIndex == ResultDependentIndex; } 6219 6220 /// Whether this generic selection uses an expression as its controlling 6221 /// argument. 6222 bool isExprPredicate() const { return IsExprPredicate; } 6223 /// Whether this generic selection uses a type as its controlling argument. 6224 bool isTypePredicate() const { return !IsExprPredicate; } 6225 6226 /// Return the controlling expression of this generic selection expression. 6227 /// Only valid to call if the selection expression used an expression as its 6228 /// controlling argument. 6229 Expr *getControllingExpr() { 6230 return cast<Expr>( 6231 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()]); 6232 } 6233 const Expr *getControllingExpr() const { 6234 return cast<Expr>( 6235 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()]); 6236 } 6237 6238 /// Return the controlling type of this generic selection expression. Only 6239 /// valid to call if the selection expression used a type as its controlling 6240 /// argument. 6241 TypeSourceInfo *getControllingType() { 6242 return getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()]; 6243 } 6244 const TypeSourceInfo* getControllingType() const { 6245 return getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()]; 6246 } 6247 6248 /// Return the result expression of this controlling expression. Defined if 6249 /// and only if the generic selection expression is not result-dependent. 6250 Expr *getResultExpr() { 6251 return cast<Expr>( 6252 getTrailingObjects<Stmt *>()[getIndexOfStartOfAssociatedExprs() + 6253 getResultIndex()]); 6254 } 6255 const Expr *getResultExpr() const { 6256 return cast<Expr>( 6257 getTrailingObjects<Stmt *>()[getIndexOfStartOfAssociatedExprs() + 6258 getResultIndex()]); 6259 } 6260 6261 ArrayRef<Expr *> getAssocExprs() const { 6262 return {reinterpret_cast<Expr *const *>(getTrailingObjects<Stmt *>() + 6263 getIndexOfStartOfAssociatedExprs()), 6264 NumAssocs}; 6265 } 6266 ArrayRef<TypeSourceInfo *> getAssocTypeSourceInfos() const { 6267 return {getTrailingObjects<TypeSourceInfo *>() + 6268 getIndexOfStartOfAssociatedTypes(), 6269 NumAssocs}; 6270 } 6271 6272 /// Return the Ith association expression with its TypeSourceInfo, 6273 /// bundled together in GenericSelectionExpr::(Const)Association. 6274 Association getAssociation(unsigned I) { 6275 assert(I < getNumAssocs() && 6276 "Out-of-range index in GenericSelectionExpr::getAssociation!"); 6277 return Association( 6278 cast<Expr>( 6279 getTrailingObjects<Stmt *>()[getIndexOfStartOfAssociatedExprs() + 6280 I]), 6281 getTrailingObjects< 6282 TypeSourceInfo *>()[getIndexOfStartOfAssociatedTypes() + I], 6283 !isResultDependent() && (getResultIndex() == I)); 6284 } 6285 ConstAssociation getAssociation(unsigned I) const { 6286 assert(I < getNumAssocs() && 6287 "Out-of-range index in GenericSelectionExpr::getAssociation!"); 6288 return ConstAssociation( 6289 cast<Expr>( 6290 getTrailingObjects<Stmt *>()[getIndexOfStartOfAssociatedExprs() + 6291 I]), 6292 getTrailingObjects< 6293 TypeSourceInfo *>()[getIndexOfStartOfAssociatedTypes() + I], 6294 !isResultDependent() && (getResultIndex() == I)); 6295 } 6296 6297 association_range associations() { 6298 AssociationIterator Begin(getTrailingObjects<Stmt *>() + 6299 getIndexOfStartOfAssociatedExprs(), 6300 getTrailingObjects<TypeSourceInfo *>() + 6301 getIndexOfStartOfAssociatedTypes(), 6302 /*Offset=*/0, ResultIndex); 6303 AssociationIterator End(Begin.E + NumAssocs, Begin.TSI + NumAssocs, 6304 /*Offset=*/NumAssocs, ResultIndex); 6305 return llvm::make_range(Begin, End); 6306 } 6307 6308 const_association_range associations() const { 6309 ConstAssociationIterator Begin(getTrailingObjects<Stmt *>() + 6310 getIndexOfStartOfAssociatedExprs(), 6311 getTrailingObjects<TypeSourceInfo *>() + 6312 getIndexOfStartOfAssociatedTypes(), 6313 /*Offset=*/0, ResultIndex); 6314 ConstAssociationIterator End(Begin.E + NumAssocs, Begin.TSI + NumAssocs, 6315 /*Offset=*/NumAssocs, ResultIndex); 6316 return llvm::make_range(Begin, End); 6317 } 6318 6319 SourceLocation getGenericLoc() const { 6320 return GenericSelectionExprBits.GenericLoc; 6321 } 6322 SourceLocation getDefaultLoc() const { return DefaultLoc; } 6323 SourceLocation getRParenLoc() const { return RParenLoc; } 6324 SourceLocation getBeginLoc() const { return getGenericLoc(); } 6325 SourceLocation getEndLoc() const { return getRParenLoc(); } 6326 6327 static bool classof(const Stmt *T) { 6328 return T->getStmtClass() == GenericSelectionExprClass; 6329 } 6330 6331 child_range children() { 6332 return child_range(getTrailingObjects<Stmt *>(), 6333 getTrailingObjects<Stmt *>() + 6334 numTrailingObjects(OverloadToken<Stmt *>())); 6335 } 6336 const_child_range children() const { 6337 return const_child_range(getTrailingObjects<Stmt *>(), 6338 getTrailingObjects<Stmt *>() + 6339 numTrailingObjects(OverloadToken<Stmt *>())); 6340 } 6341 }; 6342 6343 //===----------------------------------------------------------------------===// 6344 // Clang Extensions 6345 //===----------------------------------------------------------------------===// 6346 6347 /// ExtVectorElementExpr - This represents access to specific elements of a 6348 /// vector, and may occur on the left hand side or right hand side. For example 6349 /// the following is legal: "V.xy = V.zw" if V is a 4 element extended vector. 6350 /// 6351 /// Note that the base may have either vector or pointer to vector type, just 6352 /// like a struct field reference. 6353 /// 6354 class ExtVectorElementExpr : public Expr { 6355 Stmt *Base; 6356 IdentifierInfo *Accessor; 6357 SourceLocation AccessorLoc; 6358 public: 6359 ExtVectorElementExpr(QualType ty, ExprValueKind VK, Expr *base, 6360 IdentifierInfo &accessor, SourceLocation loc) 6361 : Expr(ExtVectorElementExprClass, ty, VK, 6362 (VK == VK_PRValue ? OK_Ordinary : OK_VectorComponent)), 6363 Base(base), Accessor(&accessor), AccessorLoc(loc) { 6364 setDependence(computeDependence(this)); 6365 } 6366 6367 /// Build an empty vector element expression. 6368 explicit ExtVectorElementExpr(EmptyShell Empty) 6369 : Expr(ExtVectorElementExprClass, Empty) { } 6370 6371 const Expr *getBase() const { return cast<Expr>(Base); } 6372 Expr *getBase() { return cast<Expr>(Base); } 6373 void setBase(Expr *E) { Base = E; } 6374 6375 IdentifierInfo &getAccessor() const { return *Accessor; } 6376 void setAccessor(IdentifierInfo *II) { Accessor = II; } 6377 6378 SourceLocation getAccessorLoc() const { return AccessorLoc; } 6379 void setAccessorLoc(SourceLocation L) { AccessorLoc = L; } 6380 6381 /// getNumElements - Get the number of components being selected. 6382 unsigned getNumElements() const; 6383 6384 /// containsDuplicateElements - Return true if any element access is 6385 /// repeated. 6386 bool containsDuplicateElements() const; 6387 6388 /// getEncodedElementAccess - Encode the elements accessed into an llvm 6389 /// aggregate Constant of ConstantInt(s). 6390 void getEncodedElementAccess(SmallVectorImpl<uint32_t> &Elts) const; 6391 6392 SourceLocation getBeginLoc() const LLVM_READONLY { 6393 return getBase()->getBeginLoc(); 6394 } 6395 SourceLocation getEndLoc() const LLVM_READONLY { return AccessorLoc; } 6396 6397 /// isArrow - Return true if the base expression is a pointer to vector, 6398 /// return false if the base expression is a vector. 6399 bool isArrow() const; 6400 6401 static bool classof(const Stmt *T) { 6402 return T->getStmtClass() == ExtVectorElementExprClass; 6403 } 6404 6405 // Iterators 6406 child_range children() { return child_range(&Base, &Base+1); } 6407 const_child_range children() const { 6408 return const_child_range(&Base, &Base + 1); 6409 } 6410 }; 6411 6412 /// BlockExpr - Adaptor class for mixing a BlockDecl with expressions. 6413 /// ^{ statement-body } or ^(int arg1, float arg2){ statement-body } 6414 class BlockExpr : public Expr { 6415 protected: 6416 BlockDecl *TheBlock; 6417 public: 6418 BlockExpr(BlockDecl *BD, QualType ty, bool ContainsUnexpandedParameterPack) 6419 : Expr(BlockExprClass, ty, VK_PRValue, OK_Ordinary), TheBlock(BD) { 6420 setDependence(computeDependence(this, ContainsUnexpandedParameterPack)); 6421 } 6422 6423 /// Build an empty block expression. 6424 explicit BlockExpr(EmptyShell Empty) : Expr(BlockExprClass, Empty) { } 6425 6426 const BlockDecl *getBlockDecl() const { return TheBlock; } 6427 BlockDecl *getBlockDecl() { return TheBlock; } 6428 void setBlockDecl(BlockDecl *BD) { TheBlock = BD; } 6429 6430 // Convenience functions for probing the underlying BlockDecl. 6431 SourceLocation getCaretLocation() const; 6432 const Stmt *getBody() const; 6433 Stmt *getBody(); 6434 6435 SourceLocation getBeginLoc() const LLVM_READONLY { 6436 return getCaretLocation(); 6437 } 6438 SourceLocation getEndLoc() const LLVM_READONLY { 6439 return getBody()->getEndLoc(); 6440 } 6441 6442 /// getFunctionType - Return the underlying function type for this block. 6443 const FunctionProtoType *getFunctionType() const; 6444 6445 static bool classof(const Stmt *T) { 6446 return T->getStmtClass() == BlockExprClass; 6447 } 6448 6449 // Iterators 6450 child_range children() { 6451 return child_range(child_iterator(), child_iterator()); 6452 } 6453 const_child_range children() const { 6454 return const_child_range(const_child_iterator(), const_child_iterator()); 6455 } 6456 }; 6457 6458 /// Copy initialization expr of a __block variable and a boolean flag that 6459 /// indicates whether the expression can throw. 6460 struct BlockVarCopyInit { 6461 BlockVarCopyInit() = default; 6462 BlockVarCopyInit(Expr *CopyExpr, bool CanThrow) 6463 : ExprAndFlag(CopyExpr, CanThrow) {} 6464 void setExprAndFlag(Expr *CopyExpr, bool CanThrow) { 6465 ExprAndFlag.setPointerAndInt(CopyExpr, CanThrow); 6466 } 6467 Expr *getCopyExpr() const { return ExprAndFlag.getPointer(); } 6468 bool canThrow() const { return ExprAndFlag.getInt(); } 6469 llvm::PointerIntPair<Expr *, 1, bool> ExprAndFlag; 6470 }; 6471 6472 /// AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] 6473 /// This AST node provides support for reinterpreting a type to another 6474 /// type of the same size. 6475 class AsTypeExpr : public Expr { 6476 private: 6477 Stmt *SrcExpr; 6478 SourceLocation BuiltinLoc, RParenLoc; 6479 6480 friend class ASTReader; 6481 friend class ASTStmtReader; 6482 explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {} 6483 6484 public: 6485 AsTypeExpr(Expr *SrcExpr, QualType DstType, ExprValueKind VK, 6486 ExprObjectKind OK, SourceLocation BuiltinLoc, 6487 SourceLocation RParenLoc) 6488 : Expr(AsTypeExprClass, DstType, VK, OK), SrcExpr(SrcExpr), 6489 BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) { 6490 setDependence(computeDependence(this)); 6491 } 6492 6493 /// getSrcExpr - Return the Expr to be converted. 6494 Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); } 6495 6496 /// getBuiltinLoc - Return the location of the __builtin_astype token. 6497 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 6498 6499 /// getRParenLoc - Return the location of final right parenthesis. 6500 SourceLocation getRParenLoc() const { return RParenLoc; } 6501 6502 SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } 6503 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } 6504 6505 static bool classof(const Stmt *T) { 6506 return T->getStmtClass() == AsTypeExprClass; 6507 } 6508 6509 // Iterators 6510 child_range children() { return child_range(&SrcExpr, &SrcExpr+1); } 6511 const_child_range children() const { 6512 return const_child_range(&SrcExpr, &SrcExpr + 1); 6513 } 6514 }; 6515 6516 /// PseudoObjectExpr - An expression which accesses a pseudo-object 6517 /// l-value. A pseudo-object is an abstract object, accesses to which 6518 /// are translated to calls. The pseudo-object expression has a 6519 /// syntactic form, which shows how the expression was actually 6520 /// written in the source code, and a semantic form, which is a series 6521 /// of expressions to be executed in order which detail how the 6522 /// operation is actually evaluated. Optionally, one of the semantic 6523 /// forms may also provide a result value for the expression. 6524 /// 6525 /// If any of the semantic-form expressions is an OpaqueValueExpr, 6526 /// that OVE is required to have a source expression, and it is bound 6527 /// to the result of that source expression. Such OVEs may appear 6528 /// only in subsequent semantic-form expressions and as 6529 /// sub-expressions of the syntactic form. 6530 /// 6531 /// PseudoObjectExpr should be used only when an operation can be 6532 /// usefully described in terms of fairly simple rewrite rules on 6533 /// objects and functions that are meant to be used by end-developers. 6534 /// For example, under the Itanium ABI, dynamic casts are implemented 6535 /// as a call to a runtime function called __dynamic_cast; using this 6536 /// class to describe that would be inappropriate because that call is 6537 /// not really part of the user-visible semantics, and instead the 6538 /// cast is properly reflected in the AST and IR-generation has been 6539 /// taught to generate the call as necessary. In contrast, an 6540 /// Objective-C property access is semantically defined to be 6541 /// equivalent to a particular message send, and this is very much 6542 /// part of the user model. The name of this class encourages this 6543 /// modelling design. 6544 class PseudoObjectExpr final 6545 : public Expr, 6546 private llvm::TrailingObjects<PseudoObjectExpr, Expr *> { 6547 // PseudoObjectExprBits.NumSubExprs - The number of sub-expressions. 6548 // Always at least two, because the first sub-expression is the 6549 // syntactic form. 6550 6551 // PseudoObjectExprBits.ResultIndex - The index of the 6552 // sub-expression holding the result. 0 means the result is void, 6553 // which is unambiguous because it's the index of the syntactic 6554 // form. Note that this is therefore 1 higher than the value passed 6555 // in to Create, which is an index within the semantic forms. 6556 // Note also that ASTStmtWriter assumes this encoding. 6557 6558 Expr **getSubExprsBuffer() { return getTrailingObjects<Expr *>(); } 6559 const Expr * const *getSubExprsBuffer() const { 6560 return getTrailingObjects<Expr *>(); 6561 } 6562 6563 PseudoObjectExpr(QualType type, ExprValueKind VK, 6564 Expr *syntactic, ArrayRef<Expr*> semantic, 6565 unsigned resultIndex); 6566 6567 PseudoObjectExpr(EmptyShell shell, unsigned numSemanticExprs); 6568 6569 unsigned getNumSubExprs() const { 6570 return PseudoObjectExprBits.NumSubExprs; 6571 } 6572 6573 public: 6574 /// NoResult - A value for the result index indicating that there is 6575 /// no semantic result. 6576 enum : unsigned { NoResult = ~0U }; 6577 6578 static PseudoObjectExpr *Create(const ASTContext &Context, Expr *syntactic, 6579 ArrayRef<Expr*> semantic, 6580 unsigned resultIndex); 6581 6582 static PseudoObjectExpr *Create(const ASTContext &Context, EmptyShell shell, 6583 unsigned numSemanticExprs); 6584 6585 /// Return the syntactic form of this expression, i.e. the 6586 /// expression it actually looks like. Likely to be expressed in 6587 /// terms of OpaqueValueExprs bound in the semantic form. 6588 Expr *getSyntacticForm() { return getSubExprsBuffer()[0]; } 6589 const Expr *getSyntacticForm() const { return getSubExprsBuffer()[0]; } 6590 6591 /// Return the index of the result-bearing expression into the semantics 6592 /// expressions, or PseudoObjectExpr::NoResult if there is none. 6593 unsigned getResultExprIndex() const { 6594 if (PseudoObjectExprBits.ResultIndex == 0) return NoResult; 6595 return PseudoObjectExprBits.ResultIndex - 1; 6596 } 6597 6598 /// Return the result-bearing expression, or null if there is none. 6599 Expr *getResultExpr() { 6600 if (PseudoObjectExprBits.ResultIndex == 0) 6601 return nullptr; 6602 return getSubExprsBuffer()[PseudoObjectExprBits.ResultIndex]; 6603 } 6604 const Expr *getResultExpr() const { 6605 return const_cast<PseudoObjectExpr*>(this)->getResultExpr(); 6606 } 6607 6608 unsigned getNumSemanticExprs() const { return getNumSubExprs() - 1; } 6609 6610 typedef Expr * const *semantics_iterator; 6611 typedef const Expr * const *const_semantics_iterator; 6612 semantics_iterator semantics_begin() { 6613 return getSubExprsBuffer() + 1; 6614 } 6615 const_semantics_iterator semantics_begin() const { 6616 return getSubExprsBuffer() + 1; 6617 } 6618 semantics_iterator semantics_end() { 6619 return getSubExprsBuffer() + getNumSubExprs(); 6620 } 6621 const_semantics_iterator semantics_end() const { 6622 return getSubExprsBuffer() + getNumSubExprs(); 6623 } 6624 6625 ArrayRef<Expr*> semantics() { 6626 return ArrayRef(semantics_begin(), semantics_end()); 6627 } 6628 ArrayRef<const Expr*> semantics() const { 6629 return ArrayRef(semantics_begin(), semantics_end()); 6630 } 6631 6632 Expr *getSemanticExpr(unsigned index) { 6633 assert(index + 1 < getNumSubExprs()); 6634 return getSubExprsBuffer()[index + 1]; 6635 } 6636 const Expr *getSemanticExpr(unsigned index) const { 6637 return const_cast<PseudoObjectExpr*>(this)->getSemanticExpr(index); 6638 } 6639 6640 SourceLocation getExprLoc() const LLVM_READONLY { 6641 return getSyntacticForm()->getExprLoc(); 6642 } 6643 6644 SourceLocation getBeginLoc() const LLVM_READONLY { 6645 return getSyntacticForm()->getBeginLoc(); 6646 } 6647 SourceLocation getEndLoc() const LLVM_READONLY { 6648 return getSyntacticForm()->getEndLoc(); 6649 } 6650 6651 child_range children() { 6652 const_child_range CCR = 6653 const_cast<const PseudoObjectExpr *>(this)->children(); 6654 return child_range(cast_away_const(CCR.begin()), 6655 cast_away_const(CCR.end())); 6656 } 6657 const_child_range children() const { 6658 Stmt *const *cs = const_cast<Stmt *const *>( 6659 reinterpret_cast<const Stmt *const *>(getSubExprsBuffer())); 6660 return const_child_range(cs, cs + getNumSubExprs()); 6661 } 6662 6663 static bool classof(const Stmt *T) { 6664 return T->getStmtClass() == PseudoObjectExprClass; 6665 } 6666 6667 friend TrailingObjects; 6668 friend class ASTStmtReader; 6669 }; 6670 6671 /// AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, 6672 /// __atomic_load, __atomic_store, and __atomic_compare_exchange_*, for the 6673 /// similarly-named C++11 instructions, and __c11 variants for <stdatomic.h>, 6674 /// and corresponding __opencl_atomic_* for OpenCL 2.0. 6675 /// All of these instructions take one primary pointer, at least one memory 6676 /// order. The instructions for which getScopeModel returns non-null value 6677 /// take one synch scope. 6678 class AtomicExpr : public Expr { 6679 public: 6680 enum AtomicOp { 6681 #define BUILTIN(ID, TYPE, ATTRS) 6682 #define ATOMIC_BUILTIN(ID, TYPE, ATTRS) AO ## ID, 6683 #include "clang/Basic/Builtins.inc" 6684 // Avoid trailing comma 6685 BI_First = 0 6686 }; 6687 6688 private: 6689 /// Location of sub-expressions. 6690 /// The location of Scope sub-expression is NumSubExprs - 1, which is 6691 /// not fixed, therefore is not defined in enum. 6692 enum { PTR, ORDER, VAL1, ORDER_FAIL, VAL2, WEAK, END_EXPR }; 6693 Stmt *SubExprs[END_EXPR + 1]; 6694 unsigned NumSubExprs; 6695 SourceLocation BuiltinLoc, RParenLoc; 6696 AtomicOp Op; 6697 6698 friend class ASTStmtReader; 6699 public: 6700 AtomicExpr(SourceLocation BLoc, ArrayRef<Expr*> args, QualType t, 6701 AtomicOp op, SourceLocation RP); 6702 6703 /// Determine the number of arguments the specified atomic builtin 6704 /// should have. 6705 static unsigned getNumSubExprs(AtomicOp Op); 6706 6707 /// Build an empty AtomicExpr. 6708 explicit AtomicExpr(EmptyShell Empty) : Expr(AtomicExprClass, Empty) { } 6709 6710 Expr *getPtr() const { 6711 return cast<Expr>(SubExprs[PTR]); 6712 } 6713 Expr *getOrder() const { 6714 return cast<Expr>(SubExprs[ORDER]); 6715 } 6716 Expr *getScope() const { 6717 assert(getScopeModel() && "No scope"); 6718 return cast<Expr>(SubExprs[NumSubExprs - 1]); 6719 } 6720 Expr *getVal1() const { 6721 if (Op == AO__c11_atomic_init || Op == AO__opencl_atomic_init) 6722 return cast<Expr>(SubExprs[ORDER]); 6723 assert(NumSubExprs > VAL1); 6724 return cast<Expr>(SubExprs[VAL1]); 6725 } 6726 Expr *getOrderFail() const { 6727 assert(NumSubExprs > ORDER_FAIL); 6728 return cast<Expr>(SubExprs[ORDER_FAIL]); 6729 } 6730 Expr *getVal2() const { 6731 if (Op == AO__atomic_exchange || Op == AO__scoped_atomic_exchange) 6732 return cast<Expr>(SubExprs[ORDER_FAIL]); 6733 assert(NumSubExprs > VAL2); 6734 return cast<Expr>(SubExprs[VAL2]); 6735 } 6736 Expr *getWeak() const { 6737 assert(NumSubExprs > WEAK); 6738 return cast<Expr>(SubExprs[WEAK]); 6739 } 6740 QualType getValueType() const; 6741 6742 AtomicOp getOp() const { return Op; } 6743 StringRef getOpAsString() const { 6744 switch (Op) { 6745 #define BUILTIN(ID, TYPE, ATTRS) 6746 #define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \ 6747 case AO##ID: \ 6748 return #ID; 6749 #include "clang/Basic/Builtins.inc" 6750 } 6751 llvm_unreachable("not an atomic operator?"); 6752 } 6753 unsigned getNumSubExprs() const { return NumSubExprs; } 6754 6755 Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); } 6756 const Expr * const *getSubExprs() const { 6757 return reinterpret_cast<Expr * const *>(SubExprs); 6758 } 6759 6760 bool isVolatile() const { 6761 return getPtr()->getType()->getPointeeType().isVolatileQualified(); 6762 } 6763 6764 bool isCmpXChg() const { 6765 return getOp() == AO__c11_atomic_compare_exchange_strong || 6766 getOp() == AO__c11_atomic_compare_exchange_weak || 6767 getOp() == AO__hip_atomic_compare_exchange_strong || 6768 getOp() == AO__opencl_atomic_compare_exchange_strong || 6769 getOp() == AO__opencl_atomic_compare_exchange_weak || 6770 getOp() == AO__hip_atomic_compare_exchange_weak || 6771 getOp() == AO__atomic_compare_exchange || 6772 getOp() == AO__atomic_compare_exchange_n || 6773 getOp() == AO__scoped_atomic_compare_exchange || 6774 getOp() == AO__scoped_atomic_compare_exchange_n; 6775 } 6776 6777 bool isOpenCL() const { 6778 return getOp() >= AO__opencl_atomic_compare_exchange_strong && 6779 getOp() <= AO__opencl_atomic_store; 6780 } 6781 6782 bool isHIP() const { 6783 return Op >= AO__hip_atomic_compare_exchange_strong && 6784 Op <= AO__hip_atomic_store; 6785 } 6786 6787 /// Return true if atomics operations targeting allocations in private memory 6788 /// are undefined. 6789 bool threadPrivateMemoryAtomicsAreUndefined() const { 6790 return isOpenCL() || isHIP(); 6791 } 6792 6793 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 6794 SourceLocation getRParenLoc() const { return RParenLoc; } 6795 6796 SourceLocation getBeginLoc() const LLVM_READONLY { return BuiltinLoc; } 6797 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } 6798 6799 static bool classof(const Stmt *T) { 6800 return T->getStmtClass() == AtomicExprClass; 6801 } 6802 6803 // Iterators 6804 child_range children() { 6805 return child_range(SubExprs, SubExprs+NumSubExprs); 6806 } 6807 const_child_range children() const { 6808 return const_child_range(SubExprs, SubExprs + NumSubExprs); 6809 } 6810 6811 /// Get atomic scope model for the atomic op code. 6812 /// \return empty atomic scope model if the atomic op code does not have 6813 /// scope operand. 6814 static std::unique_ptr<AtomicScopeModel> getScopeModel(AtomicOp Op) { 6815 // FIXME: Allow grouping of builtins to be able to only check >= and <= 6816 if (Op >= AO__opencl_atomic_compare_exchange_strong && 6817 Op <= AO__opencl_atomic_store && Op != AO__opencl_atomic_init) 6818 return AtomicScopeModel::create(AtomicScopeModelKind::OpenCL); 6819 if (Op >= AO__hip_atomic_compare_exchange_strong && 6820 Op <= AO__hip_atomic_store) 6821 return AtomicScopeModel::create(AtomicScopeModelKind::HIP); 6822 if (Op >= AO__scoped_atomic_add_fetch && Op <= AO__scoped_atomic_xor_fetch) 6823 return AtomicScopeModel::create(AtomicScopeModelKind::Generic); 6824 return AtomicScopeModel::create(AtomicScopeModelKind::None); 6825 } 6826 6827 /// Get atomic scope model. 6828 /// \return empty atomic scope model if this atomic expression does not have 6829 /// scope operand. 6830 std::unique_ptr<AtomicScopeModel> getScopeModel() const { 6831 return getScopeModel(getOp()); 6832 } 6833 }; 6834 6835 /// TypoExpr - Internal placeholder for expressions where typo correction 6836 /// still needs to be performed and/or an error diagnostic emitted. 6837 class TypoExpr : public Expr { 6838 // The location for the typo name. 6839 SourceLocation TypoLoc; 6840 6841 public: 6842 TypoExpr(QualType T, SourceLocation TypoLoc) 6843 : Expr(TypoExprClass, T, VK_LValue, OK_Ordinary), TypoLoc(TypoLoc) { 6844 assert(T->isDependentType() && "TypoExpr given a non-dependent type"); 6845 setDependence(ExprDependence::TypeValueInstantiation | 6846 ExprDependence::Error); 6847 } 6848 6849 child_range children() { 6850 return child_range(child_iterator(), child_iterator()); 6851 } 6852 const_child_range children() const { 6853 return const_child_range(const_child_iterator(), const_child_iterator()); 6854 } 6855 6856 SourceLocation getBeginLoc() const LLVM_READONLY { return TypoLoc; } 6857 SourceLocation getEndLoc() const LLVM_READONLY { return TypoLoc; } 6858 6859 static bool classof(const Stmt *T) { 6860 return T->getStmtClass() == TypoExprClass; 6861 } 6862 6863 }; 6864 6865 /// This class represents BOTH the OpenMP Array Section and OpenACC 'subarray', 6866 /// with a boolean differentiator. 6867 /// OpenMP 5.0 [2.1.5, Array Sections]. 6868 /// To specify an array section in an OpenMP construct, array subscript 6869 /// expressions are extended with the following syntax: 6870 /// \code 6871 /// [ lower-bound : length : stride ] 6872 /// [ lower-bound : length : ] 6873 /// [ lower-bound : length ] 6874 /// [ lower-bound : : stride ] 6875 /// [ lower-bound : : ] 6876 /// [ lower-bound : ] 6877 /// [ : length : stride ] 6878 /// [ : length : ] 6879 /// [ : length ] 6880 /// [ : : stride ] 6881 /// [ : : ] 6882 /// [ : ] 6883 /// \endcode 6884 /// The array section must be a subset of the original array. 6885 /// Array sections are allowed on multidimensional arrays. Base language array 6886 /// subscript expressions can be used to specify length-one dimensions of 6887 /// multidimensional array sections. 6888 /// Each of the lower-bound, length, and stride expressions if specified must be 6889 /// an integral type expressions of the base language. When evaluated 6890 /// they represent a set of integer values as follows: 6891 /// \code 6892 /// { lower-bound, lower-bound + stride, lower-bound + 2 * stride,... , 6893 /// lower-bound + ((length - 1) * stride) } 6894 /// \endcode 6895 /// The lower-bound and length must evaluate to non-negative integers. 6896 /// The stride must evaluate to a positive integer. 6897 /// When the size of the array dimension is not known, the length must be 6898 /// specified explicitly. 6899 /// When the stride is absent it defaults to 1. 6900 /// When the length is absent it defaults to ⌈(size − lower-bound)/stride⌉, 6901 /// where size is the size of the array dimension. When the lower-bound is 6902 /// absent it defaults to 0. 6903 /// 6904 /// 6905 /// OpenACC 3.3 [2.7.1 Data Specification in Data Clauses] 6906 /// In C and C++, a subarray is an array name followed by an extended array 6907 /// range specification in brackets, with start and length, such as 6908 /// 6909 /// AA[2:n] 6910 /// 6911 /// If the lower bound is missing, zero is used. If the length is missing and 6912 /// the array has known size, the size of the array is used; otherwise the 6913 /// length is required. The subarray AA[2:n] means elements AA[2], AA[3], . . . 6914 /// , AA[2+n-1]. In C and C++, a two dimensional array may be declared in at 6915 /// least four ways: 6916 /// 6917 /// -Statically-sized array: float AA[100][200]; 6918 /// -Pointer to statically sized rows: typedef float row[200]; row* BB; 6919 /// -Statically-sized array of pointers: float* CC[200]; 6920 /// -Pointer to pointers: float** DD; 6921 /// 6922 /// Each dimension may be statically sized, or a pointer to dynamically 6923 /// allocated memory. Each of these may be included in a data clause using 6924 /// subarray notation to specify a rectangular array: 6925 /// 6926 /// -AA[2:n][0:200] 6927 /// -BB[2:n][0:m] 6928 /// -CC[2:n][0:m] 6929 /// -DD[2:n][0:m] 6930 /// 6931 /// Multidimensional rectangular subarrays in C and C++ may be specified for any 6932 /// array with any combination of statically-sized or dynamically-allocated 6933 /// dimensions. For statically sized dimensions, all dimensions except the first 6934 /// must specify the whole extent to preserve the contiguous data restriction, 6935 /// discussed below. For dynamically allocated dimensions, the implementation 6936 /// will allocate pointers in device memory corresponding to the pointers in 6937 /// local memory and will fill in those pointers as appropriate. 6938 /// 6939 /// In Fortran, a subarray is an array name followed by a comma-separated list 6940 /// of range specifications in parentheses, with lower and upper bound 6941 /// subscripts, such as 6942 /// 6943 /// arr(1:high,low:100) 6944 /// 6945 /// If either the lower or upper bounds are missing, the declared or allocated 6946 /// bounds of the array, if known, are used. All dimensions except the last must 6947 /// specify the whole extent, to preserve the contiguous data restriction, 6948 /// discussed below. 6949 /// 6950 /// Restrictions 6951 /// 6952 /// -In Fortran, the upper bound for the last dimension of an assumed-size dummy 6953 /// array must be specified. 6954 /// 6955 /// -In C and C++, the length for dynamically allocated dimensions of an array 6956 /// must be explicitly specified. 6957 /// 6958 /// -In C and C++, modifying pointers in pointer arrays during the data 6959 /// lifetime, either on the host or on the device, may result in undefined 6960 /// behavior. 6961 /// 6962 /// -If a subarray appears in a data clause, the implementation may choose to 6963 /// allocate memory for only that subarray on the accelerator. 6964 /// 6965 /// -In Fortran, array pointers may appear, but pointer association is not 6966 /// preserved in device memory. 6967 /// 6968 /// -Any array or subarray in a data clause, including Fortran array pointers, 6969 /// must be a contiguous section of memory, except for dynamic multidimensional 6970 /// C arrays. 6971 /// 6972 /// -In C and C++, if a variable or array of composite type appears, all the 6973 /// data members of the struct or class are allocated and copied, as 6974 /// appropriate. If a composite member is a pointer type, the data addressed by 6975 /// that pointer are not implicitly copied. 6976 /// 6977 /// -In Fortran, if a variable or array of composite type appears, all the 6978 /// members of that derived type are allocated and copied, as appropriate. If 6979 /// any member has the allocatable or pointer attribute, the data accessed 6980 /// through that member are not copied. 6981 /// 6982 /// -If an expression is used in a subscript or subarray expression in a clause 6983 /// on a data construct, the same value is used when copying data at the end of 6984 /// the data region, even if the values of variables in the expression change 6985 /// during the data region. 6986 class ArraySectionExpr : public Expr { 6987 friend class ASTStmtReader; 6988 friend class ASTStmtWriter; 6989 6990 public: 6991 enum ArraySectionType { OMPArraySection, OpenACCArraySection }; 6992 6993 private: 6994 enum { 6995 BASE, 6996 LOWER_BOUND, 6997 LENGTH, 6998 STRIDE, 6999 END_EXPR, 7000 OPENACC_END_EXPR = STRIDE 7001 }; 7002 7003 ArraySectionType ASType = OMPArraySection; 7004 Stmt *SubExprs[END_EXPR] = {nullptr}; 7005 SourceLocation ColonLocFirst; 7006 SourceLocation ColonLocSecond; 7007 SourceLocation RBracketLoc; 7008 7009 public: 7010 // Constructor for OMP array sections, which include a 'stride'. 7011 ArraySectionExpr(Expr *Base, Expr *LowerBound, Expr *Length, Expr *Stride, 7012 QualType Type, ExprValueKind VK, ExprObjectKind OK, 7013 SourceLocation ColonLocFirst, SourceLocation ColonLocSecond, 7014 SourceLocation RBracketLoc) 7015 : Expr(ArraySectionExprClass, Type, VK, OK), ASType(OMPArraySection), 7016 ColonLocFirst(ColonLocFirst), ColonLocSecond(ColonLocSecond), 7017 RBracketLoc(RBracketLoc) { 7018 setBase(Base); 7019 setLowerBound(LowerBound); 7020 setLength(Length); 7021 setStride(Stride); 7022 setDependence(computeDependence(this)); 7023 } 7024 7025 // Constructor for OpenACC sub-arrays, which do not permit a 'stride'. 7026 ArraySectionExpr(Expr *Base, Expr *LowerBound, Expr *Length, QualType Type, 7027 ExprValueKind VK, ExprObjectKind OK, SourceLocation ColonLoc, 7028 SourceLocation RBracketLoc) 7029 : Expr(ArraySectionExprClass, Type, VK, OK), ASType(OpenACCArraySection), 7030 ColonLocFirst(ColonLoc), RBracketLoc(RBracketLoc) { 7031 setBase(Base); 7032 setLowerBound(LowerBound); 7033 setLength(Length); 7034 setDependence(computeDependence(this)); 7035 } 7036 7037 /// Create an empty array section expression. 7038 explicit ArraySectionExpr(EmptyShell Shell) 7039 : Expr(ArraySectionExprClass, Shell) {} 7040 7041 /// Return original type of the base expression for array section. 7042 static QualType getBaseOriginalType(const Expr *Base); 7043 7044 static bool classof(const Stmt *T) { 7045 return T->getStmtClass() == ArraySectionExprClass; 7046 } 7047 7048 bool isOMPArraySection() const { return ASType == OMPArraySection; } 7049 bool isOpenACCArraySection() const { return ASType == OpenACCArraySection; } 7050 7051 /// Get base of the array section. 7052 Expr *getBase() { return cast<Expr>(SubExprs[BASE]); } 7053 const Expr *getBase() const { return cast<Expr>(SubExprs[BASE]); } 7054 7055 /// Get lower bound of array section. 7056 Expr *getLowerBound() { return cast_or_null<Expr>(SubExprs[LOWER_BOUND]); } 7057 const Expr *getLowerBound() const { 7058 return cast_or_null<Expr>(SubExprs[LOWER_BOUND]); 7059 } 7060 7061 /// Get length of array section. 7062 Expr *getLength() { return cast_or_null<Expr>(SubExprs[LENGTH]); } 7063 const Expr *getLength() const { return cast_or_null<Expr>(SubExprs[LENGTH]); } 7064 7065 /// Get stride of array section. 7066 Expr *getStride() { 7067 assert(ASType != OpenACCArraySection && 7068 "Stride not valid in OpenACC subarrays"); 7069 return cast_or_null<Expr>(SubExprs[STRIDE]); 7070 } 7071 7072 const Expr *getStride() const { 7073 assert(ASType != OpenACCArraySection && 7074 "Stride not valid in OpenACC subarrays"); 7075 return cast_or_null<Expr>(SubExprs[STRIDE]); 7076 } 7077 7078 SourceLocation getBeginLoc() const LLVM_READONLY { 7079 return getBase()->getBeginLoc(); 7080 } 7081 SourceLocation getEndLoc() const LLVM_READONLY { return RBracketLoc; } 7082 7083 SourceLocation getColonLocFirst() const { return ColonLocFirst; } 7084 SourceLocation getColonLocSecond() const { 7085 assert(ASType != OpenACCArraySection && 7086 "second colon for stride not valid in OpenACC subarrays"); 7087 return ColonLocSecond; 7088 } 7089 SourceLocation getRBracketLoc() const { return RBracketLoc; } 7090 7091 SourceLocation getExprLoc() const LLVM_READONLY { 7092 return getBase()->getExprLoc(); 7093 } 7094 7095 child_range children() { 7096 return child_range( 7097 &SubExprs[BASE], 7098 &SubExprs[ASType == OMPArraySection ? END_EXPR : OPENACC_END_EXPR]); 7099 } 7100 7101 const_child_range children() const { 7102 return const_child_range( 7103 &SubExprs[BASE], 7104 &SubExprs[ASType == OMPArraySection ? END_EXPR : OPENACC_END_EXPR]); 7105 } 7106 7107 private: 7108 /// Set base of the array section. 7109 void setBase(Expr *E) { SubExprs[BASE] = E; } 7110 7111 /// Set lower bound of the array section. 7112 void setLowerBound(Expr *E) { SubExprs[LOWER_BOUND] = E; } 7113 7114 /// Set length of the array section. 7115 void setLength(Expr *E) { SubExprs[LENGTH] = E; } 7116 7117 /// Set length of the array section. 7118 void setStride(Expr *E) { 7119 assert(ASType != OpenACCArraySection && 7120 "Stride not valid in OpenACC subarrays"); 7121 SubExprs[STRIDE] = E; 7122 } 7123 7124 void setColonLocFirst(SourceLocation L) { ColonLocFirst = L; } 7125 7126 void setColonLocSecond(SourceLocation L) { 7127 assert(ASType != OpenACCArraySection && 7128 "second colon for stride not valid in OpenACC subarrays"); 7129 ColonLocSecond = L; 7130 } 7131 void setRBracketLoc(SourceLocation L) { RBracketLoc = L; } 7132 }; 7133 7134 /// This class represents temporary values used to represent inout and out 7135 /// arguments in HLSL. From the callee perspective these parameters are more or 7136 /// less __restrict__ T&. They are guaranteed to not alias any memory. inout 7137 /// parameters are initialized by the caller, and out parameters are references 7138 /// to uninitialized memory. 7139 /// 7140 /// In the caller, the argument expression creates a temporary in local memory 7141 /// and the address of the temporary is passed into the callee. There may be 7142 /// implicit conversion sequences to initialize the temporary, and on expiration 7143 /// of the temporary an inverse conversion sequence is applied as a write-back 7144 /// conversion to the source l-value. 7145 /// 7146 /// This AST node has three sub-expressions: 7147 /// - An OpaqueValueExpr with a source that is the argument lvalue expression. 7148 /// - An OpaqueValueExpr with a source that is an implicit conversion 7149 /// sequence from the source lvalue to the argument type. 7150 /// - An expression that assigns the second expression into the first, 7151 /// performing any necessary conversions. 7152 class HLSLOutArgExpr : public Expr { 7153 friend class ASTStmtReader; 7154 7155 enum { 7156 BaseLValue, 7157 CastedTemporary, 7158 WritebackCast, 7159 NumSubExprs, 7160 }; 7161 7162 Stmt *SubExprs[NumSubExprs]; 7163 bool IsInOut; 7164 7165 HLSLOutArgExpr(QualType Ty, OpaqueValueExpr *B, OpaqueValueExpr *OpV, 7166 Expr *WB, bool IsInOut) 7167 : Expr(HLSLOutArgExprClass, Ty, VK_LValue, OK_Ordinary), 7168 IsInOut(IsInOut) { 7169 SubExprs[BaseLValue] = B; 7170 SubExprs[CastedTemporary] = OpV; 7171 SubExprs[WritebackCast] = WB; 7172 assert(!Ty->isDependentType() && "HLSLOutArgExpr given a dependent type!"); 7173 } 7174 7175 explicit HLSLOutArgExpr(EmptyShell Shell) 7176 : Expr(HLSLOutArgExprClass, Shell) {} 7177 7178 public: 7179 static HLSLOutArgExpr *Create(const ASTContext &C, QualType Ty, 7180 OpaqueValueExpr *Base, OpaqueValueExpr *OpV, 7181 Expr *WB, bool IsInOut); 7182 static HLSLOutArgExpr *CreateEmpty(const ASTContext &Ctx); 7183 7184 const OpaqueValueExpr *getOpaqueArgLValue() const { 7185 return cast<OpaqueValueExpr>(SubExprs[BaseLValue]); 7186 } 7187 OpaqueValueExpr *getOpaqueArgLValue() { 7188 return cast<OpaqueValueExpr>(SubExprs[BaseLValue]); 7189 } 7190 7191 /// Return the l-value expression that was written as the argument 7192 /// in source. Everything else here is implicitly generated. 7193 const Expr *getArgLValue() const { 7194 return getOpaqueArgLValue()->getSourceExpr(); 7195 } 7196 Expr *getArgLValue() { return getOpaqueArgLValue()->getSourceExpr(); } 7197 7198 const Expr *getWritebackCast() const { 7199 return cast<Expr>(SubExprs[WritebackCast]); 7200 } 7201 Expr *getWritebackCast() { return cast<Expr>(SubExprs[WritebackCast]); } 7202 7203 const OpaqueValueExpr *getCastedTemporary() const { 7204 return cast<OpaqueValueExpr>(SubExprs[CastedTemporary]); 7205 } 7206 OpaqueValueExpr *getCastedTemporary() { 7207 return cast<OpaqueValueExpr>(SubExprs[CastedTemporary]); 7208 } 7209 7210 /// returns true if the parameter is inout and false if the parameter is out. 7211 bool isInOut() const { return IsInOut; } 7212 7213 SourceLocation getBeginLoc() const LLVM_READONLY { 7214 return SubExprs[BaseLValue]->getBeginLoc(); 7215 } 7216 7217 SourceLocation getEndLoc() const LLVM_READONLY { 7218 return SubExprs[BaseLValue]->getEndLoc(); 7219 } 7220 7221 static bool classof(const Stmt *T) { 7222 return T->getStmtClass() == HLSLOutArgExprClass; 7223 } 7224 7225 // Iterators 7226 child_range children() { 7227 return child_range(&SubExprs[BaseLValue], &SubExprs[NumSubExprs]); 7228 } 7229 }; 7230 7231 /// Frontend produces RecoveryExprs on semantic errors that prevent creating 7232 /// other well-formed expressions. E.g. when type-checking of a binary operator 7233 /// fails, we cannot produce a BinaryOperator expression. Instead, we can choose 7234 /// to produce a recovery expression storing left and right operands. 7235 /// 7236 /// RecoveryExpr does not have any semantic meaning in C++, it is only useful to 7237 /// preserve expressions in AST that would otherwise be dropped. It captures 7238 /// subexpressions of some expression that we could not construct and source 7239 /// range covered by the expression. 7240 /// 7241 /// By default, RecoveryExpr uses dependence-bits to take advantage of existing 7242 /// machinery to deal with dependent code in C++, e.g. RecoveryExpr is preserved 7243 /// in `decltype(<broken-expr>)` as part of the `DependentDecltypeType`. In 7244 /// addition to that, clang does not report most errors on dependent 7245 /// expressions, so we get rid of bogus errors for free. However, note that 7246 /// unlike other dependent expressions, RecoveryExpr can be produced in 7247 /// non-template contexts. 7248 /// 7249 /// We will preserve the type in RecoveryExpr when the type is known, e.g. 7250 /// preserving the return type for a broken non-overloaded function call, a 7251 /// overloaded call where all candidates have the same return type. In this 7252 /// case, the expression is not type-dependent (unless the known type is itself 7253 /// dependent) 7254 /// 7255 /// One can also reliably suppress all bogus errors on expressions containing 7256 /// recovery expressions by examining results of Expr::containsErrors(). 7257 class RecoveryExpr final : public Expr, 7258 private llvm::TrailingObjects<RecoveryExpr, Expr *> { 7259 public: 7260 static RecoveryExpr *Create(ASTContext &Ctx, QualType T, 7261 SourceLocation BeginLoc, SourceLocation EndLoc, 7262 ArrayRef<Expr *> SubExprs); 7263 static RecoveryExpr *CreateEmpty(ASTContext &Ctx, unsigned NumSubExprs); 7264 7265 ArrayRef<Expr *> subExpressions() { 7266 auto *B = getTrailingObjects<Expr *>(); 7267 return llvm::ArrayRef(B, B + NumExprs); 7268 } 7269 7270 ArrayRef<const Expr *> subExpressions() const { 7271 return const_cast<RecoveryExpr *>(this)->subExpressions(); 7272 } 7273 7274 child_range children() { 7275 Stmt **B = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>()); 7276 return child_range(B, B + NumExprs); 7277 } 7278 7279 SourceLocation getBeginLoc() const { return BeginLoc; } 7280 SourceLocation getEndLoc() const { return EndLoc; } 7281 7282 static bool classof(const Stmt *T) { 7283 return T->getStmtClass() == RecoveryExprClass; 7284 } 7285 7286 private: 7287 RecoveryExpr(ASTContext &Ctx, QualType T, SourceLocation BeginLoc, 7288 SourceLocation EndLoc, ArrayRef<Expr *> SubExprs); 7289 RecoveryExpr(EmptyShell Empty, unsigned NumSubExprs) 7290 : Expr(RecoveryExprClass, Empty), NumExprs(NumSubExprs) {} 7291 7292 size_t numTrailingObjects(OverloadToken<Stmt *>) const { return NumExprs; } 7293 7294 SourceLocation BeginLoc, EndLoc; 7295 unsigned NumExprs; 7296 friend TrailingObjects; 7297 friend class ASTStmtReader; 7298 friend class ASTStmtWriter; 7299 }; 7300 7301 } // end namespace clang 7302 7303 #endif // LLVM_CLANG_AST_EXPR_H 7304