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