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