1 //===--- Expr.h - Classes for representing expressions ----------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the Expr interface and subclasses. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_AST_EXPR_H 15 #define LLVM_CLANG_AST_EXPR_H 16 17 #include "clang/AST/APValue.h" 18 #include "clang/AST/ASTVector.h" 19 #include "clang/AST/Decl.h" 20 #include "clang/AST/DeclAccessPair.h" 21 #include "clang/AST/OperationKinds.h" 22 #include "clang/AST/Stmt.h" 23 #include "clang/AST/TemplateBase.h" 24 #include "clang/AST/Type.h" 25 #include "clang/Basic/CharInfo.h" 26 #include "clang/Basic/LangOptions.h" 27 #include "clang/Basic/TypeTraits.h" 28 #include "llvm/ADT/APFloat.h" 29 #include "llvm/ADT/APSInt.h" 30 #include "llvm/ADT/SmallVector.h" 31 #include "llvm/ADT/StringRef.h" 32 #include "llvm/Support/AtomicOrdering.h" 33 #include "llvm/Support/Compiler.h" 34 35 namespace clang { 36 class APValue; 37 class ASTContext; 38 class BlockDecl; 39 class CXXBaseSpecifier; 40 class CXXMemberCallExpr; 41 class CXXOperatorCallExpr; 42 class CastExpr; 43 class Decl; 44 class IdentifierInfo; 45 class MaterializeTemporaryExpr; 46 class NamedDecl; 47 class ObjCPropertyRefExpr; 48 class OpaqueValueExpr; 49 class ParmVarDecl; 50 class StringLiteral; 51 class TargetInfo; 52 class ValueDecl; 53 54 /// \brief A simple array of base specifiers. 55 typedef SmallVector<CXXBaseSpecifier*, 4> CXXCastPath; 56 57 /// \brief An adjustment to be made to the temporary created when emitting a 58 /// reference binding, which accesses a particular subobject of that temporary. 59 struct SubobjectAdjustment { 60 enum { 61 DerivedToBaseAdjustment, 62 FieldAdjustment, 63 MemberPointerAdjustment 64 } Kind; 65 66 struct DTB { 67 const CastExpr *BasePath; 68 const CXXRecordDecl *DerivedClass; 69 }; 70 71 struct P { 72 const MemberPointerType *MPT; 73 Expr *RHS; 74 }; 75 76 union { 77 struct DTB DerivedToBase; 78 FieldDecl *Field; 79 struct P Ptr; 80 }; 81 82 SubobjectAdjustment(const CastExpr *BasePath, 83 const CXXRecordDecl *DerivedClass) 84 : Kind(DerivedToBaseAdjustment) { 85 DerivedToBase.BasePath = BasePath; 86 DerivedToBase.DerivedClass = DerivedClass; 87 } 88 89 SubobjectAdjustment(FieldDecl *Field) 90 : Kind(FieldAdjustment) { 91 this->Field = Field; 92 } 93 94 SubobjectAdjustment(const MemberPointerType *MPT, Expr *RHS) 95 : Kind(MemberPointerAdjustment) { 96 this->Ptr.MPT = MPT; 97 this->Ptr.RHS = RHS; 98 } 99 }; 100 101 /// Expr - This represents one expression. Note that Expr's are subclasses of 102 /// Stmt. This allows an expression to be transparently used any place a Stmt 103 /// is required. 104 /// 105 class Expr : public Stmt { 106 QualType TR; 107 108 protected: 109 Expr(StmtClass SC, QualType T, ExprValueKind VK, ExprObjectKind OK, 110 bool TD, bool VD, bool ID, bool ContainsUnexpandedParameterPack) 111 : Stmt(SC) 112 { 113 ExprBits.TypeDependent = TD; 114 ExprBits.ValueDependent = VD; 115 ExprBits.InstantiationDependent = ID; 116 ExprBits.ValueKind = VK; 117 ExprBits.ObjectKind = OK; 118 ExprBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack; 119 setType(T); 120 } 121 122 /// \brief Construct an empty expression. 123 explicit Expr(StmtClass SC, EmptyShell) : Stmt(SC) { } 124 125 public: 126 QualType getType() const { return TR; } 127 void setType(QualType t) { 128 // In C++, the type of an expression is always adjusted so that it 129 // will not have reference type (C++ [expr]p6). Use 130 // QualType::getNonReferenceType() to retrieve the non-reference 131 // type. Additionally, inspect Expr::isLvalue to determine whether 132 // an expression that is adjusted in this manner should be 133 // considered an lvalue. 134 assert((t.isNull() || !t->isReferenceType()) && 135 "Expressions can't have reference type"); 136 137 TR = t; 138 } 139 140 /// isValueDependent - Determines whether this expression is 141 /// value-dependent (C++ [temp.dep.constexpr]). For example, the 142 /// array bound of "Chars" in the following example is 143 /// value-dependent. 144 /// @code 145 /// template<int Size, char (&Chars)[Size]> struct meta_string; 146 /// @endcode 147 bool isValueDependent() const { return ExprBits.ValueDependent; } 148 149 /// \brief Set whether this expression is value-dependent or not. 150 void setValueDependent(bool VD) { 151 ExprBits.ValueDependent = VD; 152 } 153 154 /// isTypeDependent - Determines whether this expression is 155 /// type-dependent (C++ [temp.dep.expr]), which means that its type 156 /// could change from one template instantiation to the next. For 157 /// example, the expressions "x" and "x + y" are type-dependent in 158 /// the following code, but "y" is not type-dependent: 159 /// @code 160 /// template<typename T> 161 /// void add(T x, int y) { 162 /// x + y; 163 /// } 164 /// @endcode 165 bool isTypeDependent() const { return ExprBits.TypeDependent; } 166 167 /// \brief Set whether this expression is type-dependent or not. 168 void setTypeDependent(bool TD) { 169 ExprBits.TypeDependent = TD; 170 } 171 172 /// \brief Whether this expression is instantiation-dependent, meaning that 173 /// it depends in some way on a template parameter, even if neither its type 174 /// nor (constant) value can change due to the template instantiation. 175 /// 176 /// In the following example, the expression \c sizeof(sizeof(T() + T())) is 177 /// instantiation-dependent (since it involves a template parameter \c T), but 178 /// is neither type- nor value-dependent, since the type of the inner 179 /// \c sizeof is known (\c std::size_t) and therefore the size of the outer 180 /// \c sizeof is known. 181 /// 182 /// \code 183 /// template<typename T> 184 /// void f(T x, T y) { 185 /// sizeof(sizeof(T() + T()); 186 /// } 187 /// \endcode 188 /// 189 bool isInstantiationDependent() const { 190 return ExprBits.InstantiationDependent; 191 } 192 193 /// \brief Set whether this expression is instantiation-dependent or not. 194 void setInstantiationDependent(bool ID) { 195 ExprBits.InstantiationDependent = ID; 196 } 197 198 /// \brief Whether this expression contains an unexpanded parameter 199 /// pack (for C++11 variadic templates). 200 /// 201 /// Given the following function template: 202 /// 203 /// \code 204 /// template<typename F, typename ...Types> 205 /// void forward(const F &f, Types &&...args) { 206 /// f(static_cast<Types&&>(args)...); 207 /// } 208 /// \endcode 209 /// 210 /// The expressions \c args and \c static_cast<Types&&>(args) both 211 /// contain parameter packs. 212 bool containsUnexpandedParameterPack() const { 213 return ExprBits.ContainsUnexpandedParameterPack; 214 } 215 216 /// \brief Set the bit that describes whether this expression 217 /// contains an unexpanded parameter pack. 218 void setContainsUnexpandedParameterPack(bool PP = true) { 219 ExprBits.ContainsUnexpandedParameterPack = PP; 220 } 221 222 /// getExprLoc - Return the preferred location for the arrow when diagnosing 223 /// a problem with a generic expression. 224 SourceLocation getExprLoc() const LLVM_READONLY; 225 226 /// isUnusedResultAWarning - Return true if this immediate expression should 227 /// be warned about if the result is unused. If so, fill in expr, location, 228 /// and ranges with expr to warn on and source locations/ranges appropriate 229 /// for a warning. 230 bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc, 231 SourceRange &R1, SourceRange &R2, 232 ASTContext &Ctx) const; 233 234 /// isLValue - True if this expression is an "l-value" according to 235 /// the rules of the current language. C and C++ give somewhat 236 /// different rules for this concept, but in general, the result of 237 /// an l-value expression identifies a specific object whereas the 238 /// result of an r-value expression is a value detached from any 239 /// specific storage. 240 /// 241 /// C++11 divides the concept of "r-value" into pure r-values 242 /// ("pr-values") and so-called expiring values ("x-values"), which 243 /// identify specific objects that can be safely cannibalized for 244 /// their resources. This is an unfortunate abuse of terminology on 245 /// the part of the C++ committee. In Clang, when we say "r-value", 246 /// we generally mean a pr-value. 247 bool isLValue() const { return getValueKind() == VK_LValue; } 248 bool isRValue() const { return getValueKind() == VK_RValue; } 249 bool isXValue() const { return getValueKind() == VK_XValue; } 250 bool isGLValue() const { return getValueKind() != VK_RValue; } 251 252 enum LValueClassification { 253 LV_Valid, 254 LV_NotObjectType, 255 LV_IncompleteVoidType, 256 LV_DuplicateVectorComponents, 257 LV_InvalidExpression, 258 LV_InvalidMessageExpression, 259 LV_MemberFunction, 260 LV_SubObjCPropertySetting, 261 LV_ClassTemporary, 262 LV_ArrayTemporary 263 }; 264 /// Reasons why an expression might not be an l-value. 265 LValueClassification ClassifyLValue(ASTContext &Ctx) const; 266 267 enum isModifiableLvalueResult { 268 MLV_Valid, 269 MLV_NotObjectType, 270 MLV_IncompleteVoidType, 271 MLV_DuplicateVectorComponents, 272 MLV_InvalidExpression, 273 MLV_LValueCast, // Specialized form of MLV_InvalidExpression. 274 MLV_IncompleteType, 275 MLV_ConstQualified, 276 MLV_ConstAddrSpace, 277 MLV_ArrayType, 278 MLV_NoSetterProperty, 279 MLV_MemberFunction, 280 MLV_SubObjCPropertySetting, 281 MLV_InvalidMessageExpression, 282 MLV_ClassTemporary, 283 MLV_ArrayTemporary 284 }; 285 /// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type, 286 /// does not have an incomplete type, does not have a const-qualified type, 287 /// and if it is a structure or union, does not have any member (including, 288 /// recursively, any member or element of all contained aggregates or unions) 289 /// with a const-qualified type. 290 /// 291 /// \param Loc [in,out] - A source location which *may* be filled 292 /// in with the location of the expression making this a 293 /// non-modifiable lvalue, if specified. 294 isModifiableLvalueResult 295 isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc = nullptr) const; 296 297 /// \brief The return type of classify(). Represents the C++11 expression 298 /// taxonomy. 299 class Classification { 300 public: 301 /// \brief The various classification results. Most of these mean prvalue. 302 enum Kinds { 303 CL_LValue, 304 CL_XValue, 305 CL_Function, // Functions cannot be lvalues in C. 306 CL_Void, // Void cannot be an lvalue in C. 307 CL_AddressableVoid, // Void expression whose address can be taken in C. 308 CL_DuplicateVectorComponents, // A vector shuffle with dupes. 309 CL_MemberFunction, // An expression referring to a member function 310 CL_SubObjCPropertySetting, 311 CL_ClassTemporary, // A temporary of class type, or subobject thereof. 312 CL_ArrayTemporary, // A temporary of array type. 313 CL_ObjCMessageRValue, // ObjC message is an rvalue 314 CL_PRValue // A prvalue for any other reason, of any other type 315 }; 316 /// \brief The results of modification testing. 317 enum ModifiableType { 318 CM_Untested, // testModifiable was false. 319 CM_Modifiable, 320 CM_RValue, // Not modifiable because it's an rvalue 321 CM_Function, // Not modifiable because it's a function; C++ only 322 CM_LValueCast, // Same as CM_RValue, but indicates GCC cast-as-lvalue ext 323 CM_NoSetterProperty,// Implicit assignment to ObjC property without setter 324 CM_ConstQualified, 325 CM_ConstAddrSpace, 326 CM_ArrayType, 327 CM_IncompleteType 328 }; 329 330 private: 331 friend class Expr; 332 333 unsigned short Kind; 334 unsigned short Modifiable; 335 336 explicit Classification(Kinds k, ModifiableType m) 337 : Kind(k), Modifiable(m) 338 {} 339 340 public: 341 Classification() {} 342 343 Kinds getKind() const { return static_cast<Kinds>(Kind); } 344 ModifiableType getModifiable() const { 345 assert(Modifiable != CM_Untested && "Did not test for modifiability."); 346 return static_cast<ModifiableType>(Modifiable); 347 } 348 bool isLValue() const { return Kind == CL_LValue; } 349 bool isXValue() const { return Kind == CL_XValue; } 350 bool isGLValue() const { return Kind <= CL_XValue; } 351 bool isPRValue() const { return Kind >= CL_Function; } 352 bool isRValue() const { return Kind >= CL_XValue; } 353 bool isModifiable() const { return getModifiable() == CM_Modifiable; } 354 355 /// \brief Create a simple, modifiably lvalue 356 static Classification makeSimpleLValue() { 357 return Classification(CL_LValue, CM_Modifiable); 358 } 359 360 }; 361 /// \brief Classify - Classify this expression according to the C++11 362 /// expression taxonomy. 363 /// 364 /// C++11 defines ([basic.lval]) a new taxonomy of expressions to replace the 365 /// old lvalue vs rvalue. This function determines the type of expression this 366 /// is. There are three expression types: 367 /// - lvalues are classical lvalues as in C++03. 368 /// - prvalues are equivalent to rvalues in C++03. 369 /// - xvalues are expressions yielding unnamed rvalue references, e.g. a 370 /// function returning an rvalue reference. 371 /// lvalues and xvalues are collectively referred to as glvalues, while 372 /// prvalues and xvalues together form rvalues. 373 Classification Classify(ASTContext &Ctx) const { 374 return ClassifyImpl(Ctx, nullptr); 375 } 376 377 /// \brief ClassifyModifiable - Classify this expression according to the 378 /// C++11 expression taxonomy, and see if it is valid on the left side 379 /// of an assignment. 380 /// 381 /// This function extends classify in that it also tests whether the 382 /// expression is modifiable (C99 6.3.2.1p1). 383 /// \param Loc A source location that might be filled with a relevant location 384 /// if the expression is not modifiable. 385 Classification ClassifyModifiable(ASTContext &Ctx, SourceLocation &Loc) const{ 386 return ClassifyImpl(Ctx, &Loc); 387 } 388 389 /// getValueKindForType - Given a formal return or parameter type, 390 /// give its value kind. 391 static ExprValueKind getValueKindForType(QualType T) { 392 if (const ReferenceType *RT = T->getAs<ReferenceType>()) 393 return (isa<LValueReferenceType>(RT) 394 ? VK_LValue 395 : (RT->getPointeeType()->isFunctionType() 396 ? VK_LValue : VK_XValue)); 397 return VK_RValue; 398 } 399 400 /// getValueKind - The value kind that this expression produces. 401 ExprValueKind getValueKind() const { 402 return static_cast<ExprValueKind>(ExprBits.ValueKind); 403 } 404 405 /// getObjectKind - The object kind that this expression produces. 406 /// Object kinds are meaningful only for expressions that yield an 407 /// l-value or x-value. 408 ExprObjectKind getObjectKind() const { 409 return static_cast<ExprObjectKind>(ExprBits.ObjectKind); 410 } 411 412 bool isOrdinaryOrBitFieldObject() const { 413 ExprObjectKind OK = getObjectKind(); 414 return (OK == OK_Ordinary || OK == OK_BitField); 415 } 416 417 /// setValueKind - Set the value kind produced by this expression. 418 void setValueKind(ExprValueKind Cat) { ExprBits.ValueKind = Cat; } 419 420 /// setObjectKind - Set the object kind produced by this expression. 421 void setObjectKind(ExprObjectKind Cat) { ExprBits.ObjectKind = Cat; } 422 423 private: 424 Classification ClassifyImpl(ASTContext &Ctx, SourceLocation *Loc) const; 425 426 public: 427 428 /// \brief Returns true if this expression is a gl-value that 429 /// potentially refers to a bit-field. 430 /// 431 /// In C++, whether a gl-value refers to a bitfield is essentially 432 /// an aspect of the value-kind type system. 433 bool refersToBitField() const { return getObjectKind() == OK_BitField; } 434 435 /// \brief If this expression refers to a bit-field, retrieve the 436 /// declaration of that bit-field. 437 /// 438 /// Note that this returns a non-null pointer in subtly different 439 /// places than refersToBitField returns true. In particular, this can 440 /// return a non-null pointer even for r-values loaded from 441 /// bit-fields, but it will return null for a conditional bit-field. 442 FieldDecl *getSourceBitField(); 443 444 const FieldDecl *getSourceBitField() const { 445 return const_cast<Expr*>(this)->getSourceBitField(); 446 } 447 448 /// \brief If this expression is an l-value for an Objective C 449 /// property, find the underlying property reference expression. 450 const ObjCPropertyRefExpr *getObjCProperty() const; 451 452 /// \brief Check if this expression is the ObjC 'self' implicit parameter. 453 bool isObjCSelfExpr() const; 454 455 /// \brief Returns whether this expression refers to a vector element. 456 bool refersToVectorElement() const; 457 458 /// \brief Returns whether this expression refers to a global register 459 /// variable. 460 bool refersToGlobalRegisterVar() const; 461 462 /// \brief Returns whether this expression has a placeholder type. 463 bool hasPlaceholderType() const { 464 return getType()->isPlaceholderType(); 465 } 466 467 /// \brief Returns whether this expression has a specific placeholder type. 468 bool hasPlaceholderType(BuiltinType::Kind K) const { 469 assert(BuiltinType::isPlaceholderTypeKind(K)); 470 if (const BuiltinType *BT = dyn_cast<BuiltinType>(getType())) 471 return BT->getKind() == K; 472 return false; 473 } 474 475 /// isKnownToHaveBooleanValue - Return true if this is an integer expression 476 /// that is known to return 0 or 1. This happens for _Bool/bool expressions 477 /// but also int expressions which are produced by things like comparisons in 478 /// C. 479 bool isKnownToHaveBooleanValue() const; 480 481 /// isIntegerConstantExpr - Return true if this expression is a valid integer 482 /// constant expression, and, if so, return its value in Result. If not a 483 /// valid i-c-e, return false and fill in Loc (if specified) with the location 484 /// of the invalid expression. 485 /// 486 /// Note: This does not perform the implicit conversions required by C++11 487 /// [expr.const]p5. 488 bool isIntegerConstantExpr(llvm::APSInt &Result, const ASTContext &Ctx, 489 SourceLocation *Loc = nullptr, 490 bool isEvaluated = true) const; 491 bool isIntegerConstantExpr(const ASTContext &Ctx, 492 SourceLocation *Loc = nullptr) const; 493 494 /// isCXX98IntegralConstantExpr - Return true if this expression is an 495 /// integral constant expression in C++98. Can only be used in C++. 496 bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const; 497 498 /// isCXX11ConstantExpr - Return true if this expression is a constant 499 /// expression in C++11. Can only be used in C++. 500 /// 501 /// Note: This does not perform the implicit conversions required by C++11 502 /// [expr.const]p5. 503 bool isCXX11ConstantExpr(const ASTContext &Ctx, APValue *Result = nullptr, 504 SourceLocation *Loc = nullptr) const; 505 506 /// isPotentialConstantExpr - Return true if this function's definition 507 /// might be usable in a constant expression in C++11, if it were marked 508 /// constexpr. Return false if the function can never produce a constant 509 /// expression, along with diagnostics describing why not. 510 static bool isPotentialConstantExpr(const FunctionDecl *FD, 511 SmallVectorImpl< 512 PartialDiagnosticAt> &Diags); 513 514 /// isPotentialConstantExprUnevaluted - Return true if this expression might 515 /// be usable in a constant expression in C++11 in an unevaluated context, if 516 /// it were in function FD marked constexpr. Return false if the function can 517 /// never produce a constant expression, along with diagnostics describing 518 /// why not. 519 static bool isPotentialConstantExprUnevaluated(Expr *E, 520 const FunctionDecl *FD, 521 SmallVectorImpl< 522 PartialDiagnosticAt> &Diags); 523 524 /// isConstantInitializer - Returns true if this expression can be emitted to 525 /// IR as a constant, and thus can be used as a constant initializer in C. 526 /// If this expression is not constant and Culprit is non-null, 527 /// it is used to store the address of first non constant expr. 528 bool isConstantInitializer(ASTContext &Ctx, bool ForRef, 529 const Expr **Culprit = nullptr) const; 530 531 /// EvalStatus is a struct with detailed info about an evaluation in progress. 532 struct EvalStatus { 533 /// \brief Whether the evaluated expression has side effects. 534 /// For example, (f() && 0) can be folded, but it still has side effects. 535 bool HasSideEffects; 536 537 /// \brief Whether the evaluation hit undefined behavior. 538 /// For example, 1.0 / 0.0 can be folded to Inf, but has undefined behavior. 539 /// Likewise, INT_MAX + 1 can be folded to INT_MIN, but has UB. 540 bool HasUndefinedBehavior; 541 542 /// Diag - If this is non-null, it will be filled in with a stack of notes 543 /// indicating why evaluation failed (or why it failed to produce a constant 544 /// expression). 545 /// If the expression is unfoldable, the notes will indicate why it's not 546 /// foldable. If the expression is foldable, but not a constant expression, 547 /// the notes will describes why it isn't a constant expression. If the 548 /// expression *is* a constant expression, no notes will be produced. 549 SmallVectorImpl<PartialDiagnosticAt> *Diag; 550 551 EvalStatus() 552 : HasSideEffects(false), HasUndefinedBehavior(false), Diag(nullptr) {} 553 554 // hasSideEffects - Return true if the evaluated expression has 555 // side effects. 556 bool hasSideEffects() const { 557 return HasSideEffects; 558 } 559 }; 560 561 /// EvalResult is a struct with detailed info about an evaluated expression. 562 struct EvalResult : EvalStatus { 563 /// Val - This is the value the expression can be folded to. 564 APValue Val; 565 566 // isGlobalLValue - Return true if the evaluated lvalue expression 567 // is global. 568 bool isGlobalLValue() const; 569 }; 570 571 /// EvaluateAsRValue - Return true if this is a constant which we can fold to 572 /// an rvalue using any crazy technique (that has nothing to do with language 573 /// standards) that we want to, even if the expression has side-effects. If 574 /// this function returns true, it returns the folded constant in Result. If 575 /// the expression is a glvalue, an lvalue-to-rvalue conversion will be 576 /// applied. 577 bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx) const; 578 579 /// EvaluateAsBooleanCondition - Return true if this is a constant 580 /// which we we can fold and convert to a boolean condition using 581 /// any crazy technique that we want to, even if the expression has 582 /// side-effects. 583 bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx) const; 584 585 enum SideEffectsKind { 586 SE_NoSideEffects, ///< Strictly evaluate the expression. 587 SE_AllowUndefinedBehavior, ///< Allow UB that we can give a value, but not 588 ///< arbitrary unmodeled side effects. 589 SE_AllowSideEffects ///< Allow any unmodeled side effect. 590 }; 591 592 /// EvaluateAsInt - Return true if this is a constant which we can fold and 593 /// convert to an integer, using any crazy technique that we want to. 594 bool EvaluateAsInt(llvm::APSInt &Result, const ASTContext &Ctx, 595 SideEffectsKind AllowSideEffects = SE_NoSideEffects) const; 596 597 /// EvaluateAsFloat - Return true if this is a constant which we can fold and 598 /// convert to a floating point value, using any crazy technique that we 599 /// want to. 600 bool 601 EvaluateAsFloat(llvm::APFloat &Result, const ASTContext &Ctx, 602 SideEffectsKind AllowSideEffects = SE_NoSideEffects) const; 603 604 /// isEvaluatable - Call EvaluateAsRValue to see if this expression can be 605 /// constant folded without side-effects, but discard the result. 606 bool isEvaluatable(const ASTContext &Ctx, 607 SideEffectsKind AllowSideEffects = SE_NoSideEffects) const; 608 609 /// HasSideEffects - This routine returns true for all those expressions 610 /// which have any effect other than producing a value. Example is a function 611 /// call, volatile variable read, or throwing an exception. If 612 /// IncludePossibleEffects is false, this call treats certain expressions with 613 /// potential side effects (such as function call-like expressions, 614 /// instantiation-dependent expressions, or invocations from a macro) as not 615 /// having side effects. 616 bool HasSideEffects(const ASTContext &Ctx, 617 bool IncludePossibleEffects = true) const; 618 619 /// \brief Determine whether this expression involves a call to any function 620 /// that is not trivial. 621 bool hasNonTrivialCall(const ASTContext &Ctx) const; 622 623 /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded 624 /// integer. This must be called on an expression that constant folds to an 625 /// integer. 626 llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, 627 SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr) const; 628 629 void EvaluateForOverflow(const ASTContext &Ctx) const; 630 631 /// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an 632 /// lvalue with link time known address, with no side-effects. 633 bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const; 634 635 /// EvaluateAsInitializer - Evaluate an expression as if it were the 636 /// initializer of the given declaration. Returns true if the initializer 637 /// can be folded to a constant, and produces any relevant notes. In C++11, 638 /// notes will be produced if the expression is not a constant expression. 639 bool EvaluateAsInitializer(APValue &Result, const ASTContext &Ctx, 640 const VarDecl *VD, 641 SmallVectorImpl<PartialDiagnosticAt> &Notes) const; 642 643 /// EvaluateWithSubstitution - Evaluate an expression as if from the context 644 /// of a call to the given function with the given arguments, inside an 645 /// unevaluated context. Returns true if the expression could be folded to a 646 /// constant. 647 bool EvaluateWithSubstitution(APValue &Value, ASTContext &Ctx, 648 const FunctionDecl *Callee, 649 ArrayRef<const Expr*> Args) const; 650 651 /// \brief If the current Expr is a pointer, this will try to statically 652 /// determine the number of bytes available where the pointer is pointing. 653 /// Returns true if all of the above holds and we were able to figure out the 654 /// size, false otherwise. 655 /// 656 /// \param Type - How to evaluate the size of the Expr, as defined by the 657 /// "type" parameter of __builtin_object_size 658 bool tryEvaluateObjectSize(uint64_t &Result, ASTContext &Ctx, 659 unsigned Type) const; 660 661 /// \brief Enumeration used to describe the kind of Null pointer constant 662 /// returned from \c isNullPointerConstant(). 663 enum NullPointerConstantKind { 664 /// \brief Expression is not a Null pointer constant. 665 NPCK_NotNull = 0, 666 667 /// \brief Expression is a Null pointer constant built from a zero integer 668 /// expression that is not a simple, possibly parenthesized, zero literal. 669 /// C++ Core Issue 903 will classify these expressions as "not pointers" 670 /// once it is adopted. 671 /// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903 672 NPCK_ZeroExpression, 673 674 /// \brief Expression is a Null pointer constant built from a literal zero. 675 NPCK_ZeroLiteral, 676 677 /// \brief Expression is a C++11 nullptr. 678 NPCK_CXX11_nullptr, 679 680 /// \brief Expression is a GNU-style __null constant. 681 NPCK_GNUNull 682 }; 683 684 /// \brief Enumeration used to describe how \c isNullPointerConstant() 685 /// should cope with value-dependent expressions. 686 enum NullPointerConstantValueDependence { 687 /// \brief Specifies that the expression should never be value-dependent. 688 NPC_NeverValueDependent = 0, 689 690 /// \brief Specifies that a value-dependent expression of integral or 691 /// dependent type should be considered a null pointer constant. 692 NPC_ValueDependentIsNull, 693 694 /// \brief Specifies that a value-dependent expression should be considered 695 /// to never be a null pointer constant. 696 NPC_ValueDependentIsNotNull 697 }; 698 699 /// isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to 700 /// a Null pointer constant. The return value can further distinguish the 701 /// kind of NULL pointer constant that was detected. 702 NullPointerConstantKind isNullPointerConstant( 703 ASTContext &Ctx, 704 NullPointerConstantValueDependence NPC) const; 705 706 /// isOBJCGCCandidate - Return true if this expression may be used in a read/ 707 /// write barrier. 708 bool isOBJCGCCandidate(ASTContext &Ctx) const; 709 710 /// \brief Returns true if this expression is a bound member function. 711 bool isBoundMemberFunction(ASTContext &Ctx) const; 712 713 /// \brief Given an expression of bound-member type, find the type 714 /// of the member. Returns null if this is an *overloaded* bound 715 /// member expression. 716 static QualType findBoundMemberType(const Expr *expr); 717 718 /// IgnoreImpCasts - Skip past any implicit casts which might 719 /// surround this expression. Only skips ImplicitCastExprs. 720 Expr *IgnoreImpCasts() LLVM_READONLY; 721 722 /// IgnoreImplicit - Skip past any implicit AST nodes which might 723 /// surround this expression. 724 Expr *IgnoreImplicit() LLVM_READONLY { 725 return cast<Expr>(Stmt::IgnoreImplicit()); 726 } 727 728 const Expr *IgnoreImplicit() const LLVM_READONLY { 729 return const_cast<Expr*>(this)->IgnoreImplicit(); 730 } 731 732 /// IgnoreParens - Ignore parentheses. If this Expr is a ParenExpr, return 733 /// its subexpression. If that subexpression is also a ParenExpr, 734 /// then this method recursively returns its subexpression, and so forth. 735 /// Otherwise, the method returns the current Expr. 736 Expr *IgnoreParens() LLVM_READONLY; 737 738 /// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr 739 /// or CastExprs, returning their operand. 740 Expr *IgnoreParenCasts() LLVM_READONLY; 741 742 /// Ignore casts. Strip off any CastExprs, returning their operand. 743 Expr *IgnoreCasts() LLVM_READONLY; 744 745 /// IgnoreParenImpCasts - Ignore parentheses and implicit casts. Strip off 746 /// any ParenExpr or ImplicitCastExprs, returning their operand. 747 Expr *IgnoreParenImpCasts() LLVM_READONLY; 748 749 /// IgnoreConversionOperator - Ignore conversion operator. If this Expr is a 750 /// call to a conversion operator, return the argument. 751 Expr *IgnoreConversionOperator() LLVM_READONLY; 752 753 const Expr *IgnoreConversionOperator() const LLVM_READONLY { 754 return const_cast<Expr*>(this)->IgnoreConversionOperator(); 755 } 756 757 const Expr *IgnoreParenImpCasts() const LLVM_READONLY { 758 return const_cast<Expr*>(this)->IgnoreParenImpCasts(); 759 } 760 761 /// Ignore parentheses and lvalue casts. Strip off any ParenExpr and 762 /// CastExprs that represent lvalue casts, returning their operand. 763 Expr *IgnoreParenLValueCasts() LLVM_READONLY; 764 765 const Expr *IgnoreParenLValueCasts() const LLVM_READONLY { 766 return const_cast<Expr*>(this)->IgnoreParenLValueCasts(); 767 } 768 769 /// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the 770 /// value (including ptr->int casts of the same size). Strip off any 771 /// ParenExpr or CastExprs, returning their operand. 772 Expr *IgnoreParenNoopCasts(ASTContext &Ctx) LLVM_READONLY; 773 774 /// Ignore parentheses and derived-to-base casts. 775 Expr *ignoreParenBaseCasts() LLVM_READONLY; 776 777 const Expr *ignoreParenBaseCasts() const LLVM_READONLY { 778 return const_cast<Expr*>(this)->ignoreParenBaseCasts(); 779 } 780 781 /// \brief Determine whether this expression is a default function argument. 782 /// 783 /// Default arguments are implicitly generated in the abstract syntax tree 784 /// by semantic analysis for function calls, object constructions, etc. in 785 /// C++. Default arguments are represented by \c CXXDefaultArgExpr nodes; 786 /// this routine also looks through any implicit casts to determine whether 787 /// the expression is a default argument. 788 bool isDefaultArgument() const; 789 790 /// \brief Determine whether the result of this expression is a 791 /// temporary object of the given class type. 792 bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const; 793 794 /// \brief Whether this expression is an implicit reference to 'this' in C++. 795 bool isImplicitCXXThis() const; 796 797 const Expr *IgnoreImpCasts() const LLVM_READONLY { 798 return const_cast<Expr*>(this)->IgnoreImpCasts(); 799 } 800 const Expr *IgnoreParens() const LLVM_READONLY { 801 return const_cast<Expr*>(this)->IgnoreParens(); 802 } 803 const Expr *IgnoreParenCasts() const LLVM_READONLY { 804 return const_cast<Expr*>(this)->IgnoreParenCasts(); 805 } 806 /// Strip off casts, but keep parentheses. 807 const Expr *IgnoreCasts() const LLVM_READONLY { 808 return const_cast<Expr*>(this)->IgnoreCasts(); 809 } 810 811 const Expr *IgnoreParenNoopCasts(ASTContext &Ctx) const LLVM_READONLY { 812 return const_cast<Expr*>(this)->IgnoreParenNoopCasts(Ctx); 813 } 814 815 static bool hasAnyTypeDependentArguments(ArrayRef<Expr *> Exprs); 816 817 /// \brief For an expression of class type or pointer to class type, 818 /// return the most derived class decl the expression is known to refer to. 819 /// 820 /// If this expression is a cast, this method looks through it to find the 821 /// most derived decl that can be inferred from the expression. 822 /// This is valid because derived-to-base conversions have undefined 823 /// behavior if the object isn't dynamically of the derived type. 824 const CXXRecordDecl *getBestDynamicClassType() const; 825 826 /// Walk outwards from an expression we want to bind a reference to and 827 /// find the expression whose lifetime needs to be extended. Record 828 /// the LHSs of comma expressions and adjustments needed along the path. 829 const Expr *skipRValueSubobjectAdjustments( 830 SmallVectorImpl<const Expr *> &CommaLHS, 831 SmallVectorImpl<SubobjectAdjustment> &Adjustments) const; 832 833 static bool classof(const Stmt *T) { 834 return T->getStmtClass() >= firstExprConstant && 835 T->getStmtClass() <= lastExprConstant; 836 } 837 }; 838 839 //===----------------------------------------------------------------------===// 840 // Primary Expressions. 841 //===----------------------------------------------------------------------===// 842 843 /// OpaqueValueExpr - An expression referring to an opaque object of a 844 /// fixed type and value class. These don't correspond to concrete 845 /// syntax; instead they're used to express operations (usually copy 846 /// operations) on values whose source is generally obvious from 847 /// context. 848 class OpaqueValueExpr : public Expr { 849 friend class ASTStmtReader; 850 Expr *SourceExpr; 851 SourceLocation Loc; 852 853 public: 854 OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK, 855 ExprObjectKind OK = OK_Ordinary, 856 Expr *SourceExpr = nullptr) 857 : Expr(OpaqueValueExprClass, T, VK, OK, 858 T->isDependentType() || 859 (SourceExpr && SourceExpr->isTypeDependent()), 860 T->isDependentType() || 861 (SourceExpr && SourceExpr->isValueDependent()), 862 T->isInstantiationDependentType() || 863 (SourceExpr && SourceExpr->isInstantiationDependent()), 864 false), 865 SourceExpr(SourceExpr), Loc(Loc) { 866 } 867 868 /// Given an expression which invokes a copy constructor --- i.e. a 869 /// CXXConstructExpr, possibly wrapped in an ExprWithCleanups --- 870 /// find the OpaqueValueExpr that's the source of the construction. 871 static const OpaqueValueExpr *findInCopyConstruct(const Expr *expr); 872 873 explicit OpaqueValueExpr(EmptyShell Empty) 874 : Expr(OpaqueValueExprClass, Empty) { } 875 876 /// \brief Retrieve the location of this expression. 877 SourceLocation getLocation() const { return Loc; } 878 879 SourceLocation getLocStart() const LLVM_READONLY { 880 return SourceExpr ? SourceExpr->getLocStart() : Loc; 881 } 882 SourceLocation getLocEnd() const LLVM_READONLY { 883 return SourceExpr ? SourceExpr->getLocEnd() : Loc; 884 } 885 SourceLocation getExprLoc() const LLVM_READONLY { 886 if (SourceExpr) return SourceExpr->getExprLoc(); 887 return Loc; 888 } 889 890 child_range children() { 891 return child_range(child_iterator(), child_iterator()); 892 } 893 894 /// The source expression of an opaque value expression is the 895 /// expression which originally generated the value. This is 896 /// provided as a convenience for analyses that don't wish to 897 /// precisely model the execution behavior of the program. 898 /// 899 /// The source expression is typically set when building the 900 /// expression which binds the opaque value expression in the first 901 /// place. 902 Expr *getSourceExpr() const { return SourceExpr; } 903 904 static bool classof(const Stmt *T) { 905 return T->getStmtClass() == OpaqueValueExprClass; 906 } 907 }; 908 909 /// \brief A reference to a declared variable, function, enum, etc. 910 /// [C99 6.5.1p2] 911 /// 912 /// This encodes all the information about how a declaration is referenced 913 /// within an expression. 914 /// 915 /// There are several optional constructs attached to DeclRefExprs only when 916 /// they apply in order to conserve memory. These are laid out past the end of 917 /// the object, and flags in the DeclRefExprBitfield track whether they exist: 918 /// 919 /// DeclRefExprBits.HasQualifier: 920 /// Specifies when this declaration reference expression has a C++ 921 /// nested-name-specifier. 922 /// DeclRefExprBits.HasFoundDecl: 923 /// Specifies when this declaration reference expression has a record of 924 /// a NamedDecl (different from the referenced ValueDecl) which was found 925 /// during name lookup and/or overload resolution. 926 /// DeclRefExprBits.HasTemplateKWAndArgsInfo: 927 /// Specifies when this declaration reference expression has an explicit 928 /// C++ template keyword and/or template argument list. 929 /// DeclRefExprBits.RefersToEnclosingVariableOrCapture 930 /// Specifies when this declaration reference expression (validly) 931 /// refers to an enclosed local or a captured variable. 932 class DeclRefExpr final 933 : public Expr, 934 private llvm::TrailingObjects<DeclRefExpr, NestedNameSpecifierLoc, 935 NamedDecl *, ASTTemplateKWAndArgsInfo, 936 TemplateArgumentLoc> { 937 /// \brief The declaration that we are referencing. 938 ValueDecl *D; 939 940 /// \brief The location of the declaration name itself. 941 SourceLocation Loc; 942 943 /// \brief Provides source/type location info for the declaration name 944 /// embedded in D. 945 DeclarationNameLoc DNLoc; 946 947 size_t numTrailingObjects(OverloadToken<NestedNameSpecifierLoc>) const { 948 return hasQualifier() ? 1 : 0; 949 } 950 951 size_t numTrailingObjects(OverloadToken<NamedDecl *>) const { 952 return hasFoundDecl() ? 1 : 0; 953 } 954 955 size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const { 956 return hasTemplateKWAndArgsInfo() ? 1 : 0; 957 } 958 959 /// \brief Test whether there is a distinct FoundDecl attached to the end of 960 /// this DRE. 961 bool hasFoundDecl() const { return DeclRefExprBits.HasFoundDecl; } 962 963 DeclRefExpr(const ASTContext &Ctx, 964 NestedNameSpecifierLoc QualifierLoc, 965 SourceLocation TemplateKWLoc, 966 ValueDecl *D, bool RefersToEnlosingVariableOrCapture, 967 const DeclarationNameInfo &NameInfo, 968 NamedDecl *FoundD, 969 const TemplateArgumentListInfo *TemplateArgs, 970 QualType T, ExprValueKind VK); 971 972 /// \brief Construct an empty declaration reference expression. 973 explicit DeclRefExpr(EmptyShell Empty) 974 : Expr(DeclRefExprClass, Empty) { } 975 976 /// \brief Computes the type- and value-dependence flags for this 977 /// declaration reference expression. 978 void computeDependence(const ASTContext &C); 979 980 public: 981 DeclRefExpr(ValueDecl *D, bool RefersToEnclosingVariableOrCapture, QualType T, 982 ExprValueKind VK, SourceLocation L, 983 const DeclarationNameLoc &LocInfo = DeclarationNameLoc()) 984 : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false, false), 985 D(D), Loc(L), DNLoc(LocInfo) { 986 DeclRefExprBits.HasQualifier = 0; 987 DeclRefExprBits.HasTemplateKWAndArgsInfo = 0; 988 DeclRefExprBits.HasFoundDecl = 0; 989 DeclRefExprBits.HadMultipleCandidates = 0; 990 DeclRefExprBits.RefersToEnclosingVariableOrCapture = 991 RefersToEnclosingVariableOrCapture; 992 computeDependence(D->getASTContext()); 993 } 994 995 static DeclRefExpr * 996 Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, 997 SourceLocation TemplateKWLoc, ValueDecl *D, 998 bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, 999 QualType T, ExprValueKind VK, NamedDecl *FoundD = nullptr, 1000 const TemplateArgumentListInfo *TemplateArgs = nullptr); 1001 1002 static DeclRefExpr * 1003 Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, 1004 SourceLocation TemplateKWLoc, ValueDecl *D, 1005 bool RefersToEnclosingVariableOrCapture, 1006 const DeclarationNameInfo &NameInfo, QualType T, ExprValueKind VK, 1007 NamedDecl *FoundD = nullptr, 1008 const TemplateArgumentListInfo *TemplateArgs = nullptr); 1009 1010 /// \brief Construct an empty declaration reference expression. 1011 static DeclRefExpr *CreateEmpty(const ASTContext &Context, 1012 bool HasQualifier, 1013 bool HasFoundDecl, 1014 bool HasTemplateKWAndArgsInfo, 1015 unsigned NumTemplateArgs); 1016 1017 ValueDecl *getDecl() { return D; } 1018 const ValueDecl *getDecl() const { return D; } 1019 void setDecl(ValueDecl *NewD) { D = NewD; } 1020 1021 DeclarationNameInfo getNameInfo() const { 1022 return DeclarationNameInfo(getDecl()->getDeclName(), Loc, DNLoc); 1023 } 1024 1025 SourceLocation getLocation() const { return Loc; } 1026 void setLocation(SourceLocation L) { Loc = L; } 1027 SourceLocation getLocStart() const LLVM_READONLY; 1028 SourceLocation getLocEnd() const LLVM_READONLY; 1029 1030 /// \brief Determine whether this declaration reference was preceded by a 1031 /// C++ nested-name-specifier, e.g., \c N::foo. 1032 bool hasQualifier() const { return DeclRefExprBits.HasQualifier; } 1033 1034 /// \brief If the name was qualified, retrieves the nested-name-specifier 1035 /// that precedes the name, with source-location information. 1036 NestedNameSpecifierLoc getQualifierLoc() const { 1037 if (!hasQualifier()) 1038 return NestedNameSpecifierLoc(); 1039 return *getTrailingObjects<NestedNameSpecifierLoc>(); 1040 } 1041 1042 /// \brief If the name was qualified, retrieves the nested-name-specifier 1043 /// that precedes the name. Otherwise, returns NULL. 1044 NestedNameSpecifier *getQualifier() const { 1045 return getQualifierLoc().getNestedNameSpecifier(); 1046 } 1047 1048 /// \brief Get the NamedDecl through which this reference occurred. 1049 /// 1050 /// This Decl may be different from the ValueDecl actually referred to in the 1051 /// presence of using declarations, etc. It always returns non-NULL, and may 1052 /// simple return the ValueDecl when appropriate. 1053 1054 NamedDecl *getFoundDecl() { 1055 return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D; 1056 } 1057 1058 /// \brief Get the NamedDecl through which this reference occurred. 1059 /// See non-const variant. 1060 const NamedDecl *getFoundDecl() const { 1061 return hasFoundDecl() ? *getTrailingObjects<NamedDecl *>() : D; 1062 } 1063 1064 bool hasTemplateKWAndArgsInfo() const { 1065 return DeclRefExprBits.HasTemplateKWAndArgsInfo; 1066 } 1067 1068 /// \brief Retrieve the location of the template keyword preceding 1069 /// this name, if any. 1070 SourceLocation getTemplateKeywordLoc() const { 1071 if (!hasTemplateKWAndArgsInfo()) return SourceLocation(); 1072 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc; 1073 } 1074 1075 /// \brief Retrieve the location of the left angle bracket starting the 1076 /// explicit template argument list following the name, if any. 1077 SourceLocation getLAngleLoc() const { 1078 if (!hasTemplateKWAndArgsInfo()) return SourceLocation(); 1079 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc; 1080 } 1081 1082 /// \brief Retrieve the location of the right angle bracket ending the 1083 /// explicit template argument list following the name, if any. 1084 SourceLocation getRAngleLoc() const { 1085 if (!hasTemplateKWAndArgsInfo()) return SourceLocation(); 1086 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc; 1087 } 1088 1089 /// \brief Determines whether the name in this declaration reference 1090 /// was preceded by the template keyword. 1091 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } 1092 1093 /// \brief Determines whether this declaration reference was followed by an 1094 /// explicit template argument list. 1095 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } 1096 1097 /// \brief Copies the template arguments (if present) into the given 1098 /// structure. 1099 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 1100 if (hasExplicitTemplateArgs()) 1101 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto( 1102 getTrailingObjects<TemplateArgumentLoc>(), List); 1103 } 1104 1105 /// \brief Retrieve the template arguments provided as part of this 1106 /// template-id. 1107 const TemplateArgumentLoc *getTemplateArgs() const { 1108 if (!hasExplicitTemplateArgs()) 1109 return nullptr; 1110 1111 return getTrailingObjects<TemplateArgumentLoc>(); 1112 } 1113 1114 /// \brief Retrieve the number of template arguments provided as part of this 1115 /// template-id. 1116 unsigned getNumTemplateArgs() const { 1117 if (!hasExplicitTemplateArgs()) 1118 return 0; 1119 1120 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs; 1121 } 1122 1123 ArrayRef<TemplateArgumentLoc> template_arguments() const { 1124 return {getTemplateArgs(), getNumTemplateArgs()}; 1125 } 1126 1127 /// \brief Returns true if this expression refers to a function that 1128 /// was resolved from an overloaded set having size greater than 1. 1129 bool hadMultipleCandidates() const { 1130 return DeclRefExprBits.HadMultipleCandidates; 1131 } 1132 /// \brief Sets the flag telling whether this expression refers to 1133 /// a function that was resolved from an overloaded set having size 1134 /// greater than 1. 1135 void setHadMultipleCandidates(bool V = true) { 1136 DeclRefExprBits.HadMultipleCandidates = V; 1137 } 1138 1139 /// \brief Does this DeclRefExpr refer to an enclosing local or a captured 1140 /// variable? 1141 bool refersToEnclosingVariableOrCapture() const { 1142 return DeclRefExprBits.RefersToEnclosingVariableOrCapture; 1143 } 1144 1145 static bool classof(const Stmt *T) { 1146 return T->getStmtClass() == DeclRefExprClass; 1147 } 1148 1149 // Iterators 1150 child_range children() { 1151 return child_range(child_iterator(), child_iterator()); 1152 } 1153 1154 friend TrailingObjects; 1155 friend class ASTStmtReader; 1156 friend class ASTStmtWriter; 1157 }; 1158 1159 /// \brief [C99 6.4.2.2] - A predefined identifier such as __func__. 1160 class PredefinedExpr : public Expr { 1161 public: 1162 enum IdentType { 1163 Func, 1164 Function, 1165 LFunction, // Same as Function, but as wide string. 1166 FuncDName, 1167 FuncSig, 1168 PrettyFunction, 1169 /// \brief The same as PrettyFunction, except that the 1170 /// 'virtual' keyword is omitted for virtual member functions. 1171 PrettyFunctionNoVirtual 1172 }; 1173 1174 private: 1175 SourceLocation Loc; 1176 IdentType Type; 1177 Stmt *FnName; 1178 1179 public: 1180 PredefinedExpr(SourceLocation L, QualType FNTy, IdentType IT, 1181 StringLiteral *SL); 1182 1183 /// \brief Construct an empty predefined expression. 1184 explicit PredefinedExpr(EmptyShell Empty) 1185 : Expr(PredefinedExprClass, Empty), Loc(), Type(Func), FnName(nullptr) {} 1186 1187 IdentType getIdentType() const { return Type; } 1188 1189 SourceLocation getLocation() const { return Loc; } 1190 void setLocation(SourceLocation L) { Loc = L; } 1191 1192 StringLiteral *getFunctionName(); 1193 const StringLiteral *getFunctionName() const { 1194 return const_cast<PredefinedExpr *>(this)->getFunctionName(); 1195 } 1196 1197 static StringRef getIdentTypeName(IdentType IT); 1198 static std::string ComputeName(IdentType IT, const Decl *CurrentDecl); 1199 1200 SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 1201 SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 1202 1203 static bool classof(const Stmt *T) { 1204 return T->getStmtClass() == PredefinedExprClass; 1205 } 1206 1207 // Iterators 1208 child_range children() { return child_range(&FnName, &FnName + 1); } 1209 1210 friend class ASTStmtReader; 1211 }; 1212 1213 /// \brief Used by IntegerLiteral/FloatingLiteral to store the numeric without 1214 /// leaking memory. 1215 /// 1216 /// For large floats/integers, APFloat/APInt will allocate memory from the heap 1217 /// to represent these numbers. Unfortunately, when we use a BumpPtrAllocator 1218 /// to allocate IntegerLiteral/FloatingLiteral nodes the memory associated with 1219 /// the APFloat/APInt values will never get freed. APNumericStorage uses 1220 /// ASTContext's allocator for memory allocation. 1221 class APNumericStorage { 1222 union { 1223 uint64_t VAL; ///< Used to store the <= 64 bits integer value. 1224 uint64_t *pVal; ///< Used to store the >64 bits integer value. 1225 }; 1226 unsigned BitWidth; 1227 1228 bool hasAllocation() const { return llvm::APInt::getNumWords(BitWidth) > 1; } 1229 1230 APNumericStorage(const APNumericStorage &) = delete; 1231 void operator=(const APNumericStorage &) = delete; 1232 1233 protected: 1234 APNumericStorage() : VAL(0), BitWidth(0) { } 1235 1236 llvm::APInt getIntValue() const { 1237 unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 1238 if (NumWords > 1) 1239 return llvm::APInt(BitWidth, NumWords, pVal); 1240 else 1241 return llvm::APInt(BitWidth, VAL); 1242 } 1243 void setIntValue(const ASTContext &C, const llvm::APInt &Val); 1244 }; 1245 1246 class APIntStorage : private APNumericStorage { 1247 public: 1248 llvm::APInt getValue() const { return getIntValue(); } 1249 void setValue(const ASTContext &C, const llvm::APInt &Val) { 1250 setIntValue(C, Val); 1251 } 1252 }; 1253 1254 class APFloatStorage : private APNumericStorage { 1255 public: 1256 llvm::APFloat getValue(const llvm::fltSemantics &Semantics) const { 1257 return llvm::APFloat(Semantics, getIntValue()); 1258 } 1259 void setValue(const ASTContext &C, const llvm::APFloat &Val) { 1260 setIntValue(C, Val.bitcastToAPInt()); 1261 } 1262 }; 1263 1264 class IntegerLiteral : public Expr, public APIntStorage { 1265 SourceLocation Loc; 1266 1267 /// \brief Construct an empty integer literal. 1268 explicit IntegerLiteral(EmptyShell Empty) 1269 : Expr(IntegerLiteralClass, Empty) { } 1270 1271 public: 1272 // type should be IntTy, LongTy, LongLongTy, UnsignedIntTy, UnsignedLongTy, 1273 // or UnsignedLongLongTy 1274 IntegerLiteral(const ASTContext &C, const llvm::APInt &V, QualType type, 1275 SourceLocation l); 1276 1277 /// \brief Returns a new integer literal with value 'V' and type 'type'. 1278 /// \param type - either IntTy, LongTy, LongLongTy, UnsignedIntTy, 1279 /// UnsignedLongTy, or UnsignedLongLongTy which should match the size of V 1280 /// \param V - the value that the returned integer literal contains. 1281 static IntegerLiteral *Create(const ASTContext &C, const llvm::APInt &V, 1282 QualType type, SourceLocation l); 1283 /// \brief Returns a new empty integer literal. 1284 static IntegerLiteral *Create(const ASTContext &C, EmptyShell Empty); 1285 1286 SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 1287 SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 1288 1289 /// \brief Retrieve the location of the literal. 1290 SourceLocation getLocation() const { return Loc; } 1291 1292 void setLocation(SourceLocation Location) { Loc = Location; } 1293 1294 static bool classof(const Stmt *T) { 1295 return T->getStmtClass() == IntegerLiteralClass; 1296 } 1297 1298 // Iterators 1299 child_range children() { 1300 return child_range(child_iterator(), child_iterator()); 1301 } 1302 }; 1303 1304 class CharacterLiteral : public Expr { 1305 public: 1306 enum CharacterKind { 1307 Ascii, 1308 Wide, 1309 UTF8, 1310 UTF16, 1311 UTF32 1312 }; 1313 1314 private: 1315 unsigned Value; 1316 SourceLocation Loc; 1317 public: 1318 // type should be IntTy 1319 CharacterLiteral(unsigned value, CharacterKind kind, QualType type, 1320 SourceLocation l) 1321 : Expr(CharacterLiteralClass, type, VK_RValue, OK_Ordinary, false, false, 1322 false, false), 1323 Value(value), Loc(l) { 1324 CharacterLiteralBits.Kind = kind; 1325 } 1326 1327 /// \brief Construct an empty character literal. 1328 CharacterLiteral(EmptyShell Empty) : Expr(CharacterLiteralClass, Empty) { } 1329 1330 SourceLocation getLocation() const { return Loc; } 1331 CharacterKind getKind() const { 1332 return static_cast<CharacterKind>(CharacterLiteralBits.Kind); 1333 } 1334 1335 SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 1336 SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 1337 1338 unsigned getValue() const { return Value; } 1339 1340 void setLocation(SourceLocation Location) { Loc = Location; } 1341 void setKind(CharacterKind kind) { CharacterLiteralBits.Kind = kind; } 1342 void setValue(unsigned Val) { Value = Val; } 1343 1344 static bool classof(const Stmt *T) { 1345 return T->getStmtClass() == CharacterLiteralClass; 1346 } 1347 1348 // Iterators 1349 child_range children() { 1350 return child_range(child_iterator(), child_iterator()); 1351 } 1352 }; 1353 1354 class FloatingLiteral : public Expr, private APFloatStorage { 1355 SourceLocation Loc; 1356 1357 FloatingLiteral(const ASTContext &C, const llvm::APFloat &V, bool isexact, 1358 QualType Type, SourceLocation L); 1359 1360 /// \brief Construct an empty floating-point literal. 1361 explicit FloatingLiteral(const ASTContext &C, EmptyShell Empty); 1362 1363 public: 1364 static FloatingLiteral *Create(const ASTContext &C, const llvm::APFloat &V, 1365 bool isexact, QualType Type, SourceLocation L); 1366 static FloatingLiteral *Create(const ASTContext &C, EmptyShell Empty); 1367 1368 llvm::APFloat getValue() const { 1369 return APFloatStorage::getValue(getSemantics()); 1370 } 1371 void setValue(const ASTContext &C, const llvm::APFloat &Val) { 1372 assert(&getSemantics() == &Val.getSemantics() && "Inconsistent semantics"); 1373 APFloatStorage::setValue(C, Val); 1374 } 1375 1376 /// Get a raw enumeration value representing the floating-point semantics of 1377 /// this literal (32-bit IEEE, x87, ...), suitable for serialisation. 1378 APFloatSemantics getRawSemantics() const { 1379 return static_cast<APFloatSemantics>(FloatingLiteralBits.Semantics); 1380 } 1381 1382 /// Set the raw enumeration value representing the floating-point semantics of 1383 /// this literal (32-bit IEEE, x87, ...), suitable for serialisation. 1384 void setRawSemantics(APFloatSemantics Sem) { 1385 FloatingLiteralBits.Semantics = Sem; 1386 } 1387 1388 /// Return the APFloat semantics this literal uses. 1389 const llvm::fltSemantics &getSemantics() const; 1390 1391 /// Set the APFloat semantics this literal uses. 1392 void setSemantics(const llvm::fltSemantics &Sem); 1393 1394 bool isExact() const { return FloatingLiteralBits.IsExact; } 1395 void setExact(bool E) { FloatingLiteralBits.IsExact = E; } 1396 1397 /// getValueAsApproximateDouble - This returns the value as an inaccurate 1398 /// double. Note that this may cause loss of precision, but is useful for 1399 /// debugging dumps, etc. 1400 double getValueAsApproximateDouble() const; 1401 1402 SourceLocation getLocation() const { return Loc; } 1403 void setLocation(SourceLocation L) { Loc = L; } 1404 1405 SourceLocation getLocStart() const LLVM_READONLY { return Loc; } 1406 SourceLocation getLocEnd() const LLVM_READONLY { return Loc; } 1407 1408 static bool classof(const Stmt *T) { 1409 return T->getStmtClass() == FloatingLiteralClass; 1410 } 1411 1412 // Iterators 1413 child_range children() { 1414 return child_range(child_iterator(), child_iterator()); 1415 } 1416 }; 1417 1418 /// ImaginaryLiteral - We support imaginary integer and floating point literals, 1419 /// like "1.0i". We represent these as a wrapper around FloatingLiteral and 1420 /// IntegerLiteral classes. Instances of this class always have a Complex type 1421 /// whose element type matches the subexpression. 1422 /// 1423 class ImaginaryLiteral : public Expr { 1424 Stmt *Val; 1425 public: 1426 ImaginaryLiteral(Expr *val, QualType Ty) 1427 : Expr(ImaginaryLiteralClass, Ty, VK_RValue, OK_Ordinary, false, false, 1428 false, false), 1429 Val(val) {} 1430 1431 /// \brief Build an empty imaginary literal. 1432 explicit ImaginaryLiteral(EmptyShell Empty) 1433 : Expr(ImaginaryLiteralClass, Empty) { } 1434 1435 const Expr *getSubExpr() const { return cast<Expr>(Val); } 1436 Expr *getSubExpr() { return cast<Expr>(Val); } 1437 void setSubExpr(Expr *E) { Val = E; } 1438 1439 SourceLocation getLocStart() const LLVM_READONLY { return Val->getLocStart(); } 1440 SourceLocation getLocEnd() const LLVM_READONLY { return Val->getLocEnd(); } 1441 1442 static bool classof(const Stmt *T) { 1443 return T->getStmtClass() == ImaginaryLiteralClass; 1444 } 1445 1446 // Iterators 1447 child_range children() { return child_range(&Val, &Val+1); } 1448 }; 1449 1450 /// StringLiteral - This represents a string literal expression, e.g. "foo" 1451 /// or L"bar" (wide strings). The actual string is returned by getBytes() 1452 /// is NOT null-terminated, and the length of the string is determined by 1453 /// calling getByteLength(). The C type for a string is always a 1454 /// ConstantArrayType. In C++, the char type is const qualified, in C it is 1455 /// not. 1456 /// 1457 /// Note that strings in C can be formed by concatenation of multiple string 1458 /// literal pptokens in translation phase #6. This keeps track of the locations 1459 /// of each of these pieces. 1460 /// 1461 /// Strings in C can also be truncated and extended by assigning into arrays, 1462 /// e.g. with constructs like: 1463 /// char X[2] = "foobar"; 1464 /// In this case, getByteLength() will return 6, but the string literal will 1465 /// have type "char[2]". 1466 class StringLiteral : public Expr { 1467 public: 1468 enum StringKind { 1469 Ascii, 1470 Wide, 1471 UTF8, 1472 UTF16, 1473 UTF32 1474 }; 1475 1476 private: 1477 friend class ASTStmtReader; 1478 1479 union { 1480 const char *asChar; 1481 const uint16_t *asUInt16; 1482 const uint32_t *asUInt32; 1483 } StrData; 1484 unsigned Length; 1485 unsigned CharByteWidth : 4; 1486 unsigned Kind : 3; 1487 unsigned IsPascal : 1; 1488 unsigned NumConcatenated; 1489 SourceLocation TokLocs[1]; 1490 1491 StringLiteral(QualType Ty) : 1492 Expr(StringLiteralClass, Ty, VK_LValue, OK_Ordinary, false, false, false, 1493 false) {} 1494 1495 static int mapCharByteWidth(TargetInfo const &target,StringKind k); 1496 1497 public: 1498 /// This is the "fully general" constructor that allows representation of 1499 /// strings formed from multiple concatenated tokens. 1500 static StringLiteral *Create(const ASTContext &C, StringRef Str, 1501 StringKind Kind, bool Pascal, QualType Ty, 1502 const SourceLocation *Loc, unsigned NumStrs); 1503 1504 /// Simple constructor for string literals made from one token. 1505 static StringLiteral *Create(const ASTContext &C, StringRef Str, 1506 StringKind Kind, bool Pascal, QualType Ty, 1507 SourceLocation Loc) { 1508 return Create(C, Str, Kind, Pascal, Ty, &Loc, 1); 1509 } 1510 1511 /// \brief Construct an empty string literal. 1512 static StringLiteral *CreateEmpty(const ASTContext &C, unsigned NumStrs); 1513 1514 StringRef getString() const { 1515 assert(CharByteWidth==1 1516 && "This function is used in places that assume strings use char"); 1517 return StringRef(StrData.asChar, getByteLength()); 1518 } 1519 1520 /// Allow access to clients that need the byte representation, such as 1521 /// ASTWriterStmt::VisitStringLiteral(). 1522 StringRef getBytes() const { 1523 // FIXME: StringRef may not be the right type to use as a result for this. 1524 if (CharByteWidth == 1) 1525 return StringRef(StrData.asChar, getByteLength()); 1526 if (CharByteWidth == 4) 1527 return StringRef(reinterpret_cast<const char*>(StrData.asUInt32), 1528 getByteLength()); 1529 assert(CharByteWidth == 2 && "unsupported CharByteWidth"); 1530 return StringRef(reinterpret_cast<const char*>(StrData.asUInt16), 1531 getByteLength()); 1532 } 1533 1534 void outputString(raw_ostream &OS) const; 1535 1536 uint32_t getCodeUnit(size_t i) const { 1537 assert(i < Length && "out of bounds access"); 1538 if (CharByteWidth == 1) 1539 return static_cast<unsigned char>(StrData.asChar[i]); 1540 if (CharByteWidth == 4) 1541 return StrData.asUInt32[i]; 1542 assert(CharByteWidth == 2 && "unsupported CharByteWidth"); 1543 return StrData.asUInt16[i]; 1544 } 1545 1546 unsigned getByteLength() const { return CharByteWidth*Length; } 1547 unsigned getLength() const { return Length; } 1548 unsigned getCharByteWidth() const { return CharByteWidth; } 1549 1550 /// \brief Sets the string data to the given string data. 1551 void setString(const ASTContext &C, StringRef Str, 1552 StringKind Kind, bool IsPascal); 1553 1554 StringKind getKind() const { return static_cast<StringKind>(Kind); } 1555 1556 1557 bool isAscii() const { return Kind == Ascii; } 1558 bool isWide() const { return Kind == Wide; } 1559 bool isUTF8() const { return Kind == UTF8; } 1560 bool isUTF16() const { return Kind == UTF16; } 1561 bool isUTF32() const { return Kind == UTF32; } 1562 bool isPascal() const { return IsPascal; } 1563 1564 bool containsNonAsciiOrNull() const { 1565 StringRef Str = getString(); 1566 for (unsigned i = 0, e = Str.size(); i != e; ++i) 1567 if (!isASCII(Str[i]) || !Str[i]) 1568 return true; 1569 return false; 1570 } 1571 1572 /// getNumConcatenated - Get the number of string literal tokens that were 1573 /// concatenated in translation phase #6 to form this string literal. 1574 unsigned getNumConcatenated() const { return NumConcatenated; } 1575 1576 SourceLocation getStrTokenLoc(unsigned TokNum) const { 1577 assert(TokNum < NumConcatenated && "Invalid tok number"); 1578 return TokLocs[TokNum]; 1579 } 1580 void setStrTokenLoc(unsigned TokNum, SourceLocation L) { 1581 assert(TokNum < NumConcatenated && "Invalid tok number"); 1582 TokLocs[TokNum] = L; 1583 } 1584 1585 /// getLocationOfByte - Return a source location that points to the specified 1586 /// byte of this string literal. 1587 /// 1588 /// Strings are amazingly complex. They can be formed from multiple tokens 1589 /// and can have escape sequences in them in addition to the usual trigraph 1590 /// and escaped newline business. This routine handles this complexity. 1591 /// 1592 SourceLocation 1593 getLocationOfByte(unsigned ByteNo, const SourceManager &SM, 1594 const LangOptions &Features, const TargetInfo &Target, 1595 unsigned *StartToken = nullptr, 1596 unsigned *StartTokenByteOffset = nullptr) const; 1597 1598 typedef const SourceLocation *tokloc_iterator; 1599 tokloc_iterator tokloc_begin() const { return TokLocs; } 1600 tokloc_iterator tokloc_end() const { return TokLocs + NumConcatenated; } 1601 1602 SourceLocation getLocStart() const LLVM_READONLY { return TokLocs[0]; } 1603 SourceLocation getLocEnd() const LLVM_READONLY { 1604 return TokLocs[NumConcatenated - 1]; 1605 } 1606 1607 static bool classof(const Stmt *T) { 1608 return T->getStmtClass() == StringLiteralClass; 1609 } 1610 1611 // Iterators 1612 child_range children() { 1613 return child_range(child_iterator(), child_iterator()); 1614 } 1615 }; 1616 1617 /// ParenExpr - This represents a parethesized expression, e.g. "(1)". This 1618 /// AST node is only formed if full location information is requested. 1619 class ParenExpr : public Expr { 1620 SourceLocation L, R; 1621 Stmt *Val; 1622 public: 1623 ParenExpr(SourceLocation l, SourceLocation r, Expr *val) 1624 : Expr(ParenExprClass, val->getType(), 1625 val->getValueKind(), val->getObjectKind(), 1626 val->isTypeDependent(), val->isValueDependent(), 1627 val->isInstantiationDependent(), 1628 val->containsUnexpandedParameterPack()), 1629 L(l), R(r), Val(val) {} 1630 1631 /// \brief Construct an empty parenthesized expression. 1632 explicit ParenExpr(EmptyShell Empty) 1633 : Expr(ParenExprClass, Empty) { } 1634 1635 const Expr *getSubExpr() const { return cast<Expr>(Val); } 1636 Expr *getSubExpr() { return cast<Expr>(Val); } 1637 void setSubExpr(Expr *E) { Val = E; } 1638 1639 SourceLocation getLocStart() const LLVM_READONLY { return L; } 1640 SourceLocation getLocEnd() const LLVM_READONLY { return R; } 1641 1642 /// \brief Get the location of the left parentheses '('. 1643 SourceLocation getLParen() const { return L; } 1644 void setLParen(SourceLocation Loc) { L = Loc; } 1645 1646 /// \brief Get the location of the right parentheses ')'. 1647 SourceLocation getRParen() const { return R; } 1648 void setRParen(SourceLocation Loc) { R = Loc; } 1649 1650 static bool classof(const Stmt *T) { 1651 return T->getStmtClass() == ParenExprClass; 1652 } 1653 1654 // Iterators 1655 child_range children() { return child_range(&Val, &Val+1); } 1656 }; 1657 1658 /// UnaryOperator - This represents the unary-expression's (except sizeof and 1659 /// alignof), the postinc/postdec operators from postfix-expression, and various 1660 /// extensions. 1661 /// 1662 /// Notes on various nodes: 1663 /// 1664 /// Real/Imag - These return the real/imag part of a complex operand. If 1665 /// applied to a non-complex value, the former returns its operand and the 1666 /// later returns zero in the type of the operand. 1667 /// 1668 class UnaryOperator : public Expr { 1669 public: 1670 typedef UnaryOperatorKind Opcode; 1671 1672 private: 1673 unsigned Opc : 5; 1674 SourceLocation Loc; 1675 Stmt *Val; 1676 public: 1677 1678 UnaryOperator(Expr *input, Opcode opc, QualType type, 1679 ExprValueKind VK, ExprObjectKind OK, SourceLocation l) 1680 : Expr(UnaryOperatorClass, type, VK, OK, 1681 input->isTypeDependent() || type->isDependentType(), 1682 input->isValueDependent(), 1683 (input->isInstantiationDependent() || 1684 type->isInstantiationDependentType()), 1685 input->containsUnexpandedParameterPack()), 1686 Opc(opc), Loc(l), Val(input) {} 1687 1688 /// \brief Build an empty unary operator. 1689 explicit UnaryOperator(EmptyShell Empty) 1690 : Expr(UnaryOperatorClass, Empty), Opc(UO_AddrOf) { } 1691 1692 Opcode getOpcode() const { return static_cast<Opcode>(Opc); } 1693 void setOpcode(Opcode O) { Opc = O; } 1694 1695 Expr *getSubExpr() const { return cast<Expr>(Val); } 1696 void setSubExpr(Expr *E) { Val = E; } 1697 1698 /// getOperatorLoc - Return the location of the operator. 1699 SourceLocation getOperatorLoc() const { return Loc; } 1700 void setOperatorLoc(SourceLocation L) { Loc = L; } 1701 1702 /// isPostfix - Return true if this is a postfix operation, like x++. 1703 static bool isPostfix(Opcode Op) { 1704 return Op == UO_PostInc || Op == UO_PostDec; 1705 } 1706 1707 /// isPrefix - Return true if this is a prefix operation, like --x. 1708 static bool isPrefix(Opcode Op) { 1709 return Op == UO_PreInc || Op == UO_PreDec; 1710 } 1711 1712 bool isPrefix() const { return isPrefix(getOpcode()); } 1713 bool isPostfix() const { return isPostfix(getOpcode()); } 1714 1715 static bool isIncrementOp(Opcode Op) { 1716 return Op == UO_PreInc || Op == UO_PostInc; 1717 } 1718 bool isIncrementOp() const { 1719 return isIncrementOp(getOpcode()); 1720 } 1721 1722 static bool isDecrementOp(Opcode Op) { 1723 return Op == UO_PreDec || Op == UO_PostDec; 1724 } 1725 bool isDecrementOp() const { 1726 return isDecrementOp(getOpcode()); 1727 } 1728 1729 static bool isIncrementDecrementOp(Opcode Op) { return Op <= UO_PreDec; } 1730 bool isIncrementDecrementOp() const { 1731 return isIncrementDecrementOp(getOpcode()); 1732 } 1733 1734 static bool isArithmeticOp(Opcode Op) { 1735 return Op >= UO_Plus && Op <= UO_LNot; 1736 } 1737 bool isArithmeticOp() const { return isArithmeticOp(getOpcode()); } 1738 1739 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 1740 /// corresponds to, e.g. "sizeof" or "[pre]++" 1741 static StringRef getOpcodeStr(Opcode Op); 1742 1743 /// \brief Retrieve the unary opcode that corresponds to the given 1744 /// overloaded operator. 1745 static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix); 1746 1747 /// \brief Retrieve the overloaded operator kind that corresponds to 1748 /// the given unary opcode. 1749 static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); 1750 1751 SourceLocation getLocStart() const LLVM_READONLY { 1752 return isPostfix() ? Val->getLocStart() : Loc; 1753 } 1754 SourceLocation getLocEnd() const LLVM_READONLY { 1755 return isPostfix() ? Loc : Val->getLocEnd(); 1756 } 1757 SourceLocation getExprLoc() const LLVM_READONLY { return Loc; } 1758 1759 static bool classof(const Stmt *T) { 1760 return T->getStmtClass() == UnaryOperatorClass; 1761 } 1762 1763 // Iterators 1764 child_range children() { return child_range(&Val, &Val+1); } 1765 }; 1766 1767 /// Helper class for OffsetOfExpr. 1768 1769 // __builtin_offsetof(type, identifier(.identifier|[expr])*) 1770 class OffsetOfNode { 1771 public: 1772 /// \brief The kind of offsetof node we have. 1773 enum Kind { 1774 /// \brief An index into an array. 1775 Array = 0x00, 1776 /// \brief A field. 1777 Field = 0x01, 1778 /// \brief A field in a dependent type, known only by its name. 1779 Identifier = 0x02, 1780 /// \brief An implicit indirection through a C++ base class, when the 1781 /// field found is in a base class. 1782 Base = 0x03 1783 }; 1784 1785 private: 1786 enum { MaskBits = 2, Mask = 0x03 }; 1787 1788 /// \brief The source range that covers this part of the designator. 1789 SourceRange Range; 1790 1791 /// \brief The data describing the designator, which comes in three 1792 /// different forms, depending on the lower two bits. 1793 /// - An unsigned index into the array of Expr*'s stored after this node 1794 /// in memory, for [constant-expression] designators. 1795 /// - A FieldDecl*, for references to a known field. 1796 /// - An IdentifierInfo*, for references to a field with a given name 1797 /// when the class type is dependent. 1798 /// - A CXXBaseSpecifier*, for references that look at a field in a 1799 /// base class. 1800 uintptr_t Data; 1801 1802 public: 1803 /// \brief Create an offsetof node that refers to an array element. 1804 OffsetOfNode(SourceLocation LBracketLoc, unsigned Index, 1805 SourceLocation RBracketLoc) 1806 : Range(LBracketLoc, RBracketLoc), Data((Index << 2) | Array) {} 1807 1808 /// \brief Create an offsetof node that refers to a field. 1809 OffsetOfNode(SourceLocation DotLoc, FieldDecl *Field, SourceLocation NameLoc) 1810 : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc), 1811 Data(reinterpret_cast<uintptr_t>(Field) | OffsetOfNode::Field) {} 1812 1813 /// \brief Create an offsetof node that refers to an identifier. 1814 OffsetOfNode(SourceLocation DotLoc, IdentifierInfo *Name, 1815 SourceLocation NameLoc) 1816 : Range(DotLoc.isValid() ? DotLoc : NameLoc, NameLoc), 1817 Data(reinterpret_cast<uintptr_t>(Name) | Identifier) {} 1818 1819 /// \brief Create an offsetof node that refers into a C++ base class. 1820 explicit OffsetOfNode(const CXXBaseSpecifier *Base) 1821 : Range(), Data(reinterpret_cast<uintptr_t>(Base) | OffsetOfNode::Base) {} 1822 1823 /// \brief Determine what kind of offsetof node this is. 1824 Kind getKind() const { return static_cast<Kind>(Data & Mask); } 1825 1826 /// \brief For an array element node, returns the index into the array 1827 /// of expressions. 1828 unsigned getArrayExprIndex() const { 1829 assert(getKind() == Array); 1830 return Data >> 2; 1831 } 1832 1833 /// \brief For a field offsetof node, returns the field. 1834 FieldDecl *getField() const { 1835 assert(getKind() == Field); 1836 return reinterpret_cast<FieldDecl *>(Data & ~(uintptr_t)Mask); 1837 } 1838 1839 /// \brief For a field or identifier offsetof node, returns the name of 1840 /// the field. 1841 IdentifierInfo *getFieldName() const; 1842 1843 /// \brief For a base class node, returns the base specifier. 1844 CXXBaseSpecifier *getBase() const { 1845 assert(getKind() == Base); 1846 return reinterpret_cast<CXXBaseSpecifier *>(Data & ~(uintptr_t)Mask); 1847 } 1848 1849 /// \brief Retrieve the source range that covers this offsetof node. 1850 /// 1851 /// For an array element node, the source range contains the locations of 1852 /// the square brackets. For a field or identifier node, the source range 1853 /// contains the location of the period (if there is one) and the 1854 /// identifier. 1855 SourceRange getSourceRange() const LLVM_READONLY { return Range; } 1856 SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } 1857 SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 1858 }; 1859 1860 /// OffsetOfExpr - [C99 7.17] - This represents an expression of the form 1861 /// offsetof(record-type, member-designator). For example, given: 1862 /// @code 1863 /// struct S { 1864 /// float f; 1865 /// double d; 1866 /// }; 1867 /// struct T { 1868 /// int i; 1869 /// struct S s[10]; 1870 /// }; 1871 /// @endcode 1872 /// we can represent and evaluate the expression @c offsetof(struct T, s[2].d). 1873 1874 class OffsetOfExpr final 1875 : public Expr, 1876 private llvm::TrailingObjects<OffsetOfExpr, OffsetOfNode, Expr *> { 1877 SourceLocation OperatorLoc, RParenLoc; 1878 // Base type; 1879 TypeSourceInfo *TSInfo; 1880 // Number of sub-components (i.e. instances of OffsetOfNode). 1881 unsigned NumComps; 1882 // Number of sub-expressions (i.e. array subscript expressions). 1883 unsigned NumExprs; 1884 1885 size_t numTrailingObjects(OverloadToken<OffsetOfNode>) const { 1886 return NumComps; 1887 } 1888 1889 OffsetOfExpr(const ASTContext &C, QualType type, 1890 SourceLocation OperatorLoc, TypeSourceInfo *tsi, 1891 ArrayRef<OffsetOfNode> comps, ArrayRef<Expr*> exprs, 1892 SourceLocation RParenLoc); 1893 1894 explicit OffsetOfExpr(unsigned numComps, unsigned numExprs) 1895 : Expr(OffsetOfExprClass, EmptyShell()), 1896 TSInfo(nullptr), NumComps(numComps), NumExprs(numExprs) {} 1897 1898 public: 1899 1900 static OffsetOfExpr *Create(const ASTContext &C, QualType type, 1901 SourceLocation OperatorLoc, TypeSourceInfo *tsi, 1902 ArrayRef<OffsetOfNode> comps, 1903 ArrayRef<Expr*> exprs, SourceLocation RParenLoc); 1904 1905 static OffsetOfExpr *CreateEmpty(const ASTContext &C, 1906 unsigned NumComps, unsigned NumExprs); 1907 1908 /// getOperatorLoc - Return the location of the operator. 1909 SourceLocation getOperatorLoc() const { return OperatorLoc; } 1910 void setOperatorLoc(SourceLocation L) { OperatorLoc = L; } 1911 1912 /// \brief Return the location of the right parentheses. 1913 SourceLocation getRParenLoc() const { return RParenLoc; } 1914 void setRParenLoc(SourceLocation R) { RParenLoc = R; } 1915 1916 TypeSourceInfo *getTypeSourceInfo() const { 1917 return TSInfo; 1918 } 1919 void setTypeSourceInfo(TypeSourceInfo *tsi) { 1920 TSInfo = tsi; 1921 } 1922 1923 const OffsetOfNode &getComponent(unsigned Idx) const { 1924 assert(Idx < NumComps && "Subscript out of range"); 1925 return getTrailingObjects<OffsetOfNode>()[Idx]; 1926 } 1927 1928 void setComponent(unsigned Idx, OffsetOfNode ON) { 1929 assert(Idx < NumComps && "Subscript out of range"); 1930 getTrailingObjects<OffsetOfNode>()[Idx] = ON; 1931 } 1932 1933 unsigned getNumComponents() const { 1934 return NumComps; 1935 } 1936 1937 Expr* getIndexExpr(unsigned Idx) { 1938 assert(Idx < NumExprs && "Subscript out of range"); 1939 return getTrailingObjects<Expr *>()[Idx]; 1940 } 1941 1942 const Expr *getIndexExpr(unsigned Idx) const { 1943 assert(Idx < NumExprs && "Subscript out of range"); 1944 return getTrailingObjects<Expr *>()[Idx]; 1945 } 1946 1947 void setIndexExpr(unsigned Idx, Expr* E) { 1948 assert(Idx < NumComps && "Subscript out of range"); 1949 getTrailingObjects<Expr *>()[Idx] = E; 1950 } 1951 1952 unsigned getNumExpressions() const { 1953 return NumExprs; 1954 } 1955 1956 SourceLocation getLocStart() const LLVM_READONLY { return OperatorLoc; } 1957 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 1958 1959 static bool classof(const Stmt *T) { 1960 return T->getStmtClass() == OffsetOfExprClass; 1961 } 1962 1963 // Iterators 1964 child_range children() { 1965 Stmt **begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>()); 1966 return child_range(begin, begin + NumExprs); 1967 } 1968 friend TrailingObjects; 1969 }; 1970 1971 /// UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) 1972 /// expression operand. Used for sizeof/alignof (C99 6.5.3.4) and 1973 /// vec_step (OpenCL 1.1 6.11.12). 1974 class UnaryExprOrTypeTraitExpr : public Expr { 1975 union { 1976 TypeSourceInfo *Ty; 1977 Stmt *Ex; 1978 } Argument; 1979 SourceLocation OpLoc, RParenLoc; 1980 1981 public: 1982 UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo, 1983 QualType resultType, SourceLocation op, 1984 SourceLocation rp) : 1985 Expr(UnaryExprOrTypeTraitExprClass, resultType, VK_RValue, OK_Ordinary, 1986 false, // Never type-dependent (C++ [temp.dep.expr]p3). 1987 // Value-dependent if the argument is type-dependent. 1988 TInfo->getType()->isDependentType(), 1989 TInfo->getType()->isInstantiationDependentType(), 1990 TInfo->getType()->containsUnexpandedParameterPack()), 1991 OpLoc(op), RParenLoc(rp) { 1992 UnaryExprOrTypeTraitExprBits.Kind = ExprKind; 1993 UnaryExprOrTypeTraitExprBits.IsType = true; 1994 Argument.Ty = TInfo; 1995 } 1996 1997 UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, Expr *E, 1998 QualType resultType, SourceLocation op, 1999 SourceLocation rp); 2000 2001 /// \brief Construct an empty sizeof/alignof expression. 2002 explicit UnaryExprOrTypeTraitExpr(EmptyShell Empty) 2003 : Expr(UnaryExprOrTypeTraitExprClass, Empty) { } 2004 2005 UnaryExprOrTypeTrait getKind() const { 2006 return static_cast<UnaryExprOrTypeTrait>(UnaryExprOrTypeTraitExprBits.Kind); 2007 } 2008 void setKind(UnaryExprOrTypeTrait K) { UnaryExprOrTypeTraitExprBits.Kind = K;} 2009 2010 bool isArgumentType() const { return UnaryExprOrTypeTraitExprBits.IsType; } 2011 QualType getArgumentType() const { 2012 return getArgumentTypeInfo()->getType(); 2013 } 2014 TypeSourceInfo *getArgumentTypeInfo() const { 2015 assert(isArgumentType() && "calling getArgumentType() when arg is expr"); 2016 return Argument.Ty; 2017 } 2018 Expr *getArgumentExpr() { 2019 assert(!isArgumentType() && "calling getArgumentExpr() when arg is type"); 2020 return static_cast<Expr*>(Argument.Ex); 2021 } 2022 const Expr *getArgumentExpr() const { 2023 return const_cast<UnaryExprOrTypeTraitExpr*>(this)->getArgumentExpr(); 2024 } 2025 2026 void setArgument(Expr *E) { 2027 Argument.Ex = E; 2028 UnaryExprOrTypeTraitExprBits.IsType = false; 2029 } 2030 void setArgument(TypeSourceInfo *TInfo) { 2031 Argument.Ty = TInfo; 2032 UnaryExprOrTypeTraitExprBits.IsType = true; 2033 } 2034 2035 /// Gets the argument type, or the type of the argument expression, whichever 2036 /// is appropriate. 2037 QualType getTypeOfArgument() const { 2038 return isArgumentType() ? getArgumentType() : getArgumentExpr()->getType(); 2039 } 2040 2041 SourceLocation getOperatorLoc() const { return OpLoc; } 2042 void setOperatorLoc(SourceLocation L) { OpLoc = L; } 2043 2044 SourceLocation getRParenLoc() const { return RParenLoc; } 2045 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 2046 2047 SourceLocation getLocStart() const LLVM_READONLY { return OpLoc; } 2048 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 2049 2050 static bool classof(const Stmt *T) { 2051 return T->getStmtClass() == UnaryExprOrTypeTraitExprClass; 2052 } 2053 2054 // Iterators 2055 child_range children(); 2056 }; 2057 2058 //===----------------------------------------------------------------------===// 2059 // Postfix Operators. 2060 //===----------------------------------------------------------------------===// 2061 2062 /// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting. 2063 class ArraySubscriptExpr : public Expr { 2064 enum { LHS, RHS, END_EXPR=2 }; 2065 Stmt* SubExprs[END_EXPR]; 2066 SourceLocation RBracketLoc; 2067 public: 2068 ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t, 2069 ExprValueKind VK, ExprObjectKind OK, 2070 SourceLocation rbracketloc) 2071 : Expr(ArraySubscriptExprClass, t, VK, OK, 2072 lhs->isTypeDependent() || rhs->isTypeDependent(), 2073 lhs->isValueDependent() || rhs->isValueDependent(), 2074 (lhs->isInstantiationDependent() || 2075 rhs->isInstantiationDependent()), 2076 (lhs->containsUnexpandedParameterPack() || 2077 rhs->containsUnexpandedParameterPack())), 2078 RBracketLoc(rbracketloc) { 2079 SubExprs[LHS] = lhs; 2080 SubExprs[RHS] = rhs; 2081 } 2082 2083 /// \brief Create an empty array subscript expression. 2084 explicit ArraySubscriptExpr(EmptyShell Shell) 2085 : Expr(ArraySubscriptExprClass, Shell) { } 2086 2087 /// An array access can be written A[4] or 4[A] (both are equivalent). 2088 /// - getBase() and getIdx() always present the normalized view: A[4]. 2089 /// In this case getBase() returns "A" and getIdx() returns "4". 2090 /// - getLHS() and getRHS() present the syntactic view. e.g. for 2091 /// 4[A] getLHS() returns "4". 2092 /// Note: Because vector element access is also written A[4] we must 2093 /// predicate the format conversion in getBase and getIdx only on the 2094 /// the type of the RHS, as it is possible for the LHS to be a vector of 2095 /// integer type 2096 Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); } 2097 const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 2098 void setLHS(Expr *E) { SubExprs[LHS] = E; } 2099 2100 Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); } 2101 const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 2102 void setRHS(Expr *E) { SubExprs[RHS] = E; } 2103 2104 Expr *getBase() { 2105 return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS()); 2106 } 2107 2108 const Expr *getBase() const { 2109 return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS()); 2110 } 2111 2112 Expr *getIdx() { 2113 return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS()); 2114 } 2115 2116 const Expr *getIdx() const { 2117 return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS()); 2118 } 2119 2120 SourceLocation getLocStart() const LLVM_READONLY { 2121 return getLHS()->getLocStart(); 2122 } 2123 SourceLocation getLocEnd() const LLVM_READONLY { return RBracketLoc; } 2124 2125 SourceLocation getRBracketLoc() const { return RBracketLoc; } 2126 void setRBracketLoc(SourceLocation L) { RBracketLoc = L; } 2127 2128 SourceLocation getExprLoc() const LLVM_READONLY { 2129 return getBase()->getExprLoc(); 2130 } 2131 2132 static bool classof(const Stmt *T) { 2133 return T->getStmtClass() == ArraySubscriptExprClass; 2134 } 2135 2136 // Iterators 2137 child_range children() { 2138 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 2139 } 2140 }; 2141 2142 /// CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]). 2143 /// CallExpr itself represents a normal function call, e.g., "f(x, 2)", 2144 /// while its subclasses may represent alternative syntax that (semantically) 2145 /// results in a function call. For example, CXXOperatorCallExpr is 2146 /// a subclass for overloaded operator calls that use operator syntax, e.g., 2147 /// "str1 + str2" to resolve to a function call. 2148 class CallExpr : public Expr { 2149 enum { FN=0, PREARGS_START=1 }; 2150 Stmt **SubExprs; 2151 unsigned NumArgs; 2152 SourceLocation RParenLoc; 2153 2154 void updateDependenciesFromArg(Expr *Arg); 2155 2156 protected: 2157 // These versions of the constructor are for derived classes. 2158 CallExpr(const ASTContext &C, StmtClass SC, Expr *fn, 2159 ArrayRef<Expr *> preargs, ArrayRef<Expr *> args, QualType t, 2160 ExprValueKind VK, SourceLocation rparenloc); 2161 CallExpr(const ASTContext &C, StmtClass SC, Expr *fn, ArrayRef<Expr *> args, 2162 QualType t, ExprValueKind VK, SourceLocation rparenloc); 2163 CallExpr(const ASTContext &C, StmtClass SC, unsigned NumPreArgs, 2164 EmptyShell Empty); 2165 2166 Stmt *getPreArg(unsigned i) { 2167 assert(i < getNumPreArgs() && "Prearg access out of range!"); 2168 return SubExprs[PREARGS_START+i]; 2169 } 2170 const Stmt *getPreArg(unsigned i) const { 2171 assert(i < getNumPreArgs() && "Prearg access out of range!"); 2172 return SubExprs[PREARGS_START+i]; 2173 } 2174 void setPreArg(unsigned i, Stmt *PreArg) { 2175 assert(i < getNumPreArgs() && "Prearg access out of range!"); 2176 SubExprs[PREARGS_START+i] = PreArg; 2177 } 2178 2179 unsigned getNumPreArgs() const { return CallExprBits.NumPreArgs; } 2180 2181 public: 2182 CallExpr(const ASTContext& C, Expr *fn, ArrayRef<Expr*> args, QualType t, 2183 ExprValueKind VK, SourceLocation rparenloc); 2184 2185 /// \brief Build an empty call expression. 2186 CallExpr(const ASTContext &C, StmtClass SC, EmptyShell Empty); 2187 2188 const Expr *getCallee() const { return cast<Expr>(SubExprs[FN]); } 2189 Expr *getCallee() { return cast<Expr>(SubExprs[FN]); } 2190 void setCallee(Expr *F) { SubExprs[FN] = F; } 2191 2192 Decl *getCalleeDecl(); 2193 const Decl *getCalleeDecl() const { 2194 return const_cast<CallExpr*>(this)->getCalleeDecl(); 2195 } 2196 2197 /// \brief If the callee is a FunctionDecl, return it. Otherwise return 0. 2198 FunctionDecl *getDirectCallee(); 2199 const FunctionDecl *getDirectCallee() const { 2200 return const_cast<CallExpr*>(this)->getDirectCallee(); 2201 } 2202 2203 /// getNumArgs - Return the number of actual arguments to this call. 2204 /// 2205 unsigned getNumArgs() const { return NumArgs; } 2206 2207 /// \brief Retrieve the call arguments. 2208 Expr **getArgs() { 2209 return reinterpret_cast<Expr **>(SubExprs+getNumPreArgs()+PREARGS_START); 2210 } 2211 const Expr *const *getArgs() const { 2212 return reinterpret_cast<Expr **>(SubExprs + getNumPreArgs() + 2213 PREARGS_START); 2214 } 2215 2216 /// getArg - Return the specified argument. 2217 Expr *getArg(unsigned Arg) { 2218 assert(Arg < NumArgs && "Arg access out of range!"); 2219 return cast_or_null<Expr>(SubExprs[Arg + getNumPreArgs() + PREARGS_START]); 2220 } 2221 const Expr *getArg(unsigned Arg) const { 2222 assert(Arg < NumArgs && "Arg access out of range!"); 2223 return cast_or_null<Expr>(SubExprs[Arg + getNumPreArgs() + PREARGS_START]); 2224 } 2225 2226 /// setArg - Set the specified argument. 2227 void setArg(unsigned Arg, Expr *ArgExpr) { 2228 assert(Arg < NumArgs && "Arg access out of range!"); 2229 SubExprs[Arg+getNumPreArgs()+PREARGS_START] = ArgExpr; 2230 } 2231 2232 /// setNumArgs - This changes the number of arguments present in this call. 2233 /// Any orphaned expressions are deleted by this, and any new operands are set 2234 /// to null. 2235 void setNumArgs(const ASTContext& C, unsigned NumArgs); 2236 2237 typedef ExprIterator arg_iterator; 2238 typedef ConstExprIterator const_arg_iterator; 2239 typedef llvm::iterator_range<arg_iterator> arg_range; 2240 typedef llvm::iterator_range<const_arg_iterator> arg_const_range; 2241 2242 arg_range arguments() { return arg_range(arg_begin(), arg_end()); } 2243 arg_const_range arguments() const { 2244 return arg_const_range(arg_begin(), arg_end()); 2245 } 2246 2247 arg_iterator arg_begin() { return SubExprs+PREARGS_START+getNumPreArgs(); } 2248 arg_iterator arg_end() { 2249 return SubExprs+PREARGS_START+getNumPreArgs()+getNumArgs(); 2250 } 2251 const_arg_iterator arg_begin() const { 2252 return SubExprs+PREARGS_START+getNumPreArgs(); 2253 } 2254 const_arg_iterator arg_end() const { 2255 return SubExprs+PREARGS_START+getNumPreArgs()+getNumArgs(); 2256 } 2257 2258 /// This method provides fast access to all the subexpressions of 2259 /// a CallExpr without going through the slower virtual child_iterator 2260 /// interface. This provides efficient reverse iteration of the 2261 /// subexpressions. This is currently used for CFG construction. 2262 ArrayRef<Stmt*> getRawSubExprs() { 2263 return llvm::makeArrayRef(SubExprs, 2264 getNumPreArgs() + PREARGS_START + getNumArgs()); 2265 } 2266 2267 /// getNumCommas - Return the number of commas that must have been present in 2268 /// this function call. 2269 unsigned getNumCommas() const { return NumArgs ? NumArgs - 1 : 0; } 2270 2271 /// getBuiltinCallee - If this is a call to a builtin, return the builtin ID 2272 /// of the callee. If not, return 0. 2273 unsigned getBuiltinCallee() const; 2274 2275 /// \brief Returns \c true if this is a call to a builtin which does not 2276 /// evaluate side-effects within its arguments. 2277 bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const; 2278 2279 /// getCallReturnType - Get the return type of the call expr. This is not 2280 /// always the type of the expr itself, if the return type is a reference 2281 /// type. 2282 QualType getCallReturnType(const ASTContext &Ctx) const; 2283 2284 SourceLocation getRParenLoc() const { return RParenLoc; } 2285 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 2286 2287 SourceLocation getLocStart() const LLVM_READONLY; 2288 SourceLocation getLocEnd() const LLVM_READONLY; 2289 2290 static bool classof(const Stmt *T) { 2291 return T->getStmtClass() >= firstCallExprConstant && 2292 T->getStmtClass() <= lastCallExprConstant; 2293 } 2294 2295 // Iterators 2296 child_range children() { 2297 return child_range(&SubExprs[0], 2298 &SubExprs[0]+NumArgs+getNumPreArgs()+PREARGS_START); 2299 } 2300 }; 2301 2302 /// Extra data stored in some MemberExpr objects. 2303 struct MemberExprNameQualifier { 2304 /// \brief The nested-name-specifier that qualifies the name, including 2305 /// source-location information. 2306 NestedNameSpecifierLoc QualifierLoc; 2307 2308 /// \brief The DeclAccessPair through which the MemberDecl was found due to 2309 /// name qualifiers. 2310 DeclAccessPair FoundDecl; 2311 }; 2312 2313 /// MemberExpr - [C99 6.5.2.3] Structure and Union Members. X->F and X.F. 2314 /// 2315 class MemberExpr final 2316 : public Expr, 2317 private llvm::TrailingObjects<MemberExpr, MemberExprNameQualifier, 2318 ASTTemplateKWAndArgsInfo, 2319 TemplateArgumentLoc> { 2320 /// Base - the expression for the base pointer or structure references. In 2321 /// X.F, this is "X". 2322 Stmt *Base; 2323 2324 /// MemberDecl - This is the decl being referenced by the field/member name. 2325 /// In X.F, this is the decl referenced by F. 2326 ValueDecl *MemberDecl; 2327 2328 /// MemberDNLoc - Provides source/type location info for the 2329 /// declaration name embedded in MemberDecl. 2330 DeclarationNameLoc MemberDNLoc; 2331 2332 /// MemberLoc - This is the location of the member name. 2333 SourceLocation MemberLoc; 2334 2335 /// This is the location of the -> or . in the expression. 2336 SourceLocation OperatorLoc; 2337 2338 /// IsArrow - True if this is "X->F", false if this is "X.F". 2339 bool IsArrow : 1; 2340 2341 /// \brief True if this member expression used a nested-name-specifier to 2342 /// refer to the member, e.g., "x->Base::f", or found its member via a using 2343 /// declaration. When true, a MemberExprNameQualifier 2344 /// structure is allocated immediately after the MemberExpr. 2345 bool HasQualifierOrFoundDecl : 1; 2346 2347 /// \brief True if this member expression specified a template keyword 2348 /// and/or a template argument list explicitly, e.g., x->f<int>, 2349 /// x->template f, x->template f<int>. 2350 /// When true, an ASTTemplateKWAndArgsInfo structure and its 2351 /// TemplateArguments (if any) are present. 2352 bool HasTemplateKWAndArgsInfo : 1; 2353 2354 /// \brief True if this member expression refers to a method that 2355 /// was resolved from an overloaded set having size greater than 1. 2356 bool HadMultipleCandidates : 1; 2357 2358 size_t numTrailingObjects(OverloadToken<MemberExprNameQualifier>) const { 2359 return HasQualifierOrFoundDecl ? 1 : 0; 2360 } 2361 2362 size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const { 2363 return HasTemplateKWAndArgsInfo ? 1 : 0; 2364 } 2365 2366 public: 2367 MemberExpr(Expr *base, bool isarrow, SourceLocation operatorloc, 2368 ValueDecl *memberdecl, const DeclarationNameInfo &NameInfo, 2369 QualType ty, ExprValueKind VK, ExprObjectKind OK) 2370 : Expr(MemberExprClass, ty, VK, OK, base->isTypeDependent(), 2371 base->isValueDependent(), base->isInstantiationDependent(), 2372 base->containsUnexpandedParameterPack()), 2373 Base(base), MemberDecl(memberdecl), MemberDNLoc(NameInfo.getInfo()), 2374 MemberLoc(NameInfo.getLoc()), OperatorLoc(operatorloc), 2375 IsArrow(isarrow), HasQualifierOrFoundDecl(false), 2376 HasTemplateKWAndArgsInfo(false), HadMultipleCandidates(false) { 2377 assert(memberdecl->getDeclName() == NameInfo.getName()); 2378 } 2379 2380 // NOTE: this constructor should be used only when it is known that 2381 // the member name can not provide additional syntactic info 2382 // (i.e., source locations for C++ operator names or type source info 2383 // for constructors, destructors and conversion operators). 2384 MemberExpr(Expr *base, bool isarrow, SourceLocation operatorloc, 2385 ValueDecl *memberdecl, SourceLocation l, QualType ty, 2386 ExprValueKind VK, ExprObjectKind OK) 2387 : Expr(MemberExprClass, ty, VK, OK, base->isTypeDependent(), 2388 base->isValueDependent(), base->isInstantiationDependent(), 2389 base->containsUnexpandedParameterPack()), 2390 Base(base), MemberDecl(memberdecl), MemberDNLoc(), MemberLoc(l), 2391 OperatorLoc(operatorloc), IsArrow(isarrow), 2392 HasQualifierOrFoundDecl(false), HasTemplateKWAndArgsInfo(false), 2393 HadMultipleCandidates(false) {} 2394 2395 static MemberExpr *Create(const ASTContext &C, Expr *base, bool isarrow, 2396 SourceLocation OperatorLoc, 2397 NestedNameSpecifierLoc QualifierLoc, 2398 SourceLocation TemplateKWLoc, ValueDecl *memberdecl, 2399 DeclAccessPair founddecl, 2400 DeclarationNameInfo MemberNameInfo, 2401 const TemplateArgumentListInfo *targs, QualType ty, 2402 ExprValueKind VK, ExprObjectKind OK); 2403 2404 void setBase(Expr *E) { Base = E; } 2405 Expr *getBase() const { return cast<Expr>(Base); } 2406 2407 /// \brief Retrieve the member declaration to which this expression refers. 2408 /// 2409 /// The returned declaration will either be a FieldDecl or (in C++) 2410 /// a CXXMethodDecl. 2411 ValueDecl *getMemberDecl() const { return MemberDecl; } 2412 void setMemberDecl(ValueDecl *D) { MemberDecl = D; } 2413 2414 /// \brief Retrieves the declaration found by lookup. 2415 DeclAccessPair getFoundDecl() const { 2416 if (!HasQualifierOrFoundDecl) 2417 return DeclAccessPair::make(getMemberDecl(), 2418 getMemberDecl()->getAccess()); 2419 return getTrailingObjects<MemberExprNameQualifier>()->FoundDecl; 2420 } 2421 2422 /// \brief Determines whether this member expression actually had 2423 /// a C++ nested-name-specifier prior to the name of the member, e.g., 2424 /// x->Base::foo. 2425 bool hasQualifier() const { return getQualifier() != nullptr; } 2426 2427 /// \brief If the member name was qualified, retrieves the 2428 /// nested-name-specifier that precedes the member name, with source-location 2429 /// information. 2430 NestedNameSpecifierLoc getQualifierLoc() const { 2431 if (!HasQualifierOrFoundDecl) 2432 return NestedNameSpecifierLoc(); 2433 2434 return getTrailingObjects<MemberExprNameQualifier>()->QualifierLoc; 2435 } 2436 2437 /// \brief If the member name was qualified, retrieves the 2438 /// nested-name-specifier that precedes the member name. Otherwise, returns 2439 /// NULL. 2440 NestedNameSpecifier *getQualifier() const { 2441 return getQualifierLoc().getNestedNameSpecifier(); 2442 } 2443 2444 /// \brief Retrieve the location of the template keyword preceding 2445 /// the member name, if any. 2446 SourceLocation getTemplateKeywordLoc() const { 2447 if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 2448 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc; 2449 } 2450 2451 /// \brief Retrieve the location of the left angle bracket starting the 2452 /// explicit template argument list following the member name, if any. 2453 SourceLocation getLAngleLoc() const { 2454 if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 2455 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc; 2456 } 2457 2458 /// \brief Retrieve the location of the right angle bracket ending the 2459 /// explicit template argument list following the member name, if any. 2460 SourceLocation getRAngleLoc() const { 2461 if (!HasTemplateKWAndArgsInfo) return SourceLocation(); 2462 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc; 2463 } 2464 2465 /// Determines whether the member name was preceded by the template keyword. 2466 bool hasTemplateKeyword() const { return getTemplateKeywordLoc().isValid(); } 2467 2468 /// \brief Determines whether the member name was followed by an 2469 /// explicit template argument list. 2470 bool hasExplicitTemplateArgs() const { return getLAngleLoc().isValid(); } 2471 2472 /// \brief Copies the template arguments (if present) into the given 2473 /// structure. 2474 void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { 2475 if (hasExplicitTemplateArgs()) 2476 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto( 2477 getTrailingObjects<TemplateArgumentLoc>(), List); 2478 } 2479 2480 /// \brief Retrieve the template arguments provided as part of this 2481 /// template-id. 2482 const TemplateArgumentLoc *getTemplateArgs() const { 2483 if (!hasExplicitTemplateArgs()) 2484 return nullptr; 2485 2486 return getTrailingObjects<TemplateArgumentLoc>(); 2487 } 2488 2489 /// \brief Retrieve the number of template arguments provided as part of this 2490 /// template-id. 2491 unsigned getNumTemplateArgs() const { 2492 if (!hasExplicitTemplateArgs()) 2493 return 0; 2494 2495 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs; 2496 } 2497 2498 ArrayRef<TemplateArgumentLoc> template_arguments() const { 2499 return {getTemplateArgs(), getNumTemplateArgs()}; 2500 } 2501 2502 /// \brief Retrieve the member declaration name info. 2503 DeclarationNameInfo getMemberNameInfo() const { 2504 return DeclarationNameInfo(MemberDecl->getDeclName(), 2505 MemberLoc, MemberDNLoc); 2506 } 2507 2508 SourceLocation getOperatorLoc() const LLVM_READONLY { return OperatorLoc; } 2509 2510 bool isArrow() const { return IsArrow; } 2511 void setArrow(bool A) { IsArrow = A; } 2512 2513 /// getMemberLoc - Return the location of the "member", in X->F, it is the 2514 /// location of 'F'. 2515 SourceLocation getMemberLoc() const { return MemberLoc; } 2516 void setMemberLoc(SourceLocation L) { MemberLoc = L; } 2517 2518 SourceLocation getLocStart() const LLVM_READONLY; 2519 SourceLocation getLocEnd() const LLVM_READONLY; 2520 2521 SourceLocation getExprLoc() const LLVM_READONLY { return MemberLoc; } 2522 2523 /// \brief Determine whether the base of this explicit is implicit. 2524 bool isImplicitAccess() const { 2525 return getBase() && getBase()->isImplicitCXXThis(); 2526 } 2527 2528 /// \brief Returns true if this member expression refers to a method that 2529 /// was resolved from an overloaded set having size greater than 1. 2530 bool hadMultipleCandidates() const { 2531 return HadMultipleCandidates; 2532 } 2533 /// \brief Sets the flag telling whether this expression refers to 2534 /// a method that was resolved from an overloaded set having size 2535 /// greater than 1. 2536 void setHadMultipleCandidates(bool V = true) { 2537 HadMultipleCandidates = V; 2538 } 2539 2540 /// \brief Returns true if virtual dispatch is performed. 2541 /// If the member access is fully qualified, (i.e. X::f()), virtual 2542 /// dispatching is not performed. In -fapple-kext mode qualified 2543 /// calls to virtual method will still go through the vtable. 2544 bool performsVirtualDispatch(const LangOptions &LO) const { 2545 return LO.AppleKext || !hasQualifier(); 2546 } 2547 2548 static bool classof(const Stmt *T) { 2549 return T->getStmtClass() == MemberExprClass; 2550 } 2551 2552 // Iterators 2553 child_range children() { return child_range(&Base, &Base+1); } 2554 2555 friend TrailingObjects; 2556 friend class ASTReader; 2557 friend class ASTStmtWriter; 2558 }; 2559 2560 /// CompoundLiteralExpr - [C99 6.5.2.5] 2561 /// 2562 class CompoundLiteralExpr : public Expr { 2563 /// LParenLoc - If non-null, this is the location of the left paren in a 2564 /// compound literal like "(int){4}". This can be null if this is a 2565 /// synthesized compound expression. 2566 SourceLocation LParenLoc; 2567 2568 /// The type as written. This can be an incomplete array type, in 2569 /// which case the actual expression type will be different. 2570 /// The int part of the pair stores whether this expr is file scope. 2571 llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfoAndScope; 2572 Stmt *Init; 2573 public: 2574 CompoundLiteralExpr(SourceLocation lparenloc, TypeSourceInfo *tinfo, 2575 QualType T, ExprValueKind VK, Expr *init, bool fileScope) 2576 : Expr(CompoundLiteralExprClass, T, VK, OK_Ordinary, 2577 tinfo->getType()->isDependentType(), 2578 init->isValueDependent(), 2579 (init->isInstantiationDependent() || 2580 tinfo->getType()->isInstantiationDependentType()), 2581 init->containsUnexpandedParameterPack()), 2582 LParenLoc(lparenloc), TInfoAndScope(tinfo, fileScope), Init(init) {} 2583 2584 /// \brief Construct an empty compound literal. 2585 explicit CompoundLiteralExpr(EmptyShell Empty) 2586 : Expr(CompoundLiteralExprClass, Empty) { } 2587 2588 const Expr *getInitializer() const { return cast<Expr>(Init); } 2589 Expr *getInitializer() { return cast<Expr>(Init); } 2590 void setInitializer(Expr *E) { Init = E; } 2591 2592 bool isFileScope() const { return TInfoAndScope.getInt(); } 2593 void setFileScope(bool FS) { TInfoAndScope.setInt(FS); } 2594 2595 SourceLocation getLParenLoc() const { return LParenLoc; } 2596 void setLParenLoc(SourceLocation L) { LParenLoc = L; } 2597 2598 TypeSourceInfo *getTypeSourceInfo() const { 2599 return TInfoAndScope.getPointer(); 2600 } 2601 void setTypeSourceInfo(TypeSourceInfo *tinfo) { 2602 TInfoAndScope.setPointer(tinfo); 2603 } 2604 2605 SourceLocation getLocStart() const LLVM_READONLY { 2606 // FIXME: Init should never be null. 2607 if (!Init) 2608 return SourceLocation(); 2609 if (LParenLoc.isInvalid()) 2610 return Init->getLocStart(); 2611 return LParenLoc; 2612 } 2613 SourceLocation getLocEnd() const LLVM_READONLY { 2614 // FIXME: Init should never be null. 2615 if (!Init) 2616 return SourceLocation(); 2617 return Init->getLocEnd(); 2618 } 2619 2620 static bool classof(const Stmt *T) { 2621 return T->getStmtClass() == CompoundLiteralExprClass; 2622 } 2623 2624 // Iterators 2625 child_range children() { return child_range(&Init, &Init+1); } 2626 }; 2627 2628 /// CastExpr - Base class for type casts, including both implicit 2629 /// casts (ImplicitCastExpr) and explicit casts that have some 2630 /// representation in the source code (ExplicitCastExpr's derived 2631 /// classes). 2632 class CastExpr : public Expr { 2633 private: 2634 Stmt *Op; 2635 2636 bool CastConsistency() const; 2637 2638 const CXXBaseSpecifier * const *path_buffer() const { 2639 return const_cast<CastExpr*>(this)->path_buffer(); 2640 } 2641 CXXBaseSpecifier **path_buffer(); 2642 2643 void setBasePathSize(unsigned basePathSize) { 2644 CastExprBits.BasePathSize = basePathSize; 2645 assert(CastExprBits.BasePathSize == basePathSize && 2646 "basePathSize doesn't fit in bits of CastExprBits.BasePathSize!"); 2647 } 2648 2649 protected: 2650 CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind, 2651 Expr *op, unsigned BasePathSize) 2652 : Expr(SC, ty, VK, OK_Ordinary, 2653 // Cast expressions are type-dependent if the type is 2654 // dependent (C++ [temp.dep.expr]p3). 2655 ty->isDependentType(), 2656 // Cast expressions are value-dependent if the type is 2657 // dependent or if the subexpression is value-dependent. 2658 ty->isDependentType() || (op && op->isValueDependent()), 2659 (ty->isInstantiationDependentType() || 2660 (op && op->isInstantiationDependent())), 2661 // An implicit cast expression doesn't (lexically) contain an 2662 // unexpanded pack, even if its target type does. 2663 ((SC != ImplicitCastExprClass && 2664 ty->containsUnexpandedParameterPack()) || 2665 (op && op->containsUnexpandedParameterPack()))), 2666 Op(op) { 2667 assert(kind != CK_Invalid && "creating cast with invalid cast kind"); 2668 CastExprBits.Kind = kind; 2669 setBasePathSize(BasePathSize); 2670 assert(CastConsistency()); 2671 } 2672 2673 /// \brief Construct an empty cast. 2674 CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize) 2675 : Expr(SC, Empty) { 2676 setBasePathSize(BasePathSize); 2677 } 2678 2679 public: 2680 CastKind getCastKind() const { return (CastKind) CastExprBits.Kind; } 2681 void setCastKind(CastKind K) { CastExprBits.Kind = K; } 2682 const char *getCastKindName() const; 2683 2684 Expr *getSubExpr() { return cast<Expr>(Op); } 2685 const Expr *getSubExpr() const { return cast<Expr>(Op); } 2686 void setSubExpr(Expr *E) { Op = E; } 2687 2688 /// \brief Retrieve the cast subexpression as it was written in the source 2689 /// code, looking through any implicit casts or other intermediate nodes 2690 /// introduced by semantic analysis. 2691 Expr *getSubExprAsWritten(); 2692 const Expr *getSubExprAsWritten() const { 2693 return const_cast<CastExpr *>(this)->getSubExprAsWritten(); 2694 } 2695 2696 typedef CXXBaseSpecifier **path_iterator; 2697 typedef const CXXBaseSpecifier * const *path_const_iterator; 2698 bool path_empty() const { return CastExprBits.BasePathSize == 0; } 2699 unsigned path_size() const { return CastExprBits.BasePathSize; } 2700 path_iterator path_begin() { return path_buffer(); } 2701 path_iterator path_end() { return path_buffer() + path_size(); } 2702 path_const_iterator path_begin() const { return path_buffer(); } 2703 path_const_iterator path_end() const { return path_buffer() + path_size(); } 2704 2705 static bool classof(const Stmt *T) { 2706 return T->getStmtClass() >= firstCastExprConstant && 2707 T->getStmtClass() <= lastCastExprConstant; 2708 } 2709 2710 // Iterators 2711 child_range children() { return child_range(&Op, &Op+1); } 2712 }; 2713 2714 /// ImplicitCastExpr - Allows us to explicitly represent implicit type 2715 /// conversions, which have no direct representation in the original 2716 /// source code. For example: converting T[]->T*, void f()->void 2717 /// (*f)(), float->double, short->int, etc. 2718 /// 2719 /// In C, implicit casts always produce rvalues. However, in C++, an 2720 /// implicit cast whose result is being bound to a reference will be 2721 /// an lvalue or xvalue. For example: 2722 /// 2723 /// @code 2724 /// class Base { }; 2725 /// class Derived : public Base { }; 2726 /// Derived &&ref(); 2727 /// void f(Derived d) { 2728 /// Base& b = d; // initializer is an ImplicitCastExpr 2729 /// // to an lvalue of type Base 2730 /// Base&& r = ref(); // initializer is an ImplicitCastExpr 2731 /// // to an xvalue of type Base 2732 /// } 2733 /// @endcode 2734 class ImplicitCastExpr final 2735 : public CastExpr, 2736 private llvm::TrailingObjects<ImplicitCastExpr, CXXBaseSpecifier *> { 2737 private: 2738 ImplicitCastExpr(QualType ty, CastKind kind, Expr *op, 2739 unsigned BasePathLength, ExprValueKind VK) 2740 : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength) { 2741 } 2742 2743 /// \brief Construct an empty implicit cast. 2744 explicit ImplicitCastExpr(EmptyShell Shell, unsigned PathSize) 2745 : CastExpr(ImplicitCastExprClass, Shell, PathSize) { } 2746 2747 public: 2748 enum OnStack_t { OnStack }; 2749 ImplicitCastExpr(OnStack_t _, QualType ty, CastKind kind, Expr *op, 2750 ExprValueKind VK) 2751 : CastExpr(ImplicitCastExprClass, ty, VK, kind, op, 0) { 2752 } 2753 2754 static ImplicitCastExpr *Create(const ASTContext &Context, QualType T, 2755 CastKind Kind, Expr *Operand, 2756 const CXXCastPath *BasePath, 2757 ExprValueKind Cat); 2758 2759 static ImplicitCastExpr *CreateEmpty(const ASTContext &Context, 2760 unsigned PathSize); 2761 2762 SourceLocation getLocStart() const LLVM_READONLY { 2763 return getSubExpr()->getLocStart(); 2764 } 2765 SourceLocation getLocEnd() const LLVM_READONLY { 2766 return getSubExpr()->getLocEnd(); 2767 } 2768 2769 static bool classof(const Stmt *T) { 2770 return T->getStmtClass() == ImplicitCastExprClass; 2771 } 2772 2773 friend TrailingObjects; 2774 friend class CastExpr; 2775 }; 2776 2777 inline Expr *Expr::IgnoreImpCasts() { 2778 Expr *e = this; 2779 while (ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e)) 2780 e = ice->getSubExpr(); 2781 return e; 2782 } 2783 2784 /// ExplicitCastExpr - An explicit cast written in the source 2785 /// code. 2786 /// 2787 /// This class is effectively an abstract class, because it provides 2788 /// the basic representation of an explicitly-written cast without 2789 /// specifying which kind of cast (C cast, functional cast, static 2790 /// cast, etc.) was written; specific derived classes represent the 2791 /// particular style of cast and its location information. 2792 /// 2793 /// Unlike implicit casts, explicit cast nodes have two different 2794 /// types: the type that was written into the source code, and the 2795 /// actual type of the expression as determined by semantic 2796 /// analysis. These types may differ slightly. For example, in C++ one 2797 /// can cast to a reference type, which indicates that the resulting 2798 /// expression will be an lvalue or xvalue. The reference type, however, 2799 /// will not be used as the type of the expression. 2800 class ExplicitCastExpr : public CastExpr { 2801 /// TInfo - Source type info for the (written) type 2802 /// this expression is casting to. 2803 TypeSourceInfo *TInfo; 2804 2805 protected: 2806 ExplicitCastExpr(StmtClass SC, QualType exprTy, ExprValueKind VK, 2807 CastKind kind, Expr *op, unsigned PathSize, 2808 TypeSourceInfo *writtenTy) 2809 : CastExpr(SC, exprTy, VK, kind, op, PathSize), TInfo(writtenTy) {} 2810 2811 /// \brief Construct an empty explicit cast. 2812 ExplicitCastExpr(StmtClass SC, EmptyShell Shell, unsigned PathSize) 2813 : CastExpr(SC, Shell, PathSize) { } 2814 2815 public: 2816 /// getTypeInfoAsWritten - Returns the type source info for the type 2817 /// that this expression is casting to. 2818 TypeSourceInfo *getTypeInfoAsWritten() const { return TInfo; } 2819 void setTypeInfoAsWritten(TypeSourceInfo *writtenTy) { TInfo = writtenTy; } 2820 2821 /// getTypeAsWritten - Returns the type that this expression is 2822 /// casting to, as written in the source code. 2823 QualType getTypeAsWritten() const { return TInfo->getType(); } 2824 2825 static bool classof(const Stmt *T) { 2826 return T->getStmtClass() >= firstExplicitCastExprConstant && 2827 T->getStmtClass() <= lastExplicitCastExprConstant; 2828 } 2829 }; 2830 2831 /// CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style 2832 /// cast in C++ (C++ [expr.cast]), which uses the syntax 2833 /// (Type)expr. For example: @c (int)f. 2834 class CStyleCastExpr final 2835 : public ExplicitCastExpr, 2836 private llvm::TrailingObjects<CStyleCastExpr, CXXBaseSpecifier *> { 2837 SourceLocation LPLoc; // the location of the left paren 2838 SourceLocation RPLoc; // the location of the right paren 2839 2840 CStyleCastExpr(QualType exprTy, ExprValueKind vk, CastKind kind, Expr *op, 2841 unsigned PathSize, TypeSourceInfo *writtenTy, 2842 SourceLocation l, SourceLocation r) 2843 : ExplicitCastExpr(CStyleCastExprClass, exprTy, vk, kind, op, PathSize, 2844 writtenTy), LPLoc(l), RPLoc(r) {} 2845 2846 /// \brief Construct an empty C-style explicit cast. 2847 explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize) 2848 : ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize) { } 2849 2850 public: 2851 static CStyleCastExpr *Create(const ASTContext &Context, QualType T, 2852 ExprValueKind VK, CastKind K, 2853 Expr *Op, const CXXCastPath *BasePath, 2854 TypeSourceInfo *WrittenTy, SourceLocation L, 2855 SourceLocation R); 2856 2857 static CStyleCastExpr *CreateEmpty(const ASTContext &Context, 2858 unsigned PathSize); 2859 2860 SourceLocation getLParenLoc() const { return LPLoc; } 2861 void setLParenLoc(SourceLocation L) { LPLoc = L; } 2862 2863 SourceLocation getRParenLoc() const { return RPLoc; } 2864 void setRParenLoc(SourceLocation L) { RPLoc = L; } 2865 2866 SourceLocation getLocStart() const LLVM_READONLY { return LPLoc; } 2867 SourceLocation getLocEnd() const LLVM_READONLY { 2868 return getSubExpr()->getLocEnd(); 2869 } 2870 2871 static bool classof(const Stmt *T) { 2872 return T->getStmtClass() == CStyleCastExprClass; 2873 } 2874 2875 friend TrailingObjects; 2876 friend class CastExpr; 2877 }; 2878 2879 /// \brief A builtin binary operation expression such as "x + y" or "x <= y". 2880 /// 2881 /// This expression node kind describes a builtin binary operation, 2882 /// such as "x + y" for integer values "x" and "y". The operands will 2883 /// already have been converted to appropriate types (e.g., by 2884 /// performing promotions or conversions). 2885 /// 2886 /// In C++, where operators may be overloaded, a different kind of 2887 /// expression node (CXXOperatorCallExpr) is used to express the 2888 /// invocation of an overloaded operator with operator syntax. Within 2889 /// a C++ template, whether BinaryOperator or CXXOperatorCallExpr is 2890 /// used to store an expression "x + y" depends on the subexpressions 2891 /// for x and y. If neither x or y is type-dependent, and the "+" 2892 /// operator resolves to a built-in operation, BinaryOperator will be 2893 /// used to express the computation (x and y may still be 2894 /// value-dependent). If either x or y is type-dependent, or if the 2895 /// "+" resolves to an overloaded operator, CXXOperatorCallExpr will 2896 /// be used to express the computation. 2897 class BinaryOperator : public Expr { 2898 public: 2899 typedef BinaryOperatorKind Opcode; 2900 2901 private: 2902 unsigned Opc : 6; 2903 2904 // Records the FP_CONTRACT pragma status at the point that this binary 2905 // operator was parsed. This bit is only meaningful for operations on 2906 // floating point types. For all other types it should default to 2907 // false. 2908 unsigned FPContractable : 1; 2909 SourceLocation OpLoc; 2910 2911 enum { LHS, RHS, END_EXPR }; 2912 Stmt* SubExprs[END_EXPR]; 2913 public: 2914 2915 BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 2916 ExprValueKind VK, ExprObjectKind OK, 2917 SourceLocation opLoc, bool fpContractable) 2918 : Expr(BinaryOperatorClass, ResTy, VK, OK, 2919 lhs->isTypeDependent() || rhs->isTypeDependent(), 2920 lhs->isValueDependent() || rhs->isValueDependent(), 2921 (lhs->isInstantiationDependent() || 2922 rhs->isInstantiationDependent()), 2923 (lhs->containsUnexpandedParameterPack() || 2924 rhs->containsUnexpandedParameterPack())), 2925 Opc(opc), FPContractable(fpContractable), OpLoc(opLoc) { 2926 SubExprs[LHS] = lhs; 2927 SubExprs[RHS] = rhs; 2928 assert(!isCompoundAssignmentOp() && 2929 "Use CompoundAssignOperator for compound assignments"); 2930 } 2931 2932 /// \brief Construct an empty binary operator. 2933 explicit BinaryOperator(EmptyShell Empty) 2934 : Expr(BinaryOperatorClass, Empty), Opc(BO_Comma) { } 2935 2936 SourceLocation getExprLoc() const LLVM_READONLY { return OpLoc; } 2937 SourceLocation getOperatorLoc() const { return OpLoc; } 2938 void setOperatorLoc(SourceLocation L) { OpLoc = L; } 2939 2940 Opcode getOpcode() const { return static_cast<Opcode>(Opc); } 2941 void setOpcode(Opcode O) { Opc = O; } 2942 2943 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 2944 void setLHS(Expr *E) { SubExprs[LHS] = E; } 2945 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 2946 void setRHS(Expr *E) { SubExprs[RHS] = E; } 2947 2948 SourceLocation getLocStart() const LLVM_READONLY { 2949 return getLHS()->getLocStart(); 2950 } 2951 SourceLocation getLocEnd() const LLVM_READONLY { 2952 return getRHS()->getLocEnd(); 2953 } 2954 2955 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it 2956 /// corresponds to, e.g. "<<=". 2957 static StringRef getOpcodeStr(Opcode Op); 2958 2959 StringRef getOpcodeStr() const { return getOpcodeStr(getOpcode()); } 2960 2961 /// \brief Retrieve the binary opcode that corresponds to the given 2962 /// overloaded operator. 2963 static Opcode getOverloadedOpcode(OverloadedOperatorKind OO); 2964 2965 /// \brief Retrieve the overloaded operator kind that corresponds to 2966 /// the given binary opcode. 2967 static OverloadedOperatorKind getOverloadedOperator(Opcode Opc); 2968 2969 /// predicates to categorize the respective opcodes. 2970 bool isPtrMemOp() const { return Opc == BO_PtrMemD || Opc == BO_PtrMemI; } 2971 static bool isMultiplicativeOp(Opcode Opc) { 2972 return Opc >= BO_Mul && Opc <= BO_Rem; 2973 } 2974 bool isMultiplicativeOp() const { return isMultiplicativeOp(getOpcode()); } 2975 static bool isAdditiveOp(Opcode Opc) { return Opc == BO_Add || Opc==BO_Sub; } 2976 bool isAdditiveOp() const { return isAdditiveOp(getOpcode()); } 2977 static bool isShiftOp(Opcode Opc) { return Opc == BO_Shl || Opc == BO_Shr; } 2978 bool isShiftOp() const { return isShiftOp(getOpcode()); } 2979 2980 static bool isBitwiseOp(Opcode Opc) { return Opc >= BO_And && Opc <= BO_Or; } 2981 bool isBitwiseOp() const { return isBitwiseOp(getOpcode()); } 2982 2983 static bool isRelationalOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_GE; } 2984 bool isRelationalOp() const { return isRelationalOp(getOpcode()); } 2985 2986 static bool isEqualityOp(Opcode Opc) { return Opc == BO_EQ || Opc == BO_NE; } 2987 bool isEqualityOp() const { return isEqualityOp(getOpcode()); } 2988 2989 static bool isComparisonOp(Opcode Opc) { return Opc >= BO_LT && Opc<=BO_NE; } 2990 bool isComparisonOp() const { return isComparisonOp(getOpcode()); } 2991 2992 static Opcode negateComparisonOp(Opcode Opc) { 2993 switch (Opc) { 2994 default: 2995 llvm_unreachable("Not a comparsion operator."); 2996 case BO_LT: return BO_GE; 2997 case BO_GT: return BO_LE; 2998 case BO_LE: return BO_GT; 2999 case BO_GE: return BO_LT; 3000 case BO_EQ: return BO_NE; 3001 case BO_NE: return BO_EQ; 3002 } 3003 } 3004 3005 static Opcode reverseComparisonOp(Opcode Opc) { 3006 switch (Opc) { 3007 default: 3008 llvm_unreachable("Not a comparsion operator."); 3009 case BO_LT: return BO_GT; 3010 case BO_GT: return BO_LT; 3011 case BO_LE: return BO_GE; 3012 case BO_GE: return BO_LE; 3013 case BO_EQ: 3014 case BO_NE: 3015 return Opc; 3016 } 3017 } 3018 3019 static bool isLogicalOp(Opcode Opc) { return Opc == BO_LAnd || Opc==BO_LOr; } 3020 bool isLogicalOp() const { return isLogicalOp(getOpcode()); } 3021 3022 static bool isAssignmentOp(Opcode Opc) { 3023 return Opc >= BO_Assign && Opc <= BO_OrAssign; 3024 } 3025 bool isAssignmentOp() const { return isAssignmentOp(getOpcode()); } 3026 3027 static bool isCompoundAssignmentOp(Opcode Opc) { 3028 return Opc > BO_Assign && Opc <= BO_OrAssign; 3029 } 3030 bool isCompoundAssignmentOp() const { 3031 return isCompoundAssignmentOp(getOpcode()); 3032 } 3033 static Opcode getOpForCompoundAssignment(Opcode Opc) { 3034 assert(isCompoundAssignmentOp(Opc)); 3035 if (Opc >= BO_AndAssign) 3036 return Opcode(unsigned(Opc) - BO_AndAssign + BO_And); 3037 else 3038 return Opcode(unsigned(Opc) - BO_MulAssign + BO_Mul); 3039 } 3040 3041 static bool isShiftAssignOp(Opcode Opc) { 3042 return Opc == BO_ShlAssign || Opc == BO_ShrAssign; 3043 } 3044 bool isShiftAssignOp() const { 3045 return isShiftAssignOp(getOpcode()); 3046 } 3047 3048 static bool classof(const Stmt *S) { 3049 return S->getStmtClass() >= firstBinaryOperatorConstant && 3050 S->getStmtClass() <= lastBinaryOperatorConstant; 3051 } 3052 3053 // Iterators 3054 child_range children() { 3055 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 3056 } 3057 3058 // Set the FP contractability status of this operator. Only meaningful for 3059 // operations on floating point types. 3060 void setFPContractable(bool FPC) { FPContractable = FPC; } 3061 3062 // Get the FP contractability status of this operator. Only meaningful for 3063 // operations on floating point types. 3064 bool isFPContractable() const { return FPContractable; } 3065 3066 protected: 3067 BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, 3068 ExprValueKind VK, ExprObjectKind OK, 3069 SourceLocation opLoc, bool fpContractable, bool dead2) 3070 : Expr(CompoundAssignOperatorClass, ResTy, VK, OK, 3071 lhs->isTypeDependent() || rhs->isTypeDependent(), 3072 lhs->isValueDependent() || rhs->isValueDependent(), 3073 (lhs->isInstantiationDependent() || 3074 rhs->isInstantiationDependent()), 3075 (lhs->containsUnexpandedParameterPack() || 3076 rhs->containsUnexpandedParameterPack())), 3077 Opc(opc), FPContractable(fpContractable), OpLoc(opLoc) { 3078 SubExprs[LHS] = lhs; 3079 SubExprs[RHS] = rhs; 3080 } 3081 3082 BinaryOperator(StmtClass SC, EmptyShell Empty) 3083 : Expr(SC, Empty), Opc(BO_MulAssign) { } 3084 }; 3085 3086 /// CompoundAssignOperator - For compound assignments (e.g. +=), we keep 3087 /// track of the type the operation is performed in. Due to the semantics of 3088 /// these operators, the operands are promoted, the arithmetic performed, an 3089 /// implicit conversion back to the result type done, then the assignment takes 3090 /// place. This captures the intermediate type which the computation is done 3091 /// in. 3092 class CompoundAssignOperator : public BinaryOperator { 3093 QualType ComputationLHSType; 3094 QualType ComputationResultType; 3095 public: 3096 CompoundAssignOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResType, 3097 ExprValueKind VK, ExprObjectKind OK, 3098 QualType CompLHSType, QualType CompResultType, 3099 SourceLocation OpLoc, bool fpContractable) 3100 : BinaryOperator(lhs, rhs, opc, ResType, VK, OK, OpLoc, fpContractable, 3101 true), 3102 ComputationLHSType(CompLHSType), 3103 ComputationResultType(CompResultType) { 3104 assert(isCompoundAssignmentOp() && 3105 "Only should be used for compound assignments"); 3106 } 3107 3108 /// \brief Build an empty compound assignment operator expression. 3109 explicit CompoundAssignOperator(EmptyShell Empty) 3110 : BinaryOperator(CompoundAssignOperatorClass, Empty) { } 3111 3112 // The two computation types are the type the LHS is converted 3113 // to for the computation and the type of the result; the two are 3114 // distinct in a few cases (specifically, int+=ptr and ptr-=ptr). 3115 QualType getComputationLHSType() const { return ComputationLHSType; } 3116 void setComputationLHSType(QualType T) { ComputationLHSType = T; } 3117 3118 QualType getComputationResultType() const { return ComputationResultType; } 3119 void setComputationResultType(QualType T) { ComputationResultType = T; } 3120 3121 static bool classof(const Stmt *S) { 3122 return S->getStmtClass() == CompoundAssignOperatorClass; 3123 } 3124 }; 3125 3126 /// AbstractConditionalOperator - An abstract base class for 3127 /// ConditionalOperator and BinaryConditionalOperator. 3128 class AbstractConditionalOperator : public Expr { 3129 SourceLocation QuestionLoc, ColonLoc; 3130 friend class ASTStmtReader; 3131 3132 protected: 3133 AbstractConditionalOperator(StmtClass SC, QualType T, 3134 ExprValueKind VK, ExprObjectKind OK, 3135 bool TD, bool VD, bool ID, 3136 bool ContainsUnexpandedParameterPack, 3137 SourceLocation qloc, 3138 SourceLocation cloc) 3139 : Expr(SC, T, VK, OK, TD, VD, ID, ContainsUnexpandedParameterPack), 3140 QuestionLoc(qloc), ColonLoc(cloc) {} 3141 3142 AbstractConditionalOperator(StmtClass SC, EmptyShell Empty) 3143 : Expr(SC, Empty) { } 3144 3145 public: 3146 // getCond - Return the expression representing the condition for 3147 // the ?: operator. 3148 Expr *getCond() const; 3149 3150 // getTrueExpr - Return the subexpression representing the value of 3151 // the expression if the condition evaluates to true. 3152 Expr *getTrueExpr() const; 3153 3154 // getFalseExpr - Return the subexpression representing the value of 3155 // the expression if the condition evaluates to false. This is 3156 // the same as getRHS. 3157 Expr *getFalseExpr() const; 3158 3159 SourceLocation getQuestionLoc() const { return QuestionLoc; } 3160 SourceLocation getColonLoc() const { return ColonLoc; } 3161 3162 static bool classof(const Stmt *T) { 3163 return T->getStmtClass() == ConditionalOperatorClass || 3164 T->getStmtClass() == BinaryConditionalOperatorClass; 3165 } 3166 }; 3167 3168 /// ConditionalOperator - The ?: ternary operator. The GNU "missing 3169 /// middle" extension is a BinaryConditionalOperator. 3170 class ConditionalOperator : public AbstractConditionalOperator { 3171 enum { COND, LHS, RHS, END_EXPR }; 3172 Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 3173 3174 friend class ASTStmtReader; 3175 public: 3176 ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs, 3177 SourceLocation CLoc, Expr *rhs, 3178 QualType t, ExprValueKind VK, ExprObjectKind OK) 3179 : AbstractConditionalOperator(ConditionalOperatorClass, t, VK, OK, 3180 // FIXME: the type of the conditional operator doesn't 3181 // depend on the type of the conditional, but the standard 3182 // seems to imply that it could. File a bug! 3183 (lhs->isTypeDependent() || rhs->isTypeDependent()), 3184 (cond->isValueDependent() || lhs->isValueDependent() || 3185 rhs->isValueDependent()), 3186 (cond->isInstantiationDependent() || 3187 lhs->isInstantiationDependent() || 3188 rhs->isInstantiationDependent()), 3189 (cond->containsUnexpandedParameterPack() || 3190 lhs->containsUnexpandedParameterPack() || 3191 rhs->containsUnexpandedParameterPack()), 3192 QLoc, CLoc) { 3193 SubExprs[COND] = cond; 3194 SubExprs[LHS] = lhs; 3195 SubExprs[RHS] = rhs; 3196 } 3197 3198 /// \brief Build an empty conditional operator. 3199 explicit ConditionalOperator(EmptyShell Empty) 3200 : AbstractConditionalOperator(ConditionalOperatorClass, Empty) { } 3201 3202 // getCond - Return the expression representing the condition for 3203 // the ?: operator. 3204 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 3205 3206 // getTrueExpr - Return the subexpression representing the value of 3207 // the expression if the condition evaluates to true. 3208 Expr *getTrueExpr() const { return cast<Expr>(SubExprs[LHS]); } 3209 3210 // getFalseExpr - Return the subexpression representing the value of 3211 // the expression if the condition evaluates to false. This is 3212 // the same as getRHS. 3213 Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); } 3214 3215 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 3216 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 3217 3218 SourceLocation getLocStart() const LLVM_READONLY { 3219 return getCond()->getLocStart(); 3220 } 3221 SourceLocation getLocEnd() const LLVM_READONLY { 3222 return getRHS()->getLocEnd(); 3223 } 3224 3225 static bool classof(const Stmt *T) { 3226 return T->getStmtClass() == ConditionalOperatorClass; 3227 } 3228 3229 // Iterators 3230 child_range children() { 3231 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 3232 } 3233 }; 3234 3235 /// BinaryConditionalOperator - The GNU extension to the conditional 3236 /// operator which allows the middle operand to be omitted. 3237 /// 3238 /// This is a different expression kind on the assumption that almost 3239 /// every client ends up needing to know that these are different. 3240 class BinaryConditionalOperator : public AbstractConditionalOperator { 3241 enum { COMMON, COND, LHS, RHS, NUM_SUBEXPRS }; 3242 3243 /// - the common condition/left-hand-side expression, which will be 3244 /// evaluated as the opaque value 3245 /// - the condition, expressed in terms of the opaque value 3246 /// - the left-hand-side, expressed in terms of the opaque value 3247 /// - the right-hand-side 3248 Stmt *SubExprs[NUM_SUBEXPRS]; 3249 OpaqueValueExpr *OpaqueValue; 3250 3251 friend class ASTStmtReader; 3252 public: 3253 BinaryConditionalOperator(Expr *common, OpaqueValueExpr *opaqueValue, 3254 Expr *cond, Expr *lhs, Expr *rhs, 3255 SourceLocation qloc, SourceLocation cloc, 3256 QualType t, ExprValueKind VK, ExprObjectKind OK) 3257 : AbstractConditionalOperator(BinaryConditionalOperatorClass, t, VK, OK, 3258 (common->isTypeDependent() || rhs->isTypeDependent()), 3259 (common->isValueDependent() || rhs->isValueDependent()), 3260 (common->isInstantiationDependent() || 3261 rhs->isInstantiationDependent()), 3262 (common->containsUnexpandedParameterPack() || 3263 rhs->containsUnexpandedParameterPack()), 3264 qloc, cloc), 3265 OpaqueValue(opaqueValue) { 3266 SubExprs[COMMON] = common; 3267 SubExprs[COND] = cond; 3268 SubExprs[LHS] = lhs; 3269 SubExprs[RHS] = rhs; 3270 assert(OpaqueValue->getSourceExpr() == common && "Wrong opaque value"); 3271 } 3272 3273 /// \brief Build an empty conditional operator. 3274 explicit BinaryConditionalOperator(EmptyShell Empty) 3275 : AbstractConditionalOperator(BinaryConditionalOperatorClass, Empty) { } 3276 3277 /// \brief getCommon - Return the common expression, written to the 3278 /// left of the condition. The opaque value will be bound to the 3279 /// result of this expression. 3280 Expr *getCommon() const { return cast<Expr>(SubExprs[COMMON]); } 3281 3282 /// \brief getOpaqueValue - Return the opaque value placeholder. 3283 OpaqueValueExpr *getOpaqueValue() const { return OpaqueValue; } 3284 3285 /// \brief getCond - Return the condition expression; this is defined 3286 /// in terms of the opaque value. 3287 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 3288 3289 /// \brief getTrueExpr - Return the subexpression which will be 3290 /// evaluated if the condition evaluates to true; this is defined 3291 /// in terms of the opaque value. 3292 Expr *getTrueExpr() const { 3293 return cast<Expr>(SubExprs[LHS]); 3294 } 3295 3296 /// \brief getFalseExpr - Return the subexpression which will be 3297 /// evaluated if the condnition evaluates to false; this is 3298 /// defined in terms of the opaque value. 3299 Expr *getFalseExpr() const { 3300 return cast<Expr>(SubExprs[RHS]); 3301 } 3302 3303 SourceLocation getLocStart() const LLVM_READONLY { 3304 return getCommon()->getLocStart(); 3305 } 3306 SourceLocation getLocEnd() const LLVM_READONLY { 3307 return getFalseExpr()->getLocEnd(); 3308 } 3309 3310 static bool classof(const Stmt *T) { 3311 return T->getStmtClass() == BinaryConditionalOperatorClass; 3312 } 3313 3314 // Iterators 3315 child_range children() { 3316 return child_range(SubExprs, SubExprs + NUM_SUBEXPRS); 3317 } 3318 }; 3319 3320 inline Expr *AbstractConditionalOperator::getCond() const { 3321 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 3322 return co->getCond(); 3323 return cast<BinaryConditionalOperator>(this)->getCond(); 3324 } 3325 3326 inline Expr *AbstractConditionalOperator::getTrueExpr() const { 3327 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 3328 return co->getTrueExpr(); 3329 return cast<BinaryConditionalOperator>(this)->getTrueExpr(); 3330 } 3331 3332 inline Expr *AbstractConditionalOperator::getFalseExpr() const { 3333 if (const ConditionalOperator *co = dyn_cast<ConditionalOperator>(this)) 3334 return co->getFalseExpr(); 3335 return cast<BinaryConditionalOperator>(this)->getFalseExpr(); 3336 } 3337 3338 /// AddrLabelExpr - The GNU address of label extension, representing &&label. 3339 class AddrLabelExpr : public Expr { 3340 SourceLocation AmpAmpLoc, LabelLoc; 3341 LabelDecl *Label; 3342 public: 3343 AddrLabelExpr(SourceLocation AALoc, SourceLocation LLoc, LabelDecl *L, 3344 QualType t) 3345 : Expr(AddrLabelExprClass, t, VK_RValue, OK_Ordinary, false, false, false, 3346 false), 3347 AmpAmpLoc(AALoc), LabelLoc(LLoc), Label(L) {} 3348 3349 /// \brief Build an empty address of a label expression. 3350 explicit AddrLabelExpr(EmptyShell Empty) 3351 : Expr(AddrLabelExprClass, Empty) { } 3352 3353 SourceLocation getAmpAmpLoc() const { return AmpAmpLoc; } 3354 void setAmpAmpLoc(SourceLocation L) { AmpAmpLoc = L; } 3355 SourceLocation getLabelLoc() const { return LabelLoc; } 3356 void setLabelLoc(SourceLocation L) { LabelLoc = L; } 3357 3358 SourceLocation getLocStart() const LLVM_READONLY { return AmpAmpLoc; } 3359 SourceLocation getLocEnd() const LLVM_READONLY { return LabelLoc; } 3360 3361 LabelDecl *getLabel() const { return Label; } 3362 void setLabel(LabelDecl *L) { Label = L; } 3363 3364 static bool classof(const Stmt *T) { 3365 return T->getStmtClass() == AddrLabelExprClass; 3366 } 3367 3368 // Iterators 3369 child_range children() { 3370 return child_range(child_iterator(), child_iterator()); 3371 } 3372 }; 3373 3374 /// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}). 3375 /// The StmtExpr contains a single CompoundStmt node, which it evaluates and 3376 /// takes the value of the last subexpression. 3377 /// 3378 /// A StmtExpr is always an r-value; values "returned" out of a 3379 /// StmtExpr will be copied. 3380 class StmtExpr : public Expr { 3381 Stmt *SubStmt; 3382 SourceLocation LParenLoc, RParenLoc; 3383 public: 3384 // FIXME: Does type-dependence need to be computed differently? 3385 // FIXME: Do we need to compute instantiation instantiation-dependence for 3386 // statements? (ugh!) 3387 StmtExpr(CompoundStmt *substmt, QualType T, 3388 SourceLocation lp, SourceLocation rp) : 3389 Expr(StmtExprClass, T, VK_RValue, OK_Ordinary, 3390 T->isDependentType(), false, false, false), 3391 SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) { } 3392 3393 /// \brief Build an empty statement expression. 3394 explicit StmtExpr(EmptyShell Empty) : Expr(StmtExprClass, Empty) { } 3395 3396 CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); } 3397 const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); } 3398 void setSubStmt(CompoundStmt *S) { SubStmt = S; } 3399 3400 SourceLocation getLocStart() const LLVM_READONLY { return LParenLoc; } 3401 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 3402 3403 SourceLocation getLParenLoc() const { return LParenLoc; } 3404 void setLParenLoc(SourceLocation L) { LParenLoc = L; } 3405 SourceLocation getRParenLoc() const { return RParenLoc; } 3406 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 3407 3408 static bool classof(const Stmt *T) { 3409 return T->getStmtClass() == StmtExprClass; 3410 } 3411 3412 // Iterators 3413 child_range children() { return child_range(&SubStmt, &SubStmt+1); } 3414 }; 3415 3416 /// ShuffleVectorExpr - clang-specific builtin-in function 3417 /// __builtin_shufflevector. 3418 /// This AST node represents a operator that does a constant 3419 /// shuffle, similar to LLVM's shufflevector instruction. It takes 3420 /// two vectors and a variable number of constant indices, 3421 /// and returns the appropriately shuffled vector. 3422 class ShuffleVectorExpr : public Expr { 3423 SourceLocation BuiltinLoc, RParenLoc; 3424 3425 // SubExprs - the list of values passed to the __builtin_shufflevector 3426 // function. The first two are vectors, and the rest are constant 3427 // indices. The number of values in this list is always 3428 // 2+the number of indices in the vector type. 3429 Stmt **SubExprs; 3430 unsigned NumExprs; 3431 3432 public: 3433 ShuffleVectorExpr(const ASTContext &C, ArrayRef<Expr*> args, QualType Type, 3434 SourceLocation BLoc, SourceLocation RP); 3435 3436 /// \brief Build an empty vector-shuffle expression. 3437 explicit ShuffleVectorExpr(EmptyShell Empty) 3438 : Expr(ShuffleVectorExprClass, Empty), SubExprs(nullptr) { } 3439 3440 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 3441 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 3442 3443 SourceLocation getRParenLoc() const { return RParenLoc; } 3444 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 3445 3446 SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; } 3447 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 3448 3449 static bool classof(const Stmt *T) { 3450 return T->getStmtClass() == ShuffleVectorExprClass; 3451 } 3452 3453 /// getNumSubExprs - Return the size of the SubExprs array. This includes the 3454 /// constant expression, the actual arguments passed in, and the function 3455 /// pointers. 3456 unsigned getNumSubExprs() const { return NumExprs; } 3457 3458 /// \brief Retrieve the array of expressions. 3459 Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); } 3460 3461 /// getExpr - Return the Expr at the specified index. 3462 Expr *getExpr(unsigned Index) { 3463 assert((Index < NumExprs) && "Arg access out of range!"); 3464 return cast<Expr>(SubExprs[Index]); 3465 } 3466 const Expr *getExpr(unsigned Index) const { 3467 assert((Index < NumExprs) && "Arg access out of range!"); 3468 return cast<Expr>(SubExprs[Index]); 3469 } 3470 3471 void setExprs(const ASTContext &C, ArrayRef<Expr *> Exprs); 3472 3473 llvm::APSInt getShuffleMaskIdx(const ASTContext &Ctx, unsigned N) const { 3474 assert((N < NumExprs - 2) && "Shuffle idx out of range!"); 3475 return getExpr(N+2)->EvaluateKnownConstInt(Ctx); 3476 } 3477 3478 // Iterators 3479 child_range children() { 3480 return child_range(&SubExprs[0], &SubExprs[0]+NumExprs); 3481 } 3482 }; 3483 3484 /// ConvertVectorExpr - Clang builtin function __builtin_convertvector 3485 /// This AST node provides support for converting a vector type to another 3486 /// vector type of the same arity. 3487 class ConvertVectorExpr : public Expr { 3488 private: 3489 Stmt *SrcExpr; 3490 TypeSourceInfo *TInfo; 3491 SourceLocation BuiltinLoc, RParenLoc; 3492 3493 friend class ASTReader; 3494 friend class ASTStmtReader; 3495 explicit ConvertVectorExpr(EmptyShell Empty) : Expr(ConvertVectorExprClass, Empty) {} 3496 3497 public: 3498 ConvertVectorExpr(Expr* SrcExpr, TypeSourceInfo *TI, QualType DstType, 3499 ExprValueKind VK, ExprObjectKind OK, 3500 SourceLocation BuiltinLoc, SourceLocation RParenLoc) 3501 : Expr(ConvertVectorExprClass, DstType, VK, OK, 3502 DstType->isDependentType(), 3503 DstType->isDependentType() || SrcExpr->isValueDependent(), 3504 (DstType->isInstantiationDependentType() || 3505 SrcExpr->isInstantiationDependent()), 3506 (DstType->containsUnexpandedParameterPack() || 3507 SrcExpr->containsUnexpandedParameterPack())), 3508 SrcExpr(SrcExpr), TInfo(TI), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {} 3509 3510 /// getSrcExpr - Return the Expr to be converted. 3511 Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); } 3512 3513 /// getTypeSourceInfo - Return the destination type. 3514 TypeSourceInfo *getTypeSourceInfo() const { 3515 return TInfo; 3516 } 3517 void setTypeSourceInfo(TypeSourceInfo *ti) { 3518 TInfo = ti; 3519 } 3520 3521 /// getBuiltinLoc - Return the location of the __builtin_convertvector token. 3522 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 3523 3524 /// getRParenLoc - Return the location of final right parenthesis. 3525 SourceLocation getRParenLoc() const { return RParenLoc; } 3526 3527 SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; } 3528 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 3529 3530 static bool classof(const Stmt *T) { 3531 return T->getStmtClass() == ConvertVectorExprClass; 3532 } 3533 3534 // Iterators 3535 child_range children() { return child_range(&SrcExpr, &SrcExpr+1); } 3536 }; 3537 3538 /// ChooseExpr - GNU builtin-in function __builtin_choose_expr. 3539 /// This AST node is similar to the conditional operator (?:) in C, with 3540 /// the following exceptions: 3541 /// - the test expression must be a integer constant expression. 3542 /// - the expression returned acts like the chosen subexpression in every 3543 /// visible way: the type is the same as that of the chosen subexpression, 3544 /// and all predicates (whether it's an l-value, whether it's an integer 3545 /// constant expression, etc.) return the same result as for the chosen 3546 /// sub-expression. 3547 class ChooseExpr : public Expr { 3548 enum { COND, LHS, RHS, END_EXPR }; 3549 Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides. 3550 SourceLocation BuiltinLoc, RParenLoc; 3551 bool CondIsTrue; 3552 public: 3553 ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, 3554 QualType t, ExprValueKind VK, ExprObjectKind OK, 3555 SourceLocation RP, bool condIsTrue, 3556 bool TypeDependent, bool ValueDependent) 3557 : Expr(ChooseExprClass, t, VK, OK, TypeDependent, ValueDependent, 3558 (cond->isInstantiationDependent() || 3559 lhs->isInstantiationDependent() || 3560 rhs->isInstantiationDependent()), 3561 (cond->containsUnexpandedParameterPack() || 3562 lhs->containsUnexpandedParameterPack() || 3563 rhs->containsUnexpandedParameterPack())), 3564 BuiltinLoc(BLoc), RParenLoc(RP), CondIsTrue(condIsTrue) { 3565 SubExprs[COND] = cond; 3566 SubExprs[LHS] = lhs; 3567 SubExprs[RHS] = rhs; 3568 } 3569 3570 /// \brief Build an empty __builtin_choose_expr. 3571 explicit ChooseExpr(EmptyShell Empty) : Expr(ChooseExprClass, Empty) { } 3572 3573 /// isConditionTrue - Return whether the condition is true (i.e. not 3574 /// equal to zero). 3575 bool isConditionTrue() const { 3576 assert(!isConditionDependent() && 3577 "Dependent condition isn't true or false"); 3578 return CondIsTrue; 3579 } 3580 void setIsConditionTrue(bool isTrue) { CondIsTrue = isTrue; } 3581 3582 bool isConditionDependent() const { 3583 return getCond()->isTypeDependent() || getCond()->isValueDependent(); 3584 } 3585 3586 /// getChosenSubExpr - Return the subexpression chosen according to the 3587 /// condition. 3588 Expr *getChosenSubExpr() const { 3589 return isConditionTrue() ? getLHS() : getRHS(); 3590 } 3591 3592 Expr *getCond() const { return cast<Expr>(SubExprs[COND]); } 3593 void setCond(Expr *E) { SubExprs[COND] = E; } 3594 Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); } 3595 void setLHS(Expr *E) { SubExprs[LHS] = E; } 3596 Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); } 3597 void setRHS(Expr *E) { SubExprs[RHS] = E; } 3598 3599 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 3600 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 3601 3602 SourceLocation getRParenLoc() const { return RParenLoc; } 3603 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 3604 3605 SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; } 3606 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 3607 3608 static bool classof(const Stmt *T) { 3609 return T->getStmtClass() == ChooseExprClass; 3610 } 3611 3612 // Iterators 3613 child_range children() { 3614 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 3615 } 3616 }; 3617 3618 /// GNUNullExpr - Implements the GNU __null extension, which is a name 3619 /// for a null pointer constant that has integral type (e.g., int or 3620 /// long) and is the same size and alignment as a pointer. The __null 3621 /// extension is typically only used by system headers, which define 3622 /// NULL as __null in C++ rather than using 0 (which is an integer 3623 /// that may not match the size of a pointer). 3624 class GNUNullExpr : public Expr { 3625 /// TokenLoc - The location of the __null keyword. 3626 SourceLocation TokenLoc; 3627 3628 public: 3629 GNUNullExpr(QualType Ty, SourceLocation Loc) 3630 : Expr(GNUNullExprClass, Ty, VK_RValue, OK_Ordinary, false, false, false, 3631 false), 3632 TokenLoc(Loc) { } 3633 3634 /// \brief Build an empty GNU __null expression. 3635 explicit GNUNullExpr(EmptyShell Empty) : Expr(GNUNullExprClass, Empty) { } 3636 3637 /// getTokenLocation - The location of the __null token. 3638 SourceLocation getTokenLocation() const { return TokenLoc; } 3639 void setTokenLocation(SourceLocation L) { TokenLoc = L; } 3640 3641 SourceLocation getLocStart() const LLVM_READONLY { return TokenLoc; } 3642 SourceLocation getLocEnd() const LLVM_READONLY { return TokenLoc; } 3643 3644 static bool classof(const Stmt *T) { 3645 return T->getStmtClass() == GNUNullExprClass; 3646 } 3647 3648 // Iterators 3649 child_range children() { 3650 return child_range(child_iterator(), child_iterator()); 3651 } 3652 }; 3653 3654 /// Represents a call to the builtin function \c __builtin_va_arg. 3655 class VAArgExpr : public Expr { 3656 Stmt *Val; 3657 llvm::PointerIntPair<TypeSourceInfo *, 1, bool> TInfo; 3658 SourceLocation BuiltinLoc, RParenLoc; 3659 public: 3660 VAArgExpr(SourceLocation BLoc, Expr *e, TypeSourceInfo *TInfo, 3661 SourceLocation RPLoc, QualType t, bool IsMS) 3662 : Expr(VAArgExprClass, t, VK_RValue, OK_Ordinary, t->isDependentType(), 3663 false, (TInfo->getType()->isInstantiationDependentType() || 3664 e->isInstantiationDependent()), 3665 (TInfo->getType()->containsUnexpandedParameterPack() || 3666 e->containsUnexpandedParameterPack())), 3667 Val(e), TInfo(TInfo, IsMS), BuiltinLoc(BLoc), RParenLoc(RPLoc) {} 3668 3669 /// Create an empty __builtin_va_arg expression. 3670 explicit VAArgExpr(EmptyShell Empty) 3671 : Expr(VAArgExprClass, Empty), Val(nullptr), TInfo(nullptr, false) {} 3672 3673 const Expr *getSubExpr() const { return cast<Expr>(Val); } 3674 Expr *getSubExpr() { return cast<Expr>(Val); } 3675 void setSubExpr(Expr *E) { Val = E; } 3676 3677 /// Returns whether this is really a Win64 ABI va_arg expression. 3678 bool isMicrosoftABI() const { return TInfo.getInt(); } 3679 void setIsMicrosoftABI(bool IsMS) { TInfo.setInt(IsMS); } 3680 3681 TypeSourceInfo *getWrittenTypeInfo() const { return TInfo.getPointer(); } 3682 void setWrittenTypeInfo(TypeSourceInfo *TI) { TInfo.setPointer(TI); } 3683 3684 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 3685 void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; } 3686 3687 SourceLocation getRParenLoc() const { return RParenLoc; } 3688 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 3689 3690 SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; } 3691 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 3692 3693 static bool classof(const Stmt *T) { 3694 return T->getStmtClass() == VAArgExprClass; 3695 } 3696 3697 // Iterators 3698 child_range children() { return child_range(&Val, &Val+1); } 3699 }; 3700 3701 /// @brief Describes an C or C++ initializer list. 3702 /// 3703 /// InitListExpr describes an initializer list, which can be used to 3704 /// initialize objects of different types, including 3705 /// struct/class/union types, arrays, and vectors. For example: 3706 /// 3707 /// @code 3708 /// struct foo x = { 1, { 2, 3 } }; 3709 /// @endcode 3710 /// 3711 /// Prior to semantic analysis, an initializer list will represent the 3712 /// initializer list as written by the user, but will have the 3713 /// placeholder type "void". This initializer list is called the 3714 /// syntactic form of the initializer, and may contain C99 designated 3715 /// initializers (represented as DesignatedInitExprs), initializations 3716 /// of subobject members without explicit braces, and so on. Clients 3717 /// interested in the original syntax of the initializer list should 3718 /// use the syntactic form of the initializer list. 3719 /// 3720 /// After semantic analysis, the initializer list will represent the 3721 /// semantic form of the initializer, where the initializations of all 3722 /// subobjects are made explicit with nested InitListExpr nodes and 3723 /// C99 designators have been eliminated by placing the designated 3724 /// initializations into the subobject they initialize. Additionally, 3725 /// any "holes" in the initialization, where no initializer has been 3726 /// specified for a particular subobject, will be replaced with 3727 /// implicitly-generated ImplicitValueInitExpr expressions that 3728 /// value-initialize the subobjects. Note, however, that the 3729 /// initializer lists may still have fewer initializers than there are 3730 /// elements to initialize within the object. 3731 /// 3732 /// After semantic analysis has completed, given an initializer list, 3733 /// method isSemanticForm() returns true if and only if this is the 3734 /// semantic form of the initializer list (note: the same AST node 3735 /// may at the same time be the syntactic form). 3736 /// Given the semantic form of the initializer list, one can retrieve 3737 /// the syntactic form of that initializer list (when different) 3738 /// using method getSyntacticForm(); the method returns null if applied 3739 /// to a initializer list which is already in syntactic form. 3740 /// Similarly, given the syntactic form (i.e., an initializer list such 3741 /// that isSemanticForm() returns false), one can retrieve the semantic 3742 /// form using method getSemanticForm(). 3743 /// Since many initializer lists have the same syntactic and semantic forms, 3744 /// getSyntacticForm() may return NULL, indicating that the current 3745 /// semantic initializer list also serves as its syntactic form. 3746 class InitListExpr : public Expr { 3747 // FIXME: Eliminate this vector in favor of ASTContext allocation 3748 typedef ASTVector<Stmt *> InitExprsTy; 3749 InitExprsTy InitExprs; 3750 SourceLocation LBraceLoc, RBraceLoc; 3751 3752 /// The alternative form of the initializer list (if it exists). 3753 /// The int part of the pair stores whether this initializer list is 3754 /// in semantic form. If not null, the pointer points to: 3755 /// - the syntactic form, if this is in semantic form; 3756 /// - the semantic form, if this is in syntactic form. 3757 llvm::PointerIntPair<InitListExpr *, 1, bool> AltForm; 3758 3759 /// \brief Either: 3760 /// If this initializer list initializes an array with more elements than 3761 /// there are initializers in the list, specifies an expression to be used 3762 /// for value initialization of the rest of the elements. 3763 /// Or 3764 /// If this initializer list initializes a union, specifies which 3765 /// field within the union will be initialized. 3766 llvm::PointerUnion<Expr *, FieldDecl *> ArrayFillerOrUnionFieldInit; 3767 3768 public: 3769 InitListExpr(const ASTContext &C, SourceLocation lbraceloc, 3770 ArrayRef<Expr*> initExprs, SourceLocation rbraceloc); 3771 3772 /// \brief Build an empty initializer list. 3773 explicit InitListExpr(EmptyShell Empty) 3774 : Expr(InitListExprClass, Empty) { } 3775 3776 unsigned getNumInits() const { return InitExprs.size(); } 3777 3778 /// \brief Retrieve the set of initializers. 3779 Expr **getInits() { return reinterpret_cast<Expr **>(InitExprs.data()); } 3780 3781 ArrayRef<Expr *> inits() { 3782 return llvm::makeArrayRef(getInits(), getNumInits()); 3783 } 3784 3785 const Expr *getInit(unsigned Init) const { 3786 assert(Init < getNumInits() && "Initializer access out of range!"); 3787 return cast_or_null<Expr>(InitExprs[Init]); 3788 } 3789 3790 Expr *getInit(unsigned Init) { 3791 assert(Init < getNumInits() && "Initializer access out of range!"); 3792 return cast_or_null<Expr>(InitExprs[Init]); 3793 } 3794 3795 void setInit(unsigned Init, Expr *expr) { 3796 assert(Init < getNumInits() && "Initializer access out of range!"); 3797 InitExprs[Init] = expr; 3798 3799 if (expr) { 3800 ExprBits.TypeDependent |= expr->isTypeDependent(); 3801 ExprBits.ValueDependent |= expr->isValueDependent(); 3802 ExprBits.InstantiationDependent |= expr->isInstantiationDependent(); 3803 ExprBits.ContainsUnexpandedParameterPack |= 3804 expr->containsUnexpandedParameterPack(); 3805 } 3806 } 3807 3808 /// \brief Reserve space for some number of initializers. 3809 void reserveInits(const ASTContext &C, unsigned NumInits); 3810 3811 /// @brief Specify the number of initializers 3812 /// 3813 /// If there are more than @p NumInits initializers, the remaining 3814 /// initializers will be destroyed. If there are fewer than @p 3815 /// NumInits initializers, NULL expressions will be added for the 3816 /// unknown initializers. 3817 void resizeInits(const ASTContext &Context, unsigned NumInits); 3818 3819 /// @brief Updates the initializer at index @p Init with the new 3820 /// expression @p expr, and returns the old expression at that 3821 /// location. 3822 /// 3823 /// When @p Init is out of range for this initializer list, the 3824 /// initializer list will be extended with NULL expressions to 3825 /// accommodate the new entry. 3826 Expr *updateInit(const ASTContext &C, unsigned Init, Expr *expr); 3827 3828 /// \brief If this initializer list initializes an array with more elements 3829 /// than there are initializers in the list, specifies an expression to be 3830 /// used for value initialization of the rest of the elements. 3831 Expr *getArrayFiller() { 3832 return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>(); 3833 } 3834 const Expr *getArrayFiller() const { 3835 return const_cast<InitListExpr *>(this)->getArrayFiller(); 3836 } 3837 void setArrayFiller(Expr *filler); 3838 3839 /// \brief Return true if this is an array initializer and its array "filler" 3840 /// has been set. 3841 bool hasArrayFiller() const { return getArrayFiller(); } 3842 3843 /// \brief If this initializes a union, specifies which field in the 3844 /// union to initialize. 3845 /// 3846 /// Typically, this field is the first named field within the 3847 /// union. However, a designated initializer can specify the 3848 /// initialization of a different field within the union. 3849 FieldDecl *getInitializedFieldInUnion() { 3850 return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>(); 3851 } 3852 const FieldDecl *getInitializedFieldInUnion() const { 3853 return const_cast<InitListExpr *>(this)->getInitializedFieldInUnion(); 3854 } 3855 void setInitializedFieldInUnion(FieldDecl *FD) { 3856 assert((FD == nullptr 3857 || getInitializedFieldInUnion() == nullptr 3858 || getInitializedFieldInUnion() == FD) 3859 && "Only one field of a union may be initialized at a time!"); 3860 ArrayFillerOrUnionFieldInit = FD; 3861 } 3862 3863 // Explicit InitListExpr's originate from source code (and have valid source 3864 // locations). Implicit InitListExpr's are created by the semantic analyzer. 3865 bool isExplicit() { 3866 return LBraceLoc.isValid() && RBraceLoc.isValid(); 3867 } 3868 3869 // Is this an initializer for an array of characters, initialized by a string 3870 // literal or an @encode? 3871 bool isStringLiteralInit() const; 3872 3873 SourceLocation getLBraceLoc() const { return LBraceLoc; } 3874 void setLBraceLoc(SourceLocation Loc) { LBraceLoc = Loc; } 3875 SourceLocation getRBraceLoc() const { return RBraceLoc; } 3876 void setRBraceLoc(SourceLocation Loc) { RBraceLoc = Loc; } 3877 3878 bool isSemanticForm() const { return AltForm.getInt(); } 3879 InitListExpr *getSemanticForm() const { 3880 return isSemanticForm() ? nullptr : AltForm.getPointer(); 3881 } 3882 InitListExpr *getSyntacticForm() const { 3883 return isSemanticForm() ? AltForm.getPointer() : nullptr; 3884 } 3885 3886 void setSyntacticForm(InitListExpr *Init) { 3887 AltForm.setPointer(Init); 3888 AltForm.setInt(true); 3889 Init->AltForm.setPointer(this); 3890 Init->AltForm.setInt(false); 3891 } 3892 3893 bool hadArrayRangeDesignator() const { 3894 return InitListExprBits.HadArrayRangeDesignator != 0; 3895 } 3896 void sawArrayRangeDesignator(bool ARD = true) { 3897 InitListExprBits.HadArrayRangeDesignator = ARD; 3898 } 3899 3900 SourceLocation getLocStart() const LLVM_READONLY; 3901 SourceLocation getLocEnd() const LLVM_READONLY; 3902 3903 static bool classof(const Stmt *T) { 3904 return T->getStmtClass() == InitListExprClass; 3905 } 3906 3907 // Iterators 3908 child_range children() { 3909 // FIXME: This does not include the array filler expression. 3910 if (InitExprs.empty()) 3911 return child_range(child_iterator(), child_iterator()); 3912 return child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size()); 3913 } 3914 3915 typedef InitExprsTy::iterator iterator; 3916 typedef InitExprsTy::const_iterator const_iterator; 3917 typedef InitExprsTy::reverse_iterator reverse_iterator; 3918 typedef InitExprsTy::const_reverse_iterator const_reverse_iterator; 3919 3920 iterator begin() { return InitExprs.begin(); } 3921 const_iterator begin() const { return InitExprs.begin(); } 3922 iterator end() { return InitExprs.end(); } 3923 const_iterator end() const { return InitExprs.end(); } 3924 reverse_iterator rbegin() { return InitExprs.rbegin(); } 3925 const_reverse_iterator rbegin() const { return InitExprs.rbegin(); } 3926 reverse_iterator rend() { return InitExprs.rend(); } 3927 const_reverse_iterator rend() const { return InitExprs.rend(); } 3928 3929 friend class ASTStmtReader; 3930 friend class ASTStmtWriter; 3931 }; 3932 3933 /// @brief Represents a C99 designated initializer expression. 3934 /// 3935 /// A designated initializer expression (C99 6.7.8) contains one or 3936 /// more designators (which can be field designators, array 3937 /// designators, or GNU array-range designators) followed by an 3938 /// expression that initializes the field or element(s) that the 3939 /// designators refer to. For example, given: 3940 /// 3941 /// @code 3942 /// struct point { 3943 /// double x; 3944 /// double y; 3945 /// }; 3946 /// struct point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 3947 /// @endcode 3948 /// 3949 /// The InitListExpr contains three DesignatedInitExprs, the first of 3950 /// which covers @c [2].y=1.0. This DesignatedInitExpr will have two 3951 /// designators, one array designator for @c [2] followed by one field 3952 /// designator for @c .y. The initialization expression will be 1.0. 3953 class DesignatedInitExpr final 3954 : public Expr, 3955 private llvm::TrailingObjects<DesignatedInitExpr, Stmt *> { 3956 public: 3957 /// \brief Forward declaration of the Designator class. 3958 class Designator; 3959 3960 private: 3961 /// The location of the '=' or ':' prior to the actual initializer 3962 /// expression. 3963 SourceLocation EqualOrColonLoc; 3964 3965 /// Whether this designated initializer used the GNU deprecated 3966 /// syntax rather than the C99 '=' syntax. 3967 unsigned GNUSyntax : 1; 3968 3969 /// The number of designators in this initializer expression. 3970 unsigned NumDesignators : 15; 3971 3972 /// The number of subexpressions of this initializer expression, 3973 /// which contains both the initializer and any additional 3974 /// expressions used by array and array-range designators. 3975 unsigned NumSubExprs : 16; 3976 3977 /// \brief The designators in this designated initialization 3978 /// expression. 3979 Designator *Designators; 3980 3981 DesignatedInitExpr(const ASTContext &C, QualType Ty, 3982 llvm::ArrayRef<Designator> Designators, 3983 SourceLocation EqualOrColonLoc, bool GNUSyntax, 3984 ArrayRef<Expr *> IndexExprs, Expr *Init); 3985 3986 explicit DesignatedInitExpr(unsigned NumSubExprs) 3987 : Expr(DesignatedInitExprClass, EmptyShell()), 3988 NumDesignators(0), NumSubExprs(NumSubExprs), Designators(nullptr) { } 3989 3990 public: 3991 /// A field designator, e.g., ".x". 3992 struct FieldDesignator { 3993 /// Refers to the field that is being initialized. The low bit 3994 /// of this field determines whether this is actually a pointer 3995 /// to an IdentifierInfo (if 1) or a FieldDecl (if 0). When 3996 /// initially constructed, a field designator will store an 3997 /// IdentifierInfo*. After semantic analysis has resolved that 3998 /// name, the field designator will instead store a FieldDecl*. 3999 uintptr_t NameOrField; 4000 4001 /// The location of the '.' in the designated initializer. 4002 unsigned DotLoc; 4003 4004 /// The location of the field name in the designated initializer. 4005 unsigned FieldLoc; 4006 }; 4007 4008 /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". 4009 struct ArrayOrRangeDesignator { 4010 /// Location of the first index expression within the designated 4011 /// initializer expression's list of subexpressions. 4012 unsigned Index; 4013 /// The location of the '[' starting the array range designator. 4014 unsigned LBracketLoc; 4015 /// The location of the ellipsis separating the start and end 4016 /// indices. Only valid for GNU array-range designators. 4017 unsigned EllipsisLoc; 4018 /// The location of the ']' terminating the array range designator. 4019 unsigned RBracketLoc; 4020 }; 4021 4022 /// @brief Represents a single C99 designator. 4023 /// 4024 /// @todo This class is infuriatingly similar to clang::Designator, 4025 /// but minor differences (storing indices vs. storing pointers) 4026 /// keep us from reusing it. Try harder, later, to rectify these 4027 /// differences. 4028 class Designator { 4029 /// @brief The kind of designator this describes. 4030 enum { 4031 FieldDesignator, 4032 ArrayDesignator, 4033 ArrayRangeDesignator 4034 } Kind; 4035 4036 union { 4037 /// A field designator, e.g., ".x". 4038 struct FieldDesignator Field; 4039 /// An array or GNU array-range designator, e.g., "[9]" or "[10..15]". 4040 struct ArrayOrRangeDesignator ArrayOrRange; 4041 }; 4042 friend class DesignatedInitExpr; 4043 4044 public: 4045 Designator() {} 4046 4047 /// @brief Initializes a field designator. 4048 Designator(const IdentifierInfo *FieldName, SourceLocation DotLoc, 4049 SourceLocation FieldLoc) 4050 : Kind(FieldDesignator) { 4051 Field.NameOrField = reinterpret_cast<uintptr_t>(FieldName) | 0x01; 4052 Field.DotLoc = DotLoc.getRawEncoding(); 4053 Field.FieldLoc = FieldLoc.getRawEncoding(); 4054 } 4055 4056 /// @brief Initializes an array designator. 4057 Designator(unsigned Index, SourceLocation LBracketLoc, 4058 SourceLocation RBracketLoc) 4059 : Kind(ArrayDesignator) { 4060 ArrayOrRange.Index = Index; 4061 ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding(); 4062 ArrayOrRange.EllipsisLoc = SourceLocation().getRawEncoding(); 4063 ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding(); 4064 } 4065 4066 /// @brief Initializes a GNU array-range designator. 4067 Designator(unsigned Index, SourceLocation LBracketLoc, 4068 SourceLocation EllipsisLoc, SourceLocation RBracketLoc) 4069 : Kind(ArrayRangeDesignator) { 4070 ArrayOrRange.Index = Index; 4071 ArrayOrRange.LBracketLoc = LBracketLoc.getRawEncoding(); 4072 ArrayOrRange.EllipsisLoc = EllipsisLoc.getRawEncoding(); 4073 ArrayOrRange.RBracketLoc = RBracketLoc.getRawEncoding(); 4074 } 4075 4076 bool isFieldDesignator() const { return Kind == FieldDesignator; } 4077 bool isArrayDesignator() const { return Kind == ArrayDesignator; } 4078 bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; } 4079 4080 IdentifierInfo *getFieldName() const; 4081 4082 FieldDecl *getField() const { 4083 assert(Kind == FieldDesignator && "Only valid on a field designator"); 4084 if (Field.NameOrField & 0x01) 4085 return nullptr; 4086 else 4087 return reinterpret_cast<FieldDecl *>(Field.NameOrField); 4088 } 4089 4090 void setField(FieldDecl *FD) { 4091 assert(Kind == FieldDesignator && "Only valid on a field designator"); 4092 Field.NameOrField = reinterpret_cast<uintptr_t>(FD); 4093 } 4094 4095 SourceLocation getDotLoc() const { 4096 assert(Kind == FieldDesignator && "Only valid on a field designator"); 4097 return SourceLocation::getFromRawEncoding(Field.DotLoc); 4098 } 4099 4100 SourceLocation getFieldLoc() const { 4101 assert(Kind == FieldDesignator && "Only valid on a field designator"); 4102 return SourceLocation::getFromRawEncoding(Field.FieldLoc); 4103 } 4104 4105 SourceLocation getLBracketLoc() const { 4106 assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 4107 "Only valid on an array or array-range designator"); 4108 return SourceLocation::getFromRawEncoding(ArrayOrRange.LBracketLoc); 4109 } 4110 4111 SourceLocation getRBracketLoc() const { 4112 assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 4113 "Only valid on an array or array-range designator"); 4114 return SourceLocation::getFromRawEncoding(ArrayOrRange.RBracketLoc); 4115 } 4116 4117 SourceLocation getEllipsisLoc() const { 4118 assert(Kind == ArrayRangeDesignator && 4119 "Only valid on an array-range designator"); 4120 return SourceLocation::getFromRawEncoding(ArrayOrRange.EllipsisLoc); 4121 } 4122 4123 unsigned getFirstExprIndex() const { 4124 assert((Kind == ArrayDesignator || Kind == ArrayRangeDesignator) && 4125 "Only valid on an array or array-range designator"); 4126 return ArrayOrRange.Index; 4127 } 4128 4129 SourceLocation getLocStart() const LLVM_READONLY { 4130 if (Kind == FieldDesignator) 4131 return getDotLoc().isInvalid()? getFieldLoc() : getDotLoc(); 4132 else 4133 return getLBracketLoc(); 4134 } 4135 SourceLocation getLocEnd() const LLVM_READONLY { 4136 return Kind == FieldDesignator ? getFieldLoc() : getRBracketLoc(); 4137 } 4138 SourceRange getSourceRange() const LLVM_READONLY { 4139 return SourceRange(getLocStart(), getLocEnd()); 4140 } 4141 }; 4142 4143 static DesignatedInitExpr *Create(const ASTContext &C, 4144 llvm::ArrayRef<Designator> Designators, 4145 ArrayRef<Expr*> IndexExprs, 4146 SourceLocation EqualOrColonLoc, 4147 bool GNUSyntax, Expr *Init); 4148 4149 static DesignatedInitExpr *CreateEmpty(const ASTContext &C, 4150 unsigned NumIndexExprs); 4151 4152 /// @brief Returns the number of designators in this initializer. 4153 unsigned size() const { return NumDesignators; } 4154 4155 // Iterator access to the designators. 4156 llvm::MutableArrayRef<Designator> designators() { 4157 return {Designators, NumDesignators}; 4158 } 4159 4160 llvm::ArrayRef<Designator> designators() const { 4161 return {Designators, NumDesignators}; 4162 } 4163 4164 Designator *getDesignator(unsigned Idx) { return &designators()[Idx]; } 4165 4166 void setDesignators(const ASTContext &C, const Designator *Desigs, 4167 unsigned NumDesigs); 4168 4169 Expr *getArrayIndex(const Designator &D) const; 4170 Expr *getArrayRangeStart(const Designator &D) const; 4171 Expr *getArrayRangeEnd(const Designator &D) const; 4172 4173 /// @brief Retrieve the location of the '=' that precedes the 4174 /// initializer value itself, if present. 4175 SourceLocation getEqualOrColonLoc() const { return EqualOrColonLoc; } 4176 void setEqualOrColonLoc(SourceLocation L) { EqualOrColonLoc = L; } 4177 4178 /// @brief Determines whether this designated initializer used the 4179 /// deprecated GNU syntax for designated initializers. 4180 bool usesGNUSyntax() const { return GNUSyntax; } 4181 void setGNUSyntax(bool GNU) { GNUSyntax = GNU; } 4182 4183 /// @brief Retrieve the initializer value. 4184 Expr *getInit() const { 4185 return cast<Expr>(*const_cast<DesignatedInitExpr*>(this)->child_begin()); 4186 } 4187 4188 void setInit(Expr *init) { 4189 *child_begin() = init; 4190 } 4191 4192 /// \brief Retrieve the total number of subexpressions in this 4193 /// designated initializer expression, including the actual 4194 /// initialized value and any expressions that occur within array 4195 /// and array-range designators. 4196 unsigned getNumSubExprs() const { return NumSubExprs; } 4197 4198 Expr *getSubExpr(unsigned Idx) const { 4199 assert(Idx < NumSubExprs && "Subscript out of range"); 4200 return cast<Expr>(getTrailingObjects<Stmt *>()[Idx]); 4201 } 4202 4203 void setSubExpr(unsigned Idx, Expr *E) { 4204 assert(Idx < NumSubExprs && "Subscript out of range"); 4205 getTrailingObjects<Stmt *>()[Idx] = E; 4206 } 4207 4208 /// \brief Replaces the designator at index @p Idx with the series 4209 /// of designators in [First, Last). 4210 void ExpandDesignator(const ASTContext &C, unsigned Idx, 4211 const Designator *First, const Designator *Last); 4212 4213 SourceRange getDesignatorsSourceRange() const; 4214 4215 SourceLocation getLocStart() const LLVM_READONLY; 4216 SourceLocation getLocEnd() const LLVM_READONLY; 4217 4218 static bool classof(const Stmt *T) { 4219 return T->getStmtClass() == DesignatedInitExprClass; 4220 } 4221 4222 // Iterators 4223 child_range children() { 4224 Stmt **begin = getTrailingObjects<Stmt *>(); 4225 return child_range(begin, begin + NumSubExprs); 4226 } 4227 4228 friend TrailingObjects; 4229 }; 4230 4231 /// \brief Represents a place-holder for an object not to be initialized by 4232 /// anything. 4233 /// 4234 /// This only makes sense when it appears as part of an updater of a 4235 /// DesignatedInitUpdateExpr (see below). The base expression of a DIUE 4236 /// initializes a big object, and the NoInitExpr's mark the spots within the 4237 /// big object not to be overwritten by the updater. 4238 /// 4239 /// \see DesignatedInitUpdateExpr 4240 class NoInitExpr : public Expr { 4241 public: 4242 explicit NoInitExpr(QualType ty) 4243 : Expr(NoInitExprClass, ty, VK_RValue, OK_Ordinary, 4244 false, false, ty->isInstantiationDependentType(), false) { } 4245 4246 explicit NoInitExpr(EmptyShell Empty) 4247 : Expr(NoInitExprClass, Empty) { } 4248 4249 static bool classof(const Stmt *T) { 4250 return T->getStmtClass() == NoInitExprClass; 4251 } 4252 4253 SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); } 4254 SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); } 4255 4256 // Iterators 4257 child_range children() { 4258 return child_range(child_iterator(), child_iterator()); 4259 } 4260 }; 4261 4262 // In cases like: 4263 // struct Q { int a, b, c; }; 4264 // Q *getQ(); 4265 // void foo() { 4266 // struct A { Q q; } a = { *getQ(), .q.b = 3 }; 4267 // } 4268 // 4269 // We will have an InitListExpr for a, with type A, and then a 4270 // DesignatedInitUpdateExpr for "a.q" with type Q. The "base" for this DIUE 4271 // is the call expression *getQ(); the "updater" for the DIUE is ".q.b = 3" 4272 // 4273 class DesignatedInitUpdateExpr : public Expr { 4274 // BaseAndUpdaterExprs[0] is the base expression; 4275 // BaseAndUpdaterExprs[1] is an InitListExpr overwriting part of the base. 4276 Stmt *BaseAndUpdaterExprs[2]; 4277 4278 public: 4279 DesignatedInitUpdateExpr(const ASTContext &C, SourceLocation lBraceLoc, 4280 Expr *baseExprs, SourceLocation rBraceLoc); 4281 4282 explicit DesignatedInitUpdateExpr(EmptyShell Empty) 4283 : Expr(DesignatedInitUpdateExprClass, Empty) { } 4284 4285 SourceLocation getLocStart() const LLVM_READONLY; 4286 SourceLocation getLocEnd() const LLVM_READONLY; 4287 4288 static bool classof(const Stmt *T) { 4289 return T->getStmtClass() == DesignatedInitUpdateExprClass; 4290 } 4291 4292 Expr *getBase() const { return cast<Expr>(BaseAndUpdaterExprs[0]); } 4293 void setBase(Expr *Base) { BaseAndUpdaterExprs[0] = Base; } 4294 4295 InitListExpr *getUpdater() const { 4296 return cast<InitListExpr>(BaseAndUpdaterExprs[1]); 4297 } 4298 void setUpdater(Expr *Updater) { BaseAndUpdaterExprs[1] = Updater; } 4299 4300 // Iterators 4301 // children = the base and the updater 4302 child_range children() { 4303 return child_range(&BaseAndUpdaterExprs[0], &BaseAndUpdaterExprs[0] + 2); 4304 } 4305 }; 4306 4307 /// \brief Represents an implicitly-generated value initialization of 4308 /// an object of a given type. 4309 /// 4310 /// Implicit value initializations occur within semantic initializer 4311 /// list expressions (InitListExpr) as placeholders for subobject 4312 /// initializations not explicitly specified by the user. 4313 /// 4314 /// \see InitListExpr 4315 class ImplicitValueInitExpr : public Expr { 4316 public: 4317 explicit ImplicitValueInitExpr(QualType ty) 4318 : Expr(ImplicitValueInitExprClass, ty, VK_RValue, OK_Ordinary, 4319 false, false, ty->isInstantiationDependentType(), false) { } 4320 4321 /// \brief Construct an empty implicit value initialization. 4322 explicit ImplicitValueInitExpr(EmptyShell Empty) 4323 : Expr(ImplicitValueInitExprClass, Empty) { } 4324 4325 static bool classof(const Stmt *T) { 4326 return T->getStmtClass() == ImplicitValueInitExprClass; 4327 } 4328 4329 SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); } 4330 SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); } 4331 4332 // Iterators 4333 child_range children() { 4334 return child_range(child_iterator(), child_iterator()); 4335 } 4336 }; 4337 4338 class ParenListExpr : public Expr { 4339 Stmt **Exprs; 4340 unsigned NumExprs; 4341 SourceLocation LParenLoc, RParenLoc; 4342 4343 public: 4344 ParenListExpr(const ASTContext& C, SourceLocation lparenloc, 4345 ArrayRef<Expr*> exprs, SourceLocation rparenloc); 4346 4347 /// \brief Build an empty paren list. 4348 explicit ParenListExpr(EmptyShell Empty) : Expr(ParenListExprClass, Empty) { } 4349 4350 unsigned getNumExprs() const { return NumExprs; } 4351 4352 const Expr* getExpr(unsigned Init) const { 4353 assert(Init < getNumExprs() && "Initializer access out of range!"); 4354 return cast_or_null<Expr>(Exprs[Init]); 4355 } 4356 4357 Expr* getExpr(unsigned Init) { 4358 assert(Init < getNumExprs() && "Initializer access out of range!"); 4359 return cast_or_null<Expr>(Exprs[Init]); 4360 } 4361 4362 Expr **getExprs() { return reinterpret_cast<Expr **>(Exprs); } 4363 4364 ArrayRef<Expr *> exprs() { 4365 return llvm::makeArrayRef(getExprs(), getNumExprs()); 4366 } 4367 4368 SourceLocation getLParenLoc() const { return LParenLoc; } 4369 SourceLocation getRParenLoc() const { return RParenLoc; } 4370 4371 SourceLocation getLocStart() const LLVM_READONLY { return LParenLoc; } 4372 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 4373 4374 static bool classof(const Stmt *T) { 4375 return T->getStmtClass() == ParenListExprClass; 4376 } 4377 4378 // Iterators 4379 child_range children() { 4380 return child_range(&Exprs[0], &Exprs[0]+NumExprs); 4381 } 4382 4383 friend class ASTStmtReader; 4384 friend class ASTStmtWriter; 4385 }; 4386 4387 /// \brief Represents a C11 generic selection. 4388 /// 4389 /// A generic selection (C11 6.5.1.1) contains an unevaluated controlling 4390 /// expression, followed by one or more generic associations. Each generic 4391 /// association specifies a type name and an expression, or "default" and an 4392 /// expression (in which case it is known as a default generic association). 4393 /// The type and value of the generic selection are identical to those of its 4394 /// result expression, which is defined as the expression in the generic 4395 /// association with a type name that is compatible with the type of the 4396 /// controlling expression, or the expression in the default generic association 4397 /// if no types are compatible. For example: 4398 /// 4399 /// @code 4400 /// _Generic(X, double: 1, float: 2, default: 3) 4401 /// @endcode 4402 /// 4403 /// The above expression evaluates to 1 if 1.0 is substituted for X, 2 if 1.0f 4404 /// or 3 if "hello". 4405 /// 4406 /// As an extension, generic selections are allowed in C++, where the following 4407 /// additional semantics apply: 4408 /// 4409 /// Any generic selection whose controlling expression is type-dependent or 4410 /// which names a dependent type in its association list is result-dependent, 4411 /// which means that the choice of result expression is dependent. 4412 /// Result-dependent generic associations are both type- and value-dependent. 4413 class GenericSelectionExpr : public Expr { 4414 enum { CONTROLLING, END_EXPR }; 4415 TypeSourceInfo **AssocTypes; 4416 Stmt **SubExprs; 4417 unsigned NumAssocs, ResultIndex; 4418 SourceLocation GenericLoc, DefaultLoc, RParenLoc; 4419 4420 public: 4421 GenericSelectionExpr(const ASTContext &Context, 4422 SourceLocation GenericLoc, Expr *ControllingExpr, 4423 ArrayRef<TypeSourceInfo*> AssocTypes, 4424 ArrayRef<Expr*> AssocExprs, 4425 SourceLocation DefaultLoc, SourceLocation RParenLoc, 4426 bool ContainsUnexpandedParameterPack, 4427 unsigned ResultIndex); 4428 4429 /// This constructor is used in the result-dependent case. 4430 GenericSelectionExpr(const ASTContext &Context, 4431 SourceLocation GenericLoc, Expr *ControllingExpr, 4432 ArrayRef<TypeSourceInfo*> AssocTypes, 4433 ArrayRef<Expr*> AssocExprs, 4434 SourceLocation DefaultLoc, SourceLocation RParenLoc, 4435 bool ContainsUnexpandedParameterPack); 4436 4437 explicit GenericSelectionExpr(EmptyShell Empty) 4438 : Expr(GenericSelectionExprClass, Empty) { } 4439 4440 unsigned getNumAssocs() const { return NumAssocs; } 4441 4442 SourceLocation getGenericLoc() const { return GenericLoc; } 4443 SourceLocation getDefaultLoc() const { return DefaultLoc; } 4444 SourceLocation getRParenLoc() const { return RParenLoc; } 4445 4446 const Expr *getAssocExpr(unsigned i) const { 4447 return cast<Expr>(SubExprs[END_EXPR+i]); 4448 } 4449 Expr *getAssocExpr(unsigned i) { return cast<Expr>(SubExprs[END_EXPR+i]); } 4450 4451 const TypeSourceInfo *getAssocTypeSourceInfo(unsigned i) const { 4452 return AssocTypes[i]; 4453 } 4454 TypeSourceInfo *getAssocTypeSourceInfo(unsigned i) { return AssocTypes[i]; } 4455 4456 QualType getAssocType(unsigned i) const { 4457 if (const TypeSourceInfo *TS = getAssocTypeSourceInfo(i)) 4458 return TS->getType(); 4459 else 4460 return QualType(); 4461 } 4462 4463 const Expr *getControllingExpr() const { 4464 return cast<Expr>(SubExprs[CONTROLLING]); 4465 } 4466 Expr *getControllingExpr() { return cast<Expr>(SubExprs[CONTROLLING]); } 4467 4468 /// Whether this generic selection is result-dependent. 4469 bool isResultDependent() const { return ResultIndex == -1U; } 4470 4471 /// The zero-based index of the result expression's generic association in 4472 /// the generic selection's association list. Defined only if the 4473 /// generic selection is not result-dependent. 4474 unsigned getResultIndex() const { 4475 assert(!isResultDependent() && "Generic selection is result-dependent"); 4476 return ResultIndex; 4477 } 4478 4479 /// The generic selection's result expression. Defined only if the 4480 /// generic selection is not result-dependent. 4481 const Expr *getResultExpr() const { return getAssocExpr(getResultIndex()); } 4482 Expr *getResultExpr() { return getAssocExpr(getResultIndex()); } 4483 4484 SourceLocation getLocStart() const LLVM_READONLY { return GenericLoc; } 4485 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 4486 4487 static bool classof(const Stmt *T) { 4488 return T->getStmtClass() == GenericSelectionExprClass; 4489 } 4490 4491 child_range children() { 4492 return child_range(SubExprs, SubExprs+END_EXPR+NumAssocs); 4493 } 4494 4495 friend class ASTStmtReader; 4496 }; 4497 4498 //===----------------------------------------------------------------------===// 4499 // Clang Extensions 4500 //===----------------------------------------------------------------------===// 4501 4502 /// ExtVectorElementExpr - This represents access to specific elements of a 4503 /// vector, and may occur on the left hand side or right hand side. For example 4504 /// the following is legal: "V.xy = V.zw" if V is a 4 element extended vector. 4505 /// 4506 /// Note that the base may have either vector or pointer to vector type, just 4507 /// like a struct field reference. 4508 /// 4509 class ExtVectorElementExpr : public Expr { 4510 Stmt *Base; 4511 IdentifierInfo *Accessor; 4512 SourceLocation AccessorLoc; 4513 public: 4514 ExtVectorElementExpr(QualType ty, ExprValueKind VK, Expr *base, 4515 IdentifierInfo &accessor, SourceLocation loc) 4516 : Expr(ExtVectorElementExprClass, ty, VK, 4517 (VK == VK_RValue ? OK_Ordinary : OK_VectorComponent), 4518 base->isTypeDependent(), base->isValueDependent(), 4519 base->isInstantiationDependent(), 4520 base->containsUnexpandedParameterPack()), 4521 Base(base), Accessor(&accessor), AccessorLoc(loc) {} 4522 4523 /// \brief Build an empty vector element expression. 4524 explicit ExtVectorElementExpr(EmptyShell Empty) 4525 : Expr(ExtVectorElementExprClass, Empty) { } 4526 4527 const Expr *getBase() const { return cast<Expr>(Base); } 4528 Expr *getBase() { return cast<Expr>(Base); } 4529 void setBase(Expr *E) { Base = E; } 4530 4531 IdentifierInfo &getAccessor() const { return *Accessor; } 4532 void setAccessor(IdentifierInfo *II) { Accessor = II; } 4533 4534 SourceLocation getAccessorLoc() const { return AccessorLoc; } 4535 void setAccessorLoc(SourceLocation L) { AccessorLoc = L; } 4536 4537 /// getNumElements - Get the number of components being selected. 4538 unsigned getNumElements() const; 4539 4540 /// containsDuplicateElements - Return true if any element access is 4541 /// repeated. 4542 bool containsDuplicateElements() const; 4543 4544 /// getEncodedElementAccess - Encode the elements accessed into an llvm 4545 /// aggregate Constant of ConstantInt(s). 4546 void getEncodedElementAccess(SmallVectorImpl<uint32_t> &Elts) const; 4547 4548 SourceLocation getLocStart() const LLVM_READONLY { 4549 return getBase()->getLocStart(); 4550 } 4551 SourceLocation getLocEnd() const LLVM_READONLY { return AccessorLoc; } 4552 4553 /// isArrow - Return true if the base expression is a pointer to vector, 4554 /// return false if the base expression is a vector. 4555 bool isArrow() const; 4556 4557 static bool classof(const Stmt *T) { 4558 return T->getStmtClass() == ExtVectorElementExprClass; 4559 } 4560 4561 // Iterators 4562 child_range children() { return child_range(&Base, &Base+1); } 4563 }; 4564 4565 /// BlockExpr - Adaptor class for mixing a BlockDecl with expressions. 4566 /// ^{ statement-body } or ^(int arg1, float arg2){ statement-body } 4567 class BlockExpr : public Expr { 4568 protected: 4569 BlockDecl *TheBlock; 4570 public: 4571 BlockExpr(BlockDecl *BD, QualType ty) 4572 : Expr(BlockExprClass, ty, VK_RValue, OK_Ordinary, 4573 ty->isDependentType(), ty->isDependentType(), 4574 ty->isInstantiationDependentType() || BD->isDependentContext(), 4575 false), 4576 TheBlock(BD) {} 4577 4578 /// \brief Build an empty block expression. 4579 explicit BlockExpr(EmptyShell Empty) : Expr(BlockExprClass, Empty) { } 4580 4581 const BlockDecl *getBlockDecl() const { return TheBlock; } 4582 BlockDecl *getBlockDecl() { return TheBlock; } 4583 void setBlockDecl(BlockDecl *BD) { TheBlock = BD; } 4584 4585 // Convenience functions for probing the underlying BlockDecl. 4586 SourceLocation getCaretLocation() const; 4587 const Stmt *getBody() const; 4588 Stmt *getBody(); 4589 4590 SourceLocation getLocStart() const LLVM_READONLY { return getCaretLocation(); } 4591 SourceLocation getLocEnd() const LLVM_READONLY { return getBody()->getLocEnd(); } 4592 4593 /// getFunctionType - Return the underlying function type for this block. 4594 const FunctionProtoType *getFunctionType() const; 4595 4596 static bool classof(const Stmt *T) { 4597 return T->getStmtClass() == BlockExprClass; 4598 } 4599 4600 // Iterators 4601 child_range children() { 4602 return child_range(child_iterator(), child_iterator()); 4603 } 4604 }; 4605 4606 /// AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] 4607 /// This AST node provides support for reinterpreting a type to another 4608 /// type of the same size. 4609 class AsTypeExpr : public Expr { 4610 private: 4611 Stmt *SrcExpr; 4612 SourceLocation BuiltinLoc, RParenLoc; 4613 4614 friend class ASTReader; 4615 friend class ASTStmtReader; 4616 explicit AsTypeExpr(EmptyShell Empty) : Expr(AsTypeExprClass, Empty) {} 4617 4618 public: 4619 AsTypeExpr(Expr* SrcExpr, QualType DstType, 4620 ExprValueKind VK, ExprObjectKind OK, 4621 SourceLocation BuiltinLoc, SourceLocation RParenLoc) 4622 : Expr(AsTypeExprClass, DstType, VK, OK, 4623 DstType->isDependentType(), 4624 DstType->isDependentType() || SrcExpr->isValueDependent(), 4625 (DstType->isInstantiationDependentType() || 4626 SrcExpr->isInstantiationDependent()), 4627 (DstType->containsUnexpandedParameterPack() || 4628 SrcExpr->containsUnexpandedParameterPack())), 4629 SrcExpr(SrcExpr), BuiltinLoc(BuiltinLoc), RParenLoc(RParenLoc) {} 4630 4631 /// getSrcExpr - Return the Expr to be converted. 4632 Expr *getSrcExpr() const { return cast<Expr>(SrcExpr); } 4633 4634 /// getBuiltinLoc - Return the location of the __builtin_astype token. 4635 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 4636 4637 /// getRParenLoc - Return the location of final right parenthesis. 4638 SourceLocation getRParenLoc() const { return RParenLoc; } 4639 4640 SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; } 4641 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 4642 4643 static bool classof(const Stmt *T) { 4644 return T->getStmtClass() == AsTypeExprClass; 4645 } 4646 4647 // Iterators 4648 child_range children() { return child_range(&SrcExpr, &SrcExpr+1); } 4649 }; 4650 4651 /// PseudoObjectExpr - An expression which accesses a pseudo-object 4652 /// l-value. A pseudo-object is an abstract object, accesses to which 4653 /// are translated to calls. The pseudo-object expression has a 4654 /// syntactic form, which shows how the expression was actually 4655 /// written in the source code, and a semantic form, which is a series 4656 /// of expressions to be executed in order which detail how the 4657 /// operation is actually evaluated. Optionally, one of the semantic 4658 /// forms may also provide a result value for the expression. 4659 /// 4660 /// If any of the semantic-form expressions is an OpaqueValueExpr, 4661 /// that OVE is required to have a source expression, and it is bound 4662 /// to the result of that source expression. Such OVEs may appear 4663 /// only in subsequent semantic-form expressions and as 4664 /// sub-expressions of the syntactic form. 4665 /// 4666 /// PseudoObjectExpr should be used only when an operation can be 4667 /// usefully described in terms of fairly simple rewrite rules on 4668 /// objects and functions that are meant to be used by end-developers. 4669 /// For example, under the Itanium ABI, dynamic casts are implemented 4670 /// as a call to a runtime function called __dynamic_cast; using this 4671 /// class to describe that would be inappropriate because that call is 4672 /// not really part of the user-visible semantics, and instead the 4673 /// cast is properly reflected in the AST and IR-generation has been 4674 /// taught to generate the call as necessary. In contrast, an 4675 /// Objective-C property access is semantically defined to be 4676 /// equivalent to a particular message send, and this is very much 4677 /// part of the user model. The name of this class encourages this 4678 /// modelling design. 4679 class PseudoObjectExpr final 4680 : public Expr, 4681 private llvm::TrailingObjects<PseudoObjectExpr, Expr *> { 4682 // PseudoObjectExprBits.NumSubExprs - The number of sub-expressions. 4683 // Always at least two, because the first sub-expression is the 4684 // syntactic form. 4685 4686 // PseudoObjectExprBits.ResultIndex - The index of the 4687 // sub-expression holding the result. 0 means the result is void, 4688 // which is unambiguous because it's the index of the syntactic 4689 // form. Note that this is therefore 1 higher than the value passed 4690 // in to Create, which is an index within the semantic forms. 4691 // Note also that ASTStmtWriter assumes this encoding. 4692 4693 Expr **getSubExprsBuffer() { return getTrailingObjects<Expr *>(); } 4694 const Expr * const *getSubExprsBuffer() const { 4695 return getTrailingObjects<Expr *>(); 4696 } 4697 4698 PseudoObjectExpr(QualType type, ExprValueKind VK, 4699 Expr *syntactic, ArrayRef<Expr*> semantic, 4700 unsigned resultIndex); 4701 4702 PseudoObjectExpr(EmptyShell shell, unsigned numSemanticExprs); 4703 4704 unsigned getNumSubExprs() const { 4705 return PseudoObjectExprBits.NumSubExprs; 4706 } 4707 4708 public: 4709 /// NoResult - A value for the result index indicating that there is 4710 /// no semantic result. 4711 enum : unsigned { NoResult = ~0U }; 4712 4713 static PseudoObjectExpr *Create(const ASTContext &Context, Expr *syntactic, 4714 ArrayRef<Expr*> semantic, 4715 unsigned resultIndex); 4716 4717 static PseudoObjectExpr *Create(const ASTContext &Context, EmptyShell shell, 4718 unsigned numSemanticExprs); 4719 4720 /// Return the syntactic form of this expression, i.e. the 4721 /// expression it actually looks like. Likely to be expressed in 4722 /// terms of OpaqueValueExprs bound in the semantic form. 4723 Expr *getSyntacticForm() { return getSubExprsBuffer()[0]; } 4724 const Expr *getSyntacticForm() const { return getSubExprsBuffer()[0]; } 4725 4726 /// Return the index of the result-bearing expression into the semantics 4727 /// expressions, or PseudoObjectExpr::NoResult if there is none. 4728 unsigned getResultExprIndex() const { 4729 if (PseudoObjectExprBits.ResultIndex == 0) return NoResult; 4730 return PseudoObjectExprBits.ResultIndex - 1; 4731 } 4732 4733 /// Return the result-bearing expression, or null if there is none. 4734 Expr *getResultExpr() { 4735 if (PseudoObjectExprBits.ResultIndex == 0) 4736 return nullptr; 4737 return getSubExprsBuffer()[PseudoObjectExprBits.ResultIndex]; 4738 } 4739 const Expr *getResultExpr() const { 4740 return const_cast<PseudoObjectExpr*>(this)->getResultExpr(); 4741 } 4742 4743 unsigned getNumSemanticExprs() const { return getNumSubExprs() - 1; } 4744 4745 typedef Expr * const *semantics_iterator; 4746 typedef const Expr * const *const_semantics_iterator; 4747 semantics_iterator semantics_begin() { 4748 return getSubExprsBuffer() + 1; 4749 } 4750 const_semantics_iterator semantics_begin() const { 4751 return getSubExprsBuffer() + 1; 4752 } 4753 semantics_iterator semantics_end() { 4754 return getSubExprsBuffer() + getNumSubExprs(); 4755 } 4756 const_semantics_iterator semantics_end() const { 4757 return getSubExprsBuffer() + getNumSubExprs(); 4758 } 4759 4760 llvm::iterator_range<semantics_iterator> semantics() { 4761 return llvm::make_range(semantics_begin(), semantics_end()); 4762 } 4763 llvm::iterator_range<const_semantics_iterator> semantics() const { 4764 return llvm::make_range(semantics_begin(), semantics_end()); 4765 } 4766 4767 Expr *getSemanticExpr(unsigned index) { 4768 assert(index + 1 < getNumSubExprs()); 4769 return getSubExprsBuffer()[index + 1]; 4770 } 4771 const Expr *getSemanticExpr(unsigned index) const { 4772 return const_cast<PseudoObjectExpr*>(this)->getSemanticExpr(index); 4773 } 4774 4775 SourceLocation getExprLoc() const LLVM_READONLY { 4776 return getSyntacticForm()->getExprLoc(); 4777 } 4778 4779 SourceLocation getLocStart() const LLVM_READONLY { 4780 return getSyntacticForm()->getLocStart(); 4781 } 4782 SourceLocation getLocEnd() const LLVM_READONLY { 4783 return getSyntacticForm()->getLocEnd(); 4784 } 4785 4786 child_range children() { 4787 Stmt **cs = reinterpret_cast<Stmt**>(getSubExprsBuffer()); 4788 return child_range(cs, cs + getNumSubExprs()); 4789 } 4790 4791 static bool classof(const Stmt *T) { 4792 return T->getStmtClass() == PseudoObjectExprClass; 4793 } 4794 4795 friend TrailingObjects; 4796 friend class ASTStmtReader; 4797 }; 4798 4799 /// AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, 4800 /// __atomic_load, __atomic_store, and __atomic_compare_exchange_*, for the 4801 /// similarly-named C++11 instructions, and __c11 variants for <stdatomic.h>. 4802 /// All of these instructions take one primary pointer and at least one memory 4803 /// order. 4804 class AtomicExpr : public Expr { 4805 public: 4806 enum AtomicOp { 4807 #define BUILTIN(ID, TYPE, ATTRS) 4808 #define ATOMIC_BUILTIN(ID, TYPE, ATTRS) AO ## ID, 4809 #include "clang/Basic/Builtins.def" 4810 // Avoid trailing comma 4811 BI_First = 0 4812 }; 4813 4814 private: 4815 enum { PTR, ORDER, VAL1, ORDER_FAIL, VAL2, WEAK, END_EXPR }; 4816 Stmt* SubExprs[END_EXPR]; 4817 unsigned NumSubExprs; 4818 SourceLocation BuiltinLoc, RParenLoc; 4819 AtomicOp Op; 4820 4821 friend class ASTStmtReader; 4822 4823 public: 4824 AtomicExpr(SourceLocation BLoc, ArrayRef<Expr*> args, QualType t, 4825 AtomicOp op, SourceLocation RP); 4826 4827 /// \brief Determine the number of arguments the specified atomic builtin 4828 /// should have. 4829 static unsigned getNumSubExprs(AtomicOp Op); 4830 4831 /// \brief Build an empty AtomicExpr. 4832 explicit AtomicExpr(EmptyShell Empty) : Expr(AtomicExprClass, Empty) { } 4833 4834 Expr *getPtr() const { 4835 return cast<Expr>(SubExprs[PTR]); 4836 } 4837 Expr *getOrder() const { 4838 return cast<Expr>(SubExprs[ORDER]); 4839 } 4840 Expr *getVal1() const { 4841 if (Op == AO__c11_atomic_init) 4842 return cast<Expr>(SubExprs[ORDER]); 4843 assert(NumSubExprs > VAL1); 4844 return cast<Expr>(SubExprs[VAL1]); 4845 } 4846 Expr *getOrderFail() const { 4847 assert(NumSubExprs > ORDER_FAIL); 4848 return cast<Expr>(SubExprs[ORDER_FAIL]); 4849 } 4850 Expr *getVal2() const { 4851 if (Op == AO__atomic_exchange) 4852 return cast<Expr>(SubExprs[ORDER_FAIL]); 4853 assert(NumSubExprs > VAL2); 4854 return cast<Expr>(SubExprs[VAL2]); 4855 } 4856 Expr *getWeak() const { 4857 assert(NumSubExprs > WEAK); 4858 return cast<Expr>(SubExprs[WEAK]); 4859 } 4860 4861 AtomicOp getOp() const { return Op; } 4862 unsigned getNumSubExprs() const { return NumSubExprs; } 4863 4864 Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); } 4865 const Expr * const *getSubExprs() const { 4866 return reinterpret_cast<Expr * const *>(SubExprs); 4867 } 4868 4869 bool isVolatile() const { 4870 return getPtr()->getType()->getPointeeType().isVolatileQualified(); 4871 } 4872 4873 bool isCmpXChg() const { 4874 return getOp() == AO__c11_atomic_compare_exchange_strong || 4875 getOp() == AO__c11_atomic_compare_exchange_weak || 4876 getOp() == AO__atomic_compare_exchange || 4877 getOp() == AO__atomic_compare_exchange_n; 4878 } 4879 4880 SourceLocation getBuiltinLoc() const { return BuiltinLoc; } 4881 SourceLocation getRParenLoc() const { return RParenLoc; } 4882 4883 SourceLocation getLocStart() const LLVM_READONLY { return BuiltinLoc; } 4884 SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; } 4885 4886 static bool classof(const Stmt *T) { 4887 return T->getStmtClass() == AtomicExprClass; 4888 } 4889 4890 // Iterators 4891 child_range children() { 4892 return child_range(SubExprs, SubExprs+NumSubExprs); 4893 } 4894 }; 4895 4896 /// TypoExpr - Internal placeholder for expressions where typo correction 4897 /// still needs to be performed and/or an error diagnostic emitted. 4898 class TypoExpr : public Expr { 4899 public: 4900 TypoExpr(QualType T) 4901 : Expr(TypoExprClass, T, VK_LValue, OK_Ordinary, 4902 /*isTypeDependent*/ true, 4903 /*isValueDependent*/ true, 4904 /*isInstantiationDependent*/ true, 4905 /*containsUnexpandedParameterPack*/ false) { 4906 assert(T->isDependentType() && "TypoExpr given a non-dependent type"); 4907 } 4908 4909 child_range children() { 4910 return child_range(child_iterator(), child_iterator()); 4911 } 4912 SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); } 4913 SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); } 4914 4915 static bool classof(const Stmt *T) { 4916 return T->getStmtClass() == TypoExprClass; 4917 } 4918 4919 }; 4920 } // end namespace clang 4921 4922 #endif // LLVM_CLANG_AST_EXPR_H 4923