13#ifndef LLVM_CLANG_AST_STMT_H
14#define LLVM_CLANG_AST_STMT_H
31#include "llvm/ADT/APFloat.h"
32#include "llvm/ADT/ArrayRef.h"
33#include "llvm/ADT/BitmaskEnum.h"
34#include "llvm/ADT/PointerIntPair.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;
350 unsigned ValueKind : 2;
352 unsigned ObjectKind : 3;
354 unsigned Dependent : llvm::BitWidth<ExprDependence>;
368 unsigned ResultKind : 2;
372 unsigned APValueKind : 4;
376 LLVM_PREFERRED_TYPE(
bool)
377 unsigned IsUnsigned : 1;
383 unsigned BitWidth : 7;
387 LLVM_PREFERRED_TYPE(
bool)
388 unsigned HasCleanup : 1;
391 LLVM_PREFERRED_TYPE(
bool)
392 unsigned IsImmediateInvocation : 1;
407 LLVM_PREFERRED_TYPE(
bool)
408 unsigned HasFunctionName : 1;
412 LLVM_PREFERRED_TYPE(
bool)
413 unsigned IsTransparent : 1;
426 LLVM_PREFERRED_TYPE(
bool)
427 unsigned HasQualifier : 1;
428 LLVM_PREFERRED_TYPE(
bool)
429 unsigned HasTemplateKWAndArgsInfo : 1;
430 LLVM_PREFERRED_TYPE(
bool)
431 unsigned HasFoundDecl : 1;
432 LLVM_PREFERRED_TYPE(
bool)
433 unsigned HadMultipleCandidates : 1;
434 LLVM_PREFERRED_TYPE(
bool)
435 unsigned RefersToEnclosingVariableOrCapture : 1;
436 LLVM_PREFERRED_TYPE(
bool)
437 unsigned CapturedByCopyInLambdaWithExplicitObjectParameter : 1;
440 LLVM_PREFERRED_TYPE(
bool)
441 unsigned IsImmediateEscalating : 1;
455 llvm::APFloat::S_MaxSemantics < 32,
456 "Too many Semantics enum values to fit in bitfield of size 5");
457 LLVM_PREFERRED_TYPE(llvm::APFloat::Semantics)
458 unsigned Semantics : 5;
459 LLVM_PREFERRED_TYPE(
bool)
460 unsigned IsExact : 1;
478 unsigned CharByteWidth : 3;
480 LLVM_PREFERRED_TYPE(
bool)
481 unsigned IsPascal : 1;
485 unsigned NumConcatenated;
506 LLVM_PREFERRED_TYPE(
bool)
507 unsigned CanOverflow : 1;
512 LLVM_PREFERRED_TYPE(
bool)
513 unsigned HasFPFeatures : 1;
526 LLVM_PREFERRED_TYPE(
bool)
546 unsigned NumPreArgs : 1;
549 LLVM_PREFERRED_TYPE(
bool)
550 unsigned UsesADL : 1;
553 LLVM_PREFERRED_TYPE(
bool)
554 unsigned HasFPFeatures : 1;
557 LLVM_PREFERRED_TYPE(
bool)
558 unsigned IsCoroElideSafe : 1;
562 LLVM_PREFERRED_TYPE(
bool)
563 unsigned ExplicitObjectMemFunUsingMemberSyntax : 1;
567 LLVM_PREFERRED_TYPE(
bool)
568 unsigned HasTrailingSourceLoc : 1;
581 LLVM_PREFERRED_TYPE(
bool)
582 unsigned IsArrow : 1;
586 LLVM_PREFERRED_TYPE(
bool)
587 unsigned HasQualifier : 1;
590 LLVM_PREFERRED_TYPE(
bool)
591 unsigned HasFoundDecl : 1;
598 LLVM_PREFERRED_TYPE(
bool)
599 unsigned HasTemplateKWAndArgsInfo : 1;
603 LLVM_PREFERRED_TYPE(
bool)
604 unsigned HadMultipleCandidates : 1;
625 LLVM_PREFERRED_TYPE(
bool)
626 unsigned PartOfExplicitCast : 1;
629 LLVM_PREFERRED_TYPE(
bool)
630 unsigned HasFPFeatures : 1;
634 unsigned BasePathSize;
649 LLVM_PREFERRED_TYPE(
bool)
650 unsigned HasFPFeatures : 1;
654 LLVM_PREFERRED_TYPE(
bool)
655 unsigned ExcludedOverflowPattern : 1;
668 LLVM_PREFERRED_TYPE(
bool)
669 unsigned HadArrayRangeDesignator : 1;
701 unsigned NumSubExprs : 16;
702 unsigned ResultIndex : 16;
726 LLVM_PREFERRED_TYPE(
bool)
727 unsigned ProducedByFoldExpansion : 1;
749 unsigned TemplateDepth;
759 LLVM_PREFERRED_TYPE(
bool)
775 unsigned OperatorKind : 6;
785 LLVM_PREFERRED_TYPE(
bool)
786 unsigned IsReversed : 1;
796 LLVM_PREFERRED_TYPE(
bool)
820 LLVM_PREFERRED_TYPE(
bool)
821 unsigned IsImplicit : 1;
825 LLVM_PREFERRED_TYPE(
bool)
826 unsigned CapturedByCopyInLambdaWithExplicitObjectParameter : 1;
840 LLVM_PREFERRED_TYPE(
bool)
841 unsigned IsThrownVariableInScope : 1;
855 LLVM_PREFERRED_TYPE(
bool)
856 unsigned HasRewrittenInit : 1;
871 LLVM_PREFERRED_TYPE(
bool)
872 unsigned HasRewrittenInit : 1;
897 LLVM_PREFERRED_TYPE(
bool)
898 unsigned IsGlobalNew : 1;
902 LLVM_PREFERRED_TYPE(
bool)
903 unsigned IsArray : 1;
906 LLVM_PREFERRED_TYPE(
bool)
907 unsigned ShouldPassAlignment : 1;
910 LLVM_PREFERRED_TYPE(
bool)
911 unsigned ShouldPassTypeIdentity : 1;
915 LLVM_PREFERRED_TYPE(
bool)
916 unsigned UsualArrayDeleteWantsSize : 1;
919 LLVM_PREFERRED_TYPE(
bool)
920 unsigned HasInitializer : 1;
924 unsigned StoredInitializationStyle : 2;
927 LLVM_PREFERRED_TYPE(
bool)
928 unsigned IsParenTypeId : 1;
931 unsigned NumPlacementArgs;
942 LLVM_PREFERRED_TYPE(
bool)
943 unsigned GlobalDelete : 1;
946 LLVM_PREFERRED_TYPE(
bool)
947 unsigned ArrayForm : 1;
952 LLVM_PREFERRED_TYPE(
bool)
953 unsigned ArrayFormAsWritten : 1;
957 LLVM_PREFERRED_TYPE(
bool)
958 unsigned UsualArrayDeleteWantsSize : 1;
976 LLVM_PREFERRED_TYPE(
bool)
977 unsigned IsBooleanTypeTrait : 1;
981 LLVM_PREFERRED_TYPE(
bool)
999 LLVM_PREFERRED_TYPE(
bool)
1000 unsigned HasTemplateKWAndArgsInfo : 1;
1010 LLVM_PREFERRED_TYPE(
bool)
1011 unsigned Elidable : 1;
1012 LLVM_PREFERRED_TYPE(
bool)
1013 unsigned HadMultipleCandidates : 1;
1014 LLVM_PREFERRED_TYPE(
bool)
1015 unsigned ListInitialization : 1;
1016 LLVM_PREFERRED_TYPE(
bool)
1017 unsigned StdInitListInitialization : 1;
1018 LLVM_PREFERRED_TYPE(
bool)
1019 unsigned ZeroInitialization : 1;
1021 unsigned ConstructionKind : 3;
1022 LLVM_PREFERRED_TYPE(
bool)
1023 unsigned IsImmediateEscalating : 1;
1036 LLVM_PREFERRED_TYPE(
bool)
1037 unsigned CleanupsHaveSideEffects : 1;
1062 LLVM_PREFERRED_TYPE(
bool)
1063 unsigned IsArrow : 1;
1067 LLVM_PREFERRED_TYPE(
bool)
1068 unsigned HasTemplateKWAndArgsInfo : 1;
1072 LLVM_PREFERRED_TYPE(
bool)
1073 unsigned HasFirstQualifierFoundInScope : 1;
1088 LLVM_PREFERRED_TYPE(
bool)
1089 unsigned HasTemplateKWAndArgsInfo : 1;
1097 unsigned NumResults;
1110 LLVM_PREFERRED_TYPE(
bool)
1111 unsigned RequiresADL : 1;
1114 "UnresolvedLookupExprBitfields must be <= than 4 bytes to"
1115 "avoid trashing OverloadExprBitfields::NumResults!");
1126 LLVM_PREFERRED_TYPE(
bool)
1127 unsigned IsArrow : 1;
1130 LLVM_PREFERRED_TYPE(
bool)
1131 unsigned HasUnresolvedUsing : 1;
1134 "UnresolvedMemberExprBitfields must be <= than 4 bytes to"
1135 "avoid trashing OverloadExprBitfields::NumResults!");
1144 LLVM_PREFERRED_TYPE(
bool)
1170 unsigned CaptureDefault : 2;
1174 LLVM_PREFERRED_TYPE(
bool)
1175 unsigned ExplicitParams : 1;
1178 LLVM_PREFERRED_TYPE(
bool)
1179 unsigned ExplicitResultType : 1;
1182 unsigned NumCaptures : 16;
1193 LLVM_PREFERRED_TYPE(
bool)
1194 unsigned IsSatisfied : 1;
1220 LLVM_PREFERRED_TYPE(
bool)
1243 unsigned TransformedExpressions : 31;
1245 LLVM_PREFERRED_TYPE(
bool)
1246 unsigned FullySubstituted : 1;
1257 LLVM_PREFERRED_TYPE(
bool)
1258 unsigned IsImplicit : 1;
1269 LLVM_PREFERRED_TYPE(
bool)
1270 unsigned ShouldCopy : 1;
1284 LLVM_PREFERRED_TYPE(
bool)
1285 unsigned IsUnique : 1;
1300 LLVM_PREFERRED_TYPE(
bool)
1301 unsigned HasFPFeatures : 1;
1394 unsigned alignment = 8);
1397 unsigned alignment = 8) {
1398 return operator new(
bytes, *
C, alignment);
1401 void *
operator new(
size_t bytes,
void *mem)
noexcept {
return mem; }
1405 void operator delete(
void *,
size_t)
noexcept {}
1406 void operator delete(
void *,
void *)
noexcept {}
1427 template<
typename T,
typename TPtr = T *,
typename StmtPtr = Stmt *>
1429 : llvm::iterator_adaptor_base<CastIterator<T, TPtr, StmtPtr>, StmtPtr *,
1430 std::random_access_iterator_tag, TPtr> {
1431 using Base =
typename CastIterator::iterator_adaptor_base;
1437 return cast_or_null<T>(*this->I);
1442 template <
typename T>
1450 static bool StatisticsEnabled;
1464 static_assert(
sizeof(*this) <= 8,
1465 "changing bitfields changed sizeof(Stmt)");
1466 static_assert(
sizeof(*this) %
alignof(
void *) == 0,
1467 "Insufficient alignment!");
1507 static
std::tuple<
bool, const
Attr *, const
Attr *>
1526 StringRef NewlineSymbol = "\n",
1530 unsigned Indentation = 0,
1531 StringRef NewlineSymbol = "\n",
1551 return const_cast<Stmt*
>(
1595 bool Canonical,
bool ProfileLambdaExpr =
false)
const;
1617 :
Stmt(DeclStmtClass), DG(dg), StartLoc(startLoc), EndLoc(endLoc) {}
1640 return T->getStmtClass() == DeclStmtClass;
1686 :
Stmt(NullStmtClass) {
1705 return T->getStmtClass() == NullStmtClass;
1720 private llvm::TrailingObjects<CompoundStmt, Stmt *, FPOptionsOverride> {
1722 friend TrailingObjects;
1739 *getTrailingObjects<FPOptionsOverride>() = F;
1742 size_t numTrailingObjects(OverloadToken<Stmt *>)
const {
1747 static CompoundStmt *
Create(
const ASTContext &
C, ArrayRef<Stmt *> Stmts,
1748 FPOptionsOverride FPFeatures, SourceLocation LB,
1755 :
Stmt(CompoundStmtClass), LBraceLoc(
Loc), RBraceLoc(EndLoc) {
1762 bool HasFPFeatures);
1772 return *getTrailingObjects<FPOptionsOverride>();
1800 return getTrailingObjects<Stmt *>();
1824 std::reverse_iterator<const_body_iterator>;
1843 for (
auto *B : llvm::reverse(
body())) {
1844 if (!isa<NullStmt>(B))
1861 return T->getStmtClass() == CompoundStmtClass;
1911 return T->getStmtClass() == CaseStmtClass ||
1912 T->getStmtClass() == DefaultStmtClass;
1920 private llvm::TrailingObjects<CaseStmt, Stmt *, SourceLocation> {
1921 friend TrailingObjects;
1938 enum { LhsOffset = 0, SubStmtOffsetFromRhs = 1 };
1939 enum { NumMandatoryStmtPtr = 2 };
1941 unsigned numTrailingObjects(OverloadToken<Stmt *>)
const {
1945 unsigned lhsOffset()
const {
return LhsOffset; }
1947 unsigned subStmtOffset()
const {
return rhsOffset() + SubStmtOffsetFromRhs; }
1953 :
SwitchCase(CaseStmtClass, caseLoc, colonLoc) {
1955 bool IsGNURange = rhs !=
nullptr;
1999 "setEllipsisLoc but this is not a case stmt of the form LHS ... RHS!");
2000 *getTrailingObjects<SourceLocation>() = L;
2004 return reinterpret_cast<Expr *
>(getTrailingObjects<Stmt *>()[lhsOffset()]);
2008 return reinterpret_cast<Expr *
>(getTrailingObjects<Stmt *>()[lhsOffset()]);
2012 getTrailingObjects<Stmt *>()[lhsOffset()] =
reinterpret_cast<Stmt *
>(Val);
2017 getTrailingObjects<Stmt *>()[rhsOffset()])
2023 getTrailingObjects<Stmt *>()[rhsOffset()])
2029 "setRHS but this is not a case stmt of the form LHS ... RHS!");
2030 getTrailingObjects<Stmt *>()[rhsOffset()] =
reinterpret_cast<Stmt *
>(Val);
2035 return getTrailingObjects<Stmt *>()[subStmtOffset()];
2039 getTrailingObjects<Stmt *>()[subStmtOffset()] = S;
2046 while (
const auto *CS2 = dyn_cast<CaseStmt>(CS->
getSubStmt()))
2053 return T->getStmtClass() == CaseStmtClass;
2059 getTrailingObjects<Stmt *>() +
2060 numTrailingObjects(OverloadToken<Stmt *>()));
2065 getTrailingObjects<Stmt *>() +
2066 numTrailingObjects(OverloadToken<Stmt *>()));
2075 :
SwitchCase(DefaultStmtClass, DL,
CL), SubStmt(substmt) {}
2094 return T->getStmtClass() == DefaultStmtClass;
2106 if (
const auto *CS = dyn_cast<CaseStmt>(
this))
2107 return CS->getEndLoc();
2108 else if (
const auto *DS = dyn_cast<DefaultStmt>(
this))
2109 return DS->getEndLoc();
2110 llvm_unreachable(
"SwitchCase is neither a CaseStmt nor a DefaultStmt!");
2114 if (
auto *CS = dyn_cast<CaseStmt>(
this))
2115 return CS->getSubStmt();
2116 else if (
auto *DS = dyn_cast<DefaultStmt>(
this))
2117 return DS->getSubStmt();
2118 llvm_unreachable(
"SwitchCase is neither a CaseStmt nor a DefaultStmt!");
2139 return T->getStmtClass() >= firstValueStmtConstant &&
2140 T->getStmtClass() <= lastValueStmtConstant;
2149 bool SideEntry =
false;
2154 :
ValueStmt(LabelStmtClass), TheDecl(
D), SubStmt(substmt) {
2180 return const_cast<Stmt *
>(
2191 return T->getStmtClass() == LabelStmtClass;
2203 private llvm::TrailingObjects<AttributedStmt, const Attr *> {
2205 friend TrailingObjects;
2211 :
ValueStmt(AttributedStmtClass), SubStmt(SubStmt) {
2214 llvm::copy(Attrs, getAttrArrayPtr());
2221 std::fill_n(getAttrArrayPtr(), NumAttrs,
nullptr);
2224 const Attr *
const *getAttrArrayPtr()
const {
return getTrailingObjects(); }
2225 const Attr **getAttrArrayPtr() {
return getTrailingObjects(); }
2228 static AttributedStmt *
Create(
const ASTContext &
C, SourceLocation
Loc,
2229 ArrayRef<const Attr *> Attrs,
Stmt *SubStmt);
2232 static AttributedStmt *
CreateEmpty(
const ASTContext &
C,
unsigned NumAttrs);
2252 return T->getStmtClass() == AttributedStmtClass;
2259 private llvm::TrailingObjects<IfStmt, Stmt *, SourceLocation> {
2260 friend TrailingObjects;
2284 enum { InitOffset = 0, ThenOffsetFromCond = 1, ElseOffsetFromCond = 2 };
2285 enum { NumMandatoryStmtPtr = 2 };
2289 unsigned numTrailingObjects(OverloadToken<Stmt *>)
const {
2294 unsigned numTrailingObjects(OverloadToken<SourceLocation>)
const {
2298 unsigned initOffset()
const {
return InitOffset; }
2299 unsigned varOffset()
const {
return InitOffset +
hasInitStorage(); }
2300 unsigned condOffset()
const {
2303 unsigned thenOffset()
const {
return condOffset() + ThenOffsetFromCond; }
2304 unsigned elseOffset()
const {
return condOffset() + ElseOffsetFromCond; }
2320 Stmt *Else =
nullptr);
2337 return reinterpret_cast<Expr *
>(getTrailingObjects<Stmt *>()[condOffset()]);
2341 return reinterpret_cast<Expr *
>(getTrailingObjects<Stmt *>()[condOffset()]);
2345 getTrailingObjects<Stmt *>()[condOffset()] =
reinterpret_cast<Stmt *
>(Cond);
2348 Stmt *
getThen() {
return getTrailingObjects<Stmt *>()[thenOffset()]; }
2350 return getTrailingObjects<Stmt *>()[thenOffset()];
2354 getTrailingObjects<Stmt *>()[thenOffset()] = Then;
2358 return hasElseStorage() ? getTrailingObjects<Stmt *>()[elseOffset()]
2363 return hasElseStorage() ? getTrailingObjects<Stmt *>()[elseOffset()]
2369 "This if statement has no storage for an else statement!");
2370 getTrailingObjects<Stmt *>()[elseOffset()] = Else;
2394 getTrailingObjects<Stmt *>()[varOffset()])
2400 getTrailingObjects<Stmt *>()[varOffset()])
2406 getTrailingObjects<Stmt *>()[varOffset()] = CondVar;
2410 return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
2415 return hasInitStorage() ? getTrailingObjects<Stmt *>()[initOffset()]
2421 "This if statement has no storage for an init statement!");
2422 getTrailingObjects<Stmt *>()[initOffset()] =
Init;
2435 "This if statement has no storage for an else statement!");
2436 *getTrailingObjects<SourceLocation>() = ElseLoc;
2489 getTrailingObjects<Stmt *>() +
2490 numTrailingObjects(OverloadToken<Stmt *>()));
2498 getTrailingObjects<Stmt *>() +
2499 numTrailingObjects(OverloadToken<Stmt *>()));
2503 return T->getStmtClass() == IfStmtClass;
2509 private llvm::TrailingObjects<SwitchStmt, Stmt *> {
2510 friend TrailingObjects;
2532 enum { InitOffset = 0, BodyOffsetFromCond = 1 };
2533 enum { NumMandatoryStmtPtr = 2 };
2537 unsigned numTrailingStatements()
const {
2541 unsigned initOffset()
const {
return InitOffset; }
2542 unsigned varOffset()
const {
return InitOffset +
hasInitStorage(); }
2543 unsigned condOffset()
const {
2546 unsigned bodyOffset()
const {
return condOffset() + BodyOffsetFromCond; }
2573 return reinterpret_cast<Expr *
>(getTrailingObjects()[condOffset()]);
2577 return reinterpret_cast<Expr *
>(getTrailingObjects()[condOffset()]);
2581 getTrailingObjects()[condOffset()] =
reinterpret_cast<Stmt *
>(Cond);
2585 const Stmt *
getBody()
const {
return getTrailingObjects()[bodyOffset()]; }
2587 void setBody(
Stmt *Body) { getTrailingObjects()[bodyOffset()] = Body; }
2590 return hasInitStorage() ? getTrailingObjects()[initOffset()] :
nullptr;
2594 return hasInitStorage() ? getTrailingObjects()[initOffset()] :
nullptr;
2599 "This switch statement has no storage for an init statement!");
2600 getTrailingObjects()[initOffset()] =
Init;
2625 ?
static_cast<DeclStmt *
>(getTrailingObjects()[varOffset()])
2631 ?
static_cast<DeclStmt *
>(getTrailingObjects()[varOffset()])
2637 getTrailingObjects()[varOffset()] = CondVar;
2658 "case/default already added to a switch");
2682 getTrailingObjects() + numTrailingStatements());
2687 getTrailingObjects() + numTrailingStatements());
2691 return T->getStmtClass() == SwitchStmtClass;
2697 private llvm::TrailingObjects<WhileStmt, Stmt *> {
2698 friend TrailingObjects;
2715 enum { VarOffset = 0, BodyOffsetFromCond = 1 };
2716 enum { NumMandatoryStmtPtr = 2 };
2720 unsigned varOffset()
const {
return VarOffset; }
2721 unsigned condOffset()
const {
return VarOffset +
hasVarStorage(); }
2722 unsigned bodyOffset()
const {
return condOffset() + BodyOffsetFromCond; }
2724 unsigned numTrailingStatements()
const {
2750 return reinterpret_cast<Expr *
>(getTrailingObjects()[condOffset()]);
2754 return reinterpret_cast<Expr *
>(getTrailingObjects()[condOffset()]);
2758 getTrailingObjects()[condOffset()] =
reinterpret_cast<Stmt *
>(Cond);
2762 const Stmt *
getBody()
const {
return getTrailingObjects()[bodyOffset()]; }
2764 void setBody(
Stmt *Body) { getTrailingObjects()[bodyOffset()] = Body; }
2787 ?
static_cast<DeclStmt *
>(getTrailingObjects()[varOffset()])
2793 ?
static_cast<DeclStmt *
>(getTrailingObjects()[varOffset()])
2799 getTrailingObjects()[varOffset()] = CondVar;
2816 return T->getStmtClass() == WhileStmtClass;
2822 getTrailingObjects() + numTrailingStatements());
2827 getTrailingObjects() + numTrailingStatements());
2833 enum { BODY, COND, END_EXPR };
2834 Stmt *SubExprs[END_EXPR];
2841 :
Stmt(DoStmtClass), WhileLoc(WL), RParenLoc(RP) {
2852 return reinterpret_cast<Expr *
>(SubExprs[COND]);
2872 return T->getStmtClass() == DoStmtClass;
2877 return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR);
2891 enum { INIT, CONDVAR, COND, INC, BODY, END_EXPR };
2892 Stmt* SubExprs[END_EXPR];
2919 return reinterpret_cast<DeclStmt*
>(SubExprs[CONDVAR]);
2923 return reinterpret_cast<DeclStmt*
>(SubExprs[CONDVAR]);
2927 SubExprs[CONDVAR] = CondVar;
2955 return T->getStmtClass() == ForStmtClass;
2960 return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
2975 :
Stmt(GotoStmtClass),
Label(label), LabelLoc(LL) {
2994 return T->getStmtClass() == GotoStmtClass;
3014 :
Stmt(IndirectGotoStmtClass), StarLoc(starLoc) {
3030 return reinterpret_cast<const Expr *
>(
Target);
3045 return T->getStmtClass() == IndirectGotoStmtClass;
3114 return Class == ContinueStmtClass ||
Class == BreakStmtClass;
3130 return T->getStmtClass() == ContinueStmtClass;
3146 return T->getStmtClass() == BreakStmtClass;
3160 private llvm::TrailingObjects<ReturnStmt, const VarDecl *> {
3161 friend TrailingObjects;
3170 bool hasNRVOCandidate()
const {
return ReturnStmtBits.HasNRVOCandidate; }
3181 const VarDecl *NRVOCandidate);
3197 return hasNRVOCandidate() ? *getTrailingObjects() :
nullptr;
3204 assert(hasNRVOCandidate() &&
3205 "This return statement has no storage for an NRVO candidate!");
3206 *getTrailingObjects() = Var;
3218 return T->getStmtClass() == ReturnStmtClass;
3257 unsigned numoutputs,
unsigned numinputs,
unsigned numclobbers)
3321 return T->getStmtClass() == GCCAsmStmtClass ||
3322 T->getStmtClass() == MSAsmStmtClass;
3402 Expr **Constraints =
nullptr;
3403 Expr **Clobbers =
nullptr;
3405 unsigned NumLabels = 0;
3409 bool isvolatile,
unsigned numoutputs,
unsigned numinputs,
3411 Expr *asmstr,
unsigned numclobbers,
Expr **clobbers,
3450 : MyKind(
Operand), Str(S), OperandNo(OpNo),
3464 assert(
isOperand() &&
"Range is currently used only for Operands.");
3490 return II->getName();
3498 return Constraints[i];
3516 return II->getName();
3542 return NumLabels > 0;
3585 void setOutputsAndInputsAndClobbers(
const ASTContext &
C,
3589 unsigned NumLabels,
Expr **Clobbers,
3609 return T->getStmtClass() == GCCAsmStmtClass;
3620 unsigned NumAsmToks = 0;
3622 Token *AsmToks =
nullptr;
3623 StringRef *Constraints =
nullptr;
3624 StringRef *Clobbers =
nullptr;
3657 return Constraints[i];
3695 void initialize(
const ASTContext &
C, StringRef AsmString,
3703 return T->getStmtClass() == MSAsmStmtClass;
3722 enum { FILTER_EXPR,
BLOCK };
3728 static SEHExceptStmt*
Create(
const ASTContext &
C,
3729 SourceLocation ExceptLoc,
3739 return reinterpret_cast<Expr*
>(Children[FILTER_EXPR]);
3743 return cast<CompoundStmt>(Children[
BLOCK]);
3755 return T->getStmtClass() == SEHExceptStmtClass;
3790 return T->getStmtClass() == SEHFinallyStmtClass;
3802 enum { TRY = 0, HANDLER = 1 };
3812 static SEHTryStmt*
Create(
const ASTContext &
C,
bool isCXXTry,
3813 SourceLocation TryLoc,
Stmt *TryBlock,
3824 return cast<CompoundStmt>(Children[TRY]);
3842 return T->getStmtClass() == SEHTryStmtClass;
3852 :
Stmt(SEHLeaveStmtClass), LeaveLoc(LL) {}
3864 return T->getStmtClass() == SEHLeaveStmtClass;
3900 llvm::PointerIntPair<VarDecl *, 2, VariableCaptureKind> VarAndKind;
3951 unsigned NumCaptures;
3955 llvm::PointerIntPair<CapturedDecl *, 2, CapturedRegionKind> CapDeclAndKind;
3967 Stmt **getStoredStmts() {
return reinterpret_cast<Stmt **
>(
this + 1); }
3969 Stmt *
const *getStoredStmts()
const {
3970 return reinterpret_cast<Stmt *
const *
>(
this + 1);
3973 Capture *getStoredCaptures()
const;
3975 void setCapturedStmt(
Stmt *S) { getStoredStmts()[NumCaptures] = S; }
3987 unsigned NumCaptures);
4011 assert(
D &&
"null RecordDecl");
4038 return getStoredCaptures() + NumCaptures;
4052 llvm::iterator_range<const_capture_init_iterator>;
4064 return reinterpret_cast<Expr **
>(getStoredStmts());
4068 return reinterpret_cast<Expr *
const *
>(getStoredStmts());
4094 return T->getStmtClass() == CapturedStmtClass;
static StringRef bytes(const std::vector< T, Allocator > &v)
const LambdaCapture * Capture
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
Defines enumerations for expression traits intrinsics.
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.
llvm::MachO::Target Target
Defines an enumeration for C++ overloaded operators.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
#define BLOCK(DERIVED, BASE)
Defines enumerations for the type traits support.
__device__ __2f16 float __ockl_bool s
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Reads an AST files chain containing the contents of a translation unit.
AddrLabelExpr - The GNU address of label extension, representing &&label.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
AsmStmt is the base class for GCCAsmStmt and MSAsmStmt.
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.
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
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
const_inputs_iterator end_inputs() const
llvm::iterator_range< const_inputs_iterator > inputs_const_range
const_child_range children() const
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.
std::string generateAsmString(const ASTContext &C) const
Assemble final IR asm string.
bool IsVolatile
If true, treat this inline assembly as having side effects.
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
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
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
static bool classof(const Stmt *T)
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const
A builtin binary operation expression such as "x + y" or "x <= y".
BreakStmt - This represents a break.
BreakStmt(SourceLocation BL)
static bool classof(const Stmt *T)
BreakStmt(EmptyShell Empty)
Build an empty break statement.
BreakStmt(SourceLocation CL, SourceLocation LabelLoc, LabelDecl *Target)
A boolean literal, per ([C++ lex.bool] Boolean literals).
Represents a call to a C++ constructor.
A default argument (C++ [dcl.fct.default]).
A use of a default initializer in a constructor or in aggregate initialization.
Represents a delete expression for memory deallocation and destructor calls, e.g.
Represents a C++ member access expression where the actual member referenced could not be resolved be...
Represents a folding of a pack over an operator.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
The null pointer literal (C++11 [lex.nullptr])
A call to an overloaded operator written using operator syntax.
A rewritten comparison expression that was originally written using operator syntax.
An expression "T()" which creates an rvalue of a non-class type T.
Represents the this expression in C++.
A C++ throw-expression (C++ [except.throw]).
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
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.
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.
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()
void setCapturedRegionKind(CapturedRegionKind Kind)
Set the captured region kind.
const_capture_init_iterator capture_init_begin() const
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.
Stmt * getCapturedStmt()
Retrieve the statement being captured.
llvm::iterator_range< capture_init_iterator > capture_init_range
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.
llvm::iterator_range< const_capture_init_iterator > const_capture_init_range
const_capture_init_iterator capture_init_end() const
SourceLocation getBeginLoc() const LLVM_READONLY
void setCapturedRecordDecl(RecordDecl *D)
Set the record declaration for captured variables.
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
CaseStmt - Represent a case statement.
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
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Represents a character-granular source range.
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Represents a 'co_await' expression.
CompoundStmt - This represents a group of statements like { stmt stmt }.
static bool classof(const Stmt *T)
std::reverse_iterator< const_body_iterator > const_reverse_body_iterator
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
const Stmt * getStmtExprResult() const
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
Stmt * getStmtExprResult()
const Stmt * body_back() const
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
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
ContinueStmt - This represents a continue.
ContinueStmt(EmptyShell Empty)
Build an empty continue statement.
ContinueStmt(SourceLocation CL)
static bool classof(const Stmt *T)
ContinueStmt(SourceLocation CL, SourceLocation LabelLoc, LabelDecl *Target)
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
Decl *const * const_iterator
bool isSingleDecl() const
A reference to a declared variable, function, enum, etc.
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
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
A qualified reference to a name whose declaration cannot yet be resolved.
Represents a C99 designated initializer expression.
DoStmt - This represents a 'do/while' stmt.
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
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
An expression trait intrinsic.
Represents difference between two FPOptions values.
ForStmt - This represents a 'for (init;cond;inc)' stmt.
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
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 - this is part of a decomposed asm string specification (for use with the AnalyzeAsmSt...
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.
This represents a GCC inline-assembly statement extension.
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
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
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...
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)
Represents a C11 generic selection.
GotoStmt - This represents a direct goto.
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.
IfStmt - This represents an if/then/else.
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.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
IndirectGotoStmt - This represents an indirect goto.
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
Describes an C or C++ initializer list.
Represents the declaration of a label.
LabelStmt - Represents a label, which has a substatement.
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
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Base class for BreakStmt and ContinueStmt.
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.
bool hasLabelTarget() const
SourceLocation getEndLoc() const
This represents a Microsoft inline-assembly statement extension.
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)
StringRef getClobber(unsigned i) const
const Expr * getInputExpr(unsigned i) const
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)
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
NullStmt - This is the null statement ";": C99 6.8.3p3.
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
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
An expression that sends a message to the given Objective-C object or class.
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
ParenExpr - This represents a parenthesized expression, e.g.
[C99 6.4.2.2] - A predefined identifier such as func.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Represents a struct/union/class.
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
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
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)
CompoundStmt * getBlock() const
Represents a __leave statement.
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
SourceLocation getEndLoc() const
SEHExceptStmt * getExceptHandler() const
Returns 0 if not defined.
Stmt * getHandler() const
ShuffleVectorExpr - clang-specific builtin-in function __builtin_shufflevector.
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
friend class BlockDeclRefExpr
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
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
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
void dump() const
Dumps the specified AST fragment and all subtrees to llvm::errs().
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
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
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
static Likelihood getLikelihood(ArrayRef< const Attr * > Attrs)
StringLiteral - This represents a string literal expression, e.g.
Represents a reference to a non-type template parameter that has been substituted with a template arg...
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()
SwitchStmt - This represents a 'switch' stmt.
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)
Token - This structure provides full information about a lexed token.
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
Represents a statement that could possibly have a value and type.
const Expr * getExprStmt() const
static bool classof(const Stmt *T)
Represents a variable declaration or definition.
WhileStmt - This represents a 'while' stmt.
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
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
ConstantResultStorageKind
Describes the kind of result that can be tail-allocated.
ArrayTypeTrait
Names for the array type traits.
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',...
CapturedRegionKind
The different kinds of captured statement.
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
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.
const FunctionProtoType * T
@ Class
The "class" keyword introduces the elaborated-type-specifier.
TypeTrait
Names for traits that operate specifically on types.
CXXNewInitializationStyle
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
Diagnostic wrappers for TextAPI types for error reporting.
Describes how types, statements, expressions, and declarations should be printed.
Iterator for iterating over Stmt * arrays that contain only T *.
Base::value_type operator*() const
A placeholder type used to construct an empty shell of a type, that will be filled in later (e....