35#include "llvm/Support/ErrorHandling.h"
36#include "llvm/Support/Format.h"
37#include "llvm/Support/raw_ostream.h"
49 if (
auto *BO = dyn_cast<BinaryOperator>(
E)) {
50 if (BO->getOpcode() == BO_Comma) {
57 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
E)) {
58 E = MTE->getSubExpr();
79 return cast<CXXRecordDecl>(
D);
89 if (
const auto *CE = dyn_cast<CastExpr>(
E)) {
90 if ((CE->getCastKind() == CK_DerivedToBase ||
91 CE->getCastKind() == CK_UncheckedDerivedToBase) &&
100 if (CE->getCastKind() == CK_NoOp) {
101 E = CE->getSubExpr();
104 }
else if (
const auto *ME = dyn_cast<MemberExpr>(
E)) {
105 if (!ME->isArrow()) {
106 assert(ME->getBase()->getType()->getAsRecordDecl());
107 if (
const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
108 if (!Field->isBitField() && !Field->getType()->isReferenceType()) {
115 }
else if (
const auto *BO = dyn_cast<BinaryOperator>(
E)) {
116 if (BO->getOpcode() == BO_PtrMemD) {
117 assert(BO->getRHS()->isPRValue());
123 if (BO->getOpcode() == BO_Comma) {
124 CommaLHSs.push_back(BO->getLHS());
145 switch (UO->getOpcode()) {
147 return UO->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
159 return CE->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
162 switch (BO->getOpcode()) {
163 default:
return false;
178 return BO->getLHS()->isKnownToHaveBooleanValue(Semantic) &&
179 BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
183 return BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
188 return CO->getTrueExpr()->isKnownToHaveBooleanValue(Semantic) &&
189 CO->getFalseExpr()->isKnownToHaveBooleanValue(Semantic);
191 if (isa<ObjCBoolLiteralExpr>(
E))
194 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(
E))
195 return OVE->getSourceExpr()->isKnownToHaveBooleanValue(Semantic);
198 if (!Semantic && FD->getType()->isUnsignedIntegerType() &&
199 !FD->getBitWidth()->isValueDependent() &&
200 FD->getBitWidthValue(FD->getASTContext()) == 1)
209 bool IgnoreTemplateOrMacroSubstitution)
const {
211 const Decl *
D =
nullptr;
213 if (
const auto *ME = dyn_cast<MemberExpr>(
E))
214 D = ME->getMemberDecl();
215 else if (
const auto *DRE = dyn_cast<DeclRefExpr>(
E))
217 else if (
const auto *IRE = dyn_cast<ObjCIvarRefExpr>(
E))
221 StrictFlexArraysLevel,
222 IgnoreTemplateOrMacroSubstitution);
232 if (
Value.isMemberPointer())
233 return Value.getMemberPointerDecl();
235 if (
Value.isLValue() &&
Value.getLValueOffset().isZero())
249 template <
class E,
class T>
252 return static_cast<const E*
>(
expr)->getExprLoc();
262 return static_cast<const E *
>(
expr)->getBeginLoc();
270 const auto *ED = cast<EnumDecl>(ECD->getDeclContext());
271 if (ED->isCompleteDefinition())
280#define ABSTRACT_STMT(type)
281#define STMT(type, base) \
282 case Stmt::type##Class: break;
283#define EXPR(type, base) \
284 case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
285#include "clang/AST/StmtNodes.inc"
287 llvm_unreachable(
"unknown expression kind");
298 "Invalid StorageKind Value");
308 if (!
Value.getInt().needsCleanup())
324 bool IsImmediateInvocation)
325 :
FullExpr(ConstantExprClass, SubExpr) {
334 ::new (getTrailingObjects<APValue>())
APValue();
339 bool IsImmediateInvocation) {
340 assert(!isa<ConstantExpr>(
E));
343 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
347 return new (Mem)
ConstantExpr(
E, StorageKind, IsImmediateInvocation);
358ConstantExpr::ConstantExpr(EmptyShell
Empty,
364 ::new (getTrailingObjects<APValue>())
APValue();
371 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
380 "Invalid storage for this value kind");
386 Int64Result() = *
Value.getInt().getRawData();
395 APValueResult() = std::move(
Value);
398 llvm_unreachable(
"Invalid ResultKind Bits");
404 return APValueResult().
getInt();
409 llvm_unreachable(
"invalid Accessor");
417 return APValueResult();
427 llvm_unreachable(
"invalid ResultKind");
431 bool RefersToEnclosingVariableOrCapture,
QualType T,
441 RefersToEnclosingVariableOrCapture;
442 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
449DeclRefExpr::DeclRefExpr(
const ASTContext &Ctx,
452 bool RefersToEnclosingVariableOrCapture,
461 new (getTrailingObjects<NestedNameSpecifierLoc>())
465 *getTrailingObjects<NamedDecl *>() = FoundD;
467 = (TemplateArgs || TemplateKWLoc.
isValid()) ? 1 : 0;
469 RefersToEnclosingVariableOrCapture;
470 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
473 auto Deps = TemplateArgumentDependence::None;
474 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
475 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
477 assert(!(Deps & TemplateArgumentDependence::Dependent) &&
478 "built a DeclRefExpr with dependent template args");
479 }
else if (TemplateKWLoc.
isValid()) {
480 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
491 bool RefersToEnclosingVariableOrCapture,
496 return Create(Context, QualifierLoc, TemplateKWLoc,
D,
497 RefersToEnclosingVariableOrCapture,
499 T, VK, FoundD, TemplateArgs, NOUR);
505 bool RefersToEnclosingVariableOrCapture,
515 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
519 QualifierLoc ? 1 : 0, FoundD ? 1 : 0,
520 HasTemplateKWAndArgsInfo ? 1 : 0,
521 TemplateArgs ? TemplateArgs->
size() : 0);
524 return new (Mem)
DeclRefExpr(Context, QualifierLoc, TemplateKWLoc,
D,
525 RefersToEnclosingVariableOrCapture, NameInfo,
526 FoundD, TemplateArgs,
T, VK, NOUR);
532 bool HasTemplateKWAndArgsInfo,
533 unsigned NumTemplateArgs) {
534 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
538 HasQualifier ? 1 : 0, HasFoundDecl ? 1 : 0, HasTemplateKWAndArgsInfo,
546 if (
getType()->isUndeducedType())
562SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(
SourceLocation OpLoc,
568 OpLoc(OpLoc), LParen(LParen), RParen(RParen) {
569 setTypeSourceInfo(TSI);
573SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(EmptyShell
Empty,
600 const NamedDecl *ND) -> std::optional<unsigned> {
601 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
602 return RD->getDeviceLambdaManglingNumber();
611 llvm::raw_string_ostream Out(Buffer);
612 Ctx->mangleCanonicalTypeName(Ty, Out);
622 assert((getIdentKind() == IK) &&
623 "IdentKind do not fit in PredefinedExprBitfields!");
624 bool HasFunctionName = SL !=
nullptr;
633PredefinedExpr::PredefinedExpr(EmptyShell
Empty,
bool HasFunctionName)
641 bool HasFunctionName = SL !=
nullptr;
642 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
648 bool HasFunctionName) {
649 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
659 return "__FUNCTION__";
661 return "__FUNCDNAME__";
663 return "L__FUNCTION__";
665 return "__PRETTY_FUNCTION__";
667 return "__FUNCSIG__";
669 return "L__FUNCSIG__";
673 llvm_unreachable(
"Unknown ident kind for PredefinedExpr");
679 const Decl *CurrentDecl,
680 bool ForceElaboratedPrinting) {
684 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(CurrentDecl)) {
685 std::unique_ptr<MangleContext> MC;
688 if (MC->shouldMangleDeclName(ND)) {
690 llvm::raw_svector_ostream Out(Buffer);
696 else if (ND->hasAttr<CUDAGlobalAttr>())
700 MC->mangleName(GD, Out);
702 if (!Buffer.empty() && Buffer.front() ==
'\01')
703 return std::string(Buffer.substr(1));
704 return std::string(Buffer);
706 return std::string(ND->getIdentifier()->getName());
710 if (isa<BlockDecl>(CurrentDecl)) {
715 if (DC->isFileContext())
719 llvm::raw_svector_ostream Out(Buffer);
720 if (
auto *DCBlock = dyn_cast<BlockDecl>(DC))
723 else if (
auto *DCDecl = dyn_cast<Decl>(DC))
725 return std::string(Out.str());
727 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
729 bool IsFuncOrFunctionInNonMSVCCompatEnv =
731 IK == PredefinedIdentKind ::Function) &&
733 bool IsLFunctionInMSVCCommpatEnv =
735 bool IsFuncOrFunctionOrLFunctionOrFuncDName =
740 if ((ForceElaboratedPrinting &&
741 (IsFuncOrFunctionInNonMSVCCompatEnv || IsLFunctionInMSVCCommpatEnv)) ||
742 (!ForceElaboratedPrinting && IsFuncOrFunctionOrLFunctionOrFuncDName))
743 return FD->getNameAsString();
746 llvm::raw_svector_ostream Out(Name);
758 std::string remapPath(StringRef
Path)
const override {
761 return std::string(p);
773 llvm::raw_string_ostream POut(Proto);
780 if (FD->hasWrittenPrototype())
781 FT = dyn_cast<FunctionProtoType>(AFT);
786 case CC_C: POut <<
"__cdecl ";
break;
797 FD->printQualifiedName(POut, Policy);
801 return std::string(Name);
806 for (
unsigned i = 0, e =
Decl->getNumParams(); i != e; ++i) {
808 POut <<
Decl->getParamDecl(i)->getType().stream(Policy);
811 if (FT->isVariadic()) {
812 if (FD->getNumParams()) POut <<
", ";
817 !
Decl->getNumParams()) {
824 assert(FT &&
"We must have a written prototype in this case.");
827 if (FT->isVolatile())
839 while (isa_and_nonnull<NamedDecl>(Ctx)) {
841 = dyn_cast<ClassTemplateSpecializationDecl>(Ctx);
843 Specs.push_back(Spec);
847 std::string TemplateParams;
848 llvm::raw_string_ostream TOut(TemplateParams);
851 D->getSpecializedTemplate()->getTemplateParameters();
853 assert(Params->
size() == Args.
size());
854 for (
unsigned i = 0, numParams = Params->
size(); i != numParams; ++i) {
856 if (Param.empty())
continue;
857 TOut << Param <<
" = ";
866 = FD->getTemplateSpecializationInfo();
871 assert(Params->
size() == Args->
size());
872 for (
unsigned i = 0, e = Params->
size(); i != e; ++i) {
874 if (Param.empty())
continue;
875 TOut << Param <<
" = ";
876 Args->
get(i).
print(Policy, TOut,
true);
881 if (!TemplateParams.empty()) {
883 TemplateParams.resize(TemplateParams.size() - 2);
884 POut <<
" [" << TemplateParams <<
"]";
891 if (isa<CXXMethodDecl>(FD) &&
892 cast<CXXMethodDecl>(FD)->getParent()->isLambda())
893 Proto =
"auto " + Proto;
894 else if (FT && FT->getReturnType()->getAs<
DecltypeType>())
899 else if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD))
904 return std::string(Name);
906 if (
const CapturedDecl *CD = dyn_cast<CapturedDecl>(CurrentDecl)) {
910 if (DC->isFunctionOrMethod() && (DC->getDeclKind() != Decl::Captured)) {
914 llvm_unreachable(
"CapturedDecl not inside a function or method");
916 if (
const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
918 llvm::raw_svector_ostream Out(Name);
919 Out << (MD->isInstanceMethod() ?
'-' :
'+');
928 dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
929 Out <<
'(' << *CID <<
')';
932 MD->getSelector().print(Out);
935 return std::string(Name);
937 if (isa<TranslationUnitDecl>(CurrentDecl) &&
946 const llvm::APInt &Val) {
950 BitWidth = Val.getBitWidth();
951 unsigned NumWords = Val.getNumWords();
952 const uint64_t* Words = Val.getRawData();
954 pVal =
new (
C) uint64_t[NumWords];
955 std::copy(Words, Words + NumWords,
pVal);
956 }
else if (NumWords == 1)
962IntegerLiteral::IntegerLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
965 assert(
type->isIntegerType() &&
"Illegal type in IntegerLiteral");
966 assert(
V.getBitWidth() ==
C.getIntWidth(
type) &&
967 "Integer type is not the correct size for constant.");
983FixedPointLiteral::FixedPointLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
988 assert(
type->isFixedPointType() &&
"Illegal type in FixedPointLiteral");
989 assert(
V.getBitWidth() ==
C.getTypeInfo(
type).Width &&
990 "Fixed point type is not the correct size for constant.");
996 const llvm::APInt &
V,
1014 S, llvm::APSInt::getUnsigned(
getValue().getZExtValue()), Scale);
1015 return std::string(S);
1037 StringRef Escaped = escapeCStyle<EscapeChar::Single>(Val);
1038 if (!Escaped.empty()) {
1039 OS <<
"'" << Escaped <<
"'";
1048 OS <<
"'" << (char)Val <<
"'";
1050 OS <<
"'\\x" << llvm::format(
"%02x", Val) <<
"'";
1051 else if (Val <= 0xFFFF)
1052 OS <<
"'\\u" << llvm::format(
"%04x", Val) <<
"'";
1054 OS <<
"'\\U" << llvm::format(
"%08x", Val) <<
"'";
1058FloatingLiteral::FloatingLiteral(
const ASTContext &
C,
const llvm::APFloat &
V,
1061 setSemantics(
V.getSemantics());
1069 setRawSemantics(llvm::APFloatBase::S_IEEEhalf);
1090 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
1092 return V.convertToDouble();
1097 unsigned CharByteWidth = 0;
1101 CharByteWidth =
Target.getCharWidth();
1104 CharByteWidth =
Target.getWCharWidth();
1107 CharByteWidth =
Target.getChar16Width();
1110 CharByteWidth =
Target.getChar32Width();
1113 return sizeof(char);
1115 assert((CharByteWidth & 7) == 0 &&
"Assumes character size is byte multiple");
1117 assert((CharByteWidth == 1 || CharByteWidth == 2 || CharByteWidth == 4) &&
1118 "The only supported character byte widths are 1,2 and 4!");
1119 return CharByteWidth;
1122StringLiteral::StringLiteral(
const ASTContext &Ctx, StringRef Str,
1125 unsigned NumConcatenated)
1128 unsigned Length = Str.size();
1135 "StringLiteral must be of constant array type!");
1136 unsigned CharByteWidth = mapCharByteWidth(Ctx.
getTargetInfo(), Kind);
1137 unsigned ByteLength = Str.size();
1138 assert((ByteLength % CharByteWidth == 0) &&
1139 "The size of the data must be a multiple of CharByteWidth!");
1144 switch (CharByteWidth) {
1146 Length = ByteLength;
1149 Length = ByteLength / 2;
1152 Length = ByteLength / 4;
1155 llvm_unreachable(
"Unsupported character width!");
1161 assert(!Pascal &&
"Can't make an unevaluated Pascal string");
1166 *getTrailingObjects<unsigned>() = Length;
1170 std::memcpy(getTrailingObjects<SourceLocation>(), Loc,
1174 std::memcpy(getTrailingObjects<char>(), Str.data(), Str.size());
1179StringLiteral::StringLiteral(EmptyShell
Empty,
unsigned NumConcatenated,
1180 unsigned Length,
unsigned CharByteWidth)
1184 *getTrailingObjects<unsigned>() = Length;
1190 unsigned NumConcatenated) {
1191 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1192 1, NumConcatenated, Str.size()),
1199 unsigned NumConcatenated,
1201 unsigned CharByteWidth) {
1202 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1203 1, NumConcatenated, Length * CharByteWidth),
1228 static const char Hex[] =
"0123456789ABCDEF";
1231 for (
unsigned I = 0, N =
getLength(); I != N; ++I) {
1233 StringRef Escaped = escapeCStyle<EscapeChar::Double>(Char);
1234 if (Escaped.empty()) {
1240 Char >= 0xd800 && Char <= 0xdbff) {
1242 if (Trail >= 0xdc00 && Trail <= 0xdfff) {
1243 Char = 0x10000 + ((Char - 0xd800) << 10) + (Trail - 0xdc00);
1253 (Char >= 0xd800 && Char <= 0xdfff) || Char >= 0x110000) {
1257 while ((Char >> Shift) == 0)
1259 for (; Shift >= 0; Shift -= 4)
1260 OS << Hex[(Char >> Shift) & 15];
1267 << Hex[(Char >> 20) & 15]
1268 << Hex[(Char >> 16) & 15];
1271 OS << Hex[(Char >> 12) & 15]
1272 << Hex[(Char >> 8) & 15]
1273 << Hex[(Char >> 4) & 15]
1274 << Hex[(Char >> 0) & 15];
1280 if (LastSlashX + 1 == I) {
1282 case '0':
case '1':
case '2':
case '3':
case '4':
1283 case '5':
case '6':
case '7':
case '8':
case '9':
1284 case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
1285 case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
1290 assert(Char <= 0xff &&
1291 "Characters above 0xff should already have been handled.");
1297 << (char)(
'0' + ((Char >> 6) & 7))
1298 << (char)(
'0' + ((Char >> 3) & 7))
1299 << (char)(
'0' + ((Char >> 0) & 7));
1328 unsigned *StartTokenByteOffset)
const {
1332 "Only narrow string literals are currently supported");
1337 unsigned StringOffset = 0;
1339 TokNo = *StartToken;
1340 if (StartTokenByteOffset) {
1341 StringOffset = *StartTokenByteOffset;
1342 ByteNo -= StringOffset;
1354 std::pair<FileID, unsigned> LocInfo =
1355 SM.getDecomposedLoc(StrTokSpellingLoc);
1357 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
1359 if (StartTokenByteOffset !=
nullptr)
1360 *StartTokenByteOffset = StringOffset;
1361 if (StartToken !=
nullptr)
1362 *StartToken = TokNo;
1363 return StrTokSpellingLoc;
1366 const char *StrData = Buffer.data()+LocInfo.second;
1369 Lexer TheLexer(
SM.getLocForStartOfFile(LocInfo.first), Features,
1370 Buffer.begin(), StrData, Buffer.end());
1379 if (ByteNo < TokNumBytes ||
1385 if (StartTokenByteOffset !=
nullptr)
1386 *StartTokenByteOffset = StringOffset;
1387 if (StartToken !=
nullptr)
1388 *StartToken = TokNo;
1393 StringOffset += TokNumBytes;
1395 ByteNo -= TokNumBytes;
1403#define UNARY_OPERATION(Name, Spelling) case UO_##Name: return Spelling;
1404#include "clang/AST/OperationKinds.def"
1406 llvm_unreachable(
"Unknown unary operator");
1412 default: llvm_unreachable(
"No unary operator for overloaded function");
1413 case OO_PlusPlus:
return Postfix ? UO_PostInc : UO_PreInc;
1414 case OO_MinusMinus:
return Postfix ? UO_PostDec : UO_PreDec;
1415 case OO_Amp:
return UO_AddrOf;
1416 case OO_Star:
return UO_Deref;
1417 case OO_Plus:
return UO_Plus;
1418 case OO_Minus:
return UO_Minus;
1419 case OO_Tilde:
return UO_Not;
1420 case OO_Exclaim:
return UO_LNot;
1421 case OO_Coawait:
return UO_Coawait;
1427 case UO_PostInc:
case UO_PreInc:
return OO_PlusPlus;
1428 case UO_PostDec:
case UO_PreDec:
return OO_MinusMinus;
1429 case UO_AddrOf:
return OO_Amp;
1430 case UO_Deref:
return OO_Star;
1431 case UO_Plus:
return OO_Plus;
1432 case UO_Minus:
return OO_Minus;
1433 case UO_Not:
return OO_Tilde;
1434 case UO_LNot:
return OO_Exclaim;
1435 case UO_Coawait:
return OO_Coawait;
1450 NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1451 unsigned NumPreArgs = PreArgs.size();
1453 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1455 unsigned OffsetToTrailingObjects = offsetToTrailingObjects(SC);
1456 CallExprBits.OffsetToTrailingObjects = OffsetToTrailingObjects;
1457 assert((
CallExprBits.OffsetToTrailingObjects == OffsetToTrailingObjects) &&
1458 "OffsetToTrailingObjects overflow!");
1463 for (
unsigned I = 0; I != NumPreArgs; ++I)
1465 for (
unsigned I = 0; I != Args.size(); ++I)
1467 for (
unsigned I = Args.size(); I != NumArgs; ++I)
1482 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1484 unsigned OffsetToTrailingObjects = offsetToTrailingObjects(SC);
1485 CallExprBits.OffsetToTrailingObjects = OffsetToTrailingObjects;
1486 assert((
CallExprBits.OffsetToTrailingObjects == OffsetToTrailingObjects) &&
1487 "OffsetToTrailingObjects overflow!");
1497 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1502 return new (Mem)
CallExpr(CallExprClass, Fn, {}, Args, Ty, VK,
1503 RParenLoc, FPFeatures, MinNumArgs,
UsesADL);
1510 "Misaligned memory in CallExpr::CreateTemporary!");
1511 return new (Mem)
CallExpr(CallExprClass, Fn, {}, {}, Ty,
1518 unsigned SizeOfTrailingObjects =
1526unsigned CallExpr::offsetToTrailingObjects(StmtClass SC) {
1530 case CXXOperatorCallExprClass:
1532 case CXXMemberCallExprClass:
1534 case UserDefinedLiteralClass:
1536 case CUDAKernelCallExprClass:
1539 llvm_unreachable(
"unexpected class deriving from CallExpr!");
1546 while (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(CEE))
1551 if (
auto *BO = dyn_cast<BinaryOperator>(CEE)) {
1552 if (BO->isPtrMemOp()) {
1556 }
else if (
auto *UO = dyn_cast<UnaryOperator>(CEE)) {
1557 if (UO->getOpcode() == UO_Deref || UO->getOpcode() == UO_AddrOf ||
1558 UO->getOpcode() == UO_Plus) {
1566 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1567 return DRE->getDecl();
1568 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1569 return ME->getMemberDecl();
1570 if (
auto *BE = dyn_cast<BlockExpr>(CEE))
1571 return BE->getBlockDecl();
1579 return FDecl ? FDecl->getBuiltinID() : 0;
1590 QualType CalleeType = Callee->getType();
1596 if (isa<CXXPseudoDestructorExpr>(Callee->IgnoreParens()))
1599 if (isa<UnresolvedMemberExpr>(Callee->IgnoreParens()))
1604 assert(!CalleeType.
isNull());
1618std::pair<const NamedDecl *, const Attr *>
1622 if (
const auto *A =
D->
getAttr<WarnUnusedResultAttr>())
1623 return {
nullptr, A};
1628 if (
const auto *A = TD->getAttr<WarnUnusedResultAttr>())
1632 TD = TD->desugar()->getAs<TypedefType>())
1633 if (
const auto *A = TD->getDecl()->getAttr<WarnUnusedResultAttr>())
1634 return {TD->getDecl(), A};
1635 return {
nullptr,
nullptr};
1639 if (
const auto *OCE = dyn_cast<CXXOperatorCallExpr>(
this))
1640 return OCE->getBeginLoc();
1642 if (
const auto *Method =
1644 Method && Method->isExplicitObjectMemberFunction()) {
1656 if (
const auto *OCE = dyn_cast<CXXOperatorCallExpr>(
this))
1657 return OCE->getEndLoc();
1671 void *Mem =
C.Allocate(
1672 totalSizeToAlloc<OffsetOfNode, Expr *>(comps.size(), exprs.size()));
1679 unsigned numComps,
unsigned numExprs) {
1681 C.Allocate(totalSizeToAlloc<OffsetOfNode, Expr *>(numComps, numExprs));
1690 OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
1691 NumComps(comps.size()), NumExprs(exprs.size()) {
1692 for (
unsigned i = 0; i != comps.size(); ++i)
1694 for (
unsigned i = 0; i != exprs.size(); ++i)
1712 OpLoc(op), RParenLoc(rp) {
1713 assert(ExprKind <=
UETT_Last &&
"invalid enum value!");
1716 "UnaryExprOrTypeTraitExprBits.Kind overflow!");
1730 :
Expr(MemberExprClass,
T, VK, OK),
Base(
Base), MemberDecl(MemberDecl),
1731 MemberDNLoc(NameInfo.
getInfo()), MemberLoc(NameInfo.getLoc()) {
1737 FoundDecl.getDecl() != MemberDecl ||
1740 TemplateArgs || TemplateKWLoc.
isValid();
1746 new (getTrailingObjects<NestedNameSpecifierLoc>())
1749 *getTrailingObjects<DeclAccessPair>() = FoundDecl;
1751 auto Deps = TemplateArgumentDependence::None;
1752 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1753 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1755 }
else if (TemplateKWLoc.
isValid()) {
1756 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1769 bool HasFoundDecl = FoundDecl.getDecl() != MemberDecl ||
1771 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
1775 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1776 TemplateArgs ? TemplateArgs->
size() : 0);
1778 void *Mem =
C.Allocate(Size,
alignof(
MemberExpr));
1779 return new (Mem)
MemberExpr(
Base, IsArrow, OperatorLoc, QualifierLoc,
1780 TemplateKWLoc, MemberDecl, FoundDecl, NameInfo,
1781 TemplateArgs,
T, VK, OK, NOUR);
1785 bool HasQualifier,
bool HasFoundDecl,
1786 bool HasTemplateKWAndArgsInfo,
1787 unsigned NumTemplateArgs) {
1788 assert((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
1789 "template args but no template arg info?");
1793 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1801 if (
getType()->isUndeducedType())
1817 return BaseStartLoc;
1829bool CastExpr::CastConsistency()
const {
1831 case CK_DerivedToBase:
1832 case CK_UncheckedDerivedToBase:
1833 case CK_DerivedToBaseMemberPointer:
1834 case CK_BaseToDerived:
1835 case CK_BaseToDerivedMemberPointer:
1836 assert(!
path_empty() &&
"Cast kind should have a base path!");
1839 case CK_CPointerToObjCPointerCast:
1840 assert(
getType()->isObjCObjectPointerType());
1842 goto CheckNoBasePath;
1844 case CK_BlockPointerToObjCPointerCast:
1845 assert(
getType()->isObjCObjectPointerType());
1847 goto CheckNoBasePath;
1849 case CK_ReinterpretMemberPointer:
1850 assert(
getType()->isMemberPointerType());
1852 goto CheckNoBasePath;
1858 if (!
getType()->isPointerType()) {
1859 assert(
getType()->isObjCObjectPointerType() ==
1861 assert(
getType()->isBlockPointerType() ==
1864 goto CheckNoBasePath;
1866 case CK_AnyPointerToBlockPointerCast:
1867 assert(
getType()->isBlockPointerType());
1870 goto CheckNoBasePath;
1872 case CK_CopyAndAutoreleaseBlockObject:
1873 assert(
getType()->isBlockPointerType());
1875 goto CheckNoBasePath;
1877 case CK_FunctionToPointerDecay:
1878 assert(
getType()->isPointerType());
1880 goto CheckNoBasePath;
1882 case CK_AddressSpaceConversion: {
1891 (!Ty.
isNull() && !SETy.isNull() &&
1893 goto CheckNoBasePath;
1898 case CK_ArrayToPointerDecay:
1899 case CK_NullToMemberPointer:
1900 case CK_NullToPointer:
1901 case CK_ConstructorConversion:
1902 case CK_IntegralToPointer:
1903 case CK_PointerToIntegral:
1905 case CK_VectorSplat:
1906 case CK_IntegralCast:
1907 case CK_BooleanToSignedIntegral:
1908 case CK_IntegralToFloating:
1909 case CK_FloatingToIntegral:
1910 case CK_FloatingCast:
1911 case CK_ObjCObjectLValueCast:
1912 case CK_FloatingRealToComplex:
1913 case CK_FloatingComplexToReal:
1914 case CK_FloatingComplexCast:
1915 case CK_FloatingComplexToIntegralComplex:
1916 case CK_IntegralRealToComplex:
1917 case CK_IntegralComplexToReal:
1918 case CK_IntegralComplexCast:
1919 case CK_IntegralComplexToFloatingComplex:
1920 case CK_ARCProduceObject:
1921 case CK_ARCConsumeObject:
1922 case CK_ARCReclaimReturnedObject:
1923 case CK_ARCExtendBlockObject:
1924 case CK_ZeroToOCLOpaqueType:
1925 case CK_IntToOCLSampler:
1926 case CK_FloatingToFixedPoint:
1927 case CK_FixedPointToFloating:
1928 case CK_FixedPointCast:
1929 case CK_FixedPointToIntegral:
1930 case CK_IntegralToFixedPoint:
1933 goto CheckNoBasePath;
1936 case CK_LValueToRValue:
1938 case CK_AtomicToNonAtomic:
1939 case CK_NonAtomicToAtomic:
1940 case CK_PointerToBoolean:
1941 case CK_IntegralToBoolean:
1942 case CK_FloatingToBoolean:
1943 case CK_MemberPointerToBoolean:
1944 case CK_FloatingComplexToBoolean:
1945 case CK_IntegralComplexToBoolean:
1946 case CK_LValueBitCast:
1947 case CK_LValueToRValueBitCast:
1948 case CK_UserDefinedConversion:
1949 case CK_BuiltinFnToFnPtr:
1950 case CK_FixedPointToBoolean:
1951 case CK_HLSLArrayRValue:
1952 case CK_HLSLVectorTruncation:
1954 assert(
path_empty() &&
"Cast kind should not have a base path!");
1962#define CAST_OPERATION(Name) case CK_##Name: return #Name;
1963#include "clang/AST/OperationKinds.def"
1965 llvm_unreachable(
"Unhandled cast kind!");
1971static Expr *ignoreImplicitSemaNodes(
Expr *
E) {
1972 if (
auto *Materialize = dyn_cast<MaterializeTemporaryExpr>(
E))
1973 return Materialize->getSubExpr();
1975 if (
auto *Binder = dyn_cast<CXXBindTemporaryExpr>(
E))
1976 return Binder->getSubExpr();
1978 if (
auto *Full = dyn_cast<FullExpr>(
E))
1979 return Full->getSubExpr();
1981 if (
auto *CPLIE = dyn_cast<CXXParenListInitExpr>(
E);
1982 CPLIE && CPLIE->getInitExprs().size() == 1)
1983 return CPLIE->getInitExprs()[0];
1990 const Expr *SubExpr =
nullptr;
1992 for (
const CastExpr *
E =
this;
E;
E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
1997 if (
E->getCastKind() == CK_ConstructorConversion) {
1999 ignoreImplicitSemaNodes);
2000 }
else if (
E->getCastKind() == CK_UserDefinedConversion) {
2001 assert((isa<CallExpr, BlockExpr>(SubExpr)) &&
2002 "Unexpected SubExpr for CK_UserDefinedConversion.");
2003 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2004 SubExpr = MCE->getImplicitObjectArgument();
2008 return const_cast<Expr *
>(SubExpr);
2012 const Expr *SubExpr =
nullptr;
2014 for (
const CastExpr *
E =
this;
E;
E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
2017 if (
E->getCastKind() == CK_ConstructorConversion)
2018 return cast<CXXConstructExpr>(SubExpr)->getConstructor();
2020 if (
E->getCastKind() == CK_UserDefinedConversion) {
2021 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2022 return MCE->getMethodDecl();
2031#define ABSTRACT_STMT(x)
2032#define CASTEXPR(Type, Base) \
2033 case Stmt::Type##Class: \
2034 return static_cast<Type *>(this)->getTrailingObjects<CXXBaseSpecifier *>();
2035#define STMT(Type, Base)
2036#include "clang/AST/StmtNodes.inc"
2038 llvm_unreachable(
"non-cast expressions not possible here");
2053 Field != FieldEnd; ++Field) {
2055 !Field->isUnnamedBitField()) {
2065 case ImplicitCastExprClass:
2067 ->getTrailingObjects<FPOptionsOverride>();
2068 case CStyleCastExprClass:
2070 ->getTrailingObjects<FPOptionsOverride>();
2071 case CXXFunctionalCastExprClass:
2073 ->getTrailingObjects<FPOptionsOverride>();
2074 case CXXStaticCastExprClass:
2076 ->getTrailingObjects<FPOptionsOverride>();
2078 llvm_unreachable(
"Cast does not have FPFeatures");
2087 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2089 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2093 assert((Kind != CK_LValueToRValue ||
2095 "invalid type for lvalue-to-rvalue conversion");
2099 std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
2106 bool HasFPFeatures) {
2108 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2109 PathSize, HasFPFeatures));
2119 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2121 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2124 new (Buffer)
CStyleCastExpr(
T, VK, K, Op, PathSize, FPO, WrittenTy, L, R);
2126 std::uninitialized_copy_n(BasePath->data(), BasePath->size(),
2133 bool HasFPFeatures) {
2135 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2136 PathSize, HasFPFeatures));
2144#define BINARY_OPERATION(Name, Spelling) case BO_##Name: return Spelling;
2145#include "clang/AST/OperationKinds.def"
2147 llvm_unreachable(
"Invalid OpCode!");
2153 default: llvm_unreachable(
"Not an overloadable binary operator");
2154 case OO_Plus:
return BO_Add;
2155 case OO_Minus:
return BO_Sub;
2156 case OO_Star:
return BO_Mul;
2157 case OO_Slash:
return BO_Div;
2158 case OO_Percent:
return BO_Rem;
2159 case OO_Caret:
return BO_Xor;
2160 case OO_Amp:
return BO_And;
2161 case OO_Pipe:
return BO_Or;
2162 case OO_Equal:
return BO_Assign;
2163 case OO_Spaceship:
return BO_Cmp;
2164 case OO_Less:
return BO_LT;
2165 case OO_Greater:
return BO_GT;
2166 case OO_PlusEqual:
return BO_AddAssign;
2167 case OO_MinusEqual:
return BO_SubAssign;
2168 case OO_StarEqual:
return BO_MulAssign;
2169 case OO_SlashEqual:
return BO_DivAssign;
2170 case OO_PercentEqual:
return BO_RemAssign;
2171 case OO_CaretEqual:
return BO_XorAssign;
2172 case OO_AmpEqual:
return BO_AndAssign;
2173 case OO_PipeEqual:
return BO_OrAssign;
2174 case OO_LessLess:
return BO_Shl;
2175 case OO_GreaterGreater:
return BO_Shr;
2176 case OO_LessLessEqual:
return BO_ShlAssign;
2177 case OO_GreaterGreaterEqual:
return BO_ShrAssign;
2178 case OO_EqualEqual:
return BO_EQ;
2179 case OO_ExclaimEqual:
return BO_NE;
2180 case OO_LessEqual:
return BO_LE;
2181 case OO_GreaterEqual:
return BO_GE;
2182 case OO_AmpAmp:
return BO_LAnd;
2183 case OO_PipePipe:
return BO_LOr;
2184 case OO_Comma:
return BO_Comma;
2185 case OO_ArrowStar:
return BO_PtrMemI;
2192 OO_Star, OO_Slash, OO_Percent,
2194 OO_LessLess, OO_GreaterGreater,
2196 OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
2197 OO_EqualEqual, OO_ExclaimEqual,
2203 OO_Equal, OO_StarEqual,
2204 OO_SlashEqual, OO_PercentEqual,
2205 OO_PlusEqual, OO_MinusEqual,
2206 OO_LessLessEqual, OO_GreaterGreaterEqual,
2207 OO_AmpEqual, OO_CaretEqual,
2211 return OverOps[Opc];
2253 BuiltinLoc(BLoc), RParenLoc(RParenLoc), ParentContext(ParentContext) {
2257 ? ExprDependence::Value
2258 : ExprDependence::None);
2264 return "__builtin_FILE";
2266 return "__builtin_FILE_NAME";
2268 return "__builtin_FUNCTION";
2270 return "__builtin_FUNCSIG";
2272 return "__builtin_LINE";
2274 return "__builtin_COLUMN";
2276 return "__builtin_source_location";
2278 llvm_unreachable(
"unexpected IdentKind!");
2282 const Expr *DefaultExpr)
const {
2286 if (
const auto *DIE = dyn_cast_if_present<CXXDefaultInitExpr>(DefaultExpr)) {
2287 Loc = DIE->getUsedLocation();
2288 Context = DIE->getUsedContext();
2289 }
else if (
const auto *DAE =
2290 dyn_cast_if_present<CXXDefaultArgExpr>(DefaultExpr)) {
2291 Loc = DAE->getUsedLocation();
2292 Context = DAE->getUsedContext();
2303 if (
const auto *
D = dyn_cast<CXXMethodDecl>(Context);
2305 Context =
D->getParent()->getParent();
2310 auto MakeStringLiteral = [&](StringRef Tmp) {
2314 LValuePathEntry
Path[1] = {LValuePathEntry::ArrayIndex(0)};
2325 return MakeStringLiteral(
FileName);
2331 return MakeStringLiteral(
Path);
2335 const auto *CurDecl = dyn_cast<Decl>(Context);
2339 return MakeStringLiteral(
2359 StringRef Name = F->getName();
2360 if (Name ==
"_M_file_name") {
2364 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(
Path);
2365 }
else if (Name ==
"_M_function_name") {
2368 const auto *CurDecl = dyn_cast<Decl>(Context);
2369 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(
2370 CurDecl && !isa<TranslationUnitDecl>(CurDecl)
2374 }
else if (Name ==
"_M_line") {
2376 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2377 }
else if (Name ==
"_M_column") {
2379 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2390 llvm_unreachable(
"unhandled case");
2395 unsigned NumOfElements)
2398 NumOfElements(NumOfElements) {
2407 InitExprs(
C, initExprs.size()), LBraceLoc(lbraceloc),
2408 RBraceLoc(rbraceloc), AltForm(nullptr,
true) {
2410 InitExprs.
insert(
C, InitExprs.
end(), initExprs.begin(), initExprs.end());
2416 if (NumInits > InitExprs.
size())
2421 InitExprs.
resize(
C, NumInits,
nullptr);
2438 ArrayFillerOrUnionFieldInit = filler;
2441 for (
unsigned i = 0, e =
getNumInits(); i != e; ++i)
2442 if (
inits[i] ==
nullptr)
2456 Init =
Init->IgnoreParenImpCasts();
2457 return isa<StringLiteral>(
Init) || isa<ObjCEncodeExpr>(
Init);
2461 assert(
isSemanticForm() &&
"syntactic form never semantically transparent");
2465 assert(
getNumInits() == 1 &&
"multiple inits in glvalue init list");
2484 assert(
isSyntacticForm() &&
"only test syntactic form as zero initializer");
2491 return Lit && Lit->
getValue() == 0;
2496 return SyntacticForm->getBeginLoc();
2501 E = InitExprs.
end();
2504 Beg = S->getBeginLoc();
2514 return SyntacticForm->getEndLoc();
2516 if (End.isInvalid()) {
2518 for (
Stmt *S : llvm::reverse(InitExprs)) {
2520 End = S->getEndLoc();
2532 return cast<BlockPointerType>(
getType())
2563 if (isa<DeclRefExpr>(
E))
2567 if (isa<ArraySubscriptExpr>(
E))
2571 if (isa<MemberExpr>(
E))
2575 if (
auto *UO = dyn_cast<UnaryOperator>(
E))
2576 if (UO->getOpcode() == UO_Deref)
2579 if (
auto *BO = dyn_cast<BinaryOperator>(
E)) {
2581 if (BO->isPtrMemOp())
2585 if (BO->getOpcode() == BO_Comma)
2586 return BO->getRHS()->isReadIfDiscardedInCPlusPlus11();
2591 if (
auto *CO = dyn_cast<ConditionalOperator>(
E))
2592 return CO->getTrueExpr()->isReadIfDiscardedInCPlusPlus11() &&
2593 CO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2596 dyn_cast<BinaryConditionalOperator>(
E)) {
2597 if (
auto *OVE = dyn_cast<OpaqueValueExpr>(BCO->getTrueExpr()))
2598 return OVE->getSourceExpr()->isReadIfDiscardedInCPlusPlus11() &&
2599 BCO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2603 if (isa<ObjCIvarRefExpr>(
E))
2605 if (
const auto *POE = dyn_cast<PseudoObjectExpr>(
E)) {
2606 if (isa<ObjCPropertyRefExpr, ObjCSubscriptRefExpr>(POE->getSyntacticForm()))
2633 case ParenExprClass:
2634 return cast<ParenExpr>(
this)->getSubExpr()->
2636 case GenericSelectionExprClass:
2637 return cast<GenericSelectionExpr>(
this)->getResultExpr()->
2639 case CoawaitExprClass:
2640 case CoyieldExprClass:
2641 return cast<CoroutineSuspendExpr>(
this)->getResumeExpr()->
2643 case ChooseExprClass:
2644 return cast<ChooseExpr>(
this)->getChosenSubExpr()->
2646 case UnaryOperatorClass: {
2680 case BinaryOperatorClass: {
2692 if (IE->getValue() == 0)
2711 case CompoundAssignOperatorClass:
2712 case VAArgExprClass:
2713 case AtomicExprClass:
2716 case ConditionalOperatorClass: {
2720 const auto *Exp = cast<ConditionalOperator>(
this);
2721 return Exp->getLHS()->isUnusedResultAWarning(WarnE,
Loc, R1, R2, Ctx) &&
2722 Exp->getRHS()->isUnusedResultAWarning(WarnE,
Loc, R1, R2, Ctx);
2724 case BinaryConditionalOperatorClass: {
2725 const auto *Exp = cast<BinaryConditionalOperator>(
this);
2726 return Exp->getFalseExpr()->isUnusedResultAWarning(WarnE,
Loc, R1, R2, Ctx);
2729 case MemberExprClass:
2731 Loc = cast<MemberExpr>(
this)->getMemberLoc();
2733 R2 = cast<MemberExpr>(
this)->getBase()->getSourceRange();
2736 case ArraySubscriptExprClass:
2738 Loc = cast<ArraySubscriptExpr>(
this)->getRBracketLoc();
2739 R1 = cast<ArraySubscriptExpr>(
this)->getLHS()->getSourceRange();
2740 R2 = cast<ArraySubscriptExpr>(
this)->getRHS()->getSourceRange();
2743 case CXXOperatorCallExprClass: {
2755 case OO_ExclaimEqual:
2758 case OO_GreaterEqual:
2773 case CXXMemberCallExprClass:
2774 case UserDefinedLiteralClass: {
2776 const CallExpr *CE = cast<CallExpr>(
this);
2784 FD->hasAttr<PureAttr>() || FD->hasAttr<ConstAttr>()) {
2799 case UnresolvedLookupExprClass:
2800 case CXXUnresolvedConstructExprClass:
2801 case RecoveryExprClass:
2804 case CXXTemporaryObjectExprClass:
2805 case CXXConstructExprClass: {
2807 const auto *WarnURAttr =
Type->getAttr<WarnUnusedResultAttr>();
2809 (WarnURAttr && WarnURAttr->IsCXX11NoDiscard())) {
2817 const auto *CE = cast<CXXConstructExpr>(
this);
2819 const auto *WarnURAttr = Ctor->getAttr<WarnUnusedResultAttr>();
2820 if (WarnURAttr && WarnURAttr->IsCXX11NoDiscard()) {
2825 if (
unsigned NumArgs = CE->getNumArgs())
2827 CE->getArg(NumArgs - 1)->getEndLoc());
2835 case ObjCMessageExprClass: {
2848 if (MD->hasAttr<WarnUnusedResultAttr>()) {
2857 case ObjCPropertyRefExprClass:
2858 case ObjCSubscriptRefExprClass:
2864 case PseudoObjectExprClass: {
2865 const auto *POE = cast<PseudoObjectExpr>(
this);
2868 if (isa<ObjCPropertyRefExpr, ObjCSubscriptRefExpr>(
2869 POE->getSyntacticForm())) {
2877 if (
auto *BO = dyn_cast<BinaryOperator>(POE->getSyntacticForm()))
2878 if (BO->isAssignmentOp())
2880 if (
auto *UO = dyn_cast<UnaryOperator>(POE->getSyntacticForm()))
2881 if (UO->isIncrementDecrementOp())
2886 return Result &&
Result->isUnusedResultAWarning(WarnE,
Loc, R1, R2, Ctx);
2889 case StmtExprClass: {
2895 const CompoundStmt *CS = cast<StmtExpr>(
this)->getSubStmt();
2900 if (
const Expr *
E = dyn_cast<Expr>(
Label->getSubStmt()))
2907 Loc = cast<StmtExpr>(
this)->getLParenLoc();
2911 case CXXFunctionalCastExprClass:
2912 case CStyleCastExprClass: {
2919 const CastExpr *CE = cast<CastExpr>(
this);
2926 if (
auto *DRE = dyn_cast<DeclRefExpr>(SubE))
2927 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2928 if (!VD->isExternallyVisible())
2944 if (CE->
getCastKind() == CK_ConstructorConversion)
2951 dyn_cast<CXXFunctionalCastExpr>(
this)) {
2952 Loc = CXXCE->getBeginLoc();
2953 R1 = CXXCE->getSubExpr()->getSourceRange();
2961 case ImplicitCastExprClass: {
2962 const CastExpr *ICE = cast<ImplicitCastExpr>(
this);
2971 case CXXDefaultArgExprClass:
2972 return (cast<CXXDefaultArgExpr>(
this)
2974 case CXXDefaultInitExprClass:
2975 return (cast<CXXDefaultInitExpr>(
this)
2978 case CXXNewExprClass:
2981 case CXXDeleteExprClass:
2983 case MaterializeTemporaryExprClass:
2984 return cast<MaterializeTemporaryExpr>(
this)
2986 ->isUnusedResultAWarning(WarnE,
Loc, R1, R2, Ctx);
2987 case CXXBindTemporaryExprClass:
2988 return cast<CXXBindTemporaryExpr>(
this)->getSubExpr()
2989 ->isUnusedResultAWarning(WarnE,
Loc, R1, R2, Ctx);
2990 case ExprWithCleanupsClass:
2991 return cast<ExprWithCleanups>(
this)->getSubExpr()
2992 ->isUnusedResultAWarning(WarnE,
Loc, R1, R2, Ctx);
2993 case OpaqueValueExprClass:
2994 return cast<OpaqueValueExpr>(
this)->getSourceExpr()->isUnusedResultAWarning(
2995 WarnE,
Loc, R1, R2, Ctx);
3006 case ObjCIvarRefExprClass:
3008 case Expr::UnaryOperatorClass:
3009 return cast<UnaryOperator>(
E)->getSubExpr()->isOBJCGCCandidate(Ctx);
3010 case ImplicitCastExprClass:
3011 return cast<ImplicitCastExpr>(
E)->getSubExpr()->isOBJCGCCandidate(Ctx);
3012 case MaterializeTemporaryExprClass:
3013 return cast<MaterializeTemporaryExpr>(
E)->getSubExpr()->isOBJCGCCandidate(
3015 case CStyleCastExprClass:
3016 return cast<CStyleCastExpr>(
E)->getSubExpr()->isOBJCGCCandidate(Ctx);
3017 case DeclRefExprClass: {
3018 const Decl *
D = cast<DeclRefExpr>(
E)->getDecl();
3020 if (
const VarDecl *VD = dyn_cast<VarDecl>(
D)) {
3021 if (VD->hasGlobalStorage())
3031 case MemberExprClass: {
3035 case ArraySubscriptExprClass:
3036 return cast<ArraySubscriptExpr>(
E)->getBase()->isOBJCGCCandidate(Ctx);
3047 assert(
expr->hasPlaceholderType(BuiltinType::BoundMember));
3055 assert(isa<CXXMethodDecl>(mem->getMemberDecl()));
3056 return mem->getMemberDecl()->getType();
3062 assert(
type->isFunctionType());
3066 assert(isa<UnresolvedMemberExpr>(
expr) || isa<CXXPseudoDestructorExpr>(
expr));
3100 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(
this)) {
3101 if (isa_and_nonnull<CXXConversionDecl>(MCE->getMethodDecl()))
3102 return MCE->getImplicitObjectArgument();
3118 auto IgnoreNoopCastsSingleStep = [&Ctx](
Expr *
E) {
3119 if (
auto *CE = dyn_cast<CastExpr>(
E)) {
3122 Expr *SubExpr = CE->getSubExpr();
3123 bool IsIdentityCast =
3132 if (IsIdentityCast || IsSameWidthCast)
3134 }
else if (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(
E))
3135 return NTTP->getReplacement();
3140 IgnoreNoopCastsSingleStep);
3145 if (
auto *Cast = dyn_cast<CXXFunctionalCastExpr>(
E)) {
3146 auto *SE = Cast->getSubExpr();
3151 if (
auto *
C = dyn_cast<CXXConstructExpr>(
E)) {
3152 auto NumArgs =
C->getNumArgs();
3154 (NumArgs > 1 && isa<CXXDefaultArgExpr>(
C->getArg(1)))) {
3155 Expr *A =
C->getArg(0);
3162 auto IgnoreImplicitMemberCallSingleStep = [](
Expr *
E) {
3163 if (
auto *
C = dyn_cast<CXXMemberCallExpr>(
E)) {
3164 Expr *ExprNode =
C->getImplicitObjectArgument();
3168 if (
auto *PE = dyn_cast<ParenExpr>(ExprNode)) {
3169 if (PE->getSourceRange() ==
C->getSourceRange()) {
3170 return cast<Expr>(PE);
3182 IgnoreImplicitMemberCallSingleStep);
3186 const Expr *
E =
this;
3188 E = M->getSubExpr();
3191 E = ICE->getSubExprAsWritten();
3193 return isa<CXXDefaultArgExpr>(
E);
3200 E = M->getSubExpr();
3203 if (ICE->getCastKind() == CK_NoOp)
3204 E = ICE->getSubExpr();
3210 E = BE->getSubExpr();
3213 if (ICE->getCastKind() == CK_NoOp)
3214 E = ICE->getSubExpr();
3225 if (!
C.hasSameUnqualifiedType(
getType(),
C.getTypeDeclType(TempTy)))
3233 if (!isa<ObjCPropertyRefExpr>(
E))
3241 if (isa<ImplicitCastExpr>(
E)) {
3242 switch (cast<ImplicitCastExpr>(
E)->getCastKind()) {
3243 case CK_DerivedToBase:
3244 case CK_UncheckedDerivedToBase:
3252 if (isa<MemberExpr>(
E))
3256 if (BO->isPtrMemOp())
3260 if (isa<OpaqueValueExpr>(
E))
3267 const Expr *
E =
this;
3277 if (ICE->getCastKind() == CK_NoOp ||
3278 ICE->getCastKind() == CK_LValueToRValue ||
3279 ICE->getCastKind() == CK_DerivedToBase ||
3280 ICE->getCastKind() == CK_UncheckedDerivedToBase) {
3281 E = ICE->getSubExpr();
3287 if (UnOp->getOpcode() == UO_Extension) {
3288 E = UnOp->getSubExpr();
3294 = dyn_cast<MaterializeTemporaryExpr>(
E)) {
3295 E = M->getSubExpr();
3302 if (
const CXXThisExpr *This = dyn_cast<CXXThisExpr>(
E))
3303 return This->isImplicit();
3311 for (
unsigned I = 0; I < Exprs.size(); ++I)
3319 const Expr **Culprit)
const {
3321 "Expression evaluator can't be called on a dependent expression.");
3333 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
this))
3334 return EWC->getSubExpr()->isConstantInitializer(Ctx,
true, Culprit);
3335 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
this))
3336 return MTE->getSubExpr()->isConstantInitializer(Ctx,
false, Culprit);
3347 case Stmt::ExprWithCleanupsClass:
3349 Ctx, IsForRef, Culprit);
3350 case StringLiteralClass:
3351 case ObjCEncodeExprClass:
3353 case CXXTemporaryObjectExprClass:
3354 case CXXConstructExprClass: {
3363 assert(CE->
getNumArgs() == 1 &&
"trivial ctor with > 1 argument");
3369 case ConstantExprClass: {
3372 const Expr *Exp = cast<ConstantExpr>(
this)->getSubExpr();
3375 case CompoundLiteralExprClass: {
3379 const Expr *Exp = cast<CompoundLiteralExpr>(
this)->getInitializer();
3382 case DesignatedInitUpdateExprClass: {
3387 case InitListExprClass: {
3395 assert(ILE->
isSemanticForm() &&
"InitListExpr must be in semantic form");
3398 for (
unsigned i = 0; i < numInits; i++) {
3406 unsigned ElementNo = 0;
3411 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3412 for (
unsigned i = 0, e = CXXRD->getNumBases(); i < e; i++) {
3413 if (ElementNo < ILE->getNumInits()) {
3421 for (
const auto *Field : RD->
fields()) {
3427 if (Field->isUnnamedBitField())
3430 if (ElementNo < ILE->getNumInits()) {
3432 if (Field->isBitField()) {
3441 bool RefType = Field->getType()->isReferenceType();
3452 case ImplicitValueInitExprClass:
3453 case NoInitExprClass:
3455 case ParenExprClass:
3456 return cast<ParenExpr>(
this)->getSubExpr()
3457 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3458 case GenericSelectionExprClass:
3459 return cast<GenericSelectionExpr>(
this)->getResultExpr()
3460 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3461 case ChooseExprClass:
3462 if (cast<ChooseExpr>(
this)->isConditionDependent()) {
3467 return cast<ChooseExpr>(
this)->getChosenSubExpr()
3469 case UnaryOperatorClass: {
3475 case PackIndexingExprClass: {
3476 return cast<PackIndexingExpr>(
this)
3478 ->isConstantInitializer(Ctx,
false, Culprit);
3480 case CXXFunctionalCastExprClass:
3481 case CXXStaticCastExprClass:
3482 case ImplicitCastExprClass:
3483 case CStyleCastExprClass:
3484 case ObjCBridgedCastExprClass:
3485 case CXXDynamicCastExprClass:
3486 case CXXReinterpretCastExprClass:
3487 case CXXAddrspaceCastExprClass:
3488 case CXXConstCastExprClass: {
3489 const CastExpr *CE = cast<CastExpr>(
this);
3504 case MaterializeTemporaryExprClass:
3505 return cast<MaterializeTemporaryExpr>(
this)
3507 ->isConstantInitializer(Ctx,
false, Culprit);
3509 case SubstNonTypeTemplateParmExprClass:
3510 return cast<SubstNonTypeTemplateParmExpr>(
this)->getReplacement()
3511 ->isConstantInitializer(Ctx,
false, Culprit);
3512 case CXXDefaultArgExprClass:
3513 return cast<CXXDefaultArgExpr>(
this)->getExpr()
3514 ->isConstantInitializer(Ctx,
false, Culprit);
3515 case CXXDefaultInitExprClass:
3516 return cast<CXXDefaultInitExpr>(
this)->getExpr()
3517 ->isConstantInitializer(Ctx,
false, Culprit);
3531 if (BuiltinID != Builtin::BI__assume &&
3532 BuiltinID != Builtin::BI__builtin_assume)
3549 const bool IncludePossibleEffects;
3550 bool HasSideEffects;
3553 explicit SideEffectFinder(
const ASTContext &Context,
bool IncludePossible)
3554 : Inherited(Context),
3555 IncludePossibleEffects(IncludePossible), HasSideEffects(
false) { }
3557 bool hasSideEffects()
const {
return HasSideEffects; }
3559 void VisitDecl(
const Decl *
D) {
3565 if (
auto *VD = dyn_cast<VarDecl>(
D)) {
3567 if (IncludePossibleEffects && VD->isThisDeclarationADefinition() &&
3568 VD->needsDestruction(Context))
3569 HasSideEffects =
true;
3573 void VisitDeclStmt(
const DeclStmt *DS) {
3574 for (
auto *
D : DS->
decls())
3576 Inherited::VisitDeclStmt(DS);
3579 void VisitExpr(
const Expr *
E) {
3580 if (!HasSideEffects &&
3582 HasSideEffects =
true;
3588 bool IncludePossibleEffects)
const {
3592 if (!IncludePossibleEffects &&
getExprLoc().isMacroID())
3597 #define ABSTRACT_STMT(Type)
3598 #define STMT(Type, Base) case Type##Class:
3599 #define EXPR(Type, Base)
3600 #include "clang/AST/StmtNodes.inc"
3601 llvm_unreachable(
"unexpected Expr kind");
3603 case DependentScopeDeclRefExprClass:
3604 case CXXUnresolvedConstructExprClass:
3605 case CXXDependentScopeMemberExprClass:
3606 case UnresolvedLookupExprClass:
3607 case UnresolvedMemberExprClass:
3608 case PackExpansionExprClass:
3609 case SubstNonTypeTemplateParmPackExprClass:
3610 case FunctionParmPackExprClass:
3612 case RecoveryExprClass:
3613 case CXXFoldExprClass:
3615 return IncludePossibleEffects;
3617 case DeclRefExprClass:
3618 case ObjCIvarRefExprClass:
3619 case PredefinedExprClass:
3620 case IntegerLiteralClass:
3621 case FixedPointLiteralClass:
3622 case FloatingLiteralClass:
3623 case ImaginaryLiteralClass:
3624 case StringLiteralClass:
3625 case CharacterLiteralClass:
3626 case OffsetOfExprClass:
3627 case ImplicitValueInitExprClass:
3628 case UnaryExprOrTypeTraitExprClass:
3629 case AddrLabelExprClass:
3630 case GNUNullExprClass:
3631 case ArrayInitIndexExprClass:
3632 case NoInitExprClass:
3633 case CXXBoolLiteralExprClass:
3634 case CXXNullPtrLiteralExprClass:
3635 case CXXThisExprClass:
3636 case CXXScalarValueInitExprClass:
3637 case TypeTraitExprClass:
3638 case ArrayTypeTraitExprClass:
3639 case ExpressionTraitExprClass:
3640 case CXXNoexceptExprClass:
3641 case SizeOfPackExprClass:
3642 case ObjCStringLiteralClass:
3643 case ObjCEncodeExprClass:
3644 case ObjCBoolLiteralExprClass:
3645 case ObjCAvailabilityCheckExprClass:
3646 case CXXUuidofExprClass:
3647 case OpaqueValueExprClass:
3648 case SourceLocExprClass:
3649 case EmbedExprClass:
3650 case ConceptSpecializationExprClass:
3651 case RequiresExprClass:
3652 case SYCLUniqueStableNameExprClass:
3653 case PackIndexingExprClass:
3654 case HLSLOutArgExprClass:
3655 case OpenACCAsteriskSizeExprClass:
3659 case ConstantExprClass:
3661 return cast<ConstantExpr>(
this)->getSubExpr()->HasSideEffects(
3662 Ctx, IncludePossibleEffects);
3665 case CXXOperatorCallExprClass:
3666 case CXXMemberCallExprClass:
3667 case CUDAKernelCallExprClass:
3668 case UserDefinedLiteralClass: {
3672 const Decl *FD = cast<CallExpr>(
this)->getCalleeDecl();
3673 bool IsPure = FD && (FD->
hasAttr<ConstAttr>() || FD->
hasAttr<PureAttr>());
3674 if (IsPure || !IncludePossibleEffects)
3679 case BlockExprClass:
3680 case CXXBindTemporaryExprClass:
3681 if (!IncludePossibleEffects)
3685 case MSPropertyRefExprClass:
3686 case MSPropertySubscriptExprClass:
3687 case CompoundAssignOperatorClass:
3688 case VAArgExprClass:
3689 case AtomicExprClass:
3690 case CXXThrowExprClass:
3691 case CXXNewExprClass:
3692 case CXXDeleteExprClass:
3693 case CoawaitExprClass:
3694 case DependentCoawaitExprClass:
3695 case CoyieldExprClass:
3699 case StmtExprClass: {
3701 SideEffectFinder Finder(Ctx, IncludePossibleEffects);
3702 Finder.Visit(cast<StmtExpr>(
this)->getSubStmt());
3703 return Finder.hasSideEffects();
3706 case ExprWithCleanupsClass:
3707 if (IncludePossibleEffects)
3708 if (cast<ExprWithCleanups>(
this)->cleanupsHaveSideEffects())
3712 case ParenExprClass:
3713 case ArraySubscriptExprClass:
3714 case MatrixSubscriptExprClass:
3715 case ArraySectionExprClass:
3716 case OMPArrayShapingExprClass:
3717 case OMPIteratorExprClass:
3718 case MemberExprClass:
3719 case ConditionalOperatorClass:
3720 case BinaryConditionalOperatorClass:
3721 case CompoundLiteralExprClass:
3722 case ExtVectorElementExprClass:
3723 case DesignatedInitExprClass:
3724 case DesignatedInitUpdateExprClass:
3725 case ArrayInitLoopExprClass:
3726 case ParenListExprClass:
3727 case CXXPseudoDestructorExprClass:
3728 case CXXRewrittenBinaryOperatorClass:
3729 case CXXStdInitializerListExprClass:
3730 case SubstNonTypeTemplateParmExprClass:
3731 case MaterializeTemporaryExprClass:
3732 case ShuffleVectorExprClass:
3733 case ConvertVectorExprClass:
3734 case AsTypeExprClass:
3735 case CXXParenListInitExprClass:
3739 case UnaryOperatorClass:
3740 if (cast<UnaryOperator>(
this)->isIncrementDecrementOp())
3744 case BinaryOperatorClass:
3745 if (cast<BinaryOperator>(
this)->isAssignmentOp())
3749 case InitListExprClass:
3751 if (
const Expr *
E = cast<InitListExpr>(
this)->getArrayFiller())
3756 case GenericSelectionExprClass:
3757 return cast<GenericSelectionExpr>(
this)->getResultExpr()->
3760 case ChooseExprClass:
3761 return cast<ChooseExpr>(
this)->getChosenSubExpr()->HasSideEffects(
3762 Ctx, IncludePossibleEffects);
3764 case CXXDefaultArgExprClass:
3765 return cast<CXXDefaultArgExpr>(
this)->getExpr()->HasSideEffects(
3766 Ctx, IncludePossibleEffects);
3768 case CXXDefaultInitExprClass: {
3769 const FieldDecl *FD = cast<CXXDefaultInitExpr>(
this)->getField();
3776 case CXXDynamicCastExprClass: {
3784 case ImplicitCastExprClass:
3785 case CStyleCastExprClass:
3786 case CXXStaticCastExprClass:
3787 case CXXReinterpretCastExprClass:
3788 case CXXConstCastExprClass:
3789 case CXXAddrspaceCastExprClass:
3790 case CXXFunctionalCastExprClass:
3791 case BuiltinBitCastExprClass: {
3796 if (!IncludePossibleEffects)
3799 const CastExpr *CE = cast<CastExpr>(
this);
3806 case CXXTypeidExprClass: {
3807 const auto *TE = cast<CXXTypeidExpr>(
this);
3808 if (!TE->isPotentiallyEvaluated())
3813 if (IncludePossibleEffects && TE->hasNullCheck())
3819 case CXXConstructExprClass:
3820 case CXXTemporaryObjectExprClass: {
3829 case CXXInheritedCtorInitExprClass: {
3830 const auto *ICIE = cast<CXXInheritedCtorInitExpr>(
this);
3831 if (!ICIE->getConstructor()->isTrivial() && IncludePossibleEffects)
3836 case LambdaExprClass: {
3837 const LambdaExpr *LE = cast<LambdaExpr>(
this);
3838 for (
Expr *
E : LE->capture_inits())
3844 case PseudoObjectExprClass: {
3851 const Expr *Subexpr = *I;
3853 Subexpr = OVE->getSourceExpr();
3860 case ObjCBoxedExprClass:
3861 case ObjCArrayLiteralClass:
3862 case ObjCDictionaryLiteralClass:
3863 case ObjCSelectorExprClass:
3864 case ObjCProtocolExprClass:
3865 case ObjCIsaExprClass:
3866 case ObjCIndirectCopyRestoreExprClass:
3867 case ObjCSubscriptRefExprClass:
3868 case ObjCBridgedCastExprClass:
3869 case ObjCMessageExprClass:
3870 case ObjCPropertyRefExprClass:
3872 if (IncludePossibleEffects)
3880 cast<Expr>(SubStmt)->
HasSideEffects(Ctx, IncludePossibleEffects))
3887 if (
auto Call = dyn_cast<CallExpr>(
this))
3888 return Call->getFPFeaturesInEffect(LO);
3889 if (
auto UO = dyn_cast<UnaryOperator>(
this))
3890 return UO->getFPFeaturesInEffect(LO);
3891 if (
auto BO = dyn_cast<BinaryOperator>(
this))
3892 return BO->getFPFeaturesInEffect(LO);
3893 if (
auto Cast = dyn_cast<CastExpr>(
this))
3894 return Cast->getFPFeaturesInEffect(LO);
3907 explicit NonTrivialCallFinder(
const ASTContext &Context)
3908 : Inherited(Context), NonTrivial(
false) { }
3910 bool hasNonTrivialCall()
const {
return NonTrivial; }
3914 = dyn_cast_or_null<const CXXMethodDecl>(
E->getCalleeDecl())) {
3915 if (Method->isTrivial()) {
3917 Inherited::VisitStmt(
E);
3926 if (
E->getConstructor()->isTrivial()) {
3928 Inherited::VisitStmt(
E);
3939 E->getTemporary()->getDestructor()) {
3940 if (DtorDecl->isTrivial()) {
3941 Inherited::VisitStmt(
E);
3952 NonTrivialCallFinder Finder(Ctx);
3954 return Finder.hasNonTrivialCall();
3972 llvm_unreachable(
"Unexpected value dependent expression!");
4000 CE->getSubExpr()->getType()->isIntegerType())
4001 return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4004 }
else if (
const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(
this)) {
4006 return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4007 }
else if (
const ParenExpr *PE = dyn_cast<ParenExpr>(
this)) {
4010 return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4012 dyn_cast<GenericSelectionExpr>(
this)) {
4013 if (GE->isResultDependent())
4015 return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC);
4016 }
else if (
const ChooseExpr *CE = dyn_cast<ChooseExpr>(
this)) {
4017 if (CE->isConditionDependent())
4019 return CE->getChosenSubExpr()->isNullPointerConstant(Ctx, NPC);
4021 = dyn_cast<CXXDefaultArgExpr>(
this)) {
4023 return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
4025 = dyn_cast<CXXDefaultInitExpr>(
this)) {
4027 return DefaultInit->getExpr()->isNullPointerConstant(Ctx, NPC);
4028 }
else if (isa<GNUNullExpr>(
this)) {
4032 = dyn_cast<MaterializeTemporaryExpr>(
this)) {
4033 return M->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4034 }
else if (
const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(
this)) {
4035 if (
const Expr *Source = OVE->getSourceExpr())
4036 return Source->isNullPointerConstant(Ctx, NPC);
4045 if (
getType()->isNullPtrType())
4050 UT && UT->getDecl()->hasAttr<TransparentUnionAttr>())
4052 const Expr *InitExpr = CLE->getInitializer();
4053 if (
const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
4057 if (!
getType()->isIntegerType() ||
4080 if (isa<IntegerLiteral>(
this))
4088 const Expr *
E =
this;
4091 "expression is not a property reference");
4094 if (BO->getOpcode() == BO_Comma) {
4103 return cast<ObjCPropertyRefExpr>(
E);
4128 if (ICE->getCastKind() == CK_LValueToRValue ||
4129 (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp))
4136 if (
FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
4137 if (Field->isBitField())
4147 if (
FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
4148 if (Field->isBitField())
4151 if (
BindingDecl *BD = dyn_cast<BindingDecl>(DeclRef->getDecl()))
4152 if (
Expr *
E = BD->getBinding())
4157 if (BinOp->isAssignmentOp() && BinOp->getLHS())
4158 return BinOp->getLHS()->getSourceBitField();
4160 if (BinOp->getOpcode() == BO_Comma && BinOp->getRHS())
4161 return BinOp->getRHS()->getSourceBitField();
4165 if (UnOp->isPrefix() && UnOp->isIncrementDecrementOp())
4166 return UnOp->getSubExpr()->getSourceBitField();
4173 if (
auto *DRE = dyn_cast<DeclRefExpr>(
E))
4174 return dyn_cast<EnumConstantDecl>(DRE->getDecl());
4183 if (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp)
4192 if (isa<ExtVectorElementExpr>(
E))
4195 if (
auto *DRE = dyn_cast<DeclRefExpr>(
E))
4196 if (
auto *BD = dyn_cast<BindingDecl>(DRE->getDecl()))
4197 if (
auto *
E = BD->getBinding())
4207 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
4209 VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
4225 case CXXThisExprClass:
4227 case DeclRefExprClass: {
4230 const auto *DRE1 = cast<DeclRefExpr>(E1);
4231 const auto *DRE2 = cast<DeclRefExpr>(E2);
4232 return DRE1->isPRValue() && DRE2->isPRValue() &&
4233 DRE1->getDecl() == DRE2->getDecl();
4235 case ImplicitCastExprClass: {
4238 const auto *ICE1 = dyn_cast<ImplicitCastExpr>(E1);
4239 const auto *ICE2 = dyn_cast<ImplicitCastExpr>(E2);
4242 if (ICE1->getCastKind() != ICE2->getCastKind())
4247 if (ICE1->getCastKind() == CK_LValueToRValue ||
4248 ICE1->getCastKind() == CK_ArrayToPointerDecay ||
4249 ICE1->getCastKind() == CK_FunctionToPointerDecay) {
4254 const auto *DRE1 = dyn_cast<DeclRefExpr>(E1);
4255 const auto *DRE2 = dyn_cast<DeclRefExpr>(E2);
4259 const auto *Ivar1 = dyn_cast<ObjCIvarRefExpr>(E1);
4260 const auto *Ivar2 = dyn_cast<ObjCIvarRefExpr>(E2);
4261 if (Ivar1 && Ivar2) {
4262 return Ivar1->isFreeIvar() && Ivar2->isFreeIvar() &&
4266 const auto *Array1 = dyn_cast<ArraySubscriptExpr>(E1);
4267 const auto *Array2 = dyn_cast<ArraySubscriptExpr>(E2);
4268 if (Array1 && Array2) {
4272 auto Idx1 = Array1->getIdx();
4273 auto Idx2 = Array2->getIdx();
4274 const auto Integer1 = dyn_cast<IntegerLiteral>(Idx1);
4275 const auto Integer2 = dyn_cast<IntegerLiteral>(Idx2);
4276 if (Integer1 && Integer2) {
4277 if (!llvm::APInt::isSameValue(Integer1->getValue(),
4278 Integer2->getValue()))
4289 while (isa<MemberExpr>(E1) && isa<MemberExpr>(E2)) {
4290 const auto *ME1 = cast<MemberExpr>(E1);
4291 const auto *ME2 = cast<MemberExpr>(E2);
4294 if (
const auto *
D = dyn_cast<VarDecl>(ME1->getMemberDecl()))
4295 if (
D->isStaticDataMember())
4301 if (isa<CXXThisExpr>(E1) && isa<CXXThisExpr>(E2))
4307 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
E))
4308 return DRE->getDecl();
4309 if (
const auto *ME = dyn_cast<MemberExpr>(
E))
4310 return ME->getMemberDecl();
4329 return VT->getNumElements();
4337 StringRef Comp = Accessor->
getName();
4340 if (Comp ==
"hi" || Comp ==
"lo" || Comp ==
"even" || Comp ==
"odd")
4344 if (Comp[0] ==
's' || Comp[0] ==
'S')
4345 Comp = Comp.substr(1);
4347 for (
unsigned i = 0, e = Comp.size(); i != e; ++i)
4348 if (Comp.substr(i + 1).contains(Comp[i]))
4357 StringRef Comp = Accessor->
getName();
4358 bool isNumericAccessor =
false;
4359 if (Comp[0] ==
's' || Comp[0] ==
'S') {
4360 Comp = Comp.substr(1);
4361 isNumericAccessor =
true;
4364 bool isHi = Comp ==
"hi";
4365 bool isLo = Comp ==
"lo";
4366 bool isEven = Comp ==
"even";
4367 bool isOdd = Comp ==
"odd";
4383 Elts.push_back(Index);
4391 BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(args.size()) {
4392 SubExprs =
new (
C)
Stmt*[args.size()];
4393 for (
unsigned i = 0; i != args.size(); i++)
4394 SubExprs[i] = args[i];
4400 if (SubExprs)
C.Deallocate(SubExprs);
4402 this->NumExprs = Exprs.size();
4403 SubExprs =
new (
C)
Stmt*[NumExprs];
4404 memcpy(SubExprs, Exprs.data(),
sizeof(
Expr *) * Exprs.size());
4407GenericSelectionExpr::GenericSelectionExpr(
4411 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex)
4412 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->getType(),
4413 AssocExprs[ResultIndex]->getValueKind(),
4414 AssocExprs[ResultIndex]->getObjectKind()),
4415 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4416 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4417 assert(AssocTypes.size() == AssocExprs.size() &&
4418 "Must have the same number of association expressions"
4419 " and TypeSourceInfo!");
4420 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4423 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4425 std::copy(AssocExprs.begin(), AssocExprs.end(),
4426 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4427 std::copy(AssocTypes.begin(), AssocTypes.end(),
4428 getTrailingObjects<TypeSourceInfo *>() +
4429 getIndexOfStartOfAssociatedTypes());
4434GenericSelectionExpr::GenericSelectionExpr(
4439 unsigned ResultIndex)
4440 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->getType(),
4441 AssocExprs[ResultIndex]->getValueKind(),
4442 AssocExprs[ResultIndex]->getObjectKind()),
4443 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4444 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4445 assert(AssocTypes.size() == AssocExprs.size() &&
4446 "Must have the same number of association expressions"
4447 " and TypeSourceInfo!");
4448 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4451 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4453 std::copy(AssocExprs.begin(), AssocExprs.end(),
4454 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4455 std::copy(AssocTypes.begin(), AssocTypes.end(),
4456 getTrailingObjects<TypeSourceInfo *>() +
4457 getIndexOfStartOfAssociatedTypes());
4462GenericSelectionExpr::GenericSelectionExpr(
4466 bool ContainsUnexpandedParameterPack)
4467 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4469 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4470 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4471 assert(AssocTypes.size() == AssocExprs.size() &&
4472 "Must have the same number of association expressions"
4473 " and TypeSourceInfo!");
4476 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4478 std::copy(AssocExprs.begin(), AssocExprs.end(),
4479 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4480 std::copy(AssocTypes.begin(), AssocTypes.end(),
4481 getTrailingObjects<TypeSourceInfo *>() +
4482 getIndexOfStartOfAssociatedTypes());
4487GenericSelectionExpr::GenericSelectionExpr(
4492 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4494 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4495 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4496 assert(AssocTypes.size() == AssocExprs.size() &&
4497 "Must have the same number of association expressions"
4498 " and TypeSourceInfo!");
4501 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4503 std::copy(AssocExprs.begin(), AssocExprs.end(),
4504 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4505 std::copy(AssocTypes.begin(), AssocTypes.end(),
4506 getTrailingObjects<TypeSourceInfo *>() +
4507 getIndexOfStartOfAssociatedTypes());
4512GenericSelectionExpr::GenericSelectionExpr(EmptyShell
Empty,
unsigned NumAssocs)
4513 :
Expr(GenericSelectionExprClass,
Empty), NumAssocs(NumAssocs) {}
4519 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex) {
4520 unsigned NumAssocs = AssocExprs.size();
4522 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4525 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4526 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4533 bool ContainsUnexpandedParameterPack) {
4534 unsigned NumAssocs = AssocExprs.size();
4536 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4539 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4540 RParenLoc, ContainsUnexpandedParameterPack);
4548 unsigned ResultIndex) {
4549 unsigned NumAssocs = AssocExprs.size();
4551 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4554 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4555 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4562 SourceLocation RParenLoc,
bool ContainsUnexpandedParameterPack) {
4563 unsigned NumAssocs = AssocExprs.size();
4565 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4568 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4569 RParenLoc, ContainsUnexpandedParameterPack);
4574 unsigned NumAssocs) {
4576 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4599 EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
4600 NumDesignators(Designators.
size()), NumSubExprs(IndexExprs.
size() + 1) {
4601 this->Designators =
new (
C)
Designator[NumDesignators];
4609 unsigned IndexIdx = 0;
4610 for (
unsigned I = 0; I != NumDesignators; ++I) {
4611 this->Designators[I] = Designators[I];
4614 *Child++ = IndexExprs[IndexIdx++];
4617 *Child++ = IndexExprs[IndexIdx++];
4618 *Child++ = IndexExprs[IndexIdx++];
4622 assert(IndexIdx == IndexExprs.size() &&
"Wrong number of index expressions");
4631 bool UsesColonSyntax,
Expr *
Init) {
4632 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(IndexExprs.size() + 1),
4635 ColonOrEqualLoc, UsesColonSyntax,
4640 unsigned NumIndexExprs) {
4641 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(NumIndexExprs + 1),
4648 unsigned NumDesigs) {
4650 NumDesignators = NumDesigs;
4651 for (
unsigned I = 0; I != NumDesigs; ++I)
4652 Designators[I] = Desigs[I];
4666 if (
First.isFieldDesignator()) {
4669 for (
unsigned int i = 0; i < DIE->size(); i++) {
4677 return First.getLBracketLoc();
4685 assert(
D.isArrayDesignator() &&
"Requires array designator");
4690 assert(
D.isArrayRangeDesignator() &&
"Requires array range designator");
4695 assert(
D.isArrayRangeDesignator() &&
"Requires array range designator");
4704 unsigned NumNewDesignators =
Last -
First;
4705 if (NumNewDesignators == 0) {
4706 std::copy_backward(Designators + Idx + 1,
4707 Designators + NumDesignators,
4709 --NumNewDesignators;
4712 if (NumNewDesignators == 1) {
4713 Designators[Idx] = *
First;
4718 =
new (
C)
Designator[NumDesignators - 1 + NumNewDesignators];
4719 std::copy(Designators, Designators + Idx, NewDesignators);
4720 std::copy(
First,
Last, NewDesignators + Idx);
4721 std::copy(Designators + Idx + 1, Designators + NumDesignators,
4722 NewDesignators + Idx + NumNewDesignators);
4723 Designators = NewDesignators;
4724 NumDesignators = NumDesignators - 1 + NumNewDesignators;
4733 BaseAndUpdaterExprs[0] = baseExpr;
4737 BaseAndUpdaterExprs[1] = ILE;
4754 LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4757 for (
unsigned I = 0, N = Exprs.size(); I != N; ++I)
4758 getTrailingObjects<Stmt *>()[I] = Exprs[I];
4762ParenListExpr::ParenListExpr(EmptyShell
Empty,
unsigned NumExprs)
4771 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(Exprs.size()),
4773 return new (Mem)
ParenListExpr(LParenLoc, Exprs, RParenLoc);
4777 unsigned NumExprs) {
4787static std::optional<BinaryOperator *>
4790 if (
E->getOpcode() == BO_LT) {
4792 ComparedTo =
E->getRHS();
4793 }
else if (
E->getOpcode() == BO_GT) {
4795 ComparedTo =
E->getLHS();
4800 const Expr *AddLHS =
nullptr, *AddRHS =
nullptr;
4803 if (BO && BO->
getOpcode() == clang::BO_Add) {
4809 if (!AddLHS || !AddRHS)
4812 const Decl *LHSDecl, *RHSDecl, *OtherDecl;
4815 RHSDecl = AddRHS->IgnoreParenImpCasts()->getReferencedDeclOfCallee();
4821 if (!LHSDecl && !RHSDecl)
4824 if ((LHSDecl && LHSDecl == OtherDecl && LHSDecl != RHSDecl) ||
4825 (RHSDecl && RHSDecl == OtherDecl && RHSDecl != LHSDecl))
4847 Result.value()->setExcludedOverflowPattern(
true);
4854 :
Expr(BinaryOperatorClass, ResTy, VK, OK) {
4857 "Use CompoundAssignOperator for compound assignments");
4860 SubExprs[LHS] = lhs;
4861 SubExprs[RHS] = rhs;
4873 :
Expr(CompoundAssignOperatorClass, ResTy, VK, OK) {
4877 "Use CompoundAssignOperator for compound assignments");
4879 SubExprs[LHS] = lhs;
4880 SubExprs[RHS] = rhs;
4888 bool HasFPFeatures) {
4928 CompLHSType, CompResultType);
4932 bool hasFPFeatures) {
4933 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
4942 :
Expr(UnaryOperatorClass,
type, VK, OK), Val(input) {
4958 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
4966 e = ewc->getSubExpr();
4968 e = m->getSubExpr();
4969 e = cast<CXXConstructExpr>(e)->getArg(0);
4971 e = ice->getSubExpr();
4972 return cast<OpaqueValueExpr>(e);
4977 unsigned numSemanticExprs) {
4979 Context.
Allocate(totalSizeToAlloc<Expr *>(1 + numSemanticExprs),
4984PseudoObjectExpr::PseudoObjectExpr(EmptyShell shell,
unsigned numSemanticExprs)
4985 :
Expr(PseudoObjectExprClass, shell) {
4991 unsigned resultIndex) {
4992 assert(syntax &&
"no syntactic expression!");
4993 assert(
semantics.size() &&
"no semantic expressions!");
5003 VK =
semantics[resultIndex]->getValueKind();
5007 void *buffer =
C.Allocate(totalSizeToAlloc<Expr *>(
semantics.size() + 1),
5015 unsigned resultIndex)
5020 for (
unsigned i = 0, e =
semantics.size() + 1; i != e; ++i) {
5022 getSubExprsBuffer()[i] =
E;
5024 if (isa<OpaqueValueExpr>(
E))
5025 assert(cast<OpaqueValueExpr>(
E)->getSourceExpr() !=
nullptr &&
5026 "opaque-value semantic expressions for pseudo-object "
5027 "operations must have sources");
5060 NumSubExprs(args.size()), BuiltinLoc(BLoc), RParenLoc(RP), Op(op) {
5061 assert(args.size() ==
getNumSubExprs(op) &&
"wrong number of subexpressions");
5062 for (
unsigned i = 0; i != args.size(); i++)
5063 SubExprs[i] = args[i];
5069 case AO__c11_atomic_init:
5070 case AO__opencl_atomic_init:
5071 case AO__c11_atomic_load:
5072 case AO__atomic_load_n:
5075 case AO__scoped_atomic_load_n:
5076 case AO__opencl_atomic_load:
5077 case AO__hip_atomic_load:
5078 case AO__c11_atomic_store:
5079 case AO__c11_atomic_exchange:
5080 case AO__atomic_load:
5081 case AO__atomic_store:
5082 case AO__atomic_store_n:
5083 case AO__atomic_exchange_n:
5084 case AO__c11_atomic_fetch_add:
5085 case AO__c11_atomic_fetch_sub:
5086 case AO__c11_atomic_fetch_and:
5087 case AO__c11_atomic_fetch_or:
5088 case AO__c11_atomic_fetch_xor:
5089 case AO__c11_atomic_fetch_nand:
5090 case AO__c11_atomic_fetch_max:
5091 case AO__c11_atomic_fetch_min:
5092 case AO__atomic_fetch_add:
5093 case AO__atomic_fetch_sub:
5094 case AO__atomic_fetch_and:
5095 case AO__atomic_fetch_or:
5096 case AO__atomic_fetch_xor:
5097 case AO__atomic_fetch_nand:
5098 case AO__atomic_add_fetch:
5099 case AO__atomic_sub_fetch:
5100 case AO__atomic_and_fetch:
5101 case AO__atomic_or_fetch:
5102 case AO__atomic_xor_fetch:
5103 case AO__atomic_nand_fetch:
5104 case AO__atomic_min_fetch:
5105 case AO__atomic_max_fetch:
5106 case AO__atomic_fetch_min:
5107 case AO__atomic_fetch_max:
5110 case AO__scoped_atomic_load:
5111 case AO__scoped_atomic_store:
5112 case AO__scoped_atomic_store_n:
5113 case AO__scoped_atomic_fetch_add:
5114 case AO__scoped_atomic_fetch_sub:
5115 case AO__scoped_atomic_fetch_and:
5116 case AO__scoped_atomic_fetch_or:
5117 case AO__scoped_atomic_fetch_xor:
5118 case AO__scoped_atomic_fetch_nand:
5119 case AO__scoped_atomic_add_fetch:
5120 case AO__scoped_atomic_sub_fetch:
5121 case AO__scoped_atomic_and_fetch:
5122 case AO__scoped_atomic_or_fetch:
5123 case AO__scoped_atomic_xor_fetch:
5124 case AO__scoped_atomic_nand_fetch:
5125 case AO__scoped_atomic_min_fetch:
5126 case AO__scoped_atomic_max_fetch:
5127 case AO__scoped_atomic_fetch_min:
5128 case AO__scoped_atomic_fetch_max:
5129 case AO__scoped_atomic_exchange_n:
5130 case AO__hip_atomic_exchange:
5131 case AO__hip_atomic_fetch_add:
5132 case AO__hip_atomic_fetch_sub:
5133 case AO__hip_atomic_fetch_and:
5134 case AO__hip_atomic_fetch_or:
5135 case AO__hip_atomic_fetch_xor:
5136 case AO__hip_atomic_fetch_min:
5137 case AO__hip_atomic_fetch_max:
5138 case AO__opencl_atomic_store:
5139 case AO__hip_atomic_store:
5140 case AO__opencl_atomic_exchange:
5141 case AO__opencl_atomic_fetch_add:
5142 case AO__opencl_atomic_fetch_sub:
5143 case AO__opencl_atomic_fetch_and:
5144 case AO__opencl_atomic_fetch_or:
5145 case AO__opencl_atomic_fetch_xor:
5146 case AO__opencl_atomic_fetch_min:
5147 case AO__opencl_atomic_fetch_max:
5148 case AO__atomic_exchange:
5151 case AO__scoped_atomic_exchange:
5152 case AO__c11_atomic_compare_exchange_strong:
5153 case AO__c11_atomic_compare_exchange_weak:
5155 case AO__hip_atomic_compare_exchange_strong:
5156 case AO__opencl_atomic_compare_exchange_strong:
5157 case AO__opencl_atomic_compare_exchange_weak:
5158 case AO__hip_atomic_compare_exchange_weak:
5159 case AO__atomic_compare_exchange:
5160 case AO__atomic_compare_exchange_n:
5163 case AO__scoped_atomic_compare_exchange:
5164 case AO__scoped_atomic_compare_exchange_n:
5167 llvm_unreachable(
"unknown atomic op");
5173 return AT->getValueType();
5178 unsigned ArraySectionCount = 0;
5179 while (
auto *OASE = dyn_cast<ArraySectionExpr>(
Base->IgnoreParens())) {
5180 Base = OASE->getBase();
5181 ++ArraySectionCount;
5184 dyn_cast<ArraySubscriptExpr>(
Base->IgnoreParenImpCasts())) {
5185 Base = ASE->getBase();
5186 ++ArraySectionCount;
5188 Base =
Base->IgnoreParenImpCasts();
5189 auto OriginalTy =
Base->getType();
5190 if (
auto *DRE = dyn_cast<DeclRefExpr>(
Base))
5191 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
5192 OriginalTy = PVD->getOriginalType().getNonReferenceType();
5194 for (
unsigned Cnt = 0; Cnt < ArraySectionCount; ++Cnt) {
5195 if (OriginalTy->isAnyPointerType())
5196 OriginalTy = OriginalTy->getPointeeType();
5197 else if (OriginalTy->isArrayType())
5198 OriginalTy = OriginalTy->castAsArrayTypeUnsafe()->getElementType();
5207 :
Expr(RecoveryExprClass,
T.getNonReferenceType(),
5208 T->isDependentType() ?
VK_LValue : getValueKindForType(
T),
5210 BeginLoc(BeginLoc), EndLoc(EndLoc), NumExprs(SubExprs.size()) {
5211 assert(!
T.isNull());
5212 assert(!llvm::is_contained(SubExprs,
nullptr));
5214 llvm::copy(SubExprs, getTrailingObjects<Expr *>());
5222 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(SubExprs.size()),
5224 return new (Mem)
RecoveryExpr(Ctx,
T, BeginLoc, EndLoc, SubExprs);
5228 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(NumSubExprs),
5235 NumDims == Dims.size() &&
5236 "Preallocated number of dimensions is different from the provided one.");
5237 llvm::copy(Dims, getTrailingObjects<Expr *>());
5242 NumDims == BR.size() &&
5243 "Preallocated number of dimensions is different from the provided one.");
5244 llvm::copy(BR, getTrailingObjects<SourceRange>());
5247OMPArrayShapingExpr::OMPArrayShapingExpr(
QualType ExprTy,
Expr *Op,
5251 RPLoc(R), NumDims(Dims.size()) {
5253 setDimensions(Dims);
5262 assert(Dims.size() == BracketRanges.size() &&
5263 "Different number of dimensions and brackets ranges.");
5265 totalSizeToAlloc<Expr *, SourceRange>(Dims.size() + 1, Dims.size()),
5268 E->setBracketsRanges(BracketRanges);
5275 totalSizeToAlloc<Expr *, SourceRange>(NumDims + 1, NumDims),
5280void OMPIteratorExpr::setIteratorDeclaration(
unsigned I,
Decl *
D) {
5281 assert(I < NumIterators &&
5282 "Idx is greater or equal the number of iterators definitions.");
5283 getTrailingObjects<Decl *>()[I] =
D;
5287 assert(I < NumIterators &&
5288 "Idx is greater or equal the number of iterators definitions.");
5291 static_cast<int>(RangeLocOffset::AssignLoc)] =
Loc;
5294void OMPIteratorExpr::setIteratorRange(
unsigned I,
Expr *
Begin,
5298 assert(I < NumIterators &&
5299 "Idx is greater or equal the number of iterators definitions.");
5300 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5301 static_cast<int>(RangeExprOffset::Begin)] =
5303 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5304 static_cast<int>(RangeExprOffset::End)] = End;
5305 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5306 static_cast<int>(RangeExprOffset::Step)] = Step;
5309 static_cast<int>(RangeLocOffset::FirstColonLoc)] =
5313 static_cast<int>(RangeLocOffset::SecondColonLoc)] =
5318 return getTrailingObjects<Decl *>()[I];
5324 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5325 RangeExprOffset::Total) +
5326 static_cast<int>(RangeExprOffset::Begin)];
5328 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5329 RangeExprOffset::Total) +
5330 static_cast<int>(RangeExprOffset::End)];
5332 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5333 RangeExprOffset::Total) +
5334 static_cast<int>(RangeExprOffset::Step)];
5339 return getTrailingObjects<
5341 static_cast<int>(RangeLocOffset::AssignLoc)];
5345 return getTrailingObjects<
5347 static_cast<int>(RangeLocOffset::FirstColonLoc)];
5351 return getTrailingObjects<
5353 static_cast<int>(RangeLocOffset::SecondColonLoc)];
5357 getTrailingObjects<OMPIteratorHelperData>()[I] =
D;
5361 return getTrailingObjects<OMPIteratorHelperData>()[I];
5365 return getTrailingObjects<OMPIteratorHelperData>()[I];
5368OMPIteratorExpr::OMPIteratorExpr(
5373 IteratorKwLoc(IteratorKwLoc), LPLoc(L), RPLoc(R),
5374 NumIterators(
Data.size()) {
5375 for (
unsigned I = 0,
E =
Data.size(); I <
E; ++I) {
5376 const IteratorDefinition &
D =
Data[I];
5377 setIteratorDeclaration(I,
D.IteratorDecl);
5378 setAssignmentLoc(I,
D.AssignmentLoc);
5379 setIteratorRange(I,
D.Range.Begin,
D.ColonLoc,
D.Range.End,
5380 D.SecondColonLoc,
D.Range.Step);
5381 setHelper(I, Helpers[I]);
5392 assert(
Data.size() == Helpers.size() &&
5393 "Data and helpers must have the same size.");
5395 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5396 Data.size(),
Data.size() *
static_cast<int>(RangeExprOffset::Total),
5397 Data.size() *
static_cast<int>(RangeLocOffset::Total),
5404 unsigned NumIterators) {
5406 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5407 NumIterators, NumIterators *
static_cast<int>(RangeExprOffset::Total),
5408 NumIterators *
static_cast<int>(RangeLocOffset::Total), NumIterators),
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
static bool isBooleanType(QualType Ty)
static Expr * IgnoreImplicitConstructorSingleStep(Expr *E)
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
static const Expr * skipTemporaryBindingsNoOpCastsAndParens(const Expr *E)
Skip over any no-op casts and any temporary-binding expressions.
static void AssertResultStorageKind(ConstantResultStorageKind Kind)
static void computeOverflowPatternExclusion(const ASTContext &Ctx, const BinaryOperator *E)
Compute and set the OverflowPatternExclusion bit based on whether the BinaryOperator expression match...
static std::optional< BinaryOperator * > getOverflowPatternBinOp(const BinaryOperator *E)
Certain overflow-dependent code patterns can have their integer overflow sanitization disabled.
llvm::MachO::Target Target
Defines the clang::Preprocessor interface.
static QualType getUnderlyingType(const SubRegion *R)
static bool isRecordType(QualType T)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
static const TypeInfo & getInfo(unsigned id)
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
void setValue(const ASTContext &C, const llvm::APInt &Val)
llvm::APInt getValue() const
uint64_t * pVal
Used to store the >64 bits integer value.
uint64_t VAL
Used to store the <= 64 bits integer value.
void setIntValue(const ASTContext &C, const llvm::APInt &Val)
A non-discriminated union of a base, field, or array index.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
static APValue IndeterminateValue()
@ Indeterminate
This object has an indeterminate value (C++ [basic.indet]).
@ None
There is no such object (it's outside its lifetime).
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
const ConstantArrayType * getAsConstantArrayType(QualType T) const
MangleContext * createMangleContext(const TargetInfo *T=nullptr)
If T is null pointer, assume the target in ASTContext.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
Builtin::Context & BuiltinInfo
const LangOptions & getLangOpts() const
Qualifiers::GC getObjCGCAttrKind(QualType Ty) const
Return one of the GCNone, Weak or Strong Objective-C garbage collection attributes.
TypeInfo getTypeInfo(const Type *T) const
Get the size and alignment of the specified complete type in bits.
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
void * Allocate(size_t Size, unsigned Align=8) const
CanQualType UnsignedIntTy
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
StringLiteral * getPredefinedStringLiteralFromCache(StringRef Key) const
Return a string representing the human readable name for the specified function declaration or file n...
DiagnosticsEngine & getDiagnostics() const
UnnamedGlobalConstantDecl * getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const
Return a declaration for a uniquified anonymous global constant corresponding to a given APValue.
const TargetInfo & getTargetInfo() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
void resize(const ASTContext &C, unsigned N, const T &NV)
iterator insert(const ASTContext &C, iterator I, const T &Elt)
void reserve(const ASTContext &C, unsigned N)
static QualType getBaseOriginalType(const Expr *Base)
Return original type of the base expression for array section.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
QualType getValueType() const
AtomicExpr(SourceLocation BLoc, ArrayRef< Expr * > args, QualType t, AtomicOp op, SourceLocation RP)
unsigned getNumSubExprs() const
A builtin binary operation expression such as "x + y" or "x <= y".
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
StringRef getOpcodeStr() const
SourceLocation getOperatorLoc() const
bool hasStoredFPFeatures() const
bool isCompoundAssignmentOp() const
static unsigned sizeOfTrailingObjects(bool HasFPFeatures)
Return the size in bytes needed for the trailing objects.
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
static BinaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static bool isAssignmentOp(Opcode Opc)
static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc, const Expr *LHS, const Expr *RHS)
Return true if a binary operator using the specified opcode and operands would match the 'p = (i8*)nu...
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used only by Serialization.
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
Build a binary operator, assuming that appropriate storage has been allocated for the trailing object...
A binding in a decomposition declaration.
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
SourceLocation getCaretLocation() const
SourceLocation getCaretLocation() const
const Stmt * getBody() const
const FunctionProtoType * getFunctionType() const
getFunctionType - Return the underlying function type for this block.
bool isUnevaluated(unsigned ID) const
Returns true if this builtin does not perform the side-effects of its arguments.
CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++ [expr....
static CStyleCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)
SourceLocation getLParenLoc() const
Represents a call to a CUDA kernel function.
Represents a base class of a C++ class.
Represents binding an expression to a temporary.
Represents a call to a C++ constructor.
Expr * getArg(unsigned Arg)
Return the specified argument.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
Represents a C++ constructor within a class.
A default argument (C++ [dcl.fct.default]).
A use of a default initializer in a constructor or in aggregate initialization.
Represents a C++ destructor within a class.
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Represents a call to a member function that may be written either with member call syntax (e....
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
A call to an overloaded operator written using operator syntax.
SourceLocation getOperatorLoc() const
Returns the location of the operator symbol in the expression.
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
SourceRange getSourceRange() const
Represents a C++ struct/union/class.
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
A C++ static_cast expression (C++ [expr.static.cast]).
Represents the this expression in C++.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
bool hasStoredFPFeatures() const
static unsigned sizeOfTrailingObjects(unsigned NumPreArgs, unsigned NumArgs, bool HasFPFeatures)
Return the size in bytes needed for the trailing objects.
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
std::pair< const NamedDecl *, const Attr * > getUnusedResultAttr(const ASTContext &Ctx) const
Returns the WarnUnusedResultAttr that is either declared on the called function, or its return type d...
SourceLocation getBeginLoc() const LLVM_READONLY
unsigned getBuiltinCallee() const
getBuiltinCallee - If this is a call to a builtin, return the builtin ID of the callee.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
static CallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Create an empty call expression, for deserialization.
bool isCallToStdMove() const
SourceLocation getEndLoc() const LLVM_READONLY
void setPreArg(unsigned I, Stmt *PreArg)
void computeDependence()
Compute and set dependence bits.
void setStoredFPFeatures(FPOptionsOverride F)
Set FPOptionsOverride in trailing storage. Used only by Serialization.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
CallExpr(StmtClass SC, Expr *Fn, ArrayRef< Expr * > PreArgs, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs, ADLCallKind UsesADL)
Build a call expression, assuming that appropriate storage has been allocated for the trailing object...
SourceLocation getRParenLoc() const
static constexpr ADLCallKind UsesADL
static CallExpr * CreateTemporary(void *Mem, Expr *Fn, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, ADLCallKind UsesADL=NotADL)
Create a temporary call expression with no arguments in the memory pointed to by Mem.
bool isBuiltinAssumeFalse(const ASTContext &Ctx) const
Return true if this is a call to __assume() or __builtin_assume() with a non-value-dependent constant...
QualType getCallReturnType(const ASTContext &Ctx) const
getCallReturnType - Get the return type of the call expr.
bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const
Returns true if this is a call to a builtin which does not evaluate side-effects within its arguments...
unsigned getNumPreArgs() const
bool hasUnusedResultAttr(const ASTContext &Ctx) const
Returns true if this call expression should warn on unused results.
QualType withConst() const
Retrieves a version of this type with const applied.
bool isVolatileQualified() const
Represents the body of a CapturedStmt, and serves as its DeclContext.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
FPOptionsOverride * getTrailingFPFeatures()
Return a pointer to the trailing FPOptions.
NamedDecl * getConversionFunction() const
If this cast applies a user-defined conversion, retrieve the conversion function that it invokes.
Expr * getSubExprAsWritten()
Retrieve the cast subexpression as it was written in the source code, looking through any implicit ca...
CastKind getCastKind() const
bool hasStoredFPFeatures() const
static const FieldDecl * getTargetFieldForToUnionCast(QualType unionType, QualType opType)
const char * getCastKindName() const
SourceLocation getEnd() const
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
void setValue(unsigned Val)
static void print(unsigned val, CharacterLiteralKind Kind, raw_ostream &OS)
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Represents a class template specialization, which refers to a class template with a given set of temp...
bool isExplicitSpecialization() const
CompoundAssignOperator - For compound assignments (e.g.
static CompoundAssignOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
CompoundLiteralExpr - [C99 6.5.2.5].
CompoundStmt - This represents a group of statements like { stmt stmt }.
ConditionalOperator - The ?: ternary operator.
ConstEvaluatedExprVisitor - This class visits 'const Expr *'s.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
APValue getAPValueResult() const
static ConstantResultStorageKind getStorageKind(const APValue &Value)
void MoveIntoResult(APValue &Value, const ASTContext &Context)
llvm::APSInt getResultAsAPSInt() const
ConstantResultStorageKind getResultStorageKind() const
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
static ConstantExpr * CreateEmpty(const ASTContext &Context, ConstantResultStorageKind StorageKind)
A POD class for pairing a NamedDecl* with an access specifier.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
A reference to a declared variable, function, enum, etc.
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
void setDecl(ValueDecl *NewD)
static DeclRefExpr * CreateEmpty(const ASTContext &Context, bool HasQualifier, bool HasFoundDecl, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Construct an empty declaration reference expression.
SourceLocation getBeginLoc() const LLVM_READONLY
DeclarationNameInfo getNameInfo() const
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
bool hasQualifier() const
Determine whether this declaration reference was preceded by a C++ nested-name-specifier,...
NestedNameSpecifierLoc getQualifierLoc() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name,...
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
static Decl * castFromDeclContext(const DeclContext *)
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
static bool isFlexibleArrayMemberLike(ASTContext &Context, const Decl *D, QualType Ty, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution)
Whether it resembles a flexible array member.
DeclarationNameLoc - Additional source/type location info for a declaration name.
Represents the type decltype(expr) (C++11).
Represents a single C99 designator.
SourceRange getSourceRange() const LLVM_READONLY
bool isFieldDesignator() const
SourceLocation getBeginLoc() const LLVM_READONLY
struct FieldDesignatorInfo FieldInfo
A field designator, e.g., ".x".
bool isArrayRangeDesignator() const
FieldDecl * getFieldDecl() const
bool isArrayDesignator() const
SourceLocation getFieldLoc() const
const IdentifierInfo * getFieldName() const
SourceLocation getDotLoc() const
Represents a C99 designated initializer expression.
static DesignatedInitExpr * CreateEmpty(const ASTContext &C, unsigned NumIndexExprs)
Expr * getArrayRangeEnd(const Designator &D) const
Expr * getSubExpr(unsigned Idx) const
SourceRange getDesignatorsSourceRange() const
Expr * getArrayRangeStart(const Designator &D) const
void ExpandDesignator(const ASTContext &C, unsigned Idx, const Designator *First, const Designator *Last)
Replaces the designator at index Idx with the series of designators in [First, Last).
static DesignatedInitExpr * Create(const ASTContext &C, llvm::ArrayRef< Designator > Designators, ArrayRef< Expr * > IndexExprs, SourceLocation EqualOrColonLoc, bool GNUSyntax, Expr *Init)
Expr * getArrayIndex(const Designator &D) const
Designator * getDesignator(unsigned Idx)
Expr * getInit() const
Retrieve the initializer value.
unsigned size() const
Returns the number of designators in this initializer.
SourceLocation getBeginLoc() const LLVM_READONLY
void setDesignators(const ASTContext &C, const Designator *Desigs, unsigned NumDesigs)
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
DesignatedInitUpdateExpr(const ASTContext &C, SourceLocation lBraceLoc, Expr *baseExprs, SourceLocation rBraceLoc)
SourceLocation getEndLoc() const LLVM_READONLY
InitListExpr * getUpdater() const
EmbedExpr(const ASTContext &Ctx, SourceLocation Loc, EmbedDataStorage *Data, unsigned Begin, unsigned NumOfElements)
An instance of this object exists for each enum constant that is defined.
ExplicitCastExpr - An explicit cast written in the source code.
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
EnumConstantDecl * getEnumConstantDecl()
If this expression refers to an enum constant, retrieve its declaration.
bool isReadIfDiscardedInCPlusPlus11() const
Determine whether an lvalue-to-rvalue conversion should implicitly be applied to this expression if i...
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
@ SE_AllowUndefinedBehavior
Allow UB that we can give a value, but not arbitrary unmodeled side effects.
static QualType findBoundMemberType(const Expr *expr)
Given an expression of bound-member type, find the type of the member.
bool isImplicitCXXThis() const
Whether this expression is an implicit reference to 'this' in C++.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc, SourceRange &R1, SourceRange &R2, ASTContext &Ctx) const
isUnusedResultAWarning - Return true if this immediate expression should be warned about if the resul...
LValueClassification ClassifyLValue(ASTContext &Ctx) const
Reasons why an expression might not be an l-value.
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool refersToVectorElement() const
Returns whether this expression refers to a vector element.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParenLValueCasts() LLVM_READONLY
Skip past any parentheses and lvalue casts which might surround this expression until reaching a fixe...
FPOptions getFPFeaturesInEffect(const LangOptions &LO) const
Returns the set of floating point options that apply to this expression.
const CXXRecordDecl * getBestDynamicClassType() const
For an expression of class type or pointer to class type, return the most derived class decl the expr...
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreConversionOperatorSingleStep() LLVM_READONLY
Skip conversion operators.
bool containsErrors() const
Whether this expression contains subexpressions which had errors, e.g.
bool isObjCSelfExpr() const
Check if this expression is the ObjC 'self' implicit parameter.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsLValue - Evaluate an expression to see if we can fold it to an lvalue with link time known ...
bool isEvaluatable(const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects) const
isEvaluatable - Call EvaluateAsRValue to see if this expression can be constant folded without side-e...
Expr * IgnoreParenBaseCasts() LLVM_READONLY
Skip past any parentheses and derived-to-base casts until reaching a fixed point.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
NullPointerConstantValueDependence
Enumeration used to describe how isNullPointerConstant() should cope with value-dependent expressions...
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_NeverValueDependent
Specifies that the expression should never be value-dependent.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
Expr * IgnoreUnlessSpelledInSource()
Skip past any invisible AST nodes which might surround this statement, such as ExprWithCleanups or Im...
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
Expr * IgnoreCasts() LLVM_READONLY
Skip past any casts which might surround this expression until reaching a fixed point.
Decl * getReferencedDeclOfCallee()
Expr * IgnoreImplicitAsWritten() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
const Expr * getBestDynamicClassTypeExpr() const
Get the inner expression that determines the best dynamic class.
bool isIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind
Enumeration used to describe the kind of Null pointer constant returned from isNullPointerConstant().
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
@ NPCK_ZeroLiteral
Expression is a Null pointer constant built from a literal zero.
@ NPCK_CXX11_nullptr
Expression is a C++11 nullptr.
@ NPCK_GNUNull
Expression is a GNU-style __null constant.
@ NPCK_NotNull
Expression is not a Null pointer constant.
bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsBooleanCondition - Return true if this is a constant which we can fold and convert to a boo...
bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
QualType getEnumCoercedType(const ASTContext &Ctx) const
If this expression is an enumeration constant, return the enumeration type under which said constant ...
bool isBoundMemberFunction(ASTContext &Ctx) const
Returns true if this expression is a bound member function.
bool isConstantInitializer(ASTContext &Ctx, bool ForRef, const Expr **Culprit=nullptr) const
isConstantInitializer - Returns true if this expression can be emitted to IR as a constant,...
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
static bool isSameComparisonOperand(const Expr *E1, const Expr *E2)
Checks that the two Expr's will refer to the same value as a comparison operand.
bool isDefaultArgument() const
Determine whether this expression is a default function argument.
bool isFlexibleArrayMemberLike(ASTContext &Context, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution=false) const
Check whether this array fits the idiom of a flexible array member, depending on the value of -fstric...
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
bool hasNonTrivialCall(const ASTContext &Ctx) const
Determine whether this expression involves a call to any function that is not trivial.
bool refersToGlobalRegisterVar() const
Returns whether this expression refers to a global register variable.
bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const
isCXX98IntegralConstantExpr - Return true if this expression is an integral constant expression in C+...
const ValueDecl * getAsBuiltinConstantDeclRef(const ASTContext &Context) const
If this expression is an unambiguous reference to a single declaration, in the style of __builtin_fun...
bool isOBJCGCCandidate(ASTContext &Ctx) const
isOBJCGCCandidate - Return true if this expression may be used in a read/ write barrier.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
const Expr * skipRValueSubobjectAdjustments() const
bool isKnownToHaveBooleanValue(bool Semantic=true) const
isKnownToHaveBooleanValue - Return true if this is an integer expression that is known to return 0 or...
void setDependence(ExprDependence Deps)
Each concrete expr subclass is expected to compute its dependence and call this in the constructor.
const ObjCPropertyRefExpr * getObjCProperty() const
If this expression is an l-value for an Objective C property, find the underlying property reference ...
bool containsDuplicateElements() const
containsDuplicateElements - Return true if any element access is repeated.
bool isArrow() const
isArrow - Return true if the base expression is a pointer to vector, return false if the base express...
void getEncodedElementAccess(SmallVectorImpl< uint32_t > &Elts) const
getEncodedElementAccess - Encode the elements accessed into an llvm aggregate Constant of ConstantInt...
const Expr * getBase() const
unsigned getNumElements() const
getNumElements - Get the number of components being selected.
static int getAccessorIdx(char c, bool isNumericAccessor)
Represents difference between two FPOptions values.
bool requiresTrailingStorage() const
static FPOptions defaultWithoutTrailingStorage(const LangOptions &LO)
Return the default value of FPOptions that's used when trailing storage isn't required.
Represents a member of a struct/union/class.
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool isBitField() const
Determines whether this field is a bitfield.
static FixedPointLiteral * Create(const ASTContext &C, EmptyShell Empty)
Returns an empty fixed-point literal.
std::string getValueAsString(unsigned Radix) const
static FixedPointLiteral * CreateFromRawInt(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l, unsigned Scale)
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
double getValueAsApproximateDouble() const
getValueAsApproximateDouble - This returns the value as an inaccurate double.
llvm::APFloat getValue() const
FullExpr - Represents a "full-expression" node.
Represents a function declaration or definition.
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Represents a prototype with parameter type info, e.g.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
bool isExplicitSpecialization() const
TemplateArgumentList * TemplateArguments
The template arguments used to produce the function template specialization from the function templat...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
Represents a C11 generic selection.
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
static GenericSelectionExpr * CreateEmpty(const ASTContext &Context, unsigned NumAssocs)
Create an empty generic selection expression for deserialization.
GlobalDecl - represents a global declaration.
This class represents temporary values used to represent inout and out arguments in HLSL.
static HLSLOutArgExpr * CreateEmpty(const ASTContext &Ctx)
static HLSLOutArgExpr * Create(const ASTContext &C, QualType Ty, OpaqueValueExpr *Base, OpaqueValueExpr *OpV, Expr *WB, bool IsInOut)
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
static ImplicitCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
Describes an C or C++ initializer list.
bool hasArrayFiller() const
Return true if this is an array initializer and its array "filler" has been set.
InitListExpr(const ASTContext &C, SourceLocation lbraceloc, ArrayRef< Expr * > initExprs, SourceLocation rbraceloc)
bool isTransparent() const
Is this a transparent initializer list (that is, an InitListExpr that is purely syntactic,...
void resizeInits(const ASTContext &Context, unsigned NumInits)
Specify the number of initializers.
bool isStringLiteralInit() const
Is this an initializer for an array of characters, initialized by a string literal or an @encode?
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isSemanticForm() const
void setInit(unsigned Init, Expr *expr)
Expr * updateInit(const ASTContext &C, unsigned Init, Expr *expr)
Updates the initializer at index Init with the new expression expr, and returns the old expression at...
void setArrayFiller(Expr *filler)
InitListExpr * getSyntacticForm() const
const Expr * getInit(unsigned Init) const
bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const
Is this the zero initializer {0} in a language which considers it idiomatic?
SourceLocation getEndLoc() const LLVM_READONLY
bool isSyntacticForm() const
ArrayRef< Expr * > inits()
void sawArrayRangeDesignator(bool ARD=true)
Expr ** getInits()
Retrieve the set of initializers.
void reserveInits(const ASTContext &C, unsigned NumInits)
Reserve space for some number of initializers.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
LabelStmt - Represents a label, which has a substatement.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
StrictFlexArraysLevelKind
@ AddUnsignedOverflowTest
if (a + b < a)
@ AddSignedOverflowTest
if (a + b < a)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isOverflowPatternExcluded(OverflowPatternExclusionKind Kind) const
void remapPathPrefix(SmallVectorImpl< char > &Path) const
Remap path prefix according to -fmacro-prefix-path option.
Lexer - This provides a simple interface that turns a text buffer into a stream of tokens.
bool LexFromRawLexer(Token &Result)
LexFromRawLexer - Lex a token from a designated raw lexer (one with no associated preprocessor object...
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Characters, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token,...
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
static MemberExpr * CreateEmpty(const ASTContext &Context, bool HasQualifier, bool HasFoundDecl, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
void setMemberDecl(ValueDecl *D)
NestedNameSpecifierLoc getQualifierLoc() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name,...
bool hasExplicitTemplateArgs() const
Determines whether the member name was followed by an explicit template argument list.
bool hasQualifier() const
Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...
static MemberExpr * Create(const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR)
bool isImplicitAccess() const
Determine whether the base of this explicit is implicit.
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
DeclarationNameInfo getMemberNameInfo() const
Retrieve the member declaration name info.
A pointer to member type per C++ 8.3.3 - Pointers to members.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
A C++ nested-name-specifier augmented with source location information.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
bool hasQualifier() const
Evaluates true when this nested-name-specifier location is non-empty.
An explicit cast in C or a C-style cast in C++, which uses the syntax ([s1][s2]......
static OMPArrayShapingExpr * CreateEmpty(const ASTContext &Context, unsigned NumDims)
static OMPArrayShapingExpr * Create(const ASTContext &Context, QualType T, Expr *Op, SourceLocation L, SourceLocation R, ArrayRef< Expr * > Dims, ArrayRef< SourceRange > BracketRanges)
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
static OMPIteratorExpr * Create(const ASTContext &Context, QualType T, SourceLocation IteratorKwLoc, SourceLocation L, SourceLocation R, ArrayRef< IteratorDefinition > Data, ArrayRef< OMPIteratorHelperData > Helpers)
static OMPIteratorExpr * CreateEmpty(const ASTContext &Context, unsigned NumIterators)
SourceLocation getSecondColonLoc(unsigned I) const
Gets the location of the second ':' (if any) in the range for the given iteratori definition.
SourceLocation getColonLoc(unsigned I) const
Gets the location of the first ':' in the range for the given iterator definition.
IteratorRange getIteratorRange(unsigned I)
Gets the iterator range for the given iterator.
OMPIteratorHelperData & getHelper(unsigned I)
Fetches helper data for the specified iteration space.
SourceLocation getAssignLoc(unsigned I) const
Gets the location of '=' for the given iterator definition.
Decl * getIteratorDecl(unsigned I)
Gets the iterator declaration for the given iterator.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Represents an ObjC class declaration.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
ObjCMethodFamily getMethodFamily() const
bool isInstanceMessage() const
Determine whether this is an instance message to either a computed object or to super.
const ObjCMethodDecl * getMethodDecl() const
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
static OffsetOfExpr * CreateEmpty(const ASTContext &C, unsigned NumComps, unsigned NumExprs)
static OffsetOfExpr * Create(const ASTContext &C, QualType type, SourceLocation OperatorLoc, TypeSourceInfo *tsi, ArrayRef< OffsetOfNode > comps, ArrayRef< Expr * > exprs, SourceLocation RParenLoc)
void setIndexExpr(unsigned Idx, Expr *E)
void setComponent(unsigned Idx, OffsetOfNode ON)
FieldDecl * getField() const
For a field offsetof node, returns the field.
IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
@ Identifier
A field in a dependent type, known only by its name.
Kind getKind() const
Determine what kind of offsetof node this is.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
static const OpaqueValueExpr * findInCopyConstruct(const Expr *expr)
Given an expression which invokes a copy constructor — i.e.
This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...
static OpenACCAsteriskSizeExpr * Create(const ASTContext &C, SourceLocation Loc)
static OpenACCAsteriskSizeExpr * CreateEmpty(const ASTContext &C)
ParenExpr - This represents a parenthesized expression, e.g.
static ParenListExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumExprs)
Create an empty paren list.
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
[C99 6.4.2.2] - A predefined identifier such as func.
static PredefinedExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType FNTy, PredefinedIdentKind IK, bool IsTransparent, StringLiteral *SL)
Create a PredefinedExpr.
StringRef getIdentKindName() const
static PredefinedExpr * CreateEmpty(const ASTContext &Ctx, bool HasFunctionName)
Create an empty PredefinedExpr.
static std::string ComputeName(PredefinedIdentKind IK, const Decl *CurrentDecl, bool ForceElaboratedPrinting=false)
static void processPathToFileName(SmallVectorImpl< char > &FileName, const PresumedLoc &PLoc, const LangOptions &LangOpts, const TargetInfo &TI)
static void processPathForFileMacro(SmallVectorImpl< char > &Path, const LangOptions &LangOpts, const TargetInfo &TI)
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
Callbacks to use to customize the behavior of the pretty-printer.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
semantics_iterator semantics_end()
semantics_iterator semantics_begin()
const Expr *const * const_semantics_iterator
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
ArrayRef< Expr * > semantics()
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
QualType getCanonicalType() const
The collection of all-type qualifiers we support.
void removeAddressSpace()
Represents a struct/union/class.
field_iterator field_end() const
field_range fields() const
field_iterator field_begin() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Frontend produces RecoveryExprs on semantic errors that prevent creating other well-formed expression...
static RecoveryExpr * Create(ASTContext &Ctx, QualType T, SourceLocation BeginLoc, SourceLocation EndLoc, ArrayRef< Expr * > SubExprs)
static RecoveryExpr * CreateEmpty(ASTContext &Ctx, unsigned NumSubExprs)
TypeSourceInfo * getTypeSourceInfo()
static SYCLUniqueStableNameExpr * Create(const ASTContext &Ctx, SourceLocation OpLoc, SourceLocation LParen, SourceLocation RParen, TypeSourceInfo *TSI)
std::string ComputeName(ASTContext &Context) const
static SYCLUniqueStableNameExpr * CreateEmpty(const ASTContext &Ctx)
void setExprs(const ASTContext &C, ArrayRef< Expr * > Exprs)
ShuffleVectorExpr(const ASTContext &C, ArrayRef< Expr * > args, QualType Type, SourceLocation BLoc, SourceLocation RP)
APValue EvaluateInContext(const ASTContext &Ctx, const Expr *DefaultExpr) const
Return the result of evaluating this SourceLocExpr in the specified (and possibly null) default argum...
SourceLocExpr(const ASTContext &Ctx, SourceLocIdentKind Type, QualType ResultTy, SourceLocation BLoc, SourceLocation RParenLoc, DeclContext *Context)
SourceLocation getLocation() const
const DeclContext * getParentContext() const
If the SourceLocExpr has been resolved return the subexpression representing the resolved value.
StringRef getBuiltinStr() const
Return a string representing the name of the specific builtin function.
static bool MayBeDependent(SourceLocIdentKind Kind)
SourceLocIdentKind getIdentKind() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
CharSourceRange getExpansionRange(SourceLocation Loc) const
Given a SourceLocation object, return the range of tokens covered by the expansion in the ultimate fi...
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
UnaryExprOrTypeTraitExprBitfields UnaryExprOrTypeTraitExprBits
GenericSelectionExprBitfields GenericSelectionExprBits
ParenListExprBitfields ParenListExprBits
CallExprBitfields CallExprBits
FloatingLiteralBitfields FloatingLiteralBits
child_iterator child_begin()
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
UnaryOperatorBitfields UnaryOperatorBits
SourceLocExprBitfields SourceLocExprBits
ConstantExprBitfields ConstantExprBits
llvm::iterator_range< child_iterator > child_range
StringLiteralBitfields StringLiteralBits
MemberExprBitfields MemberExprBits
DeclRefExprBitfields DeclRefExprBits
ConstStmtIterator const_child_iterator
PredefinedExprBitfields PredefinedExprBits
SourceLocation getBeginLoc() const LLVM_READONLY
BinaryOperatorBitfields BinaryOperatorBits
PseudoObjectExprBitfields PseudoObjectExprBits
llvm::iterator_range< const_child_iterator > const_child_range
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
unsigned getOffsetOfStringByte(const Token &TheTok, unsigned ByteNo) const
getOffsetOfStringByte - This function returns the offset of the specified byte of the string data rep...
unsigned GetStringLength() const
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
unsigned getLength() const
StringLiteralKind getKind() const
SourceLocation getLocationOfByte(unsigned ByteNo, const SourceManager &SM, const LangOptions &Features, const TargetInfo &Target, unsigned *StartToken=nullptr, unsigned *StartTokenByteOffset=nullptr) const
getLocationOfByte - Return a source location that points to the specified byte of this string literal...
uint32_t getCodeUnit(size_t i) const
void outputString(raw_ostream &OS) const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, const SourceLocation *Loc, unsigned NumConcatenated)
This is the "fully general" constructor that allows representation of strings formed from multiple co...
static StringLiteral * CreateEmpty(const ASTContext &Ctx, unsigned NumConcatenated, unsigned Length, unsigned CharByteWidth)
Construct an empty string literal.
unsigned getNumConcatenated() const
getNumConcatenated - Get the number of string literal tokens that were concatenated in translation ph...
Represents the declaration of a struct/union/class/enum.
Exposes information about the current target.
A convenient class for passing around template argument information.
A template argument list.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
Location wrapper for a TemplateArgument.
void print(const PrintingPolicy &Policy, raw_ostream &Out, bool IncludeType) const
Print this template argument to the given output stream.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
Token - This structure provides full information about a lexed token.
A container of type source information.
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isBooleanType() const
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isSpecificPlaceholderType(unsigned K) const
Test for a specific placeholder type.
bool isReferenceType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isVectorType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
QualType getArgumentType() const
bool isArgumentType() const
UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo, QualType resultType, SourceLocation op, SourceLocation rp)
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
SourceLocation getOperatorLoc() const
getOperatorLoc - Return the location of the operator.
Expr * getSubExpr() const
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given unary opcode.
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix)
Retrieve the unary opcode that corresponds to the given overloaded operator.
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used by Serialization & ASTImporter.
UnaryOperator(const ASTContext &Ctx, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
static UnaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
ConstantResultStorageKind
Describes the kind of result that can be tail-allocated.
@ Ctor_Base
Base object ctor.
LLVM_READONLY bool isPrintable(unsigned char c)
Return true if this character is an ASCII printable character; that is, a character that should take ...
Expr * IgnoreExprNodes(Expr *E, FnTys &&... Fns)
Given an expression E and functions Fn_1,...,Fn_n : Expr * -> Expr *, Recursively apply each of the f...
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
StmtIterator cast_away_const(const ConstStmtIterator &RHS)
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
ExprDependence computeDependence(FullExpr *E)
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
Expr * IgnoreImplicitCastsExtraSingleStep(Expr *E)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
Expr * IgnoreImplicitCastsSingleStep(Expr *E)
@ Dtor_Base
Base object dtor.
CastKind
CastKind - The kind of operation required for a conversion.
void FixedPointValueToString(SmallVectorImpl< char > &Str, llvm::APSInt Val, unsigned Scale)
Expr * IgnoreImplicitSingleStep(Expr *E)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Expr * IgnoreParensSingleStep(Expr *E)
const FunctionProtoType * T
Expr * IgnoreImplicitAsWrittenSingleStep(Expr *E)
Expr * IgnoreCastsSingleStep(Expr *E)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Expr * IgnoreLValueCastsSingleStep(Expr *E)
Expr * IgnoreParensOnlySingleStep(Expr *E)
@ PrettyFunctionNoVirtual
The same as PrettyFunction, except that the 'virtual' keyword is omitted for virtual member functions...
Expr * IgnoreBaseCastsSingleStep(Expr *E)
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceLocation getEndLoc() const LLVM_READONLY
Stores data related to a single #embed directive.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
Iterator range representation begin:end[:step].
Helper expressions and declaration for OMPIteratorExpr class for each iteration space.
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressTagKeyword
Whether type printing should skip printing the tag keyword.
const PrintingCallbacks * Callbacks
Callbacks to use to allow the behavior of printing to be customized.
A placeholder type used to construct an empty shell of a type, that will be filled in later (e....
An adjustment to be made to the temporary created when emitting a reference binding,...