37#include "llvm/Support/ErrorHandling.h"
38#include "llvm/Support/Format.h"
39#include "llvm/Support/raw_ostream.h"
51 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
52 if (BO->getOpcode() == BO_Comma) {
59 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
60 E = MTE->getSubExpr();
77 DerivedType = ATy->getElementType();
92 if (
const auto *CE = dyn_cast<CastExpr>(E)) {
93 if ((CE->getCastKind() == CK_DerivedToBase ||
94 CE->getCastKind() == CK_UncheckedDerivedToBase) &&
102 if (CE->getCastKind() == CK_NoOp) {
103 E = CE->getSubExpr();
106 }
else if (
const auto *ME = dyn_cast<MemberExpr>(E)) {
107 if (!ME->isArrow()) {
108 assert(ME->getBase()->getType()->getAsRecordDecl());
109 if (
const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
110 if (!Field->isBitField() && !Field->getType()->isReferenceType()) {
117 }
else if (
const auto *BO = dyn_cast<BinaryOperator>(E)) {
118 if (BO->getOpcode() == BO_PtrMemD) {
119 assert(BO->getRHS()->isPRValue());
125 if (BO->getOpcode() == BO_Comma) {
126 CommaLHSs.push_back(BO->getLHS());
148 BIT && BIT->
isUnsigned() && BIT->getNumBits() == 1)
152 switch (UO->getOpcode()) {
154 return UO->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
166 return CE->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
169 switch (BO->getOpcode()) {
170 default:
return false;
185 return BO->getLHS()->isKnownToHaveBooleanValue(Semantic) &&
186 BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
190 return BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
195 return CO->getTrueExpr()->isKnownToHaveBooleanValue(Semantic) &&
196 CO->getFalseExpr()->isKnownToHaveBooleanValue(Semantic);
201 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(E))
202 return OVE->getSourceExpr()->isKnownToHaveBooleanValue(Semantic);
205 if (!Semantic && FD->getType()->isUnsignedIntegerType() &&
206 !FD->getBitWidth()->isValueDependent() && FD->getBitWidthValue() == 1)
215 bool IgnoreTemplateOrMacroSubstitution)
const {
217 const Decl *D =
nullptr;
219 if (
const auto *ME = dyn_cast<MemberExpr>(E))
220 D = ME->getMemberDecl();
221 else if (
const auto *DRE = dyn_cast<DeclRefExpr>(E))
223 else if (
const auto *IRE = dyn_cast<ObjCIvarRefExpr>(E))
227 StrictFlexArraysLevel,
228 IgnoreTemplateOrMacroSubstitution);
238 if (
Value.isMemberPointer())
239 return Value.getMemberPointerDecl();
241 if (
Value.isLValue() &&
Value.getLValueOffset().isZero())
255 template <
class E,
class T>
258 return static_cast<const E*
>(
expr)->getExprLoc();
268 return static_cast<const E *
>(
expr)->getBeginLoc();
277 if (ED->isCompleteDefinition())
286#define ABSTRACT_STMT(type)
287#define STMT(type, base) \
288 case Stmt::type##Class: break;
289#define EXPR(type, base) \
290 case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
291#include "clang/AST/StmtNodes.inc"
293 llvm_unreachable(
"unknown expression kind");
304 "Invalid StorageKind Value");
314 if (!
Value.getInt().needsCleanup())
324 if (
T->isIntegralOrEnumerationType() && Context.getTypeInfo(
T).Width <= 64)
330 bool IsImmediateInvocation)
331 :
FullExpr(ConstantExprClass, SubExpr) {
340 ::new (getTrailingObjects<APValue>())
APValue();
345 bool IsImmediateInvocation) {
349 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
352 void *Mem = Context.Allocate(Size,
alignof(ConstantExpr));
353 return new (Mem) ConstantExpr(E, StorageKind, IsImmediateInvocation);
359 ConstantExpr *
Self =
Create(Context, E, StorageKind);
364ConstantExpr::ConstantExpr(EmptyShell
Empty,
370 ::new (getTrailingObjects<APValue>())
APValue();
377 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
380 void *Mem = Context.Allocate(Size,
alignof(ConstantExpr));
381 return new (Mem) ConstantExpr(
EmptyShell(), StorageKind);
386 "Invalid storage for this value kind");
392 Int64Result() = *
Value.getInt().getRawData();
399 Context.addDestruction(&APValueResult());
401 APValueResult() = std::move(
Value);
404 llvm_unreachable(
"Invalid ResultKind Bits");
410 return APValueResult().getInt();
415 llvm_unreachable(
"invalid Accessor");
423 return APValueResult();
433 llvm_unreachable(
"invalid ResultKind");
437 bool RefersToEnclosingVariableOrCapture,
QualType T,
447 RefersToEnclosingVariableOrCapture;
448 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
455DeclRefExpr::DeclRefExpr(
const ASTContext &Ctx,
458 bool RefersToEnclosingVariableOrCapture,
467 new (getTrailingObjects<NestedNameSpecifierLoc>())
471 *getTrailingObjects<NamedDecl *>() = FoundD;
473 = (TemplateArgs || TemplateKWLoc.
isValid()) ? 1 : 0;
475 RefersToEnclosingVariableOrCapture;
476 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
479 auto Deps = TemplateArgumentDependence::None;
480 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
481 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
483 assert(!(Deps & TemplateArgumentDependence::Dependent) &&
484 "built a DeclRefExpr with dependent template args");
485 }
else if (TemplateKWLoc.
isValid()) {
486 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
497 bool RefersToEnclosingVariableOrCapture,
502 return Create(Context, QualifierLoc, TemplateKWLoc, D,
503 RefersToEnclosingVariableOrCapture,
505 T,
VK, FoundD, TemplateArgs, NOUR);
511 bool RefersToEnclosingVariableOrCapture,
521 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
525 QualifierLoc ? 1 : 0, FoundD ? 1 : 0,
526 HasTemplateKWAndArgsInfo ? 1 : 0,
527 TemplateArgs ? TemplateArgs->
size() : 0);
529 void *Mem = Context.Allocate(Size,
alignof(DeclRefExpr));
530 return new (Mem) DeclRefExpr(Context, QualifierLoc, TemplateKWLoc, D,
531 RefersToEnclosingVariableOrCapture, NameInfo,
532 FoundD, TemplateArgs,
T,
VK, NOUR);
538 bool HasTemplateKWAndArgsInfo,
539 unsigned NumTemplateArgs) {
540 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
544 HasQualifier ? 1 : 0, HasFoundDecl ? 1 : 0, HasTemplateKWAndArgsInfo,
546 void *Mem = Context.Allocate(Size,
alignof(DeclRefExpr));
552 if (
getType()->isUndeducedType())
563SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(
SourceLocation OpLoc,
569 OpLoc(OpLoc), LParen(LParen), RParen(RParen) {
570 setTypeSourceInfo(TSI);
574SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(EmptyShell
Empty,
584 SYCLUniqueStableNameExpr(OpLoc, LParen, RParen, ResultTy, TSI);
590 return new (Ctx) SYCLUniqueStableNameExpr(
EmptyShell(), ResultTy);
602 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
603 return RD->getDeviceLambdaManglingNumber();
608 Context, Context.getDiagnostics(), MangleCallback)};
612 llvm::raw_string_ostream Out(Buffer);
613 Ctx->mangleCanonicalTypeName(Ty, Out);
623 assert((getIdentKind() == IK) &&
624 "IdentKind do not fit in PredefinedExprBitfields!");
625 bool HasFunctionName = SL !=
nullptr;
634PredefinedExpr::PredefinedExpr(EmptyShell
Empty,
bool HasFunctionName)
642 bool HasFunctionName = SL !=
nullptr;
643 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
644 alignof(PredefinedExpr));
645 return new (Mem) PredefinedExpr(L, FNTy, IK, IsTransparent, SL);
649 bool HasFunctionName) {
650 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
651 alignof(PredefinedExpr));
652 return new (Mem) PredefinedExpr(
EmptyShell(), HasFunctionName);
660 return "__FUNCTION__";
662 return "__FUNCDNAME__";
664 return "L__FUNCTION__";
666 return "__PRETTY_FUNCTION__";
668 return "__FUNCSIG__";
670 return "L__FUNCSIG__";
674 llvm_unreachable(
"Unknown ident kind for PredefinedExpr");
680 const Decl *CurrentDecl,
681 bool ForceElaboratedPrinting) {
685 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(CurrentDecl)) {
686 std::unique_ptr<MangleContext> MC;
687 MC.reset(Context.createMangleContext());
689 if (MC->shouldMangleDeclName(ND)) {
691 llvm::raw_svector_ostream Out(Buffer);
697 else if (
auto FD = dyn_cast<FunctionDecl>(ND)) {
701 MC->mangleName(GD, Out);
703 if (!Buffer.empty() && Buffer.front() ==
'\01')
704 return std::string(Buffer.substr(1));
705 return std::string(Buffer);
707 return std::string(ND->getIdentifier()->getName());
716 if (DC->isFileContext())
720 llvm::raw_svector_ostream Out(Buffer);
721 if (
auto *DCBlock = dyn_cast<BlockDecl>(DC))
724 else if (
auto *DCDecl = dyn_cast<Decl>(DC))
726 return std::string(Out.str());
728 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
729 const auto &LO = Context.getLangOpts();
730 bool IsFuncOrFunctionInNonMSVCCompatEnv =
732 IK == PredefinedIdentKind ::Function) &&
734 bool IsLFunctionInMSVCCommpatEnv =
736 bool IsFuncOrFunctionOrLFunctionOrFuncDName =
741 if ((ForceElaboratedPrinting &&
742 (IsFuncOrFunctionInNonMSVCCompatEnv || IsLFunctionInMSVCCommpatEnv)) ||
743 (!ForceElaboratedPrinting && IsFuncOrFunctionOrLFunctionOrFuncDName))
744 return FD->getNameAsString();
747 llvm::raw_svector_ostream Out(Name);
752 if (MD->isStatic() && !ForceElaboratedPrinting)
759 std::string remapPath(StringRef Path)
const override {
762 return std::string(p);
769 PrettyCallbacks PrettyCB(Context.getLangOpts());
774 llvm::raw_string_ostream POut(Proto);
783 const Type *Ty =
Decl->getType().getTypePtrOrNull();
789 if (FD->hasWrittenPrototype())
790 FT = dyn_cast<FunctionProtoType>(AFT);
795 case CC_C: POut <<
"__cdecl ";
break;
806 FD->printQualifiedName(POut, Policy);
810 return std::string(Name);
815 for (
unsigned i = 0, e =
Decl->getNumParams(); i != e; ++i) {
817 POut <<
Decl->getParamDecl(i)->getType().stream(Policy);
820 if (FT->isVariadic()) {
821 if (FD->getNumParams()) POut <<
", ";
825 !Context.getLangOpts().CPlusPlus) &&
826 !
Decl->getNumParams()) {
833 assert(FT &&
"We must have a written prototype in this case.");
836 if (FT->isVolatile())
848 while (isa_and_nonnull<NamedDecl>(Ctx)) {
850 = dyn_cast<ClassTemplateSpecializationDecl>(Ctx);
852 Specs.push_back(Spec);
856 std::string TemplateParams;
857 llvm::raw_string_ostream TOut(TemplateParams);
860 D->getSpecializedTemplate()->getTemplateParameters();
862 assert(Params->
size() == Args.
size());
863 for (
unsigned i = 0, numParams = Params->
size(); i != numParams; ++i) {
865 if (Param.empty())
continue;
866 TOut << Param <<
" = ";
875 = FD->getTemplateSpecializationInfo();
880 assert(Params->
size() == Args->
size());
881 for (
unsigned i = 0, e = Params->
size(); i != e; ++i) {
883 if (Param.empty())
continue;
884 TOut << Param <<
" = ";
885 Args->
get(i).
print(Policy, TOut,
true);
890 if (!TemplateParams.empty()) {
892 TemplateParams.resize(TemplateParams.size() - 2);
893 POut <<
" [" << TemplateParams <<
"]";
901 Proto =
"auto " + Proto;
902 else if (FT && FT->getReturnType()->getAs<DecltypeType>())
904 ->getAs<DecltypeType>()
912 return std::string(Name);
914 if (
const CapturedDecl *CD = dyn_cast<CapturedDecl>(CurrentDecl)) {
918 if (DC->isFunctionOrMethod() && (DC->getDeclKind() != Decl::Captured)) {
922 llvm_unreachable(
"CapturedDecl not inside a function or method");
924 if (
const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
926 llvm::raw_svector_ostream Out(Name);
927 Out << (MD->isInstanceMethod() ?
'-' :
'+');
936 dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
937 Out <<
'(' << *CID <<
')';
940 MD->getSelector().print(Out);
943 return std::string(Name);
954 const llvm::APInt &Val) {
959 unsigned NumWords = Val.getNumWords();
960 const uint64_t* Words = Val.getRawData();
962 pVal =
new (
C) uint64_t[NumWords];
963 std::copy(Words, Words + NumWords,
pVal);
964 }
else if (NumWords == 1)
970IntegerLiteral::IntegerLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
973 assert(
type->isIntegerType() &&
"Illegal type in IntegerLiteral");
974 assert(
V.getBitWidth() ==
C.getIntWidth(
type) &&
975 "Integer type is not the correct size for constant.");
983 return new (
C) IntegerLiteral(
C,
V,
type, l);
988 return new (
C) IntegerLiteral(
Empty);
991FixedPointLiteral::FixedPointLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
996 assert(
type->isFixedPointType() &&
"Illegal type in FixedPointLiteral");
997 assert(
V.getBitWidth() ==
C.getTypeInfo(
type).Width &&
998 "Fixed point type is not the correct size for constant.");
1004 const llvm::APInt &
V,
1008 return new (
C) FixedPointLiteral(
C,
V,
type, l, Scale);
1013 return new (
C) FixedPointLiteral(
Empty);
1022 S, llvm::APSInt::getUnsigned(
getValue().getZExtValue()), Scale);
1023 return std::string(S);
1046 if (!Escaped.empty()) {
1047 OS <<
"'" << Escaped <<
"'";
1056 OS <<
"'" << (char)Val <<
"'";
1058 OS <<
"'\\x" << llvm::format(
"%02x", Val) <<
"'";
1059 else if (Val <= 0xFFFF)
1060 OS <<
"'\\u" << llvm::format(
"%04x", Val) <<
"'";
1062 OS <<
"'\\U" << llvm::format(
"%08x", Val) <<
"'";
1066FloatingLiteral::FloatingLiteral(
const ASTContext &
C,
const llvm::APFloat &
V,
1069 setSemantics(
V.getSemantics());
1077 setRawSemantics(llvm::APFloatBase::S_IEEEhalf);
1084 return new (
C) FloatingLiteral(
C,
V, isexact,
Type, L);
1089 return new (
C) FloatingLiteral(
C,
Empty);
1098 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
1100 return V.convertToDouble();
1105 unsigned CharByteWidth = 0;
1110 CharByteWidth =
Target.getCharWidth();
1113 CharByteWidth =
Target.getWCharWidth();
1116 CharByteWidth =
Target.getChar16Width();
1119 CharByteWidth =
Target.getChar32Width();
1122 return sizeof(char);
1124 assert((CharByteWidth & 7) == 0 &&
"Assumes character size is byte multiple");
1126 assert((CharByteWidth == 1 || CharByteWidth == 2 || CharByteWidth == 4) &&
1127 "The only supported character byte widths are 1,2 and 4!");
1128 return CharByteWidth;
1131StringLiteral::StringLiteral(
const ASTContext &Ctx, StringRef Str,
1136 unsigned Length = Str.size();
1143 "StringLiteral must be of constant array type!");
1144 unsigned CharByteWidth = mapCharByteWidth(Ctx.
getTargetInfo(), Kind);
1145 unsigned ByteLength = Str.size();
1146 assert((ByteLength % CharByteWidth == 0) &&
1147 "The size of the data must be a multiple of CharByteWidth!");
1152 switch (CharByteWidth) {
1154 Length = ByteLength;
1157 Length = ByteLength / 2;
1160 Length = ByteLength / 4;
1163 llvm_unreachable(
"Unsupported character width!");
1169 assert(!Pascal &&
"Can't make an unevaluated Pascal string");
1174 *getTrailingObjects<unsigned>() = Length;
1178 llvm::copy(Locs, getTrailingObjects<SourceLocation>());
1181 llvm::copy(Str, getTrailingObjects<char>());
1186StringLiteral::StringLiteral(EmptyShell
Empty,
unsigned NumConcatenated,
1187 unsigned Length,
unsigned CharByteWidth)
1191 *getTrailingObjects<unsigned>() = Length;
1198 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1199 1, Locs.size(), Str.size()),
1200 alignof(StringLiteral));
1201 return new (Mem) StringLiteral(Ctx, Str, Kind, Pascal, Ty, Locs);
1205 unsigned NumConcatenated,
1207 unsigned CharByteWidth) {
1208 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1209 1, NumConcatenated, Length * CharByteWidth),
1210 alignof(StringLiteral));
1212 StringLiteral(
EmptyShell(), NumConcatenated, Length, CharByteWidth);
1235 static const char Hex[] =
"0123456789ABCDEF";
1238 for (
unsigned I = 0, N =
getLength(); I != N; ++I) {
1241 if (Escaped.empty()) {
1247 Char >= 0xd800 && Char <= 0xdbff) {
1249 if (Trail >= 0xdc00 && Trail <= 0xdfff) {
1250 Char = 0x10000 + ((Char - 0xd800) << 10) + (Trail - 0xdc00);
1260 (Char >= 0xd800 && Char <= 0xdfff) || Char >= 0x110000) {
1264 while ((Char >> Shift) == 0)
1266 for (; Shift >= 0; Shift -= 4)
1267 OS << Hex[(Char >> Shift) & 15];
1274 << Hex[(Char >> 20) & 15]
1275 << Hex[(Char >> 16) & 15];
1278 OS << Hex[(Char >> 12) & 15]
1279 << Hex[(Char >> 8) & 15]
1280 << Hex[(Char >> 4) & 15]
1281 << Hex[(Char >> 0) & 15];
1287 if (LastSlashX + 1 == I) {
1289 case '0':
case '1':
case '2':
case '3':
case '4':
1290 case '5':
case '6':
case '7':
case '8':
case '9':
1291 case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
1292 case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
1297 assert(Char <= 0xff &&
1298 "Characters above 0xff should already have been handled.");
1304 << (char)(
'0' + ((Char >> 6) & 7))
1305 << (char)(
'0' + ((Char >> 3) & 7))
1306 << (char)(
'0' + ((Char >> 0) & 7));
1335 unsigned *StartTokenByteOffset)
const {
1344 "Only narrow string literals are currently supported");
1349 unsigned StringOffset = 0;
1351 TokNo = *StartToken;
1352 if (StartTokenByteOffset) {
1353 StringOffset = *StartTokenByteOffset;
1354 ByteNo -= StringOffset;
1370 if (StartTokenByteOffset !=
nullptr)
1371 *StartTokenByteOffset = StringOffset;
1372 if (StartToken !=
nullptr)
1373 *StartToken = TokNo;
1374 return StrTokSpellingLoc;
1377 const char *StrData = Buffer.data()+LocInfo.second;
1381 Buffer.begin(), StrData, Buffer.end());
1390 if (ByteNo < TokNumBytes ||
1396 if (StartTokenByteOffset !=
nullptr)
1397 *StartTokenByteOffset = StringOffset;
1398 if (StartToken !=
nullptr)
1399 *StartToken = TokNo;
1404 StringOffset += TokNumBytes;
1406 ByteNo -= TokNumBytes;
1414#define UNARY_OPERATION(Name, Spelling) case UO_##Name: return Spelling;
1415#include "clang/AST/OperationKinds.def"
1417 llvm_unreachable(
"Unknown unary operator");
1423 default: llvm_unreachable(
"No unary operator for overloaded function");
1424 case OO_PlusPlus:
return Postfix ? UO_PostInc : UO_PreInc;
1425 case OO_MinusMinus:
return Postfix ? UO_PostDec : UO_PreDec;
1426 case OO_Amp:
return UO_AddrOf;
1427 case OO_Star:
return UO_Deref;
1428 case OO_Plus:
return UO_Plus;
1429 case OO_Minus:
return UO_Minus;
1430 case OO_Tilde:
return UO_Not;
1431 case OO_Exclaim:
return UO_LNot;
1432 case OO_Coawait:
return UO_Coawait;
1438 case UO_PostInc:
case UO_PreInc:
return OO_PlusPlus;
1439 case UO_PostDec:
case UO_PreDec:
return OO_MinusMinus;
1440 case UO_AddrOf:
return OO_Amp;
1441 case UO_Deref:
return OO_Star;
1442 case UO_Plus:
return OO_Plus;
1443 case UO_Minus:
return OO_Minus;
1444 case UO_Not:
return OO_Tilde;
1445 case UO_LNot:
return OO_Exclaim;
1446 case UO_Coawait:
return OO_Coawait;
1458 case Expr::CallExprClass:
1460 case Expr::CXXOperatorCallExprClass:
1462 case Expr::CXXMemberCallExprClass:
1464 case Expr::UserDefinedLiteralClass:
1466 case Expr::CUDAKernelCallExprClass:
1469 llvm_unreachable(
"unexpected class deriving from CallExpr!");
1477 "we assume CXXOperatorCallExpr is at most 32 bytes");
1484 NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1485 unsigned NumPreArgs = PreArgs.size();
1487 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1489 "This CallExpr subclass is too big or unsupported");
1494 for (
unsigned I = 0; I != NumPreArgs; ++I)
1496 for (
unsigned I = 0; I != Args.size(); ++I)
1498 for (
unsigned I = Args.size(); I != NumArgs; ++I)
1505 CallExprBits.ExplicitObjectMemFunUsingMemberSyntax =
false;
1516 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1519 CallExprBits.ExplicitObjectMemFunUsingMemberSyntax =
false;
1528 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1535 new (Mem)
CallExpr(CallExprClass, Fn, {}, Args, Ty,
VK,
1536 RParenLoc, FPFeatures, MinNumArgs,
UsesADL);
1537 E->updateTrailingSourceLoc();
1543 unsigned SizeOfTrailingObjects =
1559 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1560 return DRE->getDecl();
1562 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1563 return ME->getMemberDecl();
1567 while (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(CEE))
1572 if (
auto *BO = dyn_cast<BinaryOperator>(CEE)) {
1573 if (BO->isPtrMemOp()) {
1577 }
else if (
auto *UO = dyn_cast<UnaryOperator>(CEE)) {
1578 if (UO->getOpcode() == UO_Deref || UO->getOpcode() == UO_AddrOf ||
1579 UO->getOpcode() == UO_Plus) {
1587 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1588 return DRE->getDecl();
1589 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1590 return ME->getMemberDecl();
1591 if (
auto *BE = dyn_cast<BlockExpr>(CEE))
1592 return BE->getBlockDecl();
1600 return FDecl ? FDecl->getBuiltinID() : 0;
1611 QualType CalleeType = Callee->getType();
1625 assert(!CalleeType.
isNull());
1641std::pair<const NamedDecl *, const WarnUnusedResultAttr *>
1644 if (Callee !=
nullptr)
1645 if (
const auto *A = Callee->getAttr<WarnUnusedResultAttr>())
1646 return {
nullptr, A};
1651 if (
const auto *A = TD->getAttr<WarnUnusedResultAttr>())
1656 if (
const auto *A = TD->getDecl()->getAttr<WarnUnusedResultAttr>())
1657 return {TD->getDecl(), A};
1658 return {
nullptr,
nullptr};
1667 void *Mem =
C.Allocate(
1668 totalSizeToAlloc<OffsetOfNode, Expr *>(comps.size(), exprs.size()));
1670 return new (Mem) OffsetOfExpr(
C,
type, OperatorLoc, tsi, comps, exprs,
1675 unsigned numComps,
unsigned numExprs) {
1677 C.Allocate(totalSizeToAlloc<OffsetOfNode, Expr *>(numComps, numExprs));
1678 return new (Mem) OffsetOfExpr(numComps, numExprs);
1686 OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
1687 NumComps(comps.size()), NumExprs(exprs.size()) {
1688 for (
unsigned i = 0; i != comps.size(); ++i)
1690 for (
unsigned i = 0; i != exprs.size(); ++i)
1705 UnaryExprOrTypeTrait ExprKind,
Expr *E,
QualType resultType,
1708 OpLoc(op), RParenLoc(rp) {
1709 assert(ExprKind <= UETT_Last &&
"invalid enum value!");
1712 "UnaryExprOrTypeTraitExprBits.Kind overflow!");
1726 :
Expr(MemberExprClass,
T,
VK, OK),
Base(
Base), MemberDecl(MemberDecl),
1727 MemberDNLoc(NameInfo.
getInfo()), MemberLoc(NameInfo.getLoc()) {
1733 FoundDecl.
getDecl() != MemberDecl ||
1736 TemplateArgs || TemplateKWLoc.
isValid();
1742 new (getTrailingObjects<NestedNameSpecifierLoc>())
1745 *getTrailingObjects<DeclAccessPair>() = FoundDecl;
1747 auto Deps = TemplateArgumentDependence::None;
1748 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1749 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1751 }
else if (TemplateKWLoc.
isValid()) {
1752 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1765 bool HasFoundDecl = FoundDecl.
getDecl() != MemberDecl ||
1766 FoundDecl.
getAccess() != MemberDecl->getAccess();
1767 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
1771 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1772 TemplateArgs ? TemplateArgs->
size() : 0);
1774 void *Mem =
C.Allocate(Size,
alignof(MemberExpr));
1775 return new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, QualifierLoc,
1776 TemplateKWLoc, MemberDecl, FoundDecl, NameInfo,
1777 TemplateArgs,
T,
VK, OK, NOUR);
1781 bool HasQualifier,
bool HasFoundDecl,
1782 bool HasTemplateKWAndArgsInfo,
1783 unsigned NumTemplateArgs) {
1784 assert((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
1785 "template args but no template arg info?");
1789 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1791 void *Mem = Context.Allocate(Size,
alignof(MemberExpr));
1797 if (
getType()->isUndeducedType())
1813 return BaseStartLoc;
1825bool CastExpr::CastConsistency()
const {
1827 case CK_DerivedToBase:
1828 case CK_UncheckedDerivedToBase:
1829 case CK_DerivedToBaseMemberPointer:
1830 case CK_BaseToDerived:
1831 case CK_BaseToDerivedMemberPointer:
1832 assert(!
path_empty() &&
"Cast kind should have a base path!");
1835 case CK_CPointerToObjCPointerCast:
1836 assert(
getType()->isObjCObjectPointerType());
1838 goto CheckNoBasePath;
1840 case CK_BlockPointerToObjCPointerCast:
1841 assert(
getType()->isObjCObjectPointerType());
1843 goto CheckNoBasePath;
1845 case CK_ReinterpretMemberPointer:
1846 assert(
getType()->isMemberPointerType());
1848 goto CheckNoBasePath;
1854 if (!
getType()->isPointerType()) {
1855 assert(
getType()->isObjCObjectPointerType() ==
1857 assert(
getType()->isBlockPointerType() ==
1860 goto CheckNoBasePath;
1862 case CK_AnyPointerToBlockPointerCast:
1863 assert(
getType()->isBlockPointerType());
1866 goto CheckNoBasePath;
1868 case CK_CopyAndAutoreleaseBlockObject:
1869 assert(
getType()->isBlockPointerType());
1871 goto CheckNoBasePath;
1873 case CK_FunctionToPointerDecay:
1874 assert(
getType()->isPointerType());
1876 goto CheckNoBasePath;
1878 case CK_AddressSpaceConversion: {
1887 (!Ty.
isNull() && !SETy.isNull() &&
1889 goto CheckNoBasePath;
1894 case CK_ArrayToPointerDecay:
1895 case CK_NullToMemberPointer:
1896 case CK_NullToPointer:
1897 case CK_ConstructorConversion:
1898 case CK_IntegralToPointer:
1899 case CK_PointerToIntegral:
1901 case CK_VectorSplat:
1902 case CK_IntegralCast:
1903 case CK_BooleanToSignedIntegral:
1904 case CK_IntegralToFloating:
1905 case CK_FloatingToIntegral:
1906 case CK_FloatingCast:
1907 case CK_ObjCObjectLValueCast:
1908 case CK_FloatingRealToComplex:
1909 case CK_FloatingComplexToReal:
1910 case CK_FloatingComplexCast:
1911 case CK_FloatingComplexToIntegralComplex:
1912 case CK_IntegralRealToComplex:
1913 case CK_IntegralComplexToReal:
1914 case CK_IntegralComplexCast:
1915 case CK_IntegralComplexToFloatingComplex:
1916 case CK_ARCProduceObject:
1917 case CK_ARCConsumeObject:
1918 case CK_ARCReclaimReturnedObject:
1919 case CK_ARCExtendBlockObject:
1920 case CK_ZeroToOCLOpaqueType:
1921 case CK_IntToOCLSampler:
1922 case CK_FloatingToFixedPoint:
1923 case CK_FixedPointToFloating:
1924 case CK_FixedPointCast:
1925 case CK_FixedPointToIntegral:
1926 case CK_IntegralToFixedPoint:
1929 goto CheckNoBasePath;
1932 case CK_LValueToRValue:
1934 case CK_AtomicToNonAtomic:
1935 case CK_NonAtomicToAtomic:
1936 case CK_PointerToBoolean:
1937 case CK_IntegralToBoolean:
1938 case CK_FloatingToBoolean:
1939 case CK_MemberPointerToBoolean:
1940 case CK_FloatingComplexToBoolean:
1941 case CK_IntegralComplexToBoolean:
1942 case CK_LValueBitCast:
1943 case CK_LValueToRValueBitCast:
1944 case CK_UserDefinedConversion:
1945 case CK_BuiltinFnToFnPtr:
1946 case CK_FixedPointToBoolean:
1947 case CK_HLSLArrayRValue:
1948 case CK_HLSLVectorTruncation:
1949 case CK_HLSLMatrixTruncation:
1950 case CK_HLSLElementwiseCast:
1951 case CK_HLSLAggregateSplatCast:
1953 assert(
path_empty() &&
"Cast kind should not have a base path!");
1961#define CAST_OPERATION(Name) case CK_##Name: return #Name;
1962#include "clang/AST/OperationKinds.def"
1964 llvm_unreachable(
"Unhandled cast kind!");
1970static Expr *ignoreImplicitSemaNodes(
Expr *E) {
1971 if (
auto *Materialize = dyn_cast<MaterializeTemporaryExpr>(E))
1972 return Materialize->getSubExpr();
1974 if (
auto *Binder = dyn_cast<CXXBindTemporaryExpr>(E))
1975 return Binder->getSubExpr();
1977 if (
auto *
Full = dyn_cast<FullExpr>(E))
1978 return Full->getSubExpr();
1980 if (
auto *CPLIE = dyn_cast<CXXParenListInitExpr>(E);
1981 CPLIE && CPLIE->getInitExprs().size() == 1)
1982 return CPLIE->getInitExprs()[0];
1989 const Expr *SubExpr =
nullptr;
1991 for (
const CastExpr *E =
this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
1996 if (E->getCastKind() == CK_ConstructorConversion) {
1998 ignoreImplicitSemaNodes);
1999 }
else if (E->getCastKind() == CK_UserDefinedConversion) {
2001 "Unexpected SubExpr for CK_UserDefinedConversion.");
2002 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2003 SubExpr = MCE->getImplicitObjectArgument();
2007 return const_cast<Expr *
>(SubExpr);
2011 const Expr *SubExpr =
nullptr;
2013 for (
const CastExpr *E =
this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
2016 if (E->getCastKind() == CK_ConstructorConversion)
2019 if (E->getCastKind() == CK_UserDefinedConversion) {
2020 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2021 return MCE->getMethodDecl();
2030#define ABSTRACT_STMT(x)
2031#define CASTEXPR(Type, Base) \
2032 case Stmt::Type##Class: \
2033 return static_cast<Type *>(this) \
2034 ->getTrailingObjectsNonStrict<CXXBaseSpecifier *>();
2035#define STMT(Type, Base)
2036#include "clang/AST/StmtNodes.inc"
2038 llvm_unreachable(
"non-cast expressions not possible here");
2052 Field != FieldEnd; ++Field) {
2054 !Field->isUnnamedBitField()) {
2064 case ImplicitCastExprClass:
2066 ->getTrailingObjects<FPOptionsOverride>();
2067 case CStyleCastExprClass:
2069 ->getTrailingObjects<FPOptionsOverride>();
2070 case CXXFunctionalCastExprClass:
2072 ->getTrailingObjects<FPOptionsOverride>();
2073 case CXXStaticCastExprClass:
2075 ->getTrailingObjects<FPOptionsOverride>();
2077 llvm_unreachable(
"Cast does not have FPFeatures");
2086 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2088 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2092 assert((Kind != CK_LValueToRValue ||
2093 !(
T->isNullPtrType() ||
2094 (
T->getAsCXXRecordDecl() && !
C.getLangOpts().HLSL))) &&
2095 "invalid type for lvalue-to-rvalue conversion");
2096 ImplicitCastExpr *E =
2097 new (Buffer) ImplicitCastExpr(
T, Kind, Operand, PathSize, FPO,
VK);
2099 llvm::uninitialized_copy(*BasePath,
2106 bool HasFPFeatures) {
2108 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2109 PathSize, HasFPFeatures));
2110 return new (Buffer) ImplicitCastExpr(
EmptyShell(), 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 llvm::uninitialized_copy(*BasePath,
2133 bool HasFPFeatures) {
2135 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2136 PathSize, HasFPFeatures));
2137 return new (Buffer) CStyleCastExpr(
EmptyShell(), 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];
2223 if (LHS->getType()->isPointerType()) {
2224 if (!RHS->getType()->isIntegerType())
2227 }
else if (RHS->getType()->isPointerType()) {
2228 if (!LHS->getType()->isIntegerType())
2240 if (!Select->getCond()->EvaluateAsBooleanCondition(
EvalResult, Ctx))
2242 PExp =
EvalResult ? Select->getTrueExpr() : Select->getFalseExpr();
2263 BuiltinLoc(BLoc), RParenLoc(RParenLoc), ParentContext(ParentContext) {
2267 ? ExprDependence::ValueInstantiation
2268 : ExprDependence::None);
2274 return "__builtin_FILE";
2276 return "__builtin_FILE_NAME";
2278 return "__builtin_FUNCTION";
2280 return "__builtin_FUNCSIG";
2282 return "__builtin_LINE";
2284 return "__builtin_COLUMN";
2286 return "__builtin_source_location";
2288 llvm_unreachable(
"unexpected IdentKind!");
2292 const Expr *DefaultExpr)
const {
2296 if (
const auto *DIE = dyn_cast_if_present<CXXDefaultInitExpr>(DefaultExpr)) {
2297 Loc = DIE->getUsedLocation();
2298 Context = DIE->getUsedContext();
2299 }
else if (
const auto *DAE =
2300 dyn_cast_if_present<CXXDefaultArgExpr>(DefaultExpr)) {
2301 Loc = DAE->getUsedLocation();
2302 Context = DAE->getUsedContext();
2313 if (
const auto *D = dyn_cast<CXXMethodDecl>(Context);
2315 Context = D->getParent()->getParent();
2320 auto MakeStringLiteral = [&](StringRef Tmp) {
2324 LValuePathEntry Path[1] = {LValuePathEntry::ArrayIndex(0)};
2335 return MakeStringLiteral(
FileName);
2341 return MakeStringLiteral(Path);
2345 const auto *CurDecl = dyn_cast<Decl>(Context);
2349 return MakeStringLiteral(
2369 StringRef Name = F->getName();
2370 if (Name ==
"_M_file_name") {
2374 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(Path);
2375 }
else if (Name ==
"_M_function_name") {
2378 const auto *CurDecl = dyn_cast<Decl>(Context);
2379 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(
2384 }
else if (Name ==
"_M_line") {
2386 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2387 }
else if (Name ==
"_M_column") {
2389 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2400 llvm_unreachable(
"unhandled case");
2405 unsigned NumOfElements)
2407 EmbedKeywordLoc(Loc), Ctx(&Ctx), Data(Data), Begin(Begin),
2408 NumOfElements(NumOfElements) {
2411 Ctx, llvm::APInt::getZero(Ctx.getTypeSize(
getType())),
getType(), Loc);
2412 assert(
getType()->isSignedIntegerType() &&
"IntTy should be signed");
2419 InitExprs(
C, initExprs.size()), LBraceLoc(lbraceloc),
2422 InitExprs.insert(
C, InitExprs.end(), initExprs.begin(), initExprs.end());
2429 if (NumInits > InitExprs.size())
2430 InitExprs.reserve(
C, NumInits);
2434 InitExprs.resize(
C, NumInits,
nullptr);
2438 if (
Init >= InitExprs.size()) {
2439 InitExprs.insert(
C, InitExprs.end(),
Init - InitExprs.size() + 1,
nullptr);
2451 ArrayFillerOrUnionFieldInit = filler;
2454 for (
unsigned i = 0, e =
getNumInits(); i != e; ++i)
2455 if (
inits[i] ==
nullptr)
2469 Init =
Init->IgnoreParenImpCasts();
2474 assert(
isSemanticForm() &&
"syntactic form never semantically transparent");
2478 assert(
getNumInits() == 1 &&
"multiple inits in glvalue init list");
2497 assert(
isSyntacticForm() &&
"only test syntactic form as zero initializer");
2504 return Lit && Lit->
getValue() == 0;
2509 return SyntacticForm->getBeginLoc();
2514 E = InitExprs.end();
2517 Beg = S->getBeginLoc();
2527 return SyntacticForm->getEndLoc();
2531 for (
Stmt *S : llvm::reverse(InitExprs)) {
2533 End = S->getEndLoc();
2550 return TheBlock->getCaretLocation();
2569 const auto *Ref = dyn_cast<DeclRefExpr>(Unwrapped);
2573 return isa_and_nonnull<DecompositionDecl>(Ref->getDecl());
2600 if (
auto *UO = dyn_cast<UnaryOperator>(E))
2601 if (UO->getOpcode() == UO_Deref)
2604 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
2606 if (BO->isPtrMemOp())
2610 if (BO->getOpcode() == BO_Comma)
2611 return BO->getRHS()->isReadIfDiscardedInCPlusPlus11();
2616 if (
auto *CO = dyn_cast<ConditionalOperator>(E))
2617 return CO->getTrueExpr()->isReadIfDiscardedInCPlusPlus11() &&
2618 CO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2621 dyn_cast<BinaryConditionalOperator>(E)) {
2622 if (
auto *OVE = dyn_cast<OpaqueValueExpr>(BCO->getTrueExpr()))
2623 return OVE->getSourceExpr()->isReadIfDiscardedInCPlusPlus11() &&
2624 BCO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2630 if (
const auto *POE = dyn_cast<PseudoObjectExpr>(E)) {
2658 case ParenExprClass:
2661 case GenericSelectionExprClass:
2664 case CoawaitExprClass:
2665 case CoyieldExprClass:
2668 case ChooseExprClass:
2671 case UnaryOperatorClass: {
2705 case BinaryOperatorClass: {
2717 if (IE->getValue() == 0)
2736 case CompoundAssignOperatorClass:
2737 case VAArgExprClass:
2738 case AtomicExprClass:
2741 case ConditionalOperatorClass: {
2746 return Exp->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx) &&
2747 Exp->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2749 case BinaryConditionalOperatorClass: {
2751 return Exp->getFalseExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2754 case MemberExprClass:
2761 case ArraySubscriptExprClass:
2768 case CXXOperatorCallExprClass: {
2780 case OO_ExclaimEqual:
2783 case OO_GreaterEqual:
2798 case CXXMemberCallExprClass:
2799 case UserDefinedLiteralClass: {
2823 case UnresolvedLookupExprClass:
2824 case CXXUnresolvedConstructExprClass:
2825 case RecoveryExprClass:
2828 case CXXTemporaryObjectExprClass:
2829 case CXXConstructExprClass: {
2834 CE->hasUnusedResultAttr(Ctx)) {
2839 if (
unsigned NumArgs = CE->getNumArgs())
2841 CE->getArg(NumArgs - 1)->getEndLoc());
2847 case ObjCMessageExprClass: {
2868 case ObjCPropertyRefExprClass:
2869 case ObjCSubscriptRefExprClass:
2875 case PseudoObjectExprClass: {
2880 POE->getSyntacticForm())) {
2888 if (
auto *BO = dyn_cast<BinaryOperator>(POE->getSyntacticForm()))
2889 if (BO->isAssignmentOp())
2891 if (
auto *UO = dyn_cast<UnaryOperator>(POE->getSyntacticForm()))
2892 if (UO->isIncrementDecrementOp())
2897 return Result &&
Result->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2900 case StmtExprClass: {
2911 if (
const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
2922 case CXXFunctionalCastExprClass:
2923 case CStyleCastExprClass: {
2937 if (
auto *DRE = dyn_cast<DeclRefExpr>(SubE))
2938 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2939 if (!VD->isExternallyVisible())
2955 if (CE->
getCastKind() == CK_ConstructorConversion)
2962 dyn_cast<CXXFunctionalCastExpr>(
this)) {
2963 Loc = CXXCE->getBeginLoc();
2964 R1 = CXXCE->getSubExpr()->getSourceRange();
2972 case ImplicitCastExprClass: {
2982 case CXXDefaultArgExprClass:
2985 case CXXDefaultInitExprClass:
2989 case CXXNewExprClass:
2992 case CXXDeleteExprClass:
2994 case MaterializeTemporaryExprClass:
2997 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2998 case CXXBindTemporaryExprClass:
3000 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
3001 case ExprWithCleanupsClass:
3003 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
3004 case OpaqueValueExprClass:
3006 WarnE, Loc, R1, R2, Ctx);
3017 case ObjCIvarRefExprClass:
3019 case Expr::UnaryOperatorClass:
3021 case ImplicitCastExprClass:
3023 case MaterializeTemporaryExprClass:
3026 case CStyleCastExprClass:
3028 case DeclRefExprClass: {
3031 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3032 if (VD->hasGlobalStorage())
3037 return T->isPointerType() &&
3042 case MemberExprClass: {
3046 case ArraySubscriptExprClass:
3058 assert(
expr->hasPlaceholderType(BuiltinType::BoundMember));
3067 return mem->getMemberDecl()->getType();
3073 assert(
type->isFunctionType());
3111 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(
this)) {
3112 if (isa_and_nonnull<CXXConversionDecl>(MCE->getMethodDecl()))
3113 return MCE->getImplicitObjectArgument();
3129 auto IgnoreNoopCastsSingleStep = [&Ctx](
Expr *E) {
3130 if (
auto *CE = dyn_cast<CastExpr>(E)) {
3133 Expr *SubExpr = CE->getSubExpr();
3134 bool IsIdentityCast =
3136 bool IsSameWidthCast = (E->
getType()->isPointerType() ||
3138 (SubExpr->
getType()->isPointerType() ||
3143 if (IsIdentityCast || IsSameWidthCast)
3145 }
else if (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E))
3146 return NTTP->getReplacement();
3151 IgnoreNoopCastsSingleStep);
3156 if (
auto *Cast = dyn_cast<CXXFunctionalCastExpr>(E)) {
3157 auto *SE = Cast->getSubExpr();
3162 if (
auto *
C = dyn_cast<CXXConstructExpr>(E)) {
3163 auto NumArgs =
C->getNumArgs();
3166 Expr *A =
C->getArg(0);
3173 auto IgnoreImplicitMemberCallSingleStep = [](
Expr *E) {
3174 if (
auto *
C = dyn_cast<CXXMemberCallExpr>(E)) {
3175 Expr *ExprNode =
C->getImplicitObjectArgument();
3179 if (
auto *PE = dyn_cast<ParenExpr>(ExprNode)) {
3180 if (PE->getSourceRange() ==
C->getSourceRange()) {
3193 auto IgnoreImplicitCallSingleStep = [](
Expr *E) {
3194 auto *
C = dyn_cast<CallExpr>(E);
3201 unsigned NumArgs =
C->getNumArgs();
3205 Expr *A =
C->getArg(0);
3222 IgnoreImplicitMemberCallSingleStep, IgnoreImplicitCallSingleStep);
3226 const Expr *E =
this;
3228 E = M->getSubExpr();
3231 E = ICE->getSubExprAsWritten();
3240 E = M->getSubExpr();
3243 if (ICE->getCastKind() == CK_NoOp)
3244 E = ICE->getSubExpr();
3250 E = BE->getSubExpr();
3253 if (ICE->getCastKind() == CK_NoOp)
3254 E = ICE->getSubExpr();
3265 if (!
C.hasSameUnqualifiedType(
getType(),
C.getCanonicalTagType(TempTy)))
3281 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E)) {
3282 switch (ICE->getCastKind()) {
3283 case CK_DerivedToBase:
3284 case CK_UncheckedDerivedToBase:
3295 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
3296 if (BO->isPtrMemOp())
3307 const Expr *E =
this;
3312 E =
Paren->getSubExpr();
3317 if (ICE->getCastKind() == CK_NoOp ||
3318 ICE->getCastKind() == CK_LValueToRValue ||
3319 ICE->getCastKind() == CK_DerivedToBase ||
3320 ICE->getCastKind() == CK_UncheckedDerivedToBase) {
3321 E = ICE->getSubExpr();
3326 if (
const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) {
3327 if (UnOp->getOpcode() == UO_Extension) {
3328 E = UnOp->getSubExpr();
3334 = dyn_cast<MaterializeTemporaryExpr>(E)) {
3335 E = M->getSubExpr();
3343 return This->isImplicit();
3351 for (
unsigned I = 0; I < Exprs.size(); ++I)
3359 const Expr **Culprit)
const {
3361 "Expression evaluator can't be called on a dependent expression.");
3373 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
this))
3374 return EWC->getSubExpr()->isConstantInitializer(Ctx,
true, Culprit);
3375 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
this))
3376 return MTE->getSubExpr()->isConstantInitializer(Ctx,
false, Culprit);
3387 case Stmt::ExprWithCleanupsClass:
3389 Ctx, IsForRef, Culprit);
3390 case StringLiteralClass:
3391 case ObjCEncodeExprClass:
3393 case CXXTemporaryObjectExprClass:
3394 case CXXConstructExprClass: {
3403 assert(CE->
getNumArgs() == 1 &&
"trivial ctor with > 1 argument");
3409 case ConstantExprClass: {
3415 case CompoundLiteralExprClass: {
3422 case DesignatedInitUpdateExprClass: {
3427 case InitListExprClass: {
3435 assert(ILE->
isSemanticForm() &&
"InitListExpr must be in semantic form");
3442 for (
unsigned i = 0; i < numInits; i++) {
3450 unsigned ElementNo = 0;
3455 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3456 for (
unsigned i = 0, e = CXXRD->getNumBases(); i < e; i++) {
3457 if (ElementNo < ILE->getNumInits()) {
3465 for (
const auto *Field : RD->fields()) {
3471 if (Field->isUnnamedBitField())
3474 if (ElementNo < ILE->getNumInits()) {
3476 if (Field->isBitField()) {
3485 bool RefType = Field->getType()->isReferenceType();
3496 case ImplicitValueInitExprClass:
3497 case NoInitExprClass:
3499 case ParenExprClass:
3501 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3502 case GenericSelectionExprClass:
3504 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3505 case ChooseExprClass:
3512 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3513 case UnaryOperatorClass: {
3519 case ObjCBoxedExprClass: {
3525 case ObjCArrayLiteralClass: {
3531 case ObjCDictionaryLiteralClass: {
3537 case PackIndexingExprClass: {
3540 ->isConstantInitializer(Ctx,
false, Culprit);
3542 case CXXFunctionalCastExprClass:
3543 case CXXStaticCastExprClass:
3544 case ImplicitCastExprClass:
3545 case CStyleCastExprClass:
3546 case ObjCBridgedCastExprClass:
3547 case CXXDynamicCastExprClass:
3548 case CXXReinterpretCastExprClass:
3549 case CXXAddrspaceCastExprClass:
3550 case CXXConstCastExprClass: {
3561 CE->
getCastKind() == CK_ARCReclaimReturnedObject ||
3567 case MaterializeTemporaryExprClass:
3570 ->isConstantInitializer(Ctx,
false, Culprit);
3572 case SubstNonTypeTemplateParmExprClass:
3574 ->isConstantInitializer(Ctx,
false, Culprit);
3575 case CXXDefaultArgExprClass:
3577 ->isConstantInitializer(Ctx,
false, Culprit);
3578 case CXXDefaultInitExprClass:
3580 ->isConstantInitializer(Ctx,
false, Culprit);
3594 if (BuiltinID != Builtin::BI__assume &&
3595 BuiltinID != Builtin::BI__builtin_assume)
3606 return DirectCallee->getAttr<AllocSizeAttr>();
3608 return IndirectCallee->getAttr<AllocSizeAttr>();
3612std::optional<llvm::APInt>
3616 assert(AllocSize && AllocSize->getElemSizeParam().isValid());
3617 unsigned SizeArgNo = AllocSize->getElemSizeParam().getASTIndex();
3620 return std::nullopt;
3622 auto EvaluateAsSizeT = [&](
const Expr *E, llvm::APSInt &Into) {
3628 if (Into.isNegative() || !Into.isIntN(BitsInSizeT))
3630 Into = Into.extOrTrunc(BitsInSizeT);
3634 llvm::APSInt SizeOfElem;
3635 if (!EvaluateAsSizeT(
getArg(SizeArgNo), SizeOfElem))
3636 return std::nullopt;
3638 if (!AllocSize->getNumElemsParam().isValid())
3641 llvm::APSInt NumberOfElems;
3642 unsigned NumArgNo = AllocSize->getNumElemsParam().getASTIndex();
3643 if (!EvaluateAsSizeT(
getArg(NumArgNo), NumberOfElems))
3644 return std::nullopt;
3647 llvm::APInt BytesAvailable = SizeOfElem.umul_ov(NumberOfElems, Overflow);
3649 return std::nullopt;
3651 return BytesAvailable;
3662 const bool IncludePossibleEffects;
3663 bool HasSideEffects;
3666 explicit SideEffectFinder(
const ASTContext &Context,
bool IncludePossible)
3667 : Inherited(Context),
3668 IncludePossibleEffects(IncludePossible), HasSideEffects(
false) { }
3670 bool hasSideEffects()
const {
return HasSideEffects; }
3672 void VisitDecl(
const Decl *D) {
3678 if (
auto *VD = dyn_cast<VarDecl>(D)) {
3680 if (IncludePossibleEffects && VD->isThisDeclarationADefinition() &&
3681 VD->needsDestruction(Context))
3682 HasSideEffects =
true;
3686 void VisitDeclStmt(
const DeclStmt *DS) {
3687 for (
auto *D : DS->
decls())
3689 Inherited::VisitDeclStmt(DS);
3692 void VisitExpr(
const Expr *E) {
3693 if (!HasSideEffects &&
3695 HasSideEffects =
true;
3701 bool IncludePossibleEffects)
const {
3705 if (!IncludePossibleEffects &&
getExprLoc().isMacroID())
3710#define ABSTRACT_STMT(Type)
3711#define STMT(Type, Base) case Type##Class:
3712#define EXPR(Type, Base)
3713#include "clang/AST/StmtNodes.inc"
3714 llvm_unreachable(
"unexpected Expr kind");
3716 case DependentScopeDeclRefExprClass:
3717 case DependentTemplateIdExprClass:
3718 case CXXUnresolvedConstructExprClass:
3719 case CXXDependentScopeMemberExprClass:
3720 case UnresolvedLookupExprClass:
3721 case UnresolvedMemberExprClass:
3722 case PackExpansionExprClass:
3723 case SubstNonTypeTemplateParmPackExprClass:
3724 case FunctionParmPackExprClass:
3725 case RecoveryExprClass:
3726 case CXXFoldExprClass:
3727 case CXXExpansionSelectExprClass:
3729 return IncludePossibleEffects;
3731 case DeclRefExprClass:
3732 case ObjCIvarRefExprClass:
3733 case PredefinedExprClass:
3734 case IntegerLiteralClass:
3735 case FixedPointLiteralClass:
3736 case FloatingLiteralClass:
3737 case ImaginaryLiteralClass:
3738 case StringLiteralClass:
3739 case CharacterLiteralClass:
3740 case OffsetOfExprClass:
3741 case ImplicitValueInitExprClass:
3742 case UnaryExprOrTypeTraitExprClass:
3743 case AddrLabelExprClass:
3744 case GNUNullExprClass:
3745 case ArrayInitIndexExprClass:
3746 case NoInitExprClass:
3747 case CXXBoolLiteralExprClass:
3748 case CXXNullPtrLiteralExprClass:
3749 case CXXThisExprClass:
3750 case CXXScalarValueInitExprClass:
3751 case TypeTraitExprClass:
3752 case ArrayTypeTraitExprClass:
3753 case ExpressionTraitExprClass:
3754 case CXXNoexceptExprClass:
3755 case SizeOfPackExprClass:
3756 case ObjCStringLiteralClass:
3757 case ObjCEncodeExprClass:
3758 case ObjCBoolLiteralExprClass:
3759 case ObjCAvailabilityCheckExprClass:
3760 case CXXUuidofExprClass:
3761 case OpaqueValueExprClass:
3762 case SourceLocExprClass:
3763 case EmbedExprClass:
3764 case ConceptSpecializationExprClass:
3765 case RequiresExprClass:
3766 case SYCLUniqueStableNameExprClass:
3767 case PackIndexingExprClass:
3768 case HLSLOutArgExprClass:
3769 case OpenACCAsteriskSizeExprClass:
3770 case CXXReflectExprClass:
3774 case ConstantExprClass:
3777 Ctx, IncludePossibleEffects);
3780 case CXXOperatorCallExprClass:
3781 case CXXMemberCallExprClass:
3782 case CUDAKernelCallExprClass:
3783 case UserDefinedLiteralClass: {
3788 bool IsPure = FD && (FD->
hasAttr<ConstAttr>() || FD->
hasAttr<PureAttr>());
3789 if (IsPure || !IncludePossibleEffects)
3794 case BlockExprClass:
3795 case CXXBindTemporaryExprClass:
3796 if (!IncludePossibleEffects)
3800 case MSPropertyRefExprClass:
3801 case MSPropertySubscriptExprClass:
3802 case CompoundAssignOperatorClass:
3803 case VAArgExprClass:
3804 case AtomicExprClass:
3805 case CXXThrowExprClass:
3806 case CXXNewExprClass:
3807 case CXXDeleteExprClass:
3808 case CoawaitExprClass:
3809 case DependentCoawaitExprClass:
3810 case CoyieldExprClass:
3814 case StmtExprClass: {
3816 SideEffectFinder Finder(Ctx, IncludePossibleEffects);
3818 return Finder.hasSideEffects();
3821 case ExprWithCleanupsClass:
3822 if (IncludePossibleEffects)
3827 case ParenExprClass:
3828 case ArraySubscriptExprClass:
3829 case MatrixSingleSubscriptExprClass:
3830 case MatrixSubscriptExprClass:
3831 case ArraySectionExprClass:
3832 case OMPArrayShapingExprClass:
3833 case OMPIteratorExprClass:
3834 case MemberExprClass:
3835 case ConditionalOperatorClass:
3836 case BinaryConditionalOperatorClass:
3837 case CompoundLiteralExprClass:
3838 case ExtVectorElementExprClass:
3839 case MatrixElementExprClass:
3840 case DesignatedInitExprClass:
3841 case DesignatedInitUpdateExprClass:
3842 case ArrayInitLoopExprClass:
3843 case ParenListExprClass:
3844 case CXXPseudoDestructorExprClass:
3845 case CXXRewrittenBinaryOperatorClass:
3846 case CXXStdInitializerListExprClass:
3847 case SubstNonTypeTemplateParmExprClass:
3848 case MaterializeTemporaryExprClass:
3849 case ShuffleVectorExprClass:
3850 case ConvertVectorExprClass:
3851 case AsTypeExprClass:
3852 case CXXParenListInitExprClass:
3856 case UnaryOperatorClass:
3861 case BinaryOperatorClass:
3866 case InitListExprClass:
3873 case GenericSelectionExprClass:
3875 Ctx, IncludePossibleEffects);
3877 case ChooseExprClass:
3879 Ctx, IncludePossibleEffects);
3881 case CXXDefaultArgExprClass:
3883 Ctx, IncludePossibleEffects);
3885 case CXXDefaultInitExprClass: {
3893 case CXXDynamicCastExprClass: {
3901 case ImplicitCastExprClass:
3902 case CStyleCastExprClass:
3903 case CXXStaticCastExprClass:
3904 case CXXReinterpretCastExprClass:
3905 case CXXConstCastExprClass:
3906 case CXXAddrspaceCastExprClass:
3907 case CXXFunctionalCastExprClass:
3908 case BuiltinBitCastExprClass: {
3913 if (!IncludePossibleEffects)
3923 case CXXTypeidExprClass: {
3925 if (!TE->isPotentiallyEvaluated())
3930 if (IncludePossibleEffects && TE->hasNullCheck())
3936 case CXXConstructExprClass:
3937 case CXXTemporaryObjectExprClass: {
3946 case CXXInheritedCtorInitExprClass: {
3948 if (!ICIE->getConstructor()->isTrivial() && IncludePossibleEffects)
3953 case LambdaExprClass: {
3955 for (
Expr *E : LE->capture_inits())
3961 case PseudoObjectExprClass: {
3968 const Expr *Subexpr = *I;
3970 Subexpr = OVE->getSourceExpr();
3977 case ObjCBoxedExprClass:
3978 case ObjCArrayLiteralClass:
3979 case ObjCDictionaryLiteralClass:
3980 case ObjCSelectorExprClass:
3981 case ObjCProtocolExprClass:
3982 case ObjCIsaExprClass:
3983 case ObjCIndirectCopyRestoreExprClass:
3984 case ObjCSubscriptRefExprClass:
3985 case ObjCBridgedCastExprClass:
3986 case ObjCMessageExprClass:
3987 case ObjCPropertyRefExprClass:
3989 if (IncludePossibleEffects)
4004 if (
auto Call = dyn_cast<CallExpr>(
this))
4005 return Call->getFPFeaturesInEffect(LO);
4006 if (
auto UO = dyn_cast<UnaryOperator>(
this))
4007 return UO->getFPFeaturesInEffect(LO);
4008 if (
auto BO = dyn_cast<BinaryOperator>(
this))
4009 return BO->getFPFeaturesInEffect(LO);
4010 if (
auto Cast = dyn_cast<CastExpr>(
this))
4011 return Cast->getFPFeaturesInEffect(LO);
4012 if (
auto ConvertVector = dyn_cast<ConvertVectorExpr>(
this))
4013 return ConvertVector->getFPFeaturesInEffect(LO);
4026 explicit NonTrivialCallFinder(
const ASTContext &Context)
4027 : Inherited(Context), NonTrivial(
false) { }
4029 bool hasNonTrivialCall()
const {
return NonTrivial; }
4031 void VisitCallExpr(
const CallExpr *E) {
4032 if (
const CXXMethodDecl *
Method
4033 = dyn_cast_or_null<const CXXMethodDecl>(E->
getCalleeDecl())) {
4034 if (
Method->isTrivial()) {
4036 Inherited::VisitStmt(E);
4044 void VisitCXXConstructExpr(
const CXXConstructExpr *E) {
4047 Inherited::VisitStmt(E);
4054 void VisitCXXBindTemporaryExpr(
const CXXBindTemporaryExpr *E) {
4057 if (
const CXXDestructorDecl *DtorDecl =
4059 if (DtorDecl->isTrivial()) {
4060 Inherited::VisitStmt(E);
4071 NonTrivialCallFinder Finder(Ctx);
4073 return Finder.hasNonTrivialCall();
4091 llvm_unreachable(
"Unexpected value dependent expression!");
4119 CE->getSubExpr()->getType()->isIntegerType())
4120 return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4123 }
else if (
const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(
this)) {
4125 return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4126 }
else if (
const ParenExpr *PE = dyn_cast<ParenExpr>(
this)) {
4129 return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4131 dyn_cast<GenericSelectionExpr>(
this)) {
4132 if (GE->isResultDependent())
4134 return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC);
4135 }
else if (
const ChooseExpr *CE = dyn_cast<ChooseExpr>(
this)) {
4136 if (CE->isConditionDependent())
4138 return CE->getChosenSubExpr()->isNullPointerConstant(Ctx, NPC);
4140 = dyn_cast<CXXDefaultArgExpr>(
this)) {
4142 return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
4144 = dyn_cast<CXXDefaultInitExpr>(
this)) {
4146 return DefaultInit->getExpr()->isNullPointerConstant(Ctx, NPC);
4151 = dyn_cast<MaterializeTemporaryExpr>(
this)) {
4152 return M->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4153 }
else if (
const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(
this)) {
4154 if (
const Expr *Source = OVE->getSourceExpr())
4155 return Source->isNullPointerConstant(Ctx, NPC);
4164 if (
getType()->isNullPtrType())
4167 if (
const RecordType *UT =
getType()->getAsUnionType())
4169 UT->getDecl()->getMostRecentDecl()->hasAttr<TransparentUnionAttr>())
4171 const Expr *InitExpr = CLE->getInitializer();
4172 if (
const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
4173 return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
4176 if (!
getType()->isIntegerType() ||
4207 const Expr *E =
this;
4210 "expression is not a property reference");
4213 if (BO->getOpcode() == BO_Comma) {
4228 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
4236 const ObjCMethodDecl *M = dyn_cast<ObjCMethodDecl>(Param->getDeclContext());
4247 if (ICE->getCastKind() == CK_LValueToRValue ||
4248 (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp))
4254 if (
MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
4255 if (
FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
4256 if (Field->isBitField())
4265 if (
DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E)) {
4266 if (
FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
4267 if (Field->isBitField())
4270 if (
BindingDecl *BD = dyn_cast<BindingDecl>(DeclRef->getDecl()))
4271 if (
Expr *E = BD->getBinding())
4276 if (BinOp->isAssignmentOp() && BinOp->getLHS())
4277 return BinOp->getLHS()->getSourceBitField();
4279 if (BinOp->getOpcode() == BO_Comma && BinOp->getRHS())
4280 return BinOp->getRHS()->getSourceBitField();
4284 if (UnOp->isPrefix() && UnOp->isIncrementDecrementOp())
4285 return UnOp->getSubExpr()->getSourceBitField();
4292 if (
auto *DRE = dyn_cast<DeclRefExpr>(E))
4293 return dyn_cast<EnumConstantDecl>(DRE->getDecl());
4302 if (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp)
4309 return ASE->getBase()->getType()->isVectorType();
4314 if (
auto *DRE = dyn_cast<DeclRefExpr>(E))
4315 if (
auto *BD = dyn_cast<BindingDecl>(DRE->getDecl()))
4316 if (
auto *E = BD->getBinding())
4325 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
4326 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
4328 VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
4344 case CXXThisExprClass:
4346 case DeclRefExprClass: {
4352 if (DRE1->getDecl() != DRE2->getDecl())
4355 if ((DRE1->isPRValue() && DRE2->isPRValue()) ||
4356 (DRE1->isLValue() && DRE2->isLValue()))
4361 case ImplicitCastExprClass: {
4364 const auto *ICE1 = dyn_cast<ImplicitCastExpr>(E1);
4365 const auto *ICE2 = dyn_cast<ImplicitCastExpr>(E2);
4368 if (ICE1->getCastKind() != ICE2->getCastKind())
4370 ICE2->IgnoreParenImpCasts());
4374 if (ICE1->getCastKind() == CK_LValueToRValue ||
4375 ICE1->getCastKind() == CK_ArrayToPointerDecay ||
4376 ICE1->getCastKind() == CK_FunctionToPointerDecay) {
4381 const auto *DRE1 = dyn_cast<DeclRefExpr>(E1);
4382 const auto *DRE2 = dyn_cast<DeclRefExpr>(E2);
4386 const auto *Ivar1 = dyn_cast<ObjCIvarRefExpr>(E1);
4387 const auto *Ivar2 = dyn_cast<ObjCIvarRefExpr>(E2);
4388 if (Ivar1 && Ivar2) {
4389 return Ivar1->isFreeIvar() && Ivar2->isFreeIvar() &&
4393 const auto *Array1 = dyn_cast<ArraySubscriptExpr>(E1);
4394 const auto *Array2 = dyn_cast<ArraySubscriptExpr>(E2);
4395 if (Array1 && Array2) {
4399 auto Idx1 = Array1->getIdx();
4400 auto Idx2 = Array2->getIdx();
4401 const auto Integer1 = dyn_cast<IntegerLiteral>(Idx1);
4402 const auto Integer2 = dyn_cast<IntegerLiteral>(Idx2);
4403 if (Integer1 && Integer2) {
4404 if (!llvm::APInt::isSameValue(Integer1->getValue(),
4405 Integer2->getValue()))
4421 if (
const auto *D = dyn_cast<VarDecl>(ME1->getMemberDecl()))
4422 if (D->isStaticDataMember())
4434 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E))
4435 return DRE->getDecl();
4436 if (
const auto *ME = dyn_cast<MemberExpr>(E))
4437 return ME->getMemberDecl();
4456 return VT->getNumElements();
4461 if (
const auto *MT =
getType()->getAs<ConstantMatrixType>())
4462 return MT->getNumElementsFlattened();
4471 StringRef Comp =
Accessor->getName();
4474 if (Comp ==
"hi" || Comp ==
"lo" || Comp ==
"even" || Comp ==
"odd")
4478 if (Comp[0] ==
's' || Comp[0] ==
'S')
4479 Comp = Comp.substr(1);
4481 for (
unsigned i = 0, e = Comp.size(); i != e; ++i)
4482 if (Comp.substr(i + 1).contains(Comp[i]))
4489struct MatrixAccessorFormat {
4490 bool IsZeroIndexed =
false;
4491 unsigned ChunkLen = 0;
4494static MatrixAccessorFormat GetHLSLMatrixAccessorFormat(StringRef Comp) {
4495 assert(!Comp.empty() && Comp[0] ==
'_' &&
"invalid matrix accessor");
4497 MatrixAccessorFormat F;
4498 if (Comp.size() >= 2 && Comp[0] ==
'_' && Comp[1] ==
'm') {
4499 F.IsZeroIndexed =
true;
4502 F.IsZeroIndexed =
false;
4506 assert(F.ChunkLen != 0 &&
"unrecognized matrix swizzle format");
4507 assert(
Comp.size() % F.ChunkLen == 0 &&
4508 "matrix swizzle accessor has invalid length");
4512template <
typename Fn>
4513static bool ForEachMatrixAccessorIndex(StringRef Comp,
4515 auto Format = GetHLSLMatrixAccessorFormat(Comp);
4517 for (
unsigned I = 0, E =
Comp.size(); I < E; I += Format.ChunkLen) {
4518 unsigned Row = 0, Col = 0;
4519 unsigned ZeroIndexOffset =
static_cast<unsigned>(Format.IsZeroIndexed);
4520 unsigned OneIndexOffset =
static_cast<unsigned>(!Format.IsZeroIndexed);
4521 Row =
static_cast<unsigned>(
Comp[I + ZeroIndexOffset + 1] -
'0') -
4523 Col =
static_cast<unsigned>(
Comp[I + ZeroIndexOffset + 2] -
'0') -
4526 assert(Row < MT->getNumRows() && Col < MT->getNumColumns() &&
4527 "matrix swizzle index out of bounds");
4545 StringRef Comp =
Accessor->getName();
4549 bool HasDup =
false;
4550 ForEachMatrixAccessorIndex(Comp, MT, [&](
unsigned Index) ->
bool {
4565 StringRef Comp =
Accessor->getName();
4566 bool isNumericAccessor =
false;
4567 if (Comp[0] ==
's' || Comp[0] ==
'S') {
4568 Comp = Comp.substr(1);
4569 isNumericAccessor =
true;
4572 bool isHi = Comp ==
"hi";
4573 bool isLo = Comp ==
"lo";
4574 bool isEven = Comp ==
"even";
4575 bool isOdd = Comp ==
"odd";
4591 Elts.push_back(Index);
4597 StringRef Comp =
Accessor->getName();
4599 ForEachMatrixAccessorIndex(Comp, MT, [&](
unsigned Index) ->
bool {
4600 Elts.push_back(Index);
4609 BuiltinLoc(BLoc), RParenLoc(RP) {
4611 SubExprs =
new (
C)
Stmt*[args.size()];
4612 for (
unsigned i = 0; i != args.size(); i++)
4613 SubExprs[i] = args[i];
4619 if (SubExprs)
C.Deallocate(SubExprs);
4623 llvm::copy(Exprs, SubExprs);
4626GenericSelectionExpr::GenericSelectionExpr(
4630 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex)
4631 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->
getType(),
4632 AssocExprs[ResultIndex]->getValueKind(),
4633 AssocExprs[ResultIndex]->getObjectKind()),
4634 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4635 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4636 assert(AssocTypes.size() == AssocExprs.size() &&
4637 "Must have the same number of association expressions"
4638 " and TypeSourceInfo!");
4639 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4642 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4644 llvm::copy(AssocExprs,
4645 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4646 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4647 getIndexOfStartOfAssociatedTypes());
4652GenericSelectionExpr::GenericSelectionExpr(
4657 unsigned ResultIndex)
4658 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->
getType(),
4659 AssocExprs[ResultIndex]->getValueKind(),
4660 AssocExprs[ResultIndex]->getObjectKind()),
4661 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4662 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4663 assert(AssocTypes.size() == AssocExprs.size() &&
4664 "Must have the same number of association expressions"
4665 " and TypeSourceInfo!");
4666 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4669 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4671 llvm::copy(AssocExprs,
4672 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4673 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4674 getIndexOfStartOfAssociatedTypes());
4679GenericSelectionExpr::GenericSelectionExpr(
4683 bool ContainsUnexpandedParameterPack)
4684 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4686 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4687 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4688 assert(AssocTypes.size() == AssocExprs.size() &&
4689 "Must have the same number of association expressions"
4690 " and TypeSourceInfo!");
4693 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4695 llvm::copy(AssocExprs,
4696 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4697 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4698 getIndexOfStartOfAssociatedTypes());
4703GenericSelectionExpr::GenericSelectionExpr(
4708 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4710 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4711 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4712 assert(AssocTypes.size() == AssocExprs.size() &&
4713 "Must have the same number of association expressions"
4714 " and TypeSourceInfo!");
4717 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4719 llvm::copy(AssocExprs,
4720 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4721 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4722 getIndexOfStartOfAssociatedTypes());
4727GenericSelectionExpr::GenericSelectionExpr(EmptyShell
Empty,
unsigned NumAssocs)
4728 :
Expr(GenericSelectionExprClass,
Empty), NumAssocs(NumAssocs) {}
4734 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex) {
4735 unsigned NumAssocs = AssocExprs.size();
4736 void *Mem = Context.Allocate(
4737 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4738 alignof(GenericSelectionExpr));
4739 return new (Mem) GenericSelectionExpr(
4740 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4741 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4748 bool ContainsUnexpandedParameterPack) {
4749 unsigned NumAssocs = AssocExprs.size();
4750 void *Mem = Context.Allocate(
4751 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4752 alignof(GenericSelectionExpr));
4753 return new (Mem) GenericSelectionExpr(
4754 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4755 RParenLoc, ContainsUnexpandedParameterPack);
4763 unsigned ResultIndex) {
4764 unsigned NumAssocs = AssocExprs.size();
4765 void *Mem = Context.Allocate(
4766 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4767 alignof(GenericSelectionExpr));
4768 return new (Mem) GenericSelectionExpr(
4769 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4770 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4777 SourceLocation RParenLoc,
bool ContainsUnexpandedParameterPack) {
4778 unsigned NumAssocs = AssocExprs.size();
4779 void *Mem = Context.Allocate(
4780 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4781 alignof(GenericSelectionExpr));
4782 return new (Mem) GenericSelectionExpr(
4783 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4784 RParenLoc, ContainsUnexpandedParameterPack);
4789 unsigned NumAssocs) {
4790 void *Mem = Context.Allocate(
4791 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4792 alignof(GenericSelectionExpr));
4793 return new (Mem) GenericSelectionExpr(
EmptyShell(), NumAssocs);
4814 EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
4815 NumDesignators(Designators.
size()), NumSubExprs(IndexExprs.
size() + 1) {
4816 this->Designators =
new (
C)
Designator[NumDesignators];
4824 unsigned IndexIdx = 0;
4825 for (
unsigned I = 0; I != NumDesignators; ++I) {
4826 this->Designators[I] = Designators[I];
4829 *Child++ = IndexExprs[IndexIdx++];
4832 *Child++ = IndexExprs[IndexIdx++];
4833 *Child++ = IndexExprs[IndexIdx++];
4837 assert(IndexIdx == IndexExprs.size() &&
"Wrong number of index expressions");
4845 bool UsesColonSyntax,
4847 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(IndexExprs.size() + 1),
4848 alignof(DesignatedInitExpr));
4849 return new (Mem) DesignatedInitExpr(
C,
C.VoidTy, Designators,
4850 ColonOrEqualLoc, UsesColonSyntax,
4855 unsigned NumIndexExprs) {
4856 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(NumIndexExprs + 1),
4857 alignof(DesignatedInitExpr));
4858 return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
4863 unsigned NumDesigs) {
4865 NumDesignators = NumDesigs;
4866 for (
unsigned I = 0; I != NumDesigs; ++I)
4867 Designators[I] = Desigs[I];
4871 DesignatedInitExpr *DIE =
const_cast<DesignatedInitExpr*
>(
this);
4879 auto *DIE =
const_cast<DesignatedInitExpr *
>(
this);
4881 if (
First.isFieldDesignator()) {
4884 for (
unsigned int i = 0; i < DIE->size(); i++) {
4892 return First.getLBracketLoc();
4919 unsigned NumNewDesignators =
Last -
First;
4920 if (NumNewDesignators == 0) {
4921 std::copy_backward(Designators + Idx + 1,
4922 Designators + NumDesignators,
4924 --NumNewDesignators;
4927 if (NumNewDesignators == 1) {
4928 Designators[Idx] = *
First;
4933 =
new (
C)
Designator[NumDesignators - 1 + NumNewDesignators];
4934 std::copy(Designators, Designators + Idx, NewDesignators);
4935 std::copy(
First,
Last, NewDesignators + Idx);
4936 std::copy(Designators + Idx + 1, Designators + NumDesignators,
4937 NewDesignators + Idx + NumNewDesignators);
4938 Designators = NewDesignators;
4939 NumDesignators = NumDesignators - 1 + NumNewDesignators;
4948 BaseAndUpdaterExprs[0] = baseExpr;
4953 BaseAndUpdaterExprs[1] = ILE;
4970 LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4972 llvm::copy(Exprs, getTrailingObjects());
4976ParenListExpr::ParenListExpr(EmptyShell
Empty,
unsigned NumExprs)
4985 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(Exprs.size()),
4986 alignof(ParenListExpr));
4987 return new (Mem) ParenListExpr(LParenLoc, Exprs, RParenLoc);
4991 unsigned NumExprs) {
4993 Ctx.
Allocate(totalSizeToAlloc<Stmt *>(NumExprs),
alignof(ParenListExpr));
4994 return new (Mem) ParenListExpr(
EmptyShell(), NumExprs);
5001static std::optional<BinaryOperator *>
5006 ComparedTo = E->
getRHS();
5009 ComparedTo = E->
getLHS();
5014 const Expr *AddLHS =
nullptr, *AddRHS =
nullptr;
5017 if (BO && BO->
getOpcode() == clang::BO_Add) {
5023 if (!AddLHS || !AddRHS)
5026 const Decl *LHSDecl, *RHSDecl, *OtherDecl;
5029 RHSDecl = AddRHS->IgnoreParenImpCasts()->getReferencedDeclOfCallee();
5035 if (!LHSDecl && !RHSDecl)
5038 if ((LHSDecl && LHSDecl == OtherDecl && LHSDecl != RHSDecl) ||
5039 (RHSDecl && RHSDecl == OtherDecl && RHSDecl != LHSDecl))
5061 Result.value()->setExcludedOverflowPattern(
true);
5068 :
Expr(BinaryOperatorClass, ResTy,
VK, OK) {
5071 "Use CompoundAssignOperator for compound assignments");
5074 SubExprs[LHS] = lhs;
5075 SubExprs[RHS] = rhs;
5087 :
Expr(CompoundAssignOperatorClass, ResTy,
VK, OK) {
5091 "Use CompoundAssignOperator for compound assignments");
5093 SubExprs[LHS] = lhs;
5094 SubExprs[RHS] = rhs;
5102 bool HasFPFeatures) {
5125 void *Mem =
C.Allocate(
sizeof(CompoundAssignOperator) +
Extra,
5126 alignof(CompoundAssignOperator));
5127 return new (Mem) CompoundAssignOperator(
C,
EmptyShell(), HasFPFeatures);
5138 void *Mem =
C.Allocate(
sizeof(CompoundAssignOperator) +
Extra,
5139 alignof(CompoundAssignOperator));
5141 CompoundAssignOperator(
C, lhs, rhs, opc, ResTy,
VK, OK, opLoc, FPFeatures,
5142 CompLHSType, CompResultType);
5146 bool hasFPFeatures) {
5147 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
5156 :
Expr(UnaryOperatorClass,
type,
VK, OK), Val(input) {
5172 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
5180 e = ewc->getSubExpr();
5182 e = m->getSubExpr();
5185 e = ice->getSubExpr();
5191 unsigned numSemanticExprs) {
5193 Context.Allocate(totalSizeToAlloc<Expr *>(1 + numSemanticExprs),
5194 alignof(PseudoObjectExpr));
5195 return new(buffer) PseudoObjectExpr(sh, numSemanticExprs);
5198PseudoObjectExpr::PseudoObjectExpr(EmptyShell shell,
unsigned numSemanticExprs)
5199 :
Expr(PseudoObjectExprClass, shell) {
5205 unsigned resultIndex) {
5206 assert(
syntax &&
"no syntactic expression!");
5207 assert(
semantics.size() &&
"no semantic expressions!");
5221 void *buffer =
C.Allocate(totalSizeToAlloc<Expr *>(
semantics.size() + 1),
5222 alignof(PseudoObjectExpr));
5229 unsigned resultIndex)
5242 "opaque-value semantic expressions for pseudo-object "
5243 "operations must have sources");
5245 llvm::copy(
semantics, Trail.drop_front().begin());
5276 NumSubExprs(args.size()), BuiltinLoc(BLoc), RParenLoc(RP), Op(op) {
5277 assert(args.size() ==
getNumSubExprs(op) &&
"wrong number of subexpressions");
5278 for (
unsigned i = 0; i != args.size(); i++)
5279 SubExprs[i] = args[i];
5285 case AO__c11_atomic_init:
5286 case AO__opencl_atomic_init:
5287 case AO__c11_atomic_load:
5288 case AO__atomic_load_n:
5289 case AO__atomic_test_and_set:
5290 case AO__atomic_clear:
5293 case AO__scoped_atomic_load_n:
5294 case AO__opencl_atomic_load:
5295 case AO__hip_atomic_load:
5296 case AO__c11_atomic_store:
5297 case AO__c11_atomic_exchange:
5298 case AO__atomic_load:
5299 case AO__atomic_store:
5300 case AO__atomic_store_n:
5301 case AO__atomic_exchange_n:
5302 case AO__c11_atomic_fetch_add:
5303 case AO__c11_atomic_fetch_sub:
5304 case AO__c11_atomic_fetch_and:
5305 case AO__c11_atomic_fetch_or:
5306 case AO__c11_atomic_fetch_xor:
5307 case AO__c11_atomic_fetch_nand:
5308 case AO__c11_atomic_fetch_max:
5309 case AO__c11_atomic_fetch_min:
5310 case AO__atomic_fetch_add:
5311 case AO__atomic_fetch_sub:
5312 case AO__atomic_fetch_and:
5313 case AO__atomic_fetch_or:
5314 case AO__atomic_fetch_xor:
5315 case AO__atomic_fetch_nand:
5316 case AO__atomic_add_fetch:
5317 case AO__atomic_sub_fetch:
5318 case AO__atomic_and_fetch:
5319 case AO__atomic_or_fetch:
5320 case AO__atomic_xor_fetch:
5321 case AO__atomic_nand_fetch:
5322 case AO__atomic_min_fetch:
5323 case AO__atomic_max_fetch:
5324 case AO__atomic_fetch_min:
5325 case AO__atomic_fetch_max:
5326 case AO__atomic_fetch_fminimum:
5327 case AO__atomic_fetch_fmaximum:
5328 case AO__atomic_fetch_fminimum_num:
5329 case AO__atomic_fetch_fmaximum_num:
5330 case AO__atomic_fetch_uinc:
5331 case AO__atomic_fetch_udec:
5334 case AO__scoped_atomic_load:
5335 case AO__scoped_atomic_store:
5336 case AO__scoped_atomic_store_n:
5337 case AO__scoped_atomic_fetch_add:
5338 case AO__scoped_atomic_fetch_sub:
5339 case AO__scoped_atomic_fetch_and:
5340 case AO__scoped_atomic_fetch_or:
5341 case AO__scoped_atomic_fetch_xor:
5342 case AO__scoped_atomic_fetch_nand:
5343 case AO__scoped_atomic_add_fetch:
5344 case AO__scoped_atomic_sub_fetch:
5345 case AO__scoped_atomic_and_fetch:
5346 case AO__scoped_atomic_or_fetch:
5347 case AO__scoped_atomic_xor_fetch:
5348 case AO__scoped_atomic_nand_fetch:
5349 case AO__scoped_atomic_min_fetch:
5350 case AO__scoped_atomic_max_fetch:
5351 case AO__scoped_atomic_fetch_min:
5352 case AO__scoped_atomic_fetch_max:
5353 case AO__scoped_atomic_fetch_fminimum:
5354 case AO__scoped_atomic_fetch_fmaximum:
5355 case AO__scoped_atomic_fetch_fminimum_num:
5356 case AO__scoped_atomic_fetch_fmaximum_num:
5357 case AO__scoped_atomic_exchange_n:
5358 case AO__scoped_atomic_fetch_uinc:
5359 case AO__scoped_atomic_fetch_udec:
5360 case AO__hip_atomic_exchange:
5361 case AO__hip_atomic_fetch_add:
5362 case AO__hip_atomic_fetch_sub:
5363 case AO__hip_atomic_fetch_and:
5364 case AO__hip_atomic_fetch_or:
5365 case AO__hip_atomic_fetch_xor:
5366 case AO__hip_atomic_fetch_min:
5367 case AO__hip_atomic_fetch_max:
5368 case AO__opencl_atomic_store:
5369 case AO__hip_atomic_store:
5370 case AO__opencl_atomic_exchange:
5371 case AO__opencl_atomic_fetch_add:
5372 case AO__opencl_atomic_fetch_sub:
5373 case AO__opencl_atomic_fetch_and:
5374 case AO__opencl_atomic_fetch_or:
5375 case AO__opencl_atomic_fetch_xor:
5376 case AO__opencl_atomic_fetch_min:
5377 case AO__opencl_atomic_fetch_max:
5378 case AO__atomic_exchange:
5381 case AO__scoped_atomic_exchange:
5382 case AO__c11_atomic_compare_exchange_strong:
5383 case AO__c11_atomic_compare_exchange_weak:
5385 case AO__hip_atomic_compare_exchange_strong:
5386 case AO__opencl_atomic_compare_exchange_strong:
5387 case AO__opencl_atomic_compare_exchange_weak:
5388 case AO__hip_atomic_compare_exchange_weak:
5389 case AO__atomic_compare_exchange:
5390 case AO__atomic_compare_exchange_n:
5393 case AO__scoped_atomic_compare_exchange:
5394 case AO__scoped_atomic_compare_exchange_n:
5397 llvm_unreachable(
"unknown atomic op");
5403 return AT->getValueType();
5408 unsigned ArraySectionCount = 0;
5409 while (
auto *OASE = dyn_cast<ArraySectionExpr>(
Base->IgnoreParens())) {
5410 Base = OASE->getBase();
5411 ++ArraySectionCount;
5414 dyn_cast<ArraySubscriptExpr>(
Base->IgnoreParenImpCasts())) {
5415 Base = ASE->getBase();
5416 ++ArraySectionCount;
5418 Base =
Base->IgnoreParenImpCasts();
5419 auto OriginalTy =
Base->getType();
5420 if (
auto *DRE = dyn_cast<DeclRefExpr>(
Base))
5421 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
5422 OriginalTy = PVD->getOriginalType().getNonReferenceType();
5424 for (
unsigned Cnt = 0; Cnt < ArraySectionCount; ++Cnt) {
5425 if (OriginalTy->isAnyPointerType())
5426 OriginalTy = OriginalTy->getPointeeType();
5427 else if (OriginalTy->isArrayType())
5428 OriginalTy = OriginalTy->castAsArrayTypeUnsafe()->getElementType();
5440 BaseTy = ASE->getElementType();
5457 return ASE->getElementType();
5464 :
Expr(RecoveryExprClass,
T.getNonReferenceType(),
5465 T->isDependentType() ?
VK_LValue : getValueKindForType(
T),
5467 BeginLoc(BeginLoc), EndLoc(EndLoc), NumExprs(SubExprs.size()) {
5468 assert(!
T.isNull());
5469 assert(!llvm::is_contained(SubExprs,
nullptr));
5471 llvm::copy(SubExprs, getTrailingObjects());
5479 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(SubExprs.size()),
5480 alignof(RecoveryExpr));
5481 return new (Mem) RecoveryExpr(Ctx,
T, BeginLoc, EndLoc, SubExprs);
5485 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(NumSubExprs),
5486 alignof(RecoveryExpr));
5487 return new (Mem) RecoveryExpr(
EmptyShell(), NumSubExprs);
5492 NumDims == Dims.size() &&
5493 "Preallocated number of dimensions is different from the provided one.");
5494 llvm::copy(Dims, getTrailingObjects<Expr *>());
5499 NumDims == BR.size() &&
5500 "Preallocated number of dimensions is different from the provided one.");
5501 llvm::copy(BR, getTrailingObjects<SourceRange>());
5504OMPArrayShapingExpr::OMPArrayShapingExpr(
QualType ExprTy,
Expr *Op,
5508 RPLoc(
R), NumDims(Dims.size()) {
5510 setDimensions(Dims);
5519 assert(Dims.size() == BracketRanges.size() &&
5520 "Different number of dimensions and brackets ranges.");
5521 void *Mem = Context.Allocate(
5522 totalSizeToAlloc<Expr *, SourceRange>(Dims.size() + 1, Dims.size()),
5523 alignof(OMPArrayShapingExpr));
5524 auto *E =
new (Mem) OMPArrayShapingExpr(
T, Op, L, R, Dims);
5525 E->setBracketsRanges(BracketRanges);
5531 void *Mem = Context.Allocate(
5532 totalSizeToAlloc<Expr *, SourceRange>(NumDims + 1, NumDims),
5533 alignof(OMPArrayShapingExpr));
5534 return new (Mem) OMPArrayShapingExpr(
EmptyShell(), NumDims);
5537void OMPIteratorExpr::setIteratorDeclaration(
unsigned I,
Decl *D) {
5538 getTrailingObjects<Decl *>(NumIterators)[I] = D;
5541void OMPIteratorExpr::setAssignmentLoc(
unsigned I,
SourceLocation Loc) {
5542 assert(I < NumIterators &&
5543 "Idx is greater or equal the number of iterators definitions.");
5546 static_cast<int>(RangeLocOffset::AssignLoc)] = Loc;
5549void OMPIteratorExpr::setIteratorRange(
unsigned I,
Expr *Begin,
5553 assert(I < NumIterators &&
5554 "Idx is greater or equal the number of iterators definitions.");
5555 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5556 static_cast<int>(RangeExprOffset::Begin)] =
5558 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5559 static_cast<int>(RangeExprOffset::End)] = End;
5560 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5561 static_cast<int>(RangeExprOffset::Step)] = Step;
5563 SourceLocation>()[I *
static_cast<int>(RangeLocOffset::Total) +
5564 static_cast<int>(RangeLocOffset::FirstColonLoc)] =
5567 SourceLocation>()[I *
static_cast<int>(RangeLocOffset::Total) +
5568 static_cast<int>(RangeLocOffset::SecondColonLoc)] =
5573 return getTrailingObjects<Decl *>()[I];
5579 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5580 RangeExprOffset::Total) +
5581 static_cast<int>(RangeExprOffset::Begin)];
5583 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5584 RangeExprOffset::Total) +
5585 static_cast<int>(RangeExprOffset::End)];
5587 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5588 RangeExprOffset::Total) +
5589 static_cast<int>(RangeExprOffset::Step)];
5594 return getTrailingObjects<
5596 static_cast<int>(RangeLocOffset::AssignLoc)];
5600 return getTrailingObjects<
5602 static_cast<int>(RangeLocOffset::FirstColonLoc)];
5606 return getTrailingObjects<
5608 static_cast<int>(RangeLocOffset::SecondColonLoc)];
5612 getTrailingObjects<OMPIteratorHelperData>()[I] = D;
5616 return getTrailingObjects<OMPIteratorHelperData>()[I];
5620 return getTrailingObjects<OMPIteratorHelperData>()[I];
5623OMPIteratorExpr::OMPIteratorExpr(
5628 IteratorKwLoc(IteratorKwLoc), LPLoc(L), RPLoc(R),
5629 NumIterators(
Data.size()) {
5630 for (
unsigned I = 0, E =
Data.size(); I < E; ++I) {
5631 const IteratorDefinition &D = Data[I];
5632 setIteratorDeclaration(I, D.IteratorDecl);
5633 setAssignmentLoc(I, D.AssignmentLoc);
5634 setIteratorRange(I, D.Range.Begin, D.ColonLoc, D.Range.End,
5635 D.SecondColonLoc, D.Range.Step);
5636 setHelper(I, Helpers[I]);
5647 assert(
Data.size() == Helpers.size() &&
5648 "Data and helpers must have the same size.");
5649 void *Mem = Context.Allocate(
5650 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5651 Data.size(),
Data.size() *
static_cast<int>(RangeExprOffset::Total),
5652 Data.size() *
static_cast<int>(RangeLocOffset::Total),
5654 alignof(OMPIteratorExpr));
5655 return new (Mem) OMPIteratorExpr(
T, IteratorKwLoc, L, R,
Data, Helpers);
5659 unsigned NumIterators) {
5660 void *Mem = Context.Allocate(
5661 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5662 NumIterators, NumIterators *
static_cast<int>(RangeExprOffset::Total),
5663 NumIterators *
static_cast<int>(RangeLocOffset::Total), NumIterators),
5664 alignof(OMPIteratorExpr));
5665 return new (Mem) OMPIteratorExpr(
EmptyShell(), NumIterators);
5672 return new (
C) HLSLOutArgExpr(Ty,
Base, OpV, WB, IsInOut);
5681 return new (
C) OpenACCAsteriskSizeExpr(Loc,
C.IntTy);
5686 return new (
C) OpenACCAsteriskSizeExpr({},
C.IntTy);
5690 bool hasFPFeatures) {
5691 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
5692 alignof(ConvertVectorExpr));
5693 return new (Mem) ConvertVectorExpr(hasFPFeatures,
EmptyShell());
5701 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
5702 void *Mem =
C.Allocate(Size,
alignof(ConvertVectorExpr));
5703 return new (Mem) ConvertVectorExpr(SrcExpr, TI, DstType,
VK, OK, BuiltinLoc,
5704 RParenLoc, FPFeatures);
5710 StaticValue =
new (Ctx)
APValue;
5713 return *StaticValue;
5717 assert(StaticValue);
5718 return *StaticValue;
5724class StructFieldAccessVisitor
5726 bool AddrOfSeen =
false;
5729 const Expr *ArrayIndex =
nullptr;
5746 ArrayIndex = E->
getIdx();
5750 const Expr *VisitCastExpr(
const CastExpr *E) {
5755 const Expr *VisitParenExpr(
const ParenExpr *E) {
5758 const Expr *VisitUnaryAddrOf(
const UnaryOperator *E) {
5762 const Expr *VisitUnaryDeref(
const UnaryOperator *E) {
5766 const Expr *VisitBinaryOperator(
const BinaryOperator *Op) {
5773 const Expr **OutArrayIndex,
5775 StructFieldAccessVisitor
V;
5778 *OutArrayIndex =
V.ArrayIndex;
5779 if (OutArrayElementTy)
5780 *OutArrayElementTy =
V.ArrayElementTy;
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 bool IsDecompositionDeclRefExpr(const Expr *E)
Helper to determine wether E is a CXXConstructExpr constructing a DecompositionDecl.
static unsigned SizeOfCallExprInstance(Expr::StmtClass SC)
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.
Result
Implement __builtin_bit_cast and related operations.
Defines the clang::Preprocessor interface.
static QualType getUnderlyingType(const SubRegion *R)
static bool isRecordType(QualType T)
Defines the SourceManager interface.
Expr * getExpr()
Get 'expr' part of the associated expression/statement.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
static const TypeInfo & getInfo(unsigned id)
a trap message and trap category.
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
static CanQualType getCanonicalType(QualType T)
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.
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.
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
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...
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
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.
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
const Stmt ** const_iterator
QualType getElementType() const
Return the effective 'element' type of this array section.
Expr * getBase()
Get base of the array section.
static QualType getBaseOriginalType(const Expr *Base)
Return original type of the base expression for array section.
QualType getBaseType() const
Returns the effective 'type' of the base of this 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
static unsigned getNumSubExprs(AtomicOp Op)
Determine the number of arguments the specified atomic builtin should have.
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
static bool isCommaOp(Opcode Opc)
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...
BinaryOperatorKind Opcode
A binding in a decomposition declaration.
A fixed int type of a specified bitwidth.
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.
CXXTemporary * getTemporary()
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]).
const CXXDestructorDecl * getDestructor() const
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
std::optional< llvm::APInt > evaluateBytesReturnedByAllocSizeCall(const ASTContext &Ctx) const
Evaluates the total size in bytes allocated by calling a function decorated with alloc_size.
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.
const AllocSizeAttr * getCalleeAllocSizeAttr() const
Try to get the alloc_size attribute of the callee. May return null.
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
void setPreArg(unsigned I, Stmt *PreArg)
static constexpr unsigned OffsetToTrailingObjects
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...
static constexpr unsigned sizeToAllocateForCallExprSubclass(unsigned SizeOfTrailingObjects)
static constexpr ADLCallKind UsesADL
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)
CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind, Expr *op, unsigned BasePathSize, bool HasFPFeatures)
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].
bool hasStaticStorage() const
APValue & getStaticValue() const
APValue & getOrCreateStaticValue(ASTContext &Ctx) const
CompoundStmt - This represents a group of statements like { stmt stmt }.
ConditionalOperator - The ?
ConstEvaluatedExprVisitor - This class visits 'const Expr *'s.
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
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)
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumElementsFlattened() const
Returns the number of elements required to embed the matrix into a vector.
unsigned getFlattenedIndex(unsigned Row, unsigned Column, bool IsRowMajor=false) const
Returns the flattened index of a matrix element located at row Row, and column Column.
static ConvertVectorExpr * Create(const ASTContext &C, Expr *SrcExpr, TypeSourceInfo *TI, QualType DstType, ExprValueKind VK, ExprObjectKind OK, SourceLocation BuiltinLoc, SourceLocation RParenLoc, FPOptionsOverride FPFeatures)
static ConvertVectorExpr * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
A POD class for pairing a NamedDecl* with an access specifier.
NamedDecl * getDecl() const
AccessSpecifier getAccess() const
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.
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.
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)
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
Decl - This represents one declaration (or definition), e.g.
static bool isFlexibleArrayMemberLike(const ASTContext &Context, const Decl *D, QualType Ty, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution)
Whether it resembles a flexible array member.
ASTContext & getASTContext() const LLVM_READONLY
static Decl * castFromDeclContext(const DeclContext *)
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
DeclarationNameLoc - Additional source/type location info for a declaration name.
Represents a single C99 designator.
unsigned getArrayIndex() const
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
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).
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
static DesignatedInitExpr * Create(const ASTContext &C, ArrayRef< Designator > Designators, ArrayRef< Expr * > IndexExprs, SourceLocation EqualOrColonLoc, bool GNUSyntax, Expr *Init)
SourceLocation getBeginLoc() const LLVM_READONLY
DesignatedInitUpdateExpr(const ASTContext &C, SourceLocation lBraceLoc, Expr *baseExprs, SourceLocation rBraceLoc)
SourceLocation getEndLoc() const LLVM_READONLY
InitListExpr * getUpdater() const
const Expr * getBase() const
IdentifierInfo * Accessor
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...
bool isIntegerConstantExpr(const ASTContext &Ctx) const
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_AllowSideEffects
Allow any unmodeled side effect.
@ 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.
static std::pair< const NamedDecl *, const WarnUnusedResultAttr * > getUnusedResultAttrImpl(const Decl *Callee, QualType ReturnType)
Returns the WarnUnusedResultAttr that is declared on the callee or its return type declaration,...
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) 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.
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 isFlexibleArrayMemberLike(const 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...
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 isConstantInitializer(ASTContext &Ctx, bool ForRef=false, const Expr **Culprit=nullptr) const
Returns true if this expression can be emitted to IR as a constant, and thus can be used as a constan...
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.
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.
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.
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...
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
llvm::APInt getValue() const
Returns an internal integer representation of the literal.
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.
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.
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.
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
InitListExpr(const ASTContext &C, SourceLocation lbraceloc, ArrayRef< Expr * > initExprs, SourceLocation rbraceloc, bool isExplicit)
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() const
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.
bool containsDuplicateElements() const
containsDuplicateElements - Return true if any element access is repeated.
void getEncodedElementAccess(SmallVectorImpl< uint32_t > &Elts) const
getEncodedElementAccess - Encode the elements accessed into an llvm aggregate Constant of ConstantInt...
unsigned getNumElements() const
getNumElements - Get the number of components being selected.
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.
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
ObjCBoxedExpr - used for generalized expression boxing.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
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.
bool hasUnusedResultAttr(ASTContext &Ctx) const
Returns true if this message send should warn on unused results.
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
bool isExpressibleAsConstantInitializer() const
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
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)
const IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
FieldDecl * getField() const
For a field offsetof node, returns 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.
OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK, ExprObjectKind OK=OK_Ordinary, Expr *SourceExpr=nullptr)
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.
const Expr * getSubExpr() const
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
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
specific_decl_iterator< FieldDecl > field_iterator
field_iterator field_begin() const
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.
FileIDAndOffset getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
StringRef getBufferData(FileID FID, bool *Invalid=nullptr) const
Return a StringRef to the source buffer data for the specified FileID.
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
CharSourceRange getExpansionRange(SourceLocation Loc) const
Given a SourceLocation object, return the range of tokens covered by the expansion in the ultimate fi...
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
UnaryExprOrTypeTraitExprBitfields UnaryExprOrTypeTraitExprBits
GenericSelectionExprBitfields GenericSelectionExprBits
InitListExprBitfields InitListExprBits
ParenListExprBitfields ParenListExprBits
StmtIterator child_iterator
Child Iterators: All subclasses must implement 'children' to permit easy iteration over the substatem...
CallExprBitfields CallExprBits
ShuffleVectorExprBitfields ShuffleVectorExprBits
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
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
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 * 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.
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,...
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
CXXRecordDecl * castAsCXXRecordDecl() const
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.
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
RecordDecl * castAsRecordDecl() const
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
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 ...
Stmt(StmtClass SC, EmptyShell)
Construct an empty statement.
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.
bool Comp(InterpState &S)
1) Pops the value from the stack.
Top level wrappers for InstallAPI frontend operations.
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.
bool isa(CodeGen::Address addr)
LLVM_READONLY bool isPrintable(unsigned char c)
Return true if this character is an ASCII printable character; that is, a character that should take ...
const Expr * findStructFieldAccess(const Expr *E, const Expr **OutArrayIndex=nullptr, QualType *OutArrayElementTy=nullptr)
Walk E through parens, implicit casts, unary &/*, array subscripts and comma operators to find the he...
LLVM_READONLY auto escapeCStyle(CharT Ch) -> StringRef
Return C-style escaped string for special characters, or an empty string if there is no such mapping.
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.
std::pair< FileID, unsigned > FileIDAndOffset
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'.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
Expr * IgnoreImplicitCastsExtraSingleStep(Expr *E)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
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)
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Expr * IgnoreImplicitAsWrittenSingleStep(Expr *E)
Expr * IgnoreCastsSingleStep(Expr *E)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
@ Full
Match, but we didn't check for full match.
U cast(CodeGen::Address addr)
Expr * IgnoreLValueCastsSingleStep(Expr *E)
bool isLambdaMethod(const DeclContext *DC)
ActionResult< Expr * > ExprResult
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 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,...