36#include "llvm/Support/ErrorHandling.h"
37#include "llvm/Support/Format.h"
38#include "llvm/Support/raw_ostream.h"
50 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
51 if (BO->getOpcode() == BO_Comma) {
58 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
59 E = MTE->getSubExpr();
76 DerivedType = ATy->getElementType();
91 if (
const auto *CE = dyn_cast<CastExpr>(E)) {
92 if ((CE->getCastKind() == CK_DerivedToBase ||
93 CE->getCastKind() == CK_UncheckedDerivedToBase) &&
101 if (CE->getCastKind() == CK_NoOp) {
102 E = CE->getSubExpr();
105 }
else if (
const auto *ME = dyn_cast<MemberExpr>(E)) {
106 if (!ME->isArrow()) {
107 assert(ME->getBase()->getType()->getAsRecordDecl());
108 if (
const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
109 if (!Field->isBitField() && !Field->getType()->isReferenceType()) {
116 }
else if (
const auto *BO = dyn_cast<BinaryOperator>(E)) {
117 if (BO->getOpcode() == BO_PtrMemD) {
118 assert(BO->getRHS()->isPRValue());
124 if (BO->getOpcode() == BO_Comma) {
125 CommaLHSs.push_back(BO->getLHS());
146 switch (UO->getOpcode()) {
148 return UO->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
160 return CE->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
163 switch (BO->getOpcode()) {
164 default:
return false;
179 return BO->getLHS()->isKnownToHaveBooleanValue(Semantic) &&
180 BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
184 return BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
189 return CO->getTrueExpr()->isKnownToHaveBooleanValue(Semantic) &&
190 CO->getFalseExpr()->isKnownToHaveBooleanValue(Semantic);
195 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(E))
196 return OVE->getSourceExpr()->isKnownToHaveBooleanValue(Semantic);
199 if (!Semantic && FD->getType()->isUnsignedIntegerType() &&
200 !FD->getBitWidth()->isValueDependent() && FD->getBitWidthValue() == 1)
209 bool IgnoreTemplateOrMacroSubstitution)
const {
211 const Decl *D =
nullptr;
213 if (
const auto *ME = dyn_cast<MemberExpr>(E))
214 D = ME->getMemberDecl();
215 else if (
const auto *DRE = dyn_cast<DeclRefExpr>(E))
217 else if (
const auto *IRE = dyn_cast<ObjCIvarRefExpr>(E))
221 StrictFlexArraysLevel,
222 IgnoreTemplateOrMacroSubstitution);
232 if (
Value.isMemberPointer())
233 return Value.getMemberPointerDecl();
235 if (
Value.isLValue() &&
Value.getLValueOffset().isZero())
249 template <
class E,
class T>
252 return static_cast<const E*
>(
expr)->getExprLoc();
262 return static_cast<const E *
>(
expr)->getBeginLoc();
271 if (ED->isCompleteDefinition())
280#define ABSTRACT_STMT(type)
281#define STMT(type, base) \
282 case Stmt::type##Class: break;
283#define EXPR(type, base) \
284 case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
285#include "clang/AST/StmtNodes.inc"
287 llvm_unreachable(
"unknown expression kind");
298 "Invalid StorageKind Value");
308 if (!
Value.getInt().needsCleanup())
318 if (T->isIntegralOrEnumerationType() && Context.getTypeInfo(T).Width <= 64)
324 bool IsImmediateInvocation)
325 :
FullExpr(ConstantExprClass, SubExpr) {
334 ::new (getTrailingObjects<APValue>())
APValue();
339 bool IsImmediateInvocation) {
343 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
346 void *Mem = Context.Allocate(Size,
alignof(ConstantExpr));
347 return new (Mem) ConstantExpr(E, StorageKind, IsImmediateInvocation);
353 ConstantExpr *
Self =
Create(Context, E, StorageKind);
358ConstantExpr::ConstantExpr(EmptyShell
Empty,
364 ::new (getTrailingObjects<APValue>())
APValue();
371 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
374 void *Mem = Context.Allocate(Size,
alignof(ConstantExpr));
375 return new (Mem) ConstantExpr(
EmptyShell(), StorageKind);
380 "Invalid storage for this value kind");
386 Int64Result() = *
Value.getInt().getRawData();
393 Context.addDestruction(&APValueResult());
395 APValueResult() = std::move(
Value);
398 llvm_unreachable(
"Invalid ResultKind Bits");
404 return APValueResult().getInt();
409 llvm_unreachable(
"invalid Accessor");
417 return APValueResult();
427 llvm_unreachable(
"invalid ResultKind");
431 bool RefersToEnclosingVariableOrCapture,
QualType T,
441 RefersToEnclosingVariableOrCapture;
442 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
449DeclRefExpr::DeclRefExpr(
const ASTContext &Ctx,
452 bool RefersToEnclosingVariableOrCapture,
461 new (getTrailingObjects<NestedNameSpecifierLoc>())
465 *getTrailingObjects<NamedDecl *>() = FoundD;
467 = (TemplateArgs || TemplateKWLoc.
isValid()) ? 1 : 0;
469 RefersToEnclosingVariableOrCapture;
470 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
473 auto Deps = TemplateArgumentDependence::None;
474 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
475 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
477 assert(!(Deps & TemplateArgumentDependence::Dependent) &&
478 "built a DeclRefExpr with dependent template args");
479 }
else if (TemplateKWLoc.
isValid()) {
480 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
491 bool RefersToEnclosingVariableOrCapture,
496 return Create(Context, QualifierLoc, TemplateKWLoc, D,
497 RefersToEnclosingVariableOrCapture,
499 T,
VK, FoundD, TemplateArgs, NOUR);
505 bool RefersToEnclosingVariableOrCapture,
515 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
519 QualifierLoc ? 1 : 0, FoundD ? 1 : 0,
520 HasTemplateKWAndArgsInfo ? 1 : 0,
521 TemplateArgs ? TemplateArgs->
size() : 0);
523 void *Mem = Context.Allocate(Size,
alignof(DeclRefExpr));
524 return new (Mem) DeclRefExpr(Context, QualifierLoc, TemplateKWLoc, D,
525 RefersToEnclosingVariableOrCapture, NameInfo,
526 FoundD, TemplateArgs, T,
VK, NOUR);
532 bool HasTemplateKWAndArgsInfo,
533 unsigned NumTemplateArgs) {
534 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
538 HasQualifier ? 1 : 0, HasFoundDecl ? 1 : 0, HasTemplateKWAndArgsInfo,
540 void *Mem = Context.Allocate(Size,
alignof(DeclRefExpr));
546 if (
getType()->isUndeducedType())
557SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(
SourceLocation OpLoc,
563 OpLoc(OpLoc), LParen(LParen), RParen(RParen) {
564 setTypeSourceInfo(TSI);
568SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(EmptyShell
Empty,
578 SYCLUniqueStableNameExpr(OpLoc, LParen, RParen, ResultTy, TSI);
584 return new (Ctx) SYCLUniqueStableNameExpr(
EmptyShell(), ResultTy);
596 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
597 return RD->getDeviceLambdaManglingNumber();
602 Context, Context.getDiagnostics(), MangleCallback)};
606 llvm::raw_string_ostream Out(Buffer);
607 Ctx->mangleCanonicalTypeName(Ty, Out);
617 assert((getIdentKind() == IK) &&
618 "IdentKind do not fit in PredefinedExprBitfields!");
619 bool HasFunctionName = SL !=
nullptr;
628PredefinedExpr::PredefinedExpr(EmptyShell
Empty,
bool HasFunctionName)
636 bool HasFunctionName = SL !=
nullptr;
637 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
638 alignof(PredefinedExpr));
639 return new (Mem) PredefinedExpr(L, FNTy, IK, IsTransparent, SL);
643 bool HasFunctionName) {
644 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
645 alignof(PredefinedExpr));
646 return new (Mem) PredefinedExpr(
EmptyShell(), HasFunctionName);
654 return "__FUNCTION__";
656 return "__FUNCDNAME__";
658 return "L__FUNCTION__";
660 return "__PRETTY_FUNCTION__";
662 return "__FUNCSIG__";
664 return "L__FUNCSIG__";
668 llvm_unreachable(
"Unknown ident kind for PredefinedExpr");
674 const Decl *CurrentDecl,
675 bool ForceElaboratedPrinting) {
679 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(CurrentDecl)) {
680 std::unique_ptr<MangleContext> MC;
681 MC.reset(Context.createMangleContext());
683 if (MC->shouldMangleDeclName(ND)) {
685 llvm::raw_svector_ostream Out(Buffer);
691 else if (
auto FD = dyn_cast<FunctionDecl>(ND)) {
695 MC->mangleName(GD, Out);
697 if (!Buffer.empty() && Buffer.front() ==
'\01')
698 return std::string(Buffer.substr(1));
699 return std::string(Buffer);
701 return std::string(ND->getIdentifier()->getName());
710 if (DC->isFileContext())
714 llvm::raw_svector_ostream Out(Buffer);
715 if (
auto *DCBlock = dyn_cast<BlockDecl>(DC))
718 else if (
auto *DCDecl = dyn_cast<Decl>(DC))
720 return std::string(Out.str());
722 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
723 const auto &LO = Context.getLangOpts();
724 bool IsFuncOrFunctionInNonMSVCCompatEnv =
726 IK == PredefinedIdentKind ::Function) &&
728 bool IsLFunctionInMSVCCommpatEnv =
730 bool IsFuncOrFunctionOrLFunctionOrFuncDName =
735 if ((ForceElaboratedPrinting &&
736 (IsFuncOrFunctionInNonMSVCCompatEnv || IsLFunctionInMSVCCommpatEnv)) ||
737 (!ForceElaboratedPrinting && IsFuncOrFunctionOrLFunctionOrFuncDName))
738 return FD->getNameAsString();
741 llvm::raw_svector_ostream Out(Name);
746 if (MD->isStatic() && !ForceElaboratedPrinting)
753 std::string remapPath(StringRef Path)
const override {
756 return std::string(p);
763 PrettyCallbacks PrettyCB(Context.getLangOpts());
768 llvm::raw_string_ostream POut(Proto);
777 const Type *Ty =
Decl->getType().getTypePtrOrNull();
783 if (FD->hasWrittenPrototype())
784 FT = dyn_cast<FunctionProtoType>(AFT);
789 case CC_C: POut <<
"__cdecl ";
break;
800 FD->printQualifiedName(POut, Policy);
804 return std::string(Name);
809 for (
unsigned i = 0, e =
Decl->getNumParams(); i != e; ++i) {
811 POut <<
Decl->getParamDecl(i)->getType().stream(Policy);
814 if (FT->isVariadic()) {
815 if (FD->getNumParams()) POut <<
", ";
819 !Context.getLangOpts().CPlusPlus) &&
820 !
Decl->getNumParams()) {
827 assert(FT &&
"We must have a written prototype in this case.");
830 if (FT->isVolatile())
842 while (isa_and_nonnull<NamedDecl>(Ctx)) {
844 = dyn_cast<ClassTemplateSpecializationDecl>(Ctx);
846 Specs.push_back(Spec);
850 std::string TemplateParams;
851 llvm::raw_string_ostream TOut(TemplateParams);
854 D->getSpecializedTemplate()->getTemplateParameters();
856 assert(Params->
size() == Args.
size());
857 for (
unsigned i = 0, numParams = Params->
size(); i != numParams; ++i) {
859 if (Param.empty())
continue;
860 TOut << Param <<
" = ";
869 = FD->getTemplateSpecializationInfo();
874 assert(Params->
size() == Args->
size());
875 for (
unsigned i = 0, e = Params->
size(); i != e; ++i) {
877 if (Param.empty())
continue;
878 TOut << Param <<
" = ";
879 Args->
get(i).
print(Policy, TOut,
true);
884 if (!TemplateParams.empty()) {
886 TemplateParams.resize(TemplateParams.size() - 2);
887 POut <<
" [" << TemplateParams <<
"]";
895 Proto =
"auto " + Proto;
896 else if (FT && FT->getReturnType()->getAs<DecltypeType>())
898 ->getAs<DecltypeType>()
906 return std::string(Name);
908 if (
const CapturedDecl *CD = dyn_cast<CapturedDecl>(CurrentDecl)) {
912 if (DC->isFunctionOrMethod() && (DC->getDeclKind() != Decl::Captured)) {
916 llvm_unreachable(
"CapturedDecl not inside a function or method");
918 if (
const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
920 llvm::raw_svector_ostream Out(Name);
921 Out << (MD->isInstanceMethod() ?
'-' :
'+');
930 dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
931 Out <<
'(' << *CID <<
')';
934 MD->getSelector().print(Out);
937 return std::string(Name);
948 const llvm::APInt &Val) {
953 unsigned NumWords = Val.getNumWords();
954 const uint64_t* Words = Val.getRawData();
956 pVal =
new (
C) uint64_t[NumWords];
957 std::copy(Words, Words + NumWords,
pVal);
958 }
else if (NumWords == 1)
964IntegerLiteral::IntegerLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
967 assert(
type->isIntegerType() &&
"Illegal type in IntegerLiteral");
968 assert(
V.getBitWidth() ==
C.getIntWidth(
type) &&
969 "Integer type is not the correct size for constant.");
977 return new (
C) IntegerLiteral(
C,
V,
type, l);
982 return new (
C) IntegerLiteral(
Empty);
985FixedPointLiteral::FixedPointLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
990 assert(
type->isFixedPointType() &&
"Illegal type in FixedPointLiteral");
991 assert(
V.getBitWidth() ==
C.getTypeInfo(
type).Width &&
992 "Fixed point type is not the correct size for constant.");
998 const llvm::APInt &
V,
1002 return new (
C) FixedPointLiteral(
C,
V,
type, l, Scale);
1007 return new (
C) FixedPointLiteral(
Empty);
1016 S, llvm::APSInt::getUnsigned(
getValue().getZExtValue()), Scale);
1017 return std::string(S);
1040 if (!Escaped.empty()) {
1041 OS <<
"'" << Escaped <<
"'";
1050 OS <<
"'" << (char)Val <<
"'";
1052 OS <<
"'\\x" << llvm::format(
"%02x", Val) <<
"'";
1053 else if (Val <= 0xFFFF)
1054 OS <<
"'\\u" << llvm::format(
"%04x", Val) <<
"'";
1056 OS <<
"'\\U" << llvm::format(
"%08x", Val) <<
"'";
1060FloatingLiteral::FloatingLiteral(
const ASTContext &
C,
const llvm::APFloat &
V,
1063 setSemantics(
V.getSemantics());
1071 setRawSemantics(llvm::APFloatBase::S_IEEEhalf);
1078 return new (
C) FloatingLiteral(
C,
V, isexact,
Type, L);
1083 return new (
C) FloatingLiteral(
C,
Empty);
1092 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
1094 return V.convertToDouble();
1099 unsigned CharByteWidth = 0;
1104 CharByteWidth =
Target.getCharWidth();
1107 CharByteWidth =
Target.getWCharWidth();
1110 CharByteWidth =
Target.getChar16Width();
1113 CharByteWidth =
Target.getChar32Width();
1116 return sizeof(char);
1118 assert((CharByteWidth & 7) == 0 &&
"Assumes character size is byte multiple");
1120 assert((CharByteWidth == 1 || CharByteWidth == 2 || CharByteWidth == 4) &&
1121 "The only supported character byte widths are 1,2 and 4!");
1122 return CharByteWidth;
1125StringLiteral::StringLiteral(
const ASTContext &Ctx, StringRef Str,
1130 unsigned Length = Str.size();
1137 "StringLiteral must be of constant array type!");
1138 unsigned CharByteWidth = mapCharByteWidth(Ctx.
getTargetInfo(), Kind);
1139 unsigned ByteLength = Str.size();
1140 assert((ByteLength % CharByteWidth == 0) &&
1141 "The size of the data must be a multiple of CharByteWidth!");
1146 switch (CharByteWidth) {
1148 Length = ByteLength;
1151 Length = ByteLength / 2;
1154 Length = ByteLength / 4;
1157 llvm_unreachable(
"Unsupported character width!");
1163 assert(!Pascal &&
"Can't make an unevaluated Pascal string");
1168 *getTrailingObjects<unsigned>() = Length;
1172 llvm::copy(Locs, getTrailingObjects<SourceLocation>());
1175 llvm::copy(Str, getTrailingObjects<char>());
1180StringLiteral::StringLiteral(EmptyShell
Empty,
unsigned NumConcatenated,
1181 unsigned Length,
unsigned CharByteWidth)
1185 *getTrailingObjects<unsigned>() = Length;
1192 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1193 1, Locs.size(), Str.size()),
1194 alignof(StringLiteral));
1195 return new (Mem) StringLiteral(Ctx, Str, Kind, Pascal, Ty, Locs);
1199 unsigned NumConcatenated,
1201 unsigned CharByteWidth) {
1202 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1203 1, NumConcatenated, Length * CharByteWidth),
1204 alignof(StringLiteral));
1206 StringLiteral(
EmptyShell(), NumConcatenated, Length, CharByteWidth);
1229 static const char Hex[] =
"0123456789ABCDEF";
1232 for (
unsigned I = 0, N =
getLength(); I != N; ++I) {
1235 if (Escaped.empty()) {
1241 Char >= 0xd800 && Char <= 0xdbff) {
1243 if (Trail >= 0xdc00 && Trail <= 0xdfff) {
1244 Char = 0x10000 + ((Char - 0xd800) << 10) + (Trail - 0xdc00);
1254 (Char >= 0xd800 && Char <= 0xdfff) || Char >= 0x110000) {
1258 while ((Char >> Shift) == 0)
1260 for (; Shift >= 0; Shift -= 4)
1261 OS << Hex[(Char >> Shift) & 15];
1268 << Hex[(Char >> 20) & 15]
1269 << Hex[(Char >> 16) & 15];
1272 OS << Hex[(Char >> 12) & 15]
1273 << Hex[(Char >> 8) & 15]
1274 << Hex[(Char >> 4) & 15]
1275 << Hex[(Char >> 0) & 15];
1281 if (LastSlashX + 1 == I) {
1283 case '0':
case '1':
case '2':
case '3':
case '4':
1284 case '5':
case '6':
case '7':
case '8':
case '9':
1285 case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
1286 case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
1291 assert(Char <= 0xff &&
1292 "Characters above 0xff should already have been handled.");
1298 << (char)(
'0' + ((Char >> 6) & 7))
1299 << (char)(
'0' + ((Char >> 3) & 7))
1300 << (char)(
'0' + ((Char >> 0) & 7));
1329 unsigned *StartTokenByteOffset)
const {
1338 "Only narrow string literals are currently supported");
1343 unsigned StringOffset = 0;
1345 TokNo = *StartToken;
1346 if (StartTokenByteOffset) {
1347 StringOffset = *StartTokenByteOffset;
1348 ByteNo -= StringOffset;
1362 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
1364 if (StartTokenByteOffset !=
nullptr)
1365 *StartTokenByteOffset = StringOffset;
1366 if (StartToken !=
nullptr)
1367 *StartToken = TokNo;
1368 return StrTokSpellingLoc;
1371 const char *StrData = Buffer.data()+LocInfo.second;
1374 Lexer TheLexer(
SM.getLocForStartOfFile(LocInfo.first), Features,
1375 Buffer.begin(), StrData, Buffer.end());
1384 if (ByteNo < TokNumBytes ||
1390 if (StartTokenByteOffset !=
nullptr)
1391 *StartTokenByteOffset = StringOffset;
1392 if (StartToken !=
nullptr)
1393 *StartToken = TokNo;
1398 StringOffset += TokNumBytes;
1400 ByteNo -= TokNumBytes;
1408#define UNARY_OPERATION(Name, Spelling) case UO_##Name: return Spelling;
1409#include "clang/AST/OperationKinds.def"
1411 llvm_unreachable(
"Unknown unary operator");
1417 default: llvm_unreachable(
"No unary operator for overloaded function");
1418 case OO_PlusPlus:
return Postfix ? UO_PostInc : UO_PreInc;
1419 case OO_MinusMinus:
return Postfix ? UO_PostDec : UO_PreDec;
1420 case OO_Amp:
return UO_AddrOf;
1421 case OO_Star:
return UO_Deref;
1422 case OO_Plus:
return UO_Plus;
1423 case OO_Minus:
return UO_Minus;
1424 case OO_Tilde:
return UO_Not;
1425 case OO_Exclaim:
return UO_LNot;
1426 case OO_Coawait:
return UO_Coawait;
1432 case UO_PostInc:
case UO_PreInc:
return OO_PlusPlus;
1433 case UO_PostDec:
case UO_PreDec:
return OO_MinusMinus;
1434 case UO_AddrOf:
return OO_Amp;
1435 case UO_Deref:
return OO_Star;
1436 case UO_Plus:
return OO_Plus;
1437 case UO_Minus:
return OO_Minus;
1438 case UO_Not:
return OO_Tilde;
1439 case UO_LNot:
return OO_Exclaim;
1440 case UO_Coawait:
return OO_Coawait;
1452 case Expr::CallExprClass:
1454 case Expr::CXXOperatorCallExprClass:
1456 case Expr::CXXMemberCallExprClass:
1458 case Expr::UserDefinedLiteralClass:
1460 case Expr::CUDAKernelCallExprClass:
1463 llvm_unreachable(
"unexpected class deriving from CallExpr!");
1471 "we assume CXXOperatorCallExpr is at most 32 bytes");
1478 NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1479 unsigned NumPreArgs = PreArgs.size();
1481 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1483 "This CallExpr subclass is too big or unsupported");
1488 for (
unsigned I = 0; I != NumPreArgs; ++I)
1490 for (
unsigned I = 0; I != Args.size(); ++I)
1492 for (
unsigned I = Args.size(); I != NumArgs; ++I)
1499 CallExprBits.ExplicitObjectMemFunUsingMemberSyntax =
false;
1510 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1513 CallExprBits.ExplicitObjectMemFunUsingMemberSyntax =
false;
1522 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1529 new (Mem)
CallExpr(CallExprClass, Fn, {}, Args, Ty,
VK,
1530 RParenLoc, FPFeatures, MinNumArgs,
UsesADL);
1531 E->updateTrailingSourceLoc();
1537 unsigned SizeOfTrailingObjects =
1553 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1554 return DRE->getDecl();
1556 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1557 return ME->getMemberDecl();
1561 while (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(CEE))
1566 if (
auto *BO = dyn_cast<BinaryOperator>(CEE)) {
1567 if (BO->isPtrMemOp()) {
1571 }
else if (
auto *UO = dyn_cast<UnaryOperator>(CEE)) {
1572 if (UO->getOpcode() == UO_Deref || UO->getOpcode() == UO_AddrOf ||
1573 UO->getOpcode() == UO_Plus) {
1581 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1582 return DRE->getDecl();
1583 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1584 return ME->getMemberDecl();
1585 if (
auto *BE = dyn_cast<BlockExpr>(CEE))
1586 return BE->getBlockDecl();
1594 return FDecl ? FDecl->getBuiltinID() : 0;
1605 QualType CalleeType = Callee->getType();
1619 assert(!CalleeType.
isNull());
1633std::pair<const NamedDecl *, const WarnUnusedResultAttr *>
1636 if (Callee !=
nullptr)
1637 if (
const auto *A = Callee->getAttr<WarnUnusedResultAttr>())
1638 return {
nullptr, A};
1643 if (
const auto *A = TD->getAttr<WarnUnusedResultAttr>())
1648 if (
const auto *A = TD->getDecl()->getAttr<WarnUnusedResultAttr>())
1649 return {TD->getDecl(), A};
1650 return {
nullptr,
nullptr};
1659 void *Mem =
C.Allocate(
1660 totalSizeToAlloc<OffsetOfNode, Expr *>(comps.size(), exprs.size()));
1662 return new (Mem) OffsetOfExpr(
C,
type, OperatorLoc, tsi, comps, exprs,
1667 unsigned numComps,
unsigned numExprs) {
1669 C.Allocate(totalSizeToAlloc<OffsetOfNode, Expr *>(numComps, numExprs));
1670 return new (Mem) OffsetOfExpr(numComps, numExprs);
1678 OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
1679 NumComps(comps.size()), NumExprs(exprs.size()) {
1680 for (
unsigned i = 0; i != comps.size(); ++i)
1682 for (
unsigned i = 0; i != exprs.size(); ++i)
1700 OpLoc(op), RParenLoc(rp) {
1701 assert(ExprKind <=
UETT_Last &&
"invalid enum value!");
1704 "UnaryExprOrTypeTraitExprBits.Kind overflow!");
1718 :
Expr(MemberExprClass, T,
VK, OK),
Base(
Base), MemberDecl(MemberDecl),
1719 MemberDNLoc(NameInfo.
getInfo()), MemberLoc(NameInfo.getLoc()) {
1725 FoundDecl.
getDecl() != MemberDecl ||
1728 TemplateArgs || TemplateKWLoc.
isValid();
1734 new (getTrailingObjects<NestedNameSpecifierLoc>())
1737 *getTrailingObjects<DeclAccessPair>() = FoundDecl;
1739 auto Deps = TemplateArgumentDependence::None;
1740 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1741 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1743 }
else if (TemplateKWLoc.
isValid()) {
1744 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1757 bool HasFoundDecl = FoundDecl.
getDecl() != MemberDecl ||
1758 FoundDecl.
getAccess() != MemberDecl->getAccess();
1759 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
1763 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1764 TemplateArgs ? TemplateArgs->
size() : 0);
1766 void *Mem =
C.Allocate(Size,
alignof(MemberExpr));
1767 return new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, QualifierLoc,
1768 TemplateKWLoc, MemberDecl, FoundDecl, NameInfo,
1769 TemplateArgs, T,
VK, OK, NOUR);
1773 bool HasQualifier,
bool HasFoundDecl,
1774 bool HasTemplateKWAndArgsInfo,
1775 unsigned NumTemplateArgs) {
1776 assert((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
1777 "template args but no template arg info?");
1781 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1783 void *Mem = Context.Allocate(Size,
alignof(MemberExpr));
1789 if (
getType()->isUndeducedType())
1805 return BaseStartLoc;
1817bool CastExpr::CastConsistency()
const {
1819 case CK_DerivedToBase:
1820 case CK_UncheckedDerivedToBase:
1821 case CK_DerivedToBaseMemberPointer:
1822 case CK_BaseToDerived:
1823 case CK_BaseToDerivedMemberPointer:
1824 assert(!
path_empty() &&
"Cast kind should have a base path!");
1827 case CK_CPointerToObjCPointerCast:
1828 assert(
getType()->isObjCObjectPointerType());
1830 goto CheckNoBasePath;
1832 case CK_BlockPointerToObjCPointerCast:
1833 assert(
getType()->isObjCObjectPointerType());
1835 goto CheckNoBasePath;
1837 case CK_ReinterpretMemberPointer:
1838 assert(
getType()->isMemberPointerType());
1840 goto CheckNoBasePath;
1846 if (!
getType()->isPointerType()) {
1847 assert(
getType()->isObjCObjectPointerType() ==
1849 assert(
getType()->isBlockPointerType() ==
1852 goto CheckNoBasePath;
1854 case CK_AnyPointerToBlockPointerCast:
1855 assert(
getType()->isBlockPointerType());
1858 goto CheckNoBasePath;
1860 case CK_CopyAndAutoreleaseBlockObject:
1861 assert(
getType()->isBlockPointerType());
1863 goto CheckNoBasePath;
1865 case CK_FunctionToPointerDecay:
1866 assert(
getType()->isPointerType());
1868 goto CheckNoBasePath;
1870 case CK_AddressSpaceConversion: {
1879 (!Ty.
isNull() && !SETy.isNull() &&
1881 goto CheckNoBasePath;
1886 case CK_ArrayToPointerDecay:
1887 case CK_NullToMemberPointer:
1888 case CK_NullToPointer:
1889 case CK_ConstructorConversion:
1890 case CK_IntegralToPointer:
1891 case CK_PointerToIntegral:
1893 case CK_VectorSplat:
1894 case CK_IntegralCast:
1895 case CK_BooleanToSignedIntegral:
1896 case CK_IntegralToFloating:
1897 case CK_FloatingToIntegral:
1898 case CK_FloatingCast:
1899 case CK_ObjCObjectLValueCast:
1900 case CK_FloatingRealToComplex:
1901 case CK_FloatingComplexToReal:
1902 case CK_FloatingComplexCast:
1903 case CK_FloatingComplexToIntegralComplex:
1904 case CK_IntegralRealToComplex:
1905 case CK_IntegralComplexToReal:
1906 case CK_IntegralComplexCast:
1907 case CK_IntegralComplexToFloatingComplex:
1908 case CK_ARCProduceObject:
1909 case CK_ARCConsumeObject:
1910 case CK_ARCReclaimReturnedObject:
1911 case CK_ARCExtendBlockObject:
1912 case CK_ZeroToOCLOpaqueType:
1913 case CK_IntToOCLSampler:
1914 case CK_FloatingToFixedPoint:
1915 case CK_FixedPointToFloating:
1916 case CK_FixedPointCast:
1917 case CK_FixedPointToIntegral:
1918 case CK_IntegralToFixedPoint:
1921 goto CheckNoBasePath;
1924 case CK_LValueToRValue:
1926 case CK_AtomicToNonAtomic:
1927 case CK_NonAtomicToAtomic:
1928 case CK_PointerToBoolean:
1929 case CK_IntegralToBoolean:
1930 case CK_FloatingToBoolean:
1931 case CK_MemberPointerToBoolean:
1932 case CK_FloatingComplexToBoolean:
1933 case CK_IntegralComplexToBoolean:
1934 case CK_LValueBitCast:
1935 case CK_LValueToRValueBitCast:
1936 case CK_UserDefinedConversion:
1937 case CK_BuiltinFnToFnPtr:
1938 case CK_FixedPointToBoolean:
1939 case CK_HLSLArrayRValue:
1940 case CK_HLSLVectorTruncation:
1941 case CK_HLSLMatrixTruncation:
1942 case CK_HLSLElementwiseCast:
1943 case CK_HLSLAggregateSplatCast:
1945 assert(
path_empty() &&
"Cast kind should not have a base path!");
1953#define CAST_OPERATION(Name) case CK_##Name: return #Name;
1954#include "clang/AST/OperationKinds.def"
1956 llvm_unreachable(
"Unhandled cast kind!");
1962static Expr *ignoreImplicitSemaNodes(
Expr *E) {
1963 if (
auto *Materialize = dyn_cast<MaterializeTemporaryExpr>(E))
1964 return Materialize->getSubExpr();
1966 if (
auto *Binder = dyn_cast<CXXBindTemporaryExpr>(E))
1967 return Binder->getSubExpr();
1969 if (
auto *
Full = dyn_cast<FullExpr>(E))
1970 return Full->getSubExpr();
1972 if (
auto *CPLIE = dyn_cast<CXXParenListInitExpr>(E);
1973 CPLIE && CPLIE->getInitExprs().size() == 1)
1974 return CPLIE->getInitExprs()[0];
1981 const Expr *SubExpr =
nullptr;
1983 for (
const CastExpr *E =
this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
1988 if (E->getCastKind() == CK_ConstructorConversion) {
1990 ignoreImplicitSemaNodes);
1991 }
else if (E->getCastKind() == CK_UserDefinedConversion) {
1993 "Unexpected SubExpr for CK_UserDefinedConversion.");
1994 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
1995 SubExpr = MCE->getImplicitObjectArgument();
1999 return const_cast<Expr *
>(SubExpr);
2003 const Expr *SubExpr =
nullptr;
2005 for (
const CastExpr *E =
this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
2008 if (E->getCastKind() == CK_ConstructorConversion)
2011 if (E->getCastKind() == CK_UserDefinedConversion) {
2012 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2013 return MCE->getMethodDecl();
2022#define ABSTRACT_STMT(x)
2023#define CASTEXPR(Type, Base) \
2024 case Stmt::Type##Class: \
2025 return static_cast<Type *>(this) \
2026 ->getTrailingObjectsNonStrict<CXXBaseSpecifier *>();
2027#define STMT(Type, Base)
2028#include "clang/AST/StmtNodes.inc"
2030 llvm_unreachable(
"non-cast expressions not possible here");
2044 Field != FieldEnd; ++Field) {
2046 !Field->isUnnamedBitField()) {
2056 case ImplicitCastExprClass:
2058 ->getTrailingObjects<FPOptionsOverride>();
2059 case CStyleCastExprClass:
2061 ->getTrailingObjects<FPOptionsOverride>();
2062 case CXXFunctionalCastExprClass:
2064 ->getTrailingObjects<FPOptionsOverride>();
2065 case CXXStaticCastExprClass:
2067 ->getTrailingObjects<FPOptionsOverride>();
2069 llvm_unreachable(
"Cast does not have FPFeatures");
2078 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2080 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2084 assert((Kind != CK_LValueToRValue ||
2085 !(T->isNullPtrType() || T->getAsCXXRecordDecl())) &&
2086 "invalid type for lvalue-to-rvalue conversion");
2087 ImplicitCastExpr *E =
2088 new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, FPO,
VK);
2090 llvm::uninitialized_copy(*BasePath,
2097 bool HasFPFeatures) {
2099 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2100 PathSize, HasFPFeatures));
2101 return new (Buffer) ImplicitCastExpr(
EmptyShell(), PathSize, HasFPFeatures);
2110 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2112 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2115 new (Buffer) CStyleCastExpr(T,
VK, K, Op, PathSize, FPO, WrittenTy, L, R);
2117 llvm::uninitialized_copy(*BasePath,
2124 bool HasFPFeatures) {
2126 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2127 PathSize, HasFPFeatures));
2128 return new (Buffer) CStyleCastExpr(
EmptyShell(), PathSize, HasFPFeatures);
2135#define BINARY_OPERATION(Name, Spelling) case BO_##Name: return Spelling;
2136#include "clang/AST/OperationKinds.def"
2138 llvm_unreachable(
"Invalid OpCode!");
2144 default: llvm_unreachable(
"Not an overloadable binary operator");
2145 case OO_Plus:
return BO_Add;
2146 case OO_Minus:
return BO_Sub;
2147 case OO_Star:
return BO_Mul;
2148 case OO_Slash:
return BO_Div;
2149 case OO_Percent:
return BO_Rem;
2150 case OO_Caret:
return BO_Xor;
2151 case OO_Amp:
return BO_And;
2152 case OO_Pipe:
return BO_Or;
2153 case OO_Equal:
return BO_Assign;
2154 case OO_Spaceship:
return BO_Cmp;
2155 case OO_Less:
return BO_LT;
2156 case OO_Greater:
return BO_GT;
2157 case OO_PlusEqual:
return BO_AddAssign;
2158 case OO_MinusEqual:
return BO_SubAssign;
2159 case OO_StarEqual:
return BO_MulAssign;
2160 case OO_SlashEqual:
return BO_DivAssign;
2161 case OO_PercentEqual:
return BO_RemAssign;
2162 case OO_CaretEqual:
return BO_XorAssign;
2163 case OO_AmpEqual:
return BO_AndAssign;
2164 case OO_PipeEqual:
return BO_OrAssign;
2165 case OO_LessLess:
return BO_Shl;
2166 case OO_GreaterGreater:
return BO_Shr;
2167 case OO_LessLessEqual:
return BO_ShlAssign;
2168 case OO_GreaterGreaterEqual:
return BO_ShrAssign;
2169 case OO_EqualEqual:
return BO_EQ;
2170 case OO_ExclaimEqual:
return BO_NE;
2171 case OO_LessEqual:
return BO_LE;
2172 case OO_GreaterEqual:
return BO_GE;
2173 case OO_AmpAmp:
return BO_LAnd;
2174 case OO_PipePipe:
return BO_LOr;
2175 case OO_Comma:
return BO_Comma;
2176 case OO_ArrowStar:
return BO_PtrMemI;
2183 OO_Star, OO_Slash, OO_Percent,
2185 OO_LessLess, OO_GreaterGreater,
2187 OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
2188 OO_EqualEqual, OO_ExclaimEqual,
2194 OO_Equal, OO_StarEqual,
2195 OO_SlashEqual, OO_PercentEqual,
2196 OO_PlusEqual, OO_MinusEqual,
2197 OO_LessLessEqual, OO_GreaterGreaterEqual,
2198 OO_AmpEqual, OO_CaretEqual,
2202 return OverOps[Opc];
2214 if (LHS->getType()->isPointerType()) {
2215 if (!RHS->getType()->isIntegerType())
2218 }
else if (RHS->getType()->isPointerType()) {
2219 if (!LHS->getType()->isIntegerType())
2231 if (!Select->getCond()->EvaluateAsBooleanCondition(
EvalResult, Ctx))
2233 PExp =
EvalResult ? Select->getTrueExpr() : Select->getFalseExpr();
2254 BuiltinLoc(BLoc), RParenLoc(RParenLoc), ParentContext(ParentContext) {
2258 ? ExprDependence::ValueInstantiation
2259 : ExprDependence::None);
2265 return "__builtin_FILE";
2267 return "__builtin_FILE_NAME";
2269 return "__builtin_FUNCTION";
2271 return "__builtin_FUNCSIG";
2273 return "__builtin_LINE";
2275 return "__builtin_COLUMN";
2277 return "__builtin_source_location";
2279 llvm_unreachable(
"unexpected IdentKind!");
2283 const Expr *DefaultExpr)
const {
2287 if (
const auto *DIE = dyn_cast_if_present<CXXDefaultInitExpr>(DefaultExpr)) {
2288 Loc = DIE->getUsedLocation();
2289 Context = DIE->getUsedContext();
2290 }
else if (
const auto *DAE =
2291 dyn_cast_if_present<CXXDefaultArgExpr>(DefaultExpr)) {
2292 Loc = DAE->getUsedLocation();
2293 Context = DAE->getUsedContext();
2304 if (
const auto *D = dyn_cast<CXXMethodDecl>(Context);
2306 Context = D->getParent()->getParent();
2311 auto MakeStringLiteral = [&](StringRef Tmp) {
2315 LValuePathEntry Path[1] = {LValuePathEntry::ArrayIndex(0)};
2326 return MakeStringLiteral(
FileName);
2332 return MakeStringLiteral(Path);
2336 const auto *CurDecl = dyn_cast<Decl>(Context);
2340 return MakeStringLiteral(
2360 StringRef Name = F->getName();
2361 if (Name ==
"_M_file_name") {
2365 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(Path);
2366 }
else if (Name ==
"_M_function_name") {
2369 const auto *CurDecl = dyn_cast<Decl>(Context);
2370 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(
2375 }
else if (Name ==
"_M_line") {
2377 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2378 }
else if (Name ==
"_M_column") {
2380 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2391 llvm_unreachable(
"unhandled case");
2396 unsigned NumOfElements)
2398 EmbedKeywordLoc(Loc), Ctx(&Ctx), Data(Data), Begin(Begin),
2399 NumOfElements(NumOfElements) {
2402 Ctx, llvm::APInt::getZero(Ctx.getTypeSize(
getType())),
getType(), Loc);
2403 assert(
getType()->isSignedIntegerType() &&
"IntTy should be signed");
2409 InitExprs(
C, initExprs.size()), LBraceLoc(lbraceloc),
2412 InitExprs.insert(
C, InitExprs.end(), initExprs.begin(), initExprs.end());
2418 if (NumInits > InitExprs.size())
2419 InitExprs.reserve(
C, NumInits);
2423 InitExprs.resize(
C, NumInits,
nullptr);
2427 if (
Init >= InitExprs.size()) {
2428 InitExprs.insert(
C, InitExprs.end(),
Init - InitExprs.size() + 1,
nullptr);
2440 ArrayFillerOrUnionFieldInit = filler;
2443 for (
unsigned i = 0, e =
getNumInits(); i != e; ++i)
2444 if (
inits[i] ==
nullptr)
2458 Init =
Init->IgnoreParenImpCasts();
2463 assert(
isSemanticForm() &&
"syntactic form never semantically transparent");
2467 assert(
getNumInits() == 1 &&
"multiple inits in glvalue init list");
2486 assert(
isSyntacticForm() &&
"only test syntactic form as zero initializer");
2493 return Lit && Lit->
getValue() == 0;
2498 return SyntacticForm->getBeginLoc();
2503 E = InitExprs.end();
2506 Beg = S->getBeginLoc();
2516 return SyntacticForm->getEndLoc();
2520 for (
Stmt *S : llvm::reverse(InitExprs)) {
2522 End = S->getEndLoc();
2539 return TheBlock->getCaretLocation();
2558 const auto *Ref = dyn_cast<DeclRefExpr>(Unwrapped);
2562 return isa_and_nonnull<DecompositionDecl>(Ref->getDecl());
2589 if (
auto *UO = dyn_cast<UnaryOperator>(E))
2590 if (UO->getOpcode() == UO_Deref)
2593 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
2595 if (BO->isPtrMemOp())
2599 if (BO->getOpcode() == BO_Comma)
2600 return BO->getRHS()->isReadIfDiscardedInCPlusPlus11();
2605 if (
auto *CO = dyn_cast<ConditionalOperator>(E))
2606 return CO->getTrueExpr()->isReadIfDiscardedInCPlusPlus11() &&
2607 CO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2610 dyn_cast<BinaryConditionalOperator>(E)) {
2611 if (
auto *OVE = dyn_cast<OpaqueValueExpr>(BCO->getTrueExpr()))
2612 return OVE->getSourceExpr()->isReadIfDiscardedInCPlusPlus11() &&
2613 BCO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2619 if (
const auto *POE = dyn_cast<PseudoObjectExpr>(E)) {
2647 case ParenExprClass:
2650 case GenericSelectionExprClass:
2653 case CoawaitExprClass:
2654 case CoyieldExprClass:
2657 case ChooseExprClass:
2660 case UnaryOperatorClass: {
2694 case BinaryOperatorClass: {
2706 if (IE->getValue() == 0)
2725 case CompoundAssignOperatorClass:
2726 case VAArgExprClass:
2727 case AtomicExprClass:
2730 case ConditionalOperatorClass: {
2735 return Exp->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx) &&
2736 Exp->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2738 case BinaryConditionalOperatorClass: {
2740 return Exp->getFalseExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2743 case MemberExprClass:
2750 case ArraySubscriptExprClass:
2757 case CXXOperatorCallExprClass: {
2769 case OO_ExclaimEqual:
2772 case OO_GreaterEqual:
2787 case CXXMemberCallExprClass:
2788 case UserDefinedLiteralClass: {
2812 case UnresolvedLookupExprClass:
2813 case CXXUnresolvedConstructExprClass:
2814 case RecoveryExprClass:
2817 case CXXTemporaryObjectExprClass:
2818 case CXXConstructExprClass: {
2823 CE->hasUnusedResultAttr(Ctx)) {
2828 if (
unsigned NumArgs = CE->getNumArgs())
2830 CE->getArg(NumArgs - 1)->getEndLoc());
2836 case ObjCMessageExprClass: {
2857 case ObjCPropertyRefExprClass:
2858 case ObjCSubscriptRefExprClass:
2864 case PseudoObjectExprClass: {
2869 POE->getSyntacticForm())) {
2877 if (
auto *BO = dyn_cast<BinaryOperator>(POE->getSyntacticForm()))
2878 if (BO->isAssignmentOp())
2880 if (
auto *UO = dyn_cast<UnaryOperator>(POE->getSyntacticForm()))
2881 if (UO->isIncrementDecrementOp())
2886 return Result &&
Result->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2889 case StmtExprClass: {
2900 if (
const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
2911 case CXXFunctionalCastExprClass:
2912 case CStyleCastExprClass: {
2926 if (
auto *DRE = dyn_cast<DeclRefExpr>(SubE))
2927 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2928 if (!VD->isExternallyVisible())
2944 if (CE->
getCastKind() == CK_ConstructorConversion)
2951 dyn_cast<CXXFunctionalCastExpr>(
this)) {
2952 Loc = CXXCE->getBeginLoc();
2953 R1 = CXXCE->getSubExpr()->getSourceRange();
2961 case ImplicitCastExprClass: {
2971 case CXXDefaultArgExprClass:
2974 case CXXDefaultInitExprClass:
2978 case CXXNewExprClass:
2981 case CXXDeleteExprClass:
2983 case MaterializeTemporaryExprClass:
2986 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2987 case CXXBindTemporaryExprClass:
2989 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2990 case ExprWithCleanupsClass:
2992 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2993 case OpaqueValueExprClass:
2995 WarnE, Loc, R1, R2, Ctx);
3006 case ObjCIvarRefExprClass:
3008 case Expr::UnaryOperatorClass:
3010 case ImplicitCastExprClass:
3012 case MaterializeTemporaryExprClass:
3015 case CStyleCastExprClass:
3017 case DeclRefExprClass: {
3020 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3021 if (VD->hasGlobalStorage())
3031 case MemberExprClass: {
3035 case ArraySubscriptExprClass:
3047 assert(
expr->hasPlaceholderType(BuiltinType::BoundMember));
3056 return mem->getMemberDecl()->getType();
3062 assert(
type->isFunctionType());
3100 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(
this)) {
3101 if (isa_and_nonnull<CXXConversionDecl>(MCE->getMethodDecl()))
3102 return MCE->getImplicitObjectArgument();
3118 auto IgnoreNoopCastsSingleStep = [&Ctx](
Expr *E) {
3119 if (
auto *CE = dyn_cast<CastExpr>(E)) {
3122 Expr *SubExpr = CE->getSubExpr();
3123 bool IsIdentityCast =
3125 bool IsSameWidthCast = (E->
getType()->isPointerType() ||
3127 (SubExpr->
getType()->isPointerType() ||
3132 if (IsIdentityCast || IsSameWidthCast)
3134 }
else if (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E))
3135 return NTTP->getReplacement();
3140 IgnoreNoopCastsSingleStep);
3145 if (
auto *Cast = dyn_cast<CXXFunctionalCastExpr>(E)) {
3146 auto *SE = Cast->getSubExpr();
3151 if (
auto *
C = dyn_cast<CXXConstructExpr>(E)) {
3152 auto NumArgs =
C->getNumArgs();
3155 Expr *A =
C->getArg(0);
3162 auto IgnoreImplicitMemberCallSingleStep = [](
Expr *E) {
3163 if (
auto *
C = dyn_cast<CXXMemberCallExpr>(E)) {
3164 Expr *ExprNode =
C->getImplicitObjectArgument();
3168 if (
auto *PE = dyn_cast<ParenExpr>(ExprNode)) {
3169 if (PE->getSourceRange() ==
C->getSourceRange()) {
3182 auto IgnoreImplicitCallSingleStep = [](
Expr *E) {
3183 auto *
C = dyn_cast<CallExpr>(E);
3190 unsigned NumArgs =
C->getNumArgs();
3194 Expr *A =
C->getArg(0);
3211 IgnoreImplicitMemberCallSingleStep, IgnoreImplicitCallSingleStep);
3215 const Expr *E =
this;
3217 E = M->getSubExpr();
3220 E = ICE->getSubExprAsWritten();
3229 E = M->getSubExpr();
3232 if (ICE->getCastKind() == CK_NoOp)
3233 E = ICE->getSubExpr();
3239 E = BE->getSubExpr();
3242 if (ICE->getCastKind() == CK_NoOp)
3243 E = ICE->getSubExpr();
3254 if (!
C.hasSameUnqualifiedType(
getType(),
C.getCanonicalTagType(TempTy)))
3270 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E)) {
3271 switch (ICE->getCastKind()) {
3272 case CK_DerivedToBase:
3273 case CK_UncheckedDerivedToBase:
3284 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
3285 if (BO->isPtrMemOp())
3296 const Expr *E =
this;
3301 E =
Paren->getSubExpr();
3306 if (ICE->getCastKind() == CK_NoOp ||
3307 ICE->getCastKind() == CK_LValueToRValue ||
3308 ICE->getCastKind() == CK_DerivedToBase ||
3309 ICE->getCastKind() == CK_UncheckedDerivedToBase) {
3310 E = ICE->getSubExpr();
3315 if (
const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) {
3316 if (UnOp->getOpcode() == UO_Extension) {
3317 E = UnOp->getSubExpr();
3323 = dyn_cast<MaterializeTemporaryExpr>(E)) {
3324 E = M->getSubExpr();
3332 return This->isImplicit();
3340 for (
unsigned I = 0; I < Exprs.size(); ++I)
3348 const Expr **Culprit)
const {
3350 "Expression evaluator can't be called on a dependent expression.");
3362 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
this))
3363 return EWC->getSubExpr()->isConstantInitializer(Ctx,
true, Culprit);
3364 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
this))
3365 return MTE->getSubExpr()->isConstantInitializer(Ctx,
false, Culprit);
3376 case Stmt::ExprWithCleanupsClass:
3378 Ctx, IsForRef, Culprit);
3379 case StringLiteralClass:
3380 case ObjCEncodeExprClass:
3382 case CXXTemporaryObjectExprClass:
3383 case CXXConstructExprClass: {
3392 assert(CE->
getNumArgs() == 1 &&
"trivial ctor with > 1 argument");
3398 case ConstantExprClass: {
3404 case CompoundLiteralExprClass: {
3411 case DesignatedInitUpdateExprClass: {
3416 case InitListExprClass: {
3424 assert(ILE->
isSemanticForm() &&
"InitListExpr must be in semantic form");
3431 for (
unsigned i = 0; i < numInits; i++) {
3439 unsigned ElementNo = 0;
3444 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3445 for (
unsigned i = 0, e = CXXRD->getNumBases(); i < e; i++) {
3446 if (ElementNo < ILE->getNumInits()) {
3454 for (
const auto *Field : RD->fields()) {
3460 if (Field->isUnnamedBitField())
3463 if (ElementNo < ILE->getNumInits()) {
3465 if (Field->isBitField()) {
3474 bool RefType = Field->getType()->isReferenceType();
3485 case ImplicitValueInitExprClass:
3486 case NoInitExprClass:
3488 case ParenExprClass:
3490 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3491 case GenericSelectionExprClass:
3493 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3494 case ChooseExprClass:
3501 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3502 case UnaryOperatorClass: {
3508 case ObjCBoxedExprClass: {
3514 case ObjCArrayLiteralClass: {
3520 case ObjCDictionaryLiteralClass: {
3526 case PackIndexingExprClass: {
3529 ->isConstantInitializer(Ctx,
false, Culprit);
3531 case CXXFunctionalCastExprClass:
3532 case CXXStaticCastExprClass:
3533 case ImplicitCastExprClass:
3534 case CStyleCastExprClass:
3535 case ObjCBridgedCastExprClass:
3536 case CXXDynamicCastExprClass:
3537 case CXXReinterpretCastExprClass:
3538 case CXXAddrspaceCastExprClass:
3539 case CXXConstCastExprClass: {
3555 case MaterializeTemporaryExprClass:
3558 ->isConstantInitializer(Ctx,
false, Culprit);
3560 case SubstNonTypeTemplateParmExprClass:
3562 ->isConstantInitializer(Ctx,
false, Culprit);
3563 case CXXDefaultArgExprClass:
3565 ->isConstantInitializer(Ctx,
false, Culprit);
3566 case CXXDefaultInitExprClass:
3568 ->isConstantInitializer(Ctx,
false, Culprit);
3582 if (BuiltinID != Builtin::BI__assume &&
3583 BuiltinID != Builtin::BI__builtin_assume)
3594 return DirectCallee->getAttr<AllocSizeAttr>();
3596 return IndirectCallee->getAttr<AllocSizeAttr>();
3600std::optional<llvm::APInt>
3604 assert(AllocSize && AllocSize->getElemSizeParam().isValid());
3605 unsigned SizeArgNo = AllocSize->getElemSizeParam().getASTIndex();
3608 return std::nullopt;
3610 auto EvaluateAsSizeT = [&](
const Expr *E, llvm::APSInt &Into) {
3616 if (Into.isNegative() || !Into.isIntN(BitsInSizeT))
3618 Into = Into.zext(BitsInSizeT);
3622 llvm::APSInt SizeOfElem;
3623 if (!EvaluateAsSizeT(
getArg(SizeArgNo), SizeOfElem))
3624 return std::nullopt;
3626 if (!AllocSize->getNumElemsParam().isValid())
3629 llvm::APSInt NumberOfElems;
3630 unsigned NumArgNo = AllocSize->getNumElemsParam().getASTIndex();
3631 if (!EvaluateAsSizeT(
getArg(NumArgNo), NumberOfElems))
3632 return std::nullopt;
3635 llvm::APInt BytesAvailable = SizeOfElem.umul_ov(NumberOfElems, Overflow);
3637 return std::nullopt;
3639 return BytesAvailable;
3650 const bool IncludePossibleEffects;
3651 bool HasSideEffects;
3654 explicit SideEffectFinder(
const ASTContext &Context,
bool IncludePossible)
3655 : Inherited(Context),
3656 IncludePossibleEffects(IncludePossible), HasSideEffects(
false) { }
3658 bool hasSideEffects()
const {
return HasSideEffects; }
3660 void VisitDecl(
const Decl *D) {
3666 if (
auto *VD = dyn_cast<VarDecl>(D)) {
3668 if (IncludePossibleEffects && VD->isThisDeclarationADefinition() &&
3669 VD->needsDestruction(Context))
3670 HasSideEffects =
true;
3674 void VisitDeclStmt(
const DeclStmt *DS) {
3675 for (
auto *D : DS->
decls())
3677 Inherited::VisitDeclStmt(DS);
3680 void VisitExpr(
const Expr *E) {
3681 if (!HasSideEffects &&
3683 HasSideEffects =
true;
3689 bool IncludePossibleEffects)
const {
3693 if (!IncludePossibleEffects &&
getExprLoc().isMacroID())
3698#define ABSTRACT_STMT(Type)
3699#define STMT(Type, Base) case Type##Class:
3700#define EXPR(Type, Base)
3701#include "clang/AST/StmtNodes.inc"
3702 llvm_unreachable(
"unexpected Expr kind");
3704 case DependentScopeDeclRefExprClass:
3705 case CXXUnresolvedConstructExprClass:
3706 case CXXDependentScopeMemberExprClass:
3707 case UnresolvedLookupExprClass:
3708 case UnresolvedMemberExprClass:
3709 case PackExpansionExprClass:
3710 case SubstNonTypeTemplateParmPackExprClass:
3711 case FunctionParmPackExprClass:
3712 case RecoveryExprClass:
3713 case CXXFoldExprClass:
3715 return IncludePossibleEffects;
3717 case DeclRefExprClass:
3718 case ObjCIvarRefExprClass:
3719 case PredefinedExprClass:
3720 case IntegerLiteralClass:
3721 case FixedPointLiteralClass:
3722 case FloatingLiteralClass:
3723 case ImaginaryLiteralClass:
3724 case StringLiteralClass:
3725 case CharacterLiteralClass:
3726 case OffsetOfExprClass:
3727 case ImplicitValueInitExprClass:
3728 case UnaryExprOrTypeTraitExprClass:
3729 case AddrLabelExprClass:
3730 case GNUNullExprClass:
3731 case ArrayInitIndexExprClass:
3732 case NoInitExprClass:
3733 case CXXBoolLiteralExprClass:
3734 case CXXNullPtrLiteralExprClass:
3735 case CXXThisExprClass:
3736 case CXXScalarValueInitExprClass:
3737 case TypeTraitExprClass:
3738 case ArrayTypeTraitExprClass:
3739 case ExpressionTraitExprClass:
3740 case CXXNoexceptExprClass:
3741 case SizeOfPackExprClass:
3742 case ObjCStringLiteralClass:
3743 case ObjCEncodeExprClass:
3744 case ObjCBoolLiteralExprClass:
3745 case ObjCAvailabilityCheckExprClass:
3746 case CXXUuidofExprClass:
3747 case OpaqueValueExprClass:
3748 case SourceLocExprClass:
3749 case EmbedExprClass:
3750 case ConceptSpecializationExprClass:
3751 case RequiresExprClass:
3752 case SYCLUniqueStableNameExprClass:
3753 case PackIndexingExprClass:
3754 case HLSLOutArgExprClass:
3755 case OpenACCAsteriskSizeExprClass:
3756 case CXXReflectExprClass:
3760 case ConstantExprClass:
3763 Ctx, IncludePossibleEffects);
3766 case CXXOperatorCallExprClass:
3767 case CXXMemberCallExprClass:
3768 case CUDAKernelCallExprClass:
3769 case UserDefinedLiteralClass: {
3774 bool IsPure = FD && (FD->
hasAttr<ConstAttr>() || FD->
hasAttr<PureAttr>());
3775 if (IsPure || !IncludePossibleEffects)
3780 case BlockExprClass:
3781 case CXXBindTemporaryExprClass:
3782 if (!IncludePossibleEffects)
3786 case MSPropertyRefExprClass:
3787 case MSPropertySubscriptExprClass:
3788 case CompoundAssignOperatorClass:
3789 case VAArgExprClass:
3790 case AtomicExprClass:
3791 case CXXThrowExprClass:
3792 case CXXNewExprClass:
3793 case CXXDeleteExprClass:
3794 case CoawaitExprClass:
3795 case DependentCoawaitExprClass:
3796 case CoyieldExprClass:
3800 case StmtExprClass: {
3802 SideEffectFinder Finder(Ctx, IncludePossibleEffects);
3804 return Finder.hasSideEffects();
3807 case ExprWithCleanupsClass:
3808 if (IncludePossibleEffects)
3813 case ParenExprClass:
3814 case ArraySubscriptExprClass:
3815 case MatrixSingleSubscriptExprClass:
3816 case MatrixSubscriptExprClass:
3817 case ArraySectionExprClass:
3818 case OMPArrayShapingExprClass:
3819 case OMPIteratorExprClass:
3820 case MemberExprClass:
3821 case ConditionalOperatorClass:
3822 case BinaryConditionalOperatorClass:
3823 case CompoundLiteralExprClass:
3824 case ExtVectorElementExprClass:
3825 case MatrixElementExprClass:
3826 case DesignatedInitExprClass:
3827 case DesignatedInitUpdateExprClass:
3828 case ArrayInitLoopExprClass:
3829 case ParenListExprClass:
3830 case CXXPseudoDestructorExprClass:
3831 case CXXRewrittenBinaryOperatorClass:
3832 case CXXStdInitializerListExprClass:
3833 case SubstNonTypeTemplateParmExprClass:
3834 case MaterializeTemporaryExprClass:
3835 case ShuffleVectorExprClass:
3836 case ConvertVectorExprClass:
3837 case AsTypeExprClass:
3838 case CXXParenListInitExprClass:
3842 case UnaryOperatorClass:
3847 case BinaryOperatorClass:
3852 case InitListExprClass:
3859 case GenericSelectionExprClass:
3861 Ctx, IncludePossibleEffects);
3863 case ChooseExprClass:
3865 Ctx, IncludePossibleEffects);
3867 case CXXDefaultArgExprClass:
3869 Ctx, IncludePossibleEffects);
3871 case CXXDefaultInitExprClass: {
3879 case CXXDynamicCastExprClass: {
3887 case ImplicitCastExprClass:
3888 case CStyleCastExprClass:
3889 case CXXStaticCastExprClass:
3890 case CXXReinterpretCastExprClass:
3891 case CXXConstCastExprClass:
3892 case CXXAddrspaceCastExprClass:
3893 case CXXFunctionalCastExprClass:
3894 case BuiltinBitCastExprClass: {
3899 if (!IncludePossibleEffects)
3909 case CXXTypeidExprClass: {
3911 if (!TE->isPotentiallyEvaluated())
3916 if (IncludePossibleEffects && TE->hasNullCheck())
3922 case CXXConstructExprClass:
3923 case CXXTemporaryObjectExprClass: {
3932 case CXXInheritedCtorInitExprClass: {
3934 if (!ICIE->getConstructor()->isTrivial() && IncludePossibleEffects)
3939 case LambdaExprClass: {
3941 for (
Expr *E : LE->capture_inits())
3947 case PseudoObjectExprClass: {
3954 const Expr *Subexpr = *I;
3956 Subexpr = OVE->getSourceExpr();
3963 case ObjCBoxedExprClass:
3964 case ObjCArrayLiteralClass:
3965 case ObjCDictionaryLiteralClass:
3966 case ObjCSelectorExprClass:
3967 case ObjCProtocolExprClass:
3968 case ObjCIsaExprClass:
3969 case ObjCIndirectCopyRestoreExprClass:
3970 case ObjCSubscriptRefExprClass:
3971 case ObjCBridgedCastExprClass:
3972 case ObjCMessageExprClass:
3973 case ObjCPropertyRefExprClass:
3975 if (IncludePossibleEffects)
3990 if (
auto Call = dyn_cast<CallExpr>(
this))
3991 return Call->getFPFeaturesInEffect(LO);
3992 if (
auto UO = dyn_cast<UnaryOperator>(
this))
3993 return UO->getFPFeaturesInEffect(LO);
3994 if (
auto BO = dyn_cast<BinaryOperator>(
this))
3995 return BO->getFPFeaturesInEffect(LO);
3996 if (
auto Cast = dyn_cast<CastExpr>(
this))
3997 return Cast->getFPFeaturesInEffect(LO);
3998 if (
auto ConvertVector = dyn_cast<ConvertVectorExpr>(
this))
3999 return ConvertVector->getFPFeaturesInEffect(LO);
4012 explicit NonTrivialCallFinder(
const ASTContext &Context)
4013 : Inherited(Context), NonTrivial(
false) { }
4015 bool hasNonTrivialCall()
const {
return NonTrivial; }
4017 void VisitCallExpr(
const CallExpr *E) {
4018 if (
const CXXMethodDecl *
Method
4019 = dyn_cast_or_null<const CXXMethodDecl>(E->
getCalleeDecl())) {
4020 if (
Method->isTrivial()) {
4022 Inherited::VisitStmt(E);
4030 void VisitCXXConstructExpr(
const CXXConstructExpr *E) {
4033 Inherited::VisitStmt(E);
4040 void VisitCXXBindTemporaryExpr(
const CXXBindTemporaryExpr *E) {
4043 if (
const CXXDestructorDecl *DtorDecl =
4045 if (DtorDecl->isTrivial()) {
4046 Inherited::VisitStmt(E);
4057 NonTrivialCallFinder Finder(Ctx);
4059 return Finder.hasNonTrivialCall();
4077 llvm_unreachable(
"Unexpected value dependent expression!");
4105 CE->getSubExpr()->getType()->isIntegerType())
4106 return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4109 }
else if (
const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(
this)) {
4111 return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4112 }
else if (
const ParenExpr *PE = dyn_cast<ParenExpr>(
this)) {
4115 return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4117 dyn_cast<GenericSelectionExpr>(
this)) {
4118 if (GE->isResultDependent())
4120 return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC);
4121 }
else if (
const ChooseExpr *CE = dyn_cast<ChooseExpr>(
this)) {
4122 if (CE->isConditionDependent())
4124 return CE->getChosenSubExpr()->isNullPointerConstant(Ctx, NPC);
4126 = dyn_cast<CXXDefaultArgExpr>(
this)) {
4128 return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
4130 = dyn_cast<CXXDefaultInitExpr>(
this)) {
4132 return DefaultInit->getExpr()->isNullPointerConstant(Ctx, NPC);
4137 = dyn_cast<MaterializeTemporaryExpr>(
this)) {
4138 return M->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4139 }
else if (
const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(
this)) {
4140 if (
const Expr *Source = OVE->getSourceExpr())
4141 return Source->isNullPointerConstant(Ctx, NPC);
4150 if (
getType()->isNullPtrType())
4153 if (
const RecordType *UT =
getType()->getAsUnionType())
4155 UT->getDecl()->getMostRecentDecl()->hasAttr<TransparentUnionAttr>())
4157 const Expr *InitExpr = CLE->getInitializer();
4158 if (
const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
4159 return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
4162 if (!
getType()->isIntegerType() ||
4193 const Expr *E =
this;
4196 "expression is not a property reference");
4199 if (BO->getOpcode() == BO_Comma) {
4214 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
4222 const ObjCMethodDecl *M = dyn_cast<ObjCMethodDecl>(Param->getDeclContext());
4233 if (ICE->getCastKind() == CK_LValueToRValue ||
4234 (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp))
4240 if (
MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
4241 if (
FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
4242 if (Field->isBitField())
4251 if (
DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E)) {
4252 if (
FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
4253 if (Field->isBitField())
4256 if (
BindingDecl *BD = dyn_cast<BindingDecl>(DeclRef->getDecl()))
4257 if (
Expr *E = BD->getBinding())
4262 if (BinOp->isAssignmentOp() && BinOp->getLHS())
4263 return BinOp->getLHS()->getSourceBitField();
4265 if (BinOp->getOpcode() == BO_Comma && BinOp->getRHS())
4266 return BinOp->getRHS()->getSourceBitField();
4270 if (UnOp->isPrefix() && UnOp->isIncrementDecrementOp())
4271 return UnOp->getSubExpr()->getSourceBitField();
4278 if (
auto *DRE = dyn_cast<DeclRefExpr>(E))
4279 return dyn_cast<EnumConstantDecl>(DRE->getDecl());
4288 if (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp)
4295 return ASE->getBase()->getType()->isVectorType();
4300 if (
auto *DRE = dyn_cast<DeclRefExpr>(E))
4301 if (
auto *BD = dyn_cast<BindingDecl>(DRE->getDecl()))
4302 if (
auto *E = BD->getBinding())
4311 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
4312 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
4314 VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
4330 case CXXThisExprClass:
4332 case DeclRefExprClass: {
4338 if (DRE1->getDecl() != DRE2->getDecl())
4341 if ((DRE1->isPRValue() && DRE2->isPRValue()) ||
4342 (DRE1->isLValue() && DRE2->isLValue()))
4347 case ImplicitCastExprClass: {
4350 const auto *ICE1 = dyn_cast<ImplicitCastExpr>(E1);
4351 const auto *ICE2 = dyn_cast<ImplicitCastExpr>(E2);
4354 if (ICE1->getCastKind() != ICE2->getCastKind())
4356 ICE2->IgnoreParenImpCasts());
4360 if (ICE1->getCastKind() == CK_LValueToRValue ||
4361 ICE1->getCastKind() == CK_ArrayToPointerDecay ||
4362 ICE1->getCastKind() == CK_FunctionToPointerDecay) {
4367 const auto *DRE1 = dyn_cast<DeclRefExpr>(E1);
4368 const auto *DRE2 = dyn_cast<DeclRefExpr>(E2);
4372 const auto *Ivar1 = dyn_cast<ObjCIvarRefExpr>(E1);
4373 const auto *Ivar2 = dyn_cast<ObjCIvarRefExpr>(E2);
4374 if (Ivar1 && Ivar2) {
4375 return Ivar1->isFreeIvar() && Ivar2->isFreeIvar() &&
4379 const auto *Array1 = dyn_cast<ArraySubscriptExpr>(E1);
4380 const auto *Array2 = dyn_cast<ArraySubscriptExpr>(E2);
4381 if (Array1 && Array2) {
4385 auto Idx1 = Array1->getIdx();
4386 auto Idx2 = Array2->getIdx();
4387 const auto Integer1 = dyn_cast<IntegerLiteral>(Idx1);
4388 const auto Integer2 = dyn_cast<IntegerLiteral>(Idx2);
4389 if (Integer1 && Integer2) {
4390 if (!llvm::APInt::isSameValue(Integer1->getValue(),
4391 Integer2->getValue()))
4407 if (
const auto *D = dyn_cast<VarDecl>(ME1->getMemberDecl()))
4408 if (D->isStaticDataMember())
4420 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E))
4421 return DRE->getDecl();
4422 if (
const auto *ME = dyn_cast<MemberExpr>(E))
4423 return ME->getMemberDecl();
4442 return VT->getNumElements();
4447 if (
const auto *MT =
getType()->getAs<ConstantMatrixType>())
4448 return MT->getNumElementsFlattened();
4457 StringRef Comp =
Accessor->getName();
4460 if (Comp ==
"hi" || Comp ==
"lo" || Comp ==
"even" || Comp ==
"odd")
4464 if (Comp[0] ==
's' || Comp[0] ==
'S')
4465 Comp = Comp.substr(1);
4467 for (
unsigned i = 0, e = Comp.size(); i != e; ++i)
4468 if (Comp.substr(i + 1).contains(Comp[i]))
4475struct MatrixAccessorFormat {
4476 bool IsZeroIndexed =
false;
4477 unsigned ChunkLen = 0;
4480static MatrixAccessorFormat GetHLSLMatrixAccessorFormat(StringRef Comp) {
4481 assert(!Comp.empty() && Comp[0] ==
'_' &&
"invalid matrix accessor");
4483 MatrixAccessorFormat F;
4484 if (Comp.size() >= 2 && Comp[0] ==
'_' && Comp[1] ==
'm') {
4485 F.IsZeroIndexed =
true;
4488 F.IsZeroIndexed =
false;
4492 assert(F.ChunkLen != 0 &&
"unrecognized matrix swizzle format");
4493 assert(
Comp.size() % F.ChunkLen == 0 &&
4494 "matrix swizzle accessor has invalid length");
4498template <
typename Fn>
4499static bool ForEachMatrixAccessorIndex(StringRef Comp,
4501 auto Format = GetHLSLMatrixAccessorFormat(Comp);
4503 for (
unsigned I = 0, E =
Comp.size(); I < E; I += Format.ChunkLen) {
4504 unsigned Row = 0, Col = 0;
4505 unsigned ZeroIndexOffset =
static_cast<unsigned>(Format.IsZeroIndexed);
4506 unsigned OneIndexOffset =
static_cast<unsigned>(!Format.IsZeroIndexed);
4507 Row =
static_cast<unsigned>(
Comp[I + ZeroIndexOffset + 1] -
'0') -
4509 Col =
static_cast<unsigned>(
Comp[I + ZeroIndexOffset + 2] -
'0') -
4512 assert(Row < MT->getNumRows() && Col < MT->getNumColumns() &&
4513 "matrix swizzle index out of bounds");
4531 StringRef Comp =
Accessor->getName();
4535 bool HasDup =
false;
4536 ForEachMatrixAccessorIndex(Comp, MT, [&](
unsigned Index) ->
bool {
4551 StringRef Comp =
Accessor->getName();
4552 bool isNumericAccessor =
false;
4553 if (Comp[0] ==
's' || Comp[0] ==
'S') {
4554 Comp = Comp.substr(1);
4555 isNumericAccessor =
true;
4558 bool isHi = Comp ==
"hi";
4559 bool isLo = Comp ==
"lo";
4560 bool isEven = Comp ==
"even";
4561 bool isOdd = Comp ==
"odd";
4577 Elts.push_back(Index);
4583 StringRef Comp =
Accessor->getName();
4585 ForEachMatrixAccessorIndex(Comp, MT, [&](
unsigned Index) ->
bool {
4586 Elts.push_back(Index);
4595 BuiltinLoc(BLoc), RParenLoc(RP) {
4597 SubExprs =
new (
C)
Stmt*[args.size()];
4598 for (
unsigned i = 0; i != args.size(); i++)
4599 SubExprs[i] = args[i];
4605 if (SubExprs)
C.Deallocate(SubExprs);
4609 llvm::copy(Exprs, SubExprs);
4612GenericSelectionExpr::GenericSelectionExpr(
4616 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex)
4617 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->
getType(),
4618 AssocExprs[ResultIndex]->getValueKind(),
4619 AssocExprs[ResultIndex]->getObjectKind()),
4620 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4621 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4622 assert(AssocTypes.size() == AssocExprs.size() &&
4623 "Must have the same number of association expressions"
4624 " and TypeSourceInfo!");
4625 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4628 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4630 llvm::copy(AssocExprs,
4631 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4632 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4633 getIndexOfStartOfAssociatedTypes());
4638GenericSelectionExpr::GenericSelectionExpr(
4643 unsigned ResultIndex)
4644 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->
getType(),
4645 AssocExprs[ResultIndex]->getValueKind(),
4646 AssocExprs[ResultIndex]->getObjectKind()),
4647 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4648 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4649 assert(AssocTypes.size() == AssocExprs.size() &&
4650 "Must have the same number of association expressions"
4651 " and TypeSourceInfo!");
4652 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4655 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4657 llvm::copy(AssocExprs,
4658 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4659 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4660 getIndexOfStartOfAssociatedTypes());
4665GenericSelectionExpr::GenericSelectionExpr(
4669 bool ContainsUnexpandedParameterPack)
4670 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4672 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4673 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4674 assert(AssocTypes.size() == AssocExprs.size() &&
4675 "Must have the same number of association expressions"
4676 " and TypeSourceInfo!");
4679 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4681 llvm::copy(AssocExprs,
4682 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4683 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4684 getIndexOfStartOfAssociatedTypes());
4689GenericSelectionExpr::GenericSelectionExpr(
4694 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4696 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4697 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4698 assert(AssocTypes.size() == AssocExprs.size() &&
4699 "Must have the same number of association expressions"
4700 " and TypeSourceInfo!");
4703 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4705 llvm::copy(AssocExprs,
4706 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4707 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4708 getIndexOfStartOfAssociatedTypes());
4713GenericSelectionExpr::GenericSelectionExpr(EmptyShell
Empty,
unsigned NumAssocs)
4714 :
Expr(GenericSelectionExprClass,
Empty), NumAssocs(NumAssocs) {}
4720 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex) {
4721 unsigned NumAssocs = AssocExprs.size();
4722 void *Mem = Context.Allocate(
4723 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4724 alignof(GenericSelectionExpr));
4725 return new (Mem) GenericSelectionExpr(
4726 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4727 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4734 bool ContainsUnexpandedParameterPack) {
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);
4749 unsigned ResultIndex) {
4750 unsigned NumAssocs = AssocExprs.size();
4751 void *Mem = Context.Allocate(
4752 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4753 alignof(GenericSelectionExpr));
4754 return new (Mem) GenericSelectionExpr(
4755 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4756 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4763 SourceLocation RParenLoc,
bool ContainsUnexpandedParameterPack) {
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);
4775 unsigned NumAssocs) {
4776 void *Mem = Context.Allocate(
4777 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4778 alignof(GenericSelectionExpr));
4779 return new (Mem) GenericSelectionExpr(
EmptyShell(), NumAssocs);
4800 EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
4801 NumDesignators(Designators.
size()), NumSubExprs(IndexExprs.
size() + 1) {
4802 this->Designators =
new (
C)
Designator[NumDesignators];
4810 unsigned IndexIdx = 0;
4811 for (
unsigned I = 0; I != NumDesignators; ++I) {
4812 this->Designators[I] = Designators[I];
4815 *Child++ = IndexExprs[IndexIdx++];
4818 *Child++ = IndexExprs[IndexIdx++];
4819 *Child++ = IndexExprs[IndexIdx++];
4823 assert(IndexIdx == IndexExprs.size() &&
"Wrong number of index expressions");
4831 bool UsesColonSyntax,
4833 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(IndexExprs.size() + 1),
4834 alignof(DesignatedInitExpr));
4835 return new (Mem) DesignatedInitExpr(
C,
C.VoidTy, Designators,
4836 ColonOrEqualLoc, UsesColonSyntax,
4841 unsigned NumIndexExprs) {
4842 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(NumIndexExprs + 1),
4843 alignof(DesignatedInitExpr));
4844 return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
4849 unsigned NumDesigs) {
4851 NumDesignators = NumDesigs;
4852 for (
unsigned I = 0; I != NumDesigs; ++I)
4853 Designators[I] = Desigs[I];
4857 DesignatedInitExpr *DIE =
const_cast<DesignatedInitExpr*
>(
this);
4865 auto *DIE =
const_cast<DesignatedInitExpr *
>(
this);
4867 if (
First.isFieldDesignator()) {
4870 for (
unsigned int i = 0; i < DIE->size(); i++) {
4878 return First.getLBracketLoc();
4905 unsigned NumNewDesignators =
Last -
First;
4906 if (NumNewDesignators == 0) {
4907 std::copy_backward(Designators + Idx + 1,
4908 Designators + NumDesignators,
4910 --NumNewDesignators;
4913 if (NumNewDesignators == 1) {
4914 Designators[Idx] = *
First;
4919 =
new (
C)
Designator[NumDesignators - 1 + NumNewDesignators];
4920 std::copy(Designators, Designators + Idx, NewDesignators);
4921 std::copy(
First,
Last, NewDesignators + Idx);
4922 std::copy(Designators + Idx + 1, Designators + NumDesignators,
4923 NewDesignators + Idx + NumNewDesignators);
4924 Designators = NewDesignators;
4925 NumDesignators = NumDesignators - 1 + NumNewDesignators;
4934 BaseAndUpdaterExprs[0] = baseExpr;
4938 BaseAndUpdaterExprs[1] = ILE;
4955 LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4957 llvm::copy(Exprs, getTrailingObjects());
4961ParenListExpr::ParenListExpr(EmptyShell
Empty,
unsigned NumExprs)
4970 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(Exprs.size()),
4971 alignof(ParenListExpr));
4972 return new (Mem) ParenListExpr(LParenLoc, Exprs, RParenLoc);
4976 unsigned NumExprs) {
4978 Ctx.
Allocate(totalSizeToAlloc<Stmt *>(NumExprs),
alignof(ParenListExpr));
4979 return new (Mem) ParenListExpr(
EmptyShell(), NumExprs);
4986static std::optional<BinaryOperator *>
4991 ComparedTo = E->
getRHS();
4994 ComparedTo = E->
getLHS();
4999 const Expr *AddLHS =
nullptr, *AddRHS =
nullptr;
5002 if (BO && BO->
getOpcode() == clang::BO_Add) {
5008 if (!AddLHS || !AddRHS)
5011 const Decl *LHSDecl, *RHSDecl, *OtherDecl;
5014 RHSDecl = AddRHS->IgnoreParenImpCasts()->getReferencedDeclOfCallee();
5020 if (!LHSDecl && !RHSDecl)
5023 if ((LHSDecl && LHSDecl == OtherDecl && LHSDecl != RHSDecl) ||
5024 (RHSDecl && RHSDecl == OtherDecl && RHSDecl != LHSDecl))
5036 if (!Result.has_value())
5038 QualType AdditionResultType = Result.value()->getType();
5046 Result.value()->setExcludedOverflowPattern(
true);
5053 :
Expr(BinaryOperatorClass, ResTy,
VK, OK) {
5056 "Use CompoundAssignOperator for compound assignments");
5059 SubExprs[LHS] = lhs;
5060 SubExprs[RHS] = rhs;
5072 :
Expr(CompoundAssignOperatorClass, ResTy,
VK, OK) {
5076 "Use CompoundAssignOperator for compound assignments");
5078 SubExprs[LHS] = lhs;
5079 SubExprs[RHS] = rhs;
5087 bool HasFPFeatures) {
5110 void *Mem =
C.Allocate(
sizeof(CompoundAssignOperator) +
Extra,
5111 alignof(CompoundAssignOperator));
5112 return new (Mem) CompoundAssignOperator(
C,
EmptyShell(), HasFPFeatures);
5123 void *Mem =
C.Allocate(
sizeof(CompoundAssignOperator) +
Extra,
5124 alignof(CompoundAssignOperator));
5126 CompoundAssignOperator(
C, lhs, rhs, opc, ResTy,
VK, OK, opLoc, FPFeatures,
5127 CompLHSType, CompResultType);
5131 bool hasFPFeatures) {
5132 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
5141 :
Expr(UnaryOperatorClass,
type,
VK, OK), Val(input) {
5157 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
5165 e = ewc->getSubExpr();
5167 e = m->getSubExpr();
5170 e = ice->getSubExpr();
5176 unsigned numSemanticExprs) {
5178 Context.Allocate(totalSizeToAlloc<Expr *>(1 + numSemanticExprs),
5179 alignof(PseudoObjectExpr));
5180 return new(buffer) PseudoObjectExpr(sh, numSemanticExprs);
5183PseudoObjectExpr::PseudoObjectExpr(EmptyShell shell,
unsigned numSemanticExprs)
5184 :
Expr(PseudoObjectExprClass, shell) {
5190 unsigned resultIndex) {
5191 assert(
syntax &&
"no syntactic expression!");
5192 assert(
semantics.size() &&
"no semantic expressions!");
5206 void *buffer =
C.Allocate(totalSizeToAlloc<Expr *>(
semantics.size() + 1),
5207 alignof(PseudoObjectExpr));
5214 unsigned resultIndex)
5227 "opaque-value semantic expressions for pseudo-object "
5228 "operations must have sources");
5230 llvm::copy(
semantics, Trail.drop_front().begin());
5261 NumSubExprs(args.size()), BuiltinLoc(BLoc), RParenLoc(RP), Op(op) {
5262 assert(args.size() ==
getNumSubExprs(op) &&
"wrong number of subexpressions");
5263 for (
unsigned i = 0; i != args.size(); i++)
5264 SubExprs[i] = args[i];
5270 case AO__c11_atomic_init:
5271 case AO__opencl_atomic_init:
5272 case AO__c11_atomic_load:
5273 case AO__atomic_load_n:
5274 case AO__atomic_test_and_set:
5275 case AO__atomic_clear:
5278 case AO__scoped_atomic_load_n:
5279 case AO__opencl_atomic_load:
5280 case AO__hip_atomic_load:
5281 case AO__c11_atomic_store:
5282 case AO__c11_atomic_exchange:
5283 case AO__atomic_load:
5284 case AO__atomic_store:
5285 case AO__atomic_store_n:
5286 case AO__atomic_exchange_n:
5287 case AO__c11_atomic_fetch_add:
5288 case AO__c11_atomic_fetch_sub:
5289 case AO__c11_atomic_fetch_and:
5290 case AO__c11_atomic_fetch_or:
5291 case AO__c11_atomic_fetch_xor:
5292 case AO__c11_atomic_fetch_nand:
5293 case AO__c11_atomic_fetch_max:
5294 case AO__c11_atomic_fetch_min:
5295 case AO__atomic_fetch_add:
5296 case AO__atomic_fetch_sub:
5297 case AO__atomic_fetch_and:
5298 case AO__atomic_fetch_or:
5299 case AO__atomic_fetch_xor:
5300 case AO__atomic_fetch_nand:
5301 case AO__atomic_add_fetch:
5302 case AO__atomic_sub_fetch:
5303 case AO__atomic_and_fetch:
5304 case AO__atomic_or_fetch:
5305 case AO__atomic_xor_fetch:
5306 case AO__atomic_nand_fetch:
5307 case AO__atomic_min_fetch:
5308 case AO__atomic_max_fetch:
5309 case AO__atomic_fetch_min:
5310 case AO__atomic_fetch_max:
5311 case AO__atomic_fetch_uinc:
5312 case AO__atomic_fetch_udec:
5315 case AO__scoped_atomic_load:
5316 case AO__scoped_atomic_store:
5317 case AO__scoped_atomic_store_n:
5318 case AO__scoped_atomic_fetch_add:
5319 case AO__scoped_atomic_fetch_sub:
5320 case AO__scoped_atomic_fetch_and:
5321 case AO__scoped_atomic_fetch_or:
5322 case AO__scoped_atomic_fetch_xor:
5323 case AO__scoped_atomic_fetch_nand:
5324 case AO__scoped_atomic_add_fetch:
5325 case AO__scoped_atomic_sub_fetch:
5326 case AO__scoped_atomic_and_fetch:
5327 case AO__scoped_atomic_or_fetch:
5328 case AO__scoped_atomic_xor_fetch:
5329 case AO__scoped_atomic_nand_fetch:
5330 case AO__scoped_atomic_min_fetch:
5331 case AO__scoped_atomic_max_fetch:
5332 case AO__scoped_atomic_fetch_min:
5333 case AO__scoped_atomic_fetch_max:
5334 case AO__scoped_atomic_exchange_n:
5335 case AO__scoped_atomic_fetch_uinc:
5336 case AO__scoped_atomic_fetch_udec:
5337 case AO__hip_atomic_exchange:
5338 case AO__hip_atomic_fetch_add:
5339 case AO__hip_atomic_fetch_sub:
5340 case AO__hip_atomic_fetch_and:
5341 case AO__hip_atomic_fetch_or:
5342 case AO__hip_atomic_fetch_xor:
5343 case AO__hip_atomic_fetch_min:
5344 case AO__hip_atomic_fetch_max:
5345 case AO__opencl_atomic_store:
5346 case AO__hip_atomic_store:
5347 case AO__opencl_atomic_exchange:
5348 case AO__opencl_atomic_fetch_add:
5349 case AO__opencl_atomic_fetch_sub:
5350 case AO__opencl_atomic_fetch_and:
5351 case AO__opencl_atomic_fetch_or:
5352 case AO__opencl_atomic_fetch_xor:
5353 case AO__opencl_atomic_fetch_min:
5354 case AO__opencl_atomic_fetch_max:
5355 case AO__atomic_exchange:
5358 case AO__scoped_atomic_exchange:
5359 case AO__c11_atomic_compare_exchange_strong:
5360 case AO__c11_atomic_compare_exchange_weak:
5362 case AO__hip_atomic_compare_exchange_strong:
5363 case AO__opencl_atomic_compare_exchange_strong:
5364 case AO__opencl_atomic_compare_exchange_weak:
5365 case AO__hip_atomic_compare_exchange_weak:
5366 case AO__atomic_compare_exchange:
5367 case AO__atomic_compare_exchange_n:
5370 case AO__scoped_atomic_compare_exchange:
5371 case AO__scoped_atomic_compare_exchange_n:
5374 llvm_unreachable(
"unknown atomic op");
5380 return AT->getValueType();
5385 unsigned ArraySectionCount = 0;
5386 while (
auto *OASE = dyn_cast<ArraySectionExpr>(
Base->IgnoreParens())) {
5387 Base = OASE->getBase();
5388 ++ArraySectionCount;
5391 dyn_cast<ArraySubscriptExpr>(
Base->IgnoreParenImpCasts())) {
5392 Base = ASE->getBase();
5393 ++ArraySectionCount;
5395 Base =
Base->IgnoreParenImpCasts();
5396 auto OriginalTy =
Base->getType();
5397 if (
auto *DRE = dyn_cast<DeclRefExpr>(
Base))
5398 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
5399 OriginalTy = PVD->getOriginalType().getNonReferenceType();
5401 for (
unsigned Cnt = 0; Cnt < ArraySectionCount; ++Cnt) {
5402 if (OriginalTy->isAnyPointerType())
5403 OriginalTy = OriginalTy->getPointeeType();
5404 else if (OriginalTy->isArrayType())
5405 OriginalTy = OriginalTy->castAsArrayTypeUnsafe()->getElementType();
5417 BaseTy = ASE->getElementType();
5434 return ASE->getElementType();
5441 :
Expr(RecoveryExprClass, T.getNonReferenceType(),
5442 T->isDependentType() ?
VK_LValue : getValueKindForType(T),
5444 BeginLoc(BeginLoc), EndLoc(EndLoc), NumExprs(SubExprs.size()) {
5445 assert(!T.isNull());
5446 assert(!llvm::is_contained(SubExprs,
nullptr));
5448 llvm::copy(SubExprs, getTrailingObjects());
5456 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(SubExprs.size()),
5457 alignof(RecoveryExpr));
5458 return new (Mem) RecoveryExpr(Ctx, T, BeginLoc, EndLoc, SubExprs);
5462 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(NumSubExprs),
5463 alignof(RecoveryExpr));
5464 return new (Mem) RecoveryExpr(
EmptyShell(), NumSubExprs);
5469 NumDims == Dims.size() &&
5470 "Preallocated number of dimensions is different from the provided one.");
5471 llvm::copy(Dims, getTrailingObjects<Expr *>());
5476 NumDims == BR.size() &&
5477 "Preallocated number of dimensions is different from the provided one.");
5478 llvm::copy(BR, getTrailingObjects<SourceRange>());
5481OMPArrayShapingExpr::OMPArrayShapingExpr(
QualType ExprTy,
Expr *Op,
5485 RPLoc(
R), NumDims(Dims.size()) {
5487 setDimensions(Dims);
5496 assert(Dims.size() == BracketRanges.size() &&
5497 "Different number of dimensions and brackets ranges.");
5498 void *Mem = Context.Allocate(
5499 totalSizeToAlloc<Expr *, SourceRange>(Dims.size() + 1, Dims.size()),
5500 alignof(OMPArrayShapingExpr));
5501 auto *E =
new (Mem) OMPArrayShapingExpr(T, Op, L, R, Dims);
5502 E->setBracketsRanges(BracketRanges);
5508 void *Mem = Context.Allocate(
5509 totalSizeToAlloc<Expr *, SourceRange>(NumDims + 1, NumDims),
5510 alignof(OMPArrayShapingExpr));
5511 return new (Mem) OMPArrayShapingExpr(
EmptyShell(), NumDims);
5514void OMPIteratorExpr::setIteratorDeclaration(
unsigned I,
Decl *D) {
5515 getTrailingObjects<Decl *>(NumIterators)[I] = D;
5518void OMPIteratorExpr::setAssignmentLoc(
unsigned I,
SourceLocation Loc) {
5519 assert(I < NumIterators &&
5520 "Idx is greater or equal the number of iterators definitions.");
5523 static_cast<int>(RangeLocOffset::AssignLoc)] = Loc;
5526void OMPIteratorExpr::setIteratorRange(
unsigned I,
Expr *Begin,
5530 assert(I < NumIterators &&
5531 "Idx is greater or equal the number of iterators definitions.");
5532 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5533 static_cast<int>(RangeExprOffset::Begin)] =
5535 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5536 static_cast<int>(RangeExprOffset::End)] = End;
5537 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5538 static_cast<int>(RangeExprOffset::Step)] = Step;
5540 SourceLocation>()[I *
static_cast<int>(RangeLocOffset::Total) +
5541 static_cast<int>(RangeLocOffset::FirstColonLoc)] =
5544 SourceLocation>()[I *
static_cast<int>(RangeLocOffset::Total) +
5545 static_cast<int>(RangeLocOffset::SecondColonLoc)] =
5550 return getTrailingObjects<Decl *>()[I];
5556 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5557 RangeExprOffset::Total) +
5558 static_cast<int>(RangeExprOffset::Begin)];
5560 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5561 RangeExprOffset::Total) +
5562 static_cast<int>(RangeExprOffset::End)];
5564 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5565 RangeExprOffset::Total) +
5566 static_cast<int>(RangeExprOffset::Step)];
5571 return getTrailingObjects<
5573 static_cast<int>(RangeLocOffset::AssignLoc)];
5577 return getTrailingObjects<
5579 static_cast<int>(RangeLocOffset::FirstColonLoc)];
5583 return getTrailingObjects<
5585 static_cast<int>(RangeLocOffset::SecondColonLoc)];
5589 getTrailingObjects<OMPIteratorHelperData>()[I] = D;
5593 return getTrailingObjects<OMPIteratorHelperData>()[I];
5597 return getTrailingObjects<OMPIteratorHelperData>()[I];
5600OMPIteratorExpr::OMPIteratorExpr(
5605 IteratorKwLoc(IteratorKwLoc), LPLoc(L), RPLoc(R),
5606 NumIterators(
Data.size()) {
5607 for (
unsigned I = 0, E =
Data.size(); I < E; ++I) {
5608 const IteratorDefinition &D = Data[I];
5609 setIteratorDeclaration(I, D.IteratorDecl);
5610 setAssignmentLoc(I, D.AssignmentLoc);
5611 setIteratorRange(I, D.Range.Begin, D.ColonLoc, D.Range.End,
5612 D.SecondColonLoc, D.Range.Step);
5613 setHelper(I, Helpers[I]);
5624 assert(
Data.size() == Helpers.size() &&
5625 "Data and helpers must have the same size.");
5626 void *Mem = Context.Allocate(
5627 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5628 Data.size(),
Data.size() *
static_cast<int>(RangeExprOffset::Total),
5629 Data.size() *
static_cast<int>(RangeLocOffset::Total),
5631 alignof(OMPIteratorExpr));
5632 return new (Mem) OMPIteratorExpr(T, IteratorKwLoc, L, R,
Data, Helpers);
5636 unsigned NumIterators) {
5637 void *Mem = Context.Allocate(
5638 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5639 NumIterators, NumIterators *
static_cast<int>(RangeExprOffset::Total),
5640 NumIterators *
static_cast<int>(RangeLocOffset::Total), NumIterators),
5641 alignof(OMPIteratorExpr));
5642 return new (Mem) OMPIteratorExpr(
EmptyShell(), NumIterators);
5649 return new (
C) HLSLOutArgExpr(Ty,
Base, OpV, WB, IsInOut);
5658 return new (
C) OpenACCAsteriskSizeExpr(Loc,
C.IntTy);
5663 return new (
C) OpenACCAsteriskSizeExpr({},
C.IntTy);
5667 bool hasFPFeatures) {
5668 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
5669 alignof(ConvertVectorExpr));
5670 return new (Mem) ConvertVectorExpr(hasFPFeatures,
EmptyShell());
5678 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
5679 void *Mem =
C.Allocate(Size,
alignof(ConvertVectorExpr));
5680 return new (Mem) ConvertVectorExpr(SrcExpr, TI, DstType,
VK, OK, BuiltinLoc,
5681 RParenLoc, FPFeatures);
5687 StaticValue =
new (Ctx)
APValue;
5690 return *StaticValue;
5694 assert(StaticValue);
5695 return *StaticValue;
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.
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
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.
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.
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 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.
bool isConstantInitializer(ASTContext &Ctx, bool ForRef, const Expr **Culprit=nullptr) const
isConstantInitializer - Returns true if this expression can be emitted to IR as a constant,...
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
static bool isSameComparisonOperand(const Expr *E1, const Expr *E2)
Checks that the two Expr's will refer to the same value as a comparison operand.
bool isDefaultArgument() const
Determine whether this expression is a default function argument.
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.
InitListExpr(const ASTContext &C, SourceLocation lbraceloc, ArrayRef< Expr * > initExprs, SourceLocation rbraceloc)
bool isTransparent() const
Is this a transparent initializer list (that is, an InitListExpr that is purely syntactic,...
void resizeInits(const ASTContext &Context, unsigned NumInits)
Specify the number of initializers.
bool isStringLiteralInit() const
Is this an initializer for an array of characters, initialized by a string literal or an @encode?
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isSemanticForm() const
void setInit(unsigned Init, Expr *expr)
Expr * updateInit(const ASTContext &C, unsigned Init, Expr *expr)
Updates the initializer at index Init with the new expression expr, and returns the old expression at...
void setArrayFiller(Expr *filler)
InitListExpr * getSyntacticForm() const
const Expr * getInit(unsigned Init) const
bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const
Is this the zero initializer {0} in a language which considers it idiomatic?
SourceLocation getEndLoc() const LLVM_READONLY
bool isSyntacticForm() const
ArrayRef< Expr * > inits()
void sawArrayRangeDesignator(bool ARD=true)
Expr ** getInits()
Retrieve the set of initializers.
void reserveInits(const ASTContext &C, unsigned NumInits)
Reserve space for some number of initializers.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
LabelStmt - Represents a label, which has a substatement.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
StrictFlexArraysLevelKind
@ AddUnsignedOverflowTest
if (a + b < a)
@ AddSignedOverflowTest
if (a + b < a)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isOverflowPatternExcluded(OverflowPatternExclusionKind Kind) const
void remapPathPrefix(SmallVectorImpl< char > &Path) const
Remap path prefix according to -fmacro-prefix-path option.
Lexer - This provides a simple interface that turns a text buffer into a stream of tokens.
bool LexFromRawLexer(Token &Result)
LexFromRawLexer - Lex a token from a designated raw lexer (one with no associated preprocessor object...
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Characters, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token,...
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
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)
FieldDecl * getField() const
For a field offsetof node, returns the field.
IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
@ Identifier
A field in a dependent type, known only by its name.
Kind getKind() const
Determine what kind of offsetof node this is.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
static const OpaqueValueExpr * findInCopyConstruct(const Expr *expr)
Given an expression which invokes a copy constructor — i.e.
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.
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.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
CharSourceRange getExpansionRange(SourceLocation Loc) const
Given a SourceLocation object, return the range of tokens covered by the expansion in the ultimate fi...
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
UnaryExprOrTypeTraitExprBitfields UnaryExprOrTypeTraitExprBits
GenericSelectionExprBitfields GenericSelectionExprBits
ParenListExprBitfields ParenListExprBits
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, CodePtr OpPC)
1) Pops the value from the stack.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
ConstantResultStorageKind
Describes the kind of result that can be tail-allocated.
@ Ctor_Base
Base object ctor.
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 ...
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',...
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
Expr * IgnoreImplicitCastsExtraSingleStep(Expr *E)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
Expr * IgnoreImplicitCastsSingleStep(Expr *E)
@ Dtor_Base
Base object dtor.
CastKind
CastKind - The kind of operation required for a conversion.
void FixedPointValueToString(SmallVectorImpl< char > &Str, llvm::APSInt Val, unsigned Scale)
Expr * IgnoreImplicitSingleStep(Expr *E)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Expr * IgnoreParensSingleStep(Expr *E)
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,...