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());
147 BIT && BIT->
isUnsigned() && BIT->getNumBits() == 1)
151 switch (UO->getOpcode()) {
153 return UO->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
165 return CE->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
168 switch (BO->getOpcode()) {
169 default:
return false;
184 return BO->getLHS()->isKnownToHaveBooleanValue(Semantic) &&
185 BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
189 return BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
194 return CO->getTrueExpr()->isKnownToHaveBooleanValue(Semantic) &&
195 CO->getFalseExpr()->isKnownToHaveBooleanValue(Semantic);
200 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(E))
201 return OVE->getSourceExpr()->isKnownToHaveBooleanValue(Semantic);
204 if (!Semantic && FD->getType()->isUnsignedIntegerType() &&
205 !FD->getBitWidth()->isValueDependent() && FD->getBitWidthValue() == 1)
214 bool IgnoreTemplateOrMacroSubstitution)
const {
216 const Decl *D =
nullptr;
218 if (
const auto *ME = dyn_cast<MemberExpr>(E))
219 D = ME->getMemberDecl();
220 else if (
const auto *DRE = dyn_cast<DeclRefExpr>(E))
222 else if (
const auto *IRE = dyn_cast<ObjCIvarRefExpr>(E))
226 StrictFlexArraysLevel,
227 IgnoreTemplateOrMacroSubstitution);
237 if (
Value.isMemberPointer())
238 return Value.getMemberPointerDecl();
240 if (
Value.isLValue() &&
Value.getLValueOffset().isZero())
254 template <
class E,
class T>
257 return static_cast<const E*
>(
expr)->getExprLoc();
267 return static_cast<const E *
>(
expr)->getBeginLoc();
276 if (ED->isCompleteDefinition())
285#define ABSTRACT_STMT(type)
286#define STMT(type, base) \
287 case Stmt::type##Class: break;
288#define EXPR(type, base) \
289 case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
290#include "clang/AST/StmtNodes.inc"
292 llvm_unreachable(
"unknown expression kind");
303 "Invalid StorageKind Value");
313 if (!
Value.getInt().needsCleanup())
323 if (T->isIntegralOrEnumerationType() && Context.getTypeInfo(T).Width <= 64)
329 bool IsImmediateInvocation)
330 :
FullExpr(ConstantExprClass, SubExpr) {
339 ::new (getTrailingObjects<APValue>())
APValue();
344 bool IsImmediateInvocation) {
348 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
351 void *Mem = Context.Allocate(Size,
alignof(ConstantExpr));
352 return new (Mem) ConstantExpr(E, StorageKind, IsImmediateInvocation);
358 ConstantExpr *
Self =
Create(Context, E, StorageKind);
363ConstantExpr::ConstantExpr(EmptyShell
Empty,
369 ::new (getTrailingObjects<APValue>())
APValue();
376 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
379 void *Mem = Context.Allocate(Size,
alignof(ConstantExpr));
380 return new (Mem) ConstantExpr(
EmptyShell(), StorageKind);
385 "Invalid storage for this value kind");
391 Int64Result() = *
Value.getInt().getRawData();
398 Context.addDestruction(&APValueResult());
400 APValueResult() = std::move(
Value);
403 llvm_unreachable(
"Invalid ResultKind Bits");
409 return APValueResult().getInt();
414 llvm_unreachable(
"invalid Accessor");
422 return APValueResult();
432 llvm_unreachable(
"invalid ResultKind");
436 bool RefersToEnclosingVariableOrCapture,
QualType T,
446 RefersToEnclosingVariableOrCapture;
447 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
454DeclRefExpr::DeclRefExpr(
const ASTContext &Ctx,
457 bool RefersToEnclosingVariableOrCapture,
466 new (getTrailingObjects<NestedNameSpecifierLoc>())
470 *getTrailingObjects<NamedDecl *>() = FoundD;
472 = (TemplateArgs || TemplateKWLoc.
isValid()) ? 1 : 0;
474 RefersToEnclosingVariableOrCapture;
475 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
478 auto Deps = TemplateArgumentDependence::None;
479 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
480 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
482 assert(!(Deps & TemplateArgumentDependence::Dependent) &&
483 "built a DeclRefExpr with dependent template args");
484 }
else if (TemplateKWLoc.
isValid()) {
485 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
496 bool RefersToEnclosingVariableOrCapture,
501 return Create(Context, QualifierLoc, TemplateKWLoc, D,
502 RefersToEnclosingVariableOrCapture,
504 T,
VK, FoundD, TemplateArgs, NOUR);
510 bool RefersToEnclosingVariableOrCapture,
520 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
524 QualifierLoc ? 1 : 0, FoundD ? 1 : 0,
525 HasTemplateKWAndArgsInfo ? 1 : 0,
526 TemplateArgs ? TemplateArgs->
size() : 0);
528 void *Mem = Context.Allocate(Size,
alignof(DeclRefExpr));
529 return new (Mem) DeclRefExpr(Context, QualifierLoc, TemplateKWLoc, D,
530 RefersToEnclosingVariableOrCapture, NameInfo,
531 FoundD, TemplateArgs, T,
VK, NOUR);
537 bool HasTemplateKWAndArgsInfo,
538 unsigned NumTemplateArgs) {
539 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
543 HasQualifier ? 1 : 0, HasFoundDecl ? 1 : 0, HasTemplateKWAndArgsInfo,
545 void *Mem = Context.Allocate(Size,
alignof(DeclRefExpr));
551 if (
getType()->isUndeducedType())
562SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(
SourceLocation OpLoc,
568 OpLoc(OpLoc), LParen(LParen), RParen(RParen) {
569 setTypeSourceInfo(TSI);
573SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(EmptyShell
Empty,
583 SYCLUniqueStableNameExpr(OpLoc, LParen, RParen, ResultTy, TSI);
589 return new (Ctx) SYCLUniqueStableNameExpr(
EmptyShell(), ResultTy);
601 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
602 return RD->getDeviceLambdaManglingNumber();
607 Context, Context.getDiagnostics(), MangleCallback)};
611 llvm::raw_string_ostream Out(Buffer);
612 Ctx->mangleCanonicalTypeName(Ty, Out);
622 assert((getIdentKind() == IK) &&
623 "IdentKind do not fit in PredefinedExprBitfields!");
624 bool HasFunctionName = SL !=
nullptr;
633PredefinedExpr::PredefinedExpr(EmptyShell
Empty,
bool HasFunctionName)
641 bool HasFunctionName = SL !=
nullptr;
642 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
643 alignof(PredefinedExpr));
644 return new (Mem) PredefinedExpr(L, FNTy, IK, IsTransparent, SL);
648 bool HasFunctionName) {
649 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
650 alignof(PredefinedExpr));
651 return new (Mem) PredefinedExpr(
EmptyShell(), HasFunctionName);
659 return "__FUNCTION__";
661 return "__FUNCDNAME__";
663 return "L__FUNCTION__";
665 return "__PRETTY_FUNCTION__";
667 return "__FUNCSIG__";
669 return "L__FUNCSIG__";
673 llvm_unreachable(
"Unknown ident kind for PredefinedExpr");
679 const Decl *CurrentDecl,
680 bool ForceElaboratedPrinting) {
684 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(CurrentDecl)) {
685 std::unique_ptr<MangleContext> MC;
686 MC.reset(Context.createMangleContext());
688 if (MC->shouldMangleDeclName(ND)) {
690 llvm::raw_svector_ostream Out(Buffer);
696 else if (
auto FD = dyn_cast<FunctionDecl>(ND)) {
700 MC->mangleName(GD, Out);
702 if (!Buffer.empty() && Buffer.front() ==
'\01')
703 return std::string(Buffer.substr(1));
704 return std::string(Buffer);
706 return std::string(ND->getIdentifier()->getName());
715 if (DC->isFileContext())
719 llvm::raw_svector_ostream Out(Buffer);
720 if (
auto *DCBlock = dyn_cast<BlockDecl>(DC))
723 else if (
auto *DCDecl = dyn_cast<Decl>(DC))
725 return std::string(Out.str());
727 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
728 const auto &LO = Context.getLangOpts();
729 bool IsFuncOrFunctionInNonMSVCCompatEnv =
731 IK == PredefinedIdentKind ::Function) &&
733 bool IsLFunctionInMSVCCommpatEnv =
735 bool IsFuncOrFunctionOrLFunctionOrFuncDName =
740 if ((ForceElaboratedPrinting &&
741 (IsFuncOrFunctionInNonMSVCCompatEnv || IsLFunctionInMSVCCommpatEnv)) ||
742 (!ForceElaboratedPrinting && IsFuncOrFunctionOrLFunctionOrFuncDName))
743 return FD->getNameAsString();
746 llvm::raw_svector_ostream Out(Name);
751 if (MD->isStatic() && !ForceElaboratedPrinting)
758 std::string remapPath(StringRef Path)
const override {
761 return std::string(p);
768 PrettyCallbacks PrettyCB(Context.getLangOpts());
773 llvm::raw_string_ostream POut(Proto);
782 const Type *Ty =
Decl->getType().getTypePtrOrNull();
788 if (FD->hasWrittenPrototype())
789 FT = dyn_cast<FunctionProtoType>(AFT);
794 case CC_C: POut <<
"__cdecl ";
break;
805 FD->printQualifiedName(POut, Policy);
809 return std::string(Name);
814 for (
unsigned i = 0, e =
Decl->getNumParams(); i != e; ++i) {
816 POut <<
Decl->getParamDecl(i)->getType().stream(Policy);
819 if (FT->isVariadic()) {
820 if (FD->getNumParams()) POut <<
", ";
824 !Context.getLangOpts().CPlusPlus) &&
825 !
Decl->getNumParams()) {
832 assert(FT &&
"We must have a written prototype in this case.");
835 if (FT->isVolatile())
847 while (isa_and_nonnull<NamedDecl>(Ctx)) {
849 = dyn_cast<ClassTemplateSpecializationDecl>(Ctx);
851 Specs.push_back(Spec);
855 std::string TemplateParams;
856 llvm::raw_string_ostream TOut(TemplateParams);
859 D->getSpecializedTemplate()->getTemplateParameters();
861 assert(Params->
size() == Args.
size());
862 for (
unsigned i = 0, numParams = Params->
size(); i != numParams; ++i) {
864 if (Param.empty())
continue;
865 TOut << Param <<
" = ";
874 = FD->getTemplateSpecializationInfo();
879 assert(Params->
size() == Args->
size());
880 for (
unsigned i = 0, e = Params->
size(); i != e; ++i) {
882 if (Param.empty())
continue;
883 TOut << Param <<
" = ";
884 Args->
get(i).
print(Policy, TOut,
true);
889 if (!TemplateParams.empty()) {
891 TemplateParams.resize(TemplateParams.size() - 2);
892 POut <<
" [" << TemplateParams <<
"]";
900 Proto =
"auto " + Proto;
901 else if (FT && FT->getReturnType()->getAs<DecltypeType>())
903 ->getAs<DecltypeType>()
911 return std::string(Name);
913 if (
const CapturedDecl *CD = dyn_cast<CapturedDecl>(CurrentDecl)) {
917 if (DC->isFunctionOrMethod() && (DC->getDeclKind() != Decl::Captured)) {
921 llvm_unreachable(
"CapturedDecl not inside a function or method");
923 if (
const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
925 llvm::raw_svector_ostream Out(Name);
926 Out << (MD->isInstanceMethod() ?
'-' :
'+');
935 dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
936 Out <<
'(' << *CID <<
')';
939 MD->getSelector().print(Out);
942 return std::string(Name);
953 const llvm::APInt &Val) {
958 unsigned NumWords = Val.getNumWords();
959 const uint64_t* Words = Val.getRawData();
961 pVal =
new (
C) uint64_t[NumWords];
962 std::copy(Words, Words + NumWords,
pVal);
963 }
else if (NumWords == 1)
969IntegerLiteral::IntegerLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
972 assert(
type->isIntegerType() &&
"Illegal type in IntegerLiteral");
973 assert(
V.getBitWidth() ==
C.getIntWidth(
type) &&
974 "Integer type is not the correct size for constant.");
982 return new (
C) IntegerLiteral(
C,
V,
type, l);
987 return new (
C) IntegerLiteral(
Empty);
990FixedPointLiteral::FixedPointLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
995 assert(
type->isFixedPointType() &&
"Illegal type in FixedPointLiteral");
996 assert(
V.getBitWidth() ==
C.getTypeInfo(
type).Width &&
997 "Fixed point type is not the correct size for constant.");
1003 const llvm::APInt &
V,
1007 return new (
C) FixedPointLiteral(
C,
V,
type, l, Scale);
1012 return new (
C) FixedPointLiteral(
Empty);
1021 S, llvm::APSInt::getUnsigned(
getValue().getZExtValue()), Scale);
1022 return std::string(S);
1045 if (!Escaped.empty()) {
1046 OS <<
"'" << Escaped <<
"'";
1055 OS <<
"'" << (char)Val <<
"'";
1057 OS <<
"'\\x" << llvm::format(
"%02x", Val) <<
"'";
1058 else if (Val <= 0xFFFF)
1059 OS <<
"'\\u" << llvm::format(
"%04x", Val) <<
"'";
1061 OS <<
"'\\U" << llvm::format(
"%08x", Val) <<
"'";
1065FloatingLiteral::FloatingLiteral(
const ASTContext &
C,
const llvm::APFloat &
V,
1068 setSemantics(
V.getSemantics());
1076 setRawSemantics(llvm::APFloatBase::S_IEEEhalf);
1083 return new (
C) FloatingLiteral(
C,
V, isexact,
Type, L);
1088 return new (
C) FloatingLiteral(
C,
Empty);
1097 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
1099 return V.convertToDouble();
1104 unsigned CharByteWidth = 0;
1109 CharByteWidth =
Target.getCharWidth();
1112 CharByteWidth =
Target.getWCharWidth();
1115 CharByteWidth =
Target.getChar16Width();
1118 CharByteWidth =
Target.getChar32Width();
1121 return sizeof(char);
1123 assert((CharByteWidth & 7) == 0 &&
"Assumes character size is byte multiple");
1125 assert((CharByteWidth == 1 || CharByteWidth == 2 || CharByteWidth == 4) &&
1126 "The only supported character byte widths are 1,2 and 4!");
1127 return CharByteWidth;
1130StringLiteral::StringLiteral(
const ASTContext &Ctx, StringRef Str,
1135 unsigned Length = Str.size();
1142 "StringLiteral must be of constant array type!");
1143 unsigned CharByteWidth = mapCharByteWidth(Ctx.
getTargetInfo(), Kind);
1144 unsigned ByteLength = Str.size();
1145 assert((ByteLength % CharByteWidth == 0) &&
1146 "The size of the data must be a multiple of CharByteWidth!");
1151 switch (CharByteWidth) {
1153 Length = ByteLength;
1156 Length = ByteLength / 2;
1159 Length = ByteLength / 4;
1162 llvm_unreachable(
"Unsupported character width!");
1168 assert(!Pascal &&
"Can't make an unevaluated Pascal string");
1173 *getTrailingObjects<unsigned>() = Length;
1177 llvm::copy(Locs, getTrailingObjects<SourceLocation>());
1180 llvm::copy(Str, getTrailingObjects<char>());
1185StringLiteral::StringLiteral(EmptyShell
Empty,
unsigned NumConcatenated,
1186 unsigned Length,
unsigned CharByteWidth)
1190 *getTrailingObjects<unsigned>() = Length;
1197 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1198 1, Locs.size(), Str.size()),
1199 alignof(StringLiteral));
1200 return new (Mem) StringLiteral(Ctx, Str, Kind, Pascal, Ty, Locs);
1204 unsigned NumConcatenated,
1206 unsigned CharByteWidth) {
1207 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1208 1, NumConcatenated, Length * CharByteWidth),
1209 alignof(StringLiteral));
1211 StringLiteral(
EmptyShell(), NumConcatenated, Length, CharByteWidth);
1234 static const char Hex[] =
"0123456789ABCDEF";
1237 for (
unsigned I = 0, N =
getLength(); I != N; ++I) {
1240 if (Escaped.empty()) {
1246 Char >= 0xd800 && Char <= 0xdbff) {
1248 if (Trail >= 0xdc00 && Trail <= 0xdfff) {
1249 Char = 0x10000 + ((Char - 0xd800) << 10) + (Trail - 0xdc00);
1259 (Char >= 0xd800 && Char <= 0xdfff) || Char >= 0x110000) {
1263 while ((Char >> Shift) == 0)
1265 for (; Shift >= 0; Shift -= 4)
1266 OS << Hex[(Char >> Shift) & 15];
1273 << Hex[(Char >> 20) & 15]
1274 << Hex[(Char >> 16) & 15];
1277 OS << Hex[(Char >> 12) & 15]
1278 << Hex[(Char >> 8) & 15]
1279 << Hex[(Char >> 4) & 15]
1280 << Hex[(Char >> 0) & 15];
1286 if (LastSlashX + 1 == I) {
1288 case '0':
case '1':
case '2':
case '3':
case '4':
1289 case '5':
case '6':
case '7':
case '8':
case '9':
1290 case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
1291 case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
1296 assert(Char <= 0xff &&
1297 "Characters above 0xff should already have been handled.");
1303 << (char)(
'0' + ((Char >> 6) & 7))
1304 << (char)(
'0' + ((Char >> 3) & 7))
1305 << (char)(
'0' + ((Char >> 0) & 7));
1334 unsigned *StartTokenByteOffset)
const {
1343 "Only narrow string literals are currently supported");
1348 unsigned StringOffset = 0;
1350 TokNo = *StartToken;
1351 if (StartTokenByteOffset) {
1352 StringOffset = *StartTokenByteOffset;
1353 ByteNo -= StringOffset;
1367 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
1369 if (StartTokenByteOffset !=
nullptr)
1370 *StartTokenByteOffset = StringOffset;
1371 if (StartToken !=
nullptr)
1372 *StartToken = TokNo;
1373 return StrTokSpellingLoc;
1376 const char *StrData = Buffer.data()+LocInfo.second;
1379 Lexer TheLexer(
SM.getLocForStartOfFile(LocInfo.first), Features,
1380 Buffer.begin(), StrData, Buffer.end());
1389 if (ByteNo < TokNumBytes ||
1395 if (StartTokenByteOffset !=
nullptr)
1396 *StartTokenByteOffset = StringOffset;
1397 if (StartToken !=
nullptr)
1398 *StartToken = TokNo;
1403 StringOffset += TokNumBytes;
1405 ByteNo -= TokNumBytes;
1413#define UNARY_OPERATION(Name, Spelling) case UO_##Name: return Spelling;
1414#include "clang/AST/OperationKinds.def"
1416 llvm_unreachable(
"Unknown unary operator");
1422 default: llvm_unreachable(
"No unary operator for overloaded function");
1423 case OO_PlusPlus:
return Postfix ? UO_PostInc : UO_PreInc;
1424 case OO_MinusMinus:
return Postfix ? UO_PostDec : UO_PreDec;
1425 case OO_Amp:
return UO_AddrOf;
1426 case OO_Star:
return UO_Deref;
1427 case OO_Plus:
return UO_Plus;
1428 case OO_Minus:
return UO_Minus;
1429 case OO_Tilde:
return UO_Not;
1430 case OO_Exclaim:
return UO_LNot;
1431 case OO_Coawait:
return UO_Coawait;
1437 case UO_PostInc:
case UO_PreInc:
return OO_PlusPlus;
1438 case UO_PostDec:
case UO_PreDec:
return OO_MinusMinus;
1439 case UO_AddrOf:
return OO_Amp;
1440 case UO_Deref:
return OO_Star;
1441 case UO_Plus:
return OO_Plus;
1442 case UO_Minus:
return OO_Minus;
1443 case UO_Not:
return OO_Tilde;
1444 case UO_LNot:
return OO_Exclaim;
1445 case UO_Coawait:
return OO_Coawait;
1457 case Expr::CallExprClass:
1459 case Expr::CXXOperatorCallExprClass:
1461 case Expr::CXXMemberCallExprClass:
1463 case Expr::UserDefinedLiteralClass:
1465 case Expr::CUDAKernelCallExprClass:
1468 llvm_unreachable(
"unexpected class deriving from CallExpr!");
1476 "we assume CXXOperatorCallExpr is at most 32 bytes");
1483 NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1484 unsigned NumPreArgs = PreArgs.size();
1486 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1488 "This CallExpr subclass is too big or unsupported");
1493 for (
unsigned I = 0; I != NumPreArgs; ++I)
1495 for (
unsigned I = 0; I != Args.size(); ++I)
1497 for (
unsigned I = Args.size(); I != NumArgs; ++I)
1504 CallExprBits.ExplicitObjectMemFunUsingMemberSyntax =
false;
1515 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1518 CallExprBits.ExplicitObjectMemFunUsingMemberSyntax =
false;
1527 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1534 new (Mem)
CallExpr(CallExprClass, Fn, {}, Args, Ty,
VK,
1535 RParenLoc, FPFeatures, MinNumArgs,
UsesADL);
1536 E->updateTrailingSourceLoc();
1542 unsigned SizeOfTrailingObjects =
1558 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1559 return DRE->getDecl();
1561 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1562 return ME->getMemberDecl();
1566 while (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(CEE))
1571 if (
auto *BO = dyn_cast<BinaryOperator>(CEE)) {
1572 if (BO->isPtrMemOp()) {
1576 }
else if (
auto *UO = dyn_cast<UnaryOperator>(CEE)) {
1577 if (UO->getOpcode() == UO_Deref || UO->getOpcode() == UO_AddrOf ||
1578 UO->getOpcode() == UO_Plus) {
1586 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1587 return DRE->getDecl();
1588 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1589 return ME->getMemberDecl();
1590 if (
auto *BE = dyn_cast<BlockExpr>(CEE))
1591 return BE->getBlockDecl();
1599 return FDecl ? FDecl->getBuiltinID() : 0;
1610 QualType CalleeType = Callee->getType();
1624 assert(!CalleeType.
isNull());
1638std::pair<const NamedDecl *, const WarnUnusedResultAttr *>
1641 if (Callee !=
nullptr)
1642 if (
const auto *A = Callee->getAttr<WarnUnusedResultAttr>())
1643 return {
nullptr, A};
1648 if (
const auto *A = TD->getAttr<WarnUnusedResultAttr>())
1653 if (
const auto *A = TD->getDecl()->getAttr<WarnUnusedResultAttr>())
1654 return {TD->getDecl(), A};
1655 return {
nullptr,
nullptr};
1664 void *Mem =
C.Allocate(
1665 totalSizeToAlloc<OffsetOfNode, Expr *>(comps.size(), exprs.size()));
1667 return new (Mem) OffsetOfExpr(
C,
type, OperatorLoc, tsi, comps, exprs,
1672 unsigned numComps,
unsigned numExprs) {
1674 C.Allocate(totalSizeToAlloc<OffsetOfNode, Expr *>(numComps, numExprs));
1675 return new (Mem) OffsetOfExpr(numComps, numExprs);
1683 OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
1684 NumComps(comps.size()), NumExprs(exprs.size()) {
1685 for (
unsigned i = 0; i != comps.size(); ++i)
1687 for (
unsigned i = 0; i != exprs.size(); ++i)
1705 OpLoc(op), RParenLoc(rp) {
1706 assert(ExprKind <=
UETT_Last &&
"invalid enum value!");
1709 "UnaryExprOrTypeTraitExprBits.Kind overflow!");
1723 :
Expr(MemberExprClass, T,
VK, OK),
Base(
Base), MemberDecl(MemberDecl),
1724 MemberDNLoc(NameInfo.
getInfo()), MemberLoc(NameInfo.getLoc()) {
1730 FoundDecl.
getDecl() != MemberDecl ||
1733 TemplateArgs || TemplateKWLoc.
isValid();
1739 new (getTrailingObjects<NestedNameSpecifierLoc>())
1742 *getTrailingObjects<DeclAccessPair>() = FoundDecl;
1744 auto Deps = TemplateArgumentDependence::None;
1745 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1746 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1748 }
else if (TemplateKWLoc.
isValid()) {
1749 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1762 bool HasFoundDecl = FoundDecl.
getDecl() != MemberDecl ||
1763 FoundDecl.
getAccess() != MemberDecl->getAccess();
1764 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
1768 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1769 TemplateArgs ? TemplateArgs->
size() : 0);
1771 void *Mem =
C.Allocate(Size,
alignof(MemberExpr));
1772 return new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, QualifierLoc,
1773 TemplateKWLoc, MemberDecl, FoundDecl, NameInfo,
1774 TemplateArgs, T,
VK, OK, NOUR);
1778 bool HasQualifier,
bool HasFoundDecl,
1779 bool HasTemplateKWAndArgsInfo,
1780 unsigned NumTemplateArgs) {
1781 assert((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
1782 "template args but no template arg info?");
1786 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1788 void *Mem = Context.Allocate(Size,
alignof(MemberExpr));
1794 if (
getType()->isUndeducedType())
1810 return BaseStartLoc;
1822bool CastExpr::CastConsistency()
const {
1824 case CK_DerivedToBase:
1825 case CK_UncheckedDerivedToBase:
1826 case CK_DerivedToBaseMemberPointer:
1827 case CK_BaseToDerived:
1828 case CK_BaseToDerivedMemberPointer:
1829 assert(!
path_empty() &&
"Cast kind should have a base path!");
1832 case CK_CPointerToObjCPointerCast:
1833 assert(
getType()->isObjCObjectPointerType());
1835 goto CheckNoBasePath;
1837 case CK_BlockPointerToObjCPointerCast:
1838 assert(
getType()->isObjCObjectPointerType());
1840 goto CheckNoBasePath;
1842 case CK_ReinterpretMemberPointer:
1843 assert(
getType()->isMemberPointerType());
1845 goto CheckNoBasePath;
1851 if (!
getType()->isPointerType()) {
1852 assert(
getType()->isObjCObjectPointerType() ==
1854 assert(
getType()->isBlockPointerType() ==
1857 goto CheckNoBasePath;
1859 case CK_AnyPointerToBlockPointerCast:
1860 assert(
getType()->isBlockPointerType());
1863 goto CheckNoBasePath;
1865 case CK_CopyAndAutoreleaseBlockObject:
1866 assert(
getType()->isBlockPointerType());
1868 goto CheckNoBasePath;
1870 case CK_FunctionToPointerDecay:
1871 assert(
getType()->isPointerType());
1873 goto CheckNoBasePath;
1875 case CK_AddressSpaceConversion: {
1884 (!Ty.
isNull() && !SETy.isNull() &&
1886 goto CheckNoBasePath;
1891 case CK_ArrayToPointerDecay:
1892 case CK_NullToMemberPointer:
1893 case CK_NullToPointer:
1894 case CK_ConstructorConversion:
1895 case CK_IntegralToPointer:
1896 case CK_PointerToIntegral:
1898 case CK_VectorSplat:
1899 case CK_IntegralCast:
1900 case CK_BooleanToSignedIntegral:
1901 case CK_IntegralToFloating:
1902 case CK_FloatingToIntegral:
1903 case CK_FloatingCast:
1904 case CK_ObjCObjectLValueCast:
1905 case CK_FloatingRealToComplex:
1906 case CK_FloatingComplexToReal:
1907 case CK_FloatingComplexCast:
1908 case CK_FloatingComplexToIntegralComplex:
1909 case CK_IntegralRealToComplex:
1910 case CK_IntegralComplexToReal:
1911 case CK_IntegralComplexCast:
1912 case CK_IntegralComplexToFloatingComplex:
1913 case CK_ARCProduceObject:
1914 case CK_ARCConsumeObject:
1915 case CK_ARCReclaimReturnedObject:
1916 case CK_ARCExtendBlockObject:
1917 case CK_ZeroToOCLOpaqueType:
1918 case CK_IntToOCLSampler:
1919 case CK_FloatingToFixedPoint:
1920 case CK_FixedPointToFloating:
1921 case CK_FixedPointCast:
1922 case CK_FixedPointToIntegral:
1923 case CK_IntegralToFixedPoint:
1926 goto CheckNoBasePath;
1929 case CK_LValueToRValue:
1931 case CK_AtomicToNonAtomic:
1932 case CK_NonAtomicToAtomic:
1933 case CK_PointerToBoolean:
1934 case CK_IntegralToBoolean:
1935 case CK_FloatingToBoolean:
1936 case CK_MemberPointerToBoolean:
1937 case CK_FloatingComplexToBoolean:
1938 case CK_IntegralComplexToBoolean:
1939 case CK_LValueBitCast:
1940 case CK_LValueToRValueBitCast:
1941 case CK_UserDefinedConversion:
1942 case CK_BuiltinFnToFnPtr:
1943 case CK_FixedPointToBoolean:
1944 case CK_HLSLArrayRValue:
1945 case CK_HLSLVectorTruncation:
1946 case CK_HLSLMatrixTruncation:
1947 case CK_HLSLElementwiseCast:
1948 case CK_HLSLAggregateSplatCast:
1950 assert(
path_empty() &&
"Cast kind should not have a base path!");
1958#define CAST_OPERATION(Name) case CK_##Name: return #Name;
1959#include "clang/AST/OperationKinds.def"
1961 llvm_unreachable(
"Unhandled cast kind!");
1967static Expr *ignoreImplicitSemaNodes(
Expr *E) {
1968 if (
auto *Materialize = dyn_cast<MaterializeTemporaryExpr>(E))
1969 return Materialize->getSubExpr();
1971 if (
auto *Binder = dyn_cast<CXXBindTemporaryExpr>(E))
1972 return Binder->getSubExpr();
1974 if (
auto *
Full = dyn_cast<FullExpr>(E))
1975 return Full->getSubExpr();
1977 if (
auto *CPLIE = dyn_cast<CXXParenListInitExpr>(E);
1978 CPLIE && CPLIE->getInitExprs().size() == 1)
1979 return CPLIE->getInitExprs()[0];
1986 const Expr *SubExpr =
nullptr;
1988 for (
const CastExpr *E =
this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
1993 if (E->getCastKind() == CK_ConstructorConversion) {
1995 ignoreImplicitSemaNodes);
1996 }
else if (E->getCastKind() == CK_UserDefinedConversion) {
1998 "Unexpected SubExpr for CK_UserDefinedConversion.");
1999 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2000 SubExpr = MCE->getImplicitObjectArgument();
2004 return const_cast<Expr *
>(SubExpr);
2008 const Expr *SubExpr =
nullptr;
2010 for (
const CastExpr *E =
this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
2013 if (E->getCastKind() == CK_ConstructorConversion)
2016 if (E->getCastKind() == CK_UserDefinedConversion) {
2017 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2018 return MCE->getMethodDecl();
2027#define ABSTRACT_STMT(x)
2028#define CASTEXPR(Type, Base) \
2029 case Stmt::Type##Class: \
2030 return static_cast<Type *>(this) \
2031 ->getTrailingObjectsNonStrict<CXXBaseSpecifier *>();
2032#define STMT(Type, Base)
2033#include "clang/AST/StmtNodes.inc"
2035 llvm_unreachable(
"non-cast expressions not possible here");
2049 Field != FieldEnd; ++Field) {
2051 !Field->isUnnamedBitField()) {
2061 case ImplicitCastExprClass:
2063 ->getTrailingObjects<FPOptionsOverride>();
2064 case CStyleCastExprClass:
2066 ->getTrailingObjects<FPOptionsOverride>();
2067 case CXXFunctionalCastExprClass:
2069 ->getTrailingObjects<FPOptionsOverride>();
2070 case CXXStaticCastExprClass:
2072 ->getTrailingObjects<FPOptionsOverride>();
2074 llvm_unreachable(
"Cast does not have FPFeatures");
2083 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2085 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2089 assert((Kind != CK_LValueToRValue ||
2090 !(T->isNullPtrType() || T->getAsCXXRecordDecl())) &&
2091 "invalid type for lvalue-to-rvalue conversion");
2092 ImplicitCastExpr *E =
2093 new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, FPO,
VK);
2095 llvm::uninitialized_copy(*BasePath,
2102 bool HasFPFeatures) {
2104 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2105 PathSize, HasFPFeatures));
2106 return new (Buffer) ImplicitCastExpr(
EmptyShell(), PathSize, HasFPFeatures);
2115 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2117 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2120 new (Buffer) CStyleCastExpr(T,
VK, K, Op, PathSize, FPO, WrittenTy, L, R);
2122 llvm::uninitialized_copy(*BasePath,
2129 bool HasFPFeatures) {
2131 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2132 PathSize, HasFPFeatures));
2133 return new (Buffer) CStyleCastExpr(
EmptyShell(), PathSize, HasFPFeatures);
2140#define BINARY_OPERATION(Name, Spelling) case BO_##Name: return Spelling;
2141#include "clang/AST/OperationKinds.def"
2143 llvm_unreachable(
"Invalid OpCode!");
2149 default: llvm_unreachable(
"Not an overloadable binary operator");
2150 case OO_Plus:
return BO_Add;
2151 case OO_Minus:
return BO_Sub;
2152 case OO_Star:
return BO_Mul;
2153 case OO_Slash:
return BO_Div;
2154 case OO_Percent:
return BO_Rem;
2155 case OO_Caret:
return BO_Xor;
2156 case OO_Amp:
return BO_And;
2157 case OO_Pipe:
return BO_Or;
2158 case OO_Equal:
return BO_Assign;
2159 case OO_Spaceship:
return BO_Cmp;
2160 case OO_Less:
return BO_LT;
2161 case OO_Greater:
return BO_GT;
2162 case OO_PlusEqual:
return BO_AddAssign;
2163 case OO_MinusEqual:
return BO_SubAssign;
2164 case OO_StarEqual:
return BO_MulAssign;
2165 case OO_SlashEqual:
return BO_DivAssign;
2166 case OO_PercentEqual:
return BO_RemAssign;
2167 case OO_CaretEqual:
return BO_XorAssign;
2168 case OO_AmpEqual:
return BO_AndAssign;
2169 case OO_PipeEqual:
return BO_OrAssign;
2170 case OO_LessLess:
return BO_Shl;
2171 case OO_GreaterGreater:
return BO_Shr;
2172 case OO_LessLessEqual:
return BO_ShlAssign;
2173 case OO_GreaterGreaterEqual:
return BO_ShrAssign;
2174 case OO_EqualEqual:
return BO_EQ;
2175 case OO_ExclaimEqual:
return BO_NE;
2176 case OO_LessEqual:
return BO_LE;
2177 case OO_GreaterEqual:
return BO_GE;
2178 case OO_AmpAmp:
return BO_LAnd;
2179 case OO_PipePipe:
return BO_LOr;
2180 case OO_Comma:
return BO_Comma;
2181 case OO_ArrowStar:
return BO_PtrMemI;
2188 OO_Star, OO_Slash, OO_Percent,
2190 OO_LessLess, OO_GreaterGreater,
2192 OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
2193 OO_EqualEqual, OO_ExclaimEqual,
2199 OO_Equal, OO_StarEqual,
2200 OO_SlashEqual, OO_PercentEqual,
2201 OO_PlusEqual, OO_MinusEqual,
2202 OO_LessLessEqual, OO_GreaterGreaterEqual,
2203 OO_AmpEqual, OO_CaretEqual,
2207 return OverOps[Opc];
2219 if (LHS->getType()->isPointerType()) {
2220 if (!RHS->getType()->isIntegerType())
2223 }
else if (RHS->getType()->isPointerType()) {
2224 if (!LHS->getType()->isIntegerType())
2236 if (!Select->getCond()->EvaluateAsBooleanCondition(
EvalResult, Ctx))
2238 PExp =
EvalResult ? Select->getTrueExpr() : Select->getFalseExpr();
2259 BuiltinLoc(BLoc), RParenLoc(RParenLoc), ParentContext(ParentContext) {
2263 ? ExprDependence::ValueInstantiation
2264 : ExprDependence::None);
2270 return "__builtin_FILE";
2272 return "__builtin_FILE_NAME";
2274 return "__builtin_FUNCTION";
2276 return "__builtin_FUNCSIG";
2278 return "__builtin_LINE";
2280 return "__builtin_COLUMN";
2282 return "__builtin_source_location";
2284 llvm_unreachable(
"unexpected IdentKind!");
2288 const Expr *DefaultExpr)
const {
2292 if (
const auto *DIE = dyn_cast_if_present<CXXDefaultInitExpr>(DefaultExpr)) {
2293 Loc = DIE->getUsedLocation();
2294 Context = DIE->getUsedContext();
2295 }
else if (
const auto *DAE =
2296 dyn_cast_if_present<CXXDefaultArgExpr>(DefaultExpr)) {
2297 Loc = DAE->getUsedLocation();
2298 Context = DAE->getUsedContext();
2309 if (
const auto *D = dyn_cast<CXXMethodDecl>(Context);
2311 Context = D->getParent()->getParent();
2316 auto MakeStringLiteral = [&](StringRef Tmp) {
2320 LValuePathEntry Path[1] = {LValuePathEntry::ArrayIndex(0)};
2331 return MakeStringLiteral(
FileName);
2337 return MakeStringLiteral(Path);
2341 const auto *CurDecl = dyn_cast<Decl>(Context);
2345 return MakeStringLiteral(
2365 StringRef Name = F->getName();
2366 if (Name ==
"_M_file_name") {
2370 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(Path);
2371 }
else if (Name ==
"_M_function_name") {
2374 const auto *CurDecl = dyn_cast<Decl>(Context);
2375 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(
2380 }
else if (Name ==
"_M_line") {
2382 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2383 }
else if (Name ==
"_M_column") {
2385 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2396 llvm_unreachable(
"unhandled case");
2401 unsigned NumOfElements)
2403 EmbedKeywordLoc(Loc), Ctx(&Ctx), Data(Data), Begin(Begin),
2404 NumOfElements(NumOfElements) {
2407 Ctx, llvm::APInt::getZero(Ctx.getTypeSize(
getType())),
getType(), Loc);
2408 assert(
getType()->isSignedIntegerType() &&
"IntTy should be signed");
2415 InitExprs(
C, initExprs.size()), LBraceLoc(lbraceloc),
2418 InitExprs.insert(
C, InitExprs.end(), initExprs.begin(), initExprs.end());
2425 if (NumInits > InitExprs.size())
2426 InitExprs.reserve(
C, NumInits);
2430 InitExprs.resize(
C, NumInits,
nullptr);
2434 if (
Init >= InitExprs.size()) {
2435 InitExprs.insert(
C, InitExprs.end(),
Init - InitExprs.size() + 1,
nullptr);
2447 ArrayFillerOrUnionFieldInit = filler;
2450 for (
unsigned i = 0, e =
getNumInits(); i != e; ++i)
2451 if (
inits[i] ==
nullptr)
2465 Init =
Init->IgnoreParenImpCasts();
2470 assert(
isSemanticForm() &&
"syntactic form never semantically transparent");
2474 assert(
getNumInits() == 1 &&
"multiple inits in glvalue init list");
2493 assert(
isSyntacticForm() &&
"only test syntactic form as zero initializer");
2500 return Lit && Lit->
getValue() == 0;
2505 return SyntacticForm->getBeginLoc();
2510 E = InitExprs.end();
2513 Beg = S->getBeginLoc();
2523 return SyntacticForm->getEndLoc();
2527 for (
Stmt *S : llvm::reverse(InitExprs)) {
2529 End = S->getEndLoc();
2546 return TheBlock->getCaretLocation();
2565 const auto *Ref = dyn_cast<DeclRefExpr>(Unwrapped);
2569 return isa_and_nonnull<DecompositionDecl>(Ref->getDecl());
2596 if (
auto *UO = dyn_cast<UnaryOperator>(E))
2597 if (UO->getOpcode() == UO_Deref)
2600 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
2602 if (BO->isPtrMemOp())
2606 if (BO->getOpcode() == BO_Comma)
2607 return BO->getRHS()->isReadIfDiscardedInCPlusPlus11();
2612 if (
auto *CO = dyn_cast<ConditionalOperator>(E))
2613 return CO->getTrueExpr()->isReadIfDiscardedInCPlusPlus11() &&
2614 CO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2617 dyn_cast<BinaryConditionalOperator>(E)) {
2618 if (
auto *OVE = dyn_cast<OpaqueValueExpr>(BCO->getTrueExpr()))
2619 return OVE->getSourceExpr()->isReadIfDiscardedInCPlusPlus11() &&
2620 BCO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2626 if (
const auto *POE = dyn_cast<PseudoObjectExpr>(E)) {
2654 case ParenExprClass:
2657 case GenericSelectionExprClass:
2660 case CoawaitExprClass:
2661 case CoyieldExprClass:
2664 case ChooseExprClass:
2667 case UnaryOperatorClass: {
2701 case BinaryOperatorClass: {
2713 if (IE->getValue() == 0)
2732 case CompoundAssignOperatorClass:
2733 case VAArgExprClass:
2734 case AtomicExprClass:
2737 case ConditionalOperatorClass: {
2742 return Exp->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx) &&
2743 Exp->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2745 case BinaryConditionalOperatorClass: {
2747 return Exp->getFalseExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2750 case MemberExprClass:
2757 case ArraySubscriptExprClass:
2764 case CXXOperatorCallExprClass: {
2776 case OO_ExclaimEqual:
2779 case OO_GreaterEqual:
2794 case CXXMemberCallExprClass:
2795 case UserDefinedLiteralClass: {
2819 case UnresolvedLookupExprClass:
2820 case CXXUnresolvedConstructExprClass:
2821 case RecoveryExprClass:
2824 case CXXTemporaryObjectExprClass:
2825 case CXXConstructExprClass: {
2830 CE->hasUnusedResultAttr(Ctx)) {
2835 if (
unsigned NumArgs = CE->getNumArgs())
2837 CE->getArg(NumArgs - 1)->getEndLoc());
2843 case ObjCMessageExprClass: {
2864 case ObjCPropertyRefExprClass:
2865 case ObjCSubscriptRefExprClass:
2871 case PseudoObjectExprClass: {
2876 POE->getSyntacticForm())) {
2884 if (
auto *BO = dyn_cast<BinaryOperator>(POE->getSyntacticForm()))
2885 if (BO->isAssignmentOp())
2887 if (
auto *UO = dyn_cast<UnaryOperator>(POE->getSyntacticForm()))
2888 if (UO->isIncrementDecrementOp())
2893 return Result &&
Result->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2896 case StmtExprClass: {
2907 if (
const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
2918 case CXXFunctionalCastExprClass:
2919 case CStyleCastExprClass: {
2933 if (
auto *DRE = dyn_cast<DeclRefExpr>(SubE))
2934 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2935 if (!VD->isExternallyVisible())
2951 if (CE->
getCastKind() == CK_ConstructorConversion)
2958 dyn_cast<CXXFunctionalCastExpr>(
this)) {
2959 Loc = CXXCE->getBeginLoc();
2960 R1 = CXXCE->getSubExpr()->getSourceRange();
2968 case ImplicitCastExprClass: {
2978 case CXXDefaultArgExprClass:
2981 case CXXDefaultInitExprClass:
2985 case CXXNewExprClass:
2988 case CXXDeleteExprClass:
2990 case MaterializeTemporaryExprClass:
2993 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2994 case CXXBindTemporaryExprClass:
2996 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2997 case ExprWithCleanupsClass:
2999 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
3000 case OpaqueValueExprClass:
3002 WarnE, Loc, R1, R2, Ctx);
3013 case ObjCIvarRefExprClass:
3015 case Expr::UnaryOperatorClass:
3017 case ImplicitCastExprClass:
3019 case MaterializeTemporaryExprClass:
3022 case CStyleCastExprClass:
3024 case DeclRefExprClass: {
3027 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3028 if (VD->hasGlobalStorage())
3038 case MemberExprClass: {
3042 case ArraySubscriptExprClass:
3054 assert(
expr->hasPlaceholderType(BuiltinType::BoundMember));
3063 return mem->getMemberDecl()->getType();
3069 assert(
type->isFunctionType());
3107 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(
this)) {
3108 if (isa_and_nonnull<CXXConversionDecl>(MCE->getMethodDecl()))
3109 return MCE->getImplicitObjectArgument();
3125 auto IgnoreNoopCastsSingleStep = [&Ctx](
Expr *E) {
3126 if (
auto *CE = dyn_cast<CastExpr>(E)) {
3129 Expr *SubExpr = CE->getSubExpr();
3130 bool IsIdentityCast =
3132 bool IsSameWidthCast = (E->
getType()->isPointerType() ||
3134 (SubExpr->
getType()->isPointerType() ||
3139 if (IsIdentityCast || IsSameWidthCast)
3141 }
else if (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E))
3142 return NTTP->getReplacement();
3147 IgnoreNoopCastsSingleStep);
3152 if (
auto *Cast = dyn_cast<CXXFunctionalCastExpr>(E)) {
3153 auto *SE = Cast->getSubExpr();
3158 if (
auto *
C = dyn_cast<CXXConstructExpr>(E)) {
3159 auto NumArgs =
C->getNumArgs();
3162 Expr *A =
C->getArg(0);
3169 auto IgnoreImplicitMemberCallSingleStep = [](
Expr *E) {
3170 if (
auto *
C = dyn_cast<CXXMemberCallExpr>(E)) {
3171 Expr *ExprNode =
C->getImplicitObjectArgument();
3175 if (
auto *PE = dyn_cast<ParenExpr>(ExprNode)) {
3176 if (PE->getSourceRange() ==
C->getSourceRange()) {
3189 auto IgnoreImplicitCallSingleStep = [](
Expr *E) {
3190 auto *
C = dyn_cast<CallExpr>(E);
3197 unsigned NumArgs =
C->getNumArgs();
3201 Expr *A =
C->getArg(0);
3218 IgnoreImplicitMemberCallSingleStep, IgnoreImplicitCallSingleStep);
3222 const Expr *E =
this;
3224 E = M->getSubExpr();
3227 E = ICE->getSubExprAsWritten();
3236 E = M->getSubExpr();
3239 if (ICE->getCastKind() == CK_NoOp)
3240 E = ICE->getSubExpr();
3246 E = BE->getSubExpr();
3249 if (ICE->getCastKind() == CK_NoOp)
3250 E = ICE->getSubExpr();
3261 if (!
C.hasSameUnqualifiedType(
getType(),
C.getCanonicalTagType(TempTy)))
3277 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E)) {
3278 switch (ICE->getCastKind()) {
3279 case CK_DerivedToBase:
3280 case CK_UncheckedDerivedToBase:
3291 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
3292 if (BO->isPtrMemOp())
3303 const Expr *E =
this;
3308 E =
Paren->getSubExpr();
3313 if (ICE->getCastKind() == CK_NoOp ||
3314 ICE->getCastKind() == CK_LValueToRValue ||
3315 ICE->getCastKind() == CK_DerivedToBase ||
3316 ICE->getCastKind() == CK_UncheckedDerivedToBase) {
3317 E = ICE->getSubExpr();
3322 if (
const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) {
3323 if (UnOp->getOpcode() == UO_Extension) {
3324 E = UnOp->getSubExpr();
3330 = dyn_cast<MaterializeTemporaryExpr>(E)) {
3331 E = M->getSubExpr();
3339 return This->isImplicit();
3347 for (
unsigned I = 0; I < Exprs.size(); ++I)
3355 const Expr **Culprit)
const {
3357 "Expression evaluator can't be called on a dependent expression.");
3369 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
this))
3370 return EWC->getSubExpr()->isConstantInitializer(Ctx,
true, Culprit);
3371 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
this))
3372 return MTE->getSubExpr()->isConstantInitializer(Ctx,
false, Culprit);
3383 case Stmt::ExprWithCleanupsClass:
3385 Ctx, IsForRef, Culprit);
3386 case StringLiteralClass:
3387 case ObjCEncodeExprClass:
3389 case CXXTemporaryObjectExprClass:
3390 case CXXConstructExprClass: {
3399 assert(CE->
getNumArgs() == 1 &&
"trivial ctor with > 1 argument");
3405 case ConstantExprClass: {
3411 case CompoundLiteralExprClass: {
3418 case DesignatedInitUpdateExprClass: {
3423 case InitListExprClass: {
3431 assert(ILE->
isSemanticForm() &&
"InitListExpr must be in semantic form");
3438 for (
unsigned i = 0; i < numInits; i++) {
3446 unsigned ElementNo = 0;
3451 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3452 for (
unsigned i = 0, e = CXXRD->getNumBases(); i < e; i++) {
3453 if (ElementNo < ILE->getNumInits()) {
3461 for (
const auto *Field : RD->fields()) {
3467 if (Field->isUnnamedBitField())
3470 if (ElementNo < ILE->getNumInits()) {
3472 if (Field->isBitField()) {
3481 bool RefType = Field->getType()->isReferenceType();
3492 case ImplicitValueInitExprClass:
3493 case NoInitExprClass:
3495 case ParenExprClass:
3497 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3498 case GenericSelectionExprClass:
3500 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3501 case ChooseExprClass:
3508 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3509 case UnaryOperatorClass: {
3515 case ObjCBoxedExprClass: {
3521 case ObjCArrayLiteralClass: {
3527 case ObjCDictionaryLiteralClass: {
3533 case PackIndexingExprClass: {
3536 ->isConstantInitializer(Ctx,
false, Culprit);
3538 case CXXFunctionalCastExprClass:
3539 case CXXStaticCastExprClass:
3540 case ImplicitCastExprClass:
3541 case CStyleCastExprClass:
3542 case ObjCBridgedCastExprClass:
3543 case CXXDynamicCastExprClass:
3544 case CXXReinterpretCastExprClass:
3545 case CXXAddrspaceCastExprClass:
3546 case CXXConstCastExprClass: {
3562 case MaterializeTemporaryExprClass:
3565 ->isConstantInitializer(Ctx,
false, Culprit);
3567 case SubstNonTypeTemplateParmExprClass:
3569 ->isConstantInitializer(Ctx,
false, Culprit);
3570 case CXXDefaultArgExprClass:
3572 ->isConstantInitializer(Ctx,
false, Culprit);
3573 case CXXDefaultInitExprClass:
3575 ->isConstantInitializer(Ctx,
false, Culprit);
3589 if (BuiltinID != Builtin::BI__assume &&
3590 BuiltinID != Builtin::BI__builtin_assume)
3601 return DirectCallee->getAttr<AllocSizeAttr>();
3603 return IndirectCallee->getAttr<AllocSizeAttr>();
3607std::optional<llvm::APInt>
3611 assert(AllocSize && AllocSize->getElemSizeParam().isValid());
3612 unsigned SizeArgNo = AllocSize->getElemSizeParam().getASTIndex();
3615 return std::nullopt;
3617 auto EvaluateAsSizeT = [&](
const Expr *E, llvm::APSInt &Into) {
3623 if (Into.isNegative() || !Into.isIntN(BitsInSizeT))
3625 Into = Into.zext(BitsInSizeT);
3629 llvm::APSInt SizeOfElem;
3630 if (!EvaluateAsSizeT(
getArg(SizeArgNo), SizeOfElem))
3631 return std::nullopt;
3633 if (!AllocSize->getNumElemsParam().isValid())
3636 llvm::APSInt NumberOfElems;
3637 unsigned NumArgNo = AllocSize->getNumElemsParam().getASTIndex();
3638 if (!EvaluateAsSizeT(
getArg(NumArgNo), NumberOfElems))
3639 return std::nullopt;
3642 llvm::APInt BytesAvailable = SizeOfElem.umul_ov(NumberOfElems, Overflow);
3644 return std::nullopt;
3646 return BytesAvailable;
3657 const bool IncludePossibleEffects;
3658 bool HasSideEffects;
3661 explicit SideEffectFinder(
const ASTContext &Context,
bool IncludePossible)
3662 : Inherited(Context),
3663 IncludePossibleEffects(IncludePossible), HasSideEffects(
false) { }
3665 bool hasSideEffects()
const {
return HasSideEffects; }
3667 void VisitDecl(
const Decl *D) {
3673 if (
auto *VD = dyn_cast<VarDecl>(D)) {
3675 if (IncludePossibleEffects && VD->isThisDeclarationADefinition() &&
3676 VD->needsDestruction(Context))
3677 HasSideEffects =
true;
3681 void VisitDeclStmt(
const DeclStmt *DS) {
3682 for (
auto *D : DS->
decls())
3684 Inherited::VisitDeclStmt(DS);
3687 void VisitExpr(
const Expr *E) {
3688 if (!HasSideEffects &&
3690 HasSideEffects =
true;
3696 bool IncludePossibleEffects)
const {
3700 if (!IncludePossibleEffects &&
getExprLoc().isMacroID())
3705#define ABSTRACT_STMT(Type)
3706#define STMT(Type, Base) case Type##Class:
3707#define EXPR(Type, Base)
3708#include "clang/AST/StmtNodes.inc"
3709 llvm_unreachable(
"unexpected Expr kind");
3711 case DependentScopeDeclRefExprClass:
3712 case CXXUnresolvedConstructExprClass:
3713 case CXXDependentScopeMemberExprClass:
3714 case UnresolvedLookupExprClass:
3715 case UnresolvedMemberExprClass:
3716 case PackExpansionExprClass:
3717 case SubstNonTypeTemplateParmPackExprClass:
3718 case FunctionParmPackExprClass:
3719 case RecoveryExprClass:
3720 case CXXFoldExprClass:
3722 return IncludePossibleEffects;
3724 case DeclRefExprClass:
3725 case ObjCIvarRefExprClass:
3726 case PredefinedExprClass:
3727 case IntegerLiteralClass:
3728 case FixedPointLiteralClass:
3729 case FloatingLiteralClass:
3730 case ImaginaryLiteralClass:
3731 case StringLiteralClass:
3732 case CharacterLiteralClass:
3733 case OffsetOfExprClass:
3734 case ImplicitValueInitExprClass:
3735 case UnaryExprOrTypeTraitExprClass:
3736 case AddrLabelExprClass:
3737 case GNUNullExprClass:
3738 case ArrayInitIndexExprClass:
3739 case NoInitExprClass:
3740 case CXXBoolLiteralExprClass:
3741 case CXXNullPtrLiteralExprClass:
3742 case CXXThisExprClass:
3743 case CXXScalarValueInitExprClass:
3744 case TypeTraitExprClass:
3745 case ArrayTypeTraitExprClass:
3746 case ExpressionTraitExprClass:
3747 case CXXNoexceptExprClass:
3748 case SizeOfPackExprClass:
3749 case ObjCStringLiteralClass:
3750 case ObjCEncodeExprClass:
3751 case ObjCBoolLiteralExprClass:
3752 case ObjCAvailabilityCheckExprClass:
3753 case CXXUuidofExprClass:
3754 case OpaqueValueExprClass:
3755 case SourceLocExprClass:
3756 case EmbedExprClass:
3757 case ConceptSpecializationExprClass:
3758 case RequiresExprClass:
3759 case SYCLUniqueStableNameExprClass:
3760 case PackIndexingExprClass:
3761 case HLSLOutArgExprClass:
3762 case OpenACCAsteriskSizeExprClass:
3763 case CXXReflectExprClass:
3767 case ConstantExprClass:
3770 Ctx, IncludePossibleEffects);
3773 case CXXOperatorCallExprClass:
3774 case CXXMemberCallExprClass:
3775 case CUDAKernelCallExprClass:
3776 case UserDefinedLiteralClass: {
3781 bool IsPure = FD && (FD->
hasAttr<ConstAttr>() || FD->
hasAttr<PureAttr>());
3782 if (IsPure || !IncludePossibleEffects)
3787 case BlockExprClass:
3788 case CXXBindTemporaryExprClass:
3789 if (!IncludePossibleEffects)
3793 case MSPropertyRefExprClass:
3794 case MSPropertySubscriptExprClass:
3795 case CompoundAssignOperatorClass:
3796 case VAArgExprClass:
3797 case AtomicExprClass:
3798 case CXXThrowExprClass:
3799 case CXXNewExprClass:
3800 case CXXDeleteExprClass:
3801 case CoawaitExprClass:
3802 case DependentCoawaitExprClass:
3803 case CoyieldExprClass:
3807 case StmtExprClass: {
3809 SideEffectFinder Finder(Ctx, IncludePossibleEffects);
3811 return Finder.hasSideEffects();
3814 case ExprWithCleanupsClass:
3815 if (IncludePossibleEffects)
3820 case ParenExprClass:
3821 case ArraySubscriptExprClass:
3822 case MatrixSingleSubscriptExprClass:
3823 case MatrixSubscriptExprClass:
3824 case ArraySectionExprClass:
3825 case OMPArrayShapingExprClass:
3826 case OMPIteratorExprClass:
3827 case MemberExprClass:
3828 case ConditionalOperatorClass:
3829 case BinaryConditionalOperatorClass:
3830 case CompoundLiteralExprClass:
3831 case ExtVectorElementExprClass:
3832 case MatrixElementExprClass:
3833 case DesignatedInitExprClass:
3834 case DesignatedInitUpdateExprClass:
3835 case ArrayInitLoopExprClass:
3836 case ParenListExprClass:
3837 case CXXPseudoDestructorExprClass:
3838 case CXXRewrittenBinaryOperatorClass:
3839 case CXXStdInitializerListExprClass:
3840 case SubstNonTypeTemplateParmExprClass:
3841 case MaterializeTemporaryExprClass:
3842 case ShuffleVectorExprClass:
3843 case ConvertVectorExprClass:
3844 case AsTypeExprClass:
3845 case CXXParenListInitExprClass:
3849 case UnaryOperatorClass:
3854 case BinaryOperatorClass:
3859 case InitListExprClass:
3866 case GenericSelectionExprClass:
3868 Ctx, IncludePossibleEffects);
3870 case ChooseExprClass:
3872 Ctx, IncludePossibleEffects);
3874 case CXXDefaultArgExprClass:
3876 Ctx, IncludePossibleEffects);
3878 case CXXDefaultInitExprClass: {
3886 case CXXDynamicCastExprClass: {
3894 case ImplicitCastExprClass:
3895 case CStyleCastExprClass:
3896 case CXXStaticCastExprClass:
3897 case CXXReinterpretCastExprClass:
3898 case CXXConstCastExprClass:
3899 case CXXAddrspaceCastExprClass:
3900 case CXXFunctionalCastExprClass:
3901 case BuiltinBitCastExprClass: {
3906 if (!IncludePossibleEffects)
3916 case CXXTypeidExprClass: {
3918 if (!TE->isPotentiallyEvaluated())
3923 if (IncludePossibleEffects && TE->hasNullCheck())
3929 case CXXConstructExprClass:
3930 case CXXTemporaryObjectExprClass: {
3939 case CXXInheritedCtorInitExprClass: {
3941 if (!ICIE->getConstructor()->isTrivial() && IncludePossibleEffects)
3946 case LambdaExprClass: {
3948 for (
Expr *E : LE->capture_inits())
3954 case PseudoObjectExprClass: {
3961 const Expr *Subexpr = *I;
3963 Subexpr = OVE->getSourceExpr();
3970 case ObjCBoxedExprClass:
3971 case ObjCArrayLiteralClass:
3972 case ObjCDictionaryLiteralClass:
3973 case ObjCSelectorExprClass:
3974 case ObjCProtocolExprClass:
3975 case ObjCIsaExprClass:
3976 case ObjCIndirectCopyRestoreExprClass:
3977 case ObjCSubscriptRefExprClass:
3978 case ObjCBridgedCastExprClass:
3979 case ObjCMessageExprClass:
3980 case ObjCPropertyRefExprClass:
3982 if (IncludePossibleEffects)
3997 if (
auto Call = dyn_cast<CallExpr>(
this))
3998 return Call->getFPFeaturesInEffect(LO);
3999 if (
auto UO = dyn_cast<UnaryOperator>(
this))
4000 return UO->getFPFeaturesInEffect(LO);
4001 if (
auto BO = dyn_cast<BinaryOperator>(
this))
4002 return BO->getFPFeaturesInEffect(LO);
4003 if (
auto Cast = dyn_cast<CastExpr>(
this))
4004 return Cast->getFPFeaturesInEffect(LO);
4005 if (
auto ConvertVector = dyn_cast<ConvertVectorExpr>(
this))
4006 return ConvertVector->getFPFeaturesInEffect(LO);
4019 explicit NonTrivialCallFinder(
const ASTContext &Context)
4020 : Inherited(Context), NonTrivial(
false) { }
4022 bool hasNonTrivialCall()
const {
return NonTrivial; }
4024 void VisitCallExpr(
const CallExpr *E) {
4025 if (
const CXXMethodDecl *
Method
4026 = dyn_cast_or_null<const CXXMethodDecl>(E->
getCalleeDecl())) {
4027 if (
Method->isTrivial()) {
4029 Inherited::VisitStmt(E);
4037 void VisitCXXConstructExpr(
const CXXConstructExpr *E) {
4040 Inherited::VisitStmt(E);
4047 void VisitCXXBindTemporaryExpr(
const CXXBindTemporaryExpr *E) {
4050 if (
const CXXDestructorDecl *DtorDecl =
4052 if (DtorDecl->isTrivial()) {
4053 Inherited::VisitStmt(E);
4064 NonTrivialCallFinder Finder(Ctx);
4066 return Finder.hasNonTrivialCall();
4084 llvm_unreachable(
"Unexpected value dependent expression!");
4112 CE->getSubExpr()->getType()->isIntegerType())
4113 return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4116 }
else if (
const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(
this)) {
4118 return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4119 }
else if (
const ParenExpr *PE = dyn_cast<ParenExpr>(
this)) {
4122 return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4124 dyn_cast<GenericSelectionExpr>(
this)) {
4125 if (GE->isResultDependent())
4127 return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC);
4128 }
else if (
const ChooseExpr *CE = dyn_cast<ChooseExpr>(
this)) {
4129 if (CE->isConditionDependent())
4131 return CE->getChosenSubExpr()->isNullPointerConstant(Ctx, NPC);
4133 = dyn_cast<CXXDefaultArgExpr>(
this)) {
4135 return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
4137 = dyn_cast<CXXDefaultInitExpr>(
this)) {
4139 return DefaultInit->getExpr()->isNullPointerConstant(Ctx, NPC);
4144 = dyn_cast<MaterializeTemporaryExpr>(
this)) {
4145 return M->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4146 }
else if (
const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(
this)) {
4147 if (
const Expr *Source = OVE->getSourceExpr())
4148 return Source->isNullPointerConstant(Ctx, NPC);
4157 if (
getType()->isNullPtrType())
4160 if (
const RecordType *UT =
getType()->getAsUnionType())
4162 UT->getDecl()->getMostRecentDecl()->hasAttr<TransparentUnionAttr>())
4164 const Expr *InitExpr = CLE->getInitializer();
4165 if (
const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
4166 return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
4169 if (!
getType()->isIntegerType() ||
4200 const Expr *E =
this;
4203 "expression is not a property reference");
4206 if (BO->getOpcode() == BO_Comma) {
4221 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
4229 const ObjCMethodDecl *M = dyn_cast<ObjCMethodDecl>(Param->getDeclContext());
4240 if (ICE->getCastKind() == CK_LValueToRValue ||
4241 (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp))
4247 if (
MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
4248 if (
FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
4249 if (Field->isBitField())
4258 if (
DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E)) {
4259 if (
FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
4260 if (Field->isBitField())
4263 if (
BindingDecl *BD = dyn_cast<BindingDecl>(DeclRef->getDecl()))
4264 if (
Expr *E = BD->getBinding())
4269 if (BinOp->isAssignmentOp() && BinOp->getLHS())
4270 return BinOp->getLHS()->getSourceBitField();
4272 if (BinOp->getOpcode() == BO_Comma && BinOp->getRHS())
4273 return BinOp->getRHS()->getSourceBitField();
4277 if (UnOp->isPrefix() && UnOp->isIncrementDecrementOp())
4278 return UnOp->getSubExpr()->getSourceBitField();
4285 if (
auto *DRE = dyn_cast<DeclRefExpr>(E))
4286 return dyn_cast<EnumConstantDecl>(DRE->getDecl());
4295 if (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp)
4302 return ASE->getBase()->getType()->isVectorType();
4307 if (
auto *DRE = dyn_cast<DeclRefExpr>(E))
4308 if (
auto *BD = dyn_cast<BindingDecl>(DRE->getDecl()))
4309 if (
auto *E = BD->getBinding())
4318 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
4319 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
4321 VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
4337 case CXXThisExprClass:
4339 case DeclRefExprClass: {
4345 if (DRE1->getDecl() != DRE2->getDecl())
4348 if ((DRE1->isPRValue() && DRE2->isPRValue()) ||
4349 (DRE1->isLValue() && DRE2->isLValue()))
4354 case ImplicitCastExprClass: {
4357 const auto *ICE1 = dyn_cast<ImplicitCastExpr>(E1);
4358 const auto *ICE2 = dyn_cast<ImplicitCastExpr>(E2);
4361 if (ICE1->getCastKind() != ICE2->getCastKind())
4363 ICE2->IgnoreParenImpCasts());
4367 if (ICE1->getCastKind() == CK_LValueToRValue ||
4368 ICE1->getCastKind() == CK_ArrayToPointerDecay ||
4369 ICE1->getCastKind() == CK_FunctionToPointerDecay) {
4374 const auto *DRE1 = dyn_cast<DeclRefExpr>(E1);
4375 const auto *DRE2 = dyn_cast<DeclRefExpr>(E2);
4379 const auto *Ivar1 = dyn_cast<ObjCIvarRefExpr>(E1);
4380 const auto *Ivar2 = dyn_cast<ObjCIvarRefExpr>(E2);
4381 if (Ivar1 && Ivar2) {
4382 return Ivar1->isFreeIvar() && Ivar2->isFreeIvar() &&
4386 const auto *Array1 = dyn_cast<ArraySubscriptExpr>(E1);
4387 const auto *Array2 = dyn_cast<ArraySubscriptExpr>(E2);
4388 if (Array1 && Array2) {
4392 auto Idx1 = Array1->getIdx();
4393 auto Idx2 = Array2->getIdx();
4394 const auto Integer1 = dyn_cast<IntegerLiteral>(Idx1);
4395 const auto Integer2 = dyn_cast<IntegerLiteral>(Idx2);
4396 if (Integer1 && Integer2) {
4397 if (!llvm::APInt::isSameValue(Integer1->getValue(),
4398 Integer2->getValue()))
4414 if (
const auto *D = dyn_cast<VarDecl>(ME1->getMemberDecl()))
4415 if (D->isStaticDataMember())
4427 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E))
4428 return DRE->getDecl();
4429 if (
const auto *ME = dyn_cast<MemberExpr>(E))
4430 return ME->getMemberDecl();
4449 return VT->getNumElements();
4454 if (
const auto *MT =
getType()->getAs<ConstantMatrixType>())
4455 return MT->getNumElementsFlattened();
4464 StringRef Comp =
Accessor->getName();
4467 if (Comp ==
"hi" || Comp ==
"lo" || Comp ==
"even" || Comp ==
"odd")
4471 if (Comp[0] ==
's' || Comp[0] ==
'S')
4472 Comp = Comp.substr(1);
4474 for (
unsigned i = 0, e = Comp.size(); i != e; ++i)
4475 if (Comp.substr(i + 1).contains(Comp[i]))
4482struct MatrixAccessorFormat {
4483 bool IsZeroIndexed =
false;
4484 unsigned ChunkLen = 0;
4487static MatrixAccessorFormat GetHLSLMatrixAccessorFormat(StringRef Comp) {
4488 assert(!Comp.empty() && Comp[0] ==
'_' &&
"invalid matrix accessor");
4490 MatrixAccessorFormat F;
4491 if (Comp.size() >= 2 && Comp[0] ==
'_' && Comp[1] ==
'm') {
4492 F.IsZeroIndexed =
true;
4495 F.IsZeroIndexed =
false;
4499 assert(F.ChunkLen != 0 &&
"unrecognized matrix swizzle format");
4500 assert(
Comp.size() % F.ChunkLen == 0 &&
4501 "matrix swizzle accessor has invalid length");
4505template <
typename Fn>
4506static bool ForEachMatrixAccessorIndex(StringRef Comp,
4508 auto Format = GetHLSLMatrixAccessorFormat(Comp);
4510 for (
unsigned I = 0, E =
Comp.size(); I < E; I += Format.ChunkLen) {
4511 unsigned Row = 0, Col = 0;
4512 unsigned ZeroIndexOffset =
static_cast<unsigned>(Format.IsZeroIndexed);
4513 unsigned OneIndexOffset =
static_cast<unsigned>(!Format.IsZeroIndexed);
4514 Row =
static_cast<unsigned>(
Comp[I + ZeroIndexOffset + 1] -
'0') -
4516 Col =
static_cast<unsigned>(
Comp[I + ZeroIndexOffset + 2] -
'0') -
4519 assert(Row < MT->getNumRows() && Col < MT->getNumColumns() &&
4520 "matrix swizzle index out of bounds");
4538 StringRef Comp =
Accessor->getName();
4542 bool HasDup =
false;
4543 ForEachMatrixAccessorIndex(Comp, MT, [&](
unsigned Index) ->
bool {
4558 StringRef Comp =
Accessor->getName();
4559 bool isNumericAccessor =
false;
4560 if (Comp[0] ==
's' || Comp[0] ==
'S') {
4561 Comp = Comp.substr(1);
4562 isNumericAccessor =
true;
4565 bool isHi = Comp ==
"hi";
4566 bool isLo = Comp ==
"lo";
4567 bool isEven = Comp ==
"even";
4568 bool isOdd = Comp ==
"odd";
4584 Elts.push_back(Index);
4590 StringRef Comp =
Accessor->getName();
4592 ForEachMatrixAccessorIndex(Comp, MT, [&](
unsigned Index) ->
bool {
4593 Elts.push_back(Index);
4602 BuiltinLoc(BLoc), RParenLoc(RP) {
4604 SubExprs =
new (
C)
Stmt*[args.size()];
4605 for (
unsigned i = 0; i != args.size(); i++)
4606 SubExprs[i] = args[i];
4612 if (SubExprs)
C.Deallocate(SubExprs);
4616 llvm::copy(Exprs, SubExprs);
4619GenericSelectionExpr::GenericSelectionExpr(
4623 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex)
4624 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->
getType(),
4625 AssocExprs[ResultIndex]->getValueKind(),
4626 AssocExprs[ResultIndex]->getObjectKind()),
4627 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4628 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4629 assert(AssocTypes.size() == AssocExprs.size() &&
4630 "Must have the same number of association expressions"
4631 " and TypeSourceInfo!");
4632 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4635 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4637 llvm::copy(AssocExprs,
4638 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4639 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4640 getIndexOfStartOfAssociatedTypes());
4645GenericSelectionExpr::GenericSelectionExpr(
4650 unsigned ResultIndex)
4651 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->
getType(),
4652 AssocExprs[ResultIndex]->getValueKind(),
4653 AssocExprs[ResultIndex]->getObjectKind()),
4654 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4655 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4656 assert(AssocTypes.size() == AssocExprs.size() &&
4657 "Must have the same number of association expressions"
4658 " and TypeSourceInfo!");
4659 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4662 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4664 llvm::copy(AssocExprs,
4665 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4666 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4667 getIndexOfStartOfAssociatedTypes());
4672GenericSelectionExpr::GenericSelectionExpr(
4676 bool ContainsUnexpandedParameterPack)
4677 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4679 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4680 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4681 assert(AssocTypes.size() == AssocExprs.size() &&
4682 "Must have the same number of association expressions"
4683 " and TypeSourceInfo!");
4686 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4688 llvm::copy(AssocExprs,
4689 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4690 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4691 getIndexOfStartOfAssociatedTypes());
4696GenericSelectionExpr::GenericSelectionExpr(
4701 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4703 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4704 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4705 assert(AssocTypes.size() == AssocExprs.size() &&
4706 "Must have the same number of association expressions"
4707 " and TypeSourceInfo!");
4710 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4712 llvm::copy(AssocExprs,
4713 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4714 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4715 getIndexOfStartOfAssociatedTypes());
4720GenericSelectionExpr::GenericSelectionExpr(EmptyShell
Empty,
unsigned NumAssocs)
4721 :
Expr(GenericSelectionExprClass,
Empty), NumAssocs(NumAssocs) {}
4727 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex) {
4728 unsigned NumAssocs = AssocExprs.size();
4729 void *Mem = Context.Allocate(
4730 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4731 alignof(GenericSelectionExpr));
4732 return new (Mem) GenericSelectionExpr(
4733 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4734 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4741 bool ContainsUnexpandedParameterPack) {
4742 unsigned NumAssocs = AssocExprs.size();
4743 void *Mem = Context.Allocate(
4744 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4745 alignof(GenericSelectionExpr));
4746 return new (Mem) GenericSelectionExpr(
4747 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4748 RParenLoc, ContainsUnexpandedParameterPack);
4756 unsigned ResultIndex) {
4757 unsigned NumAssocs = AssocExprs.size();
4758 void *Mem = Context.Allocate(
4759 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4760 alignof(GenericSelectionExpr));
4761 return new (Mem) GenericSelectionExpr(
4762 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4763 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4770 SourceLocation RParenLoc,
bool ContainsUnexpandedParameterPack) {
4771 unsigned NumAssocs = AssocExprs.size();
4772 void *Mem = Context.Allocate(
4773 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4774 alignof(GenericSelectionExpr));
4775 return new (Mem) GenericSelectionExpr(
4776 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4777 RParenLoc, ContainsUnexpandedParameterPack);
4782 unsigned NumAssocs) {
4783 void *Mem = Context.Allocate(
4784 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4785 alignof(GenericSelectionExpr));
4786 return new (Mem) GenericSelectionExpr(
EmptyShell(), NumAssocs);
4807 EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
4808 NumDesignators(Designators.
size()), NumSubExprs(IndexExprs.
size() + 1) {
4809 this->Designators =
new (
C)
Designator[NumDesignators];
4817 unsigned IndexIdx = 0;
4818 for (
unsigned I = 0; I != NumDesignators; ++I) {
4819 this->Designators[I] = Designators[I];
4822 *Child++ = IndexExprs[IndexIdx++];
4825 *Child++ = IndexExprs[IndexIdx++];
4826 *Child++ = IndexExprs[IndexIdx++];
4830 assert(IndexIdx == IndexExprs.size() &&
"Wrong number of index expressions");
4838 bool UsesColonSyntax,
4840 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(IndexExprs.size() + 1),
4841 alignof(DesignatedInitExpr));
4842 return new (Mem) DesignatedInitExpr(
C,
C.VoidTy, Designators,
4843 ColonOrEqualLoc, UsesColonSyntax,
4848 unsigned NumIndexExprs) {
4849 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(NumIndexExprs + 1),
4850 alignof(DesignatedInitExpr));
4851 return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
4856 unsigned NumDesigs) {
4858 NumDesignators = NumDesigs;
4859 for (
unsigned I = 0; I != NumDesigs; ++I)
4860 Designators[I] = Desigs[I];
4864 DesignatedInitExpr *DIE =
const_cast<DesignatedInitExpr*
>(
this);
4872 auto *DIE =
const_cast<DesignatedInitExpr *
>(
this);
4874 if (
First.isFieldDesignator()) {
4877 for (
unsigned int i = 0; i < DIE->size(); i++) {
4885 return First.getLBracketLoc();
4912 unsigned NumNewDesignators =
Last -
First;
4913 if (NumNewDesignators == 0) {
4914 std::copy_backward(Designators + Idx + 1,
4915 Designators + NumDesignators,
4917 --NumNewDesignators;
4920 if (NumNewDesignators == 1) {
4921 Designators[Idx] = *
First;
4926 =
new (
C)
Designator[NumDesignators - 1 + NumNewDesignators];
4927 std::copy(Designators, Designators + Idx, NewDesignators);
4928 std::copy(
First,
Last, NewDesignators + Idx);
4929 std::copy(Designators + Idx + 1, Designators + NumDesignators,
4930 NewDesignators + Idx + NumNewDesignators);
4931 Designators = NewDesignators;
4932 NumDesignators = NumDesignators - 1 + NumNewDesignators;
4941 BaseAndUpdaterExprs[0] = baseExpr;
4946 BaseAndUpdaterExprs[1] = ILE;
4963 LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4965 llvm::copy(Exprs, getTrailingObjects());
4969ParenListExpr::ParenListExpr(EmptyShell
Empty,
unsigned NumExprs)
4978 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(Exprs.size()),
4979 alignof(ParenListExpr));
4980 return new (Mem) ParenListExpr(LParenLoc, Exprs, RParenLoc);
4984 unsigned NumExprs) {
4986 Ctx.
Allocate(totalSizeToAlloc<Stmt *>(NumExprs),
alignof(ParenListExpr));
4987 return new (Mem) ParenListExpr(
EmptyShell(), NumExprs);
4994static std::optional<BinaryOperator *>
4999 ComparedTo = E->
getRHS();
5002 ComparedTo = E->
getLHS();
5007 const Expr *AddLHS =
nullptr, *AddRHS =
nullptr;
5010 if (BO && BO->
getOpcode() == clang::BO_Add) {
5016 if (!AddLHS || !AddRHS)
5019 const Decl *LHSDecl, *RHSDecl, *OtherDecl;
5022 RHSDecl = AddRHS->IgnoreParenImpCasts()->getReferencedDeclOfCallee();
5028 if (!LHSDecl && !RHSDecl)
5031 if ((LHSDecl && LHSDecl == OtherDecl && LHSDecl != RHSDecl) ||
5032 (RHSDecl && RHSDecl == OtherDecl && RHSDecl != LHSDecl))
5054 Result.value()->setExcludedOverflowPattern(
true);
5061 :
Expr(BinaryOperatorClass, ResTy,
VK, OK) {
5064 "Use CompoundAssignOperator for compound assignments");
5067 SubExprs[LHS] = lhs;
5068 SubExprs[RHS] = rhs;
5080 :
Expr(CompoundAssignOperatorClass, ResTy,
VK, OK) {
5084 "Use CompoundAssignOperator for compound assignments");
5086 SubExprs[LHS] = lhs;
5087 SubExprs[RHS] = rhs;
5095 bool HasFPFeatures) {
5118 void *Mem =
C.Allocate(
sizeof(CompoundAssignOperator) +
Extra,
5119 alignof(CompoundAssignOperator));
5120 return new (Mem) CompoundAssignOperator(
C,
EmptyShell(), HasFPFeatures);
5131 void *Mem =
C.Allocate(
sizeof(CompoundAssignOperator) +
Extra,
5132 alignof(CompoundAssignOperator));
5134 CompoundAssignOperator(
C, lhs, rhs, opc, ResTy,
VK, OK, opLoc, FPFeatures,
5135 CompLHSType, CompResultType);
5139 bool hasFPFeatures) {
5140 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
5149 :
Expr(UnaryOperatorClass,
type,
VK, OK), Val(input) {
5165 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
5173 e = ewc->getSubExpr();
5175 e = m->getSubExpr();
5178 e = ice->getSubExpr();
5184 unsigned numSemanticExprs) {
5186 Context.Allocate(totalSizeToAlloc<Expr *>(1 + numSemanticExprs),
5187 alignof(PseudoObjectExpr));
5188 return new(buffer) PseudoObjectExpr(sh, numSemanticExprs);
5191PseudoObjectExpr::PseudoObjectExpr(EmptyShell shell,
unsigned numSemanticExprs)
5192 :
Expr(PseudoObjectExprClass, shell) {
5198 unsigned resultIndex) {
5199 assert(
syntax &&
"no syntactic expression!");
5200 assert(
semantics.size() &&
"no semantic expressions!");
5214 void *buffer =
C.Allocate(totalSizeToAlloc<Expr *>(
semantics.size() + 1),
5215 alignof(PseudoObjectExpr));
5222 unsigned resultIndex)
5235 "opaque-value semantic expressions for pseudo-object "
5236 "operations must have sources");
5238 llvm::copy(
semantics, Trail.drop_front().begin());
5269 NumSubExprs(args.size()), BuiltinLoc(BLoc), RParenLoc(RP), Op(op) {
5270 assert(args.size() ==
getNumSubExprs(op) &&
"wrong number of subexpressions");
5271 for (
unsigned i = 0; i != args.size(); i++)
5272 SubExprs[i] = args[i];
5278 case AO__c11_atomic_init:
5279 case AO__opencl_atomic_init:
5280 case AO__c11_atomic_load:
5281 case AO__atomic_load_n:
5282 case AO__atomic_test_and_set:
5283 case AO__atomic_clear:
5286 case AO__scoped_atomic_load_n:
5287 case AO__opencl_atomic_load:
5288 case AO__hip_atomic_load:
5289 case AO__c11_atomic_store:
5290 case AO__c11_atomic_exchange:
5291 case AO__atomic_load:
5292 case AO__atomic_store:
5293 case AO__atomic_store_n:
5294 case AO__atomic_exchange_n:
5295 case AO__c11_atomic_fetch_add:
5296 case AO__c11_atomic_fetch_sub:
5297 case AO__c11_atomic_fetch_and:
5298 case AO__c11_atomic_fetch_or:
5299 case AO__c11_atomic_fetch_xor:
5300 case AO__c11_atomic_fetch_nand:
5301 case AO__c11_atomic_fetch_max:
5302 case AO__c11_atomic_fetch_min:
5303 case AO__atomic_fetch_add:
5304 case AO__atomic_fetch_sub:
5305 case AO__atomic_fetch_and:
5306 case AO__atomic_fetch_or:
5307 case AO__atomic_fetch_xor:
5308 case AO__atomic_fetch_nand:
5309 case AO__atomic_add_fetch:
5310 case AO__atomic_sub_fetch:
5311 case AO__atomic_and_fetch:
5312 case AO__atomic_or_fetch:
5313 case AO__atomic_xor_fetch:
5314 case AO__atomic_nand_fetch:
5315 case AO__atomic_min_fetch:
5316 case AO__atomic_max_fetch:
5317 case AO__atomic_fetch_min:
5318 case AO__atomic_fetch_max:
5319 case AO__atomic_fetch_uinc:
5320 case AO__atomic_fetch_udec:
5323 case AO__scoped_atomic_load:
5324 case AO__scoped_atomic_store:
5325 case AO__scoped_atomic_store_n:
5326 case AO__scoped_atomic_fetch_add:
5327 case AO__scoped_atomic_fetch_sub:
5328 case AO__scoped_atomic_fetch_and:
5329 case AO__scoped_atomic_fetch_or:
5330 case AO__scoped_atomic_fetch_xor:
5331 case AO__scoped_atomic_fetch_nand:
5332 case AO__scoped_atomic_add_fetch:
5333 case AO__scoped_atomic_sub_fetch:
5334 case AO__scoped_atomic_and_fetch:
5335 case AO__scoped_atomic_or_fetch:
5336 case AO__scoped_atomic_xor_fetch:
5337 case AO__scoped_atomic_nand_fetch:
5338 case AO__scoped_atomic_min_fetch:
5339 case AO__scoped_atomic_max_fetch:
5340 case AO__scoped_atomic_fetch_min:
5341 case AO__scoped_atomic_fetch_max:
5342 case AO__scoped_atomic_exchange_n:
5343 case AO__scoped_atomic_fetch_uinc:
5344 case AO__scoped_atomic_fetch_udec:
5345 case AO__hip_atomic_exchange:
5346 case AO__hip_atomic_fetch_add:
5347 case AO__hip_atomic_fetch_sub:
5348 case AO__hip_atomic_fetch_and:
5349 case AO__hip_atomic_fetch_or:
5350 case AO__hip_atomic_fetch_xor:
5351 case AO__hip_atomic_fetch_min:
5352 case AO__hip_atomic_fetch_max:
5353 case AO__opencl_atomic_store:
5354 case AO__hip_atomic_store:
5355 case AO__opencl_atomic_exchange:
5356 case AO__opencl_atomic_fetch_add:
5357 case AO__opencl_atomic_fetch_sub:
5358 case AO__opencl_atomic_fetch_and:
5359 case AO__opencl_atomic_fetch_or:
5360 case AO__opencl_atomic_fetch_xor:
5361 case AO__opencl_atomic_fetch_min:
5362 case AO__opencl_atomic_fetch_max:
5363 case AO__atomic_exchange:
5366 case AO__scoped_atomic_exchange:
5367 case AO__c11_atomic_compare_exchange_strong:
5368 case AO__c11_atomic_compare_exchange_weak:
5370 case AO__hip_atomic_compare_exchange_strong:
5371 case AO__opencl_atomic_compare_exchange_strong:
5372 case AO__opencl_atomic_compare_exchange_weak:
5373 case AO__hip_atomic_compare_exchange_weak:
5374 case AO__atomic_compare_exchange:
5375 case AO__atomic_compare_exchange_n:
5378 case AO__scoped_atomic_compare_exchange:
5379 case AO__scoped_atomic_compare_exchange_n:
5382 llvm_unreachable(
"unknown atomic op");
5388 return AT->getValueType();
5393 unsigned ArraySectionCount = 0;
5394 while (
auto *OASE = dyn_cast<ArraySectionExpr>(
Base->IgnoreParens())) {
5395 Base = OASE->getBase();
5396 ++ArraySectionCount;
5399 dyn_cast<ArraySubscriptExpr>(
Base->IgnoreParenImpCasts())) {
5400 Base = ASE->getBase();
5401 ++ArraySectionCount;
5403 Base =
Base->IgnoreParenImpCasts();
5404 auto OriginalTy =
Base->getType();
5405 if (
auto *DRE = dyn_cast<DeclRefExpr>(
Base))
5406 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
5407 OriginalTy = PVD->getOriginalType().getNonReferenceType();
5409 for (
unsigned Cnt = 0; Cnt < ArraySectionCount; ++Cnt) {
5410 if (OriginalTy->isAnyPointerType())
5411 OriginalTy = OriginalTy->getPointeeType();
5412 else if (OriginalTy->isArrayType())
5413 OriginalTy = OriginalTy->castAsArrayTypeUnsafe()->getElementType();
5425 BaseTy = ASE->getElementType();
5442 return ASE->getElementType();
5449 :
Expr(RecoveryExprClass, T.getNonReferenceType(),
5450 T->isDependentType() ?
VK_LValue : getValueKindForType(T),
5452 BeginLoc(BeginLoc), EndLoc(EndLoc), NumExprs(SubExprs.size()) {
5453 assert(!T.isNull());
5454 assert(!llvm::is_contained(SubExprs,
nullptr));
5456 llvm::copy(SubExprs, getTrailingObjects());
5464 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(SubExprs.size()),
5465 alignof(RecoveryExpr));
5466 return new (Mem) RecoveryExpr(Ctx, T, BeginLoc, EndLoc, SubExprs);
5470 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(NumSubExprs),
5471 alignof(RecoveryExpr));
5472 return new (Mem) RecoveryExpr(
EmptyShell(), NumSubExprs);
5477 NumDims == Dims.size() &&
5478 "Preallocated number of dimensions is different from the provided one.");
5479 llvm::copy(Dims, getTrailingObjects<Expr *>());
5484 NumDims == BR.size() &&
5485 "Preallocated number of dimensions is different from the provided one.");
5486 llvm::copy(BR, getTrailingObjects<SourceRange>());
5489OMPArrayShapingExpr::OMPArrayShapingExpr(
QualType ExprTy,
Expr *Op,
5493 RPLoc(
R), NumDims(Dims.size()) {
5495 setDimensions(Dims);
5504 assert(Dims.size() == BracketRanges.size() &&
5505 "Different number of dimensions and brackets ranges.");
5506 void *Mem = Context.Allocate(
5507 totalSizeToAlloc<Expr *, SourceRange>(Dims.size() + 1, Dims.size()),
5508 alignof(OMPArrayShapingExpr));
5509 auto *E =
new (Mem) OMPArrayShapingExpr(T, Op, L, R, Dims);
5510 E->setBracketsRanges(BracketRanges);
5516 void *Mem = Context.Allocate(
5517 totalSizeToAlloc<Expr *, SourceRange>(NumDims + 1, NumDims),
5518 alignof(OMPArrayShapingExpr));
5519 return new (Mem) OMPArrayShapingExpr(
EmptyShell(), NumDims);
5522void OMPIteratorExpr::setIteratorDeclaration(
unsigned I,
Decl *D) {
5523 getTrailingObjects<Decl *>(NumIterators)[I] = D;
5526void OMPIteratorExpr::setAssignmentLoc(
unsigned I,
SourceLocation Loc) {
5527 assert(I < NumIterators &&
5528 "Idx is greater or equal the number of iterators definitions.");
5531 static_cast<int>(RangeLocOffset::AssignLoc)] = Loc;
5534void OMPIteratorExpr::setIteratorRange(
unsigned I,
Expr *Begin,
5538 assert(I < NumIterators &&
5539 "Idx is greater or equal the number of iterators definitions.");
5540 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5541 static_cast<int>(RangeExprOffset::Begin)] =
5543 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5544 static_cast<int>(RangeExprOffset::End)] = End;
5545 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5546 static_cast<int>(RangeExprOffset::Step)] = Step;
5548 SourceLocation>()[I *
static_cast<int>(RangeLocOffset::Total) +
5549 static_cast<int>(RangeLocOffset::FirstColonLoc)] =
5552 SourceLocation>()[I *
static_cast<int>(RangeLocOffset::Total) +
5553 static_cast<int>(RangeLocOffset::SecondColonLoc)] =
5558 return getTrailingObjects<Decl *>()[I];
5564 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5565 RangeExprOffset::Total) +
5566 static_cast<int>(RangeExprOffset::Begin)];
5568 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5569 RangeExprOffset::Total) +
5570 static_cast<int>(RangeExprOffset::End)];
5572 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5573 RangeExprOffset::Total) +
5574 static_cast<int>(RangeExprOffset::Step)];
5579 return getTrailingObjects<
5581 static_cast<int>(RangeLocOffset::AssignLoc)];
5585 return getTrailingObjects<
5587 static_cast<int>(RangeLocOffset::FirstColonLoc)];
5591 return getTrailingObjects<
5593 static_cast<int>(RangeLocOffset::SecondColonLoc)];
5597 getTrailingObjects<OMPIteratorHelperData>()[I] = D;
5601 return getTrailingObjects<OMPIteratorHelperData>()[I];
5605 return getTrailingObjects<OMPIteratorHelperData>()[I];
5608OMPIteratorExpr::OMPIteratorExpr(
5613 IteratorKwLoc(IteratorKwLoc), LPLoc(L), RPLoc(R),
5614 NumIterators(
Data.size()) {
5615 for (
unsigned I = 0, E =
Data.size(); I < E; ++I) {
5616 const IteratorDefinition &D = Data[I];
5617 setIteratorDeclaration(I, D.IteratorDecl);
5618 setAssignmentLoc(I, D.AssignmentLoc);
5619 setIteratorRange(I, D.Range.Begin, D.ColonLoc, D.Range.End,
5620 D.SecondColonLoc, D.Range.Step);
5621 setHelper(I, Helpers[I]);
5632 assert(
Data.size() == Helpers.size() &&
5633 "Data and helpers must have the same size.");
5634 void *Mem = Context.Allocate(
5635 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5636 Data.size(),
Data.size() *
static_cast<int>(RangeExprOffset::Total),
5637 Data.size() *
static_cast<int>(RangeLocOffset::Total),
5639 alignof(OMPIteratorExpr));
5640 return new (Mem) OMPIteratorExpr(T, IteratorKwLoc, L, R,
Data, Helpers);
5644 unsigned NumIterators) {
5645 void *Mem = Context.Allocate(
5646 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5647 NumIterators, NumIterators *
static_cast<int>(RangeExprOffset::Total),
5648 NumIterators *
static_cast<int>(RangeLocOffset::Total), NumIterators),
5649 alignof(OMPIteratorExpr));
5650 return new (Mem) OMPIteratorExpr(
EmptyShell(), NumIterators);
5657 return new (
C) HLSLOutArgExpr(Ty,
Base, OpV, WB, IsInOut);
5666 return new (
C) OpenACCAsteriskSizeExpr(Loc,
C.IntTy);
5671 return new (
C) OpenACCAsteriskSizeExpr({},
C.IntTy);
5675 bool hasFPFeatures) {
5676 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
5677 alignof(ConvertVectorExpr));
5678 return new (Mem) ConvertVectorExpr(hasFPFeatures,
EmptyShell());
5686 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
5687 void *Mem =
C.Allocate(Size,
alignof(ConvertVectorExpr));
5688 return new (Mem) ConvertVectorExpr(SrcExpr, TI, DstType,
VK, OK, BuiltinLoc,
5689 RParenLoc, FPFeatures);
5695 StaticValue =
new (Ctx)
APValue;
5698 return *StaticValue;
5702 assert(StaticValue);
5703 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.
Result
Implement __builtin_bit_cast and related operations.
Defines the clang::Preprocessor interface.
static QualType getUnderlyingType(const SubRegion *R)
static bool isRecordType(QualType T)
Defines the SourceManager interface.
Expr * getExpr()
Get 'expr' part of the associated expression/statement.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
static const TypeInfo & getInfo(unsigned id)
a trap message and trap category.
void setValue(const ASTContext &C, const llvm::APInt &Val)
llvm::APInt getValue() const
uint64_t * pVal
Used to store the >64 bits integer value.
uint64_t VAL
Used to store the <= 64 bits integer value.
void setIntValue(const ASTContext &C, const llvm::APInt &Val)
A non-discriminated union of a base, field, or array index.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
static APValue IndeterminateValue()
@ Indeterminate
This object has an indeterminate value (C++ [basic.indet]).
@ None
There is no such object (it's outside its lifetime).
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
Builtin::Context & BuiltinInfo
const LangOptions & getLangOpts() const
Qualifiers::GC getObjCGCAttrKind(QualType Ty) const
Return one of the GCNone, Weak or Strong Objective-C garbage collection attributes.
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
void * Allocate(size_t Size, unsigned Align=8) const
CanQualType UnsignedIntTy
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
StringLiteral * getPredefinedStringLiteralFromCache(StringRef Key) const
Return a string representing the human readable name for the specified function declaration or file n...
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
UnnamedGlobalConstantDecl * getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const
Return a declaration for a uniquified anonymous global constant corresponding to a given APValue.
const TargetInfo & getTargetInfo() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
const Stmt ** const_iterator
QualType getElementType() const
Return the effective 'element' type of this array section.
Expr * getBase()
Get base of the array section.
static QualType getBaseOriginalType(const Expr *Base)
Return original type of the base expression for array section.
QualType getBaseType() const
Returns the effective 'type' of the base of this array section.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
static unsigned getNumSubExprs(AtomicOp Op)
Determine the number of arguments the specified atomic builtin should have.
QualType getValueType() const
AtomicExpr(SourceLocation BLoc, ArrayRef< Expr * > args, QualType t, AtomicOp op, SourceLocation RP)
unsigned getNumSubExprs() const
A builtin binary operation expression such as "x + y" or "x <= y".
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
StringRef getOpcodeStr() const
SourceLocation getOperatorLoc() const
bool hasStoredFPFeatures() const
bool isCompoundAssignmentOp() const
static unsigned sizeOfTrailingObjects(bool HasFPFeatures)
Return the size in bytes needed for the trailing objects.
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
static BinaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static bool isAssignmentOp(Opcode Opc)
static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc, const Expr *LHS, const Expr *RHS)
Return true if a binary operator using the specified opcode and operands would match the 'p = (i8*)nu...
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used only by Serialization.
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
Build a binary operator, assuming that appropriate storage has been allocated for the trailing object...
BinaryOperatorKind Opcode
A binding in a decomposition declaration.
A fixed int type of a specified bitwidth.
SourceLocation getCaretLocation() const
const Stmt * getBody() const
const FunctionProtoType * getFunctionType() const
getFunctionType - Return the underlying function type for this block.
bool isUnevaluated(unsigned ID) const
Returns true if this builtin does not perform the side-effects of its arguments.
CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++ [expr....
static CStyleCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)
SourceLocation getLParenLoc() const
Represents a call to a CUDA kernel function.
Represents a base class of a C++ class.
Represents binding an expression to a temporary.
CXXTemporary * getTemporary()
Represents a call to a C++ constructor.
Expr * getArg(unsigned Arg)
Return the specified argument.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
Represents a C++ constructor within a class.
A default argument (C++ [dcl.fct.default]).
A use of a default initializer in a constructor or in aggregate initialization.
Represents a C++ destructor within a class.
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Represents a call to a member function that may be written either with member call syntax (e....
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
A call to an overloaded operator written using operator syntax.
SourceLocation getOperatorLoc() const
Returns the location of the operator symbol in the expression.
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
SourceRange getSourceRange() const
Represents a C++ struct/union/class.
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
A C++ static_cast expression (C++ [expr.static.cast]).
const CXXDestructorDecl * getDestructor() const
Represents the this expression in C++.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
bool hasStoredFPFeatures() const
std::optional< llvm::APInt > evaluateBytesReturnedByAllocSizeCall(const ASTContext &Ctx) const
Evaluates the total size in bytes allocated by calling a function decorated with alloc_size.
static unsigned sizeOfTrailingObjects(unsigned NumPreArgs, unsigned NumArgs, bool HasFPFeatures)
Return the size in bytes needed for the trailing objects.
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
const AllocSizeAttr * getCalleeAllocSizeAttr() const
Try to get the alloc_size attribute of the callee. May return null.
unsigned getBuiltinCallee() const
getBuiltinCallee - If this is a call to a builtin, return the builtin ID of the callee.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
static CallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Create an empty call expression, for deserialization.
bool isCallToStdMove() const
void setPreArg(unsigned I, Stmt *PreArg)
static constexpr unsigned OffsetToTrailingObjects
void computeDependence()
Compute and set dependence bits.
void setStoredFPFeatures(FPOptionsOverride F)
Set FPOptionsOverride in trailing storage. Used only by Serialization.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
CallExpr(StmtClass SC, Expr *Fn, ArrayRef< Expr * > PreArgs, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs, ADLCallKind UsesADL)
Build a call expression, assuming that appropriate storage has been allocated for the trailing object...
static constexpr unsigned sizeToAllocateForCallExprSubclass(unsigned SizeOfTrailingObjects)
static constexpr ADLCallKind UsesADL
bool isBuiltinAssumeFalse(const ASTContext &Ctx) const
Return true if this is a call to __assume() or __builtin_assume() with a non-value-dependent constant...
QualType getCallReturnType(const ASTContext &Ctx) const
getCallReturnType - Get the return type of the call expr.
bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const
Returns true if this is a call to a builtin which does not evaluate side-effects within its arguments...
unsigned getNumPreArgs() const
bool hasUnusedResultAttr(const ASTContext &Ctx) const
Returns true if this call expression should warn on unused results.
QualType withConst() const
Retrieves a version of this type with const applied.
bool isVolatileQualified() const
Represents the body of a CapturedStmt, and serves as its DeclContext.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
FPOptionsOverride * getTrailingFPFeatures()
Return a pointer to the trailing FPOptions.
NamedDecl * getConversionFunction() const
If this cast applies a user-defined conversion, retrieve the conversion function that it invokes.
Expr * getSubExprAsWritten()
Retrieve the cast subexpression as it was written in the source code, looking through any implicit ca...
CastKind getCastKind() const
bool hasStoredFPFeatures() const
static const FieldDecl * getTargetFieldForToUnionCast(QualType unionType, QualType opType)
CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind, Expr *op, unsigned BasePathSize, bool HasFPFeatures)
const char * getCastKindName() const
SourceLocation getEnd() const
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
void setValue(unsigned Val)
static void print(unsigned val, CharacterLiteralKind Kind, raw_ostream &OS)
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Represents a class template specialization, which refers to a class template with a given set of temp...
bool isExplicitSpecialization() const
CompoundAssignOperator - For compound assignments (e.g.
static CompoundAssignOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
CompoundLiteralExpr - [C99 6.5.2.5].
bool hasStaticStorage() const
APValue & getStaticValue() const
APValue & getOrCreateStaticValue(ASTContext &Ctx) const
CompoundStmt - This represents a group of statements like { stmt stmt }.
ConditionalOperator - The ?
ConstEvaluatedExprVisitor - This class visits 'const Expr *'s.
APValue getAPValueResult() const
static ConstantResultStorageKind getStorageKind(const APValue &Value)
void MoveIntoResult(APValue &Value, const ASTContext &Context)
llvm::APSInt getResultAsAPSInt() const
ConstantResultStorageKind getResultStorageKind() const
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
static ConstantExpr * CreateEmpty(const ASTContext &Context, ConstantResultStorageKind StorageKind)
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumElementsFlattened() const
Returns the number of elements required to embed the matrix into a vector.
unsigned getFlattenedIndex(unsigned Row, unsigned Column, bool IsRowMajor=false) const
Returns the flattened index of a matrix element located at row Row, and column Column.
static ConvertVectorExpr * Create(const ASTContext &C, Expr *SrcExpr, TypeSourceInfo *TI, QualType DstType, ExprValueKind VK, ExprObjectKind OK, SourceLocation BuiltinLoc, SourceLocation RParenLoc, FPOptionsOverride FPFeatures)
static ConvertVectorExpr * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
A POD class for pairing a NamedDecl* with an access specifier.
NamedDecl * getDecl() const
AccessSpecifier getAccess() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
A reference to a declared variable, function, enum, etc.
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
void setDecl(ValueDecl *NewD)
static DeclRefExpr * CreateEmpty(const ASTContext &Context, bool HasQualifier, bool HasFoundDecl, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Construct an empty declaration reference expression.
DeclarationNameInfo getNameInfo() const
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
Decl - This represents one declaration (or definition), e.g.
static bool isFlexibleArrayMemberLike(const ASTContext &Context, const Decl *D, QualType Ty, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution)
Whether it resembles a flexible array member.
ASTContext & getASTContext() const LLVM_READONLY
static Decl * castFromDeclContext(const DeclContext *)
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
DeclarationNameLoc - Additional source/type location info for a declaration name.
Represents a single C99 designator.
unsigned getArrayIndex() const
SourceRange getSourceRange() const LLVM_READONLY
bool isFieldDesignator() const
SourceLocation getBeginLoc() const LLVM_READONLY
struct FieldDesignatorInfo FieldInfo
A field designator, e.g., ".x".
bool isArrayRangeDesignator() const
FieldDecl * getFieldDecl() const
bool isArrayDesignator() const
SourceLocation getFieldLoc() const
const IdentifierInfo * getFieldName() const
SourceLocation getDotLoc() const
static DesignatedInitExpr * CreateEmpty(const ASTContext &C, unsigned NumIndexExprs)
Expr * getArrayRangeEnd(const Designator &D) const
Expr * getSubExpr(unsigned Idx) const
SourceRange getDesignatorsSourceRange() const
Expr * getArrayRangeStart(const Designator &D) const
void ExpandDesignator(const ASTContext &C, unsigned Idx, const Designator *First, const Designator *Last)
Replaces the designator at index Idx with the series of designators in [First, Last).
Expr * getArrayIndex(const Designator &D) const
Designator * getDesignator(unsigned Idx)
Expr * getInit() const
Retrieve the initializer value.
unsigned size() const
Returns the number of designators in this initializer.
SourceLocation getBeginLoc() const LLVM_READONLY
void setDesignators(const ASTContext &C, const Designator *Desigs, unsigned NumDesigs)
SourceLocation getEndLoc() const LLVM_READONLY
static DesignatedInitExpr * Create(const ASTContext &C, ArrayRef< Designator > Designators, ArrayRef< Expr * > IndexExprs, SourceLocation EqualOrColonLoc, bool GNUSyntax, Expr *Init)
SourceLocation getBeginLoc() const LLVM_READONLY
DesignatedInitUpdateExpr(const ASTContext &C, SourceLocation lBraceLoc, Expr *baseExprs, SourceLocation rBraceLoc)
SourceLocation getEndLoc() const LLVM_READONLY
InitListExpr * getUpdater() const
const Expr * getBase() const
IdentifierInfo * Accessor
EmbedExpr(const ASTContext &Ctx, SourceLocation Loc, EmbedDataStorage *Data, unsigned Begin, unsigned NumOfElements)
An instance of this object exists for each enum constant that is defined.
ExplicitCastExpr - An explicit cast written in the source code.
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
EnumConstantDecl * getEnumConstantDecl()
If this expression refers to an enum constant, retrieve its declaration.
bool isReadIfDiscardedInCPlusPlus11() const
Determine whether an lvalue-to-rvalue conversion should implicitly be applied to this expression if i...
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
@ SE_AllowSideEffects
Allow any unmodeled side effect.
@ SE_AllowUndefinedBehavior
Allow UB that we can give a value, but not arbitrary unmodeled side effects.
static QualType findBoundMemberType(const Expr *expr)
Given an expression of bound-member type, find the type of the member.
static std::pair< const NamedDecl *, const WarnUnusedResultAttr * > getUnusedResultAttrImpl(const Decl *Callee, QualType ReturnType)
Returns the WarnUnusedResultAttr that is declared on the callee or its return type declaration,...
bool isImplicitCXXThis() const
Whether this expression is an implicit reference to 'this' in C++.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc, SourceRange &R1, SourceRange &R2, ASTContext &Ctx) const
isUnusedResultAWarning - Return true if this immediate expression should be warned about if the resul...
LValueClassification ClassifyLValue(ASTContext &Ctx) const
Reasons why an expression might not be an l-value.
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool refersToVectorElement() const
Returns whether this expression refers to a vector element.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParenLValueCasts() LLVM_READONLY
Skip past any parentheses and lvalue casts which might surround this expression until reaching a fixe...
FPOptions getFPFeaturesInEffect(const LangOptions &LO) const
Returns the set of floating point options that apply to this expression.
const CXXRecordDecl * getBestDynamicClassType() const
For an expression of class type or pointer to class type, return the most derived class decl the expr...
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreConversionOperatorSingleStep() LLVM_READONLY
Skip conversion operators.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
bool isObjCSelfExpr() const
Check if this expression is the ObjC 'self' implicit parameter.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isFlexibleArrayMemberLike(const ASTContext &Context, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution=false) const
Check whether this array fits the idiom of a flexible array member, depending on the value of -fstric...
bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsLValue - Evaluate an expression to see if we can fold it to an lvalue with link time known ...
bool isEvaluatable(const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects) const
isEvaluatable - Call EvaluateAsRValue to see if this expression can be constant folded without side-e...
Expr * IgnoreParenBaseCasts() LLVM_READONLY
Skip past any parentheses and derived-to-base casts until reaching a fixed point.
bool isConstantInitializer(ASTContext &Ctx, bool ForRef=false, const Expr **Culprit=nullptr) const
Returns true if this expression can be emitted to IR as a constant, and thus can be used as a constan...
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
NullPointerConstantValueDependence
Enumeration used to describe how isNullPointerConstant() should cope with value-dependent expressions...
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_NeverValueDependent
Specifies that the expression should never be value-dependent.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
Expr * IgnoreUnlessSpelledInSource()
Skip past any invisible AST nodes which might surround this statement, such as ExprWithCleanups or Im...
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
Expr * IgnoreCasts() LLVM_READONLY
Skip past any casts which might surround this expression until reaching a fixed point.
Decl * getReferencedDeclOfCallee()
Expr * IgnoreImplicitAsWritten() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
const Expr * getBestDynamicClassTypeExpr() const
Get the inner expression that determines the best dynamic class.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind
Enumeration used to describe the kind of Null pointer constant returned from isNullPointerConstant().
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
@ NPCK_ZeroLiteral
Expression is a Null pointer constant built from a literal zero.
@ NPCK_CXX11_nullptr
Expression is a C++11 nullptr.
@ NPCK_GNUNull
Expression is a GNU-style __null constant.
@ NPCK_NotNull
Expression is not a Null pointer constant.
bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsBooleanCondition - Return true if this is a constant which we can fold and convert to a boo...
bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
QualType getEnumCoercedType(const ASTContext &Ctx) const
If this expression is an enumeration constant, return the enumeration type under which said constant ...
bool isBoundMemberFunction(ASTContext &Ctx) const
Returns true if this expression is a bound member function.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
static bool isSameComparisonOperand(const Expr *E1, const Expr *E2)
Checks that the two Expr's will refer to the same value as a comparison operand.
bool isDefaultArgument() const
Determine whether this expression is a default function argument.
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
bool hasNonTrivialCall(const ASTContext &Ctx) const
Determine whether this expression involves a call to any function that is not trivial.
bool refersToGlobalRegisterVar() const
Returns whether this expression refers to a global register variable.
bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const
isCXX98IntegralConstantExpr - Return true if this expression is an integral constant expression in C+...
const ValueDecl * getAsBuiltinConstantDeclRef(const ASTContext &Context) const
If this expression is an unambiguous reference to a single declaration, in the style of __builtin_fun...
bool isOBJCGCCandidate(ASTContext &Ctx) const
isOBJCGCCandidate - Return true if this expression may be used in a read/ write barrier.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
const Expr * skipRValueSubobjectAdjustments() const
bool isKnownToHaveBooleanValue(bool Semantic=true) const
isKnownToHaveBooleanValue - Return true if this is an integer expression that is known to return 0 or...
void setDependence(ExprDependence Deps)
Each concrete expr subclass is expected to compute its dependence and call this in the constructor.
const ObjCPropertyRefExpr * getObjCProperty() const
If this expression is an l-value for an Objective C property, find the underlying property reference ...
bool containsDuplicateElements() const
containsDuplicateElements - Return true if any element access is repeated.
bool isArrow() const
isArrow - Return true if the base expression is a pointer to vector, return false if the base express...
void getEncodedElementAccess(SmallVectorImpl< uint32_t > &Elts) const
getEncodedElementAccess - Encode the elements accessed into an llvm aggregate Constant of ConstantInt...
unsigned getNumElements() const
getNumElements - Get the number of components being selected.
static int getAccessorIdx(char c, bool isNumericAccessor)
Represents difference between two FPOptions values.
bool requiresTrailingStorage() const
static FPOptions defaultWithoutTrailingStorage(const LangOptions &LO)
Return the default value of FPOptions that's used when trailing storage isn't required.
Represents a member of a struct/union/class.
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool isBitField() const
Determines whether this field is a bitfield.
static FixedPointLiteral * Create(const ASTContext &C, EmptyShell Empty)
Returns an empty fixed-point literal.
std::string getValueAsString(unsigned Radix) const
llvm::APInt getValue() const
Returns an internal integer representation of the literal.
static FixedPointLiteral * CreateFromRawInt(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l, unsigned Scale)
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
double getValueAsApproximateDouble() const
getValueAsApproximateDouble - This returns the value as an inaccurate double.
llvm::APFloat getValue() const
FullExpr - Represents a "full-expression" node.
Represents a function declaration or definition.
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Represents a prototype with parameter type info, e.g.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
bool isExplicitSpecialization() const
TemplateArgumentList * TemplateArguments
The template arguments used to produce the function template specialization from the function templat...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
Represents a C11 generic selection.
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
static GenericSelectionExpr * CreateEmpty(const ASTContext &Context, unsigned NumAssocs)
Create an empty generic selection expression for deserialization.
GlobalDecl - represents a global declaration.
static HLSLOutArgExpr * CreateEmpty(const ASTContext &Ctx)
static HLSLOutArgExpr * Create(const ASTContext &C, QualType Ty, OpaqueValueExpr *Base, OpaqueValueExpr *OpV, Expr *WB, bool IsInOut)
One of these records is kept for each identifier that is lexed.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
static ImplicitCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
Describes an C or C++ initializer list.
bool hasArrayFiller() const
Return true if this is an array initializer and its array "filler" has been set.
bool isTransparent() const
Is this a transparent initializer list (that is, an InitListExpr that is purely syntactic,...
void resizeInits(const ASTContext &Context, unsigned NumInits)
Specify the number of initializers.
bool isStringLiteralInit() const
Is this an initializer for an array of characters, initialized by a string literal or an @encode?
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isSemanticForm() const
void setInit(unsigned Init, Expr *expr)
Expr * updateInit(const ASTContext &C, unsigned Init, Expr *expr)
Updates the initializer at index Init with the new expression expr, and returns the old expression at...
void setArrayFiller(Expr *filler)
InitListExpr * getSyntacticForm() const
InitListExpr(const ASTContext &C, SourceLocation lbraceloc, ArrayRef< Expr * > initExprs, SourceLocation rbraceloc, bool isExplicit)
const Expr * getInit(unsigned Init) const
bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const
Is this the zero initializer {0} in a language which considers it idiomatic?
SourceLocation getEndLoc() const LLVM_READONLY
bool isSyntacticForm() const
ArrayRef< Expr * > inits() const
void sawArrayRangeDesignator(bool ARD=true)
Expr ** getInits()
Retrieve the set of initializers.
void reserveInits(const ASTContext &C, unsigned NumInits)
Reserve space for some number of initializers.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
LabelStmt - Represents a label, which has a substatement.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
StrictFlexArraysLevelKind
@ AddUnsignedOverflowTest
if (a + b < a)
@ AddSignedOverflowTest
if (a + b < a)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isOverflowPatternExcluded(OverflowPatternExclusionKind Kind) const
void remapPathPrefix(SmallVectorImpl< char > &Path) const
Remap path prefix according to -fmacro-prefix-path option.
Lexer - This provides a simple interface that turns a text buffer into a stream of tokens.
bool LexFromRawLexer(Token &Result)
LexFromRawLexer - Lex a token from a designated raw lexer (one with no associated preprocessor object...
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Characters, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token,...
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
bool containsDuplicateElements() const
containsDuplicateElements - Return true if any element access is repeated.
void getEncodedElementAccess(SmallVectorImpl< uint32_t > &Elts) const
getEncodedElementAccess - Encode the elements accessed into an llvm aggregate Constant of ConstantInt...
unsigned getNumElements() const
getNumElements - Get the number of components being selected.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
static MemberExpr * CreateEmpty(const ASTContext &Context, bool HasQualifier, bool HasFoundDecl, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
void setMemberDecl(ValueDecl *D)
NestedNameSpecifierLoc getQualifierLoc() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name,...
bool hasExplicitTemplateArgs() const
Determines whether the member name was followed by an explicit template argument list.
bool hasQualifier() const
Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...
static MemberExpr * Create(const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR)
bool isImplicitAccess() const
Determine whether the base of this explicit is implicit.
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
DeclarationNameInfo getMemberNameInfo() const
Retrieve the member declaration name info.
A pointer to member type per C++ 8.3.3 - Pointers to members.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
A C++ nested-name-specifier augmented with source location information.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
bool hasQualifier() const
Evaluates true when this nested-name-specifier location is non-empty.
An explicit cast in C or a C-style cast in C++, which uses the syntax ([s1][s2]......
static OMPArrayShapingExpr * CreateEmpty(const ASTContext &Context, unsigned NumDims)
static OMPArrayShapingExpr * Create(const ASTContext &Context, QualType T, Expr *Op, SourceLocation L, SourceLocation R, ArrayRef< Expr * > Dims, ArrayRef< SourceRange > BracketRanges)
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
static OMPIteratorExpr * Create(const ASTContext &Context, QualType T, SourceLocation IteratorKwLoc, SourceLocation L, SourceLocation R, ArrayRef< IteratorDefinition > Data, ArrayRef< OMPIteratorHelperData > Helpers)
static OMPIteratorExpr * CreateEmpty(const ASTContext &Context, unsigned NumIterators)
SourceLocation getSecondColonLoc(unsigned I) const
Gets the location of the second ':' (if any) in the range for the given iteratori definition.
SourceLocation getColonLoc(unsigned I) const
Gets the location of the first ':' in the range for the given iterator definition.
IteratorRange getIteratorRange(unsigned I)
Gets the iterator range for the given iterator.
OMPIteratorHelperData & getHelper(unsigned I)
Fetches helper data for the specified iteration space.
SourceLocation getAssignLoc(unsigned I) const
Gets the location of '=' for the given iterator definition.
Decl * getIteratorDecl(unsigned I)
Gets the iterator declaration for the given iterator.
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
ObjCBoxedExpr - used for generalized expression boxing.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
Represents an ObjC class declaration.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
ObjCMethodFamily getMethodFamily() const
bool isInstanceMessage() const
Determine whether this is an instance message to either a computed object or to super.
bool hasUnusedResultAttr(ASTContext &Ctx) const
Returns true if this message send should warn on unused results.
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
bool isExpressibleAsConstantInitializer() const
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
static OffsetOfExpr * CreateEmpty(const ASTContext &C, unsigned NumComps, unsigned NumExprs)
static OffsetOfExpr * Create(const ASTContext &C, QualType type, SourceLocation OperatorLoc, TypeSourceInfo *tsi, ArrayRef< OffsetOfNode > comps, ArrayRef< Expr * > exprs, SourceLocation RParenLoc)
void setIndexExpr(unsigned Idx, Expr *E)
void setComponent(unsigned Idx, OffsetOfNode ON)
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
InitListExprBitfields InitListExprBits
ParenListExprBitfields ParenListExprBits
StmtIterator child_iterator
Child Iterators: All subclasses must implement 'children' to permit easy iteration over the substatem...
CallExprBitfields CallExprBits
ShuffleVectorExprBitfields ShuffleVectorExprBits
FloatingLiteralBitfields FloatingLiteralBits
child_iterator child_begin()
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
UnaryOperatorBitfields UnaryOperatorBits
SourceLocExprBitfields SourceLocExprBits
ConstantExprBitfields ConstantExprBits
llvm::iterator_range< child_iterator > child_range
StringLiteralBitfields StringLiteralBits
MemberExprBitfields MemberExprBits
DeclRefExprBitfields DeclRefExprBits
ConstStmtIterator const_child_iterator
PredefinedExprBitfields PredefinedExprBits
SourceLocation getBeginLoc() const LLVM_READONLY
BinaryOperatorBitfields BinaryOperatorBits
PseudoObjectExprBitfields PseudoObjectExprBits
llvm::iterator_range< const_child_iterator > const_child_range
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
unsigned getOffsetOfStringByte(const Token &TheTok, unsigned ByteNo) const
getOffsetOfStringByte - This function returns the offset of the specified byte of the string data rep...
unsigned GetStringLength() const
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
unsigned getLength() const
StringLiteralKind getKind() const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
SourceLocation getLocationOfByte(unsigned ByteNo, const SourceManager &SM, const LangOptions &Features, const TargetInfo &Target, unsigned *StartToken=nullptr, unsigned *StartTokenByteOffset=nullptr) const
getLocationOfByte - Return a source location that points to the specified byte of this string literal...
uint32_t getCodeUnit(size_t i) const
void outputString(raw_ostream &OS) const
static StringLiteral * CreateEmpty(const ASTContext &Ctx, unsigned NumConcatenated, unsigned Length, unsigned CharByteWidth)
Construct an empty string literal.
unsigned getNumConcatenated() const
getNumConcatenated - Get the number of string literal tokens that were concatenated in translation ph...
Represents the declaration of a struct/union/class/enum.
Exposes information about the current target.
A convenient class for passing around template argument information.
A template argument list.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
Location wrapper for a TemplateArgument.
void print(const PrintingPolicy &Policy, raw_ostream &Out, bool IncludeType) const
Print this template argument to the given output stream.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
Token - This structure provides full information about a lexed token.
A container of type source information.
The base class of the type hierarchy.
bool isBooleanType() const
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
CXXRecordDecl * castAsCXXRecordDecl() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isSpecificPlaceholderType(unsigned K) const
Test for a specific placeholder type.
bool isReferenceType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
RecordDecl * castAsRecordDecl() const
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
QualType getArgumentType() const
bool isArgumentType() const
UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo, QualType resultType, SourceLocation op, SourceLocation rp)
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
SourceLocation getOperatorLoc() const
getOperatorLoc - Return the location of the operator.
Expr * getSubExpr() const
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given unary opcode.
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix)
Retrieve the unary opcode that corresponds to the given overloaded operator.
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used by Serialization & ASTImporter.
UnaryOperator(const ASTContext &Ctx, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
static UnaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Stmt(StmtClass SC, EmptyShell)
Construct an empty statement.
Represents a variable declaration or definition.
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
bool Comp(InterpState &S, 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.
OptionalUnsigned< unsigned > UnsignedOrNone
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,...