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