37#include "llvm/Support/ErrorHandling.h"
38#include "llvm/Support/Format.h"
39#include "llvm/Support/raw_ostream.h"
51 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
52 if (BO->getOpcode() == BO_Comma) {
59 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
60 E = MTE->getSubExpr();
77 DerivedType = ATy->getElementType();
92 if (
const auto *CE = dyn_cast<CastExpr>(E)) {
93 if ((CE->getCastKind() == CK_DerivedToBase ||
94 CE->getCastKind() == CK_UncheckedDerivedToBase) &&
102 if (CE->getCastKind() == CK_NoOp) {
103 E = CE->getSubExpr();
106 }
else if (
const auto *ME = dyn_cast<MemberExpr>(E)) {
107 if (!ME->isArrow()) {
108 assert(ME->getBase()->getType()->getAsRecordDecl());
109 if (
const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
110 if (!Field->isBitField() && !Field->getType()->isReferenceType()) {
117 }
else if (
const auto *BO = dyn_cast<BinaryOperator>(E)) {
118 if (BO->getOpcode() == BO_PtrMemD) {
119 assert(BO->getRHS()->isPRValue());
125 if (BO->getOpcode() == BO_Comma) {
126 CommaLHSs.push_back(BO->getLHS());
148 BIT && BIT->
isUnsigned() && BIT->getNumBits() == 1)
152 switch (UO->getOpcode()) {
154 return UO->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
166 return CE->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
169 switch (BO->getOpcode()) {
170 default:
return false;
185 return BO->getLHS()->isKnownToHaveBooleanValue(Semantic) &&
186 BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
190 return BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
195 return CO->getTrueExpr()->isKnownToHaveBooleanValue(Semantic) &&
196 CO->getFalseExpr()->isKnownToHaveBooleanValue(Semantic);
201 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(E))
202 return OVE->getSourceExpr()->isKnownToHaveBooleanValue(Semantic);
205 if (!Semantic && FD->getType()->isUnsignedIntegerType() &&
206 !FD->getBitWidth()->isValueDependent() && FD->getBitWidthValue() == 1)
215 bool IgnoreTemplateOrMacroSubstitution)
const {
217 const Decl *D =
nullptr;
219 if (
const auto *ME = dyn_cast<MemberExpr>(E))
220 D = ME->getMemberDecl();
221 else if (
const auto *DRE = dyn_cast<DeclRefExpr>(E))
223 else if (
const auto *IRE = dyn_cast<ObjCIvarRefExpr>(E))
227 StrictFlexArraysLevel,
228 IgnoreTemplateOrMacroSubstitution);
238 if (
Value.isMemberPointer())
239 return Value.getMemberPointerDecl();
241 if (
Value.isLValue() &&
Value.getLValueOffset().isZero())
255 template <
class E,
class T>
258 return static_cast<const E*
>(
expr)->getExprLoc();
268 return static_cast<const E *
>(
expr)->getBeginLoc();
277 if (ED->isCompleteDefinition())
286#define ABSTRACT_STMT(type)
287#define STMT(type, base) \
288 case Stmt::type##Class: break;
289#define EXPR(type, base) \
290 case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
291#include "clang/AST/StmtNodes.inc"
293 llvm_unreachable(
"unknown expression kind");
304 "Invalid StorageKind Value");
314 if (!
Value.getInt().needsCleanup())
324 if (
T->isIntegralOrEnumerationType() && Context.getTypeInfo(
T).Width <= 64)
330 bool IsImmediateInvocation)
331 :
FullExpr(ConstantExprClass, SubExpr) {
340 ::new (getTrailingObjects<APValue>())
APValue();
345 bool IsImmediateInvocation) {
349 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
352 void *Mem = Context.Allocate(Size,
alignof(ConstantExpr));
353 return new (Mem) ConstantExpr(E, StorageKind, IsImmediateInvocation);
359 ConstantExpr *
Self =
Create(Context, E, StorageKind);
364ConstantExpr::ConstantExpr(EmptyShell
Empty,
370 ::new (getTrailingObjects<APValue>())
APValue();
377 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
380 void *Mem = Context.Allocate(Size,
alignof(ConstantExpr));
381 return new (Mem) ConstantExpr(
EmptyShell(), StorageKind);
386 "Invalid storage for this value kind");
392 Int64Result() = *
Value.getInt().getRawData();
399 Context.addDestruction(&APValueResult());
401 APValueResult() = std::move(
Value);
404 llvm_unreachable(
"Invalid ResultKind Bits");
410 return APValueResult().getInt();
415 llvm_unreachable(
"invalid Accessor");
423 return APValueResult();
433 llvm_unreachable(
"invalid ResultKind");
437 bool RefersToEnclosingVariableOrCapture,
QualType T,
447 RefersToEnclosingVariableOrCapture;
448 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
455DeclRefExpr::DeclRefExpr(
const ASTContext &Ctx,
458 bool RefersToEnclosingVariableOrCapture,
467 new (getTrailingObjects<NestedNameSpecifierLoc>())
471 *getTrailingObjects<NamedDecl *>() = FoundD;
473 = (TemplateArgs || TemplateKWLoc.
isValid()) ? 1 : 0;
475 RefersToEnclosingVariableOrCapture;
476 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
479 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
480 TemplateKWLoc, *TemplateArgs,
481 getTrailingObjects<TemplateArgumentLoc>());
483 auto Deps = TemplateArgumentDependence::None;
485 Deps |= Loc.getArgument().getDependence();
486 assert(!(Deps & TemplateArgumentDependence::Dependent) &&
487 "built a DeclRefExpr with dependent template args");
489 }
else if (TemplateKWLoc.
isValid()) {
490 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
501 bool RefersToEnclosingVariableOrCapture,
506 return Create(Context, QualifierLoc, TemplateKWLoc, D,
507 RefersToEnclosingVariableOrCapture,
509 T,
VK, FoundD, TemplateArgs, NOUR);
515 bool RefersToEnclosingVariableOrCapture,
525 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
529 QualifierLoc ? 1 : 0, FoundD ? 1 : 0,
530 HasTemplateKWAndArgsInfo ? 1 : 0,
531 TemplateArgs ? TemplateArgs->
size() : 0);
533 void *Mem = Context.Allocate(Size,
alignof(DeclRefExpr));
534 return new (Mem) DeclRefExpr(Context, QualifierLoc, TemplateKWLoc, D,
535 RefersToEnclosingVariableOrCapture, NameInfo,
536 FoundD, TemplateArgs,
T,
VK, NOUR);
542 bool HasTemplateKWAndArgsInfo,
543 unsigned NumTemplateArgs) {
544 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
548 HasQualifier ? 1 : 0, HasFoundDecl ? 1 : 0, HasTemplateKWAndArgsInfo,
550 void *Mem = Context.Allocate(Size,
alignof(DeclRefExpr));
556 if (
getType()->isUndeducedType())
567SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(
SourceLocation OpLoc,
573 OpLoc(OpLoc), LParen(LParen), RParen(RParen) {
574 setTypeSourceInfo(TSI);
578SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(EmptyShell
Empty,
588 SYCLUniqueStableNameExpr(OpLoc, LParen, RParen, ResultTy, TSI);
594 return new (Ctx) SYCLUniqueStableNameExpr(
EmptyShell(), ResultTy);
606 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
607 return RD->getDeviceLambdaManglingNumber();
612 Context, Context.getDiagnostics(), MangleCallback)};
616 llvm::raw_string_ostream Out(Buffer);
617 Ctx->mangleCanonicalTypeName(Ty, Out);
627 assert((getIdentKind() == IK) &&
628 "IdentKind do not fit in PredefinedExprBitfields!");
629 bool HasFunctionName = SL !=
nullptr;
638PredefinedExpr::PredefinedExpr(EmptyShell
Empty,
bool HasFunctionName)
646 bool HasFunctionName = SL !=
nullptr;
647 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
648 alignof(PredefinedExpr));
649 return new (Mem) PredefinedExpr(L, FNTy, IK, IsTransparent, SL);
653 bool HasFunctionName) {
654 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
655 alignof(PredefinedExpr));
656 return new (Mem) PredefinedExpr(
EmptyShell(), HasFunctionName);
664 return "__FUNCTION__";
666 return "__FUNCDNAME__";
668 return "L__FUNCTION__";
670 return "__PRETTY_FUNCTION__";
672 return "__FUNCSIG__";
674 return "L__FUNCSIG__";
678 llvm_unreachable(
"Unknown ident kind for PredefinedExpr");
684 const Decl *CurrentDecl,
685 bool ForceElaboratedPrinting) {
689 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(CurrentDecl)) {
690 std::unique_ptr<MangleContext> MC;
691 MC.reset(Context.createMangleContext());
693 if (MC->shouldMangleDeclName(ND)) {
695 llvm::raw_svector_ostream Out(Buffer);
701 else if (
auto FD = dyn_cast<FunctionDecl>(ND)) {
705 MC->mangleName(GD, Out);
707 if (!Buffer.empty() && Buffer.front() ==
'\01')
708 return std::string(Buffer.substr(1));
709 return std::string(Buffer);
711 return std::string(ND->getIdentifier()->getName());
720 if (DC->isFileContext())
724 llvm::raw_svector_ostream Out(Buffer);
725 if (
auto *DCBlock = dyn_cast<BlockDecl>(DC))
728 else if (
auto *DCDecl = dyn_cast<Decl>(DC))
730 return std::string(Out.str());
732 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
733 const auto &LO = Context.getLangOpts();
734 bool IsFuncOrFunctionInNonMSVCCompatEnv =
736 IK == PredefinedIdentKind ::Function) &&
738 bool IsLFunctionInMSVCCommpatEnv =
740 bool IsFuncOrFunctionOrLFunctionOrFuncDName =
745 if ((ForceElaboratedPrinting &&
746 (IsFuncOrFunctionInNonMSVCCompatEnv || IsLFunctionInMSVCCommpatEnv)) ||
747 (!ForceElaboratedPrinting && IsFuncOrFunctionOrLFunctionOrFuncDName))
748 return FD->getNameAsString();
751 llvm::raw_svector_ostream Out(Name);
756 if (MD->isStatic() && !ForceElaboratedPrinting)
763 std::string remapPath(StringRef Path)
const override {
766 return std::string(p);
773 PrettyCallbacks PrettyCB(Context.getLangOpts());
778 llvm::raw_string_ostream POut(Proto);
787 const Type *Ty =
Decl->getType().getTypePtrOrNull();
793 if (FD->hasWrittenPrototype())
794 FT = dyn_cast<FunctionProtoType>(AFT);
799 case CC_C: POut <<
"__cdecl ";
break;
810 FD->printQualifiedName(POut, Policy);
814 return std::string(Name);
819 for (
unsigned i = 0, e =
Decl->getNumParams(); i != e; ++i) {
821 POut <<
Decl->getParamDecl(i)->getType().stream(Policy);
824 if (FT->isVariadic()) {
825 if (FD->getNumParams()) POut <<
", ";
829 !Context.getLangOpts().CPlusPlus) &&
830 !
Decl->getNumParams()) {
837 assert(FT &&
"We must have a written prototype in this case.");
840 if (FT->isVolatile())
852 while (isa_and_nonnull<NamedDecl>(Ctx)) {
854 = dyn_cast<ClassTemplateSpecializationDecl>(Ctx);
856 Specs.push_back(Spec);
860 std::string TemplateParams;
861 llvm::raw_string_ostream TOut(TemplateParams);
864 D->getSpecializedTemplate()->getTemplateParameters();
866 assert(Params->
size() == Args.
size());
867 for (
unsigned i = 0, numParams = Params->
size(); i != numParams; ++i) {
869 if (Param.empty())
continue;
870 TOut << Param <<
" = ";
879 = FD->getTemplateSpecializationInfo();
884 assert(Params->
size() == Args->
size());
885 for (
unsigned i = 0, e = Params->
size(); i != e; ++i) {
887 if (Param.empty())
continue;
888 TOut << Param <<
" = ";
889 Args->
get(i).
print(Policy, TOut,
true);
894 if (!TemplateParams.empty()) {
896 TemplateParams.resize(TemplateParams.size() - 2);
897 POut <<
" [" << TemplateParams <<
"]";
905 Proto =
"auto " + Proto;
906 else if (FT && FT->getReturnType()->getAs<DecltypeType>())
908 ->getAs<DecltypeType>()
916 return std::string(Name);
918 if (
const CapturedDecl *CD = dyn_cast<CapturedDecl>(CurrentDecl)) {
922 if (DC->isFunctionOrMethod() && (DC->getDeclKind() != Decl::Captured)) {
926 llvm_unreachable(
"CapturedDecl not inside a function or method");
928 if (
const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
930 llvm::raw_svector_ostream Out(Name);
931 Out << (MD->isInstanceMethod() ?
'-' :
'+');
940 dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
941 Out <<
'(' << *CID <<
')';
944 MD->getSelector().print(Out);
947 return std::string(Name);
958 const llvm::APInt &Val) {
963 unsigned NumWords = Val.getNumWords();
964 const uint64_t* Words = Val.getRawData();
966 pVal =
new (
C) uint64_t[NumWords];
967 std::copy(Words, Words + NumWords,
pVal);
968 }
else if (NumWords == 1)
974IntegerLiteral::IntegerLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
977 assert(
type->isIntegerType() &&
"Illegal type in IntegerLiteral");
978 assert(
V.getBitWidth() ==
C.getIntWidth(
type) &&
979 "Integer type is not the correct size for constant.");
987 return new (
C) IntegerLiteral(
C,
V,
type, l);
992 return new (
C) IntegerLiteral(
Empty);
995FixedPointLiteral::FixedPointLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
1000 assert(
type->isFixedPointType() &&
"Illegal type in FixedPointLiteral");
1001 assert(
V.getBitWidth() ==
C.getTypeInfo(
type).Width &&
1002 "Fixed point type is not the correct size for constant.");
1008 const llvm::APInt &
V,
1012 return new (
C) FixedPointLiteral(
C,
V,
type, l, Scale);
1017 return new (
C) FixedPointLiteral(
Empty);
1026 S, llvm::APSInt::getUnsigned(
getValue().getZExtValue()), Scale);
1027 return std::string(S);
1050 if (!Escaped.empty()) {
1051 OS <<
"'" << Escaped <<
"'";
1060 OS <<
"'" << (char)Val <<
"'";
1062 OS <<
"'\\x" << llvm::format(
"%02x", Val) <<
"'";
1063 else if (Val <= 0xFFFF)
1064 OS <<
"'\\u" << llvm::format(
"%04x", Val) <<
"'";
1066 OS <<
"'\\U" << llvm::format(
"%08x", Val) <<
"'";
1070FloatingLiteral::FloatingLiteral(
const ASTContext &
C,
const llvm::APFloat &
V,
1073 setSemantics(
V.getSemantics());
1081 setRawSemantics(llvm::APFloatBase::S_IEEEhalf);
1088 return new (
C) FloatingLiteral(
C,
V, isexact,
Type, L);
1093 return new (
C) FloatingLiteral(
C,
Empty);
1102 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
1104 return V.convertToDouble();
1109 unsigned CharByteWidth = 0;
1114 CharByteWidth =
Target.getCharWidth();
1117 CharByteWidth =
Target.getWCharWidth();
1120 CharByteWidth =
Target.getChar16Width();
1123 CharByteWidth =
Target.getChar32Width();
1126 return sizeof(char);
1128 assert((CharByteWidth & 7) == 0 &&
"Assumes character size is byte multiple");
1130 assert((CharByteWidth == 1 || CharByteWidth == 2 || CharByteWidth == 4) &&
1131 "The only supported character byte widths are 1,2 and 4!");
1132 return CharByteWidth;
1135StringLiteral::StringLiteral(
const ASTContext &Ctx, StringRef Str,
1140 unsigned Length = Str.size();
1147 "StringLiteral must be of constant array type!");
1148 unsigned CharByteWidth = mapCharByteWidth(Ctx.
getTargetInfo(), Kind);
1149 unsigned ByteLength = Str.size();
1150 assert((ByteLength % CharByteWidth == 0) &&
1151 "The size of the data must be a multiple of CharByteWidth!");
1156 switch (CharByteWidth) {
1158 Length = ByteLength;
1161 Length = ByteLength / 2;
1164 Length = ByteLength / 4;
1167 llvm_unreachable(
"Unsupported character width!");
1173 assert(!Pascal &&
"Can't make an unevaluated Pascal string");
1178 *getTrailingObjects<unsigned>() = Length;
1182 llvm::copy(Locs, getTrailingObjects<SourceLocation>());
1185 llvm::copy(Str, getTrailingObjects<char>());
1190StringLiteral::StringLiteral(EmptyShell
Empty,
unsigned NumConcatenated,
1191 unsigned Length,
unsigned CharByteWidth)
1195 *getTrailingObjects<unsigned>() = Length;
1202 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1203 1, Locs.size(), Str.size()),
1204 alignof(StringLiteral));
1205 return new (Mem) StringLiteral(Ctx, Str, Kind, Pascal, Ty, Locs);
1209 unsigned NumConcatenated,
1211 unsigned CharByteWidth) {
1212 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1213 1, NumConcatenated, Length * CharByteWidth),
1214 alignof(StringLiteral));
1216 StringLiteral(
EmptyShell(), NumConcatenated, Length, CharByteWidth);
1239 static const char Hex[] =
"0123456789ABCDEF";
1242 for (
unsigned I = 0, N =
getLength(); I != N; ++I) {
1245 if (Escaped.empty()) {
1251 Char >= 0xd800 && Char <= 0xdbff) {
1253 if (Trail >= 0xdc00 && Trail <= 0xdfff) {
1254 Char = 0x10000 + ((Char - 0xd800) << 10) + (Trail - 0xdc00);
1264 (Char >= 0xd800 && Char <= 0xdfff) || Char >= 0x110000) {
1268 while ((Char >> Shift) == 0)
1270 for (; Shift >= 0; Shift -= 4)
1271 OS << Hex[(Char >> Shift) & 15];
1278 << Hex[(Char >> 20) & 15]
1279 << Hex[(Char >> 16) & 15];
1282 OS << Hex[(Char >> 12) & 15]
1283 << Hex[(Char >> 8) & 15]
1284 << Hex[(Char >> 4) & 15]
1285 << Hex[(Char >> 0) & 15];
1291 if (LastSlashX + 1 == I) {
1293 case '0':
case '1':
case '2':
case '3':
case '4':
1294 case '5':
case '6':
case '7':
case '8':
case '9':
1295 case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
1296 case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
1301 assert(Char <= 0xff &&
1302 "Characters above 0xff should already have been handled.");
1308 << (char)(
'0' + ((Char >> 6) & 7))
1309 << (char)(
'0' + ((Char >> 3) & 7))
1310 << (char)(
'0' + ((Char >> 0) & 7));
1339 unsigned *StartTokenByteOffset)
const {
1348 "Only narrow string literals are currently supported");
1353 unsigned StringOffset = 0;
1355 TokNo = *StartToken;
1356 if (StartTokenByteOffset) {
1357 StringOffset = *StartTokenByteOffset;
1358 ByteNo -= StringOffset;
1374 if (StartTokenByteOffset !=
nullptr)
1375 *StartTokenByteOffset = StringOffset;
1376 if (StartToken !=
nullptr)
1377 *StartToken = TokNo;
1378 return StrTokSpellingLoc;
1381 const char *StrData = Buffer.data()+LocInfo.second;
1385 Buffer.begin(), StrData, Buffer.end());
1394 if (ByteNo < TokNumBytes ||
1400 if (StartTokenByteOffset !=
nullptr)
1401 *StartTokenByteOffset = StringOffset;
1402 if (StartToken !=
nullptr)
1403 *StartToken = TokNo;
1408 StringOffset += TokNumBytes;
1410 ByteNo -= TokNumBytes;
1416 if (StartIndex > Length)
1417 return std::nullopt;
1420 StringRef::size_type Pos =
getString().substr(StartIndex).find(
'\0');
1421 if (Pos == StringRef::npos)
1422 return Length - StartIndex;
1427 for (
unsigned I = StartIndex; I != Length; ++I) {
1440#define UNARY_OPERATION(Name, Spelling) case UO_##Name: return Spelling;
1441#include "clang/AST/OperationKinds.def"
1443 llvm_unreachable(
"Unknown unary operator");
1449 default: llvm_unreachable(
"No unary operator for overloaded function");
1450 case OO_PlusPlus:
return Postfix ? UO_PostInc : UO_PreInc;
1451 case OO_MinusMinus:
return Postfix ? UO_PostDec : UO_PreDec;
1452 case OO_Amp:
return UO_AddrOf;
1453 case OO_Star:
return UO_Deref;
1454 case OO_Plus:
return UO_Plus;
1455 case OO_Minus:
return UO_Minus;
1456 case OO_Tilde:
return UO_Not;
1457 case OO_Exclaim:
return UO_LNot;
1458 case OO_Coawait:
return UO_Coawait;
1464 case UO_PostInc:
case UO_PreInc:
return OO_PlusPlus;
1465 case UO_PostDec:
case UO_PreDec:
return OO_MinusMinus;
1466 case UO_AddrOf:
return OO_Amp;
1467 case UO_Deref:
return OO_Star;
1468 case UO_Plus:
return OO_Plus;
1469 case UO_Minus:
return OO_Minus;
1470 case UO_Not:
return OO_Tilde;
1471 case UO_LNot:
return OO_Exclaim;
1472 case UO_Coawait:
return OO_Coawait;
1484 case Expr::CallExprClass:
1486 case Expr::CXXOperatorCallExprClass:
1488 case Expr::CXXMemberCallExprClass:
1490 case Expr::UserDefinedLiteralClass:
1492 case Expr::CUDAKernelCallExprClass:
1495 llvm_unreachable(
"unexpected class deriving from CallExpr!");
1503 "we assume CXXOperatorCallExpr is at most 32 bytes");
1510 NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1511 unsigned NumPreArgs = PreArgs.size();
1513 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1515 "This CallExpr subclass is too big or unsupported");
1520 for (
unsigned I = 0; I != NumPreArgs; ++I)
1522 for (
unsigned I = 0; I != Args.size(); ++I)
1524 for (
unsigned I = Args.size(); I != NumArgs; ++I)
1531 CallExprBits.ExplicitObjectMemFunUsingMemberSyntax =
false;
1542 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1545 CallExprBits.ExplicitObjectMemFunUsingMemberSyntax =
false;
1554 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1561 new (Mem)
CallExpr(CallExprClass, Fn, {}, Args, Ty,
VK,
1562 RParenLoc, FPFeatures, MinNumArgs,
UsesADL);
1563 E->updateTrailingSourceLoc();
1569 unsigned SizeOfTrailingObjects =
1585 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1586 return DRE->getDecl();
1588 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1589 return ME->getMemberDecl();
1593 while (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(CEE))
1598 if (
auto *BO = dyn_cast<BinaryOperator>(CEE)) {
1599 if (BO->isPtrMemOp()) {
1603 }
else if (
auto *UO = dyn_cast<UnaryOperator>(CEE)) {
1604 if (UO->getOpcode() == UO_Deref || UO->getOpcode() == UO_AddrOf ||
1605 UO->getOpcode() == UO_Plus) {
1613 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1614 return DRE->getDecl();
1615 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1616 return ME->getMemberDecl();
1617 if (
auto *BE = dyn_cast<BlockExpr>(CEE))
1618 return BE->getBlockDecl();
1626 return FDecl ? FDecl->getBuiltinID() : 0;
1637 QualType CalleeType = Callee->getType();
1651 assert(!CalleeType.
isNull());
1670std::pair<const NamedDecl *, const WarnUnusedResultAttr *>
1673 if (Callee !=
nullptr)
1674 if (
const auto *A = Callee->getAttr<WarnUnusedResultAttr>())
1675 return {
nullptr, A};
1680 if (
const auto *A = TD->getAttr<WarnUnusedResultAttr>())
1685 if (
const auto *A = TD->getDecl()->getAttr<WarnUnusedResultAttr>())
1686 return {TD->getDecl(), A};
1687 return {
nullptr,
nullptr};
1696 void *Mem =
C.Allocate(
1697 totalSizeToAlloc<OffsetOfNode, Expr *>(comps.size(), exprs.size()));
1699 return new (Mem) OffsetOfExpr(
C,
type, OperatorLoc, tsi, comps, exprs,
1704 unsigned numComps,
unsigned numExprs) {
1706 C.Allocate(totalSizeToAlloc<OffsetOfNode, Expr *>(numComps, numExprs));
1707 return new (Mem) OffsetOfExpr(numComps, numExprs);
1715 OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
1716 NumComps(comps.size()), NumExprs(exprs.size()) {
1717 for (
unsigned i = 0; i != comps.size(); ++i)
1719 for (
unsigned i = 0; i != exprs.size(); ++i)
1734 UnaryExprOrTypeTrait ExprKind,
Expr *E,
QualType resultType,
1737 OpLoc(op), RParenLoc(rp) {
1738 assert(ExprKind <= UETT_Last &&
"invalid enum value!");
1741 "UnaryExprOrTypeTraitExprBits.Kind overflow!");
1755 :
Expr(MemberExprClass,
T,
VK, OK),
Base(
Base), MemberDecl(MemberDecl),
1756 MemberDNLoc(NameInfo.
getInfo()), MemberLoc(NameInfo.getLoc()) {
1762 FoundDecl.
getDecl() != MemberDecl ||
1765 TemplateArgs || TemplateKWLoc.
isValid();
1771 new (getTrailingObjects<NestedNameSpecifierLoc>())
1774 *getTrailingObjects<DeclAccessPair>() = FoundDecl;
1776 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1777 TemplateKWLoc, *TemplateArgs,
1778 getTrailingObjects<TemplateArgumentLoc>());
1779 }
else if (TemplateKWLoc.
isValid()) {
1780 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1793 bool HasFoundDecl = FoundDecl.
getDecl() != MemberDecl ||
1794 FoundDecl.
getAccess() != MemberDecl->getAccess();
1795 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
1799 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1800 TemplateArgs ? TemplateArgs->
size() : 0);
1802 void *Mem =
C.Allocate(Size,
alignof(MemberExpr));
1803 return new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, QualifierLoc,
1804 TemplateKWLoc, MemberDecl, FoundDecl, NameInfo,
1805 TemplateArgs,
T,
VK, OK, NOUR);
1809 bool HasQualifier,
bool HasFoundDecl,
1810 bool HasTemplateKWAndArgsInfo,
1811 unsigned NumTemplateArgs) {
1812 assert((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
1813 "template args but no template arg info?");
1817 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1819 void *Mem = Context.Allocate(Size,
alignof(MemberExpr));
1825 if (
getType()->isUndeducedType())
1841 return BaseStartLoc;
1853bool CastExpr::CastConsistency()
const {
1855 case CK_DerivedToBase:
1856 case CK_UncheckedDerivedToBase:
1857 case CK_DerivedToBaseMemberPointer:
1858 case CK_BaseToDerived:
1859 case CK_BaseToDerivedMemberPointer:
1860 assert(!
path_empty() &&
"Cast kind should have a base path!");
1863 case CK_CPointerToObjCPointerCast:
1864 assert(
getType()->isObjCObjectPointerType());
1866 goto CheckNoBasePath;
1868 case CK_BlockPointerToObjCPointerCast:
1869 assert(
getType()->isObjCObjectPointerType());
1871 goto CheckNoBasePath;
1873 case CK_ReinterpretMemberPointer:
1874 assert(
getType()->isMemberPointerType());
1876 goto CheckNoBasePath;
1882 if (!
getType()->isPointerType()) {
1883 assert(
getType()->isObjCObjectPointerType() ==
1885 assert(
getType()->isBlockPointerType() ==
1888 goto CheckNoBasePath;
1890 case CK_AnyPointerToBlockPointerCast:
1891 assert(
getType()->isBlockPointerType());
1894 goto CheckNoBasePath;
1896 case CK_CopyAndAutoreleaseBlockObject:
1897 assert(
getType()->isBlockPointerType());
1899 goto CheckNoBasePath;
1901 case CK_FunctionToPointerDecay:
1902 assert(
getType()->isPointerType());
1904 goto CheckNoBasePath;
1906 case CK_AddressSpaceConversion: {
1915 (!Ty.
isNull() && !SETy.isNull() &&
1917 goto CheckNoBasePath;
1922 case CK_ArrayToPointerDecay:
1923 case CK_NullToMemberPointer:
1924 case CK_NullToPointer:
1925 case CK_ConstructorConversion:
1926 case CK_IntegralToPointer:
1927 case CK_PointerToIntegral:
1929 case CK_VectorSplat:
1930 case CK_IntegralCast:
1931 case CK_BooleanToSignedIntegral:
1932 case CK_IntegralToFloating:
1933 case CK_FloatingToIntegral:
1934 case CK_FloatingCast:
1935 case CK_ObjCObjectLValueCast:
1936 case CK_FloatingRealToComplex:
1937 case CK_FloatingComplexToReal:
1938 case CK_FloatingComplexCast:
1939 case CK_FloatingComplexToIntegralComplex:
1940 case CK_IntegralRealToComplex:
1941 case CK_IntegralComplexToReal:
1942 case CK_IntegralComplexCast:
1943 case CK_IntegralComplexToFloatingComplex:
1944 case CK_ARCProduceObject:
1945 case CK_ARCConsumeObject:
1946 case CK_ARCReclaimReturnedObject:
1947 case CK_ARCExtendBlockObject:
1948 case CK_ZeroToOCLOpaqueType:
1949 case CK_IntToOCLSampler:
1950 case CK_FloatingToFixedPoint:
1951 case CK_FixedPointToFloating:
1952 case CK_FixedPointCast:
1953 case CK_FixedPointToIntegral:
1954 case CK_IntegralToFixedPoint:
1957 goto CheckNoBasePath;
1960 case CK_LValueToRValue:
1962 case CK_AtomicToNonAtomic:
1963 case CK_NonAtomicToAtomic:
1964 case CK_PointerToBoolean:
1965 case CK_IntegralToBoolean:
1966 case CK_FloatingToBoolean:
1967 case CK_MemberPointerToBoolean:
1968 case CK_FloatingComplexToBoolean:
1969 case CK_IntegralComplexToBoolean:
1970 case CK_LValueBitCast:
1971 case CK_LValueToRValueBitCast:
1972 case CK_UserDefinedConversion:
1973 case CK_BuiltinFnToFnPtr:
1974 case CK_FixedPointToBoolean:
1975 case CK_HLSLArrayRValue:
1976 case CK_HLSLVectorTruncation:
1977 case CK_HLSLMatrixTruncation:
1978 case CK_HLSLElementwiseCast:
1979 case CK_HLSLAggregateSplatCast:
1981 assert(
path_empty() &&
"Cast kind should not have a base path!");
1989#define CAST_OPERATION(Name) case CK_##Name: return #Name;
1990#include "clang/AST/OperationKinds.def"
1992 llvm_unreachable(
"Unhandled cast kind!");
1998static Expr *ignoreImplicitSemaNodes(
Expr *E) {
1999 if (
auto *Materialize = dyn_cast<MaterializeTemporaryExpr>(E))
2000 return Materialize->getSubExpr();
2002 if (
auto *Binder = dyn_cast<CXXBindTemporaryExpr>(E))
2003 return Binder->getSubExpr();
2005 if (
auto *
Full = dyn_cast<FullExpr>(E))
2006 return Full->getSubExpr();
2008 if (
auto *CPLIE = dyn_cast<CXXParenListInitExpr>(E);
2009 CPLIE && CPLIE->getInitExprs().size() == 1)
2010 return CPLIE->getInitExprs()[0];
2017 const Expr *SubExpr =
nullptr;
2019 for (
const CastExpr *E =
this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
2024 if (E->getCastKind() == CK_ConstructorConversion) {
2026 ignoreImplicitSemaNodes);
2027 }
else if (E->getCastKind() == CK_UserDefinedConversion) {
2029 "Unexpected SubExpr for CK_UserDefinedConversion.");
2030 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2031 SubExpr = MCE->getImplicitObjectArgument();
2035 return const_cast<Expr *
>(SubExpr);
2039 const Expr *SubExpr =
nullptr;
2041 for (
const CastExpr *E =
this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
2044 if (E->getCastKind() == CK_ConstructorConversion)
2047 if (E->getCastKind() == CK_UserDefinedConversion) {
2048 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2049 return MCE->getMethodDecl();
2058#define ABSTRACT_STMT(x)
2059#define CASTEXPR(Type, Base) \
2060 case Stmt::Type##Class: \
2061 return static_cast<Type *>(this) \
2062 ->getTrailingObjectsNonStrict<CXXBaseSpecifier *>();
2063#define STMT(Type, Base)
2064#include "clang/AST/StmtNodes.inc"
2066 llvm_unreachable(
"non-cast expressions not possible here");
2080 Field != FieldEnd; ++Field) {
2082 !Field->isUnnamedBitField()) {
2092 case ImplicitCastExprClass:
2094 ->getTrailingObjects<FPOptionsOverride>();
2095 case CStyleCastExprClass:
2097 ->getTrailingObjects<FPOptionsOverride>();
2098 case CXXFunctionalCastExprClass:
2100 ->getTrailingObjects<FPOptionsOverride>();
2101 case CXXStaticCastExprClass:
2103 ->getTrailingObjects<FPOptionsOverride>();
2105 llvm_unreachable(
"Cast does not have FPFeatures");
2114 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2116 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2120 assert((Kind != CK_LValueToRValue ||
2121 !(
T->isNullPtrType() ||
2122 (
T->getAsCXXRecordDecl() && !
C.getLangOpts().HLSL))) &&
2123 "invalid type for lvalue-to-rvalue conversion");
2124 ImplicitCastExpr *E =
2125 new (Buffer) ImplicitCastExpr(
T, Kind, Operand, PathSize, FPO,
VK);
2127 llvm::uninitialized_copy(*BasePath,
2134 bool HasFPFeatures) {
2136 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2137 PathSize, HasFPFeatures));
2138 return new (Buffer) ImplicitCastExpr(
EmptyShell(), PathSize, HasFPFeatures);
2147 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2149 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2152 new (Buffer) CStyleCastExpr(
T,
VK, K, Op, PathSize, FPO, WrittenTy, L, R);
2154 llvm::uninitialized_copy(*BasePath,
2161 bool HasFPFeatures) {
2163 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2164 PathSize, HasFPFeatures));
2165 return new (Buffer) CStyleCastExpr(
EmptyShell(), PathSize, HasFPFeatures);
2172#define BINARY_OPERATION(Name, Spelling) case BO_##Name: return Spelling;
2173#include "clang/AST/OperationKinds.def"
2175 llvm_unreachable(
"Invalid OpCode!");
2181 default: llvm_unreachable(
"Not an overloadable binary operator");
2182 case OO_Plus:
return BO_Add;
2183 case OO_Minus:
return BO_Sub;
2184 case OO_Star:
return BO_Mul;
2185 case OO_Slash:
return BO_Div;
2186 case OO_Percent:
return BO_Rem;
2187 case OO_Caret:
return BO_Xor;
2188 case OO_Amp:
return BO_And;
2189 case OO_Pipe:
return BO_Or;
2190 case OO_Equal:
return BO_Assign;
2191 case OO_Spaceship:
return BO_Cmp;
2192 case OO_Less:
return BO_LT;
2193 case OO_Greater:
return BO_GT;
2194 case OO_PlusEqual:
return BO_AddAssign;
2195 case OO_MinusEqual:
return BO_SubAssign;
2196 case OO_StarEqual:
return BO_MulAssign;
2197 case OO_SlashEqual:
return BO_DivAssign;
2198 case OO_PercentEqual:
return BO_RemAssign;
2199 case OO_CaretEqual:
return BO_XorAssign;
2200 case OO_AmpEqual:
return BO_AndAssign;
2201 case OO_PipeEqual:
return BO_OrAssign;
2202 case OO_LessLess:
return BO_Shl;
2203 case OO_GreaterGreater:
return BO_Shr;
2204 case OO_LessLessEqual:
return BO_ShlAssign;
2205 case OO_GreaterGreaterEqual:
return BO_ShrAssign;
2206 case OO_EqualEqual:
return BO_EQ;
2207 case OO_ExclaimEqual:
return BO_NE;
2208 case OO_LessEqual:
return BO_LE;
2209 case OO_GreaterEqual:
return BO_GE;
2210 case OO_AmpAmp:
return BO_LAnd;
2211 case OO_PipePipe:
return BO_LOr;
2212 case OO_Comma:
return BO_Comma;
2213 case OO_ArrowStar:
return BO_PtrMemI;
2220 OO_Star, OO_Slash, OO_Percent,
2222 OO_LessLess, OO_GreaterGreater,
2224 OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
2225 OO_EqualEqual, OO_ExclaimEqual,
2231 OO_Equal, OO_StarEqual,
2232 OO_SlashEqual, OO_PercentEqual,
2233 OO_PlusEqual, OO_MinusEqual,
2234 OO_LessLessEqual, OO_GreaterGreaterEqual,
2235 OO_AmpEqual, OO_CaretEqual,
2239 return OverOps[Opc];
2251 if (LHS->getType()->isPointerType()) {
2252 if (!RHS->getType()->isIntegerType())
2255 }
else if (RHS->getType()->isPointerType()) {
2256 if (!LHS->getType()->isIntegerType())
2268 if (!Select->getCond()->EvaluateAsBooleanCondition(
EvalResult, Ctx))
2270 PExp =
EvalResult ? Select->getTrueExpr() : Select->getFalseExpr();
2291 BuiltinLoc(BLoc), RParenLoc(RParenLoc), ParentContext(ParentContext) {
2295 ? ExprDependence::ValueInstantiation
2296 : ExprDependence::None);
2302 return "__builtin_FILE";
2304 return "__builtin_FILE_NAME";
2306 return "__builtin_FUNCTION";
2308 return "__builtin_FUNCSIG";
2310 return "__builtin_LINE";
2312 return "__builtin_COLUMN";
2314 return "__builtin_source_location";
2316 llvm_unreachable(
"unexpected IdentKind!");
2320 const Expr *DefaultExpr)
const {
2324 if (
const auto *DIE = dyn_cast_if_present<CXXDefaultInitExpr>(DefaultExpr)) {
2325 Loc = DIE->getUsedLocation();
2326 Context = DIE->getUsedContext();
2327 }
else if (
const auto *DAE =
2328 dyn_cast_if_present<CXXDefaultArgExpr>(DefaultExpr)) {
2329 Loc = DAE->getUsedLocation();
2330 Context = DAE->getUsedContext();
2341 if (
const auto *D = dyn_cast<CXXMethodDecl>(Context);
2343 Context = D->getParent()->getParent();
2348 auto MakeStringLiteral = [&](StringRef Tmp) {
2352 LValuePathEntry Path[1] = {LValuePathEntry::ArrayIndex(0)};
2363 return MakeStringLiteral(
FileName);
2369 return MakeStringLiteral(Path);
2373 const auto *CurDecl = dyn_cast<Decl>(Context);
2377 return MakeStringLiteral(
2397 StringRef Name = F->getName();
2398 if (Name ==
"_M_file_name") {
2402 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(Path);
2403 }
else if (Name ==
"_M_function_name") {
2406 const auto *CurDecl = dyn_cast<Decl>(Context);
2407 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(
2412 }
else if (Name ==
"_M_line") {
2414 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2415 }
else if (Name ==
"_M_column") {
2417 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2428 llvm_unreachable(
"unhandled case");
2433 unsigned NumOfElements)
2435 EmbedKeywordLoc(Loc), Ctx(&Ctx), Data(Data), Begin(Begin),
2436 NumOfElements(NumOfElements) {
2439 Ctx, llvm::APInt::getZero(Ctx.getTypeSize(
getType())),
getType(), Loc);
2440 assert(
getType()->isSignedIntegerType() &&
"IntTy should be signed");
2447 InitExprs(
C, initExprs.size()), LBraceLoc(lbraceloc),
2450 InitExprs.insert(
C, InitExprs.end(), initExprs.begin(), initExprs.end());
2457 if (NumInits > InitExprs.size())
2458 InitExprs.reserve(
C, NumInits);
2462 InitExprs.resize(
C, NumInits,
nullptr);
2466 if (
Init >= InitExprs.size()) {
2467 InitExprs.insert(
C, InitExprs.end(),
Init - InitExprs.size() + 1,
nullptr);
2479 ArrayFillerOrUnionFieldInit = filler;
2482 for (
unsigned i = 0, e =
getNumInits(); i != e; ++i)
2483 if (
inits[i] ==
nullptr)
2497 Init =
Init->IgnoreParenImpCasts();
2502 assert(
isSemanticForm() &&
"syntactic form never semantically transparent");
2506 assert(
getNumInits() == 1 &&
"multiple inits in glvalue init list");
2525 assert(
isSyntacticForm() &&
"only test syntactic form as zero initializer");
2532 return Lit && Lit->
getValue() == 0;
2537 return SyntacticForm->getBeginLoc();
2542 E = InitExprs.end();
2545 Beg = S->getBeginLoc();
2555 return SyntacticForm->getEndLoc();
2559 for (
Stmt *S : llvm::reverse(InitExprs)) {
2561 End = S->getEndLoc();
2578 return TheBlock->getCaretLocation();
2597 const auto *Ref = dyn_cast<DeclRefExpr>(Unwrapped);
2601 return isa_and_nonnull<DecompositionDecl>(Ref->getDecl());
2628 if (
auto *UO = dyn_cast<UnaryOperator>(E))
2629 if (UO->getOpcode() == UO_Deref)
2632 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
2634 if (BO->isPtrMemOp())
2638 if (BO->getOpcode() == BO_Comma)
2639 return BO->getRHS()->isReadIfDiscardedInCPlusPlus11();
2644 if (
auto *CO = dyn_cast<ConditionalOperator>(E))
2645 return CO->getTrueExpr()->isReadIfDiscardedInCPlusPlus11() &&
2646 CO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2649 dyn_cast<BinaryConditionalOperator>(E)) {
2650 if (
auto *OVE = dyn_cast<OpaqueValueExpr>(BCO->getTrueExpr()))
2651 return OVE->getSourceExpr()->isReadIfDiscardedInCPlusPlus11() &&
2652 BCO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2658 if (
const auto *POE = dyn_cast<PseudoObjectExpr>(E)) {
2686 case ParenExprClass:
2689 case GenericSelectionExprClass:
2692 case CoawaitExprClass:
2693 case CoyieldExprClass:
2696 case ChooseExprClass:
2699 case UnaryOperatorClass: {
2733 case BinaryOperatorClass: {
2745 if (IE->getValue() == 0)
2764 case CompoundAssignOperatorClass:
2765 case VAArgExprClass:
2766 case AtomicExprClass:
2769 case ConditionalOperatorClass: {
2774 return Exp->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx) &&
2775 Exp->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2777 case BinaryConditionalOperatorClass: {
2779 return Exp->getFalseExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2782 case MemberExprClass:
2789 case ArraySubscriptExprClass:
2796 case CXXOperatorCallExprClass: {
2808 case OO_ExclaimEqual:
2811 case OO_GreaterEqual:
2826 case CXXMemberCallExprClass:
2827 case UserDefinedLiteralClass: {
2851 case UnresolvedLookupExprClass:
2852 case CXXUnresolvedConstructExprClass:
2853 case RecoveryExprClass:
2856 case CXXTemporaryObjectExprClass:
2857 case CXXConstructExprClass: {
2862 CE->hasUnusedResultAttr(Ctx)) {
2867 if (
unsigned NumArgs = CE->getNumArgs())
2869 CE->getArg(NumArgs - 1)->getEndLoc());
2875 case ObjCMessageExprClass: {
2896 case ObjCPropertyRefExprClass:
2897 case ObjCSubscriptRefExprClass:
2903 case PseudoObjectExprClass: {
2908 POE->getSyntacticForm())) {
2916 if (
auto *BO = dyn_cast<BinaryOperator>(POE->getSyntacticForm()))
2917 if (BO->isAssignmentOp())
2919 if (
auto *UO = dyn_cast<UnaryOperator>(POE->getSyntacticForm()))
2920 if (UO->isIncrementDecrementOp())
2925 return Result &&
Result->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2928 case StmtExprClass: {
2939 if (
const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
2950 case CXXFunctionalCastExprClass:
2951 case CStyleCastExprClass: {
2965 if (
auto *DRE = dyn_cast<DeclRefExpr>(SubE))
2966 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2967 if (!VD->isExternallyVisible())
2983 if (CE->
getCastKind() == CK_ConstructorConversion)
2990 dyn_cast<CXXFunctionalCastExpr>(
this)) {
2991 Loc = CXXCE->getBeginLoc();
2992 R1 = CXXCE->getSubExpr()->getSourceRange();
3000 case ImplicitCastExprClass: {
3010 case CXXDefaultArgExprClass:
3013 case CXXDefaultInitExprClass:
3017 case CXXNewExprClass:
3020 case CXXDeleteExprClass:
3022 case MaterializeTemporaryExprClass:
3025 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
3026 case CXXBindTemporaryExprClass:
3028 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
3029 case ExprWithCleanupsClass:
3031 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
3032 case OpaqueValueExprClass:
3034 WarnE, Loc, R1, R2, Ctx);
3045 case ObjCIvarRefExprClass:
3047 case Expr::UnaryOperatorClass:
3049 case ImplicitCastExprClass:
3051 case MaterializeTemporaryExprClass:
3054 case CStyleCastExprClass:
3056 case DeclRefExprClass: {
3059 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3060 if (VD->hasGlobalStorage())
3065 return T->isPointerType() &&
3070 case MemberExprClass: {
3074 case ArraySubscriptExprClass:
3086 assert(
expr->hasPlaceholderType(BuiltinType::BoundMember));
3095 return mem->getMemberDecl()->getType();
3101 assert(
type->isFunctionType());
3139 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(
this)) {
3140 if (isa_and_nonnull<CXXConversionDecl>(MCE->getMethodDecl()))
3141 return MCE->getImplicitObjectArgument();
3157 auto IgnoreNoopCastsSingleStep = [&Ctx](
Expr *E) {
3158 if (
auto *CE = dyn_cast<CastExpr>(E)) {
3161 Expr *SubExpr = CE->getSubExpr();
3162 bool IsIdentityCast =
3164 bool IsSameWidthCast = (E->
getType()->isPointerType() ||
3166 (SubExpr->
getType()->isPointerType() ||
3171 if (IsIdentityCast || IsSameWidthCast)
3173 }
else if (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E))
3174 return NTTP->getReplacement();
3179 IgnoreNoopCastsSingleStep);
3184 if (
auto *Cast = dyn_cast<CXXFunctionalCastExpr>(E)) {
3185 auto *SE = Cast->getSubExpr();
3190 if (
auto *
C = dyn_cast<CXXConstructExpr>(E)) {
3191 auto NumArgs =
C->getNumArgs();
3194 Expr *A =
C->getArg(0);
3201 auto IgnoreImplicitMemberCallSingleStep = [](
Expr *E) {
3202 if (
auto *
C = dyn_cast<CXXMemberCallExpr>(E)) {
3203 Expr *ExprNode =
C->getImplicitObjectArgument();
3207 if (
auto *PE = dyn_cast<ParenExpr>(ExprNode)) {
3208 if (PE->getSourceRange() ==
C->getSourceRange()) {
3221 auto IgnoreImplicitCallSingleStep = [](
Expr *E) {
3222 auto *
C = dyn_cast<CallExpr>(E);
3229 unsigned NumArgs =
C->getNumArgs();
3233 Expr *A =
C->getArg(0);
3250 IgnoreImplicitMemberCallSingleStep, IgnoreImplicitCallSingleStep);
3254 const Expr *E =
this;
3256 E = M->getSubExpr();
3259 E = ICE->getSubExprAsWritten();
3268 E = M->getSubExpr();
3271 if (ICE->getCastKind() == CK_NoOp)
3272 E = ICE->getSubExpr();
3278 E = BE->getSubExpr();
3281 if (ICE->getCastKind() == CK_NoOp)
3282 E = ICE->getSubExpr();
3293 if (!
C.hasSameUnqualifiedType(
getType(),
C.getCanonicalTagType(TempTy)))
3309 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E)) {
3310 switch (ICE->getCastKind()) {
3311 case CK_DerivedToBase:
3312 case CK_UncheckedDerivedToBase:
3323 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
3324 if (BO->isPtrMemOp())
3335 const Expr *E =
this;
3340 E =
Paren->getSubExpr();
3345 if (ICE->getCastKind() == CK_NoOp ||
3346 ICE->getCastKind() == CK_LValueToRValue ||
3347 ICE->getCastKind() == CK_DerivedToBase ||
3348 ICE->getCastKind() == CK_UncheckedDerivedToBase) {
3349 E = ICE->getSubExpr();
3354 if (
const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) {
3355 if (UnOp->getOpcode() == UO_Extension) {
3356 E = UnOp->getSubExpr();
3362 = dyn_cast<MaterializeTemporaryExpr>(E)) {
3363 E = M->getSubExpr();
3371 return This->isImplicit();
3379 for (
unsigned I = 0; I < Exprs.size(); ++I)
3387 const Expr **Culprit)
const {
3389 "Expression evaluator can't be called on a dependent expression.");
3401 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
this))
3402 return EWC->getSubExpr()->isConstantInitializer(Ctx,
true, Culprit);
3403 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
this))
3404 return MTE->getSubExpr()->isConstantInitializer(Ctx,
false, Culprit);
3415 case Stmt::ExprWithCleanupsClass:
3417 Ctx, IsForRef, Culprit);
3418 case StringLiteralClass:
3419 case ObjCEncodeExprClass:
3421 case CXXTemporaryObjectExprClass:
3422 case CXXConstructExprClass: {
3431 assert(CE->
getNumArgs() == 1 &&
"trivial ctor with > 1 argument");
3437 case ConstantExprClass: {
3443 case CompoundLiteralExprClass: {
3450 case DesignatedInitUpdateExprClass: {
3455 case InitListExprClass: {
3463 assert(ILE->
isSemanticForm() &&
"InitListExpr must be in semantic form");
3470 for (
unsigned i = 0; i < numInits; i++) {
3478 unsigned ElementNo = 0;
3483 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3484 for (
unsigned i = 0, e = CXXRD->getNumBases(); i < e; i++) {
3485 if (ElementNo < ILE->getNumInits()) {
3493 for (
const auto *Field : RD->fields()) {
3499 if (Field->isUnnamedBitField())
3502 if (ElementNo < ILE->getNumInits()) {
3504 if (Field->isBitField()) {
3513 bool RefType = Field->getType()->isReferenceType();
3524 case ImplicitValueInitExprClass:
3525 case NoInitExprClass:
3527 case ParenExprClass:
3529 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3530 case GenericSelectionExprClass:
3532 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3533 case ChooseExprClass:
3540 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3541 case UnaryOperatorClass: {
3547 case ObjCBoxedExprClass: {
3553 case ObjCArrayLiteralClass: {
3559 case ObjCDictionaryLiteralClass: {
3565 case PackIndexingExprClass: {
3568 ->isConstantInitializer(Ctx,
false, Culprit);
3570 case CXXFunctionalCastExprClass:
3571 case CXXStaticCastExprClass:
3572 case ImplicitCastExprClass:
3573 case CStyleCastExprClass:
3574 case ObjCBridgedCastExprClass:
3575 case CXXDynamicCastExprClass:
3576 case CXXReinterpretCastExprClass:
3577 case CXXAddrspaceCastExprClass:
3578 case CXXConstCastExprClass: {
3589 CE->
getCastKind() == CK_ARCReclaimReturnedObject ||
3595 case MaterializeTemporaryExprClass:
3598 ->isConstantInitializer(Ctx,
false, Culprit);
3600 case SubstNonTypeTemplateParmExprClass:
3602 ->isConstantInitializer(Ctx,
false, Culprit);
3603 case CXXDefaultArgExprClass:
3605 ->isConstantInitializer(Ctx,
false, Culprit);
3606 case CXXDefaultInitExprClass:
3608 ->isConstantInitializer(Ctx,
false, Culprit);
3622 if (BuiltinID != Builtin::BI__assume &&
3623 BuiltinID != Builtin::BI__builtin_assume)
3634 return DirectCallee->getAttr<AllocSizeAttr>();
3636 return IndirectCallee->getAttr<AllocSizeAttr>();
3640std::optional<llvm::APInt>
3644 assert(AllocSize && AllocSize->getElemSizeParam().isValid());
3645 unsigned SizeArgNo = AllocSize->getElemSizeParam().getASTIndex();
3648 return std::nullopt;
3650 auto EvaluateAsSizeT = [&](
const Expr *E, llvm::APSInt &Into) {
3656 if (Into.isNegative() || !Into.isIntN(BitsInSizeT))
3658 Into = Into.extOrTrunc(BitsInSizeT);
3662 llvm::APSInt SizeOfElem;
3663 if (!EvaluateAsSizeT(
getArg(SizeArgNo), SizeOfElem))
3664 return std::nullopt;
3666 if (!AllocSize->getNumElemsParam().isValid())
3669 llvm::APSInt NumberOfElems;
3670 unsigned NumArgNo = AllocSize->getNumElemsParam().getASTIndex();
3671 if (!EvaluateAsSizeT(
getArg(NumArgNo), NumberOfElems))
3672 return std::nullopt;
3675 llvm::APInt BytesAvailable = SizeOfElem.umul_ov(NumberOfElems, Overflow);
3677 return std::nullopt;
3679 return BytesAvailable;
3690 const bool IncludePossibleEffects;
3691 bool HasSideEffects;
3694 explicit SideEffectFinder(
const ASTContext &Context,
bool IncludePossible)
3695 : Inherited(Context),
3696 IncludePossibleEffects(IncludePossible), HasSideEffects(
false) { }
3698 bool hasSideEffects()
const {
return HasSideEffects; }
3700 void VisitDecl(
const Decl *D) {
3706 if (
auto *VD = dyn_cast<VarDecl>(D)) {
3708 if (IncludePossibleEffects && VD->isThisDeclarationADefinition() &&
3709 VD->needsDestruction(Context))
3710 HasSideEffects =
true;
3714 void VisitDeclStmt(
const DeclStmt *DS) {
3715 for (
auto *D : DS->
decls())
3717 Inherited::VisitDeclStmt(DS);
3720 void VisitExpr(
const Expr *E) {
3721 if (!HasSideEffects &&
3723 HasSideEffects =
true;
3729 bool IncludePossibleEffects)
const {
3733 if (!IncludePossibleEffects &&
getExprLoc().isMacroID())
3738#define ABSTRACT_STMT(Type)
3739#define STMT(Type, Base) case Type##Class:
3740#define EXPR(Type, Base)
3741#include "clang/AST/StmtNodes.inc"
3742 llvm_unreachable(
"unexpected Expr kind");
3744 case DependentScopeDeclRefExprClass:
3745 case DependentTemplateIdExprClass:
3746 case CXXUnresolvedConstructExprClass:
3747 case CXXDependentScopeMemberExprClass:
3748 case UnresolvedLookupExprClass:
3749 case UnresolvedMemberExprClass:
3750 case PackExpansionExprClass:
3751 case SubstNonTypeTemplateParmPackExprClass:
3752 case FunctionParmPackExprClass:
3753 case RecoveryExprClass:
3754 case CXXFoldExprClass:
3755 case CXXExpansionSelectExprClass:
3757 return IncludePossibleEffects;
3759 case DeclRefExprClass:
3760 case ObjCIvarRefExprClass:
3761 case PredefinedExprClass:
3762 case IntegerLiteralClass:
3763 case FixedPointLiteralClass:
3764 case FloatingLiteralClass:
3765 case ImaginaryLiteralClass:
3766 case StringLiteralClass:
3767 case CharacterLiteralClass:
3768 case OffsetOfExprClass:
3769 case ImplicitValueInitExprClass:
3770 case UnaryExprOrTypeTraitExprClass:
3771 case AddrLabelExprClass:
3772 case GNUNullExprClass:
3773 case ArrayInitIndexExprClass:
3774 case NoInitExprClass:
3775 case CXXBoolLiteralExprClass:
3776 case CXXNullPtrLiteralExprClass:
3777 case CXXThisExprClass:
3778 case CXXScalarValueInitExprClass:
3779 case TypeTraitExprClass:
3780 case ArrayTypeTraitExprClass:
3781 case ExpressionTraitExprClass:
3782 case CXXNoexceptExprClass:
3783 case SizeOfPackExprClass:
3784 case ObjCStringLiteralClass:
3785 case ObjCEncodeExprClass:
3786 case ObjCBoolLiteralExprClass:
3787 case ObjCAvailabilityCheckExprClass:
3788 case CXXUuidofExprClass:
3789 case OpaqueValueExprClass:
3790 case SourceLocExprClass:
3791 case EmbedExprClass:
3792 case ConceptSpecializationExprClass:
3793 case RequiresExprClass:
3794 case SYCLUniqueStableNameExprClass:
3795 case PackIndexingExprClass:
3796 case HLSLOutArgExprClass:
3797 case OpenACCAsteriskSizeExprClass:
3798 case CXXReflectExprClass:
3802 case ConstantExprClass:
3805 Ctx, IncludePossibleEffects);
3808 case CXXOperatorCallExprClass:
3809 case CXXMemberCallExprClass:
3810 case CUDAKernelCallExprClass:
3811 case UserDefinedLiteralClass: {
3816 bool IsPure = FD && (FD->
hasAttr<ConstAttr>() || FD->
hasAttr<PureAttr>());
3817 if (IsPure || !IncludePossibleEffects)
3822 case BlockExprClass:
3823 case CXXBindTemporaryExprClass:
3824 if (!IncludePossibleEffects)
3828 case MSPropertyRefExprClass:
3829 case MSPropertySubscriptExprClass:
3830 case CompoundAssignOperatorClass:
3831 case VAArgExprClass:
3832 case AtomicExprClass:
3833 case CXXThrowExprClass:
3834 case CXXNewExprClass:
3835 case CXXDeleteExprClass:
3836 case CoawaitExprClass:
3837 case DependentCoawaitExprClass:
3838 case CoyieldExprClass:
3842 case StmtExprClass: {
3844 SideEffectFinder Finder(Ctx, IncludePossibleEffects);
3846 return Finder.hasSideEffects();
3849 case ExprWithCleanupsClass:
3850 if (IncludePossibleEffects)
3855 case ParenExprClass:
3856 case ArraySubscriptExprClass:
3857 case MatrixSingleSubscriptExprClass:
3858 case MatrixSubscriptExprClass:
3859 case ArraySectionExprClass:
3860 case OMPArrayShapingExprClass:
3861 case OMPIteratorExprClass:
3862 case MemberExprClass:
3863 case ConditionalOperatorClass:
3864 case BinaryConditionalOperatorClass:
3865 case CompoundLiteralExprClass:
3866 case ExtVectorElementExprClass:
3867 case MatrixElementExprClass:
3868 case DesignatedInitExprClass:
3869 case DesignatedInitUpdateExprClass:
3870 case ArrayInitLoopExprClass:
3871 case ParenListExprClass:
3872 case CXXPseudoDestructorExprClass:
3873 case CXXRewrittenBinaryOperatorClass:
3874 case CXXStdInitializerListExprClass:
3875 case SubstNonTypeTemplateParmExprClass:
3876 case MaterializeTemporaryExprClass:
3877 case ShuffleVectorExprClass:
3878 case ConvertVectorExprClass:
3879 case AsTypeExprClass:
3880 case CXXParenListInitExprClass:
3884 case UnaryOperatorClass:
3889 case BinaryOperatorClass:
3894 case InitListExprClass:
3901 case GenericSelectionExprClass:
3903 Ctx, IncludePossibleEffects);
3905 case ChooseExprClass:
3907 Ctx, IncludePossibleEffects);
3909 case CXXDefaultArgExprClass:
3911 Ctx, IncludePossibleEffects);
3913 case CXXDefaultInitExprClass: {
3921 case CXXDynamicCastExprClass: {
3929 case ImplicitCastExprClass:
3930 case CStyleCastExprClass:
3931 case CXXStaticCastExprClass:
3932 case CXXReinterpretCastExprClass:
3933 case CXXConstCastExprClass:
3934 case CXXAddrspaceCastExprClass:
3935 case CXXFunctionalCastExprClass:
3936 case BuiltinBitCastExprClass: {
3941 if (!IncludePossibleEffects)
3951 case CXXTypeidExprClass: {
3953 if (!TE->isPotentiallyEvaluated())
3958 if (IncludePossibleEffects && TE->hasNullCheck())
3964 case CXXConstructExprClass:
3965 case CXXTemporaryObjectExprClass: {
3974 case CXXInheritedCtorInitExprClass: {
3976 if (!ICIE->getConstructor()->isTrivial() && IncludePossibleEffects)
3981 case LambdaExprClass: {
3983 for (
Expr *E : LE->capture_inits())
3989 case PseudoObjectExprClass: {
3996 const Expr *Subexpr = *I;
3998 Subexpr = OVE->getSourceExpr();
4005 case ObjCBoxedExprClass:
4006 case ObjCArrayLiteralClass:
4007 case ObjCDictionaryLiteralClass:
4008 case ObjCSelectorExprClass:
4009 case ObjCProtocolExprClass:
4010 case ObjCIsaExprClass:
4011 case ObjCIndirectCopyRestoreExprClass:
4012 case ObjCSubscriptRefExprClass:
4013 case ObjCBridgedCastExprClass:
4014 case ObjCMessageExprClass:
4015 case ObjCPropertyRefExprClass:
4017 if (IncludePossibleEffects)
4032 if (
auto Call = dyn_cast<CallExpr>(
this))
4033 return Call->getFPFeaturesInEffect(LO);
4034 if (
auto UO = dyn_cast<UnaryOperator>(
this))
4035 return UO->getFPFeaturesInEffect(LO);
4036 if (
auto BO = dyn_cast<BinaryOperator>(
this))
4037 return BO->getFPFeaturesInEffect(LO);
4038 if (
auto Cast = dyn_cast<CastExpr>(
this))
4039 return Cast->getFPFeaturesInEffect(LO);
4040 if (
auto ConvertVector = dyn_cast<ConvertVectorExpr>(
this))
4041 return ConvertVector->getFPFeaturesInEffect(LO);
4054 explicit NonTrivialCallFinder(
const ASTContext &Context)
4055 : Inherited(Context), NonTrivial(
false) { }
4057 bool hasNonTrivialCall()
const {
return NonTrivial; }
4059 void VisitCallExpr(
const CallExpr *E) {
4060 if (
const CXXMethodDecl *
Method
4061 = dyn_cast_or_null<const CXXMethodDecl>(E->
getCalleeDecl())) {
4062 if (
Method->isTrivial()) {
4064 Inherited::VisitStmt(E);
4072 void VisitCXXConstructExpr(
const CXXConstructExpr *E) {
4075 Inherited::VisitStmt(E);
4082 void VisitCXXBindTemporaryExpr(
const CXXBindTemporaryExpr *E) {
4085 if (
const CXXDestructorDecl *DtorDecl =
4087 if (DtorDecl->isTrivial()) {
4088 Inherited::VisitStmt(E);
4099 NonTrivialCallFinder Finder(Ctx);
4101 return Finder.hasNonTrivialCall();
4119 llvm_unreachable(
"Unexpected value dependent expression!");
4147 CE->getSubExpr()->getType()->isIntegerType())
4148 return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4151 }
else if (
const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(
this)) {
4153 return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4154 }
else if (
const ParenExpr *PE = dyn_cast<ParenExpr>(
this)) {
4157 return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4159 dyn_cast<GenericSelectionExpr>(
this)) {
4160 if (GE->isResultDependent())
4162 return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC);
4163 }
else if (
const ChooseExpr *CE = dyn_cast<ChooseExpr>(
this)) {
4164 if (CE->isConditionDependent())
4166 return CE->getChosenSubExpr()->isNullPointerConstant(Ctx, NPC);
4168 = dyn_cast<CXXDefaultArgExpr>(
this)) {
4170 return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
4172 = dyn_cast<CXXDefaultInitExpr>(
this)) {
4174 return DefaultInit->getExpr()->isNullPointerConstant(Ctx, NPC);
4179 = dyn_cast<MaterializeTemporaryExpr>(
this)) {
4180 return M->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4181 }
else if (
const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(
this)) {
4182 if (
const Expr *Source = OVE->getSourceExpr())
4183 return Source->isNullPointerConstant(Ctx, NPC);
4192 if (
getType()->isNullPtrType())
4195 if (
const RecordType *UT =
getType()->getAsUnionType())
4197 UT->getDecl()->getMostRecentDecl()->hasAttr<TransparentUnionAttr>())
4199 const Expr *InitExpr = CLE->getInitializer();
4200 if (
const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
4201 return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
4204 if (!
getType()->isIntegerType() ||
4235 const Expr *E =
this;
4238 "expression is not a property reference");
4241 if (BO->getOpcode() == BO_Comma) {
4256 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
4264 const ObjCMethodDecl *M = dyn_cast<ObjCMethodDecl>(Param->getDeclContext());
4275 if (ICE->getCastKind() == CK_LValueToRValue ||
4276 (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp))
4282 if (
StmtExpr *SE = dyn_cast<StmtExpr>(E)) {
4285 if (
Expr *EX = VS->getExprStmt())
4286 return EX->getSourceBitField();
4289 if (
MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
4290 if (
FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
4291 if (Field->isBitField())
4300 if (
DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E)) {
4301 if (
FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
4302 if (Field->isBitField())
4305 if (
BindingDecl *BD = dyn_cast<BindingDecl>(DeclRef->getDecl()))
4306 if (
Expr *E = BD->getBinding())
4311 if (BinOp->isAssignmentOp() && BinOp->getLHS())
4312 return BinOp->getLHS()->getSourceBitField();
4314 if (BinOp->getOpcode() == BO_Comma && BinOp->getRHS())
4315 return BinOp->getRHS()->getSourceBitField();
4319 if (UnOp->isPrefix() && UnOp->isIncrementDecrementOp())
4320 return UnOp->getSubExpr()->getSourceBitField();
4327 if (
auto *DRE = dyn_cast<DeclRefExpr>(E))
4328 return dyn_cast<EnumConstantDecl>(DRE->getDecl());
4337 if (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp)
4344 return ASE->getBase()->getType()->isVectorType();
4349 if (
auto *DRE = dyn_cast<DeclRefExpr>(E))
4350 if (
auto *BD = dyn_cast<BindingDecl>(DRE->getDecl()))
4351 if (
auto *E = BD->getBinding())
4360 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
4361 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
4363 VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
4379 case CXXThisExprClass:
4381 case DeclRefExprClass: {
4387 if (DRE1->getDecl() != DRE2->getDecl())
4390 if ((DRE1->isPRValue() && DRE2->isPRValue()) ||
4391 (DRE1->isLValue() && DRE2->isLValue()))
4396 case ImplicitCastExprClass: {
4399 const auto *ICE1 = dyn_cast<ImplicitCastExpr>(E1);
4400 const auto *ICE2 = dyn_cast<ImplicitCastExpr>(E2);
4403 if (ICE1->getCastKind() != ICE2->getCastKind())
4405 ICE2->IgnoreParenImpCasts());
4409 if (ICE1->getCastKind() == CK_LValueToRValue ||
4410 ICE1->getCastKind() == CK_ArrayToPointerDecay ||
4411 ICE1->getCastKind() == CK_FunctionToPointerDecay) {
4416 const auto *DRE1 = dyn_cast<DeclRefExpr>(E1);
4417 const auto *DRE2 = dyn_cast<DeclRefExpr>(E2);
4421 const auto *Ivar1 = dyn_cast<ObjCIvarRefExpr>(E1);
4422 const auto *Ivar2 = dyn_cast<ObjCIvarRefExpr>(E2);
4423 if (Ivar1 && Ivar2) {
4424 return Ivar1->isFreeIvar() && Ivar2->isFreeIvar() &&
4428 const auto *Array1 = dyn_cast<ArraySubscriptExpr>(E1);
4429 const auto *Array2 = dyn_cast<ArraySubscriptExpr>(E2);
4430 if (Array1 && Array2) {
4434 auto Idx1 = Array1->getIdx();
4435 auto Idx2 = Array2->getIdx();
4436 const auto Integer1 = dyn_cast<IntegerLiteral>(Idx1);
4437 const auto Integer2 = dyn_cast<IntegerLiteral>(Idx2);
4438 if (Integer1 && Integer2) {
4439 if (!llvm::APInt::isSameValue(Integer1->getValue(),
4440 Integer2->getValue()))
4456 if (
const auto *D = dyn_cast<VarDecl>(ME1->getMemberDecl()))
4457 if (D->isStaticDataMember())
4469 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E))
4470 return DRE->getDecl();
4471 if (
const auto *ME = dyn_cast<MemberExpr>(E))
4472 return ME->getMemberDecl();
4491 return VT->getNumElements();
4496 if (
const auto *MT =
getType()->getAs<ConstantMatrixType>())
4497 return MT->getNumElementsFlattened();
4506 StringRef Comp =
Accessor->getName();
4509 if (Comp ==
"hi" || Comp ==
"lo" || Comp ==
"even" || Comp ==
"odd")
4513 if (Comp[0] ==
's' || Comp[0] ==
'S')
4514 Comp = Comp.substr(1);
4516 for (
unsigned i = 0, e = Comp.size(); i != e; ++i)
4517 if (Comp.substr(i + 1).contains(Comp[i]))
4524struct MatrixAccessorFormat {
4525 bool IsZeroIndexed =
false;
4526 unsigned ChunkLen = 0;
4529static MatrixAccessorFormat GetHLSLMatrixAccessorFormat(StringRef Comp) {
4530 assert(!Comp.empty() && Comp[0] ==
'_' &&
"invalid matrix accessor");
4532 MatrixAccessorFormat F;
4533 if (Comp.size() >= 2 && Comp[0] ==
'_' && Comp[1] ==
'm') {
4534 F.IsZeroIndexed =
true;
4537 F.IsZeroIndexed =
false;
4541 assert(F.ChunkLen != 0 &&
"unrecognized matrix swizzle format");
4542 assert(
Comp.size() % F.ChunkLen == 0 &&
4543 "matrix swizzle accessor has invalid length");
4547template <
typename Fn>
4548static bool ForEachMatrixAccessorIndex(StringRef Comp,
4550 auto Format = GetHLSLMatrixAccessorFormat(Comp);
4552 for (
unsigned I = 0, E =
Comp.size(); I < E; I += Format.ChunkLen) {
4553 unsigned Row = 0, Col = 0;
4554 unsigned ZeroIndexOffset =
static_cast<unsigned>(Format.IsZeroIndexed);
4555 unsigned OneIndexOffset =
static_cast<unsigned>(!Format.IsZeroIndexed);
4556 Row =
static_cast<unsigned>(
Comp[I + ZeroIndexOffset + 1] -
'0') -
4558 Col =
static_cast<unsigned>(
Comp[I + ZeroIndexOffset + 2] -
'0') -
4561 assert(Row < MT->getNumRows() && Col < MT->getNumColumns() &&
4562 "matrix swizzle index out of bounds");
4580 StringRef Comp =
Accessor->getName();
4584 bool HasDup =
false;
4585 ForEachMatrixAccessorIndex(Comp, MT, [&](
unsigned Index) ->
bool {
4600 StringRef Comp =
Accessor->getName();
4601 bool isNumericAccessor =
false;
4602 if (Comp[0] ==
's' || Comp[0] ==
'S') {
4603 Comp = Comp.substr(1);
4604 isNumericAccessor =
true;
4607 bool isHi = Comp ==
"hi";
4608 bool isLo = Comp ==
"lo";
4609 bool isEven = Comp ==
"even";
4610 bool isOdd = Comp ==
"odd";
4626 Elts.push_back(Index);
4632 StringRef Comp =
Accessor->getName();
4634 ForEachMatrixAccessorIndex(Comp, MT, [&](
unsigned Index) ->
bool {
4635 Elts.push_back(Index);
4644 BuiltinLoc(BLoc), RParenLoc(RP) {
4646 SubExprs =
new (
C)
Stmt*[args.size()];
4647 for (
unsigned i = 0; i != args.size(); i++)
4648 SubExprs[i] = args[i];
4654 if (SubExprs)
C.Deallocate(SubExprs);
4658 llvm::copy(Exprs, SubExprs);
4661GenericSelectionExpr::GenericSelectionExpr(
4665 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex)
4666 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->
getType(),
4667 AssocExprs[ResultIndex]->getValueKind(),
4668 AssocExprs[ResultIndex]->getObjectKind()),
4669 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4670 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4671 assert(AssocTypes.size() == AssocExprs.size() &&
4672 "Must have the same number of association expressions"
4673 " and TypeSourceInfo!");
4674 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4677 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4679 llvm::copy(AssocExprs,
4680 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4681 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4682 getIndexOfStartOfAssociatedTypes());
4687GenericSelectionExpr::GenericSelectionExpr(
4692 unsigned ResultIndex)
4693 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->
getType(),
4694 AssocExprs[ResultIndex]->getValueKind(),
4695 AssocExprs[ResultIndex]->getObjectKind()),
4696 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4697 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4698 assert(AssocTypes.size() == AssocExprs.size() &&
4699 "Must have the same number of association expressions"
4700 " and TypeSourceInfo!");
4701 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4704 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4706 llvm::copy(AssocExprs,
4707 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4708 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4709 getIndexOfStartOfAssociatedTypes());
4714GenericSelectionExpr::GenericSelectionExpr(
4718 bool ContainsUnexpandedParameterPack)
4719 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4721 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4722 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4723 assert(AssocTypes.size() == AssocExprs.size() &&
4724 "Must have the same number of association expressions"
4725 " and TypeSourceInfo!");
4728 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4730 llvm::copy(AssocExprs,
4731 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4732 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4733 getIndexOfStartOfAssociatedTypes());
4738GenericSelectionExpr::GenericSelectionExpr(
4743 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4745 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4746 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4747 assert(AssocTypes.size() == AssocExprs.size() &&
4748 "Must have the same number of association expressions"
4749 " and TypeSourceInfo!");
4752 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4754 llvm::copy(AssocExprs,
4755 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4756 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4757 getIndexOfStartOfAssociatedTypes());
4762GenericSelectionExpr::GenericSelectionExpr(EmptyShell
Empty,
unsigned NumAssocs)
4763 :
Expr(GenericSelectionExprClass,
Empty), NumAssocs(NumAssocs) {}
4769 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex) {
4770 unsigned NumAssocs = AssocExprs.size();
4771 void *Mem = Context.Allocate(
4772 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4773 alignof(GenericSelectionExpr));
4774 return new (Mem) GenericSelectionExpr(
4775 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4776 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4783 bool ContainsUnexpandedParameterPack) {
4784 unsigned NumAssocs = AssocExprs.size();
4785 void *Mem = Context.Allocate(
4786 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4787 alignof(GenericSelectionExpr));
4788 return new (Mem) GenericSelectionExpr(
4789 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4790 RParenLoc, ContainsUnexpandedParameterPack);
4798 unsigned ResultIndex) {
4799 unsigned NumAssocs = AssocExprs.size();
4800 void *Mem = Context.Allocate(
4801 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4802 alignof(GenericSelectionExpr));
4803 return new (Mem) GenericSelectionExpr(
4804 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4805 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4812 SourceLocation RParenLoc,
bool ContainsUnexpandedParameterPack) {
4813 unsigned NumAssocs = AssocExprs.size();
4814 void *Mem = Context.Allocate(
4815 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4816 alignof(GenericSelectionExpr));
4817 return new (Mem) GenericSelectionExpr(
4818 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4819 RParenLoc, ContainsUnexpandedParameterPack);
4824 unsigned NumAssocs) {
4825 void *Mem = Context.Allocate(
4826 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4827 alignof(GenericSelectionExpr));
4828 return new (Mem) GenericSelectionExpr(
EmptyShell(), NumAssocs);
4849 EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
4850 NumDesignators(Designators.
size()), NumSubExprs(IndexExprs.
size() + 1) {
4851 this->Designators =
new (
C)
Designator[NumDesignators];
4859 unsigned IndexIdx = 0;
4860 for (
unsigned I = 0; I != NumDesignators; ++I) {
4861 this->Designators[I] = Designators[I];
4864 *Child++ = IndexExprs[IndexIdx++];
4867 *Child++ = IndexExprs[IndexIdx++];
4868 *Child++ = IndexExprs[IndexIdx++];
4872 assert(IndexIdx == IndexExprs.size() &&
"Wrong number of index expressions");
4880 bool UsesColonSyntax,
4882 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(IndexExprs.size() + 1),
4883 alignof(DesignatedInitExpr));
4884 return new (Mem) DesignatedInitExpr(
C,
C.VoidTy, Designators,
4885 ColonOrEqualLoc, UsesColonSyntax,
4890 unsigned NumIndexExprs) {
4891 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(NumIndexExprs + 1),
4892 alignof(DesignatedInitExpr));
4893 return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
4898 unsigned NumDesigs) {
4900 NumDesignators = NumDesigs;
4901 for (
unsigned I = 0; I != NumDesigs; ++I)
4902 Designators[I] = Desigs[I];
4906 DesignatedInitExpr *DIE =
const_cast<DesignatedInitExpr*
>(
this);
4914 auto *DIE =
const_cast<DesignatedInitExpr *
>(
this);
4916 if (
First.isFieldDesignator()) {
4919 for (
unsigned int i = 0; i < DIE->size(); i++) {
4927 return First.getLBracketLoc();
4954 unsigned NumNewDesignators =
Last -
First;
4955 if (NumNewDesignators == 0) {
4956 std::copy_backward(Designators + Idx + 1,
4957 Designators + NumDesignators,
4959 --NumNewDesignators;
4962 if (NumNewDesignators == 1) {
4963 Designators[Idx] = *
First;
4968 =
new (
C)
Designator[NumDesignators - 1 + NumNewDesignators];
4969 std::copy(Designators, Designators + Idx, NewDesignators);
4970 std::copy(
First,
Last, NewDesignators + Idx);
4971 std::copy(Designators + Idx + 1, Designators + NumDesignators,
4972 NewDesignators + Idx + NumNewDesignators);
4973 Designators = NewDesignators;
4974 NumDesignators = NumDesignators - 1 + NumNewDesignators;
4983 BaseAndUpdaterExprs[0] = baseExpr;
4988 BaseAndUpdaterExprs[1] = ILE;
5005 LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
5007 llvm::copy(Exprs, getTrailingObjects());
5011ParenListExpr::ParenListExpr(EmptyShell
Empty,
unsigned NumExprs)
5020 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(Exprs.size()),
5021 alignof(ParenListExpr));
5022 return new (Mem) ParenListExpr(LParenLoc, Exprs, RParenLoc);
5026 unsigned NumExprs) {
5028 Ctx.
Allocate(totalSizeToAlloc<Stmt *>(NumExprs),
alignof(ParenListExpr));
5029 return new (Mem) ParenListExpr(
EmptyShell(), NumExprs);
5036static std::optional<BinaryOperator *>
5041 ComparedTo = E->
getRHS();
5044 ComparedTo = E->
getLHS();
5049 const Expr *AddLHS =
nullptr, *AddRHS =
nullptr;
5052 if (BO && BO->
getOpcode() == clang::BO_Add) {
5058 if (!AddLHS || !AddRHS)
5061 const Decl *LHSDecl, *RHSDecl, *OtherDecl;
5064 RHSDecl = AddRHS->IgnoreParenImpCasts()->getReferencedDeclOfCallee();
5070 if (!LHSDecl && !RHSDecl)
5073 if ((LHSDecl && LHSDecl == OtherDecl && LHSDecl != RHSDecl) ||
5074 (RHSDecl && RHSDecl == OtherDecl && RHSDecl != LHSDecl))
5096 Result.value()->setExcludedOverflowPattern(
true);
5103 :
Expr(BinaryOperatorClass, ResTy,
VK, OK) {
5106 "Use CompoundAssignOperator for compound assignments");
5109 SubExprs[LHS] = lhs;
5110 SubExprs[RHS] = rhs;
5122 :
Expr(CompoundAssignOperatorClass, ResTy,
VK, OK) {
5126 "Use CompoundAssignOperator for compound assignments");
5128 SubExprs[LHS] = lhs;
5129 SubExprs[RHS] = rhs;
5137 bool HasFPFeatures) {
5160 void *Mem =
C.Allocate(
sizeof(CompoundAssignOperator) +
Extra,
5161 alignof(CompoundAssignOperator));
5162 return new (Mem) CompoundAssignOperator(
C,
EmptyShell(), HasFPFeatures);
5173 void *Mem =
C.Allocate(
sizeof(CompoundAssignOperator) +
Extra,
5174 alignof(CompoundAssignOperator));
5176 CompoundAssignOperator(
C, lhs, rhs, opc, ResTy,
VK, OK, opLoc, FPFeatures,
5177 CompLHSType, CompResultType);
5181 bool hasFPFeatures) {
5182 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
5191 :
Expr(UnaryOperatorClass,
type,
VK, OK), Val(input) {
5207 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
5215 e = ewc->getSubExpr();
5217 e = m->getSubExpr();
5220 e = ice->getSubExpr();
5226 unsigned numSemanticExprs) {
5228 Context.Allocate(totalSizeToAlloc<Expr *>(1 + numSemanticExprs),
5229 alignof(PseudoObjectExpr));
5230 return new(buffer) PseudoObjectExpr(sh, numSemanticExprs);
5233PseudoObjectExpr::PseudoObjectExpr(EmptyShell shell,
unsigned numSemanticExprs)
5234 :
Expr(PseudoObjectExprClass, shell) {
5240 unsigned resultIndex) {
5241 assert(
syntax &&
"no syntactic expression!");
5242 assert(
semantics.size() &&
"no semantic expressions!");
5256 void *buffer =
C.Allocate(totalSizeToAlloc<Expr *>(
semantics.size() + 1),
5257 alignof(PseudoObjectExpr));
5264 unsigned resultIndex)
5277 "opaque-value semantic expressions for pseudo-object "
5278 "operations must have sources");
5280 llvm::copy(
semantics, Trail.drop_front().begin());
5311 NumSubExprs(args.size()), BuiltinLoc(BLoc), RParenLoc(RP), Op(op) {
5312 assert(args.size() ==
getNumSubExprs(op) &&
"wrong number of subexpressions");
5313 for (
unsigned i = 0; i != args.size(); i++)
5314 SubExprs[i] = args[i];
5320 case AO__c11_atomic_init:
5321 case AO__opencl_atomic_init:
5322 case AO__c11_atomic_load:
5323 case AO__atomic_load_n:
5324 case AO__atomic_test_and_set:
5325 case AO__atomic_clear:
5328 case AO__scoped_atomic_load_n:
5329 case AO__opencl_atomic_load:
5330 case AO__hip_atomic_load:
5331 case AO__c11_atomic_store:
5332 case AO__c11_atomic_exchange:
5333 case AO__atomic_load:
5334 case AO__atomic_store:
5335 case AO__atomic_store_n:
5336 case AO__atomic_exchange_n:
5337 case AO__c11_atomic_fetch_add:
5338 case AO__c11_atomic_fetch_sub:
5339 case AO__c11_atomic_fetch_and:
5340 case AO__c11_atomic_fetch_or:
5341 case AO__c11_atomic_fetch_xor:
5342 case AO__c11_atomic_fetch_nand:
5343 case AO__c11_atomic_fetch_max:
5344 case AO__c11_atomic_fetch_min:
5345 case AO__atomic_fetch_add:
5346 case AO__atomic_fetch_sub:
5347 case AO__atomic_fetch_and:
5348 case AO__atomic_fetch_or:
5349 case AO__atomic_fetch_xor:
5350 case AO__atomic_fetch_nand:
5351 case AO__atomic_add_fetch:
5352 case AO__atomic_sub_fetch:
5353 case AO__atomic_and_fetch:
5354 case AO__atomic_or_fetch:
5355 case AO__atomic_xor_fetch:
5356 case AO__atomic_nand_fetch:
5357 case AO__atomic_min_fetch:
5358 case AO__atomic_max_fetch:
5359 case AO__atomic_fetch_min:
5360 case AO__atomic_fetch_max:
5361 case AO__atomic_fetch_fminimum:
5362 case AO__atomic_fetch_fmaximum:
5363 case AO__atomic_fetch_fminimum_num:
5364 case AO__atomic_fetch_fmaximum_num:
5365 case AO__atomic_fetch_uinc:
5366 case AO__atomic_fetch_udec:
5369 case AO__scoped_atomic_load:
5370 case AO__scoped_atomic_store:
5371 case AO__scoped_atomic_store_n:
5372 case AO__scoped_atomic_fetch_add:
5373 case AO__scoped_atomic_fetch_sub:
5374 case AO__scoped_atomic_fetch_and:
5375 case AO__scoped_atomic_fetch_or:
5376 case AO__scoped_atomic_fetch_xor:
5377 case AO__scoped_atomic_fetch_nand:
5378 case AO__scoped_atomic_add_fetch:
5379 case AO__scoped_atomic_sub_fetch:
5380 case AO__scoped_atomic_and_fetch:
5381 case AO__scoped_atomic_or_fetch:
5382 case AO__scoped_atomic_xor_fetch:
5383 case AO__scoped_atomic_nand_fetch:
5384 case AO__scoped_atomic_min_fetch:
5385 case AO__scoped_atomic_max_fetch:
5386 case AO__scoped_atomic_fetch_min:
5387 case AO__scoped_atomic_fetch_max:
5388 case AO__scoped_atomic_fetch_fminimum:
5389 case AO__scoped_atomic_fetch_fmaximum:
5390 case AO__scoped_atomic_fetch_fminimum_num:
5391 case AO__scoped_atomic_fetch_fmaximum_num:
5392 case AO__scoped_atomic_exchange_n:
5393 case AO__scoped_atomic_fetch_uinc:
5394 case AO__scoped_atomic_fetch_udec:
5395 case AO__hip_atomic_exchange:
5396 case AO__hip_atomic_fetch_add:
5397 case AO__hip_atomic_fetch_sub:
5398 case AO__hip_atomic_fetch_and:
5399 case AO__hip_atomic_fetch_or:
5400 case AO__hip_atomic_fetch_xor:
5401 case AO__hip_atomic_fetch_min:
5402 case AO__hip_atomic_fetch_max:
5403 case AO__opencl_atomic_store:
5404 case AO__hip_atomic_store:
5405 case AO__opencl_atomic_exchange:
5406 case AO__opencl_atomic_fetch_add:
5407 case AO__opencl_atomic_fetch_sub:
5408 case AO__opencl_atomic_fetch_and:
5409 case AO__opencl_atomic_fetch_or:
5410 case AO__opencl_atomic_fetch_xor:
5411 case AO__opencl_atomic_fetch_min:
5412 case AO__opencl_atomic_fetch_max:
5413 case AO__atomic_exchange:
5416 case AO__scoped_atomic_exchange:
5417 case AO__c11_atomic_compare_exchange_strong:
5418 case AO__c11_atomic_compare_exchange_weak:
5420 case AO__hip_atomic_compare_exchange_strong:
5421 case AO__opencl_atomic_compare_exchange_strong:
5422 case AO__opencl_atomic_compare_exchange_weak:
5423 case AO__hip_atomic_compare_exchange_weak:
5424 case AO__atomic_compare_exchange:
5425 case AO__atomic_compare_exchange_n:
5428 case AO__scoped_atomic_compare_exchange:
5429 case AO__scoped_atomic_compare_exchange_n:
5432 llvm_unreachable(
"unknown atomic op");
5438 return AT->getValueType();
5443 unsigned ArraySectionCount = 0;
5444 while (
auto *OASE = dyn_cast<ArraySectionExpr>(
Base->IgnoreParens())) {
5445 Base = OASE->getBase();
5446 ++ArraySectionCount;
5449 dyn_cast<ArraySubscriptExpr>(
Base->IgnoreParenImpCasts())) {
5450 Base = ASE->getBase();
5451 ++ArraySectionCount;
5453 Base =
Base->IgnoreParenImpCasts();
5454 auto OriginalTy =
Base->getType();
5455 if (
auto *DRE = dyn_cast<DeclRefExpr>(
Base))
5456 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
5457 OriginalTy = PVD->getOriginalType().getNonReferenceType();
5459 for (
unsigned Cnt = 0; Cnt < ArraySectionCount; ++Cnt) {
5460 if (OriginalTy->isAnyPointerType())
5461 OriginalTy = OriginalTy->getPointeeType();
5462 else if (OriginalTy->isArrayType())
5463 OriginalTy = OriginalTy->castAsArrayTypeUnsafe()->getElementType();
5475 BaseTy = ASE->getElementType();
5492 return ASE->getElementType();
5499 :
Expr(RecoveryExprClass,
T.getNonReferenceType(),
5500 T->isDependentType() ?
VK_LValue : getValueKindForType(
T),
5502 BeginLoc(BeginLoc), EndLoc(EndLoc), NumExprs(SubExprs.size()) {
5503 assert(!
T.isNull());
5504 assert(!llvm::is_contained(SubExprs,
nullptr));
5506 llvm::copy(SubExprs, getTrailingObjects());
5514 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(SubExprs.size()),
5515 alignof(RecoveryExpr));
5516 return new (Mem) RecoveryExpr(Ctx,
T, BeginLoc, EndLoc, SubExprs);
5520 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(NumSubExprs),
5521 alignof(RecoveryExpr));
5522 return new (Mem) RecoveryExpr(
EmptyShell(), NumSubExprs);
5527 NumDims == Dims.size() &&
5528 "Preallocated number of dimensions is different from the provided one.");
5529 llvm::copy(Dims, getTrailingObjects<Expr *>());
5534 NumDims == BR.size() &&
5535 "Preallocated number of dimensions is different from the provided one.");
5536 llvm::copy(BR, getTrailingObjects<SourceRange>());
5539OMPArrayShapingExpr::OMPArrayShapingExpr(
QualType ExprTy,
Expr *Op,
5543 RPLoc(
R), NumDims(Dims.size()) {
5545 setDimensions(Dims);
5554 assert(Dims.size() == BracketRanges.size() &&
5555 "Different number of dimensions and brackets ranges.");
5556 void *Mem = Context.Allocate(
5557 totalSizeToAlloc<Expr *, SourceRange>(Dims.size() + 1, Dims.size()),
5558 alignof(OMPArrayShapingExpr));
5559 auto *E =
new (Mem) OMPArrayShapingExpr(
T, Op, L, R, Dims);
5560 E->setBracketsRanges(BracketRanges);
5566 void *Mem = Context.Allocate(
5567 totalSizeToAlloc<Expr *, SourceRange>(NumDims + 1, NumDims),
5568 alignof(OMPArrayShapingExpr));
5569 return new (Mem) OMPArrayShapingExpr(
EmptyShell(), NumDims);
5572void OMPIteratorExpr::setIteratorDeclaration(
unsigned I,
Decl *D) {
5573 getTrailingObjects<Decl *>(NumIterators)[I] = D;
5576void OMPIteratorExpr::setAssignmentLoc(
unsigned I,
SourceLocation Loc) {
5577 assert(I < NumIterators &&
5578 "Idx is greater or equal the number of iterators definitions.");
5581 static_cast<int>(RangeLocOffset::AssignLoc)] = Loc;
5584void OMPIteratorExpr::setIteratorRange(
unsigned I,
Expr *Begin,
5588 assert(I < NumIterators &&
5589 "Idx is greater or equal the number of iterators definitions.");
5590 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5591 static_cast<int>(RangeExprOffset::Begin)] =
5593 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5594 static_cast<int>(RangeExprOffset::End)] = End;
5595 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5596 static_cast<int>(RangeExprOffset::Step)] = Step;
5598 SourceLocation>()[I *
static_cast<int>(RangeLocOffset::Total) +
5599 static_cast<int>(RangeLocOffset::FirstColonLoc)] =
5602 SourceLocation>()[I *
static_cast<int>(RangeLocOffset::Total) +
5603 static_cast<int>(RangeLocOffset::SecondColonLoc)] =
5608 return getTrailingObjects<Decl *>()[I];
5614 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5615 RangeExprOffset::Total) +
5616 static_cast<int>(RangeExprOffset::Begin)];
5618 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5619 RangeExprOffset::Total) +
5620 static_cast<int>(RangeExprOffset::End)];
5622 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5623 RangeExprOffset::Total) +
5624 static_cast<int>(RangeExprOffset::Step)];
5629 return getTrailingObjects<
5631 static_cast<int>(RangeLocOffset::AssignLoc)];
5635 return getTrailingObjects<
5637 static_cast<int>(RangeLocOffset::FirstColonLoc)];
5641 return getTrailingObjects<
5643 static_cast<int>(RangeLocOffset::SecondColonLoc)];
5647 getTrailingObjects<OMPIteratorHelperData>()[I] = D;
5651 return getTrailingObjects<OMPIteratorHelperData>()[I];
5655 return getTrailingObjects<OMPIteratorHelperData>()[I];
5658OMPIteratorExpr::OMPIteratorExpr(
5663 IteratorKwLoc(IteratorKwLoc), LPLoc(L), RPLoc(R),
5664 NumIterators(
Data.size()) {
5665 for (
unsigned I = 0, E =
Data.size(); I < E; ++I) {
5666 const IteratorDefinition &D = Data[I];
5667 setIteratorDeclaration(I, D.IteratorDecl);
5668 setAssignmentLoc(I, D.AssignmentLoc);
5669 setIteratorRange(I, D.Range.Begin, D.ColonLoc, D.Range.End,
5670 D.SecondColonLoc, D.Range.Step);
5671 setHelper(I, Helpers[I]);
5682 assert(
Data.size() == Helpers.size() &&
5683 "Data and helpers must have the same size.");
5684 void *Mem = Context.Allocate(
5685 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5686 Data.size(),
Data.size() *
static_cast<int>(RangeExprOffset::Total),
5687 Data.size() *
static_cast<int>(RangeLocOffset::Total),
5689 alignof(OMPIteratorExpr));
5690 return new (Mem) OMPIteratorExpr(
T, IteratorKwLoc, L, R,
Data, Helpers);
5694 unsigned NumIterators) {
5695 void *Mem = Context.Allocate(
5696 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5697 NumIterators, NumIterators *
static_cast<int>(RangeExprOffset::Total),
5698 NumIterators *
static_cast<int>(RangeLocOffset::Total), NumIterators),
5699 alignof(OMPIteratorExpr));
5700 return new (Mem) OMPIteratorExpr(
EmptyShell(), NumIterators);
5707 return new (
C) HLSLOutArgExpr(Ty,
Base, OpV, WB, IsInOut);
5716 return new (
C) OpenACCAsteriskSizeExpr(Loc,
C.IntTy);
5721 return new (
C) OpenACCAsteriskSizeExpr({},
C.IntTy);
5725 bool hasFPFeatures) {
5726 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
5727 alignof(ConvertVectorExpr));
5728 return new (Mem) ConvertVectorExpr(hasFPFeatures,
EmptyShell());
5736 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
5737 void *Mem =
C.Allocate(Size,
alignof(ConvertVectorExpr));
5738 return new (Mem) ConvertVectorExpr(SrcExpr, TI, DstType,
VK, OK, BuiltinLoc,
5739 RParenLoc, FPFeatures);
5745 StaticValue =
new (Ctx)
APValue;
5748 return *StaticValue;
5752 assert(StaticValue);
5753 return *StaticValue;
5759class StructFieldAccessVisitor
5761 bool AddrOfSeen =
false;
5764 const Expr *ArrayIndex =
nullptr;
5781 ArrayIndex = E->
getIdx();
5785 const Expr *VisitCastExpr(
const CastExpr *E) {
5790 const Expr *VisitParenExpr(
const ParenExpr *E) {
5793 const Expr *VisitUnaryAddrOf(
const UnaryOperator *E) {
5797 const Expr *VisitUnaryDeref(
const UnaryOperator *E) {
5801 const Expr *VisitBinaryOperator(
const BinaryOperator *Op) {
5808 const Expr **OutArrayIndex,
5810 StructFieldAccessVisitor
V;
5813 *OutArrayIndex =
V.ArrayIndex;
5814 if (OutArrayElementTy)
5815 *OutArrayElementTy =
V.ArrayElementTy;
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
static bool isBooleanType(QualType Ty)
static Expr * IgnoreImplicitConstructorSingleStep(Expr *E)
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
static const Expr * skipTemporaryBindingsNoOpCastsAndParens(const Expr *E)
Skip over any no-op casts and any temporary-binding expressions.
static bool IsDecompositionDeclRefExpr(const Expr *E)
Helper to determine wether E is a CXXConstructExpr constructing a DecompositionDecl.
static unsigned SizeOfCallExprInstance(Expr::StmtClass SC)
static void AssertResultStorageKind(ConstantResultStorageKind Kind)
static void computeOverflowPatternExclusion(const ASTContext &Ctx, const BinaryOperator *E)
Compute and set the OverflowPatternExclusion bit based on whether the BinaryOperator expression match...
static std::optional< BinaryOperator * > getOverflowPatternBinOp(const BinaryOperator *E)
Certain overflow-dependent code patterns can have their integer overflow sanitization disabled.
Result
Implement __builtin_bit_cast and related operations.
Defines the clang::Preprocessor interface.
static QualType getUnderlyingType(const SubRegion *R)
static bool isRecordType(QualType T)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
static const TypeInfo & getInfo(unsigned id)
a trap message and trap category.
void setValue(const ASTContext &C, const llvm::APInt &Val)
llvm::APInt getValue() const
uint64_t * pVal
Used to store the >64 bits integer value.
uint64_t VAL
Used to store the <= 64 bits integer value.
void setIntValue(const ASTContext &C, const llvm::APInt &Val)
A non-discriminated union of a base, field, or array index.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
static APValue IndeterminateValue()
@ Indeterminate
This object has an indeterminate value (C++ [basic.indet]).
@ None
There is no such object (it's outside its lifetime).
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
Builtin::Context & BuiltinInfo
const LangOptions & getLangOpts() const
Qualifiers::GC getObjCGCAttrKind(QualType Ty) const
Return one of the GCNone, Weak or Strong Objective-C garbage collection attributes.
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
void * Allocate(size_t Size, unsigned Align=8) const
CanQualType UnsignedIntTy
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
StringLiteral * getPredefinedStringLiteralFromCache(StringRef Key) const
Return a string representing the human readable name for the specified function declaration or file n...
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
UnnamedGlobalConstantDecl * getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const
Return a declaration for a uniquified anonymous global constant corresponding to a given APValue.
const TargetInfo & getTargetInfo() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
const Stmt ** const_iterator
QualType getElementType() const
Return the effective 'element' type of this array section.
Expr * getBase()
Get base of the array section.
static QualType getBaseOriginalType(const Expr *Base)
Return original type of the base expression for array section.
QualType getBaseType() const
Returns the effective 'type' of the base of this array section.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
static unsigned getNumSubExprs(AtomicOp Op)
Determine the number of arguments the specified atomic builtin should have.
QualType getValueType() const
AtomicExpr(SourceLocation BLoc, ArrayRef< Expr * > args, QualType t, AtomicOp op, SourceLocation RP)
unsigned getNumSubExprs() const
A builtin binary operation expression such as "x + y" or "x <= y".
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
StringRef getOpcodeStr() const
static bool isCommaOp(Opcode Opc)
SourceLocation getOperatorLoc() const
bool hasStoredFPFeatures() const
bool isCompoundAssignmentOp() const
static unsigned sizeOfTrailingObjects(bool HasFPFeatures)
Return the size in bytes needed for the trailing objects.
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
static BinaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static bool isAssignmentOp(Opcode Opc)
static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc, const Expr *LHS, const Expr *RHS)
Return true if a binary operator using the specified opcode and operands would match the 'p = (i8*)nu...
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used only by Serialization.
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
Build a binary operator, assuming that appropriate storage has been allocated for the trailing object...
BinaryOperatorKind Opcode
A binding in a decomposition declaration.
A fixed int type of a specified bitwidth.
SourceLocation getCaretLocation() const
const Stmt * getBody() const
const FunctionProtoType * getFunctionType() const
getFunctionType - Return the underlying function type for this block.
bool isUnevaluated(unsigned ID) const
Returns true if this builtin does not perform the side-effects of its arguments.
CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++ [expr....
static CStyleCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)
SourceLocation getLParenLoc() const
Represents a call to a CUDA kernel function.
Represents a base class of a C++ class.
Represents binding an expression to a temporary.
CXXTemporary * getTemporary()
Represents a call to a C++ constructor.
Expr * getArg(unsigned Arg)
Return the specified argument.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
Represents a C++ constructor within a class.
A default argument (C++ [dcl.fct.default]).
A use of a default initializer in a constructor or in aggregate initialization.
Represents a C++ destructor within a class.
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Represents a call to a member function that may be written either with member call syntax (e....
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
A call to an overloaded operator written using operator syntax.
SourceLocation getOperatorLoc() const
Returns the location of the operator symbol in the expression.
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
SourceRange getSourceRange() const
Represents a C++ struct/union/class.
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
A C++ static_cast expression (C++ [expr.static.cast]).
const CXXDestructorDecl * getDestructor() const
Represents the this expression in C++.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
bool hasStoredFPFeatures() const
std::optional< llvm::APInt > evaluateBytesReturnedByAllocSizeCall(const ASTContext &Ctx) const
Evaluates the total size in bytes allocated by calling a function decorated with alloc_size.
static unsigned sizeOfTrailingObjects(unsigned NumPreArgs, unsigned NumArgs, bool HasFPFeatures)
Return the size in bytes needed for the trailing objects.
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
const AllocSizeAttr * getCalleeAllocSizeAttr() const
Try to get the alloc_size attribute of the callee. May return null.
unsigned getBuiltinCallee() const
getBuiltinCallee - If this is a call to a builtin, return the builtin ID of the callee.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
static CallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Create an empty call expression, for deserialization.
bool isCallToStdMove() const
void setPreArg(unsigned I, Stmt *PreArg)
static constexpr unsigned OffsetToTrailingObjects
void computeDependence()
Compute and set dependence bits.
void setStoredFPFeatures(FPOptionsOverride F)
Set FPOptionsOverride in trailing storage. Used only by Serialization.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
CallExpr(StmtClass SC, Expr *Fn, ArrayRef< Expr * > PreArgs, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs, ADLCallKind UsesADL)
Build a call expression, assuming that appropriate storage has been allocated for the trailing object...
static constexpr unsigned sizeToAllocateForCallExprSubclass(unsigned SizeOfTrailingObjects)
static constexpr ADLCallKind UsesADL
bool isBuiltinAssumeFalse(const ASTContext &Ctx) const
Return true if this is a call to __assume() or __builtin_assume() with a non-value-dependent constant...
QualType getCallReturnType(const ASTContext &Ctx) const
getCallReturnType - Get the return type of the call expr.
bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const
Returns true if this is a call to a builtin which does not evaluate side-effects within its arguments...
unsigned getNumPreArgs() const
bool hasUnusedResultAttr(const ASTContext &Ctx) const
Returns true if this call expression should warn on unused results.
QualType withConst() const
Retrieves a version of this type with const applied.
bool isVolatileQualified() const
Represents the body of a CapturedStmt, and serves as its DeclContext.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
FPOptionsOverride * getTrailingFPFeatures()
Return a pointer to the trailing FPOptions.
NamedDecl * getConversionFunction() const
If this cast applies a user-defined conversion, retrieve the conversion function that it invokes.
Expr * getSubExprAsWritten()
Retrieve the cast subexpression as it was written in the source code, looking through any implicit ca...
CastKind getCastKind() const
bool hasStoredFPFeatures() const
static const FieldDecl * getTargetFieldForToUnionCast(QualType unionType, QualType opType)
CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind, Expr *op, unsigned BasePathSize, bool HasFPFeatures)
const char * getCastKindName() const
SourceLocation getEnd() const
static CharUnits Zero()
Construct a CharUnits quantity of zero.
void setValue(unsigned Val)
static void print(unsigned val, CharacterLiteralKind Kind, raw_ostream &OS)
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Represents a class template specialization, which refers to a class template with a given set of temp...
bool isExplicitSpecialization() const
CompoundAssignOperator - For compound assignments (e.g.
static CompoundAssignOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
CompoundLiteralExpr - [C99 6.5.2.5].
bool hasStaticStorage() const
APValue & getStaticValue() const
APValue & getOrCreateStaticValue(ASTContext &Ctx) const
CompoundStmt - This represents a group of statements like { stmt stmt }.
ConditionalOperator - The ?
ConstEvaluatedExprVisitor - This class visits 'const Expr *'s.
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
APValue getAPValueResult() const
static ConstantResultStorageKind getStorageKind(const APValue &Value)
void MoveIntoResult(APValue &Value, const ASTContext &Context)
llvm::APSInt getResultAsAPSInt() const
ConstantResultStorageKind getResultStorageKind() const
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
static ConstantExpr * CreateEmpty(const ASTContext &Context, ConstantResultStorageKind StorageKind)
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumElementsFlattened() const
Returns the number of elements required to embed the matrix into a vector.
unsigned getFlattenedIndex(unsigned Row, unsigned Column, bool IsRowMajor=false) const
Returns the flattened index of a matrix element located at row Row, and column Column.
static ConvertVectorExpr * Create(const ASTContext &C, Expr *SrcExpr, TypeSourceInfo *TI, QualType DstType, ExprValueKind VK, ExprObjectKind OK, SourceLocation BuiltinLoc, SourceLocation RParenLoc, FPOptionsOverride FPFeatures)
static ConvertVectorExpr * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
A POD class for pairing a NamedDecl* with an access specifier.
NamedDecl * getDecl() const
AccessSpecifier getAccess() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
A reference to a declared variable, function, enum, etc.
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
void setDecl(ValueDecl *NewD)
static DeclRefExpr * CreateEmpty(const ASTContext &Context, bool HasQualifier, bool HasFoundDecl, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Construct an empty declaration reference expression.
DeclarationNameInfo getNameInfo() const
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
Decl - This represents one declaration (or definition), e.g.
static bool isFlexibleArrayMemberLike(const ASTContext &Context, const Decl *D, QualType Ty, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution)
Whether it resembles a flexible array member.
ASTContext & getASTContext() const LLVM_READONLY
static Decl * castFromDeclContext(const DeclContext *)
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
DeclarationNameLoc - Additional source/type location info for a declaration name.
Represents a single C99 designator.
unsigned getArrayIndex() const
SourceRange getSourceRange() const LLVM_READONLY
bool isFieldDesignator() const
SourceLocation getBeginLoc() const LLVM_READONLY
struct FieldDesignatorInfo FieldInfo
A field designator, e.g., ".x".
bool isArrayRangeDesignator() const
FieldDecl * getFieldDecl() const
bool isArrayDesignator() const
SourceLocation getFieldLoc() const
const IdentifierInfo * getFieldName() const
SourceLocation getDotLoc() const
static DesignatedInitExpr * CreateEmpty(const ASTContext &C, unsigned NumIndexExprs)
Expr * getArrayRangeEnd(const Designator &D) const
Expr * getSubExpr(unsigned Idx) const
SourceRange getDesignatorsSourceRange() const
Expr * getArrayRangeStart(const Designator &D) const
void ExpandDesignator(const ASTContext &C, unsigned Idx, const Designator *First, const Designator *Last)
Replaces the designator at index Idx with the series of designators in [First, Last).
Expr * getArrayIndex(const Designator &D) const
Designator * getDesignator(unsigned Idx)
Expr * getInit() const
Retrieve the initializer value.
unsigned size() const
Returns the number of designators in this initializer.
SourceLocation getBeginLoc() const LLVM_READONLY
void setDesignators(const ASTContext &C, const Designator *Desigs, unsigned NumDesigs)
SourceLocation getEndLoc() const LLVM_READONLY
static DesignatedInitExpr * Create(const ASTContext &C, ArrayRef< Designator > Designators, ArrayRef< Expr * > IndexExprs, SourceLocation EqualOrColonLoc, bool GNUSyntax, Expr *Init)
SourceLocation getBeginLoc() const LLVM_READONLY
DesignatedInitUpdateExpr(const ASTContext &C, SourceLocation lBraceLoc, Expr *baseExprs, SourceLocation rBraceLoc)
SourceLocation getEndLoc() const LLVM_READONLY
InitListExpr * getUpdater() const
const Expr * getBase() const
IdentifierInfo * Accessor
EmbedExpr(const ASTContext &Ctx, SourceLocation Loc, EmbedDataStorage *Data, unsigned Begin, unsigned NumOfElements)
An instance of this object exists for each enum constant that is defined.
ExplicitCastExpr - An explicit cast written in the source code.
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
EnumConstantDecl * getEnumConstantDecl()
If this expression refers to an enum constant, retrieve its declaration.
bool isReadIfDiscardedInCPlusPlus11() const
Determine whether an lvalue-to-rvalue conversion should implicitly be applied to this expression if i...
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
@ SE_AllowSideEffects
Allow any unmodeled side effect.
@ SE_AllowUndefinedBehavior
Allow UB that we can give a value, but not arbitrary unmodeled side effects.
static QualType findBoundMemberType(const Expr *expr)
Given an expression of bound-member type, find the type of the member.
static std::pair< const NamedDecl *, const WarnUnusedResultAttr * > getUnusedResultAttrImpl(const Decl *Callee, QualType ReturnType)
Returns the WarnUnusedResultAttr that is declared on the callee or its return type declaration,...
bool isImplicitCXXThis() const
Whether this expression is an implicit reference to 'this' in C++.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc, SourceRange &R1, SourceRange &R2, ASTContext &Ctx) const
isUnusedResultAWarning - Return true if this immediate expression should be warned about if the resul...
LValueClassification ClassifyLValue(ASTContext &Ctx) const
Reasons why an expression might not be an l-value.
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool refersToVectorElement() const
Returns whether this expression refers to a vector element.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParenLValueCasts() LLVM_READONLY
Skip past any parentheses and lvalue casts which might surround this expression until reaching a fixe...
FPOptions getFPFeaturesInEffect(const LangOptions &LO) const
Returns the set of floating point options that apply to this expression.
const CXXRecordDecl * getBestDynamicClassType() const
For an expression of class type or pointer to class type, return the most derived class decl the expr...
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreConversionOperatorSingleStep() LLVM_READONLY
Skip conversion operators.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
bool isObjCSelfExpr() const
Check if this expression is the ObjC 'self' implicit parameter.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isFlexibleArrayMemberLike(const ASTContext &Context, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution=false) const
Check whether this array fits the idiom of a flexible array member, depending on the value of -fstric...
bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsLValue - Evaluate an expression to see if we can fold it to an lvalue with link time known ...
bool isEvaluatable(const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects) const
isEvaluatable - Call EvaluateAsRValue to see if this expression can be constant folded without side-e...
Expr * IgnoreParenBaseCasts() LLVM_READONLY
Skip past any parentheses and derived-to-base casts until reaching a fixed point.
bool isConstantInitializer(ASTContext &Ctx, bool ForRef=false, const Expr **Culprit=nullptr) const
Returns true if this expression can be emitted to IR as a constant, and thus can be used as a constan...
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
NullPointerConstantValueDependence
Enumeration used to describe how isNullPointerConstant() should cope with value-dependent expressions...
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_NeverValueDependent
Specifies that the expression should never be value-dependent.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
Expr * IgnoreUnlessSpelledInSource()
Skip past any invisible AST nodes which might surround this statement, such as ExprWithCleanups or Im...
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
Expr * IgnoreCasts() LLVM_READONLY
Skip past any casts which might surround this expression until reaching a fixed point.
Decl * getReferencedDeclOfCallee()
Expr * IgnoreImplicitAsWritten() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
const Expr * getBestDynamicClassTypeExpr() const
Get the inner expression that determines the best dynamic class.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind
Enumeration used to describe the kind of Null pointer constant returned from isNullPointerConstant().
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
@ NPCK_ZeroLiteral
Expression is a Null pointer constant built from a literal zero.
@ NPCK_CXX11_nullptr
Expression is a C++11 nullptr.
@ NPCK_GNUNull
Expression is a GNU-style __null constant.
@ NPCK_NotNull
Expression is not a Null pointer constant.
bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsBooleanCondition - Return true if this is a constant which we can fold and convert to a boo...
bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
QualType getEnumCoercedType(const ASTContext &Ctx) const
If this expression is an enumeration constant, return the enumeration type under which said constant ...
bool isBoundMemberFunction(ASTContext &Ctx) const
Returns true if this expression is a bound member function.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
static bool isSameComparisonOperand(const Expr *E1, const Expr *E2)
Checks that the two Expr's will refer to the same value as a comparison operand.
bool isDefaultArgument() const
Determine whether this expression is a default function argument.
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
bool hasNonTrivialCall(const ASTContext &Ctx) const
Determine whether this expression involves a call to any function that is not trivial.
bool refersToGlobalRegisterVar() const
Returns whether this expression refers to a global register variable.
bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const
isCXX98IntegralConstantExpr - Return true if this expression is an integral constant expression in C+...
const ValueDecl * getAsBuiltinConstantDeclRef(const ASTContext &Context) const
If this expression is an unambiguous reference to a single declaration, in the style of __builtin_fun...
bool isOBJCGCCandidate(ASTContext &Ctx) const
isOBJCGCCandidate - Return true if this expression may be used in a read/ write barrier.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
const Expr * skipRValueSubobjectAdjustments() const
bool isKnownToHaveBooleanValue(bool Semantic=true) const
isKnownToHaveBooleanValue - Return true if this is an integer expression that is known to return 0 or...
void setDependence(ExprDependence Deps)
Each concrete expr subclass is expected to compute its dependence and call this in the constructor.
const ObjCPropertyRefExpr * getObjCProperty() const
If this expression is an l-value for an Objective C property, find the underlying property reference ...
bool containsDuplicateElements() const
containsDuplicateElements - Return true if any element access is repeated.
bool isArrow() const
isArrow - Return true if the base expression is a pointer to vector, return false if the base express...
void getEncodedElementAccess(SmallVectorImpl< uint32_t > &Elts) const
getEncodedElementAccess - Encode the elements accessed into an llvm aggregate Constant of ConstantInt...
unsigned getNumElements() const
getNumElements - Get the number of components being selected.
static int getAccessorIdx(char c, bool isNumericAccessor)
Represents difference between two FPOptions values.
bool requiresTrailingStorage() const
static FPOptions defaultWithoutTrailingStorage(const LangOptions &LO)
Return the default value of FPOptions that's used when trailing storage isn't required.
Represents a member of a struct/union/class.
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool isBitField() const
Determines whether this field is a bitfield.
static FixedPointLiteral * Create(const ASTContext &C, EmptyShell Empty)
Returns an empty fixed-point literal.
std::string getValueAsString(unsigned Radix) const
llvm::APInt getValue() const
Returns an internal integer representation of the literal.
static FixedPointLiteral * CreateFromRawInt(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l, unsigned Scale)
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
double getValueAsApproximateDouble() const
getValueAsApproximateDouble - This returns the value as an inaccurate double.
llvm::APFloat getValue() const
FullExpr - Represents a "full-expression" node.
Represents a function declaration or definition.
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Represents a prototype with parameter type info, e.g.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
bool isExplicitSpecialization() const
TemplateArgumentList * TemplateArguments
The template arguments used to produce the function template specialization from the function templat...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
Represents a C11 generic selection.
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
static GenericSelectionExpr * CreateEmpty(const ASTContext &Context, unsigned NumAssocs)
Create an empty generic selection expression for deserialization.
GlobalDecl - represents a global declaration.
static HLSLOutArgExpr * CreateEmpty(const ASTContext &Ctx)
static HLSLOutArgExpr * Create(const ASTContext &C, QualType Ty, OpaqueValueExpr *Base, OpaqueValueExpr *OpV, Expr *WB, bool IsInOut)
One of these records is kept for each identifier that is lexed.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
static ImplicitCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
Describes an C or C++ initializer list.
bool hasArrayFiller() const
Return true if this is an array initializer and its array "filler" has been set.
bool isTransparent() const
Is this a transparent initializer list (that is, an InitListExpr that is purely syntactic,...
void resizeInits(const ASTContext &Context, unsigned NumInits)
Specify the number of initializers.
bool isStringLiteralInit() const
Is this an initializer for an array of characters, initialized by a string literal or an @encode?
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isSemanticForm() const
void setInit(unsigned Init, Expr *expr)
Expr * updateInit(const ASTContext &C, unsigned Init, Expr *expr)
Updates the initializer at index Init with the new expression expr, and returns the old expression at...
void setArrayFiller(Expr *filler)
InitListExpr * getSyntacticForm() const
InitListExpr(const ASTContext &C, SourceLocation lbraceloc, ArrayRef< Expr * > initExprs, SourceLocation rbraceloc, bool isExplicit)
const Expr * getInit(unsigned Init) const
bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const
Is this the zero initializer {0} in a language which considers it idiomatic?
SourceLocation getEndLoc() const LLVM_READONLY
bool isSyntacticForm() const
ArrayRef< Expr * > inits() const
void sawArrayRangeDesignator(bool ARD=true)
Expr ** getInits()
Retrieve the set of initializers.
void reserveInits(const ASTContext &C, unsigned NumInits)
Reserve space for some number of initializers.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
LabelStmt - Represents a label, which has a substatement.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
StrictFlexArraysLevelKind
@ AddUnsignedOverflowTest
if (a + b < a)
@ AddSignedOverflowTest
if (a + b < a)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isOverflowPatternExcluded(OverflowPatternExclusionKind Kind) const
void remapPathPrefix(SmallVectorImpl< char > &Path) const
Remap path prefix according to -fmacro-prefix-path option.
Lexer - This provides a simple interface that turns a text buffer into a stream of tokens.
bool LexFromRawLexer(Token &Result)
LexFromRawLexer - Lex a token from a designated raw lexer (one with no associated preprocessor object...
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Characters, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token,...
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
bool containsDuplicateElements() const
containsDuplicateElements - Return true if any element access is repeated.
void getEncodedElementAccess(SmallVectorImpl< uint32_t > &Elts) const
getEncodedElementAccess - Encode the elements accessed into an llvm aggregate Constant of ConstantInt...
unsigned getNumElements() const
getNumElements - Get the number of components being selected.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
static MemberExpr * CreateEmpty(const ASTContext &Context, bool HasQualifier, bool HasFoundDecl, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
void setMemberDecl(ValueDecl *D)
NestedNameSpecifierLoc getQualifierLoc() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name,...
bool hasExplicitTemplateArgs() const
Determines whether the member name was followed by an explicit template argument list.
bool hasQualifier() const
Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...
static MemberExpr * Create(const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR)
bool isImplicitAccess() const
Determine whether the base of this explicit is implicit.
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
DeclarationNameInfo getMemberNameInfo() const
Retrieve the member declaration name info.
A pointer to member type per C++ 8.3.3 - Pointers to members.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
A C++ nested-name-specifier augmented with source location information.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
bool hasQualifier() const
Evaluates true when this nested-name-specifier location is non-empty.
An explicit cast in C or a C-style cast in C++, which uses the syntax ([s1][s2]......
static OMPArrayShapingExpr * CreateEmpty(const ASTContext &Context, unsigned NumDims)
static OMPArrayShapingExpr * Create(const ASTContext &Context, QualType T, Expr *Op, SourceLocation L, SourceLocation R, ArrayRef< Expr * > Dims, ArrayRef< SourceRange > BracketRanges)
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
static OMPIteratorExpr * Create(const ASTContext &Context, QualType T, SourceLocation IteratorKwLoc, SourceLocation L, SourceLocation R, ArrayRef< IteratorDefinition > Data, ArrayRef< OMPIteratorHelperData > Helpers)
static OMPIteratorExpr * CreateEmpty(const ASTContext &Context, unsigned NumIterators)
SourceLocation getSecondColonLoc(unsigned I) const
Gets the location of the second ':' (if any) in the range for the given iteratori definition.
SourceLocation getColonLoc(unsigned I) const
Gets the location of the first ':' in the range for the given iterator definition.
IteratorRange getIteratorRange(unsigned I)
Gets the iterator range for the given iterator.
OMPIteratorHelperData & getHelper(unsigned I)
Fetches helper data for the specified iteration space.
SourceLocation getAssignLoc(unsigned I) const
Gets the location of '=' for the given iterator definition.
Decl * getIteratorDecl(unsigned I)
Gets the iterator declaration for the given iterator.
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
ObjCBoxedExpr - used for generalized expression boxing.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
Represents an ObjC class declaration.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
ObjCMethodFamily getMethodFamily() const
bool isInstanceMessage() const
Determine whether this is an instance message to either a computed object or to super.
bool hasUnusedResultAttr(ASTContext &Ctx) const
Returns true if this message send should warn on unused results.
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
bool isExpressibleAsConstantInitializer() const
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
static OffsetOfExpr * CreateEmpty(const ASTContext &C, unsigned NumComps, unsigned NumExprs)
static OffsetOfExpr * Create(const ASTContext &C, QualType type, SourceLocation OperatorLoc, TypeSourceInfo *tsi, ArrayRef< OffsetOfNode > comps, ArrayRef< Expr * > exprs, SourceLocation RParenLoc)
void setIndexExpr(unsigned Idx, Expr *E)
void setComponent(unsigned Idx, OffsetOfNode ON)
const IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
FieldDecl * getField() const
For a field offsetof node, returns the field.
@ Identifier
A field in a dependent type, known only by its name.
Kind getKind() const
Determine what kind of offsetof node this is.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
static const OpaqueValueExpr * findInCopyConstruct(const Expr *expr)
Given an expression which invokes a copy constructor — i.e.
OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK, ExprObjectKind OK=OK_Ordinary, Expr *SourceExpr=nullptr)
This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...
static OpenACCAsteriskSizeExpr * Create(const ASTContext &C, SourceLocation Loc)
static OpenACCAsteriskSizeExpr * CreateEmpty(const ASTContext &C)
ParenExpr - This represents a parenthesized expression, e.g.
const Expr * getSubExpr() const
static ParenListExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumExprs)
Create an empty paren list.
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PredefinedExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType FNTy, PredefinedIdentKind IK, bool IsTransparent, StringLiteral *SL)
Create a PredefinedExpr.
StringRef getIdentKindName() const
static PredefinedExpr * CreateEmpty(const ASTContext &Ctx, bool HasFunctionName)
Create an empty PredefinedExpr.
static std::string ComputeName(PredefinedIdentKind IK, const Decl *CurrentDecl, bool ForceElaboratedPrinting=false)
static void processPathToFileName(SmallVectorImpl< char > &FileName, const PresumedLoc &PLoc, const LangOptions &LangOpts, const TargetInfo &TI)
static void processPathForFileMacro(SmallVectorImpl< char > &Path, const LangOptions &LangOpts, const TargetInfo &TI)
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
Callbacks to use to customize the behavior of the pretty-printer.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
semantics_iterator semantics_end()
semantics_iterator semantics_begin()
const Expr *const * const_semantics_iterator
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
ArrayRef< Expr * > semantics()
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
QualType getCanonicalType() const
The collection of all-type qualifiers we support.
void removeAddressSpace()
Represents a struct/union/class.
field_iterator field_end() const
field_range fields() const
specific_decl_iterator< FieldDecl > field_iterator
field_iterator field_begin() const
static RecoveryExpr * Create(ASTContext &Ctx, QualType T, SourceLocation BeginLoc, SourceLocation EndLoc, ArrayRef< Expr * > SubExprs)
static RecoveryExpr * CreateEmpty(ASTContext &Ctx, unsigned NumSubExprs)
TypeSourceInfo * getTypeSourceInfo()
static SYCLUniqueStableNameExpr * Create(const ASTContext &Ctx, SourceLocation OpLoc, SourceLocation LParen, SourceLocation RParen, TypeSourceInfo *TSI)
std::string ComputeName(ASTContext &Context) const
static SYCLUniqueStableNameExpr * CreateEmpty(const ASTContext &Ctx)
void setExprs(const ASTContext &C, ArrayRef< Expr * > Exprs)
ShuffleVectorExpr(const ASTContext &C, ArrayRef< Expr * > args, QualType Type, SourceLocation BLoc, SourceLocation RP)
APValue EvaluateInContext(const ASTContext &Ctx, const Expr *DefaultExpr) const
Return the result of evaluating this SourceLocExpr in the specified (and possibly null) default argum...
SourceLocExpr(const ASTContext &Ctx, SourceLocIdentKind Type, QualType ResultTy, SourceLocation BLoc, SourceLocation RParenLoc, DeclContext *Context)
SourceLocation getLocation() const
const DeclContext * getParentContext() const
If the SourceLocExpr has been resolved return the subexpression representing the resolved value.
StringRef getBuiltinStr() const
Return a string representing the name of the specific builtin function.
static bool MayBeDependent(SourceLocIdentKind Kind)
SourceLocIdentKind getIdentKind() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
FileIDAndOffset getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
StringRef getBufferData(FileID FID, bool *Invalid=nullptr) const
Return a StringRef to the source buffer data for the specified FileID.
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
CharSourceRange getExpansionRange(SourceLocation Loc) const
Given a SourceLocation object, return the range of tokens covered by the expansion in the ultimate fi...
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
A trivial tuple used to represent a source range.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
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.
UnsignedOrNone findZeroCodeUnit(unsigned StartIndex=0) const
Scan the string literal contents for a code unit with value 0.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
unsigned getLength() const
uint32_t getCodeUnit(size_t I) const
Return the code unit at the given position.
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
Return a source location that points to the specified byte of this string literal.
void outputString(raw_ostream &OS) const
Prints the contents of the string to OS.
StringRef getString() const
static StringLiteral * CreateEmpty(const ASTContext &Ctx, unsigned NumConcatenated, unsigned Length, unsigned CharByteWidth)
Construct an empty string literal.
unsigned getNumConcatenated() const
Get the number of string literal tokens that were concatenated in translation phase #6 to form this s...
unsigned getCharByteWidth() const
Represents the declaration of a struct/union/class/enum.
Exposes information about the current target.
A convenient class for passing around template argument information.
ArrayRef< TemplateArgumentLoc > arguments() const
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 isFunctionType() const
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 ...
Represents a statement that could possibly have a value and type.
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 clang::Expr * ExprTy
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
bool Comp(InterpState &S)
1) Pops the value from the stack.
Top level wrappers for InstallAPI frontend operations.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
ConstantResultStorageKind
Describes the kind of result that can be tail-allocated.
@ Ctor_Base
Base object ctor.
bool isa(CodeGen::Address addr)
LLVM_READONLY bool isPrintable(unsigned char c)
Return true if this character is an ASCII printable character; that is, a character that should take ...
const Expr * findStructFieldAccess(const Expr *E, const Expr **OutArrayIndex=nullptr, QualType *OutArrayElementTy=nullptr)
Walk E through parens, implicit casts, unary &/*, array subscripts and comma operators to find the he...
LLVM_READONLY auto escapeCStyle(CharT Ch) -> StringRef
Return C-style escaped string for special characters, or an empty string if there is no such mapping.
Expr * IgnoreExprNodes(Expr *E, FnTys &&... Fns)
Given an expression E and functions Fn_1,...,Fn_n : Expr * -> Expr *, Recursively apply each of the f...
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
StmtIterator cast_away_const(const ConstStmtIterator &RHS)
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
std::pair< FileID, unsigned > FileIDAndOffset
ExprDependence computeDependence(FullExpr *E)
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
Expr * IgnoreImplicitCastsExtraSingleStep(Expr *E)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
Expr * IgnoreImplicitCastsSingleStep(Expr *E)
@ Dtor_Base
Base object dtor.
CastKind
CastKind - The kind of operation required for a conversion.
void FixedPointValueToString(SmallVectorImpl< char > &Str, llvm::APSInt Val, unsigned Scale)
Expr * IgnoreImplicitSingleStep(Expr *E)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Expr * IgnoreParensSingleStep(Expr *E)
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Expr * IgnoreImplicitAsWrittenSingleStep(Expr *E)
Expr * IgnoreCastsSingleStep(Expr *E)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
@ Full
Match, but we didn't check for full match.
U cast(CodeGen::Address addr)
Expr * IgnoreLValueCastsSingleStep(Expr *E)
bool isLambdaMethod(const DeclContext *DC)
ActionResult< Expr * > ExprResult
Expr * IgnoreParensOnlySingleStep(Expr *E)
@ PrettyFunctionNoVirtual
The same as PrettyFunction, except that the 'virtual' keyword is omitted for virtual member functions...
Expr * IgnoreBaseCastsSingleStep(Expr *E)
NonOdrUseReason
The reason why a DeclRefExpr does not constitute an odr-use.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
SourceLocation getEndLoc() const LLVM_READONLY
Stores data related to a single embed directive.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
Iterator range representation begin:end[:step].
Helper expressions and declaration for OMPIteratorExpr class for each iteration space.
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressTagKeyword
Whether type printing should skip printing the tag keyword.
const PrintingCallbacks * Callbacks
Callbacks to use to allow the behavior of printing to be customized.
A placeholder type used to construct an empty shell of a type, that will be filled in later (e....
An adjustment to be made to the temporary created when emitting a reference binding,...