1 //===- Stmt.h - Classes for representing statements -------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the Stmt interface and subclasses. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_AST_STMT_H 14 #define LLVM_CLANG_AST_STMT_H 15 16 #include "clang/AST/DeclGroup.h" 17 #include "clang/AST/DependenceFlags.h" 18 #include "clang/AST/StmtIterator.h" 19 #include "clang/Basic/CapturedStmt.h" 20 #include "clang/Basic/IdentifierTable.h" 21 #include "clang/Basic/LLVM.h" 22 #include "clang/Basic/LangOptions.h" 23 #include "clang/Basic/SourceLocation.h" 24 #include "clang/Basic/Specifiers.h" 25 #include "llvm/ADT/APFloat.h" 26 #include "llvm/ADT/ArrayRef.h" 27 #include "llvm/ADT/BitmaskEnum.h" 28 #include "llvm/ADT/PointerIntPair.h" 29 #include "llvm/ADT/StringRef.h" 30 #include "llvm/ADT/iterator.h" 31 #include "llvm/ADT/iterator_range.h" 32 #include "llvm/Support/Casting.h" 33 #include "llvm/Support/Compiler.h" 34 #include "llvm/Support/ErrorHandling.h" 35 #include <algorithm> 36 #include <cassert> 37 #include <cstddef> 38 #include <iterator> 39 #include <optional> 40 #include <string> 41 42 namespace llvm { 43 44 class FoldingSetNodeID; 45 46 } // namespace llvm 47 48 namespace clang { 49 50 class ASTContext; 51 class Attr; 52 class CapturedDecl; 53 class Decl; 54 class Expr; 55 class AddrLabelExpr; 56 class LabelDecl; 57 class ODRHash; 58 class PrinterHelper; 59 struct PrintingPolicy; 60 class RecordDecl; 61 class SourceManager; 62 class StringLiteral; 63 class Token; 64 class VarDecl; 65 66 //===----------------------------------------------------------------------===// 67 // AST classes for statements. 68 //===----------------------------------------------------------------------===// 69 70 /// Stmt - This represents one statement. 71 /// 72 class alignas(void *) Stmt { 73 public: 74 enum StmtClass { 75 NoStmtClass = 0, 76 #define STMT(CLASS, PARENT) CLASS##Class, 77 #define STMT_RANGE(BASE, FIRST, LAST) \ 78 first##BASE##Constant=FIRST##Class, last##BASE##Constant=LAST##Class, 79 #define LAST_STMT_RANGE(BASE, FIRST, LAST) \ 80 first##BASE##Constant=FIRST##Class, last##BASE##Constant=LAST##Class 81 #define ABSTRACT_STMT(STMT) 82 #include "clang/AST/StmtNodes.inc" 83 }; 84 85 // Make vanilla 'new' and 'delete' illegal for Stmts. 86 protected: 87 friend class ASTStmtReader; 88 friend class ASTStmtWriter; 89 90 void *operator new(size_t bytes) noexcept { 91 llvm_unreachable("Stmts cannot be allocated with regular 'new'."); 92 } 93 94 void operator delete(void *data) noexcept { 95 llvm_unreachable("Stmts cannot be released with regular 'delete'."); 96 } 97 98 //===--- Statement bitfields classes ---===// 99 100 class StmtBitfields { 101 friend class ASTStmtReader; 102 friend class ASTStmtWriter; 103 friend class Stmt; 104 105 /// The statement class. 106 unsigned sClass : 8; 107 }; 108 enum { NumStmtBits = 8 }; 109 110 class NullStmtBitfields { 111 friend class ASTStmtReader; 112 friend class ASTStmtWriter; 113 friend class NullStmt; 114 115 unsigned : NumStmtBits; 116 117 /// True if the null statement was preceded by an empty macro, e.g: 118 /// @code 119 /// #define CALL(x) 120 /// CALL(0); 121 /// @endcode 122 unsigned HasLeadingEmptyMacro : 1; 123 124 /// The location of the semi-colon. 125 SourceLocation SemiLoc; 126 }; 127 128 class CompoundStmtBitfields { 129 friend class ASTStmtReader; 130 friend class CompoundStmt; 131 132 unsigned : NumStmtBits; 133 134 /// True if the compound statement has one or more pragmas that set some 135 /// floating-point features. 136 unsigned HasFPFeatures : 1; 137 138 unsigned NumStmts; 139 }; 140 141 class LabelStmtBitfields { 142 friend class LabelStmt; 143 144 unsigned : NumStmtBits; 145 146 SourceLocation IdentLoc; 147 }; 148 149 class AttributedStmtBitfields { 150 friend class ASTStmtReader; 151 friend class AttributedStmt; 152 153 unsigned : NumStmtBits; 154 155 /// Number of attributes. 156 unsigned NumAttrs : 32 - NumStmtBits; 157 158 /// The location of the attribute. 159 SourceLocation AttrLoc; 160 }; 161 162 class IfStmtBitfields { 163 friend class ASTStmtReader; 164 friend class IfStmt; 165 166 unsigned : NumStmtBits; 167 168 /// Whether this is a constexpr if, or a consteval if, or neither. 169 unsigned Kind : 3; 170 171 /// True if this if statement has storage for an else statement. 172 unsigned HasElse : 1; 173 174 /// True if this if statement has storage for a variable declaration. 175 unsigned HasVar : 1; 176 177 /// True if this if statement has storage for an init statement. 178 unsigned HasInit : 1; 179 180 /// The location of the "if". 181 SourceLocation IfLoc; 182 }; 183 184 class SwitchStmtBitfields { 185 friend class SwitchStmt; 186 187 unsigned : NumStmtBits; 188 189 /// True if the SwitchStmt has storage for an init statement. 190 unsigned HasInit : 1; 191 192 /// True if the SwitchStmt has storage for a condition variable. 193 unsigned HasVar : 1; 194 195 /// If the SwitchStmt is a switch on an enum value, records whether all 196 /// the enum values were covered by CaseStmts. The coverage information 197 /// value is meant to be a hint for possible clients. 198 unsigned AllEnumCasesCovered : 1; 199 200 /// The location of the "switch". 201 SourceLocation SwitchLoc; 202 }; 203 204 class WhileStmtBitfields { 205 friend class ASTStmtReader; 206 friend class WhileStmt; 207 208 unsigned : NumStmtBits; 209 210 /// True if the WhileStmt has storage for a condition variable. 211 unsigned HasVar : 1; 212 213 /// The location of the "while". 214 SourceLocation WhileLoc; 215 }; 216 217 class DoStmtBitfields { 218 friend class DoStmt; 219 220 unsigned : NumStmtBits; 221 222 /// The location of the "do". 223 SourceLocation DoLoc; 224 }; 225 226 class ForStmtBitfields { 227 friend class ForStmt; 228 229 unsigned : NumStmtBits; 230 231 /// The location of the "for". 232 SourceLocation ForLoc; 233 }; 234 235 class GotoStmtBitfields { 236 friend class GotoStmt; 237 friend class IndirectGotoStmt; 238 239 unsigned : NumStmtBits; 240 241 /// The location of the "goto". 242 SourceLocation GotoLoc; 243 }; 244 245 class ContinueStmtBitfields { 246 friend class ContinueStmt; 247 248 unsigned : NumStmtBits; 249 250 /// The location of the "continue". 251 SourceLocation ContinueLoc; 252 }; 253 254 class BreakStmtBitfields { 255 friend class BreakStmt; 256 257 unsigned : NumStmtBits; 258 259 /// The location of the "break". 260 SourceLocation BreakLoc; 261 }; 262 263 class ReturnStmtBitfields { 264 friend class ReturnStmt; 265 266 unsigned : NumStmtBits; 267 268 /// True if this ReturnStmt has storage for an NRVO candidate. 269 unsigned HasNRVOCandidate : 1; 270 271 /// The location of the "return". 272 SourceLocation RetLoc; 273 }; 274 275 class SwitchCaseBitfields { 276 friend class SwitchCase; 277 friend class CaseStmt; 278 279 unsigned : NumStmtBits; 280 281 /// Used by CaseStmt to store whether it is a case statement 282 /// of the form case LHS ... RHS (a GNU extension). 283 unsigned CaseStmtIsGNURange : 1; 284 285 /// The location of the "case" or "default" keyword. 286 SourceLocation KeywordLoc; 287 }; 288 289 //===--- Expression bitfields classes ---===// 290 291 class ExprBitfields { 292 friend class ASTStmtReader; // deserialization 293 friend class AtomicExpr; // ctor 294 friend class BlockDeclRefExpr; // ctor 295 friend class CallExpr; // ctor 296 friend class CXXConstructExpr; // ctor 297 friend class CXXDependentScopeMemberExpr; // ctor 298 friend class CXXNewExpr; // ctor 299 friend class CXXUnresolvedConstructExpr; // ctor 300 friend class DeclRefExpr; // computeDependence 301 friend class DependentScopeDeclRefExpr; // ctor 302 friend class DesignatedInitExpr; // ctor 303 friend class Expr; 304 friend class InitListExpr; // ctor 305 friend class ObjCArrayLiteral; // ctor 306 friend class ObjCDictionaryLiteral; // ctor 307 friend class ObjCMessageExpr; // ctor 308 friend class OffsetOfExpr; // ctor 309 friend class OpaqueValueExpr; // ctor 310 friend class OverloadExpr; // ctor 311 friend class ParenListExpr; // ctor 312 friend class PseudoObjectExpr; // ctor 313 friend class ShuffleVectorExpr; // ctor 314 315 unsigned : NumStmtBits; 316 317 unsigned ValueKind : 2; 318 unsigned ObjectKind : 3; 319 unsigned /*ExprDependence*/ Dependent : llvm::BitWidth<ExprDependence>; 320 }; 321 enum { NumExprBits = NumStmtBits + 5 + llvm::BitWidth<ExprDependence> }; 322 323 class ConstantExprBitfields { 324 friend class ASTStmtReader; 325 friend class ASTStmtWriter; 326 friend class ConstantExpr; 327 328 unsigned : NumExprBits; 329 330 /// The kind of result that is tail-allocated. 331 unsigned ResultKind : 2; 332 333 /// The kind of Result as defined by APValue::Kind. 334 unsigned APValueKind : 4; 335 336 /// When ResultKind == RSK_Int64, true if the tail-allocated integer is 337 /// unsigned. 338 unsigned IsUnsigned : 1; 339 340 /// When ResultKind == RSK_Int64. the BitWidth of the tail-allocated 341 /// integer. 7 bits because it is the minimal number of bits to represent a 342 /// value from 0 to 64 (the size of the tail-allocated integer). 343 unsigned BitWidth : 7; 344 345 /// When ResultKind == RSK_APValue, true if the ASTContext will cleanup the 346 /// tail-allocated APValue. 347 unsigned HasCleanup : 1; 348 349 /// True if this ConstantExpr was created for immediate invocation. 350 unsigned IsImmediateInvocation : 1; 351 }; 352 353 class PredefinedExprBitfields { 354 friend class ASTStmtReader; 355 friend class PredefinedExpr; 356 357 unsigned : NumExprBits; 358 359 /// The kind of this PredefinedExpr. One of the enumeration values 360 /// in PredefinedExpr::IdentKind. 361 unsigned Kind : 4; 362 363 /// True if this PredefinedExpr has a trailing "StringLiteral *" 364 /// for the predefined identifier. 365 unsigned HasFunctionName : 1; 366 367 /// True if this PredefinedExpr should be treated as a StringLiteral (for 368 /// MSVC compatibility). 369 unsigned IsTransparent : 1; 370 371 /// The location of this PredefinedExpr. 372 SourceLocation Loc; 373 }; 374 375 class DeclRefExprBitfields { 376 friend class ASTStmtReader; // deserialization 377 friend class DeclRefExpr; 378 379 unsigned : NumExprBits; 380 381 unsigned HasQualifier : 1; 382 unsigned HasTemplateKWAndArgsInfo : 1; 383 unsigned HasFoundDecl : 1; 384 unsigned HadMultipleCandidates : 1; 385 unsigned RefersToEnclosingVariableOrCapture : 1; 386 unsigned NonOdrUseReason : 2; 387 unsigned IsImmediateEscalating : 1; 388 389 /// The location of the declaration name itself. 390 SourceLocation Loc; 391 }; 392 393 394 class FloatingLiteralBitfields { 395 friend class FloatingLiteral; 396 397 unsigned : NumExprBits; 398 399 static_assert( 400 llvm::APFloat::S_MaxSemantics < 16, 401 "Too many Semantics enum values to fit in bitfield of size 4"); 402 unsigned Semantics : 4; // Provides semantics for APFloat construction 403 unsigned IsExact : 1; 404 }; 405 406 class StringLiteralBitfields { 407 friend class ASTStmtReader; 408 friend class StringLiteral; 409 410 unsigned : NumExprBits; 411 412 /// The kind of this string literal. 413 /// One of the enumeration values of StringLiteral::StringKind. 414 unsigned Kind : 3; 415 416 /// The width of a single character in bytes. Only values of 1, 2, 417 /// and 4 bytes are supported. StringLiteral::mapCharByteWidth maps 418 /// the target + string kind to the appropriate CharByteWidth. 419 unsigned CharByteWidth : 3; 420 421 unsigned IsPascal : 1; 422 423 /// The number of concatenated token this string is made of. 424 /// This is the number of trailing SourceLocation. 425 unsigned NumConcatenated; 426 }; 427 428 class CharacterLiteralBitfields { 429 friend class CharacterLiteral; 430 431 unsigned : NumExprBits; 432 433 unsigned Kind : 3; 434 }; 435 436 class UnaryOperatorBitfields { 437 friend class UnaryOperator; 438 439 unsigned : NumExprBits; 440 441 unsigned Opc : 5; 442 unsigned CanOverflow : 1; 443 // 444 /// This is only meaningful for operations on floating point 445 /// types when additional values need to be in trailing storage. 446 /// It is 0 otherwise. 447 unsigned HasFPFeatures : 1; 448 449 SourceLocation Loc; 450 }; 451 452 class UnaryExprOrTypeTraitExprBitfields { 453 friend class UnaryExprOrTypeTraitExpr; 454 455 unsigned : NumExprBits; 456 457 unsigned Kind : 3; 458 unsigned IsType : 1; // true if operand is a type, false if an expression. 459 }; 460 461 class ArrayOrMatrixSubscriptExprBitfields { 462 friend class ArraySubscriptExpr; 463 friend class MatrixSubscriptExpr; 464 465 unsigned : NumExprBits; 466 467 SourceLocation RBracketLoc; 468 }; 469 470 class CallExprBitfields { 471 friend class CallExpr; 472 473 unsigned : NumExprBits; 474 475 unsigned NumPreArgs : 1; 476 477 /// True if the callee of the call expression was found using ADL. 478 unsigned UsesADL : 1; 479 480 /// True if the call expression has some floating-point features. 481 unsigned HasFPFeatures : 1; 482 483 /// Padding used to align OffsetToTrailingObjects to a byte multiple. 484 unsigned : 24 - 3 - NumExprBits; 485 486 /// The offset in bytes from the this pointer to the start of the 487 /// trailing objects belonging to CallExpr. Intentionally byte sized 488 /// for faster access. 489 unsigned OffsetToTrailingObjects : 8; 490 }; 491 enum { NumCallExprBits = 32 }; 492 493 class MemberExprBitfields { 494 friend class ASTStmtReader; 495 friend class MemberExpr; 496 497 unsigned : NumExprBits; 498 499 /// IsArrow - True if this is "X->F", false if this is "X.F". 500 unsigned IsArrow : 1; 501 502 /// True if this member expression used a nested-name-specifier to 503 /// refer to the member, e.g., "x->Base::f", or found its member via 504 /// a using declaration. When true, a MemberExprNameQualifier 505 /// structure is allocated immediately after the MemberExpr. 506 unsigned HasQualifierOrFoundDecl : 1; 507 508 /// True if this member expression specified a template keyword 509 /// and/or a template argument list explicitly, e.g., x->f<int>, 510 /// x->template f, x->template f<int>. 511 /// When true, an ASTTemplateKWAndArgsInfo structure and its 512 /// TemplateArguments (if any) are present. 513 unsigned HasTemplateKWAndArgsInfo : 1; 514 515 /// True if this member expression refers to a method that 516 /// was resolved from an overloaded set having size greater than 1. 517 unsigned HadMultipleCandidates : 1; 518 519 /// Value of type NonOdrUseReason indicating why this MemberExpr does 520 /// not constitute an odr-use of the named declaration. Meaningful only 521 /// when naming a static member. 522 unsigned NonOdrUseReason : 2; 523 524 /// This is the location of the -> or . in the expression. 525 SourceLocation OperatorLoc; 526 }; 527 528 class CastExprBitfields { 529 friend class CastExpr; 530 friend class ImplicitCastExpr; 531 532 unsigned : NumExprBits; 533 534 unsigned Kind : 7; 535 unsigned PartOfExplicitCast : 1; // Only set for ImplicitCastExpr. 536 537 /// True if the call expression has some floating-point features. 538 unsigned HasFPFeatures : 1; 539 540 /// The number of CXXBaseSpecifiers in the cast. 14 bits would be enough 541 /// here. ([implimits] Direct and indirect base classes [16384]). 542 unsigned BasePathSize; 543 }; 544 545 class BinaryOperatorBitfields { 546 friend class BinaryOperator; 547 548 unsigned : NumExprBits; 549 550 unsigned Opc : 6; 551 552 /// This is only meaningful for operations on floating point 553 /// types when additional values need to be in trailing storage. 554 /// It is 0 otherwise. 555 unsigned HasFPFeatures : 1; 556 557 SourceLocation OpLoc; 558 }; 559 560 class InitListExprBitfields { 561 friend class InitListExpr; 562 563 unsigned : NumExprBits; 564 565 /// Whether this initializer list originally had a GNU array-range 566 /// designator in it. This is a temporary marker used by CodeGen. 567 unsigned HadArrayRangeDesignator : 1; 568 }; 569 570 class ParenListExprBitfields { 571 friend class ASTStmtReader; 572 friend class ParenListExpr; 573 574 unsigned : NumExprBits; 575 576 /// The number of expressions in the paren list. 577 unsigned NumExprs; 578 }; 579 580 class GenericSelectionExprBitfields { 581 friend class ASTStmtReader; 582 friend class GenericSelectionExpr; 583 584 unsigned : NumExprBits; 585 586 /// The location of the "_Generic". 587 SourceLocation GenericLoc; 588 }; 589 590 class PseudoObjectExprBitfields { 591 friend class ASTStmtReader; // deserialization 592 friend class PseudoObjectExpr; 593 594 unsigned : NumExprBits; 595 596 unsigned NumSubExprs : 16; 597 unsigned ResultIndex : 16; 598 }; 599 600 class SourceLocExprBitfields { 601 friend class ASTStmtReader; 602 friend class SourceLocExpr; 603 604 unsigned : NumExprBits; 605 606 /// The kind of source location builtin represented by the SourceLocExpr. 607 /// Ex. __builtin_LINE, __builtin_FUNCTION, etc. 608 unsigned Kind : 3; 609 }; 610 611 class StmtExprBitfields { 612 friend class ASTStmtReader; 613 friend class StmtExpr; 614 615 unsigned : NumExprBits; 616 617 /// The number of levels of template parameters enclosing this statement 618 /// expression. Used to determine if a statement expression remains 619 /// dependent after instantiation. 620 unsigned TemplateDepth; 621 }; 622 623 //===--- C++ Expression bitfields classes ---===// 624 625 class CXXOperatorCallExprBitfields { 626 friend class ASTStmtReader; 627 friend class CXXOperatorCallExpr; 628 629 unsigned : NumCallExprBits; 630 631 /// The kind of this overloaded operator. One of the enumerator 632 /// value of OverloadedOperatorKind. 633 unsigned OperatorKind : 6; 634 }; 635 636 class CXXRewrittenBinaryOperatorBitfields { 637 friend class ASTStmtReader; 638 friend class CXXRewrittenBinaryOperator; 639 640 unsigned : NumCallExprBits; 641 642 unsigned IsReversed : 1; 643 }; 644 645 class CXXBoolLiteralExprBitfields { 646 friend class CXXBoolLiteralExpr; 647 648 unsigned : NumExprBits; 649 650 /// The value of the boolean literal. 651 unsigned Value : 1; 652 653 /// The location of the boolean literal. 654 SourceLocation Loc; 655 }; 656 657 class CXXNullPtrLiteralExprBitfields { 658 friend class CXXNullPtrLiteralExpr; 659 660 unsigned : NumExprBits; 661 662 /// The location of the null pointer literal. 663 SourceLocation Loc; 664 }; 665 666 class CXXThisExprBitfields { 667 friend class CXXThisExpr; 668 669 unsigned : NumExprBits; 670 671 /// Whether this is an implicit "this". 672 unsigned IsImplicit : 1; 673 674 /// The location of the "this". 675 SourceLocation Loc; 676 }; 677 678 class CXXThrowExprBitfields { 679 friend class ASTStmtReader; 680 friend class CXXThrowExpr; 681 682 unsigned : NumExprBits; 683 684 /// Whether the thrown variable (if any) is in scope. 685 unsigned IsThrownVariableInScope : 1; 686 687 /// The location of the "throw". 688 SourceLocation ThrowLoc; 689 }; 690 691 class CXXDefaultArgExprBitfields { 692 friend class ASTStmtReader; 693 friend class CXXDefaultArgExpr; 694 695 unsigned : NumExprBits; 696 697 /// Whether this CXXDefaultArgExpr rewrote its argument and stores a copy. 698 unsigned HasRewrittenInit : 1; 699 700 /// The location where the default argument expression was used. 701 SourceLocation Loc; 702 }; 703 704 class CXXDefaultInitExprBitfields { 705 friend class ASTStmtReader; 706 friend class CXXDefaultInitExpr; 707 708 unsigned : NumExprBits; 709 710 /// Whether this CXXDefaultInitExprBitfields rewrote its argument and stores 711 /// a copy. 712 unsigned HasRewrittenInit : 1; 713 714 /// The location where the default initializer expression was used. 715 SourceLocation Loc; 716 }; 717 718 class CXXScalarValueInitExprBitfields { 719 friend class ASTStmtReader; 720 friend class CXXScalarValueInitExpr; 721 722 unsigned : NumExprBits; 723 724 SourceLocation RParenLoc; 725 }; 726 727 class CXXNewExprBitfields { 728 friend class ASTStmtReader; 729 friend class ASTStmtWriter; 730 friend class CXXNewExpr; 731 732 unsigned : NumExprBits; 733 734 /// Was the usage ::new, i.e. is the global new to be used? 735 unsigned IsGlobalNew : 1; 736 737 /// Do we allocate an array? If so, the first trailing "Stmt *" is the 738 /// size expression. 739 unsigned IsArray : 1; 740 741 /// Should the alignment be passed to the allocation function? 742 unsigned ShouldPassAlignment : 1; 743 744 /// If this is an array allocation, does the usual deallocation 745 /// function for the allocated type want to know the allocated size? 746 unsigned UsualArrayDeleteWantsSize : 1; 747 748 /// What kind of initializer do we have? Could be none, parens, or braces. 749 /// In storage, we distinguish between "none, and no initializer expr", and 750 /// "none, but an implicit initializer expr". 751 unsigned StoredInitializationStyle : 2; 752 753 /// True if the allocated type was expressed as a parenthesized type-id. 754 unsigned IsParenTypeId : 1; 755 756 /// The number of placement new arguments. 757 unsigned NumPlacementArgs; 758 }; 759 760 class CXXDeleteExprBitfields { 761 friend class ASTStmtReader; 762 friend class CXXDeleteExpr; 763 764 unsigned : NumExprBits; 765 766 /// Is this a forced global delete, i.e. "::delete"? 767 unsigned GlobalDelete : 1; 768 769 /// Is this the array form of delete, i.e. "delete[]"? 770 unsigned ArrayForm : 1; 771 772 /// ArrayFormAsWritten can be different from ArrayForm if 'delete' is 773 /// applied to pointer-to-array type (ArrayFormAsWritten will be false 774 /// while ArrayForm will be true). 775 unsigned ArrayFormAsWritten : 1; 776 777 /// Does the usual deallocation function for the element type require 778 /// a size_t argument? 779 unsigned UsualArrayDeleteWantsSize : 1; 780 781 /// Location of the expression. 782 SourceLocation Loc; 783 }; 784 785 class TypeTraitExprBitfields { 786 friend class ASTStmtReader; 787 friend class ASTStmtWriter; 788 friend class TypeTraitExpr; 789 790 unsigned : NumExprBits; 791 792 /// The kind of type trait, which is a value of a TypeTrait enumerator. 793 unsigned Kind : 8; 794 795 /// If this expression is not value-dependent, this indicates whether 796 /// the trait evaluated true or false. 797 unsigned Value : 1; 798 799 /// The number of arguments to this type trait. According to [implimits] 800 /// 8 bits would be enough, but we require (and test for) at least 16 bits 801 /// to mirror FunctionType. 802 unsigned NumArgs; 803 }; 804 805 class DependentScopeDeclRefExprBitfields { 806 friend class ASTStmtReader; 807 friend class ASTStmtWriter; 808 friend class DependentScopeDeclRefExpr; 809 810 unsigned : NumExprBits; 811 812 /// Whether the name includes info for explicit template 813 /// keyword and arguments. 814 unsigned HasTemplateKWAndArgsInfo : 1; 815 }; 816 817 class CXXConstructExprBitfields { 818 friend class ASTStmtReader; 819 friend class CXXConstructExpr; 820 821 unsigned : NumExprBits; 822 823 unsigned Elidable : 1; 824 unsigned HadMultipleCandidates : 1; 825 unsigned ListInitialization : 1; 826 unsigned StdInitListInitialization : 1; 827 unsigned ZeroInitialization : 1; 828 unsigned ConstructionKind : 3; 829 unsigned IsImmediateEscalating : 1; 830 831 SourceLocation Loc; 832 }; 833 834 class ExprWithCleanupsBitfields { 835 friend class ASTStmtReader; // deserialization 836 friend class ExprWithCleanups; 837 838 unsigned : NumExprBits; 839 840 // When false, it must not have side effects. 841 unsigned CleanupsHaveSideEffects : 1; 842 843 unsigned NumObjects : 32 - 1 - NumExprBits; 844 }; 845 846 class CXXUnresolvedConstructExprBitfields { 847 friend class ASTStmtReader; 848 friend class CXXUnresolvedConstructExpr; 849 850 unsigned : NumExprBits; 851 852 /// The number of arguments used to construct the type. 853 unsigned NumArgs; 854 }; 855 856 class CXXDependentScopeMemberExprBitfields { 857 friend class ASTStmtReader; 858 friend class CXXDependentScopeMemberExpr; 859 860 unsigned : NumExprBits; 861 862 /// Whether this member expression used the '->' operator or 863 /// the '.' operator. 864 unsigned IsArrow : 1; 865 866 /// Whether this member expression has info for explicit template 867 /// keyword and arguments. 868 unsigned HasTemplateKWAndArgsInfo : 1; 869 870 /// See getFirstQualifierFoundInScope() and the comment listing 871 /// the trailing objects. 872 unsigned HasFirstQualifierFoundInScope : 1; 873 874 /// The location of the '->' or '.' operator. 875 SourceLocation OperatorLoc; 876 }; 877 878 class OverloadExprBitfields { 879 friend class ASTStmtReader; 880 friend class OverloadExpr; 881 882 unsigned : NumExprBits; 883 884 /// Whether the name includes info for explicit template 885 /// keyword and arguments. 886 unsigned HasTemplateKWAndArgsInfo : 1; 887 888 /// Padding used by the derived classes to store various bits. If you 889 /// need to add some data here, shrink this padding and add your data 890 /// above. NumOverloadExprBits also needs to be updated. 891 unsigned : 32 - NumExprBits - 1; 892 893 /// The number of results. 894 unsigned NumResults; 895 }; 896 enum { NumOverloadExprBits = NumExprBits + 1 }; 897 898 class UnresolvedLookupExprBitfields { 899 friend class ASTStmtReader; 900 friend class UnresolvedLookupExpr; 901 902 unsigned : NumOverloadExprBits; 903 904 /// True if these lookup results should be extended by 905 /// argument-dependent lookup if this is the operand of a function call. 906 unsigned RequiresADL : 1; 907 908 /// True if these lookup results are overloaded. This is pretty trivially 909 /// rederivable if we urgently need to kill this field. 910 unsigned Overloaded : 1; 911 }; 912 static_assert(sizeof(UnresolvedLookupExprBitfields) <= 4, 913 "UnresolvedLookupExprBitfields must be <= than 4 bytes to" 914 "avoid trashing OverloadExprBitfields::NumResults!"); 915 916 class UnresolvedMemberExprBitfields { 917 friend class ASTStmtReader; 918 friend class UnresolvedMemberExpr; 919 920 unsigned : NumOverloadExprBits; 921 922 /// Whether this member expression used the '->' operator or 923 /// the '.' operator. 924 unsigned IsArrow : 1; 925 926 /// Whether the lookup results contain an unresolved using declaration. 927 unsigned HasUnresolvedUsing : 1; 928 }; 929 static_assert(sizeof(UnresolvedMemberExprBitfields) <= 4, 930 "UnresolvedMemberExprBitfields must be <= than 4 bytes to" 931 "avoid trashing OverloadExprBitfields::NumResults!"); 932 933 class CXXNoexceptExprBitfields { 934 friend class ASTStmtReader; 935 friend class CXXNoexceptExpr; 936 937 unsigned : NumExprBits; 938 939 unsigned Value : 1; 940 }; 941 942 class SubstNonTypeTemplateParmExprBitfields { 943 friend class ASTStmtReader; 944 friend class SubstNonTypeTemplateParmExpr; 945 946 unsigned : NumExprBits; 947 948 /// The location of the non-type template parameter reference. 949 SourceLocation NameLoc; 950 }; 951 952 class LambdaExprBitfields { 953 friend class ASTStmtReader; 954 friend class ASTStmtWriter; 955 friend class LambdaExpr; 956 957 unsigned : NumExprBits; 958 959 /// The default capture kind, which is a value of type 960 /// LambdaCaptureDefault. 961 unsigned CaptureDefault : 2; 962 963 /// Whether this lambda had an explicit parameter list vs. an 964 /// implicit (and empty) parameter list. 965 unsigned ExplicitParams : 1; 966 967 /// Whether this lambda had the result type explicitly specified. 968 unsigned ExplicitResultType : 1; 969 970 /// The number of captures. 971 unsigned NumCaptures : 16; 972 }; 973 974 class RequiresExprBitfields { 975 friend class ASTStmtReader; 976 friend class ASTStmtWriter; 977 friend class RequiresExpr; 978 979 unsigned : NumExprBits; 980 981 unsigned IsSatisfied : 1; 982 SourceLocation RequiresKWLoc; 983 }; 984 985 //===--- C++ Coroutines bitfields classes ---===// 986 987 class CoawaitExprBitfields { 988 friend class CoawaitExpr; 989 990 unsigned : NumExprBits; 991 992 unsigned IsImplicit : 1; 993 }; 994 995 //===--- Obj-C Expression bitfields classes ---===// 996 997 class ObjCIndirectCopyRestoreExprBitfields { 998 friend class ObjCIndirectCopyRestoreExpr; 999 1000 unsigned : NumExprBits; 1001 1002 unsigned ShouldCopy : 1; 1003 }; 1004 1005 //===--- Clang Extensions bitfields classes ---===// 1006 1007 class OpaqueValueExprBitfields { 1008 friend class ASTStmtReader; 1009 friend class OpaqueValueExpr; 1010 1011 unsigned : NumExprBits; 1012 1013 /// The OVE is a unique semantic reference to its source expression if this 1014 /// bit is set to true. 1015 unsigned IsUnique : 1; 1016 1017 SourceLocation Loc; 1018 }; 1019 1020 union { 1021 // Same order as in StmtNodes.td. 1022 // Statements 1023 StmtBitfields StmtBits; 1024 NullStmtBitfields NullStmtBits; 1025 CompoundStmtBitfields CompoundStmtBits; 1026 LabelStmtBitfields LabelStmtBits; 1027 AttributedStmtBitfields AttributedStmtBits; 1028 IfStmtBitfields IfStmtBits; 1029 SwitchStmtBitfields SwitchStmtBits; 1030 WhileStmtBitfields WhileStmtBits; 1031 DoStmtBitfields DoStmtBits; 1032 ForStmtBitfields ForStmtBits; 1033 GotoStmtBitfields GotoStmtBits; 1034 ContinueStmtBitfields ContinueStmtBits; 1035 BreakStmtBitfields BreakStmtBits; 1036 ReturnStmtBitfields ReturnStmtBits; 1037 SwitchCaseBitfields SwitchCaseBits; 1038 1039 // Expressions 1040 ExprBitfields ExprBits; 1041 ConstantExprBitfields ConstantExprBits; 1042 PredefinedExprBitfields PredefinedExprBits; 1043 DeclRefExprBitfields DeclRefExprBits; 1044 FloatingLiteralBitfields FloatingLiteralBits; 1045 StringLiteralBitfields StringLiteralBits; 1046 CharacterLiteralBitfields CharacterLiteralBits; 1047 UnaryOperatorBitfields UnaryOperatorBits; 1048 UnaryExprOrTypeTraitExprBitfields UnaryExprOrTypeTraitExprBits; 1049 ArrayOrMatrixSubscriptExprBitfields ArrayOrMatrixSubscriptExprBits; 1050 CallExprBitfields CallExprBits; 1051 MemberExprBitfields MemberExprBits; 1052 CastExprBitfields CastExprBits; 1053 BinaryOperatorBitfields BinaryOperatorBits; 1054 InitListExprBitfields InitListExprBits; 1055 ParenListExprBitfields ParenListExprBits; 1056 GenericSelectionExprBitfields GenericSelectionExprBits; 1057 PseudoObjectExprBitfields PseudoObjectExprBits; 1058 SourceLocExprBitfields SourceLocExprBits; 1059 1060 // GNU Extensions. 1061 StmtExprBitfields StmtExprBits; 1062 1063 // C++ Expressions 1064 CXXOperatorCallExprBitfields CXXOperatorCallExprBits; 1065 CXXRewrittenBinaryOperatorBitfields CXXRewrittenBinaryOperatorBits; 1066 CXXBoolLiteralExprBitfields CXXBoolLiteralExprBits; 1067 CXXNullPtrLiteralExprBitfields CXXNullPtrLiteralExprBits; 1068 CXXThisExprBitfields CXXThisExprBits; 1069 CXXThrowExprBitfields CXXThrowExprBits; 1070 CXXDefaultArgExprBitfields CXXDefaultArgExprBits; 1071 CXXDefaultInitExprBitfields CXXDefaultInitExprBits; 1072 CXXScalarValueInitExprBitfields CXXScalarValueInitExprBits; 1073 CXXNewExprBitfields CXXNewExprBits; 1074 CXXDeleteExprBitfields CXXDeleteExprBits; 1075 TypeTraitExprBitfields TypeTraitExprBits; 1076 DependentScopeDeclRefExprBitfields DependentScopeDeclRefExprBits; 1077 CXXConstructExprBitfields CXXConstructExprBits; 1078 ExprWithCleanupsBitfields ExprWithCleanupsBits; 1079 CXXUnresolvedConstructExprBitfields CXXUnresolvedConstructExprBits; 1080 CXXDependentScopeMemberExprBitfields CXXDependentScopeMemberExprBits; 1081 OverloadExprBitfields OverloadExprBits; 1082 UnresolvedLookupExprBitfields UnresolvedLookupExprBits; 1083 UnresolvedMemberExprBitfields UnresolvedMemberExprBits; 1084 CXXNoexceptExprBitfields CXXNoexceptExprBits; 1085 SubstNonTypeTemplateParmExprBitfields SubstNonTypeTemplateParmExprBits; 1086 LambdaExprBitfields LambdaExprBits; 1087 RequiresExprBitfields RequiresExprBits; 1088 1089 // C++ Coroutines expressions 1090 CoawaitExprBitfields CoawaitBits; 1091 1092 // Obj-C Expressions 1093 ObjCIndirectCopyRestoreExprBitfields ObjCIndirectCopyRestoreExprBits; 1094 1095 // Clang Extensions 1096 OpaqueValueExprBitfields OpaqueValueExprBits; 1097 }; 1098 1099 public: 1100 // Only allow allocation of Stmts using the allocator in ASTContext 1101 // or by doing a placement new. 1102 void* operator new(size_t bytes, const ASTContext& C, 1103 unsigned alignment = 8); 1104 1105 void* operator new(size_t bytes, const ASTContext* C, 1106 unsigned alignment = 8) { 1107 return operator new(bytes, *C, alignment); 1108 } 1109 1110 void *operator new(size_t bytes, void *mem) noexcept { return mem; } 1111 1112 void operator delete(void *, const ASTContext &, unsigned) noexcept {} 1113 void operator delete(void *, const ASTContext *, unsigned) noexcept {} 1114 void operator delete(void *, size_t) noexcept {} 1115 void operator delete(void *, void *) noexcept {} 1116 1117 public: 1118 /// A placeholder type used to construct an empty shell of a 1119 /// type, that will be filled in later (e.g., by some 1120 /// de-serialization). 1121 struct EmptyShell {}; 1122 1123 /// The likelihood of a branch being taken. 1124 enum Likelihood { 1125 LH_Unlikely = -1, ///< Branch has the [[unlikely]] attribute. 1126 LH_None, ///< No attribute set or branches of the IfStmt have 1127 ///< the same attribute. 1128 LH_Likely ///< Branch has the [[likely]] attribute. 1129 }; 1130 1131 protected: 1132 /// Iterator for iterating over Stmt * arrays that contain only T *. 1133 /// 1134 /// This is needed because AST nodes use Stmt* arrays to store 1135 /// references to children (to be compatible with StmtIterator). 1136 template<typename T, typename TPtr = T *, typename StmtPtr = Stmt *> 1137 struct CastIterator 1138 : llvm::iterator_adaptor_base<CastIterator<T, TPtr, StmtPtr>, StmtPtr *, 1139 std::random_access_iterator_tag, TPtr> { 1140 using Base = typename CastIterator::iterator_adaptor_base; 1141 1142 CastIterator() : Base(nullptr) {} 1143 CastIterator(StmtPtr *I) : Base(I) {} 1144 1145 typename Base::value_type operator*() const { 1146 return cast_or_null<T>(*this->I); 1147 } 1148 }; 1149 1150 /// Const iterator for iterating over Stmt * arrays that contain only T *. 1151 template <typename T> 1152 using ConstCastIterator = CastIterator<T, const T *const, const Stmt *const>; 1153 1154 using ExprIterator = CastIterator<Expr>; 1155 using ConstExprIterator = ConstCastIterator<Expr>; 1156 1157 private: 1158 /// Whether statistic collection is enabled. 1159 static bool StatisticsEnabled; 1160 1161 protected: 1162 /// Construct an empty statement. 1163 explicit Stmt(StmtClass SC, EmptyShell) : Stmt(SC) {} 1164 1165 public: 1166 Stmt() = delete; 1167 Stmt(const Stmt &) = delete; 1168 Stmt(Stmt &&) = delete; 1169 Stmt &operator=(const Stmt &) = delete; 1170 Stmt &operator=(Stmt &&) = delete; 1171 1172 Stmt(StmtClass SC) { 1173 static_assert(sizeof(*this) <= 8, 1174 "changing bitfields changed sizeof(Stmt)"); 1175 static_assert(sizeof(*this) % alignof(void *) == 0, 1176 "Insufficient alignment!"); 1177 StmtBits.sClass = SC; 1178 if (StatisticsEnabled) Stmt::addStmtClass(SC); 1179 } 1180 1181 StmtClass getStmtClass() const { 1182 return static_cast<StmtClass>(StmtBits.sClass); 1183 } 1184 1185 const char *getStmtClassName() const; 1186 1187 /// SourceLocation tokens are not useful in isolation - they are low level 1188 /// value objects created/interpreted by SourceManager. We assume AST 1189 /// clients will have a pointer to the respective SourceManager. 1190 SourceRange getSourceRange() const LLVM_READONLY; 1191 SourceLocation getBeginLoc() const LLVM_READONLY; 1192 SourceLocation getEndLoc() const LLVM_READONLY; 1193 1194 // global temp stats (until we have a per-module visitor) 1195 static void addStmtClass(const StmtClass s); 1196 static void EnableStatistics(); 1197 static void PrintStats(); 1198 1199 /// \returns the likelihood of a set of attributes. 1200 static Likelihood getLikelihood(ArrayRef<const Attr *> Attrs); 1201 1202 /// \returns the likelihood of a statement. 1203 static Likelihood getLikelihood(const Stmt *S); 1204 1205 /// \returns the likelihood attribute of a statement. 1206 static const Attr *getLikelihoodAttr(const Stmt *S); 1207 1208 /// \returns the likelihood of the 'then' branch of an 'if' statement. The 1209 /// 'else' branch is required to determine whether both branches specify the 1210 /// same likelihood, which affects the result. 1211 static Likelihood getLikelihood(const Stmt *Then, const Stmt *Else); 1212 1213 /// \returns whether the likelihood of the branches of an if statement are 1214 /// conflicting. When the first element is \c true there's a conflict and 1215 /// the Attr's are the conflicting attributes of the Then and Else Stmt. 1216 static std::tuple<bool, const Attr *, const Attr *> 1217 determineLikelihoodConflict(const Stmt *Then, const Stmt *Else); 1218 1219 /// Dumps the specified AST fragment and all subtrees to 1220 /// \c llvm::errs(). 1221 void dump() const; 1222 void dump(raw_ostream &OS, const ASTContext &Context) const; 1223 1224 /// \return Unique reproducible object identifier 1225 int64_t getID(const ASTContext &Context) const; 1226 1227 /// dumpColor - same as dump(), but forces color highlighting. 1228 void dumpColor() const; 1229 1230 /// dumpPretty/printPretty - These two methods do a "pretty print" of the AST 1231 /// back to its original source language syntax. 1232 void dumpPretty(const ASTContext &Context) const; 1233 void printPretty(raw_ostream &OS, PrinterHelper *Helper, 1234 const PrintingPolicy &Policy, unsigned Indentation = 0, 1235 StringRef NewlineSymbol = "\n", 1236 const ASTContext *Context = nullptr) const; 1237 void printPrettyControlled(raw_ostream &OS, PrinterHelper *Helper, 1238 const PrintingPolicy &Policy, 1239 unsigned Indentation = 0, 1240 StringRef NewlineSymbol = "\n", 1241 const ASTContext *Context = nullptr) const; 1242 1243 /// Pretty-prints in JSON format. 1244 void printJson(raw_ostream &Out, PrinterHelper *Helper, 1245 const PrintingPolicy &Policy, bool AddQuotes) const; 1246 1247 /// viewAST - Visualize an AST rooted at this Stmt* using GraphViz. Only 1248 /// works on systems with GraphViz (Mac OS X) or dot+gv installed. 1249 void viewAST() const; 1250 1251 /// Skip no-op (attributed, compound) container stmts and skip captured 1252 /// stmt at the top, if \a IgnoreCaptured is true. 1253 Stmt *IgnoreContainers(bool IgnoreCaptured = false); 1254 const Stmt *IgnoreContainers(bool IgnoreCaptured = false) const { 1255 return const_cast<Stmt *>(this)->IgnoreContainers(IgnoreCaptured); 1256 } 1257 1258 const Stmt *stripLabelLikeStatements() const; 1259 Stmt *stripLabelLikeStatements() { 1260 return const_cast<Stmt*>( 1261 const_cast<const Stmt*>(this)->stripLabelLikeStatements()); 1262 } 1263 1264 /// Child Iterators: All subclasses must implement 'children' 1265 /// to permit easy iteration over the substatements/subexpressions of an 1266 /// AST node. This permits easy iteration over all nodes in the AST. 1267 using child_iterator = StmtIterator; 1268 using const_child_iterator = ConstStmtIterator; 1269 1270 using child_range = llvm::iterator_range<child_iterator>; 1271 using const_child_range = llvm::iterator_range<const_child_iterator>; 1272 1273 child_range children(); 1274 1275 const_child_range children() const { 1276 auto Children = const_cast<Stmt *>(this)->children(); 1277 return const_child_range(Children.begin(), Children.end()); 1278 } 1279 1280 child_iterator child_begin() { return children().begin(); } 1281 child_iterator child_end() { return children().end(); } 1282 1283 const_child_iterator child_begin() const { return children().begin(); } 1284 const_child_iterator child_end() const { return children().end(); } 1285 1286 /// Produce a unique representation of the given statement. 1287 /// 1288 /// \param ID once the profiling operation is complete, will contain 1289 /// the unique representation of the given statement. 1290 /// 1291 /// \param Context the AST context in which the statement resides 1292 /// 1293 /// \param Canonical whether the profile should be based on the canonical 1294 /// representation of this statement (e.g., where non-type template 1295 /// parameters are identified by index/level rather than their 1296 /// declaration pointers) or the exact representation of the statement as 1297 /// written in the source. 1298 /// \param ProfileLambdaExpr whether or not to profile lambda expressions. 1299 /// When false, the lambda expressions are never considered to be equal to 1300 /// other lambda expressions. When true, the lambda expressions with the same 1301 /// implementation will be considered to be the same. ProfileLambdaExpr should 1302 /// only be true when we try to merge two declarations within modules. 1303 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 1304 bool Canonical, bool ProfileLambdaExpr = false) const; 1305 1306 /// Calculate a unique representation for a statement that is 1307 /// stable across compiler invocations. 1308 /// 1309 /// \param ID profile information will be stored in ID. 1310 /// 1311 /// \param Hash an ODRHash object which will be called where pointers would 1312 /// have been used in the Profile function. 1313 void ProcessODRHash(llvm::FoldingSetNodeID &ID, ODRHash& Hash) const; 1314 }; 1315 1316 /// DeclStmt - Adaptor class for mixing declarations with statements and 1317 /// expressions. For example, CompoundStmt mixes statements, expressions 1318 /// and declarations (variables, types). Another example is ForStmt, where 1319 /// the first statement can be an expression or a declaration. 1320 class DeclStmt : public Stmt { 1321 DeclGroupRef DG; 1322 SourceLocation StartLoc, EndLoc; 1323 1324 public: 1325 DeclStmt(DeclGroupRef dg, SourceLocation startLoc, SourceLocation endLoc) 1326 : Stmt(DeclStmtClass), DG(dg), StartLoc(startLoc), EndLoc(endLoc) {} 1327 1328 /// Build an empty declaration statement. 1329 explicit DeclStmt(EmptyShell Empty) : Stmt(DeclStmtClass, Empty) {} 1330 1331 /// isSingleDecl - This method returns true if this DeclStmt refers 1332 /// to a single Decl. 1333 bool isSingleDecl() const { return DG.isSingleDecl(); } 1334 1335 const Decl *getSingleDecl() const { return DG.getSingleDecl(); } 1336 Decl *getSingleDecl() { return DG.getSingleDecl(); } 1337 1338 const DeclGroupRef getDeclGroup() const { return DG; } 1339 DeclGroupRef getDeclGroup() { return DG; } 1340 void setDeclGroup(DeclGroupRef DGR) { DG = DGR; } 1341 1342 void setStartLoc(SourceLocation L) { StartLoc = L; } 1343 SourceLocation getEndLoc() const { return EndLoc; } 1344 void setEndLoc(SourceLocation L) { EndLoc = L; } 1345 1346 SourceLocation getBeginLoc() const LLVM_READONLY { return StartLoc; } 1347 1348 static bool classof(const Stmt *T) { 1349 return T->getStmtClass() == DeclStmtClass; 1350 } 1351 1352 // Iterators over subexpressions. 1353 child_range children() { 1354 return child_range(child_iterator(DG.begin(), DG.end()), 1355 child_iterator(DG.end(), DG.end())); 1356 } 1357 1358 const_child_range children() const { 1359 auto Children = const_cast<DeclStmt *>(this)->children(); 1360 return const_child_range(Children); 1361 } 1362 1363 using decl_iterator = DeclGroupRef::iterator; 1364 using const_decl_iterator = DeclGroupRef::const_iterator; 1365 using decl_range = llvm::iterator_range<decl_iterator>; 1366 using decl_const_range = llvm::iterator_range<const_decl_iterator>; 1367 1368 decl_range decls() { return decl_range(decl_begin(), decl_end()); } 1369 1370 decl_const_range decls() const { 1371 return decl_const_range(decl_begin(), decl_end()); 1372 } 1373 1374 decl_iterator decl_begin() { return DG.begin(); } 1375 decl_iterator decl_end() { return DG.end(); } 1376 const_decl_iterator decl_begin() const { return DG.begin(); } 1377 const_decl_iterator decl_end() const { return DG.end(); } 1378 1379 using reverse_decl_iterator = std::reverse_iterator<decl_iterator>; 1380 1381 reverse_decl_iterator decl_rbegin() { 1382 return reverse_decl_iterator(decl_end()); 1383 } 1384 1385 reverse_decl_iterator decl_rend() { 1386 return reverse_decl_iterator(decl_begin()); 1387 } 1388 }; 1389 1390 /// NullStmt - This is the null statement ";": C99 6.8.3p3. 1391 /// 1392 class NullStmt : public Stmt { 1393 public: 1394 NullStmt(SourceLocation L, bool hasLeadingEmptyMacro = false) 1395 : Stmt(NullStmtClass) { 1396 NullStmtBits.HasLeadingEmptyMacro = hasLeadingEmptyMacro; 1397 setSemiLoc(L); 1398 } 1399 1400 /// Build an empty null statement. 1401 explicit NullStmt(EmptyShell Empty) : Stmt(NullStmtClass, Empty) {} 1402 1403 SourceLocation getSemiLoc() const { return NullStmtBits.SemiLoc; } 1404 void setSemiLoc(SourceLocation L) { NullStmtBits.SemiLoc = L; } 1405 1406 bool hasLeadingEmptyMacro() const { 1407 return NullStmtBits.HasLeadingEmptyMacro; 1408 } 1409 1410 SourceLocation getBeginLoc() const { return getSemiLoc(); } 1411 SourceLocation getEndLoc() const { return getSemiLoc(); } 1412 1413 static bool classof(const Stmt *T) { 1414 return T->getStmtClass() == NullStmtClass; 1415 } 1416 1417 child_range children() { 1418 return child_range(child_iterator(), child_iterator()); 1419 } 1420 1421 const_child_range children() const { 1422 return const_child_range(const_child_iterator(), const_child_iterator()); 1423 } 1424 }; 1425 1426 /// CompoundStmt - This represents a group of statements like { stmt stmt }. 1427 class CompoundStmt final 1428 : public Stmt, 1429 private llvm::TrailingObjects<CompoundStmt, Stmt *, FPOptionsOverride> { 1430 friend class ASTStmtReader; 1431 friend TrailingObjects; 1432 1433 /// The location of the opening "{". 1434 SourceLocation LBraceLoc; 1435 1436 /// The location of the closing "}". 1437 SourceLocation RBraceLoc; 1438 1439 CompoundStmt(ArrayRef<Stmt *> Stmts, FPOptionsOverride FPFeatures, 1440 SourceLocation LB, SourceLocation RB); 1441 explicit CompoundStmt(EmptyShell Empty) : Stmt(CompoundStmtClass, Empty) {} 1442 1443 void setStmts(ArrayRef<Stmt *> Stmts); 1444 1445 /// Set FPOptionsOverride in trailing storage. Used only by Serialization. 1446 void setStoredFPFeatures(FPOptionsOverride F) { 1447 assert(hasStoredFPFeatures()); 1448 *getTrailingObjects<FPOptionsOverride>() = F; 1449 } 1450 1451 size_t numTrailingObjects(OverloadToken<Stmt *>) const { 1452 return CompoundStmtBits.NumStmts; 1453 } 1454 1455 public: 1456 static CompoundStmt *Create(const ASTContext &C, ArrayRef<Stmt *> Stmts, 1457 FPOptionsOverride FPFeatures, SourceLocation LB, 1458 SourceLocation RB); 1459 1460 // Build an empty compound statement with a location. 1461 explicit CompoundStmt(SourceLocation Loc) 1462 : Stmt(CompoundStmtClass), LBraceLoc(Loc), RBraceLoc(Loc) { 1463 CompoundStmtBits.NumStmts = 0; 1464 CompoundStmtBits.HasFPFeatures = 0; 1465 } 1466 1467 // Build an empty compound statement. 1468 static CompoundStmt *CreateEmpty(const ASTContext &C, unsigned NumStmts, 1469 bool HasFPFeatures); 1470 1471 bool body_empty() const { return CompoundStmtBits.NumStmts == 0; } 1472 unsigned size() const { return CompoundStmtBits.NumStmts; } 1473 1474 bool hasStoredFPFeatures() const { return CompoundStmtBits.HasFPFeatures; } 1475 1476 /// Get FPOptionsOverride from trailing storage. 1477 FPOptionsOverride getStoredFPFeatures() const { 1478 assert(hasStoredFPFeatures()); 1479 return *getTrailingObjects<FPOptionsOverride>(); 1480 } 1481 1482 using body_iterator = Stmt **; 1483 using body_range = llvm::iterator_range<body_iterator>; 1484 1485 body_range body() { return body_range(body_begin(), body_end()); } 1486 body_iterator body_begin() { return getTrailingObjects<Stmt *>(); } 1487 body_iterator body_end() { return body_begin() + size(); } 1488 Stmt *body_front() { return !body_empty() ? body_begin()[0] : nullptr; } 1489 1490 Stmt *body_back() { 1491 return !body_empty() ? body_begin()[size() - 1] : nullptr; 1492 } 1493 1494 using const_body_iterator = Stmt *const *; 1495 using body_const_range = llvm::iterator_range<const_body_iterator>; 1496 1497 body_const_range body() const { 1498 return body_const_range(body_begin(), body_end()); 1499 } 1500 1501 const_body_iterator body_begin() const { 1502 return getTrailingObjects<Stmt *>(); 1503 } 1504 1505 const_body_iterator body_end() const { return body_begin() + size(); } 1506 1507 const Stmt *body_front() const { 1508 return !body_empty() ? body_begin()[0] : nullptr; 1509 } 1510 1511 const Stmt *body_back() const { 1512 return !body_empty() ? body_begin()[size() - 1] : nullptr; 1513 } 1514 1515 using reverse_body_iterator = std::reverse_iterator<body_iterator>; 1516 1517 reverse_body_iterator body_rbegin() { 1518 return reverse_body_iterator(body_end()); 1519 } 1520 1521 reverse_body_iterator body_rend() { 1522 return reverse_body_iterator(body_begin()); 1523 } 1524 1525 using const_reverse_body_iterator = 1526 std::reverse_iterator<const_body_iterator>; 1527 1528 const_reverse_body_iterator body_rbegin() const { 1529 return const_reverse_body_iterator(body_end()); 1530 } 1531 1532 const_reverse_body_iterator body_rend() const { 1533 return const_reverse_body_iterator(body_begin()); 1534 } 1535 1536 // Get the Stmt that StmtExpr would consider to be the result of this 1537 // compound statement. This is used by StmtExpr to properly emulate the GCC 1538 // compound expression extension, which ignores trailing NullStmts when 1539 // getting the result of the expression. 1540 // i.e. ({ 5;;; }) 1541 // ^^ ignored 1542 // If we don't find something that isn't a NullStmt, just return the last 1543 // Stmt. 1544 Stmt *getStmtExprResult() { 1545 for (auto *B : llvm::reverse(body())) { 1546 if (!isa<NullStmt>(B)) 1547 return B; 1548 } 1549 return body_back(); 1550 } 1551 1552 const Stmt *getStmtExprResult() const { 1553 return const_cast<CompoundStmt *>(this)->getStmtExprResult(); 1554 } 1555 1556 SourceLocation getBeginLoc() const { return LBraceLoc; } 1557 SourceLocation getEndLoc() const { return RBraceLoc; } 1558 1559 SourceLocation getLBracLoc() const { return LBraceLoc; } 1560 SourceLocation getRBracLoc() const { return RBraceLoc; } 1561 1562 static bool classof(const Stmt *T) { 1563 return T->getStmtClass() == CompoundStmtClass; 1564 } 1565 1566 // Iterators 1567 child_range children() { return child_range(body_begin(), body_end()); } 1568 1569 const_child_range children() const { 1570 return const_child_range(body_begin(), body_end()); 1571 } 1572 }; 1573 1574 // SwitchCase is the base class for CaseStmt and DefaultStmt, 1575 class SwitchCase : public Stmt { 1576 protected: 1577 /// The location of the ":". 1578 SourceLocation ColonLoc; 1579 1580 // The location of the "case" or "default" keyword. Stored in SwitchCaseBits. 1581 // SourceLocation KeywordLoc; 1582 1583 /// A pointer to the following CaseStmt or DefaultStmt class, 1584 /// used by SwitchStmt. 1585 SwitchCase *NextSwitchCase = nullptr; 1586 1587 SwitchCase(StmtClass SC, SourceLocation KWLoc, SourceLocation ColonLoc) 1588 : Stmt(SC), ColonLoc(ColonLoc) { 1589 setKeywordLoc(KWLoc); 1590 } 1591 1592 SwitchCase(StmtClass SC, EmptyShell) : Stmt(SC) {} 1593 1594 public: 1595 const SwitchCase *getNextSwitchCase() const { return NextSwitchCase; } 1596 SwitchCase *getNextSwitchCase() { return NextSwitchCase; } 1597 void setNextSwitchCase(SwitchCase *SC) { NextSwitchCase = SC; } 1598 1599 SourceLocation getKeywordLoc() const { return SwitchCaseBits.KeywordLoc; } 1600 void setKeywordLoc(SourceLocation L) { SwitchCaseBits.KeywordLoc = L; } 1601 SourceLocation getColonLoc() const { return ColonLoc; } 1602 void setColonLoc(SourceLocation L) { ColonLoc = L; } 1603 1604 inline Stmt *getSubStmt(); 1605 const Stmt *getSubStmt() const { 1606 return const_cast<SwitchCase *>(this)->getSubStmt(); 1607 } 1608 1609 SourceLocation getBeginLoc() const { return getKeywordLoc(); } 1610 inline SourceLocation getEndLoc() const LLVM_READONLY; 1611 1612 static bool classof(const Stmt *T) { 1613 return T->getStmtClass() == CaseStmtClass || 1614 T->getStmtClass() == DefaultStmtClass; 1615 } 1616 }; 1617 1618 /// CaseStmt - Represent a case statement. It can optionally be a GNU case 1619 /// statement of the form LHS ... RHS representing a range of cases. 1620 class CaseStmt final 1621 : public SwitchCase, 1622 private llvm::TrailingObjects<CaseStmt, Stmt *, SourceLocation> { 1623 friend TrailingObjects; 1624 1625 // CaseStmt is followed by several trailing objects, some of which optional. 1626 // Note that it would be more convenient to put the optional trailing objects 1627 // at the end but this would impact children(). 1628 // The trailing objects are in order: 1629 // 1630 // * A "Stmt *" for the LHS of the case statement. Always present. 1631 // 1632 // * A "Stmt *" for the RHS of the case statement. This is a GNU extension 1633 // which allow ranges in cases statement of the form LHS ... RHS. 1634 // Present if and only if caseStmtIsGNURange() is true. 1635 // 1636 // * A "Stmt *" for the substatement of the case statement. Always present. 1637 // 1638 // * A SourceLocation for the location of the ... if this is a case statement 1639 // with a range. Present if and only if caseStmtIsGNURange() is true. 1640 enum { LhsOffset = 0, SubStmtOffsetFromRhs = 1 }; 1641 enum { NumMandatoryStmtPtr = 2 }; 1642 1643 unsigned numTrailingObjects(OverloadToken<Stmt *>) const { 1644 return NumMandatoryStmtPtr + caseStmtIsGNURange(); 1645 } 1646 1647 unsigned numTrailingObjects(OverloadToken<SourceLocation>) const { 1648 return caseStmtIsGNURange(); 1649 } 1650 1651 unsigned lhsOffset() const { return LhsOffset; } 1652 unsigned rhsOffset() const { return LhsOffset + caseStmtIsGNURange(); } 1653 unsigned subStmtOffset() const { return rhsOffset() + SubStmtOffsetFromRhs; } 1654 1655 /// Build a case statement assuming that the storage for the 1656 /// trailing objects has been properly allocated. 1657 CaseStmt(Expr *lhs, Expr *rhs, SourceLocation caseLoc, 1658 SourceLocation ellipsisLoc, SourceLocation colonLoc) 1659 : SwitchCase(CaseStmtClass, caseLoc, colonLoc) { 1660 // Handle GNU case statements of the form LHS ... RHS. 1661 bool IsGNURange = rhs != nullptr; 1662 SwitchCaseBits.CaseStmtIsGNURange = IsGNURange; 1663 setLHS(lhs); 1664 setSubStmt(nullptr); 1665 if (IsGNURange) { 1666 setRHS(rhs); 1667 setEllipsisLoc(ellipsisLoc); 1668 } 1669 } 1670 1671 /// Build an empty switch case statement. 1672 explicit CaseStmt(EmptyShell Empty, bool CaseStmtIsGNURange) 1673 : SwitchCase(CaseStmtClass, Empty) { 1674 SwitchCaseBits.CaseStmtIsGNURange = CaseStmtIsGNURange; 1675 } 1676 1677 public: 1678 /// Build a case statement. 1679 static CaseStmt *Create(const ASTContext &Ctx, Expr *lhs, Expr *rhs, 1680 SourceLocation caseLoc, SourceLocation ellipsisLoc, 1681 SourceLocation colonLoc); 1682 1683 /// Build an empty case statement. 1684 static CaseStmt *CreateEmpty(const ASTContext &Ctx, bool CaseStmtIsGNURange); 1685 1686 /// True if this case statement is of the form case LHS ... RHS, which 1687 /// is a GNU extension. In this case the RHS can be obtained with getRHS() 1688 /// and the location of the ellipsis can be obtained with getEllipsisLoc(). 1689 bool caseStmtIsGNURange() const { return SwitchCaseBits.CaseStmtIsGNURange; } 1690 1691 SourceLocation getCaseLoc() const { return getKeywordLoc(); } 1692 void setCaseLoc(SourceLocation L) { setKeywordLoc(L); } 1693 1694 /// Get the location of the ... in a case statement of the form LHS ... RHS. 1695 SourceLocation getEllipsisLoc() const { 1696 return caseStmtIsGNURange() ? *getTrailingObjects<SourceLocation>() 1697 : SourceLocation(); 1698 } 1699 1700 /// Set the location of the ... in a case statement of the form LHS ... RHS. 1701 /// Assert that this case statement is of this form. 1702 void setEllipsisLoc(SourceLocation L) { 1703 assert( 1704 caseStmtIsGNURange() && 1705 "setEllipsisLoc but this is not a case stmt of the form LHS ... RHS!"); 1706 *getTrailingObjects<SourceLocation>() = L; 1707 } 1708 1709 Expr *getLHS() { 1710 return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[lhsOffset()]); 1711 } 1712 1713 const Expr *getLHS() const { 1714 return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[lhsOffset()]); 1715 } 1716 1717 void setLHS(Expr *Val) { 1718 getTrailingObjects<Stmt *>()[lhsOffset()] = reinterpret_cast<Stmt *>(Val); 1719 } 1720 1721 Expr *getRHS() { 1722 return caseStmtIsGNURange() ? reinterpret_cast<Expr *>( 1723 getTrailingObjects<Stmt *>()[rhsOffset()]) 1724 : nullptr; 1725 } 1726 1727 const Expr *getRHS() const { 1728 return caseStmtIsGNURange() ? reinterpret_cast<Expr *>( 1729 getTrailingObjects<Stmt *>()[rhsOffset()]) 1730 : nullptr; 1731 } 1732 1733 void setRHS(Expr *Val) { 1734 assert(caseStmtIsGNURange() && 1735 "setRHS but this is not a case stmt of the form LHS ... RHS!"); 1736 getTrailingObjects<Stmt *>()[rhsOffset()] = reinterpret_cast<Stmt *>(Val); 1737 } 1738 1739 Stmt *getSubStmt() { return getTrailingObjects<Stmt *>()[subStmtOffset()]; } 1740 const Stmt *getSubStmt() const { 1741 return getTrailingObjects<Stmt *>()[subStmtOffset()]; 1742 } 1743 1744 void setSubStmt(Stmt *S) { 1745 getTrailingObjects<Stmt *>()[subStmtOffset()] = S; 1746 } 1747 1748 SourceLocation getBeginLoc() const { return getKeywordLoc(); } 1749 SourceLocation getEndLoc() const LLVM_READONLY { 1750 // Handle deeply nested case statements with iteration instead of recursion. 1751 const CaseStmt *CS = this; 1752 while (const auto *CS2 = dyn_cast<CaseStmt>(CS->getSubStmt())) 1753 CS = CS2; 1754 1755 return CS->getSubStmt()->getEndLoc(); 1756 } 1757 1758 static bool classof(const Stmt *T) { 1759 return T->getStmtClass() == CaseStmtClass; 1760 } 1761 1762 // Iterators 1763 child_range children() { 1764 return child_range(getTrailingObjects<Stmt *>(), 1765 getTrailingObjects<Stmt *>() + 1766 numTrailingObjects(OverloadToken<Stmt *>())); 1767 } 1768 1769 const_child_range children() const { 1770 return const_child_range(getTrailingObjects<Stmt *>(), 1771 getTrailingObjects<Stmt *>() + 1772 numTrailingObjects(OverloadToken<Stmt *>())); 1773 } 1774 }; 1775 1776 class DefaultStmt : public SwitchCase { 1777 Stmt *SubStmt; 1778 1779 public: 1780 DefaultStmt(SourceLocation DL, SourceLocation CL, Stmt *substmt) 1781 : SwitchCase(DefaultStmtClass, DL, CL), SubStmt(substmt) {} 1782 1783 /// Build an empty default statement. 1784 explicit DefaultStmt(EmptyShell Empty) 1785 : SwitchCase(DefaultStmtClass, Empty) {} 1786 1787 Stmt *getSubStmt() { return SubStmt; } 1788 const Stmt *getSubStmt() const { return SubStmt; } 1789 void setSubStmt(Stmt *S) { SubStmt = S; } 1790 1791 SourceLocation getDefaultLoc() const { return getKeywordLoc(); } 1792 void setDefaultLoc(SourceLocation L) { setKeywordLoc(L); } 1793 1794 SourceLocation getBeginLoc() const { return getKeywordLoc(); } 1795 SourceLocation getEndLoc() const LLVM_READONLY { 1796 return SubStmt->getEndLoc(); 1797 } 1798 1799 static bool classof(const Stmt *T) { 1800 return T->getStmtClass() == DefaultStmtClass; 1801 } 1802 1803 // Iterators 1804 child_range children() { return child_range(&SubStmt, &SubStmt + 1); } 1805 1806 const_child_range children() const { 1807 return const_child_range(&SubStmt, &SubStmt + 1); 1808 } 1809 }; 1810 1811 SourceLocation SwitchCase::getEndLoc() const { 1812 if (const auto *CS = dyn_cast<CaseStmt>(this)) 1813 return CS->getEndLoc(); 1814 else if (const auto *DS = dyn_cast<DefaultStmt>(this)) 1815 return DS->getEndLoc(); 1816 llvm_unreachable("SwitchCase is neither a CaseStmt nor a DefaultStmt!"); 1817 } 1818 1819 Stmt *SwitchCase::getSubStmt() { 1820 if (auto *CS = dyn_cast<CaseStmt>(this)) 1821 return CS->getSubStmt(); 1822 else if (auto *DS = dyn_cast<DefaultStmt>(this)) 1823 return DS->getSubStmt(); 1824 llvm_unreachable("SwitchCase is neither a CaseStmt nor a DefaultStmt!"); 1825 } 1826 1827 /// Represents a statement that could possibly have a value and type. This 1828 /// covers expression-statements, as well as labels and attributed statements. 1829 /// 1830 /// Value statements have a special meaning when they are the last non-null 1831 /// statement in a GNU statement expression, where they determine the value 1832 /// of the statement expression. 1833 class ValueStmt : public Stmt { 1834 protected: 1835 using Stmt::Stmt; 1836 1837 public: 1838 const Expr *getExprStmt() const; 1839 Expr *getExprStmt() { 1840 const ValueStmt *ConstThis = this; 1841 return const_cast<Expr*>(ConstThis->getExprStmt()); 1842 } 1843 1844 static bool classof(const Stmt *T) { 1845 return T->getStmtClass() >= firstValueStmtConstant && 1846 T->getStmtClass() <= lastValueStmtConstant; 1847 } 1848 }; 1849 1850 /// LabelStmt - Represents a label, which has a substatement. For example: 1851 /// foo: return; 1852 class LabelStmt : public ValueStmt { 1853 LabelDecl *TheDecl; 1854 Stmt *SubStmt; 1855 bool SideEntry = false; 1856 1857 public: 1858 /// Build a label statement. 1859 LabelStmt(SourceLocation IL, LabelDecl *D, Stmt *substmt) 1860 : ValueStmt(LabelStmtClass), TheDecl(D), SubStmt(substmt) { 1861 setIdentLoc(IL); 1862 } 1863 1864 /// Build an empty label statement. 1865 explicit LabelStmt(EmptyShell Empty) : ValueStmt(LabelStmtClass, Empty) {} 1866 1867 SourceLocation getIdentLoc() const { return LabelStmtBits.IdentLoc; } 1868 void setIdentLoc(SourceLocation L) { LabelStmtBits.IdentLoc = L; } 1869 1870 LabelDecl *getDecl() const { return TheDecl; } 1871 void setDecl(LabelDecl *D) { TheDecl = D; } 1872 1873 const char *getName() const; 1874 Stmt *getSubStmt() { return SubStmt; } 1875 1876 const Stmt *getSubStmt() const { return SubStmt; } 1877 void setSubStmt(Stmt *SS) { SubStmt = SS; } 1878 1879 SourceLocation getBeginLoc() const { return getIdentLoc(); } 1880 SourceLocation getEndLoc() const LLVM_READONLY { return SubStmt->getEndLoc();} 1881 1882 child_range children() { return child_range(&SubStmt, &SubStmt + 1); } 1883 1884 const_child_range children() const { 1885 return const_child_range(&SubStmt, &SubStmt + 1); 1886 } 1887 1888 static bool classof(const Stmt *T) { 1889 return T->getStmtClass() == LabelStmtClass; 1890 } 1891 bool isSideEntry() const { return SideEntry; } 1892 void setSideEntry(bool SE) { SideEntry = SE; } 1893 }; 1894 1895 /// Represents an attribute applied to a statement. 1896 /// 1897 /// Represents an attribute applied to a statement. For example: 1898 /// [[omp::for(...)]] for (...) { ... } 1899 class AttributedStmt final 1900 : public ValueStmt, 1901 private llvm::TrailingObjects<AttributedStmt, const Attr *> { 1902 friend class ASTStmtReader; 1903 friend TrailingObjects; 1904 1905 Stmt *SubStmt; 1906 1907 AttributedStmt(SourceLocation Loc, ArrayRef<const Attr *> Attrs, 1908 Stmt *SubStmt) 1909 : ValueStmt(AttributedStmtClass), SubStmt(SubStmt) { 1910 AttributedStmtBits.NumAttrs = Attrs.size(); 1911 AttributedStmtBits.AttrLoc = Loc; 1912 std::copy(Attrs.begin(), Attrs.end(), getAttrArrayPtr()); 1913 } 1914 1915 explicit AttributedStmt(EmptyShell Empty, unsigned NumAttrs) 1916 : ValueStmt(AttributedStmtClass, Empty) { 1917 AttributedStmtBits.NumAttrs = NumAttrs; 1918 AttributedStmtBits.AttrLoc = SourceLocation{}; 1919 std::fill_n(getAttrArrayPtr(), NumAttrs, nullptr); 1920 } 1921 1922 const Attr *const *getAttrArrayPtr() const { 1923 return getTrailingObjects<const Attr *>(); 1924 } 1925 const Attr **getAttrArrayPtr() { return getTrailingObjects<const Attr *>(); } 1926 1927 public: 1928 static AttributedStmt *Create(const ASTContext &C, SourceLocation Loc, 1929 ArrayRef<const Attr *> Attrs, Stmt *SubStmt); 1930 1931 // Build an empty attributed statement. 1932 static AttributedStmt *CreateEmpty(const ASTContext &C, unsigned NumAttrs); 1933 1934 SourceLocation getAttrLoc() const { return AttributedStmtBits.AttrLoc; } 1935 ArrayRef<const Attr *> getAttrs() const { 1936 return llvm::ArrayRef(getAttrArrayPtr(), AttributedStmtBits.NumAttrs); 1937 } 1938 1939 Stmt *getSubStmt() { return SubStmt; } 1940 const Stmt *getSubStmt() const { return SubStmt; } 1941 1942 SourceLocation getBeginLoc() const { return getAttrLoc(); } 1943 SourceLocation getEndLoc() const LLVM_READONLY { return SubStmt->getEndLoc();} 1944 1945 child_range children() { return child_range(&SubStmt, &SubStmt + 1); } 1946 1947 const_child_range children() const { 1948 return const_child_range(&SubStmt, &SubStmt + 1); 1949 } 1950 1951 static bool classof(const Stmt *T) { 1952 return T->getStmtClass() == AttributedStmtClass; 1953 } 1954 }; 1955 1956 /// IfStmt - This represents an if/then/else. 1957 class IfStmt final 1958 : public Stmt, 1959 private llvm::TrailingObjects<IfStmt, Stmt *, SourceLocation> { 1960 friend TrailingObjects; 1961 1962 // IfStmt is followed by several trailing objects, some of which optional. 1963 // Note that it would be more convenient to put the optional trailing 1964 // objects at then end but this would change the order of the children. 1965 // The trailing objects are in order: 1966 // 1967 // * A "Stmt *" for the init statement. 1968 // Present if and only if hasInitStorage(). 1969 // 1970 // * A "Stmt *" for the condition variable. 1971 // Present if and only if hasVarStorage(). This is in fact a "DeclStmt *". 1972 // 1973 // * A "Stmt *" for the condition. 1974 // Always present. This is in fact a "Expr *". 1975 // 1976 // * A "Stmt *" for the then statement. 1977 // Always present. 1978 // 1979 // * A "Stmt *" for the else statement. 1980 // Present if and only if hasElseStorage(). 1981 // 1982 // * A "SourceLocation" for the location of the "else". 1983 // Present if and only if hasElseStorage(). 1984 enum { InitOffset = 0, ThenOffsetFromCond = 1, ElseOffsetFromCond = 2 }; 1985 enum { NumMandatoryStmtPtr = 2 }; 1986 SourceLocation LParenLoc; 1987 SourceLocation RParenLoc; 1988 1989 unsigned numTrailingObjects(OverloadToken<Stmt *>) const { 1990 return NumMandatoryStmtPtr + hasElseStorage() + hasVarStorage() + 1991 hasInitStorage(); 1992 } 1993 1994 unsigned numTrailingObjects(OverloadToken<SourceLocation>) const { 1995 return hasElseStorage(); 1996 } 1997 1998 unsigned initOffset() const { return InitOffset; } 1999 unsigned varOffset() const { return InitOffset + hasInitStorage(); } 2000 unsigned condOffset() const { 2001 return InitOffset + hasInitStorage() + hasVarStorage(); 2002 } 2003 unsigned thenOffset() const { return condOffset() + ThenOffsetFromCond; } 2004 unsigned elseOffset() const { return condOffset() + ElseOffsetFromCond; } 2005 2006 /// Build an if/then/else statement. 2007 IfStmt(const ASTContext &Ctx, SourceLocation IL, IfStatementKind Kind, 2008 Stmt *Init, VarDecl *Var, Expr *Cond, SourceLocation LParenLoc, 2009 SourceLocation RParenLoc, Stmt *Then, SourceLocation EL, Stmt *Else); 2010 2011 /// Build an empty if/then/else statement. 2012 explicit IfStmt(EmptyShell Empty, bool HasElse, bool HasVar, bool HasInit); 2013 2014 public: 2015 /// Create an IfStmt. 2016 static IfStmt *Create(const ASTContext &Ctx, SourceLocation IL, 2017 IfStatementKind Kind, Stmt *Init, VarDecl *Var, 2018 Expr *Cond, SourceLocation LPL, SourceLocation RPL, 2019 Stmt *Then, SourceLocation EL = SourceLocation(), 2020 Stmt *Else = nullptr); 2021 2022 /// Create an empty IfStmt optionally with storage for an else statement, 2023 /// condition variable and init expression. 2024 static IfStmt *CreateEmpty(const ASTContext &Ctx, bool HasElse, bool HasVar, 2025 bool HasInit); 2026 2027 /// True if this IfStmt has the storage for an init statement. 2028 bool hasInitStorage() const { return IfStmtBits.HasInit; } 2029 2030 /// True if this IfStmt has storage for a variable declaration. 2031 bool hasVarStorage() const { return IfStmtBits.HasVar; } 2032 2033 /// True if this IfStmt has storage for an else statement. 2034 bool hasElseStorage() const { return IfStmtBits.HasElse; } 2035 2036 Expr *getCond() { 2037 return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]); 2038 } 2039 2040 const Expr *getCond() const { 2041 return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]); 2042 } 2043 2044 void setCond(Expr *Cond) { 2045 getTrailingObjects<Stmt *>()[condOffset()] = reinterpret_cast<Stmt *>(Cond); 2046 } 2047 2048 Stmt *getThen() { return getTrailingObjects<Stmt *>()[thenOffset()]; } 2049 const Stmt *getThen() const { 2050 return getTrailingObjects<Stmt *>()[thenOffset()]; 2051 } 2052 2053 void setThen(Stmt *Then) { 2054 getTrailingObjects<Stmt *>()[thenOffset()] = Then; 2055 } 2056 2057 Stmt *getElse() { 2058 return hasElseStorage() ? getTrailingObjects<Stmt *>()[elseOffset()] 2059 : nullptr; 2060 } 2061 2062 const Stmt *getElse() const { 2063 return hasElseStorage() ? getTrailingObjects<Stmt *>()[elseOffset()] 2064 : nullptr; 2065 } 2066 2067 void setElse(Stmt *Else) { 2068 assert(hasElseStorage() && 2069 "This if statement has no storage for an else statement!"); 2070 getTrailingObjects<Stmt *>()[elseOffset()] = Else; 2071 } 2072 2073 /// Retrieve the variable declared in this "if" statement, if any. 2074 /// 2075 /// In the following example, "x" is the condition variable. 2076 /// \code 2077 /// if (int x = foo()) { 2078 /// printf("x is %d", x); 2079 /// } 2080 /// \endcode 2081 VarDecl *getConditionVariable(); 2082 const VarDecl *getConditionVariable() const { 2083 return const_cast<IfStmt *>(this)->getConditionVariable(); 2084 } 2085 2086 /// Set the condition variable for this if statement. 2087 /// The if statement must have storage for the condition variable. 2088 void setConditionVariable(const ASTContext &Ctx, VarDecl *V); 2089 2090 /// If this IfStmt has a condition variable, return the faux DeclStmt 2091 /// associated with the creation of that condition variable. 2092 DeclStmt *getConditionVariableDeclStmt() { 2093 return hasVarStorage() ? static_cast<DeclStmt *>( 2094 getTrailingObjects<Stmt *>()[varOffset()]) 2095 : nullptr; 2096 } 2097 2098 const DeclStmt *getConditionVariableDeclStmt() const { 2099 return hasVarStorage() ? static_cast<DeclStmt *>( 2100 getTrailingObjects<Stmt *>()[varOffset()]) 2101 : nullptr; 2102 } 2103 2104 void setConditionVariableDeclStmt(DeclStmt *CondVar) { 2105 assert(hasVarStorage()); 2106 getTrailingObjects<Stmt *>()[varOffset()] = CondVar; 2107 } 2108 2109 Stmt *getInit() { 2110 return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()] 2111 : nullptr; 2112 } 2113 2114 const Stmt *getInit() const { 2115 return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()] 2116 : nullptr; 2117 } 2118 2119 void setInit(Stmt *Init) { 2120 assert(hasInitStorage() && 2121 "This if statement has no storage for an init statement!"); 2122 getTrailingObjects<Stmt *>()[initOffset()] = Init; 2123 } 2124 2125 SourceLocation getIfLoc() const { return IfStmtBits.IfLoc; } 2126 void setIfLoc(SourceLocation IfLoc) { IfStmtBits.IfLoc = IfLoc; } 2127 2128 SourceLocation getElseLoc() const { 2129 return hasElseStorage() ? *getTrailingObjects<SourceLocation>() 2130 : SourceLocation(); 2131 } 2132 2133 void setElseLoc(SourceLocation ElseLoc) { 2134 assert(hasElseStorage() && 2135 "This if statement has no storage for an else statement!"); 2136 *getTrailingObjects<SourceLocation>() = ElseLoc; 2137 } 2138 2139 bool isConsteval() const { 2140 return getStatementKind() == IfStatementKind::ConstevalNonNegated || 2141 getStatementKind() == IfStatementKind::ConstevalNegated; 2142 } 2143 2144 bool isNonNegatedConsteval() const { 2145 return getStatementKind() == IfStatementKind::ConstevalNonNegated; 2146 } 2147 2148 bool isNegatedConsteval() const { 2149 return getStatementKind() == IfStatementKind::ConstevalNegated; 2150 } 2151 2152 bool isConstexpr() const { 2153 return getStatementKind() == IfStatementKind::Constexpr; 2154 } 2155 2156 void setStatementKind(IfStatementKind Kind) { 2157 IfStmtBits.Kind = static_cast<unsigned>(Kind); 2158 } 2159 2160 IfStatementKind getStatementKind() const { 2161 return static_cast<IfStatementKind>(IfStmtBits.Kind); 2162 } 2163 2164 /// If this is an 'if constexpr', determine which substatement will be taken. 2165 /// Otherwise, or if the condition is value-dependent, returns std::nullopt. 2166 std::optional<const Stmt *> getNondiscardedCase(const ASTContext &Ctx) const; 2167 std::optional<Stmt *> getNondiscardedCase(const ASTContext &Ctx); 2168 2169 bool isObjCAvailabilityCheck() const; 2170 2171 SourceLocation getBeginLoc() const { return getIfLoc(); } 2172 SourceLocation getEndLoc() const LLVM_READONLY { 2173 if (getElse()) 2174 return getElse()->getEndLoc(); 2175 return getThen()->getEndLoc(); 2176 } 2177 SourceLocation getLParenLoc() const { return LParenLoc; } 2178 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; } 2179 SourceLocation getRParenLoc() const { return RParenLoc; } 2180 void setRParenLoc(SourceLocation Loc) { RParenLoc = Loc; } 2181 2182 // Iterators over subexpressions. The iterators will include iterating 2183 // over the initialization expression referenced by the condition variable. 2184 child_range children() { 2185 // We always store a condition, but there is none for consteval if 2186 // statements, so skip it. 2187 return child_range(getTrailingObjects<Stmt *>() + 2188 (isConsteval() ? thenOffset() : 0), 2189 getTrailingObjects<Stmt *>() + 2190 numTrailingObjects(OverloadToken<Stmt *>())); 2191 } 2192 2193 const_child_range children() const { 2194 // We always store a condition, but there is none for consteval if 2195 // statements, so skip it. 2196 return const_child_range(getTrailingObjects<Stmt *>() + 2197 (isConsteval() ? thenOffset() : 0), 2198 getTrailingObjects<Stmt *>() + 2199 numTrailingObjects(OverloadToken<Stmt *>())); 2200 } 2201 2202 static bool classof(const Stmt *T) { 2203 return T->getStmtClass() == IfStmtClass; 2204 } 2205 }; 2206 2207 /// SwitchStmt - This represents a 'switch' stmt. 2208 class SwitchStmt final : public Stmt, 2209 private llvm::TrailingObjects<SwitchStmt, Stmt *> { 2210 friend TrailingObjects; 2211 2212 /// Points to a linked list of case and default statements. 2213 SwitchCase *FirstCase = nullptr; 2214 2215 // SwitchStmt is followed by several trailing objects, 2216 // some of which optional. Note that it would be more convenient to 2217 // put the optional trailing objects at the end but this would change 2218 // the order in children(). 2219 // The trailing objects are in order: 2220 // 2221 // * A "Stmt *" for the init statement. 2222 // Present if and only if hasInitStorage(). 2223 // 2224 // * A "Stmt *" for the condition variable. 2225 // Present if and only if hasVarStorage(). This is in fact a "DeclStmt *". 2226 // 2227 // * A "Stmt *" for the condition. 2228 // Always present. This is in fact an "Expr *". 2229 // 2230 // * A "Stmt *" for the body. 2231 // Always present. 2232 enum { InitOffset = 0, BodyOffsetFromCond = 1 }; 2233 enum { NumMandatoryStmtPtr = 2 }; 2234 SourceLocation LParenLoc; 2235 SourceLocation RParenLoc; 2236 2237 unsigned numTrailingObjects(OverloadToken<Stmt *>) const { 2238 return NumMandatoryStmtPtr + hasInitStorage() + hasVarStorage(); 2239 } 2240 2241 unsigned initOffset() const { return InitOffset; } 2242 unsigned varOffset() const { return InitOffset + hasInitStorage(); } 2243 unsigned condOffset() const { 2244 return InitOffset + hasInitStorage() + hasVarStorage(); 2245 } 2246 unsigned bodyOffset() const { return condOffset() + BodyOffsetFromCond; } 2247 2248 /// Build a switch statement. 2249 SwitchStmt(const ASTContext &Ctx, Stmt *Init, VarDecl *Var, Expr *Cond, 2250 SourceLocation LParenLoc, SourceLocation RParenLoc); 2251 2252 /// Build a empty switch statement. 2253 explicit SwitchStmt(EmptyShell Empty, bool HasInit, bool HasVar); 2254 2255 public: 2256 /// Create a switch statement. 2257 static SwitchStmt *Create(const ASTContext &Ctx, Stmt *Init, VarDecl *Var, 2258 Expr *Cond, SourceLocation LParenLoc, 2259 SourceLocation RParenLoc); 2260 2261 /// Create an empty switch statement optionally with storage for 2262 /// an init expression and a condition variable. 2263 static SwitchStmt *CreateEmpty(const ASTContext &Ctx, bool HasInit, 2264 bool HasVar); 2265 2266 /// True if this SwitchStmt has storage for an init statement. 2267 bool hasInitStorage() const { return SwitchStmtBits.HasInit; } 2268 2269 /// True if this SwitchStmt has storage for a condition variable. 2270 bool hasVarStorage() const { return SwitchStmtBits.HasVar; } 2271 2272 Expr *getCond() { 2273 return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]); 2274 } 2275 2276 const Expr *getCond() const { 2277 return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]); 2278 } 2279 2280 void setCond(Expr *Cond) { 2281 getTrailingObjects<Stmt *>()[condOffset()] = reinterpret_cast<Stmt *>(Cond); 2282 } 2283 2284 Stmt *getBody() { return getTrailingObjects<Stmt *>()[bodyOffset()]; } 2285 const Stmt *getBody() const { 2286 return getTrailingObjects<Stmt *>()[bodyOffset()]; 2287 } 2288 2289 void setBody(Stmt *Body) { 2290 getTrailingObjects<Stmt *>()[bodyOffset()] = Body; 2291 } 2292 2293 Stmt *getInit() { 2294 return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()] 2295 : nullptr; 2296 } 2297 2298 const Stmt *getInit() const { 2299 return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()] 2300 : nullptr; 2301 } 2302 2303 void setInit(Stmt *Init) { 2304 assert(hasInitStorage() && 2305 "This switch statement has no storage for an init statement!"); 2306 getTrailingObjects<Stmt *>()[initOffset()] = Init; 2307 } 2308 2309 /// Retrieve the variable declared in this "switch" statement, if any. 2310 /// 2311 /// In the following example, "x" is the condition variable. 2312 /// \code 2313 /// switch (int x = foo()) { 2314 /// case 0: break; 2315 /// // ... 2316 /// } 2317 /// \endcode 2318 VarDecl *getConditionVariable(); 2319 const VarDecl *getConditionVariable() const { 2320 return const_cast<SwitchStmt *>(this)->getConditionVariable(); 2321 } 2322 2323 /// Set the condition variable in this switch statement. 2324 /// The switch statement must have storage for it. 2325 void setConditionVariable(const ASTContext &Ctx, VarDecl *VD); 2326 2327 /// If this SwitchStmt has a condition variable, return the faux DeclStmt 2328 /// associated with the creation of that condition variable. 2329 DeclStmt *getConditionVariableDeclStmt() { 2330 return hasVarStorage() ? static_cast<DeclStmt *>( 2331 getTrailingObjects<Stmt *>()[varOffset()]) 2332 : nullptr; 2333 } 2334 2335 const DeclStmt *getConditionVariableDeclStmt() const { 2336 return hasVarStorage() ? static_cast<DeclStmt *>( 2337 getTrailingObjects<Stmt *>()[varOffset()]) 2338 : nullptr; 2339 } 2340 2341 void setConditionVariableDeclStmt(DeclStmt *CondVar) { 2342 assert(hasVarStorage()); 2343 getTrailingObjects<Stmt *>()[varOffset()] = CondVar; 2344 } 2345 2346 SwitchCase *getSwitchCaseList() { return FirstCase; } 2347 const SwitchCase *getSwitchCaseList() const { return FirstCase; } 2348 void setSwitchCaseList(SwitchCase *SC) { FirstCase = SC; } 2349 2350 SourceLocation getSwitchLoc() const { return SwitchStmtBits.SwitchLoc; } 2351 void setSwitchLoc(SourceLocation L) { SwitchStmtBits.SwitchLoc = L; } 2352 SourceLocation getLParenLoc() const { return LParenLoc; } 2353 void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; } 2354 SourceLocation getRParenLoc() const { return RParenLoc; } 2355 void setRParenLoc(SourceLocation Loc) { RParenLoc = Loc; } 2356 2357 void setBody(Stmt *S, SourceLocation SL) { 2358 setBody(S); 2359 setSwitchLoc(SL); 2360 } 2361 2362 void addSwitchCase(SwitchCase *SC) { 2363 assert(!SC->getNextSwitchCase() && 2364 "case/default already added to a switch"); 2365 SC->setNextSwitchCase(FirstCase); 2366 FirstCase = SC; 2367 } 2368 2369 /// Set a flag in the SwitchStmt indicating that if the 'switch (X)' is a 2370 /// switch over an enum value then all cases have been explicitly covered. 2371 void setAllEnumCasesCovered() { SwitchStmtBits.AllEnumCasesCovered = true; } 2372 2373 /// Returns true if the SwitchStmt is a switch of an enum value and all cases 2374 /// have been explicitly covered. 2375 bool isAllEnumCasesCovered() const { 2376 return SwitchStmtBits.AllEnumCasesCovered; 2377 } 2378 2379 SourceLocation getBeginLoc() const { return getSwitchLoc(); } 2380 SourceLocation getEndLoc() const LLVM_READONLY { 2381 return getBody() ? getBody()->getEndLoc() 2382 : reinterpret_cast<const Stmt *>(getCond())->getEndLoc(); 2383 } 2384 2385 // Iterators 2386 child_range children() { 2387 return child_range(getTrailingObjects<Stmt *>(), 2388 getTrailingObjects<Stmt *>() + 2389 numTrailingObjects(OverloadToken<Stmt *>())); 2390 } 2391 2392 const_child_range children() const { 2393 return const_child_range(getTrailingObjects<Stmt *>(), 2394 getTrailingObjects<Stmt *>() + 2395 numTrailingObjects(OverloadToken<Stmt *>())); 2396 } 2397 2398 static bool classof(const Stmt *T) { 2399 return T->getStmtClass() == SwitchStmtClass; 2400 } 2401 }; 2402 2403 /// WhileStmt - This represents a 'while' stmt. 2404 class WhileStmt final : public Stmt, 2405 private llvm::TrailingObjects<WhileStmt, Stmt *> { 2406 friend TrailingObjects; 2407 2408 // WhileStmt is followed by several trailing objects, 2409 // some of which optional. Note that it would be more 2410 // convenient to put the optional trailing object at the end 2411 // but this would affect children(). 2412 // The trailing objects are in order: 2413 // 2414 // * A "Stmt *" for the condition variable. 2415 // Present if and only if hasVarStorage(). This is in fact a "DeclStmt *". 2416 // 2417 // * A "Stmt *" for the condition. 2418 // Always present. This is in fact an "Expr *". 2419 // 2420 // * A "Stmt *" for the body. 2421 // Always present. 2422 // 2423 enum { VarOffset = 0, BodyOffsetFromCond = 1 }; 2424 enum { NumMandatoryStmtPtr = 2 }; 2425 2426 SourceLocation LParenLoc, RParenLoc; 2427 2428 unsigned varOffset() const { return VarOffset; } 2429 unsigned condOffset() const { return VarOffset + hasVarStorage(); } 2430 unsigned bodyOffset() const { return condOffset() + BodyOffsetFromCond; } 2431 2432 unsigned numTrailingObjects(OverloadToken<Stmt *>) const { 2433 return NumMandatoryStmtPtr + hasVarStorage(); 2434 } 2435 2436 /// Build a while statement. 2437 WhileStmt(const ASTContext &Ctx, VarDecl *Var, Expr *Cond, Stmt *Body, 2438 SourceLocation WL, SourceLocation LParenLoc, 2439 SourceLocation RParenLoc); 2440 2441 /// Build an empty while statement. 2442 explicit WhileStmt(EmptyShell Empty, bool HasVar); 2443 2444 public: 2445 /// Create a while statement. 2446 static WhileStmt *Create(const ASTContext &Ctx, VarDecl *Var, Expr *Cond, 2447 Stmt *Body, SourceLocation WL, 2448 SourceLocation LParenLoc, SourceLocation RParenLoc); 2449 2450 /// Create an empty while statement optionally with storage for 2451 /// a condition variable. 2452 static WhileStmt *CreateEmpty(const ASTContext &Ctx, bool HasVar); 2453 2454 /// True if this WhileStmt has storage for a condition variable. 2455 bool hasVarStorage() const { return WhileStmtBits.HasVar; } 2456 2457 Expr *getCond() { 2458 return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]); 2459 } 2460 2461 const Expr *getCond() const { 2462 return reinterpret_cast<Expr *>(getTrailingObjects<Stmt *>()[condOffset()]); 2463 } 2464 2465 void setCond(Expr *Cond) { 2466 getTrailingObjects<Stmt *>()[condOffset()] = reinterpret_cast<Stmt *>(Cond); 2467 } 2468 2469 Stmt *getBody() { return getTrailingObjects<Stmt *>()[bodyOffset()]; } 2470 const Stmt *getBody() const { 2471 return getTrailingObjects<Stmt *>()[bodyOffset()]; 2472 } 2473 2474 void setBody(Stmt *Body) { 2475 getTrailingObjects<Stmt *>()[bodyOffset()] = Body; 2476 } 2477 2478 /// Retrieve the variable declared in this "while" statement, if any. 2479 /// 2480 /// In the following example, "x" is the condition variable. 2481 /// \code 2482 /// while (int x = random()) { 2483 /// // ... 2484 /// } 2485 /// \endcode 2486 VarDecl *getConditionVariable(); 2487 const VarDecl *getConditionVariable() const { 2488 return const_cast<WhileStmt *>(this)->getConditionVariable(); 2489 } 2490 2491 /// Set the condition variable of this while statement. 2492 /// The while statement must have storage for it. 2493 void setConditionVariable(const ASTContext &Ctx, VarDecl *V); 2494 2495 /// If this WhileStmt has a condition variable, return the faux DeclStmt 2496 /// associated with the creation of that condition variable. 2497 DeclStmt *getConditionVariableDeclStmt() { 2498 return hasVarStorage() ? static_cast<DeclStmt *>( 2499 getTrailingObjects<Stmt *>()[varOffset()]) 2500 : nullptr; 2501 } 2502 2503 const DeclStmt *getConditionVariableDeclStmt() const { 2504 return hasVarStorage() ? static_cast<DeclStmt *>( 2505 getTrailingObjects<Stmt *>()[varOffset()]) 2506 : nullptr; 2507 } 2508 2509 void setConditionVariableDeclStmt(DeclStmt *CondVar) { 2510 assert(hasVarStorage()); 2511 getTrailingObjects<Stmt *>()[varOffset()] = CondVar; 2512 } 2513 2514 SourceLocation getWhileLoc() const { return WhileStmtBits.WhileLoc; } 2515 void setWhileLoc(SourceLocation L) { WhileStmtBits.WhileLoc = L; } 2516 2517 SourceLocation getLParenLoc() const { return LParenLoc; } 2518 void setLParenLoc(SourceLocation L) { LParenLoc = L; } 2519 SourceLocation getRParenLoc() const { return RParenLoc; } 2520 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 2521 2522 SourceLocation getBeginLoc() const { return getWhileLoc(); } 2523 SourceLocation getEndLoc() const LLVM_READONLY { 2524 return getBody()->getEndLoc(); 2525 } 2526 2527 static bool classof(const Stmt *T) { 2528 return T->getStmtClass() == WhileStmtClass; 2529 } 2530 2531 // Iterators 2532 child_range children() { 2533 return child_range(getTrailingObjects<Stmt *>(), 2534 getTrailingObjects<Stmt *>() + 2535 numTrailingObjects(OverloadToken<Stmt *>())); 2536 } 2537 2538 const_child_range children() const { 2539 return const_child_range(getTrailingObjects<Stmt *>(), 2540 getTrailingObjects<Stmt *>() + 2541 numTrailingObjects(OverloadToken<Stmt *>())); 2542 } 2543 }; 2544 2545 /// DoStmt - This represents a 'do/while' stmt. 2546 class DoStmt : public Stmt { 2547 enum { BODY, COND, END_EXPR }; 2548 Stmt *SubExprs[END_EXPR]; 2549 SourceLocation WhileLoc; 2550 SourceLocation RParenLoc; // Location of final ')' in do stmt condition. 2551 2552 public: 2553 DoStmt(Stmt *Body, Expr *Cond, SourceLocation DL, SourceLocation WL, 2554 SourceLocation RP) 2555 : Stmt(DoStmtClass), WhileLoc(WL), RParenLoc(RP) { 2556 setCond(Cond); 2557 setBody(Body); 2558 setDoLoc(DL); 2559 } 2560 2561 /// Build an empty do-while statement. 2562 explicit DoStmt(EmptyShell Empty) : Stmt(DoStmtClass, Empty) {} 2563 2564 Expr *getCond() { return reinterpret_cast<Expr *>(SubExprs[COND]); } 2565 const Expr *getCond() const { 2566 return reinterpret_cast<Expr *>(SubExprs[COND]); 2567 } 2568 2569 void setCond(Expr *Cond) { SubExprs[COND] = reinterpret_cast<Stmt *>(Cond); } 2570 2571 Stmt *getBody() { return SubExprs[BODY]; } 2572 const Stmt *getBody() const { return SubExprs[BODY]; } 2573 void setBody(Stmt *Body) { SubExprs[BODY] = Body; } 2574 2575 SourceLocation getDoLoc() const { return DoStmtBits.DoLoc; } 2576 void setDoLoc(SourceLocation L) { DoStmtBits.DoLoc = L; } 2577 SourceLocation getWhileLoc() const { return WhileLoc; } 2578 void setWhileLoc(SourceLocation L) { WhileLoc = L; } 2579 SourceLocation getRParenLoc() const { return RParenLoc; } 2580 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 2581 2582 SourceLocation getBeginLoc() const { return getDoLoc(); } 2583 SourceLocation getEndLoc() const { return getRParenLoc(); } 2584 2585 static bool classof(const Stmt *T) { 2586 return T->getStmtClass() == DoStmtClass; 2587 } 2588 2589 // Iterators 2590 child_range children() { 2591 return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); 2592 } 2593 2594 const_child_range children() const { 2595 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); 2596 } 2597 }; 2598 2599 /// ForStmt - This represents a 'for (init;cond;inc)' stmt. Note that any of 2600 /// the init/cond/inc parts of the ForStmt will be null if they were not 2601 /// specified in the source. 2602 class ForStmt : public Stmt { 2603 friend class ASTStmtReader; 2604 2605 enum { INIT, CONDVAR, COND, INC, BODY, END_EXPR }; 2606 Stmt* SubExprs[END_EXPR]; // SubExprs[INIT] is an expression or declstmt. 2607 SourceLocation LParenLoc, RParenLoc; 2608 2609 public: 2610 ForStmt(const ASTContext &C, Stmt *Init, Expr *Cond, VarDecl *condVar, 2611 Expr *Inc, Stmt *Body, SourceLocation FL, SourceLocation LP, 2612 SourceLocation RP); 2613 2614 /// Build an empty for statement. 2615 explicit ForStmt(EmptyShell Empty) : Stmt(ForStmtClass, Empty) {} 2616 2617 Stmt *getInit() { return SubExprs[INIT]; } 2618 2619 /// Retrieve the variable declared in this "for" statement, if any. 2620 /// 2621 /// In the following example, "y" is the condition variable. 2622 /// \code 2623 /// for (int x = random(); int y = mangle(x); ++x) { 2624 /// // ... 2625 /// } 2626 /// \endcode 2627 VarDecl *getConditionVariable() const; 2628 void setConditionVariable(const ASTContext &C, VarDecl *V); 2629 2630 /// If this ForStmt has a condition variable, return the faux DeclStmt 2631 /// associated with the creation of that condition variable. 2632 DeclStmt *getConditionVariableDeclStmt() { 2633 return reinterpret_cast<DeclStmt*>(SubExprs[CONDVAR]); 2634 } 2635 2636 const DeclStmt *getConditionVariableDeclStmt() const { 2637 return reinterpret_cast<DeclStmt*>(SubExprs[CONDVAR]); 2638 } 2639 2640 void setConditionVariableDeclStmt(DeclStmt *CondVar) { 2641 SubExprs[CONDVAR] = CondVar; 2642 } 2643 2644 Expr *getCond() { return reinterpret_cast<Expr*>(SubExprs[COND]); } 2645 Expr *getInc() { return reinterpret_cast<Expr*>(SubExprs[INC]); } 2646 Stmt *getBody() { return SubExprs[BODY]; } 2647 2648 const Stmt *getInit() const { return SubExprs[INIT]; } 2649 const Expr *getCond() const { return reinterpret_cast<Expr*>(SubExprs[COND]);} 2650 const Expr *getInc() const { return reinterpret_cast<Expr*>(SubExprs[INC]); } 2651 const Stmt *getBody() const { return SubExprs[BODY]; } 2652 2653 void setInit(Stmt *S) { SubExprs[INIT] = S; } 2654 void setCond(Expr *E) { SubExprs[COND] = reinterpret_cast<Stmt*>(E); } 2655 void setInc(Expr *E) { SubExprs[INC] = reinterpret_cast<Stmt*>(E); } 2656 void setBody(Stmt *S) { SubExprs[BODY] = S; } 2657 2658 SourceLocation getForLoc() const { return ForStmtBits.ForLoc; } 2659 void setForLoc(SourceLocation L) { ForStmtBits.ForLoc = L; } 2660 SourceLocation getLParenLoc() const { return LParenLoc; } 2661 void setLParenLoc(SourceLocation L) { LParenLoc = L; } 2662 SourceLocation getRParenLoc() const { return RParenLoc; } 2663 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 2664 2665 SourceLocation getBeginLoc() const { return getForLoc(); } 2666 SourceLocation getEndLoc() const { return getBody()->getEndLoc(); } 2667 2668 static bool classof(const Stmt *T) { 2669 return T->getStmtClass() == ForStmtClass; 2670 } 2671 2672 // Iterators 2673 child_range children() { 2674 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); 2675 } 2676 2677 const_child_range children() const { 2678 return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); 2679 } 2680 }; 2681 2682 /// GotoStmt - This represents a direct goto. 2683 class GotoStmt : public Stmt { 2684 LabelDecl *Label; 2685 SourceLocation LabelLoc; 2686 2687 public: 2688 GotoStmt(LabelDecl *label, SourceLocation GL, SourceLocation LL) 2689 : Stmt(GotoStmtClass), Label(label), LabelLoc(LL) { 2690 setGotoLoc(GL); 2691 } 2692 2693 /// Build an empty goto statement. 2694 explicit GotoStmt(EmptyShell Empty) : Stmt(GotoStmtClass, Empty) {} 2695 2696 LabelDecl *getLabel() const { return Label; } 2697 void setLabel(LabelDecl *D) { Label = D; } 2698 2699 SourceLocation getGotoLoc() const { return GotoStmtBits.GotoLoc; } 2700 void setGotoLoc(SourceLocation L) { GotoStmtBits.GotoLoc = L; } 2701 SourceLocation getLabelLoc() const { return LabelLoc; } 2702 void setLabelLoc(SourceLocation L) { LabelLoc = L; } 2703 2704 SourceLocation getBeginLoc() const { return getGotoLoc(); } 2705 SourceLocation getEndLoc() const { return getLabelLoc(); } 2706 2707 static bool classof(const Stmt *T) { 2708 return T->getStmtClass() == GotoStmtClass; 2709 } 2710 2711 // Iterators 2712 child_range children() { 2713 return child_range(child_iterator(), child_iterator()); 2714 } 2715 2716 const_child_range children() const { 2717 return const_child_range(const_child_iterator(), const_child_iterator()); 2718 } 2719 }; 2720 2721 /// IndirectGotoStmt - This represents an indirect goto. 2722 class IndirectGotoStmt : public Stmt { 2723 SourceLocation StarLoc; 2724 Stmt *Target; 2725 2726 public: 2727 IndirectGotoStmt(SourceLocation gotoLoc, SourceLocation starLoc, Expr *target) 2728 : Stmt(IndirectGotoStmtClass), StarLoc(starLoc) { 2729 setTarget(target); 2730 setGotoLoc(gotoLoc); 2731 } 2732 2733 /// Build an empty indirect goto statement. 2734 explicit IndirectGotoStmt(EmptyShell Empty) 2735 : Stmt(IndirectGotoStmtClass, Empty) {} 2736 2737 void setGotoLoc(SourceLocation L) { GotoStmtBits.GotoLoc = L; } 2738 SourceLocation getGotoLoc() const { return GotoStmtBits.GotoLoc; } 2739 void setStarLoc(SourceLocation L) { StarLoc = L; } 2740 SourceLocation getStarLoc() const { return StarLoc; } 2741 2742 Expr *getTarget() { return reinterpret_cast<Expr *>(Target); } 2743 const Expr *getTarget() const { 2744 return reinterpret_cast<const Expr *>(Target); 2745 } 2746 void setTarget(Expr *E) { Target = reinterpret_cast<Stmt *>(E); } 2747 2748 /// getConstantTarget - Returns the fixed target of this indirect 2749 /// goto, if one exists. 2750 LabelDecl *getConstantTarget(); 2751 const LabelDecl *getConstantTarget() const { 2752 return const_cast<IndirectGotoStmt *>(this)->getConstantTarget(); 2753 } 2754 2755 SourceLocation getBeginLoc() const { return getGotoLoc(); } 2756 SourceLocation getEndLoc() const LLVM_READONLY { return Target->getEndLoc(); } 2757 2758 static bool classof(const Stmt *T) { 2759 return T->getStmtClass() == IndirectGotoStmtClass; 2760 } 2761 2762 // Iterators 2763 child_range children() { return child_range(&Target, &Target + 1); } 2764 2765 const_child_range children() const { 2766 return const_child_range(&Target, &Target + 1); 2767 } 2768 }; 2769 2770 /// ContinueStmt - This represents a continue. 2771 class ContinueStmt : public Stmt { 2772 public: 2773 ContinueStmt(SourceLocation CL) : Stmt(ContinueStmtClass) { 2774 setContinueLoc(CL); 2775 } 2776 2777 /// Build an empty continue statement. 2778 explicit ContinueStmt(EmptyShell Empty) : Stmt(ContinueStmtClass, Empty) {} 2779 2780 SourceLocation getContinueLoc() const { return ContinueStmtBits.ContinueLoc; } 2781 void setContinueLoc(SourceLocation L) { ContinueStmtBits.ContinueLoc = L; } 2782 2783 SourceLocation getBeginLoc() const { return getContinueLoc(); } 2784 SourceLocation getEndLoc() const { return getContinueLoc(); } 2785 2786 static bool classof(const Stmt *T) { 2787 return T->getStmtClass() == ContinueStmtClass; 2788 } 2789 2790 // Iterators 2791 child_range children() { 2792 return child_range(child_iterator(), child_iterator()); 2793 } 2794 2795 const_child_range children() const { 2796 return const_child_range(const_child_iterator(), const_child_iterator()); 2797 } 2798 }; 2799 2800 /// BreakStmt - This represents a break. 2801 class BreakStmt : public Stmt { 2802 public: 2803 BreakStmt(SourceLocation BL) : Stmt(BreakStmtClass) { 2804 setBreakLoc(BL); 2805 } 2806 2807 /// Build an empty break statement. 2808 explicit BreakStmt(EmptyShell Empty) : Stmt(BreakStmtClass, Empty) {} 2809 2810 SourceLocation getBreakLoc() const { return BreakStmtBits.BreakLoc; } 2811 void setBreakLoc(SourceLocation L) { BreakStmtBits.BreakLoc = L; } 2812 2813 SourceLocation getBeginLoc() const { return getBreakLoc(); } 2814 SourceLocation getEndLoc() const { return getBreakLoc(); } 2815 2816 static bool classof(const Stmt *T) { 2817 return T->getStmtClass() == BreakStmtClass; 2818 } 2819 2820 // Iterators 2821 child_range children() { 2822 return child_range(child_iterator(), child_iterator()); 2823 } 2824 2825 const_child_range children() const { 2826 return const_child_range(const_child_iterator(), const_child_iterator()); 2827 } 2828 }; 2829 2830 /// ReturnStmt - This represents a return, optionally of an expression: 2831 /// return; 2832 /// return 4; 2833 /// 2834 /// Note that GCC allows return with no argument in a function declared to 2835 /// return a value, and it allows returning a value in functions declared to 2836 /// return void. We explicitly model this in the AST, which means you can't 2837 /// depend on the return type of the function and the presence of an argument. 2838 class ReturnStmt final 2839 : public Stmt, 2840 private llvm::TrailingObjects<ReturnStmt, const VarDecl *> { 2841 friend TrailingObjects; 2842 2843 /// The return expression. 2844 Stmt *RetExpr; 2845 2846 // ReturnStmt is followed optionally by a trailing "const VarDecl *" 2847 // for the NRVO candidate. Present if and only if hasNRVOCandidate(). 2848 2849 /// True if this ReturnStmt has storage for an NRVO candidate. 2850 bool hasNRVOCandidate() const { return ReturnStmtBits.HasNRVOCandidate; } 2851 2852 unsigned numTrailingObjects(OverloadToken<const VarDecl *>) const { 2853 return hasNRVOCandidate(); 2854 } 2855 2856 /// Build a return statement. 2857 ReturnStmt(SourceLocation RL, Expr *E, const VarDecl *NRVOCandidate); 2858 2859 /// Build an empty return statement. 2860 explicit ReturnStmt(EmptyShell Empty, bool HasNRVOCandidate); 2861 2862 public: 2863 /// Create a return statement. 2864 static ReturnStmt *Create(const ASTContext &Ctx, SourceLocation RL, Expr *E, 2865 const VarDecl *NRVOCandidate); 2866 2867 /// Create an empty return statement, optionally with 2868 /// storage for an NRVO candidate. 2869 static ReturnStmt *CreateEmpty(const ASTContext &Ctx, bool HasNRVOCandidate); 2870 2871 Expr *getRetValue() { return reinterpret_cast<Expr *>(RetExpr); } 2872 const Expr *getRetValue() const { return reinterpret_cast<Expr *>(RetExpr); } 2873 void setRetValue(Expr *E) { RetExpr = reinterpret_cast<Stmt *>(E); } 2874 2875 /// Retrieve the variable that might be used for the named return 2876 /// value optimization. 2877 /// 2878 /// The optimization itself can only be performed if the variable is 2879 /// also marked as an NRVO object. 2880 const VarDecl *getNRVOCandidate() const { 2881 return hasNRVOCandidate() ? *getTrailingObjects<const VarDecl *>() 2882 : nullptr; 2883 } 2884 2885 /// Set the variable that might be used for the named return value 2886 /// optimization. The return statement must have storage for it, 2887 /// which is the case if and only if hasNRVOCandidate() is true. 2888 void setNRVOCandidate(const VarDecl *Var) { 2889 assert(hasNRVOCandidate() && 2890 "This return statement has no storage for an NRVO candidate!"); 2891 *getTrailingObjects<const VarDecl *>() = Var; 2892 } 2893 2894 SourceLocation getReturnLoc() const { return ReturnStmtBits.RetLoc; } 2895 void setReturnLoc(SourceLocation L) { ReturnStmtBits.RetLoc = L; } 2896 2897 SourceLocation getBeginLoc() const { return getReturnLoc(); } 2898 SourceLocation getEndLoc() const LLVM_READONLY { 2899 return RetExpr ? RetExpr->getEndLoc() : getReturnLoc(); 2900 } 2901 2902 static bool classof(const Stmt *T) { 2903 return T->getStmtClass() == ReturnStmtClass; 2904 } 2905 2906 // Iterators 2907 child_range children() { 2908 if (RetExpr) 2909 return child_range(&RetExpr, &RetExpr + 1); 2910 return child_range(child_iterator(), child_iterator()); 2911 } 2912 2913 const_child_range children() const { 2914 if (RetExpr) 2915 return const_child_range(&RetExpr, &RetExpr + 1); 2916 return const_child_range(const_child_iterator(), const_child_iterator()); 2917 } 2918 }; 2919 2920 /// AsmStmt is the base class for GCCAsmStmt and MSAsmStmt. 2921 class AsmStmt : public Stmt { 2922 protected: 2923 friend class ASTStmtReader; 2924 2925 SourceLocation AsmLoc; 2926 2927 /// True if the assembly statement does not have any input or output 2928 /// operands. 2929 bool IsSimple; 2930 2931 /// If true, treat this inline assembly as having side effects. 2932 /// This assembly statement should not be optimized, deleted or moved. 2933 bool IsVolatile; 2934 2935 unsigned NumOutputs; 2936 unsigned NumInputs; 2937 unsigned NumClobbers; 2938 2939 Stmt **Exprs = nullptr; 2940 2941 AsmStmt(StmtClass SC, SourceLocation asmloc, bool issimple, bool isvolatile, 2942 unsigned numoutputs, unsigned numinputs, unsigned numclobbers) 2943 : Stmt (SC), AsmLoc(asmloc), IsSimple(issimple), IsVolatile(isvolatile), 2944 NumOutputs(numoutputs), NumInputs(numinputs), 2945 NumClobbers(numclobbers) {} 2946 2947 public: 2948 /// Build an empty inline-assembly statement. 2949 explicit AsmStmt(StmtClass SC, EmptyShell Empty) : Stmt(SC, Empty) {} 2950 2951 SourceLocation getAsmLoc() const { return AsmLoc; } 2952 void setAsmLoc(SourceLocation L) { AsmLoc = L; } 2953 2954 bool isSimple() const { return IsSimple; } 2955 void setSimple(bool V) { IsSimple = V; } 2956 2957 bool isVolatile() const { return IsVolatile; } 2958 void setVolatile(bool V) { IsVolatile = V; } 2959 2960 SourceLocation getBeginLoc() const LLVM_READONLY { return {}; } 2961 SourceLocation getEndLoc() const LLVM_READONLY { return {}; } 2962 2963 //===--- Asm String Analysis ---===// 2964 2965 /// Assemble final IR asm string. 2966 std::string generateAsmString(const ASTContext &C) const; 2967 2968 //===--- Output operands ---===// 2969 2970 unsigned getNumOutputs() const { return NumOutputs; } 2971 2972 /// getOutputConstraint - Return the constraint string for the specified 2973 /// output operand. All output constraints are known to be non-empty (either 2974 /// '=' or '+'). 2975 StringRef getOutputConstraint(unsigned i) const; 2976 2977 /// isOutputPlusConstraint - Return true if the specified output constraint 2978 /// is a "+" constraint (which is both an input and an output) or false if it 2979 /// is an "=" constraint (just an output). 2980 bool isOutputPlusConstraint(unsigned i) const { 2981 return getOutputConstraint(i)[0] == '+'; 2982 } 2983 2984 const Expr *getOutputExpr(unsigned i) const; 2985 2986 /// getNumPlusOperands - Return the number of output operands that have a "+" 2987 /// constraint. 2988 unsigned getNumPlusOperands() const; 2989 2990 //===--- Input operands ---===// 2991 2992 unsigned getNumInputs() const { return NumInputs; } 2993 2994 /// getInputConstraint - Return the specified input constraint. Unlike output 2995 /// constraints, these can be empty. 2996 StringRef getInputConstraint(unsigned i) const; 2997 2998 const Expr *getInputExpr(unsigned i) const; 2999 3000 //===--- Other ---===// 3001 3002 unsigned getNumClobbers() const { return NumClobbers; } 3003 StringRef getClobber(unsigned i) const; 3004 3005 static bool classof(const Stmt *T) { 3006 return T->getStmtClass() == GCCAsmStmtClass || 3007 T->getStmtClass() == MSAsmStmtClass; 3008 } 3009 3010 // Input expr iterators. 3011 3012 using inputs_iterator = ExprIterator; 3013 using const_inputs_iterator = ConstExprIterator; 3014 using inputs_range = llvm::iterator_range<inputs_iterator>; 3015 using inputs_const_range = llvm::iterator_range<const_inputs_iterator>; 3016 3017 inputs_iterator begin_inputs() { 3018 return &Exprs[0] + NumOutputs; 3019 } 3020 3021 inputs_iterator end_inputs() { 3022 return &Exprs[0] + NumOutputs + NumInputs; 3023 } 3024 3025 inputs_range inputs() { return inputs_range(begin_inputs(), end_inputs()); } 3026 3027 const_inputs_iterator begin_inputs() const { 3028 return &Exprs[0] + NumOutputs; 3029 } 3030 3031 const_inputs_iterator end_inputs() const { 3032 return &Exprs[0] + NumOutputs + NumInputs; 3033 } 3034 3035 inputs_const_range inputs() const { 3036 return inputs_const_range(begin_inputs(), end_inputs()); 3037 } 3038 3039 // Output expr iterators. 3040 3041 using outputs_iterator = ExprIterator; 3042 using const_outputs_iterator = ConstExprIterator; 3043 using outputs_range = llvm::iterator_range<outputs_iterator>; 3044 using outputs_const_range = llvm::iterator_range<const_outputs_iterator>; 3045 3046 outputs_iterator begin_outputs() { 3047 return &Exprs[0]; 3048 } 3049 3050 outputs_iterator end_outputs() { 3051 return &Exprs[0] + NumOutputs; 3052 } 3053 3054 outputs_range outputs() { 3055 return outputs_range(begin_outputs(), end_outputs()); 3056 } 3057 3058 const_outputs_iterator begin_outputs() const { 3059 return &Exprs[0]; 3060 } 3061 3062 const_outputs_iterator end_outputs() const { 3063 return &Exprs[0] + NumOutputs; 3064 } 3065 3066 outputs_const_range outputs() const { 3067 return outputs_const_range(begin_outputs(), end_outputs()); 3068 } 3069 3070 child_range children() { 3071 return child_range(&Exprs[0], &Exprs[0] + NumOutputs + NumInputs); 3072 } 3073 3074 const_child_range children() const { 3075 return const_child_range(&Exprs[0], &Exprs[0] + NumOutputs + NumInputs); 3076 } 3077 }; 3078 3079 /// This represents a GCC inline-assembly statement extension. 3080 class GCCAsmStmt : public AsmStmt { 3081 friend class ASTStmtReader; 3082 3083 SourceLocation RParenLoc; 3084 StringLiteral *AsmStr; 3085 3086 // FIXME: If we wanted to, we could allocate all of these in one big array. 3087 StringLiteral **Constraints = nullptr; 3088 StringLiteral **Clobbers = nullptr; 3089 IdentifierInfo **Names = nullptr; 3090 unsigned NumLabels = 0; 3091 3092 public: 3093 GCCAsmStmt(const ASTContext &C, SourceLocation asmloc, bool issimple, 3094 bool isvolatile, unsigned numoutputs, unsigned numinputs, 3095 IdentifierInfo **names, StringLiteral **constraints, Expr **exprs, 3096 StringLiteral *asmstr, unsigned numclobbers, 3097 StringLiteral **clobbers, unsigned numlabels, 3098 SourceLocation rparenloc); 3099 3100 /// Build an empty inline-assembly statement. 3101 explicit GCCAsmStmt(EmptyShell Empty) : AsmStmt(GCCAsmStmtClass, Empty) {} 3102 3103 SourceLocation getRParenLoc() const { return RParenLoc; } 3104 void setRParenLoc(SourceLocation L) { RParenLoc = L; } 3105 3106 //===--- Asm String Analysis ---===// 3107 3108 const StringLiteral *getAsmString() const { return AsmStr; } 3109 StringLiteral *getAsmString() { return AsmStr; } 3110 void setAsmString(StringLiteral *E) { AsmStr = E; } 3111 3112 /// AsmStringPiece - this is part of a decomposed asm string specification 3113 /// (for use with the AnalyzeAsmString function below). An asm string is 3114 /// considered to be a concatenation of these parts. 3115 class AsmStringPiece { 3116 public: 3117 enum Kind { 3118 String, // String in .ll asm string form, "$" -> "$$" and "%%" -> "%". 3119 Operand // Operand reference, with optional modifier %c4. 3120 }; 3121 3122 private: 3123 Kind MyKind; 3124 std::string Str; 3125 unsigned OperandNo; 3126 3127 // Source range for operand references. 3128 CharSourceRange Range; 3129 3130 public: 3131 AsmStringPiece(const std::string &S) : MyKind(String), Str(S) {} 3132 AsmStringPiece(unsigned OpNo, const std::string &S, SourceLocation Begin, 3133 SourceLocation End) 3134 : MyKind(Operand), Str(S), OperandNo(OpNo), 3135 Range(CharSourceRange::getCharRange(Begin, End)) {} 3136 3137 bool isString() const { return MyKind == String; } 3138 bool isOperand() const { return MyKind == Operand; } 3139 3140 const std::string &getString() const { return Str; } 3141 3142 unsigned getOperandNo() const { 3143 assert(isOperand()); 3144 return OperandNo; 3145 } 3146 3147 CharSourceRange getRange() const { 3148 assert(isOperand() && "Range is currently used only for Operands."); 3149 return Range; 3150 } 3151 3152 /// getModifier - Get the modifier for this operand, if present. This 3153 /// returns '\0' if there was no modifier. 3154 char getModifier() const; 3155 }; 3156 3157 /// AnalyzeAsmString - Analyze the asm string of the current asm, decomposing 3158 /// it into pieces. If the asm string is erroneous, emit errors and return 3159 /// true, otherwise return false. This handles canonicalization and 3160 /// translation of strings from GCC syntax to LLVM IR syntax, and handles 3161 //// flattening of named references like %[foo] to Operand AsmStringPiece's. 3162 unsigned AnalyzeAsmString(SmallVectorImpl<AsmStringPiece> &Pieces, 3163 const ASTContext &C, unsigned &DiagOffs) const; 3164 3165 /// Assemble final IR asm string. 3166 std::string generateAsmString(const ASTContext &C) const; 3167 3168 //===--- Output operands ---===// 3169 3170 IdentifierInfo *getOutputIdentifier(unsigned i) const { return Names[i]; } 3171 3172 StringRef getOutputName(unsigned i) const { 3173 if (IdentifierInfo *II = getOutputIdentifier(i)) 3174 return II->getName(); 3175 3176 return {}; 3177 } 3178 3179 StringRef getOutputConstraint(unsigned i) const; 3180 3181 const StringLiteral *getOutputConstraintLiteral(unsigned i) const { 3182 return Constraints[i]; 3183 } 3184 StringLiteral *getOutputConstraintLiteral(unsigned i) { 3185 return Constraints[i]; 3186 } 3187 3188 Expr *getOutputExpr(unsigned i); 3189 3190 const Expr *getOutputExpr(unsigned i) const { 3191 return const_cast<GCCAsmStmt*>(this)->getOutputExpr(i); 3192 } 3193 3194 //===--- Input operands ---===// 3195 3196 IdentifierInfo *getInputIdentifier(unsigned i) const { 3197 return Names[i + NumOutputs]; 3198 } 3199 3200 StringRef getInputName(unsigned i) const { 3201 if (IdentifierInfo *II = getInputIdentifier(i)) 3202 return II->getName(); 3203 3204 return {}; 3205 } 3206 3207 StringRef getInputConstraint(unsigned i) const; 3208 3209 const StringLiteral *getInputConstraintLiteral(unsigned i) const { 3210 return Constraints[i + NumOutputs]; 3211 } 3212 StringLiteral *getInputConstraintLiteral(unsigned i) { 3213 return Constraints[i + NumOutputs]; 3214 } 3215 3216 Expr *getInputExpr(unsigned i); 3217 void setInputExpr(unsigned i, Expr *E); 3218 3219 const Expr *getInputExpr(unsigned i) const { 3220 return const_cast<GCCAsmStmt*>(this)->getInputExpr(i); 3221 } 3222 3223 //===--- Labels ---===// 3224 3225 bool isAsmGoto() const { 3226 return NumLabels > 0; 3227 } 3228 3229 unsigned getNumLabels() const { 3230 return NumLabels; 3231 } 3232 3233 IdentifierInfo *getLabelIdentifier(unsigned i) const { 3234 return Names[i + NumOutputs + NumInputs]; 3235 } 3236 3237 AddrLabelExpr *getLabelExpr(unsigned i) const; 3238 StringRef getLabelName(unsigned i) const; 3239 using labels_iterator = CastIterator<AddrLabelExpr>; 3240 using const_labels_iterator = ConstCastIterator<AddrLabelExpr>; 3241 using labels_range = llvm::iterator_range<labels_iterator>; 3242 using labels_const_range = llvm::iterator_range<const_labels_iterator>; 3243 3244 labels_iterator begin_labels() { 3245 return &Exprs[0] + NumOutputs + NumInputs; 3246 } 3247 3248 labels_iterator end_labels() { 3249 return &Exprs[0] + NumOutputs + NumInputs + NumLabels; 3250 } 3251 3252 labels_range labels() { 3253 return labels_range(begin_labels(), end_labels()); 3254 } 3255 3256 const_labels_iterator begin_labels() const { 3257 return &Exprs[0] + NumOutputs + NumInputs; 3258 } 3259 3260 const_labels_iterator end_labels() const { 3261 return &Exprs[0] + NumOutputs + NumInputs + NumLabels; 3262 } 3263 3264 labels_const_range labels() const { 3265 return labels_const_range(begin_labels(), end_labels()); 3266 } 3267 3268 private: 3269 void setOutputsAndInputsAndClobbers(const ASTContext &C, 3270 IdentifierInfo **Names, 3271 StringLiteral **Constraints, 3272 Stmt **Exprs, 3273 unsigned NumOutputs, 3274 unsigned NumInputs, 3275 unsigned NumLabels, 3276 StringLiteral **Clobbers, 3277 unsigned NumClobbers); 3278 3279 public: 3280 //===--- Other ---===// 3281 3282 /// getNamedOperand - Given a symbolic operand reference like %[foo], 3283 /// translate this into a numeric value needed to reference the same operand. 3284 /// This returns -1 if the operand name is invalid. 3285 int getNamedOperand(StringRef SymbolicName) const; 3286 3287 StringRef getClobber(unsigned i) const; 3288 3289 StringLiteral *getClobberStringLiteral(unsigned i) { return Clobbers[i]; } 3290 const StringLiteral *getClobberStringLiteral(unsigned i) const { 3291 return Clobbers[i]; 3292 } 3293 3294 SourceLocation getBeginLoc() const LLVM_READONLY { return AsmLoc; } 3295 SourceLocation getEndLoc() const LLVM_READONLY { return RParenLoc; } 3296 3297 static bool classof(const Stmt *T) { 3298 return T->getStmtClass() == GCCAsmStmtClass; 3299 } 3300 }; 3301 3302 /// This represents a Microsoft inline-assembly statement extension. 3303 class MSAsmStmt : public AsmStmt { 3304 friend class ASTStmtReader; 3305 3306 SourceLocation LBraceLoc, EndLoc; 3307 StringRef AsmStr; 3308 3309 unsigned NumAsmToks = 0; 3310 3311 Token *AsmToks = nullptr; 3312 StringRef *Constraints = nullptr; 3313 StringRef *Clobbers = nullptr; 3314 3315 public: 3316 MSAsmStmt(const ASTContext &C, SourceLocation asmloc, 3317 SourceLocation lbraceloc, bool issimple, bool isvolatile, 3318 ArrayRef<Token> asmtoks, unsigned numoutputs, unsigned numinputs, 3319 ArrayRef<StringRef> constraints, 3320 ArrayRef<Expr*> exprs, StringRef asmstr, 3321 ArrayRef<StringRef> clobbers, SourceLocation endloc); 3322 3323 /// Build an empty MS-style inline-assembly statement. 3324 explicit MSAsmStmt(EmptyShell Empty) : AsmStmt(MSAsmStmtClass, Empty) {} 3325 3326 SourceLocation getLBraceLoc() const { return LBraceLoc; } 3327 void setLBraceLoc(SourceLocation L) { LBraceLoc = L; } 3328 SourceLocation getEndLoc() const { return EndLoc; } 3329 void setEndLoc(SourceLocation L) { EndLoc = L; } 3330 3331 bool hasBraces() const { return LBraceLoc.isValid(); } 3332 3333 unsigned getNumAsmToks() { return NumAsmToks; } 3334 Token *getAsmToks() { return AsmToks; } 3335 3336 //===--- Asm String Analysis ---===// 3337 StringRef getAsmString() const { return AsmStr; } 3338 3339 /// Assemble final IR asm string. 3340 std::string generateAsmString(const ASTContext &C) const; 3341 3342 //===--- Output operands ---===// 3343 3344 StringRef getOutputConstraint(unsigned i) const { 3345 assert(i < NumOutputs); 3346 return Constraints[i]; 3347 } 3348 3349 Expr *getOutputExpr(unsigned i); 3350 3351 const Expr *getOutputExpr(unsigned i) const { 3352 return const_cast<MSAsmStmt*>(this)->getOutputExpr(i); 3353 } 3354 3355 //===--- Input operands ---===// 3356 3357 StringRef getInputConstraint(unsigned i) const { 3358 assert(i < NumInputs); 3359 return Constraints[i + NumOutputs]; 3360 } 3361 3362 Expr *getInputExpr(unsigned i); 3363 void setInputExpr(unsigned i, Expr *E); 3364 3365 const Expr *getInputExpr(unsigned i) const { 3366 return const_cast<MSAsmStmt*>(this)->getInputExpr(i); 3367 } 3368 3369 //===--- Other ---===// 3370 3371 ArrayRef<StringRef> getAllConstraints() const { 3372 return llvm::ArrayRef(Constraints, NumInputs + NumOutputs); 3373 } 3374 3375 ArrayRef<StringRef> getClobbers() const { 3376 return llvm::ArrayRef(Clobbers, NumClobbers); 3377 } 3378 3379 ArrayRef<Expr*> getAllExprs() const { 3380 return llvm::ArrayRef(reinterpret_cast<Expr **>(Exprs), 3381 NumInputs + NumOutputs); 3382 } 3383 3384 StringRef getClobber(unsigned i) const { return getClobbers()[i]; } 3385 3386 private: 3387 void initialize(const ASTContext &C, StringRef AsmString, 3388 ArrayRef<Token> AsmToks, ArrayRef<StringRef> Constraints, 3389 ArrayRef<Expr*> Exprs, ArrayRef<StringRef> Clobbers); 3390 3391 public: 3392 SourceLocation getBeginLoc() const LLVM_READONLY { return AsmLoc; } 3393 3394 static bool classof(const Stmt *T) { 3395 return T->getStmtClass() == MSAsmStmtClass; 3396 } 3397 3398 child_range children() { 3399 return child_range(&Exprs[0], &Exprs[NumInputs + NumOutputs]); 3400 } 3401 3402 const_child_range children() const { 3403 return const_child_range(&Exprs[0], &Exprs[NumInputs + NumOutputs]); 3404 } 3405 }; 3406 3407 class SEHExceptStmt : public Stmt { 3408 friend class ASTReader; 3409 friend class ASTStmtReader; 3410 3411 SourceLocation Loc; 3412 Stmt *Children[2]; 3413 3414 enum { FILTER_EXPR, BLOCK }; 3415 3416 SEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, Stmt *Block); 3417 explicit SEHExceptStmt(EmptyShell E) : Stmt(SEHExceptStmtClass, E) {} 3418 3419 public: 3420 static SEHExceptStmt* Create(const ASTContext &C, 3421 SourceLocation ExceptLoc, 3422 Expr *FilterExpr, 3423 Stmt *Block); 3424 3425 SourceLocation getBeginLoc() const LLVM_READONLY { return getExceptLoc(); } 3426 3427 SourceLocation getExceptLoc() const { return Loc; } 3428 SourceLocation getEndLoc() const { return getBlock()->getEndLoc(); } 3429 3430 Expr *getFilterExpr() const { 3431 return reinterpret_cast<Expr*>(Children[FILTER_EXPR]); 3432 } 3433 3434 CompoundStmt *getBlock() const { 3435 return cast<CompoundStmt>(Children[BLOCK]); 3436 } 3437 3438 child_range children() { 3439 return child_range(Children, Children+2); 3440 } 3441 3442 const_child_range children() const { 3443 return const_child_range(Children, Children + 2); 3444 } 3445 3446 static bool classof(const Stmt *T) { 3447 return T->getStmtClass() == SEHExceptStmtClass; 3448 } 3449 }; 3450 3451 class SEHFinallyStmt : public Stmt { 3452 friend class ASTReader; 3453 friend class ASTStmtReader; 3454 3455 SourceLocation Loc; 3456 Stmt *Block; 3457 3458 SEHFinallyStmt(SourceLocation Loc, Stmt *Block); 3459 explicit SEHFinallyStmt(EmptyShell E) : Stmt(SEHFinallyStmtClass, E) {} 3460 3461 public: 3462 static SEHFinallyStmt* Create(const ASTContext &C, 3463 SourceLocation FinallyLoc, 3464 Stmt *Block); 3465 3466 SourceLocation getBeginLoc() const LLVM_READONLY { return getFinallyLoc(); } 3467 3468 SourceLocation getFinallyLoc() const { return Loc; } 3469 SourceLocation getEndLoc() const { return Block->getEndLoc(); } 3470 3471 CompoundStmt *getBlock() const { return cast<CompoundStmt>(Block); } 3472 3473 child_range children() { 3474 return child_range(&Block,&Block+1); 3475 } 3476 3477 const_child_range children() const { 3478 return const_child_range(&Block, &Block + 1); 3479 } 3480 3481 static bool classof(const Stmt *T) { 3482 return T->getStmtClass() == SEHFinallyStmtClass; 3483 } 3484 }; 3485 3486 class SEHTryStmt : public Stmt { 3487 friend class ASTReader; 3488 friend class ASTStmtReader; 3489 3490 bool IsCXXTry; 3491 SourceLocation TryLoc; 3492 Stmt *Children[2]; 3493 3494 enum { TRY = 0, HANDLER = 1 }; 3495 3496 SEHTryStmt(bool isCXXTry, // true if 'try' otherwise '__try' 3497 SourceLocation TryLoc, 3498 Stmt *TryBlock, 3499 Stmt *Handler); 3500 3501 explicit SEHTryStmt(EmptyShell E) : Stmt(SEHTryStmtClass, E) {} 3502 3503 public: 3504 static SEHTryStmt* Create(const ASTContext &C, bool isCXXTry, 3505 SourceLocation TryLoc, Stmt *TryBlock, 3506 Stmt *Handler); 3507 3508 SourceLocation getBeginLoc() const LLVM_READONLY { return getTryLoc(); } 3509 3510 SourceLocation getTryLoc() const { return TryLoc; } 3511 SourceLocation getEndLoc() const { return Children[HANDLER]->getEndLoc(); } 3512 3513 bool getIsCXXTry() const { return IsCXXTry; } 3514 3515 CompoundStmt* getTryBlock() const { 3516 return cast<CompoundStmt>(Children[TRY]); 3517 } 3518 3519 Stmt *getHandler() const { return Children[HANDLER]; } 3520 3521 /// Returns 0 if not defined 3522 SEHExceptStmt *getExceptHandler() const; 3523 SEHFinallyStmt *getFinallyHandler() const; 3524 3525 child_range children() { 3526 return child_range(Children, Children+2); 3527 } 3528 3529 const_child_range children() const { 3530 return const_child_range(Children, Children + 2); 3531 } 3532 3533 static bool classof(const Stmt *T) { 3534 return T->getStmtClass() == SEHTryStmtClass; 3535 } 3536 }; 3537 3538 /// Represents a __leave statement. 3539 class SEHLeaveStmt : public Stmt { 3540 SourceLocation LeaveLoc; 3541 3542 public: 3543 explicit SEHLeaveStmt(SourceLocation LL) 3544 : Stmt(SEHLeaveStmtClass), LeaveLoc(LL) {} 3545 3546 /// Build an empty __leave statement. 3547 explicit SEHLeaveStmt(EmptyShell Empty) : Stmt(SEHLeaveStmtClass, Empty) {} 3548 3549 SourceLocation getLeaveLoc() const { return LeaveLoc; } 3550 void setLeaveLoc(SourceLocation L) { LeaveLoc = L; } 3551 3552 SourceLocation getBeginLoc() const LLVM_READONLY { return LeaveLoc; } 3553 SourceLocation getEndLoc() const LLVM_READONLY { return LeaveLoc; } 3554 3555 static bool classof(const Stmt *T) { 3556 return T->getStmtClass() == SEHLeaveStmtClass; 3557 } 3558 3559 // Iterators 3560 child_range children() { 3561 return child_range(child_iterator(), child_iterator()); 3562 } 3563 3564 const_child_range children() const { 3565 return const_child_range(const_child_iterator(), const_child_iterator()); 3566 } 3567 }; 3568 3569 /// This captures a statement into a function. For example, the following 3570 /// pragma annotated compound statement can be represented as a CapturedStmt, 3571 /// and this compound statement is the body of an anonymous outlined function. 3572 /// @code 3573 /// #pragma omp parallel 3574 /// { 3575 /// compute(); 3576 /// } 3577 /// @endcode 3578 class CapturedStmt : public Stmt { 3579 public: 3580 /// The different capture forms: by 'this', by reference, capture for 3581 /// variable-length array type etc. 3582 enum VariableCaptureKind { 3583 VCK_This, 3584 VCK_ByRef, 3585 VCK_ByCopy, 3586 VCK_VLAType, 3587 }; 3588 3589 /// Describes the capture of either a variable, or 'this', or 3590 /// variable-length array type. 3591 class Capture { 3592 llvm::PointerIntPair<VarDecl *, 2, VariableCaptureKind> VarAndKind; 3593 SourceLocation Loc; 3594 3595 Capture() = default; 3596 3597 public: 3598 friend class ASTStmtReader; 3599 friend class CapturedStmt; 3600 3601 /// Create a new capture. 3602 /// 3603 /// \param Loc The source location associated with this capture. 3604 /// 3605 /// \param Kind The kind of capture (this, ByRef, ...). 3606 /// 3607 /// \param Var The variable being captured, or null if capturing this. 3608 Capture(SourceLocation Loc, VariableCaptureKind Kind, 3609 VarDecl *Var = nullptr); 3610 3611 /// Determine the kind of capture. 3612 VariableCaptureKind getCaptureKind() const; 3613 3614 /// Retrieve the source location at which the variable or 'this' was 3615 /// first used. 3616 SourceLocation getLocation() const { return Loc; } 3617 3618 /// Determine whether this capture handles the C++ 'this' pointer. 3619 bool capturesThis() const { return getCaptureKind() == VCK_This; } 3620 3621 /// Determine whether this capture handles a variable (by reference). 3622 bool capturesVariable() const { return getCaptureKind() == VCK_ByRef; } 3623 3624 /// Determine whether this capture handles a variable by copy. 3625 bool capturesVariableByCopy() const { 3626 return getCaptureKind() == VCK_ByCopy; 3627 } 3628 3629 /// Determine whether this capture handles a variable-length array 3630 /// type. 3631 bool capturesVariableArrayType() const { 3632 return getCaptureKind() == VCK_VLAType; 3633 } 3634 3635 /// Retrieve the declaration of the variable being captured. 3636 /// 3637 /// This operation is only valid if this capture captures a variable. 3638 VarDecl *getCapturedVar() const; 3639 }; 3640 3641 private: 3642 /// The number of variable captured, including 'this'. 3643 unsigned NumCaptures; 3644 3645 /// The pointer part is the implicit the outlined function and the 3646 /// int part is the captured region kind, 'CR_Default' etc. 3647 llvm::PointerIntPair<CapturedDecl *, 2, CapturedRegionKind> CapDeclAndKind; 3648 3649 /// The record for captured variables, a RecordDecl or CXXRecordDecl. 3650 RecordDecl *TheRecordDecl = nullptr; 3651 3652 /// Construct a captured statement. 3653 CapturedStmt(Stmt *S, CapturedRegionKind Kind, ArrayRef<Capture> Captures, 3654 ArrayRef<Expr *> CaptureInits, CapturedDecl *CD, RecordDecl *RD); 3655 3656 /// Construct an empty captured statement. 3657 CapturedStmt(EmptyShell Empty, unsigned NumCaptures); 3658 3659 Stmt **getStoredStmts() { return reinterpret_cast<Stmt **>(this + 1); } 3660 3661 Stmt *const *getStoredStmts() const { 3662 return reinterpret_cast<Stmt *const *>(this + 1); 3663 } 3664 3665 Capture *getStoredCaptures() const; 3666 3667 void setCapturedStmt(Stmt *S) { getStoredStmts()[NumCaptures] = S; } 3668 3669 public: 3670 friend class ASTStmtReader; 3671 3672 static CapturedStmt *Create(const ASTContext &Context, Stmt *S, 3673 CapturedRegionKind Kind, 3674 ArrayRef<Capture> Captures, 3675 ArrayRef<Expr *> CaptureInits, 3676 CapturedDecl *CD, RecordDecl *RD); 3677 3678 static CapturedStmt *CreateDeserialized(const ASTContext &Context, 3679 unsigned NumCaptures); 3680 3681 /// Retrieve the statement being captured. 3682 Stmt *getCapturedStmt() { return getStoredStmts()[NumCaptures]; } 3683 const Stmt *getCapturedStmt() const { return getStoredStmts()[NumCaptures]; } 3684 3685 /// Retrieve the outlined function declaration. 3686 CapturedDecl *getCapturedDecl(); 3687 const CapturedDecl *getCapturedDecl() const; 3688 3689 /// Set the outlined function declaration. 3690 void setCapturedDecl(CapturedDecl *D); 3691 3692 /// Retrieve the captured region kind. 3693 CapturedRegionKind getCapturedRegionKind() const; 3694 3695 /// Set the captured region kind. 3696 void setCapturedRegionKind(CapturedRegionKind Kind); 3697 3698 /// Retrieve the record declaration for captured variables. 3699 const RecordDecl *getCapturedRecordDecl() const { return TheRecordDecl; } 3700 3701 /// Set the record declaration for captured variables. 3702 void setCapturedRecordDecl(RecordDecl *D) { 3703 assert(D && "null RecordDecl"); 3704 TheRecordDecl = D; 3705 } 3706 3707 /// True if this variable has been captured. 3708 bool capturesVariable(const VarDecl *Var) const; 3709 3710 /// An iterator that walks over the captures. 3711 using capture_iterator = Capture *; 3712 using const_capture_iterator = const Capture *; 3713 using capture_range = llvm::iterator_range<capture_iterator>; 3714 using capture_const_range = llvm::iterator_range<const_capture_iterator>; 3715 3716 capture_range captures() { 3717 return capture_range(capture_begin(), capture_end()); 3718 } 3719 capture_const_range captures() const { 3720 return capture_const_range(capture_begin(), capture_end()); 3721 } 3722 3723 /// Retrieve an iterator pointing to the first capture. 3724 capture_iterator capture_begin() { return getStoredCaptures(); } 3725 const_capture_iterator capture_begin() const { return getStoredCaptures(); } 3726 3727 /// Retrieve an iterator pointing past the end of the sequence of 3728 /// captures. 3729 capture_iterator capture_end() const { 3730 return getStoredCaptures() + NumCaptures; 3731 } 3732 3733 /// Retrieve the number of captures, including 'this'. 3734 unsigned capture_size() const { return NumCaptures; } 3735 3736 /// Iterator that walks over the capture initialization arguments. 3737 using capture_init_iterator = Expr **; 3738 using capture_init_range = llvm::iterator_range<capture_init_iterator>; 3739 3740 /// Const iterator that walks over the capture initialization 3741 /// arguments. 3742 using const_capture_init_iterator = Expr *const *; 3743 using const_capture_init_range = 3744 llvm::iterator_range<const_capture_init_iterator>; 3745 3746 capture_init_range capture_inits() { 3747 return capture_init_range(capture_init_begin(), capture_init_end()); 3748 } 3749 3750 const_capture_init_range capture_inits() const { 3751 return const_capture_init_range(capture_init_begin(), capture_init_end()); 3752 } 3753 3754 /// Retrieve the first initialization argument. 3755 capture_init_iterator capture_init_begin() { 3756 return reinterpret_cast<Expr **>(getStoredStmts()); 3757 } 3758 3759 const_capture_init_iterator capture_init_begin() const { 3760 return reinterpret_cast<Expr *const *>(getStoredStmts()); 3761 } 3762 3763 /// Retrieve the iterator pointing one past the last initialization 3764 /// argument. 3765 capture_init_iterator capture_init_end() { 3766 return capture_init_begin() + NumCaptures; 3767 } 3768 3769 const_capture_init_iterator capture_init_end() const { 3770 return capture_init_begin() + NumCaptures; 3771 } 3772 3773 SourceLocation getBeginLoc() const LLVM_READONLY { 3774 return getCapturedStmt()->getBeginLoc(); 3775 } 3776 3777 SourceLocation getEndLoc() const LLVM_READONLY { 3778 return getCapturedStmt()->getEndLoc(); 3779 } 3780 3781 SourceRange getSourceRange() const LLVM_READONLY { 3782 return getCapturedStmt()->getSourceRange(); 3783 } 3784 3785 static bool classof(const Stmt *T) { 3786 return T->getStmtClass() == CapturedStmtClass; 3787 } 3788 3789 child_range children(); 3790 3791 const_child_range children() const; 3792 }; 3793 3794 } // namespace clang 3795 3796 #endif // LLVM_CLANG_AST_STMT_H 3797