13#ifndef LLVM_CLANG_AST_STMT_H
14#define LLVM_CLANG_AST_STMT_H
30#include "llvm/ADT/APFloat.h"
31#include "llvm/ADT/ArrayRef.h"
32#include "llvm/ADT/BitmaskEnum.h"
33#include "llvm/ADT/PointerIntPair.h"
34#include "llvm/ADT/STLFunctionalExtras.h"
35#include "llvm/ADT/StringRef.h"
36#include "llvm/ADT/iterator.h"
37#include "llvm/ADT/iterator_range.h"
38#include "llvm/Support/Casting.h"
39#include "llvm/Support/Compiler.h"
40#include "llvm/Support/ErrorHandling.h"
50class FoldingSetNodeID;
85class alignas(void *)
Stmt {
89#define STMT(CLASS, PARENT) CLASS##Class,
90#define STMT_RANGE(BASE, FIRST, LAST) \
91 first##BASE##Constant=FIRST##Class, last##BASE##Constant=LAST##Class,
92#define LAST_STMT_RANGE(BASE, FIRST, LAST) \
93 first##BASE##Constant=FIRST##Class, last##BASE##Constant=LAST##Class
94#define ABSTRACT_STMT(STMT)
95#include "clang/AST/StmtNodes.inc"
103 void *
operator new(
size_t bytes)
noexcept {
104 llvm_unreachable(
"Stmts cannot be allocated with regular 'new'.");
107 void operator delete(
void *data)
noexcept {
108 llvm_unreachable(
"Stmts cannot be released with regular 'delete'.");
113 #define NumStmtBits 9
138 LLVM_PREFERRED_TYPE(
bool)
139 unsigned HasLeadingEmptyMacro : 1;
154 LLVM_PREFERRED_TYPE(
bool)
155 unsigned HasFPFeatures : 1;
195 LLVM_PREFERRED_TYPE(
bool)
196 unsigned HasElse : 1;
199 LLVM_PREFERRED_TYPE(
bool)
203 LLVM_PREFERRED_TYPE(
bool)
204 unsigned HasInit : 1;
217 LLVM_PREFERRED_TYPE(
bool)
218 unsigned HasInit : 1;
221 LLVM_PREFERRED_TYPE(
bool)
227 LLVM_PREFERRED_TYPE(
bool)
228 unsigned AllEnumCasesCovered : 1;
242 LLVM_PREFERRED_TYPE(
bool)
297 LLVM_PREFERRED_TYPE(
bool)
298 unsigned HasNRVOCandidate : 1;
313 LLVM_PREFERRED_TYPE(
bool)
314 unsigned CaseStmtIsGNURange : 1;
359 unsigned ValueKind : 2;
361 unsigned ObjectKind : 3;
363 unsigned Dependent : llvm::BitWidth<ExprDependence>;
377 unsigned ResultKind : 2;
381 unsigned APValueKind : 4;
385 LLVM_PREFERRED_TYPE(
bool)
386 unsigned IsUnsigned : 1;
392 unsigned BitWidth : 7;
396 LLVM_PREFERRED_TYPE(
bool)
397 unsigned HasCleanup : 1;
400 LLVM_PREFERRED_TYPE(
bool)
401 unsigned IsImmediateInvocation : 1;
416 LLVM_PREFERRED_TYPE(
bool)
417 unsigned HasFunctionName : 1;
421 LLVM_PREFERRED_TYPE(
bool)
422 unsigned IsTransparent : 1;
435 LLVM_PREFERRED_TYPE(
bool)
436 unsigned HasQualifier : 1;
437 LLVM_PREFERRED_TYPE(
bool)
438 unsigned HasTemplateKWAndArgsInfo : 1;
439 LLVM_PREFERRED_TYPE(
bool)
440 unsigned HasFoundDecl : 1;
441 LLVM_PREFERRED_TYPE(
bool)
442 unsigned HadMultipleCandidates : 1;
443 LLVM_PREFERRED_TYPE(
bool)
444 unsigned RefersToEnclosingVariableOrCapture : 1;
445 LLVM_PREFERRED_TYPE(
bool)
446 unsigned CapturedByCopyInLambdaWithExplicitObjectParameter : 1;
447 LLVM_PREFERRED_TYPE(NonOdrUseReason)
448 unsigned NonOdrUseReason : 2;
449 LLVM_PREFERRED_TYPE(
bool)
450 unsigned IsImmediateEscalating : 1;
464 llvm::APFloat::S_MaxSemantics < 32,
465 "Too many Semantics enum values to fit in bitfield of size 5");
466 LLVM_PREFERRED_TYPE(llvm::APFloat::Semantics)
467 unsigned Semantics : 5;
468 LLVM_PREFERRED_TYPE(
bool)
469 unsigned IsExact : 1;
487 unsigned CharByteWidth : 3;
489 LLVM_PREFERRED_TYPE(
bool)
490 unsigned IsPascal : 1;
494 unsigned NumConcatenated;
515 LLVM_PREFERRED_TYPE(
bool)
516 unsigned CanOverflow : 1;
521 LLVM_PREFERRED_TYPE(
bool)
522 unsigned HasFPFeatures : 1;
533 LLVM_PREFERRED_TYPE(UnaryExprOrTypeTrait)
535 LLVM_PREFERRED_TYPE(
bool)
556 unsigned NumPreArgs : 1;
559 LLVM_PREFERRED_TYPE(
bool)
560 unsigned UsesADL : 1;
563 LLVM_PREFERRED_TYPE(
bool)
564 unsigned HasFPFeatures : 1;
567 LLVM_PREFERRED_TYPE(
bool)
568 unsigned IsCoroElideSafe : 1;
572 LLVM_PREFERRED_TYPE(
bool)
573 unsigned ExplicitObjectMemFunUsingMemberSyntax : 1;
577 LLVM_PREFERRED_TYPE(
bool)
578 unsigned HasTrailingSourceLoc : 1;
591 LLVM_PREFERRED_TYPE(
bool)
592 unsigned IsArrow : 1;
596 LLVM_PREFERRED_TYPE(
bool)
597 unsigned HasQualifier : 1;
600 LLVM_PREFERRED_TYPE(
bool)
601 unsigned HasFoundDecl : 1;
608 LLVM_PREFERRED_TYPE(
bool)
609 unsigned HasTemplateKWAndArgsInfo : 1;
613 LLVM_PREFERRED_TYPE(
bool)
614 unsigned HadMultipleCandidates : 1;
619 LLVM_PREFERRED_TYPE(NonOdrUseReason)
620 unsigned NonOdrUseReason : 2;
635 LLVM_PREFERRED_TYPE(
bool)
636 unsigned PartOfExplicitCast : 1;
639 LLVM_PREFERRED_TYPE(
bool)
640 unsigned HasFPFeatures : 1;
644 unsigned BasePathSize;
659 LLVM_PREFERRED_TYPE(
bool)
660 unsigned HasFPFeatures : 1;
664 LLVM_PREFERRED_TYPE(
bool)
665 unsigned ExcludedOverflowPattern : 1;
679 LLVM_PREFERRED_TYPE(
bool)
680 unsigned HadArrayRangeDesignator : 1;
682 LLVM_PREFERRED_TYPE(
bool)
683 unsigned IsExplicit : 1;
715 unsigned NumSubExprs : 16;
716 unsigned ResultIndex : 16;
740 LLVM_PREFERRED_TYPE(
bool)
741 unsigned ProducedByFoldExpansion : 1;
763 unsigned TemplateDepth;
773 LLVM_PREFERRED_TYPE(
bool)
789 unsigned OperatorKind : 6;
793 LLVM_PREFERRED_TYPE(
bool)
794 unsigned IsReversed : 1;
804 LLVM_PREFERRED_TYPE(
bool)
805 unsigned IsReversed : 1;
815 LLVM_PREFERRED_TYPE(
bool)
839 LLVM_PREFERRED_TYPE(
bool)
840 unsigned IsImplicit : 1;
844 LLVM_PREFERRED_TYPE(
bool)
845 unsigned CapturedByCopyInLambdaWithExplicitObjectParameter : 1;
859 LLVM_PREFERRED_TYPE(
bool)
860 unsigned IsThrownVariableInScope : 1;
874 LLVM_PREFERRED_TYPE(
bool)
875 unsigned HasRewrittenInit : 1;
890 LLVM_PREFERRED_TYPE(
bool)
891 unsigned HasRewrittenInit : 1;
916 LLVM_PREFERRED_TYPE(
bool)
917 unsigned IsGlobalNew : 1;
921 LLVM_PREFERRED_TYPE(
bool)
922 unsigned IsArray : 1;
925 LLVM_PREFERRED_TYPE(
bool)
926 unsigned ShouldPassAlignment : 1;
929 LLVM_PREFERRED_TYPE(
bool)
930 unsigned ShouldPassTypeIdentity : 1;
934 LLVM_PREFERRED_TYPE(
bool)
935 unsigned UsualArrayDeleteWantsSize : 1;
938 LLVM_PREFERRED_TYPE(
bool)
939 unsigned HasInitializer : 1;
943 unsigned StoredInitializationStyle : 2;
946 LLVM_PREFERRED_TYPE(
bool)
947 unsigned IsParenTypeId : 1;
950 unsigned NumPlacementArgs;
961 LLVM_PREFERRED_TYPE(
bool)
962 unsigned GlobalDelete : 1;
965 LLVM_PREFERRED_TYPE(
bool)
966 unsigned ArrayForm : 1;
971 LLVM_PREFERRED_TYPE(
bool)
972 unsigned ArrayFormAsWritten : 1;
976 LLVM_PREFERRED_TYPE(
bool)
977 unsigned UsualArrayDeleteWantsSize : 1;
992 LLVM_PREFERRED_TYPE(TypeTrait)
995 LLVM_PREFERRED_TYPE(
bool)
996 unsigned IsBooleanTypeTrait : 1;
998 LLVM_PREFERRED_TYPE(
bool)
999 unsigned IsComparisonResult : 1;
1003 LLVM_PREFERRED_TYPE(
bool)
1021 LLVM_PREFERRED_TYPE(
bool)
1022 unsigned HasTemplateKWAndArgsInfo : 1;
1032 LLVM_PREFERRED_TYPE(
bool)
1033 unsigned Elidable : 1;
1034 LLVM_PREFERRED_TYPE(
bool)
1035 unsigned HadMultipleCandidates : 1;
1036 LLVM_PREFERRED_TYPE(
bool)
1037 unsigned ListInitialization : 1;
1038 LLVM_PREFERRED_TYPE(
bool)
1039 unsigned StdInitListInitialization : 1;
1040 LLVM_PREFERRED_TYPE(
bool)
1041 unsigned ZeroInitialization : 1;
1043 unsigned ConstructionKind : 3;
1044 LLVM_PREFERRED_TYPE(
bool)
1045 unsigned IsImmediateEscalating : 1;
1058 LLVM_PREFERRED_TYPE(
bool)
1059 unsigned CleanupsHaveSideEffects : 1;
1084 LLVM_PREFERRED_TYPE(
bool)
1085 unsigned IsArrow : 1;
1089 LLVM_PREFERRED_TYPE(
bool)
1090 unsigned HasTemplateKWAndArgsInfo : 1;
1094 LLVM_PREFERRED_TYPE(
bool)
1095 unsigned HasFirstQualifierFoundInScope : 1;
1110 LLVM_PREFERRED_TYPE(
bool)
1111 unsigned HasTemplateKWAndArgsInfo : 1;
1119 unsigned NumResults;
1132 LLVM_PREFERRED_TYPE(
bool)
1133 unsigned RequiresADL : 1;
1136 "UnresolvedLookupExprBitfields must be <= than 4 bytes to"
1137 "avoid trashing OverloadExprBitfields::NumResults!");
1148 LLVM_PREFERRED_TYPE(
bool)
1149 unsigned IsArrow : 1;
1152 LLVM_PREFERRED_TYPE(
bool)
1153 unsigned HasUnresolvedUsing : 1;
1156 "UnresolvedMemberExprBitfields must be <= than 4 bytes to"
1157 "avoid trashing OverloadExprBitfields::NumResults!");
1166 LLVM_PREFERRED_TYPE(
bool)
1192 unsigned CaptureDefault : 2;
1196 LLVM_PREFERRED_TYPE(
bool)
1197 unsigned ExplicitParams : 1;
1200 LLVM_PREFERRED_TYPE(
bool)
1201 unsigned ExplicitResultType : 1;
1204 unsigned NumCaptures : 16;
1215 LLVM_PREFERRED_TYPE(
bool)
1216 unsigned IsSatisfied : 1;
1227 LLVM_PREFERRED_TYPE(ArrayTypeTrait)
1238 LLVM_PREFERRED_TYPE(ExpressionTrait)
1242 LLVM_PREFERRED_TYPE(
bool)
1265 unsigned TransformedExpressions : 31;
1267 LLVM_PREFERRED_TYPE(
bool)
1268 unsigned FullySubstituted : 1;
1279 LLVM_PREFERRED_TYPE(
bool)
1280 unsigned IsImplicit : 1;
1290 unsigned IsExpressibleAsConstantInitializer : 1;
1299 LLVM_PREFERRED_TYPE(
bool)
1300 unsigned ShouldCopy : 1;
1314 LLVM_PREFERRED_TYPE(
bool)
1315 unsigned IsUnique : 1;
1330 LLVM_PREFERRED_TYPE(
bool)
1331 unsigned HasFPFeatures : 1;
1426 unsigned alignment = 8);
1429 unsigned alignment = 8) {
1430 return operator new(
bytes, *
C, alignment);
1433 void *
operator new(
size_t bytes,
void *mem)
noexcept {
return mem; }
1437 void operator delete(
void *,
size_t)
noexcept {}
1438 void operator delete(
void *,
void *)
noexcept {}
1459 template<
typename T,
typename TPtr = T *,
typename StmtPtr = Stmt *>
1461 : llvm::iterator_adaptor_base<CastIterator<T, TPtr, StmtPtr>, StmtPtr *,
1462 std::random_access_iterator_tag, TPtr> {
1463 using Base =
typename CastIterator::iterator_adaptor_base;
1469 return cast_or_null<T>(*this->I);
1474 template <
typename T>
1482 static bool StatisticsEnabled;
1496 static_assert(
sizeof(*this) <= 8,
1497 "changing bitfields changed sizeof(Stmt)");
1498 static_assert(
sizeof(*this) %
alignof(
void *) == 0,
1499 "Insufficient alignment!");
1539 static
std::tuple<
bool, const
Attr *, const
Attr *>
1558 StringRef NewlineSymbol =
"\n",
1562 unsigned Indentation = 0,
1563 StringRef NewlineSymbol =
"\n",
1578 return const_cast<Stmt *
>(
this)->IgnoreContainers(IgnoreCaptured);
1583 return const_cast<Stmt*
>(
1584 const_cast<const Stmt*
>(
this)->stripLabelLikeStatements());
1626 bool Canonical,
bool ProfileLambdaExpr =
false)
const;
1648 :
Stmt(DeclStmtClass), DG(dg), StartLoc(startLoc), EndLoc(endLoc) {}
1671 return T->getStmtClass() == DeclStmtClass;
1717 :
Stmt(NullStmtClass) {
1736 return T->getStmtClass() == NullStmtClass;
1749class CompoundStmt final
1751 private llvm::TrailingObjects<CompoundStmt, Stmt *, FPOptionsOverride> {
1753 friend TrailingObjects;
1770 *getTrailingObjects<FPOptionsOverride>() = F;
1773 size_t numTrailingObjects(OverloadToken<Stmt *>)
const {
1778 static CompoundStmt *
Create(
const ASTContext &
C, ArrayRef<Stmt *> Stmts,
1779 FPOptionsOverride FPFeatures, SourceLocation LB,
1786 :
Stmt(CompoundStmtClass), LBraceLoc(Loc), RBraceLoc(EndLoc) {
1793 bool HasFPFeatures);
1803 return *getTrailingObjects<FPOptionsOverride>();
1831 return getTrailingObjects<Stmt *>();
1855 std::reverse_iterator<const_body_iterator>;
1872 return T->getStmtClass() == CompoundStmtClass;
1922 return T->getStmtClass() == CaseStmtClass ||
1923 T->getStmtClass() == DefaultStmtClass;
1931 private llvm::TrailingObjects<CaseStmt, Stmt *, SourceLocation> {
1932 friend TrailingObjects;
1949 enum { LhsOffset = 0, SubStmtOffsetFromRhs = 1 };
1950 enum { NumMandatoryStmtPtr = 2 };
1952 unsigned numTrailingObjects(OverloadToken<Stmt *>)
const {
1956 unsigned lhsOffset()
const {
return LhsOffset; }
1958 unsigned subStmtOffset()
const {
return rhsOffset() + SubStmtOffsetFromRhs; }
1964 :
SwitchCase(CaseStmtClass, caseLoc, colonLoc) {
1966 bool IsGNURange = rhs !=
nullptr;
2010 "setEllipsisLoc but this is not a case stmt of the form LHS ... RHS!");
2011 *getTrailingObjects<SourceLocation>() = L;
2015 return reinterpret_cast<Expr *
>(getTrailingObjects<Stmt *>()[lhsOffset()]);
2019 return reinterpret_cast<Expr *
>(getTrailingObjects<Stmt *>()[lhsOffset()]);
2023 getTrailingObjects<Stmt *>()[lhsOffset()] =
reinterpret_cast<Stmt *
>(Val);
2028 getTrailingObjects<Stmt *>()[rhsOffset()])
2034 getTrailingObjects<Stmt *>()[rhsOffset()])
2040 "setRHS but this is not a case stmt of the form LHS ... RHS!");
2041 getTrailingObjects<Stmt *>()[rhsOffset()] =
reinterpret_cast<Stmt *
>(Val);
2046 return getTrailingObjects<Stmt *>()[subStmtOffset()];
2050 getTrailingObjects<Stmt *>()[subStmtOffset()] = S;
2056 const CaseStmt *CS =
this;
2057 while (
const auto *CS2 = dyn_cast<CaseStmt>(CS->
getSubStmt()))
2064 return T->getStmtClass() == CaseStmtClass;
2070 getTrailingObjects<Stmt *>() +
2071 numTrailingObjects(OverloadToken<Stmt *>()));
2076 getTrailingObjects<Stmt *>() +
2077 numTrailingObjects(OverloadToken<Stmt *>()));
2086 :
SwitchCase(DefaultStmtClass, DL,
CL), SubStmt(substmt) {}
2101 return SubStmt->getEndLoc();
2105 return T->getStmtClass() == DefaultStmtClass;
2117 if (
const auto *CS = dyn_cast<CaseStmt>(
this))
2118 return CS->getEndLoc();
2119 else if (
const auto *DS = dyn_cast<DefaultStmt>(
this))
2120 return DS->getEndLoc();
2121 llvm_unreachable(
"SwitchCase is neither a CaseStmt nor a DefaultStmt!");
2125 if (
auto *CS = dyn_cast<CaseStmt>(
this))
2126 return CS->getSubStmt();
2127 else if (
auto *DS = dyn_cast<DefaultStmt>(
this))
2128 return DS->getSubStmt();
2129 llvm_unreachable(
"SwitchCase is neither a CaseStmt nor a DefaultStmt!");
2150 return T->getStmtClass() >= firstValueStmtConstant &&
2151 T->getStmtClass() <= lastValueStmtConstant;
2160 bool SideEntry =
false;
2165 :
ValueStmt(LabelStmtClass), TheDecl(D), SubStmt(substmt) {
2191 return const_cast<Stmt *
>(
2192 const_cast<const LabelStmt *
>(
this)->getInnermostLabeledStmt());
2202 return T->getStmtClass() == LabelStmtClass;
2212class AttributedStmt final
2214 private llvm::TrailingObjects<AttributedStmt, const Attr *> {
2216 friend TrailingObjects;
2222 :
ValueStmt(AttributedStmtClass), SubStmt(SubStmt) {
2225 llvm::copy(Attrs, getAttrArrayPtr());
2232 std::fill_n(getAttrArrayPtr(), NumAttrs,
nullptr);
2235 const Attr *
const *getAttrArrayPtr()
const {
return getTrailingObjects(); }
2236 const Attr **getAttrArrayPtr() {
return getTrailingObjects(); }
2239 static AttributedStmt *
Create(
const ASTContext &
C, SourceLocation Loc,
2240 ArrayRef<const Attr *> Attrs,
Stmt *SubStmt);
2243 static AttributedStmt *
CreateEmpty(
const ASTContext &
C,
unsigned NumAttrs);
2263 return T->getStmtClass() == AttributedStmtClass;
2270 private llvm::TrailingObjects<IfStmt, Stmt *, SourceLocation> {
2271 friend TrailingObjects;
2295 enum { InitOffset = 0, ThenOffsetFromCond = 1, ElseOffsetFromCond = 2 };
2296 enum { NumMandatoryStmtPtr = 2 };
2300 unsigned numTrailingObjects(OverloadToken<Stmt *>)
const {
2305 unsigned numTrailingObjects(OverloadToken<SourceLocation>)
const {
2309 unsigned initOffset()
const {
return InitOffset; }
2310 unsigned varOffset()
const {
return InitOffset +
hasInitStorage(); }
2311 unsigned condOffset()
const {
2314 unsigned thenOffset()
const {
return condOffset() + ThenOffsetFromCond; }
2315 unsigned elseOffset()
const {
return condOffset() + ElseOffsetFromCond; }
2323 explicit IfStmt(
EmptyShell Empty,
bool HasElse,
bool HasVar,
bool HasInit);
2331 Stmt *Else =
nullptr);
2348 return reinterpret_cast<Expr *
>(getTrailingObjects<Stmt *>()[condOffset()]);
2352 return reinterpret_cast<Expr *
>(getTrailingObjects<Stmt *>()[condOffset()]);
2356 getTrailingObjects<Stmt *>()[condOffset()] =
reinterpret_cast<Stmt *
>(Cond);
2359 Stmt *
getThen() {
return getTrailingObjects<Stmt *>()[thenOffset()]; }
2361 return getTrailingObjects<Stmt *>()[thenOffset()];
2365 getTrailingObjects<Stmt *>()[thenOffset()] = Then;
2369 return hasElseStorage() ? getTrailingObjects<Stmt *>()[elseOffset()]
2374 return hasElseStorage() ? getTrailingObjects<Stmt *>()[elseOffset()]
2380 "This if statement has no storage for an else statement!");
2381 getTrailingObjects<Stmt *>()[elseOffset()] = Else;
2405 getTrailingObjects<Stmt *>()[varOffset()])
2411 getTrailingObjects<Stmt *>()[varOffset()])
2417 getTrailingObjects<Stmt *>()[varOffset()] = CondVar;
2421 return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
2426 return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
2432 "This if statement has no storage for an init statement!");
2433 getTrailingObjects<Stmt *>()[initOffset()] =
Init;
2446 "This if statement has no storage for an else statement!");
2447 *getTrailingObjects<SourceLocation>() = ElseLoc;
2468 IfStmtBits.Kind =
static_cast<unsigned>(Kind);
2500 getTrailingObjects<Stmt *>() +
2501 numTrailingObjects(OverloadToken<Stmt *>()));
2509 getTrailingObjects<Stmt *>() +
2510 numTrailingObjects(OverloadToken<Stmt *>()));
2514 return T->getStmtClass() == IfStmtClass;
2519class SwitchStmt final :
public Stmt,
2520 private llvm::TrailingObjects<SwitchStmt, Stmt *> {
2521 friend TrailingObjects;
2543 enum { InitOffset = 0, BodyOffsetFromCond = 1 };
2544 enum { NumMandatoryStmtPtr = 2 };
2548 unsigned numTrailingStatements()
const {
2552 unsigned initOffset()
const {
return InitOffset; }
2553 unsigned varOffset()
const {
return InitOffset +
hasInitStorage(); }
2554 unsigned condOffset()
const {
2557 unsigned bodyOffset()
const {
return condOffset() + BodyOffsetFromCond; }
2584 return reinterpret_cast<Expr *
>(getTrailingObjects()[condOffset()]);
2588 return reinterpret_cast<Expr *
>(getTrailingObjects()[condOffset()]);
2592 getTrailingObjects()[condOffset()] =
reinterpret_cast<Stmt *
>(Cond);
2596 const Stmt *
getBody()
const {
return getTrailingObjects()[bodyOffset()]; }
2598 void setBody(
Stmt *Body) { getTrailingObjects()[bodyOffset()] = Body; }
2601 return hasInitStorage() ? getTrailingObjects()[initOffset()] :
nullptr;
2605 return hasInitStorage() ? getTrailingObjects()[initOffset()] :
nullptr;
2610 "This switch statement has no storage for an init statement!");
2611 getTrailingObjects()[initOffset()] =
Init;
2636 ?
static_cast<DeclStmt *
>(getTrailingObjects()[varOffset()])
2642 ?
static_cast<DeclStmt *
>(getTrailingObjects()[varOffset()])
2648 getTrailingObjects()[varOffset()] = CondVar;
2669 "case/default already added to a switch");
2693 getTrailingObjects() + numTrailingStatements());
2698 getTrailingObjects() + numTrailingStatements());
2702 return T->getStmtClass() == SwitchStmtClass;
2707class WhileStmt final :
public Stmt,
2708 private llvm::TrailingObjects<WhileStmt, Stmt *> {
2709 friend TrailingObjects;
2726 enum { VarOffset = 0, BodyOffsetFromCond = 1 };
2727 enum { NumMandatoryStmtPtr = 2 };
2731 unsigned varOffset()
const {
return VarOffset; }
2732 unsigned condOffset()
const {
return VarOffset +
hasVarStorage(); }
2733 unsigned bodyOffset()
const {
return condOffset() + BodyOffsetFromCond; }
2735 unsigned numTrailingStatements()
const {
2761 return reinterpret_cast<Expr *
>(getTrailingObjects()[condOffset()]);
2765 return reinterpret_cast<Expr *
>(getTrailingObjects()[condOffset()]);
2769 getTrailingObjects()[condOffset()] =
reinterpret_cast<Stmt *
>(Cond);
2773 const Stmt *
getBody()
const {
return getTrailingObjects()[bodyOffset()]; }
2775 void setBody(
Stmt *Body) { getTrailingObjects()[bodyOffset()] = Body; }
2798 ?
static_cast<DeclStmt *
>(getTrailingObjects()[varOffset()])
2804 ?
static_cast<DeclStmt *
>(getTrailingObjects()[varOffset()])
2810 getTrailingObjects()[varOffset()] = CondVar;
2827 return T->getStmtClass() == WhileStmtClass;
2833 getTrailingObjects() + numTrailingStatements());
2838 getTrailingObjects() + numTrailingStatements());
2844 enum { BODY, COND, END_EXPR };
2845 Stmt *SubExprs[END_EXPR];
2852 :
Stmt(DoStmtClass), WhileLoc(WL), RParenLoc(RP) {
2863 return reinterpret_cast<Expr *
>(SubExprs[COND]);
2883 return T->getStmtClass() == DoStmtClass;
2888 return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2902 enum { INIT, CONDVAR, COND, INC, BODY, END_EXPR };
2903 Stmt* SubExprs[END_EXPR];
2930 return reinterpret_cast<DeclStmt*
>(SubExprs[CONDVAR]);
2934 return reinterpret_cast<DeclStmt*
>(SubExprs[CONDVAR]);
2938 SubExprs[CONDVAR] = CondVar;
2966 return T->getStmtClass() == ForStmtClass;
2971 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
2986 :
Stmt(GotoStmtClass), Label(label), LabelLoc(LL) {
3005 return T->getStmtClass() == GotoStmtClass;
3025 :
Stmt(IndirectGotoStmtClass), StarLoc(starLoc) {
3041 return reinterpret_cast<const Expr *
>(Target);
3056 return T->getStmtClass() == IndirectGotoStmtClass;
3101 bool isNamed()
const {
return TargetLabel !=
nullptr; }
3127 return Class == ContinueStmtClass ||
Class == BreakStmtClass;
3143 return T->getStmtClass() == ContinueStmtClass;
3159 return T->getStmtClass() == BreakStmtClass;
3171class ReturnStmt final
3173 private llvm::TrailingObjects<ReturnStmt, const VarDecl *> {
3174 friend TrailingObjects;
3183 bool hasNRVOCandidate()
const {
return ReturnStmtBits.HasNRVOCandidate; }
3194 const VarDecl *NRVOCandidate);
3210 return hasNRVOCandidate() ? *getTrailingObjects() :
nullptr;
3217 assert(hasNRVOCandidate() &&
3218 "This return statement has no storage for an NRVO candidate!");
3219 *getTrailingObjects() = Var;
3227 return RetExpr ? RetExpr->getEndLoc() :
getReturnLoc();
3231 return T->getStmtClass() == ReturnStmtClass;
3271 assert(S &&
"defer body must not be null");
3311 unsigned numoutputs,
unsigned numinputs,
unsigned numclobbers)
3338 llvm::function_ref<void(
const Stmt *, StringRef)>;
3345 std::string *GCCReg =
nullptr)
const;
3385 return T->getStmtClass() == GCCAsmStmtClass ||
3386 T->getStmtClass() == MSAsmStmtClass;
3466 Expr **Constraints =
nullptr;
3467 Expr **Clobbers =
nullptr;
3469 unsigned NumLabels = 0;
3473 bool isvolatile,
unsigned numoutputs,
unsigned numinputs,
3475 Expr *asmstr,
unsigned numclobbers,
Expr **clobbers,
3514 : MyKind(
Operand), Str(S), OperandNo(OpNo),
3528 assert(
isOperand() &&
"Range is currently used only for Operands.");
3554 return II->getName();
3562 return Constraints[i];
3580 return II->getName();
3606 return NumLabels > 0;
3649 void setOutputsAndInputsAndClobbers(
const ASTContext &
C,
3653 unsigned NumLabels,
Expr **Clobbers,
3673 return T->getStmtClass() == GCCAsmStmtClass;
3684 unsigned NumAsmToks = 0;
3686 Token *AsmToks =
nullptr;
3687 StringRef *Constraints =
nullptr;
3688 StringRef *Clobbers =
nullptr;
3721 return Constraints[i];
3759 void initialize(
const ASTContext &
C, StringRef AsmString,
3767 return T->getStmtClass() == MSAsmStmtClass;
3786 enum { FILTER_EXPR, BLOCK };
3793 SourceLocation ExceptLoc,
3803 return reinterpret_cast<Expr*
>(Children[FILTER_EXPR]);
3819 return T->getStmtClass() == SEHExceptStmtClass;
3823class SEHFinallyStmt :
public Stmt {
3831 explicit SEHFinallyStmt(
EmptyShell E) :
Stmt(SEHFinallyStmtClass, E) {}
3854 return T->getStmtClass() == SEHFinallyStmtClass;
3866 enum { TRY = 0, HANDLER = 1 };
3877 SourceLocation TryLoc,
Stmt *TryBlock,
3906 return T->getStmtClass() == SEHTryStmtClass;
3916 :
Stmt(SEHLeaveStmtClass), LeaveLoc(LL) {}
3928 return T->getStmtClass() == SEHLeaveStmtClass;
3964 llvm::PointerIntPair<VarDecl *, 2, VariableCaptureKind> VarAndKind;
4015 unsigned NumCaptures;
4019 llvm::PointerIntPair<CapturedDecl *, 2, CapturedRegionKind> CapDeclAndKind;
4031 Stmt **getStoredStmts() {
return reinterpret_cast<Stmt **
>(
this + 1); }
4033 Stmt *
const *getStoredStmts()
const {
4034 return reinterpret_cast<Stmt *
const *
>(
this + 1);
4037 Capture *getStoredCaptures()
const;
4039 void setCapturedStmt(
Stmt *S) { getStoredStmts()[NumCaptures] = S; }
4051 unsigned NumCaptures);
4075 assert(D &&
"null RecordDecl");
4102 return getStoredCaptures() + NumCaptures;
4116 llvm::iterator_range<const_capture_init_iterator>;
4128 return reinterpret_cast<Expr **
>(getStoredStmts());
4132 return reinterpret_cast<Expr *
const *
>(getStoredStmts());
4158 return T->getStmtClass() == CapturedStmtClass;
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines enumerations for traits support.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
Defines an enumeration for C++ overloaded operators.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
static std::pair< Stmt::Likelihood, const Attr * > getLikelihood(ArrayRef< const Attr * > Attrs)
__SIZE_TYPE__ size_t
The unsigned integer type of the result of the sizeof operator.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
AddrLabelExpr - The GNU address of label extension, representing &&label.
outputs_iterator begin_outputs()
void setAsmLoc(SourceLocation L)
const_outputs_iterator end_outputs() const
std::string getInputConstraint(unsigned i) const
getInputConstraint - Return the specified input constraint.
llvm::function_ref< void(const Stmt *, StringRef)> UnsupportedConstraintCallbackTy
outputs_iterator end_outputs()
const_inputs_iterator begin_inputs() const
unsigned getNumPlusOperands() const
getNumPlusOperands - Return the number of output operands that have a "+" constraint.
std::string getOutputConstraint(unsigned i) const
getOutputConstraint - Return the constraint string for the specified output operand.
AsmStmt(StmtClass SC, SourceLocation asmloc, bool issimple, bool isvolatile, unsigned numoutputs, unsigned numinputs, unsigned numclobbers)
static bool classof(const Stmt *T)
inputs_const_range inputs() const
SourceLocation getAsmLoc() const
const Expr * getInputExpr(unsigned i) const
SourceLocation getEndLoc() const LLVM_READONLY
std::string addVariableConstraints(StringRef Constraint, const Expr &AsmExpr, const TargetInfo &Target, bool EarlyClobber, UnsupportedConstraintCallbackTy UnsupportedCB, std::string *GCCReg=nullptr) const
Look at AsmExpr and if it is a variable declared as using a particular register add that as a constra...
llvm::iterator_range< inputs_iterator > inputs_range
bool isOutputPlusConstraint(unsigned i) const
isOutputPlusConstraint - Return true if the specified output constraint is a "+" constraint (which is...
unsigned getNumClobbers() const
ExprIterator outputs_iterator
const_inputs_iterator end_inputs() const
llvm::iterator_range< const_inputs_iterator > inputs_const_range
const_child_range children() const
ExprIterator inputs_iterator
bool IsSimple
True if the assembly statement does not have any input or output operands.
const Expr * getOutputExpr(unsigned i) const
outputs_const_range outputs() const
inputs_iterator end_inputs()
unsigned getNumOutputs() const
SourceLocation getBeginLoc() const LLVM_READONLY
inputs_iterator begin_inputs()
AsmStmt(StmtClass SC, EmptyShell Empty)
Build an empty inline-assembly statement.
ConstExprIterator const_outputs_iterator
ConstExprIterator const_inputs_iterator
std::string generateAsmString(const ASTContext &C) const
Assemble final IR asm string.
bool IsVolatile
If true, treat this inline assembly as having side effects.
friend class ASTStmtReader
unsigned getNumInputs() const
llvm::iterator_range< outputs_iterator > outputs_range
const_outputs_iterator begin_outputs() const
std::string getClobber(unsigned i) const
llvm::iterator_range< const_outputs_iterator > outputs_const_range
Attr - This represents one attribute.
Represents an attribute applied to a statement.
static AttributedStmt * CreateEmpty(const ASTContext &C, unsigned NumAttrs)
const Stmt * getSubStmt() const
SourceLocation getAttrLoc() const
ArrayRef< const Attr * > getAttrs() const
const_child_range children() const
friend class ASTStmtReader
static bool classof(const Stmt *T)
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const
BreakStmt(SourceLocation BL)
static bool classof(const Stmt *T)
BreakStmt(EmptyShell Empty)
Build an empty break statement.
BreakStmt(SourceLocation CL, SourceLocation LabelLoc, LabelDecl *Target)
Represents the body of a CapturedStmt, and serves as its DeclContext.
Describes the capture of either a variable, or 'this', or variable-length array type.
bool capturesVariableByCopy() const
Determine whether this capture handles a variable by copy.
VariableCaptureKind getCaptureKind() const
Determine the kind of capture.
VarDecl * getCapturedVar() const
Retrieve the declaration of the variable being captured.
bool capturesVariableArrayType() const
Determine whether this capture handles a variable-length array type.
friend class CapturedStmt
bool capturesThis() const
Determine whether this capture handles the C++ 'this' pointer.
bool capturesVariable() const
Determine whether this capture handles a variable (by reference).
SourceLocation getLocation() const
Retrieve the source location at which the variable or 'this' was first used.
friend class ASTStmtReader
This captures a statement into a function.
unsigned capture_size() const
Retrieve the number of captures, including 'this'.
const_capture_iterator capture_begin() const
static CapturedStmt * CreateDeserialized(const ASTContext &Context, unsigned NumCaptures)
SourceLocation getEndLoc() const LLVM_READONLY
capture_init_range capture_inits()
Expr ** capture_init_iterator
Iterator that walks over the capture initialization arguments.
void setCapturedRegionKind(CapturedRegionKind Kind)
Set the captured region kind.
const_capture_init_iterator capture_init_begin() const
const Capture * const_capture_iterator
CapturedDecl * getCapturedDecl()
Retrieve the outlined function declaration.
SourceRange getSourceRange() const LLVM_READONLY
capture_iterator capture_end() const
Retrieve an iterator pointing past the end of the sequence of captures.
const RecordDecl * getCapturedRecordDecl() const
Retrieve the record declaration for captured variables.
llvm::iterator_range< const_capture_init_iterator > const_capture_init_range
Stmt * getCapturedStmt()
Retrieve the statement being captured.
llvm::iterator_range< capture_init_iterator > capture_init_range
Capture * capture_iterator
An iterator that walks over the captures.
llvm::iterator_range< capture_iterator > capture_range
bool capturesVariable(const VarDecl *Var) const
True if this variable has been captured.
static bool classof(const Stmt *T)
capture_init_iterator capture_init_begin()
Retrieve the first initialization argument.
void setCapturedDecl(CapturedDecl *D)
Set the outlined function declaration.
capture_iterator capture_begin()
Retrieve an iterator pointing to the first capture.
const_capture_init_iterator capture_init_end() const
SourceLocation getBeginLoc() const LLVM_READONLY
void setCapturedRecordDecl(RecordDecl *D)
Set the record declaration for captured variables.
friend class ASTStmtReader
llvm::iterator_range< const_capture_iterator > capture_const_range
capture_init_iterator capture_init_end()
Retrieve the iterator pointing one past the last initialization argument.
Expr *const * const_capture_init_iterator
Const iterator that walks over the capture initialization arguments.
const Stmt * getCapturedStmt() const
capture_const_range captures() const
CapturedRegionKind getCapturedRegionKind() const
Retrieve the captured region kind.
VariableCaptureKind
The different capture forms: by 'this', by reference, capture for variable-length array type etc.
const_capture_init_range capture_inits() const
const Expr * getRHS() const
const_child_range children() const
SourceLocation getBeginLoc() const
void setEllipsisLoc(SourceLocation L)
Set the location of the ... in a case statement of the form LHS ... RHS.
static bool classof(const Stmt *T)
bool caseStmtIsGNURange() const
True if this case statement is of the form case LHS ... RHS, which is a GNU extension.
const Expr * getLHS() const
SourceLocation getEllipsisLoc() const
Get the location of the ... in a case statement of the form LHS ... RHS.
void setCaseLoc(SourceLocation L)
SourceLocation getCaseLoc() const
static CaseStmt * CreateEmpty(const ASTContext &Ctx, bool CaseStmtIsGNURange)
Build an empty case statement.
const Stmt * getSubStmt() const
SourceLocation getEndLoc() const LLVM_READONLY
Represents a byte-granular source range.
CompoundStmt - This represents a group of statements like { stmt stmt }.
static bool classof(const Stmt *T)
body_const_range body() const
Stmt *const * const_body_iterator
const_reverse_body_iterator body_rend() const
llvm::iterator_range< const_body_iterator > body_const_range
std::reverse_iterator< body_iterator > reverse_body_iterator
reverse_body_iterator body_rbegin()
llvm::iterator_range< body_iterator > body_range
std::reverse_iterator< const_body_iterator > const_reverse_body_iterator
FPOptionsOverride getStoredFPFeatures() const
Get FPOptionsOverride from trailing storage.
const Stmt * body_front() const
SourceLocation getBeginLoc() const
static CompoundStmt * CreateEmpty(const ASTContext &C, unsigned NumStmts, bool HasFPFeatures)
SourceLocation getLBracLoc() const
body_iterator body_begin()
SourceLocation getEndLoc() const
bool hasStoredFPFeatures() const
const_child_range children() const
CompoundStmt(SourceLocation Loc, SourceLocation EndLoc)
reverse_body_iterator body_rend()
CompoundStmt(SourceLocation Loc)
const_body_iterator body_begin() const
const Stmt * body_back() const
friend class ASTStmtReader
const_reverse_body_iterator body_rbegin() const
FPOptionsOverride getStoredFPFeaturesOrDefault() const
Get the store FPOptionsOverride or default if not stored.
SourceLocation getRBracLoc() const
const_body_iterator body_end() const
ContinueStmt(EmptyShell Empty)
Build an empty continue statement.
ContinueStmt(SourceLocation CL)
static bool classof(const Stmt *T)
ContinueStmt(SourceLocation CL, SourceLocation LabelLoc, LabelDecl *Target)
Decl *const * const_iterator
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
std::reverse_iterator< decl_iterator > reverse_decl_iterator
llvm::iterator_range< decl_iterator > decl_range
const_child_range children() const
SourceLocation getEndLoc() const
const DeclGroupRef getDeclGroup() const
DeclStmt(EmptyShell Empty)
Build an empty declaration statement.
bool isSingleDecl() const
isSingleDecl - This method returns true if this DeclStmt refers to a single Decl.
const_decl_iterator decl_begin() const
void setStartLoc(SourceLocation L)
DeclGroupRef::const_iterator const_decl_iterator
static bool classof(const Stmt *T)
void setEndLoc(SourceLocation L)
decl_iterator decl_begin()
void setDeclGroup(DeclGroupRef DGR)
const Decl * getSingleDecl() const
decl_const_range decls() const
const_decl_iterator decl_end() const
DeclGroupRef::iterator decl_iterator
SourceLocation getBeginLoc() const LLVM_READONLY
DeclGroupRef getDeclGroup()
reverse_decl_iterator decl_rend()
llvm::iterator_range< const_decl_iterator > decl_const_range
reverse_decl_iterator decl_rbegin()
DeclStmt(DeclGroupRef dg, SourceLocation startLoc, SourceLocation endLoc)
Decl - This represents one declaration (or definition), e.g.
const Stmt * getSubStmt() const
SourceLocation getEndLoc() const LLVM_READONLY
void setDefaultLoc(SourceLocation L)
SourceLocation getDefaultLoc() const
DefaultStmt(EmptyShell Empty)
Build an empty default statement.
static bool classof(const Stmt *T)
DefaultStmt(SourceLocation DL, SourceLocation CL, Stmt *substmt)
const_child_range children() const
SourceLocation getBeginLoc() const
const Stmt * getBody() const
SourceLocation getEndLoc() const
SourceLocation getBeginLoc() const
void setDeferLoc(SourceLocation DeferLoc)
const_child_range children() const
SourceLocation getDeferLoc() const
static bool classof(const Stmt *S)
static DeferStmt * CreateEmpty(ASTContext &Context, EmptyShell Empty)
friend class ASTStmtReader
void setWhileLoc(SourceLocation L)
SourceLocation getBeginLoc() const
void setDoLoc(SourceLocation L)
SourceLocation getEndLoc() const
SourceLocation getWhileLoc() const
static bool classof(const Stmt *T)
const_child_range children() const
DoStmt(EmptyShell Empty)
Build an empty do-while statement.
SourceLocation getDoLoc() const
void setRParenLoc(SourceLocation L)
SourceLocation getRParenLoc() const
const Stmt * getBody() const
DoStmt(Stmt *Body, Expr *Cond, SourceLocation DL, SourceLocation WL, SourceLocation RP)
const Expr * getCond() const
This represents one expression.
Represents difference between two FPOptions values.
ForStmt(const ASTContext &C, Stmt *Init, Expr *Cond, VarDecl *condVar, Expr *Inc, Stmt *Body, SourceLocation FL, SourceLocation LP, SourceLocation RP)
VarDecl * getConditionVariable() const
Retrieve the variable declared in this "for" statement, if any.
SourceLocation getEndLoc() const
SourceLocation getRParenLoc() const
const_child_range children() const
const DeclStmt * getConditionVariableDeclStmt() const
void setForLoc(SourceLocation L)
const Expr * getInc() const
ForStmt(EmptyShell Empty)
Build an empty for statement.
void setLParenLoc(SourceLocation L)
const Expr * getCond() const
void setConditionVariableDeclStmt(DeclStmt *CondVar)
SourceLocation getBeginLoc() const
static bool classof(const Stmt *T)
const Stmt * getInit() const
void setConditionVariable(const ASTContext &C, VarDecl *V)
SourceLocation getForLoc() const
friend class ASTStmtReader
const Stmt * getBody() const
SourceLocation getLParenLoc() const
DeclStmt * getConditionVariableDeclStmt()
If this ForStmt has a condition variable, return the faux DeclStmt associated with the creation of th...
void setRParenLoc(SourceLocation L)
AsmStringPiece(const std::string &S)
const std::string & getString() const
unsigned getOperandNo() const
CharSourceRange getRange() const
AsmStringPiece(unsigned OpNo, const std::string &S, SourceLocation Begin, SourceLocation End)
char getModifier() const
getModifier - Get the modifier for this operand, if present.
const Expr * getInputExpr(unsigned i) const
const_labels_iterator end_labels() const
std::string getOutputConstraint(unsigned i) const
getOutputConstraint - Return the constraint string for the specified output operand.
unsigned getNumLabels() const
std::string generateAsmString(const ASTContext &C) const
Assemble final IR asm string.
SourceLocation getRParenLoc() const
std::string getAsmString() const
labels_const_range labels() const
llvm::iterator_range< labels_iterator > labels_range
Expr * getInputConstraintExpr(unsigned i)
void setAsmStringExpr(Expr *E)
labels_iterator begin_labels()
IdentifierInfo * getInputIdentifier(unsigned i) const
ConstCastIterator< AddrLabelExpr > const_labels_iterator
CastIterator< AddrLabelExpr > labels_iterator
const Expr * getClobberExpr(unsigned i) const
std::string getInputConstraint(unsigned i) const
getInputConstraint - Return the specified input constraint.
labels_iterator end_labels()
const Expr * getOutputConstraintExpr(unsigned i) const
StringRef getLabelName(unsigned i) const
unsigned AnalyzeAsmString(SmallVectorImpl< AsmStringPiece > &Pieces, const ASTContext &C, unsigned &DiagOffs) const
AnalyzeAsmString - Analyze the asm string of the current asm, decomposing it into pieces.
void setRParenLoc(SourceLocation L)
void setInputExpr(unsigned i, Expr *E)
Expr * getAsmStringExpr()
std::string getClobber(unsigned i) const
static bool classof(const Stmt *T)
StringRef getInputName(unsigned i) const
SourceLocation getEndLoc() const LLVM_READONLY
StringRef getOutputName(unsigned i) const
const_labels_iterator begin_labels() const
GCCAsmStmt(EmptyShell Empty)
Build an empty inline-assembly statement.
IdentifierInfo * getLabelIdentifier(unsigned i) const
const Expr * getInputConstraintExpr(unsigned i) const
IdentifierInfo * getOutputIdentifier(unsigned i) const
const Expr * getAsmStringExpr() const
Expr * getOutputExpr(unsigned i)
llvm::iterator_range< const_labels_iterator > labels_const_range
GCCAsmStmt(const ASTContext &C, SourceLocation asmloc, bool issimple, bool isvolatile, unsigned numoutputs, unsigned numinputs, IdentifierInfo **names, Expr **constraints, Expr **exprs, Expr *asmstr, unsigned numclobbers, Expr **clobbers, unsigned numlabels, SourceLocation rparenloc)
Expr * getOutputConstraintExpr(unsigned i)
Expr * getClobberExpr(unsigned i)
int getNamedOperand(StringRef SymbolicName) const
getNamedOperand - Given a symbolic operand reference like %[foo], translate this into a numeric value...
friend class ASTStmtReader
const Expr * getOutputExpr(unsigned i) const
SourceLocation getBeginLoc() const LLVM_READONLY
Expr * getInputExpr(unsigned i)
AddrLabelExpr * getLabelExpr(unsigned i) const
static std::string ExtractStringFromGCCAsmStmtComponent(const Expr *E)
GotoStmt(LabelDecl *label, SourceLocation GL, SourceLocation LL)
SourceLocation getLabelLoc() const
SourceLocation getGotoLoc() const
void setLabel(LabelDecl *D)
GotoStmt(EmptyShell Empty)
Build an empty goto statement.
void setLabelLoc(SourceLocation L)
LabelDecl * getLabel() const
SourceLocation getEndLoc() const
const_child_range children() const
static bool classof(const Stmt *T)
void setGotoLoc(SourceLocation L)
SourceLocation getBeginLoc() const
One of these records is kept for each identifier that is lexed.
bool hasElseStorage() const
True if this IfStmt has storage for an else statement.
const Stmt * getElse() const
void setConditionVariableDeclStmt(DeclStmt *CondVar)
void setLParenLoc(SourceLocation Loc)
SourceLocation getIfLoc() const
void setConditionVariable(const ASTContext &Ctx, VarDecl *V)
Set the condition variable for this if statement.
bool hasVarStorage() const
True if this IfStmt has storage for a variable declaration.
const DeclStmt * getConditionVariableDeclStmt() const
IfStatementKind getStatementKind() const
SourceLocation getElseLoc() const
bool isNonNegatedConsteval() const
SourceLocation getLParenLoc() const
static bool classof(const Stmt *T)
const Stmt * getThen() const
const Expr * getCond() const
const VarDecl * getConditionVariable() const
void setElseLoc(SourceLocation ElseLoc)
const Stmt * getInit() const
static IfStmt * CreateEmpty(const ASTContext &Ctx, bool HasElse, bool HasVar, bool HasInit)
Create an empty IfStmt optionally with storage for an else statement, condition variable and init exp...
bool hasInitStorage() const
True if this IfStmt has the storage for an init statement.
void setStatementKind(IfStatementKind Kind)
std::optional< const Stmt * > getNondiscardedCase(const ASTContext &Ctx) const
If this is an 'if constexpr', determine which substatement will be taken.
bool isObjCAvailabilityCheck() const
bool isNegatedConsteval() const
DeclStmt * getConditionVariableDeclStmt()
If this IfStmt has a condition variable, return the faux DeclStmt associated with the creation of tha...
const_child_range children() const
SourceLocation getRParenLoc() const
void setRParenLoc(SourceLocation Loc)
SourceLocation getBeginLoc() const
SourceLocation getEndLoc() const LLVM_READONLY
void setIfLoc(SourceLocation IfLoc)
VarDecl * getConditionVariable()
Retrieve the variable declared in this "if" statement, if any.
SourceLocation getEndLoc() const LLVM_READONLY
static bool classof(const Stmt *T)
LabelDecl * getConstantTarget()
getConstantTarget - Returns the fixed target of this indirect goto, if one exists.
IndirectGotoStmt(SourceLocation gotoLoc, SourceLocation starLoc, Expr *target)
SourceLocation getGotoLoc() const
SourceLocation getBeginLoc() const
void setGotoLoc(SourceLocation L)
const_child_range children() const
const LabelDecl * getConstantTarget() const
void setStarLoc(SourceLocation L)
IndirectGotoStmt(EmptyShell Empty)
Build an empty indirect goto statement.
const Expr * getTarget() const
SourceLocation getStarLoc() const
Represents the declaration of a label.
Stmt * getInnermostLabeledStmt()
LabelStmt(SourceLocation IL, LabelDecl *D, Stmt *substmt)
Build a label statement.
static bool classof(const Stmt *T)
LabelDecl * getDecl() const
LabelStmt(EmptyShell Empty)
Build an empty label statement.
SourceLocation getIdentLoc() const
void setSubStmt(Stmt *SS)
void setDecl(LabelDecl *D)
SourceLocation getBeginLoc() const
void setIdentLoc(SourceLocation L)
const_child_range children() const
const Stmt * getInnermostLabeledStmt() const
Look through nested labels and return the first non-label statement; e.g.
SourceLocation getEndLoc() const LLVM_READONLY
void setSideEntry(bool SE)
const char * getName() const
const Stmt * getSubStmt() const
SourceLocation getBeginLoc() const
LoopControlStmt(StmtClass Class, SourceLocation Loc)
LoopControlStmt(StmtClass Class, EmptyShell ES)
void setLabelDecl(LabelDecl *S)
LoopControlStmt(StmtClass Class, SourceLocation Loc, SourceLocation LabelLoc, LabelDecl *Target)
static bool classof(const Stmt *T)
SourceLocation getLabelLoc() const
LabelDecl * getLabelDecl()
const LabelDecl * getLabelDecl() const
void setLabelLoc(SourceLocation L)
const_child_range children() const
SourceLocation getKwLoc() const
void setKwLoc(SourceLocation L)
const Stmt * getNamedLoopOrSwitch() const
If this is a named break/continue, get the loop or switch statement that this targets.
SourceLocation getEndLoc() const
const Expr * getOutputExpr(unsigned i) const
Expr * getOutputExpr(unsigned i)
ArrayRef< StringRef > getClobbers() const
SourceLocation getBeginLoc() const LLVM_READONLY
StringRef getAsmString() const
SourceLocation getLBraceLoc() const
SourceLocation getEndLoc() const
StringRef getInputConstraint(unsigned i) const
void setEndLoc(SourceLocation L)
void setInputExpr(unsigned i, Expr *E)
StringRef getOutputConstraint(unsigned i) const
ArrayRef< StringRef > getAllConstraints() const
static bool classof(const Stmt *T)
friend class ASTStmtReader
StringRef getClobber(unsigned i) const
const Expr * getInputExpr(unsigned i) const
MSAsmStmt(const ASTContext &C, SourceLocation asmloc, SourceLocation lbraceloc, bool issimple, bool isvolatile, ArrayRef< Token > asmtoks, unsigned numoutputs, unsigned numinputs, ArrayRef< StringRef > constraints, ArrayRef< Expr * > exprs, StringRef asmstr, ArrayRef< StringRef > clobbers, SourceLocation endloc)
void setLBraceLoc(SourceLocation L)
MSAsmStmt(EmptyShell Empty)
Build an empty MS-style inline-assembly statement.
std::string generateAsmString(const ASTContext &C) const
Assemble final IR asm string.
const_child_range children() const
ArrayRef< Expr * > getAllExprs() const
Expr * getInputExpr(unsigned i)
void setSemiLoc(SourceLocation L)
bool hasLeadingEmptyMacro() const
SourceLocation getBeginLoc() const
SourceLocation getSemiLoc() const
static bool classof(const Stmt *T)
NullStmt(SourceLocation L, bool hasLeadingEmptyMacro=false)
NullStmt(EmptyShell Empty)
Build an empty null statement.
const_child_range children() const
SourceLocation getEndLoc() const
Represents a struct/union/class.
void setRetValue(Expr *E)
void setReturnLoc(SourceLocation L)
SourceLocation getReturnLoc() const
static bool classof(const Stmt *T)
SourceLocation getEndLoc() const LLVM_READONLY
void setNRVOCandidate(const VarDecl *Var)
Set the variable that might be used for the named return value optimization.
SourceLocation getBeginLoc() const
const VarDecl * getNRVOCandidate() const
Retrieve the variable that might be used for the named return value optimization.
const_child_range children() const
static ReturnStmt * CreateEmpty(const ASTContext &Ctx, bool HasNRVOCandidate)
Create an empty return statement, optionally with storage for an NRVO candidate.
const Expr * getRetValue() const
const_child_range children() const
CompoundStmt * getBlock() const
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getExceptLoc() const
friend class ASTStmtReader
SourceLocation getEndLoc() const
static bool classof(const Stmt *T)
Expr * getFilterExpr() const
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getEndLoc() const
const_child_range children() const
SourceLocation getFinallyLoc() const
static bool classof(const Stmt *T)
friend class ASTStmtReader
CompoundStmt * getBlock() const
SourceLocation getLeaveLoc() const
SourceLocation getEndLoc() const LLVM_READONLY
SEHLeaveStmt(EmptyShell Empty)
Build an empty __leave statement.
SEHLeaveStmt(SourceLocation LL)
SourceLocation getBeginLoc() const LLVM_READONLY
static bool classof(const Stmt *T)
void setLeaveLoc(SourceLocation L)
const_child_range children() const
const_child_range children() const
CompoundStmt * getTryBlock() const
static bool classof(const Stmt *T)
SourceLocation getTryLoc() const
SEHFinallyStmt * getFinallyHandler() const
SourceLocation getBeginLoc() const LLVM_READONLY
friend class ASTStmtReader
SourceLocation getEndLoc() const
SEHExceptStmt * getExceptHandler() const
Returns 0 if not defined.
Stmt * getHandler() const
Encodes a location in the source.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
friend class ArraySubscriptExpr
friend class MatrixSingleSubscriptExpr
friend class MatrixSubscriptExpr
friend class ArrayTypeTraitExpr
friend class ASTStmtReader
friend class ASTStmtReader
friend class AttributedStmt
friend class BinaryOperator
friend class CXXBoolLiteralExpr
friend class CXXConstructExpr
friend class ASTStmtReader
friend class CXXDefaultArgExpr
friend class ASTStmtReader
friend class ASTStmtReader
friend class CXXDefaultInitExpr
friend class CXXDeleteExpr
friend class ASTStmtReader
friend class CXXDependentScopeMemberExpr
friend class ASTStmtReader
friend class ASTStmtWriter
friend class ASTStmtReader
friend class ASTStmtWriter
friend class ASTStmtReader
friend class ASTStmtReader
friend class CXXNoexceptExpr
friend class CXXNullPtrLiteralExpr
friend class CXXOperatorCallExpr
friend class ASTStmtReader
friend class CXXRewrittenBinaryOperator
friend class ASTStmtReader
friend class CXXScalarValueInitExpr
friend class ASTStmtReader
friend class CXXThrowExpr
friend class ASTStmtReader
friend class CXXUnresolvedConstructExpr
friend class ASTStmtReader
friend class ImplicitCastExpr
friend class CharacterLiteral
friend class ASTStmtReader
friend class CompoundStmt
friend class ASTStmtReader
friend class ConstantExpr
friend class ASTStmtWriter
friend class ASTStmtReader
friend class ConvertVectorExpr
friend class ASTStmtReader
friend class DependentScopeDeclRefExpr
friend class ASTStmtWriter
friend class ASTStmtReader
friend class ParenListExpr
friend class DesignatedInitExpr
friend class PseudoObjectExpr
friend class ObjCMessageExpr
friend class ObjCDictionaryLiteral
friend class ObjCArrayLiteral
friend class CXXDependentScopeMemberExpr
friend class CXXConstructExpr
friend class OpaqueValueExpr
friend class DependentScopeDeclRefExpr
friend class CXXUnresolvedConstructExpr
friend class InitListExpr
friend class ASTStmtReader
friend class OverloadExpr
friend class OffsetOfExpr
friend class ShuffleVectorExpr
friend class ExprWithCleanups
friend class ASTStmtReader
friend class ExpressionTraitExpr
friend class ASTStmtReader
friend class FloatingLiteral
friend class GenericSelectionExpr
friend class ASTStmtReader
friend class IndirectGotoStmt
friend class ASTStmtReader
friend class InitListExpr
friend class ASTStmtReader
friend class ASTStmtWriter
friend class ASTStmtReader
friend class LoopControlStmt
friend class ASTStmtReader
friend class ASTStmtWriter
friend class ASTStmtReader
friend class ObjCIndirectCopyRestoreExpr
friend class ObjCObjectLiteral
friend class OpaqueValueExpr
friend class ASTStmtReader
friend class ASTStmtReader
friend class OverloadExpr
friend class PackIndexingExpr
friend class ASTStmtWriter
friend class ASTStmtReader
friend class ASTStmtWriter
friend class ASTStmtReader
friend class ParenListExpr
friend class ASTStmtReader
friend class PredefinedExpr
friend class ASTStmtReader
friend class PseudoObjectExpr
friend class ASTStmtReader
friend class RequiresExpr
friend class ASTStmtWriter
friend class ASTStmtReader
friend class ShuffleVectorExpr
friend class SourceLocExpr
friend class ASTStmtReader
friend class ASTStmtWriter
friend class ASTStmtReader
friend class ASTStmtReader
friend class StringLiteral
friend class ASTStmtReader
friend class SubstNonTypeTemplateParmExpr
friend class ASTStmtReader
friend class TypeTraitExpr
friend class ASTStmtWriter
friend class ASTStmtReader
friend class UnaryExprOrTypeTraitExpr
friend class UnaryOperator
friend class UnresolvedLookupExpr
friend class ASTStmtReader
friend class UnresolvedMemberExpr
friend class ASTStmtReader
friend class ASTStmtReader
Stmt - This represents one statement.
ExpressionTraitExprBitfields ExpressionTraitExprBits
LoopControlStmtBitfields LoopControlStmtBits
SourceLocation getEndLoc() const LLVM_READONLY
void ProcessODRHash(llvm::FoldingSetNodeID &ID, ODRHash &Hash) const
Calculate a unique representation for a statement that is stable across compiler invocations.
Stmt(const Stmt &)=delete
UnaryExprOrTypeTraitExprBitfields UnaryExprOrTypeTraitExprBits
CXXUnresolvedConstructExprBitfields CXXUnresolvedConstructExprBits
WhileStmtBitfields WhileStmtBits
SwitchCaseBitfields SwitchCaseBits
GenericSelectionExprBitfields GenericSelectionExprBits
ObjCObjectLiteralBitfields ObjCObjectLiteralBits
InitListExprBitfields InitListExprBits
static void EnableStatistics()
LambdaExprBitfields LambdaExprBits
AttributedStmtBitfields AttributedStmtBits
ParenListExprBitfields ParenListExprBits
ArrayOrMatrixSubscriptExprBitfields ArrayOrMatrixSubscriptExprBits
UnresolvedLookupExprBitfields UnresolvedLookupExprBits
SwitchStmtBitfields SwitchStmtBits
SubstNonTypeTemplateParmExprBitfields SubstNonTypeTemplateParmExprBits
CXXNoexceptExprBitfields CXXNoexceptExprBits
ParenExprBitfields ParenExprBits
StmtIterator child_iterator
Child Iterators: All subclasses must implement 'children' to permit easy iteration over the substatem...
CXXRewrittenBinaryOperatorBitfields CXXRewrittenBinaryOperatorBits
CallExprBitfields CallExprBits
Stmt * stripLabelLikeStatements()
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
CastIterator< T, const T *const, const Stmt *const > ConstCastIterator
Const iterator for iterating over Stmt * arrays that contain only T *.
const Stmt * stripLabelLikeStatements() const
Strip off all label-like statements.
ShuffleVectorExprBitfields ShuffleVectorExprBits
ExprWithCleanupsBitfields ExprWithCleanupsBits
FloatingLiteralBitfields FloatingLiteralBits
const_child_range children() const
child_iterator child_begin()
void printJson(raw_ostream &Out, PrinterHelper *Helper, const PrintingPolicy &Policy, bool AddQuotes) const
Pretty-prints in JSON format.
StmtClass getStmtClass() const
CXXScalarValueInitExprBitfields CXXScalarValueInitExprBits
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
CharacterLiteralBitfields CharacterLiteralBits
OverloadExprBitfields OverloadExprBits
CXXConstructExprBitfields CXXConstructExprBits
void printPrettyControlled(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
UnaryOperatorBitfields UnaryOperatorBits
static std::tuple< bool, const Attr *, const Attr * > determineLikelihoodConflict(const Stmt *Then, const Stmt *Else)
CXXDependentScopeMemberExprBitfields CXXDependentScopeMemberExprBits
GotoStmtBitfields GotoStmtBits
child_iterator child_end()
ConstCastIterator< Expr > ConstExprIterator
TypeTraitExprBitfields TypeTraitExprBits
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
CXXNewExprBitfields CXXNewExprBits
SourceLocExprBitfields SourceLocExprBits
CXXNullPtrLiteralExprBitfields CXXNullPtrLiteralExprBits
CoawaitExprBitfields CoawaitBits
Stmt(StmtClass SC, EmptyShell)
Construct an empty statement.
ChooseExprBitfields ChooseExprBits
ConstantExprBitfields ConstantExprBits
llvm::iterator_range< child_iterator > child_range
DeferStmtBitfields DeferStmtBits
CompoundStmtBitfields CompoundStmtBits
RequiresExprBitfields RequiresExprBits
CXXFoldExprBitfields CXXFoldExprBits
StmtExprBitfields StmtExprBits
StringLiteralBitfields StringLiteralBits
OpaqueValueExprBitfields OpaqueValueExprBits
CastExprBitfields CastExprBits
Likelihood
The likelihood of a branch being taken.
@ LH_Unlikely
Branch has the [[unlikely]] attribute.
@ LH_None
No attribute set or branches of the IfStmt have the same attribute.
@ LH_Likely
Branch has the [[likely]] attribute.
CXXThrowExprBitfields CXXThrowExprBits
static void addStmtClass(const StmtClass s)
MemberExprBitfields MemberExprBits
PackIndexingExprBitfields PackIndexingExprBits
friend class ASTStmtWriter
ForStmtBitfields ForStmtBits
DeclRefExprBitfields DeclRefExprBits
const_child_iterator child_end() const
const char * getStmtClassName() const
ConstStmtIterator const_child_iterator
void dumpPretty(const ASTContext &Context) const
dumpPretty/printPretty - These two methods do a "pretty print" of the AST back to its original source...
CXXBoolLiteralExprBitfields CXXBoolLiteralExprBits
CXXOperatorCallExprBitfields CXXOperatorCallExprBits
CXXDefaultInitExprBitfields CXXDefaultInitExprBits
Stmt & operator=(const Stmt &)=delete
NullStmtBitfields NullStmtBits
static const Attr * getLikelihoodAttr(const Stmt *S)
Stmt * IgnoreContainers(bool IgnoreCaptured=false)
Skip no-op (attributed, compound) container stmts and skip captured stmt at the top,...
DependentScopeDeclRefExprBitfields DependentScopeDeclRefExprBits
friend class ASTStmtReader
ArrayTypeTraitExprBitfields ArrayTypeTraitExprBits
IfStmtBitfields IfStmtBits
Stmt & operator=(Stmt &&)=delete
PredefinedExprBitfields PredefinedExprBits
ConvertVectorExprBitfields ConvertVectorExprBits
int64_t getID(const ASTContext &Context) const
ReturnStmtBitfields ReturnStmtBits
LabelStmtBitfields LabelStmtBits
ObjCIndirectCopyRestoreExprBitfields ObjCIndirectCopyRestoreExprBits
SourceLocation getBeginLoc() const LLVM_READONLY
void dumpColor() const
dumpColor - same as dump(), but forces color highlighting.
BinaryOperatorBitfields BinaryOperatorBits
UnresolvedMemberExprBitfields UnresolvedMemberExprBits
PseudoObjectExprBitfields PseudoObjectExprBits
void viewAST() const
viewAST - Visualize an AST rooted at this Stmt* using GraphViz.
llvm::iterator_range< const_child_iterator > const_child_range
const_child_iterator child_begin() const
CXXDeleteExprBitfields CXXDeleteExprBits
CXXDefaultArgExprBitfields CXXDefaultArgExprBits
DoStmtBitfields DoStmtBits
CXXThisExprBitfields CXXThisExprBits
CastIterator< Expr > ExprIterator
StringLiteral - This represents a string literal expression, e.g.
SwitchCase * NextSwitchCase
A pointer to the following CaseStmt or DefaultStmt class, used by SwitchStmt.
void setColonLoc(SourceLocation L)
static bool classof(const Stmt *T)
SwitchCase(StmtClass SC, EmptyShell)
SourceLocation getKeywordLoc() const
SwitchCase(StmtClass SC, SourceLocation KWLoc, SourceLocation ColonLoc)
void setKeywordLoc(SourceLocation L)
const Stmt * getSubStmt() const
void setNextSwitchCase(SwitchCase *SC)
SourceLocation getColonLoc() const
SourceLocation getBeginLoc() const
const SwitchCase * getNextSwitchCase() const
SourceLocation ColonLoc
The location of the ":".
SourceLocation getEndLoc() const LLVM_READONLY
SwitchCase * getNextSwitchCase()
const Stmt * getInit() const
SourceLocation getSwitchLoc() const
void addSwitchCase(SwitchCase *SC)
void setBody(Stmt *S, SourceLocation SL)
SourceLocation getLParenLoc() const
const Expr * getCond() const
bool isAllEnumCasesCovered() const
Returns true if the SwitchStmt is a switch of an enum value and all cases have been explicitly covere...
void setSwitchLoc(SourceLocation L)
void setConditionVariableDeclStmt(DeclStmt *CondVar)
void setRParenLoc(SourceLocation Loc)
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getRParenLoc() const
void setConditionVariable(const ASTContext &Ctx, VarDecl *VD)
Set the condition variable in this switch statement.
void setLParenLoc(SourceLocation Loc)
const Stmt * getBody() const
const VarDecl * getConditionVariable() const
static SwitchStmt * CreateEmpty(const ASTContext &Ctx, bool HasInit, bool HasVar)
Create an empty switch statement optionally with storage for an init expression and a condition varia...
const DeclStmt * getConditionVariableDeclStmt() const
bool hasVarStorage() const
True if this SwitchStmt has storage for a condition variable.
const_child_range children() const
VarDecl * getConditionVariable()
Retrieve the variable declared in this "switch" statement, if any.
SourceLocation getBeginLoc() const
bool hasInitStorage() const
True if this SwitchStmt has storage for an init statement.
SwitchCase * getSwitchCaseList()
const SwitchCase * getSwitchCaseList() const
DeclStmt * getConditionVariableDeclStmt()
If this SwitchStmt has a condition variable, return the faux DeclStmt associated with the creation of...
void setAllEnumCasesCovered()
Set a flag in the SwitchStmt indicating that if the 'switch (X)' is a switch over an enum value then ...
void setSwitchCaseList(SwitchCase *SC)
static bool classof(const Stmt *T)
Exposes information about the current target.
Token - This structure provides full information about a lexed token.
Represents a statement that could possibly have a value and type.
const Expr * getExprStmt() const
Stmt(StmtClass SC, EmptyShell)
Construct an empty statement.
static bool classof(const Stmt *T)
Represents a variable declaration or definition.
SourceLocation getWhileLoc() const
SourceLocation getRParenLoc() const
DeclStmt * getConditionVariableDeclStmt()
If this WhileStmt has a condition variable, return the faux DeclStmt associated with the creation of ...
void setLParenLoc(SourceLocation L)
VarDecl * getConditionVariable()
Retrieve the variable declared in this "while" statement, if any.
SourceLocation getEndLoc() const LLVM_READONLY
void setConditionVariable(const ASTContext &Ctx, VarDecl *V)
Set the condition variable of this while statement.
bool hasVarStorage() const
True if this WhileStmt has storage for a condition variable.
SourceLocation getLParenLoc() const
SourceLocation getBeginLoc() const
const Stmt * getBody() const
void setRParenLoc(SourceLocation L)
const VarDecl * getConditionVariable() const
void setWhileLoc(SourceLocation L)
const Expr * getCond() const
static WhileStmt * CreateEmpty(const ASTContext &Ctx, bool HasVar)
Create an empty while statement optionally with storage for a condition variable.
const DeclStmt * getConditionVariableDeclStmt() const
void setConditionVariableDeclStmt(DeclStmt *CondVar)
static bool classof(const Stmt *T)
const_child_range children() const
Top level wrappers for InstallAPI frontend operations.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
ConstantResultStorageKind
Describes the kind of result that can be tail-allocated.
ExprDependenceScope::ExprDependence ExprDependence
IfStatementKind
In an if statement, this denotes whether the statement is a constexpr or consteval if statement.
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CapturedRegionKind
The different kinds of captured statement.
const FunctionProtoType * T
CastKind
CastKind - The kind of operation required for a conversion.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
U cast(CodeGen::Address addr)
@ Class
The "class" keyword introduces the elaborated-type-specifier.
CXXNewInitializationStyle
Diagnostic wrappers for TextAPI types for error reporting.
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 int64_t
Describes how types, statements, expressions, and declarations should be printed.
Iterator for iterating over Stmt * arrays that contain only T *.
typename CastIterator::iterator_adaptor_base Base
Base::value_type operator*() const
A placeholder type used to construct an empty shell of a type, that will be filled in later (e....