35#include "llvm/Support/ErrorHandling.h"
36#include "llvm/Support/Format.h"
37#include "llvm/Support/raw_ostream.h"
49 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
50 if (BO->getOpcode() == BO_Comma) {
57 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E)) {
58 E = MTE->getSubExpr();
75 DerivedType = ATy->getElementType();
90 if (
const auto *CE = dyn_cast<CastExpr>(E)) {
91 if ((CE->getCastKind() == CK_DerivedToBase ||
92 CE->getCastKind() == CK_UncheckedDerivedToBase) &&
100 if (CE->getCastKind() == CK_NoOp) {
101 E = CE->getSubExpr();
104 }
else if (
const auto *ME = dyn_cast<MemberExpr>(E)) {
105 if (!ME->isArrow()) {
106 assert(ME->getBase()->getType()->getAsRecordDecl());
107 if (
const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl())) {
108 if (!Field->isBitField() && !Field->getType()->isReferenceType()) {
115 }
else if (
const auto *BO = dyn_cast<BinaryOperator>(E)) {
116 if (BO->getOpcode() == BO_PtrMemD) {
117 assert(BO->getRHS()->isPRValue());
123 if (BO->getOpcode() == BO_Comma) {
124 CommaLHSs.push_back(BO->getLHS());
145 switch (UO->getOpcode()) {
147 return UO->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
159 return CE->getSubExpr()->isKnownToHaveBooleanValue(Semantic);
162 switch (BO->getOpcode()) {
163 default:
return false;
178 return BO->getLHS()->isKnownToHaveBooleanValue(Semantic) &&
179 BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
183 return BO->getRHS()->isKnownToHaveBooleanValue(Semantic);
188 return CO->getTrueExpr()->isKnownToHaveBooleanValue(Semantic) &&
189 CO->getFalseExpr()->isKnownToHaveBooleanValue(Semantic);
194 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(E))
195 return OVE->getSourceExpr()->isKnownToHaveBooleanValue(Semantic);
198 if (!Semantic && FD->getType()->isUnsignedIntegerType() &&
199 !FD->getBitWidth()->isValueDependent() && FD->getBitWidthValue() == 1)
208 bool IgnoreTemplateOrMacroSubstitution)
const {
210 const Decl *D =
nullptr;
212 if (
const auto *ME = dyn_cast<MemberExpr>(E))
213 D = ME->getMemberDecl();
214 else if (
const auto *DRE = dyn_cast<DeclRefExpr>(E))
216 else if (
const auto *IRE = dyn_cast<ObjCIvarRefExpr>(E))
220 StrictFlexArraysLevel,
221 IgnoreTemplateOrMacroSubstitution);
231 if (
Value.isMemberPointer())
232 return Value.getMemberPointerDecl();
234 if (
Value.isLValue() &&
Value.getLValueOffset().isZero())
248 template <
class E,
class T>
251 return static_cast<const E*
>(
expr)->getExprLoc();
261 return static_cast<const E *
>(
expr)->getBeginLoc();
270 if (ED->isCompleteDefinition())
279#define ABSTRACT_STMT(type)
280#define STMT(type, base) \
281 case Stmt::type##Class: break;
282#define EXPR(type, base) \
283 case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
284#include "clang/AST/StmtNodes.inc"
286 llvm_unreachable(
"unknown expression kind");
297 "Invalid StorageKind Value");
307 if (!
Value.getInt().needsCleanup())
317 if (
T->isIntegralOrEnumerationType() && Context.getTypeInfo(
T).Width <= 64)
323 bool IsImmediateInvocation)
324 :
FullExpr(ConstantExprClass, SubExpr) {
333 ::new (getTrailingObjects<APValue>())
APValue();
338 bool IsImmediateInvocation) {
342 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
345 void *Mem = Context.Allocate(Size,
alignof(ConstantExpr));
346 return new (Mem) ConstantExpr(E, StorageKind, IsImmediateInvocation);
352 ConstantExpr *
Self =
Create(Context, E, StorageKind);
357ConstantExpr::ConstantExpr(EmptyShell
Empty,
363 ::new (getTrailingObjects<APValue>())
APValue();
370 unsigned Size = totalSizeToAlloc<APValue, uint64_t>(
373 void *Mem = Context.Allocate(Size,
alignof(ConstantExpr));
374 return new (Mem) ConstantExpr(
EmptyShell(), StorageKind);
379 "Invalid storage for this value kind");
385 Int64Result() = *
Value.getInt().getRawData();
392 Context.addDestruction(&APValueResult());
394 APValueResult() = std::move(
Value);
397 llvm_unreachable(
"Invalid ResultKind Bits");
403 return APValueResult().getInt();
408 llvm_unreachable(
"invalid Accessor");
416 return APValueResult();
426 llvm_unreachable(
"invalid ResultKind");
430 bool RefersToEnclosingVariableOrCapture,
QualType T,
440 RefersToEnclosingVariableOrCapture;
441 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
448DeclRefExpr::DeclRefExpr(
const ASTContext &Ctx,
451 bool RefersToEnclosingVariableOrCapture,
460 new (getTrailingObjects<NestedNameSpecifierLoc>())
464 *getTrailingObjects<NamedDecl *>() = FoundD;
466 = (TemplateArgs || TemplateKWLoc.
isValid()) ? 1 : 0;
468 RefersToEnclosingVariableOrCapture;
469 DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
472 auto Deps = TemplateArgumentDependence::None;
473 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
474 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
476 assert(!(Deps & TemplateArgumentDependence::Dependent) &&
477 "built a DeclRefExpr with dependent template args");
478 }
else if (TemplateKWLoc.
isValid()) {
479 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
490 bool RefersToEnclosingVariableOrCapture,
495 return Create(Context, QualifierLoc, TemplateKWLoc, D,
496 RefersToEnclosingVariableOrCapture,
498 T,
VK, FoundD, TemplateArgs, NOUR);
504 bool RefersToEnclosingVariableOrCapture,
514 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
518 QualifierLoc ? 1 : 0, FoundD ? 1 : 0,
519 HasTemplateKWAndArgsInfo ? 1 : 0,
520 TemplateArgs ? TemplateArgs->
size() : 0);
522 void *Mem = Context.Allocate(Size,
alignof(DeclRefExpr));
523 return new (Mem) DeclRefExpr(Context, QualifierLoc, TemplateKWLoc, D,
524 RefersToEnclosingVariableOrCapture, NameInfo,
525 FoundD, TemplateArgs,
T,
VK, NOUR);
531 bool HasTemplateKWAndArgsInfo,
532 unsigned NumTemplateArgs) {
533 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
537 HasQualifier ? 1 : 0, HasFoundDecl ? 1 : 0, HasTemplateKWAndArgsInfo,
539 void *Mem = Context.Allocate(Size,
alignof(DeclRefExpr));
545 if (
getType()->isUndeducedType())
556SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(
SourceLocation OpLoc,
562 OpLoc(OpLoc), LParen(LParen), RParen(RParen) {
563 setTypeSourceInfo(TSI);
567SYCLUniqueStableNameExpr::SYCLUniqueStableNameExpr(EmptyShell
Empty,
577 SYCLUniqueStableNameExpr(OpLoc, LParen, RParen, ResultTy, TSI);
583 return new (Ctx) SYCLUniqueStableNameExpr(
EmptyShell(), ResultTy);
595 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
596 return RD->getDeviceLambdaManglingNumber();
601 Context, Context.getDiagnostics(), MangleCallback)};
605 llvm::raw_string_ostream Out(Buffer);
606 Ctx->mangleCanonicalTypeName(Ty, Out);
616 assert((getIdentKind() == IK) &&
617 "IdentKind do not fit in PredefinedExprBitfields!");
618 bool HasFunctionName = SL !=
nullptr;
627PredefinedExpr::PredefinedExpr(EmptyShell
Empty,
bool HasFunctionName)
635 bool HasFunctionName = SL !=
nullptr;
636 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
637 alignof(PredefinedExpr));
638 return new (Mem) PredefinedExpr(L, FNTy, IK, IsTransparent, SL);
642 bool HasFunctionName) {
643 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(HasFunctionName),
644 alignof(PredefinedExpr));
645 return new (Mem) PredefinedExpr(
EmptyShell(), HasFunctionName);
653 return "__FUNCTION__";
655 return "__FUNCDNAME__";
657 return "L__FUNCTION__";
659 return "__PRETTY_FUNCTION__";
661 return "__FUNCSIG__";
663 return "L__FUNCSIG__";
667 llvm_unreachable(
"Unknown ident kind for PredefinedExpr");
673 const Decl *CurrentDecl,
674 bool ForceElaboratedPrinting) {
678 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(CurrentDecl)) {
679 std::unique_ptr<MangleContext> MC;
680 MC.reset(Context.createMangleContext());
682 if (MC->shouldMangleDeclName(ND)) {
684 llvm::raw_svector_ostream Out(Buffer);
690 else if (
auto FD = dyn_cast<FunctionDecl>(ND)) {
694 MC->mangleName(GD, Out);
696 if (!Buffer.empty() && Buffer.front() ==
'\01')
697 return std::string(Buffer.substr(1));
698 return std::string(Buffer);
700 return std::string(ND->getIdentifier()->getName());
709 if (DC->isFileContext())
713 llvm::raw_svector_ostream Out(Buffer);
714 if (
auto *DCBlock = dyn_cast<BlockDecl>(DC))
717 else if (
auto *DCDecl = dyn_cast<Decl>(DC))
719 return std::string(Out.str());
721 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
722 const auto &LO = Context.getLangOpts();
723 bool IsFuncOrFunctionInNonMSVCCompatEnv =
725 IK == PredefinedIdentKind ::Function) &&
727 bool IsLFunctionInMSVCCommpatEnv =
729 bool IsFuncOrFunctionOrLFunctionOrFuncDName =
734 if ((ForceElaboratedPrinting &&
735 (IsFuncOrFunctionInNonMSVCCompatEnv || IsLFunctionInMSVCCommpatEnv)) ||
736 (!ForceElaboratedPrinting && IsFuncOrFunctionOrLFunctionOrFuncDName))
737 return FD->getNameAsString();
740 llvm::raw_svector_ostream Out(Name);
745 if (MD->isStatic() && !ForceElaboratedPrinting)
752 std::string remapPath(StringRef Path)
const override {
755 return std::string(p);
762 PrettyCallbacks PrettyCB(Context.getLangOpts());
767 llvm::raw_string_ostream POut(Proto);
776 const Type *Ty =
Decl->getType().getTypePtrOrNull();
782 if (FD->hasWrittenPrototype())
783 FT = dyn_cast<FunctionProtoType>(AFT);
788 case CC_C: POut <<
"__cdecl ";
break;
799 FD->printQualifiedName(POut, Policy);
803 return std::string(Name);
808 for (
unsigned i = 0, e =
Decl->getNumParams(); i != e; ++i) {
810 POut <<
Decl->getParamDecl(i)->getType().stream(Policy);
813 if (FT->isVariadic()) {
814 if (FD->getNumParams()) POut <<
", ";
818 !Context.getLangOpts().CPlusPlus) &&
819 !
Decl->getNumParams()) {
826 assert(FT &&
"We must have a written prototype in this case.");
829 if (FT->isVolatile())
841 while (isa_and_nonnull<NamedDecl>(Ctx)) {
843 = dyn_cast<ClassTemplateSpecializationDecl>(Ctx);
845 Specs.push_back(Spec);
849 std::string TemplateParams;
850 llvm::raw_string_ostream TOut(TemplateParams);
853 D->getSpecializedTemplate()->getTemplateParameters();
855 assert(Params->
size() == Args.
size());
856 for (
unsigned i = 0, numParams = Params->
size(); i != numParams; ++i) {
858 if (Param.empty())
continue;
859 TOut << Param <<
" = ";
868 = FD->getTemplateSpecializationInfo();
873 assert(Params->
size() == Args->
size());
874 for (
unsigned i = 0, e = Params->
size(); i != e; ++i) {
876 if (Param.empty())
continue;
877 TOut << Param <<
" = ";
878 Args->
get(i).
print(Policy, TOut,
true);
883 if (!TemplateParams.empty()) {
885 TemplateParams.resize(TemplateParams.size() - 2);
886 POut <<
" [" << TemplateParams <<
"]";
894 Proto =
"auto " + Proto;
895 else if (FT && FT->getReturnType()->getAs<DecltypeType>())
897 ->getAs<DecltypeType>()
905 return std::string(Name);
907 if (
const CapturedDecl *CD = dyn_cast<CapturedDecl>(CurrentDecl)) {
911 if (DC->isFunctionOrMethod() && (DC->getDeclKind() != Decl::Captured)) {
915 llvm_unreachable(
"CapturedDecl not inside a function or method");
917 if (
const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
919 llvm::raw_svector_ostream Out(Name);
920 Out << (MD->isInstanceMethod() ?
'-' :
'+');
929 dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
930 Out <<
'(' << *CID <<
')';
933 MD->getSelector().print(Out);
936 return std::string(Name);
947 const llvm::APInt &Val) {
952 unsigned NumWords = Val.getNumWords();
953 const uint64_t* Words = Val.getRawData();
955 pVal =
new (
C) uint64_t[NumWords];
956 std::copy(Words, Words + NumWords,
pVal);
957 }
else if (NumWords == 1)
963IntegerLiteral::IntegerLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
966 assert(
type->isIntegerType() &&
"Illegal type in IntegerLiteral");
967 assert(
V.getBitWidth() ==
C.getIntWidth(
type) &&
968 "Integer type is not the correct size for constant.");
976 return new (
C) IntegerLiteral(
C,
V,
type, l);
981 return new (
C) IntegerLiteral(
Empty);
984FixedPointLiteral::FixedPointLiteral(
const ASTContext &
C,
const llvm::APInt &
V,
989 assert(
type->isFixedPointType() &&
"Illegal type in FixedPointLiteral");
990 assert(
V.getBitWidth() ==
C.getTypeInfo(
type).Width &&
991 "Fixed point type is not the correct size for constant.");
997 const llvm::APInt &
V,
1001 return new (
C) FixedPointLiteral(
C,
V,
type, l, Scale);
1006 return new (
C) FixedPointLiteral(
Empty);
1015 S, llvm::APSInt::getUnsigned(
getValue().getZExtValue()), Scale);
1016 return std::string(S);
1039 if (!Escaped.empty()) {
1040 OS <<
"'" << Escaped <<
"'";
1049 OS <<
"'" << (char)Val <<
"'";
1051 OS <<
"'\\x" << llvm::format(
"%02x", Val) <<
"'";
1052 else if (Val <= 0xFFFF)
1053 OS <<
"'\\u" << llvm::format(
"%04x", Val) <<
"'";
1055 OS <<
"'\\U" << llvm::format(
"%08x", Val) <<
"'";
1059FloatingLiteral::FloatingLiteral(
const ASTContext &
C,
const llvm::APFloat &
V,
1062 setSemantics(
V.getSemantics());
1070 setRawSemantics(llvm::APFloatBase::S_IEEEhalf);
1077 return new (
C) FloatingLiteral(
C,
V, isexact,
Type, L);
1082 return new (
C) FloatingLiteral(
C,
Empty);
1091 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
1093 return V.convertToDouble();
1098 unsigned CharByteWidth = 0;
1103 CharByteWidth =
Target.getCharWidth();
1106 CharByteWidth =
Target.getWCharWidth();
1109 CharByteWidth =
Target.getChar16Width();
1112 CharByteWidth =
Target.getChar32Width();
1115 return sizeof(char);
1117 assert((CharByteWidth & 7) == 0 &&
"Assumes character size is byte multiple");
1119 assert((CharByteWidth == 1 || CharByteWidth == 2 || CharByteWidth == 4) &&
1120 "The only supported character byte widths are 1,2 and 4!");
1121 return CharByteWidth;
1124StringLiteral::StringLiteral(
const ASTContext &Ctx, StringRef Str,
1129 unsigned Length = Str.size();
1136 "StringLiteral must be of constant array type!");
1137 unsigned CharByteWidth = mapCharByteWidth(Ctx.
getTargetInfo(), Kind);
1138 unsigned ByteLength = Str.size();
1139 assert((ByteLength % CharByteWidth == 0) &&
1140 "The size of the data must be a multiple of CharByteWidth!");
1145 switch (CharByteWidth) {
1147 Length = ByteLength;
1150 Length = ByteLength / 2;
1153 Length = ByteLength / 4;
1156 llvm_unreachable(
"Unsupported character width!");
1162 assert(!Pascal &&
"Can't make an unevaluated Pascal string");
1167 *getTrailingObjects<unsigned>() = Length;
1171 llvm::copy(Locs, getTrailingObjects<SourceLocation>());
1174 llvm::copy(Str, getTrailingObjects<char>());
1179StringLiteral::StringLiteral(EmptyShell
Empty,
unsigned NumConcatenated,
1180 unsigned Length,
unsigned CharByteWidth)
1184 *getTrailingObjects<unsigned>() = Length;
1191 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1192 1, Locs.size(), Str.size()),
1193 alignof(StringLiteral));
1194 return new (Mem) StringLiteral(Ctx, Str, Kind, Pascal, Ty, Locs);
1198 unsigned NumConcatenated,
1200 unsigned CharByteWidth) {
1201 void *Mem = Ctx.
Allocate(totalSizeToAlloc<unsigned, SourceLocation, char>(
1202 1, NumConcatenated, Length * CharByteWidth),
1203 alignof(StringLiteral));
1205 StringLiteral(
EmptyShell(), NumConcatenated, Length, CharByteWidth);
1228 static const char Hex[] =
"0123456789ABCDEF";
1231 for (
unsigned I = 0, N =
getLength(); I != N; ++I) {
1234 if (Escaped.empty()) {
1240 Char >= 0xd800 && Char <= 0xdbff) {
1242 if (Trail >= 0xdc00 && Trail <= 0xdfff) {
1243 Char = 0x10000 + ((Char - 0xd800) << 10) + (Trail - 0xdc00);
1253 (Char >= 0xd800 && Char <= 0xdfff) || Char >= 0x110000) {
1257 while ((Char >> Shift) == 0)
1259 for (; Shift >= 0; Shift -= 4)
1260 OS << Hex[(Char >> Shift) & 15];
1267 << Hex[(Char >> 20) & 15]
1268 << Hex[(Char >> 16) & 15];
1271 OS << Hex[(Char >> 12) & 15]
1272 << Hex[(Char >> 8) & 15]
1273 << Hex[(Char >> 4) & 15]
1274 << Hex[(Char >> 0) & 15];
1280 if (LastSlashX + 1 == I) {
1282 case '0':
case '1':
case '2':
case '3':
case '4':
1283 case '5':
case '6':
case '7':
case '8':
case '9':
1284 case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
1285 case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
1290 assert(Char <= 0xff &&
1291 "Characters above 0xff should already have been handled.");
1297 << (char)(
'0' + ((Char >> 6) & 7))
1298 << (char)(
'0' + ((Char >> 3) & 7))
1299 << (char)(
'0' + ((Char >> 0) & 7));
1328 unsigned *StartTokenByteOffset)
const {
1337 "Only narrow string literals are currently supported");
1342 unsigned StringOffset = 0;
1344 TokNo = *StartToken;
1345 if (StartTokenByteOffset) {
1346 StringOffset = *StartTokenByteOffset;
1347 ByteNo -= StringOffset;
1361 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
1363 if (StartTokenByteOffset !=
nullptr)
1364 *StartTokenByteOffset = StringOffset;
1365 if (StartToken !=
nullptr)
1366 *StartToken = TokNo;
1367 return StrTokSpellingLoc;
1370 const char *StrData = Buffer.data()+LocInfo.second;
1373 Lexer TheLexer(
SM.getLocForStartOfFile(LocInfo.first), Features,
1374 Buffer.begin(), StrData, Buffer.end());
1383 if (ByteNo < TokNumBytes ||
1389 if (StartTokenByteOffset !=
nullptr)
1390 *StartTokenByteOffset = StringOffset;
1391 if (StartToken !=
nullptr)
1392 *StartToken = TokNo;
1397 StringOffset += TokNumBytes;
1399 ByteNo -= TokNumBytes;
1407#define UNARY_OPERATION(Name, Spelling) case UO_##Name: return Spelling;
1408#include "clang/AST/OperationKinds.def"
1410 llvm_unreachable(
"Unknown unary operator");
1416 default: llvm_unreachable(
"No unary operator for overloaded function");
1417 case OO_PlusPlus:
return Postfix ? UO_PostInc : UO_PreInc;
1418 case OO_MinusMinus:
return Postfix ? UO_PostDec : UO_PreDec;
1419 case OO_Amp:
return UO_AddrOf;
1420 case OO_Star:
return UO_Deref;
1421 case OO_Plus:
return UO_Plus;
1422 case OO_Minus:
return UO_Minus;
1423 case OO_Tilde:
return UO_Not;
1424 case OO_Exclaim:
return UO_LNot;
1425 case OO_Coawait:
return UO_Coawait;
1431 case UO_PostInc:
case UO_PreInc:
return OO_PlusPlus;
1432 case UO_PostDec:
case UO_PreDec:
return OO_MinusMinus;
1433 case UO_AddrOf:
return OO_Amp;
1434 case UO_Deref:
return OO_Star;
1435 case UO_Plus:
return OO_Plus;
1436 case UO_Minus:
return OO_Minus;
1437 case UO_Not:
return OO_Tilde;
1438 case UO_LNot:
return OO_Exclaim;
1439 case UO_Coawait:
return OO_Coawait;
1451 case Expr::CallExprClass:
1453 case Expr::CXXOperatorCallExprClass:
1455 case Expr::CXXMemberCallExprClass:
1457 case Expr::UserDefinedLiteralClass:
1459 case Expr::CUDAKernelCallExprClass:
1462 llvm_unreachable(
"unexpected class deriving from CallExpr!");
1470 "we assume CXXOperatorCallExpr is at most 32 bytes");
1477 NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1478 unsigned NumPreArgs = PreArgs.size();
1480 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1482 "This CallExpr subclass is too big or unsupported");
1487 for (
unsigned I = 0; I != NumPreArgs; ++I)
1489 for (
unsigned I = 0; I != Args.size(); ++I)
1491 for (
unsigned I = Args.size(); I != NumArgs; ++I)
1498 CallExprBits.ExplicitObjectMemFunUsingMemberSyntax =
false;
1509 assert((NumPreArgs ==
getNumPreArgs()) &&
"NumPreArgs overflow!");
1512 CallExprBits.ExplicitObjectMemFunUsingMemberSyntax =
false;
1521 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
1528 new (Mem)
CallExpr(CallExprClass, Fn, {}, Args, Ty,
VK,
1529 RParenLoc, FPFeatures, MinNumArgs,
UsesADL);
1530 E->updateTrailingSourceLoc();
1536 unsigned SizeOfTrailingObjects =
1552 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1553 return DRE->getDecl();
1555 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1556 return ME->getMemberDecl();
1560 while (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(CEE))
1565 if (
auto *BO = dyn_cast<BinaryOperator>(CEE)) {
1566 if (BO->isPtrMemOp()) {
1570 }
else if (
auto *UO = dyn_cast<UnaryOperator>(CEE)) {
1571 if (UO->getOpcode() == UO_Deref || UO->getOpcode() == UO_AddrOf ||
1572 UO->getOpcode() == UO_Plus) {
1580 if (
auto *DRE = dyn_cast<DeclRefExpr>(CEE))
1581 return DRE->getDecl();
1582 if (
auto *ME = dyn_cast<MemberExpr>(CEE))
1583 return ME->getMemberDecl();
1584 if (
auto *BE = dyn_cast<BlockExpr>(CEE))
1585 return BE->getBlockDecl();
1593 return FDecl ? FDecl->getBuiltinID() : 0;
1604 QualType CalleeType = Callee->getType();
1618 assert(!CalleeType.
isNull());
1632std::pair<const NamedDecl *, const WarnUnusedResultAttr *>
1635 if (Callee !=
nullptr)
1636 if (
const auto *A = Callee->getAttr<WarnUnusedResultAttr>())
1637 return {
nullptr, A};
1642 if (
const auto *A = TD->getAttr<WarnUnusedResultAttr>())
1647 if (
const auto *A = TD->getDecl()->getAttr<WarnUnusedResultAttr>())
1648 return {TD->getDecl(), A};
1649 return {
nullptr,
nullptr};
1658 void *Mem =
C.Allocate(
1659 totalSizeToAlloc<OffsetOfNode, Expr *>(comps.size(), exprs.size()));
1661 return new (Mem) OffsetOfExpr(
C,
type, OperatorLoc, tsi, comps, exprs,
1666 unsigned numComps,
unsigned numExprs) {
1668 C.Allocate(totalSizeToAlloc<OffsetOfNode, Expr *>(numComps, numExprs));
1669 return new (Mem) OffsetOfExpr(numComps, numExprs);
1677 OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
1678 NumComps(comps.size()), NumExprs(exprs.size()) {
1679 for (
unsigned i = 0; i != comps.size(); ++i)
1681 for (
unsigned i = 0; i != exprs.size(); ++i)
1699 OpLoc(op), RParenLoc(rp) {
1700 assert(ExprKind <=
UETT_Last &&
"invalid enum value!");
1703 "UnaryExprOrTypeTraitExprBits.Kind overflow!");
1717 :
Expr(MemberExprClass,
T,
VK, OK),
Base(
Base), MemberDecl(MemberDecl),
1718 MemberDNLoc(NameInfo.
getInfo()), MemberLoc(NameInfo.getLoc()) {
1724 FoundDecl.
getDecl() != MemberDecl ||
1727 TemplateArgs || TemplateKWLoc.
isValid();
1733 new (getTrailingObjects<NestedNameSpecifierLoc>())
1736 *getTrailingObjects<DeclAccessPair>() = FoundDecl;
1738 auto Deps = TemplateArgumentDependence::None;
1739 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1740 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1742 }
else if (TemplateKWLoc.
isValid()) {
1743 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1756 bool HasFoundDecl = FoundDecl.
getDecl() != MemberDecl ||
1757 FoundDecl.
getAccess() != MemberDecl->getAccess();
1758 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
1762 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1763 TemplateArgs ? TemplateArgs->
size() : 0);
1765 void *Mem =
C.Allocate(Size,
alignof(MemberExpr));
1766 return new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, QualifierLoc,
1767 TemplateKWLoc, MemberDecl, FoundDecl, NameInfo,
1768 TemplateArgs,
T,
VK, OK, NOUR);
1772 bool HasQualifier,
bool HasFoundDecl,
1773 bool HasTemplateKWAndArgsInfo,
1774 unsigned NumTemplateArgs) {
1775 assert((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
1776 "template args but no template arg info?");
1780 HasQualifier, HasFoundDecl, HasTemplateKWAndArgsInfo,
1782 void *Mem = Context.Allocate(Size,
alignof(MemberExpr));
1788 if (
getType()->isUndeducedType())
1804 return BaseStartLoc;
1816bool CastExpr::CastConsistency()
const {
1818 case CK_DerivedToBase:
1819 case CK_UncheckedDerivedToBase:
1820 case CK_DerivedToBaseMemberPointer:
1821 case CK_BaseToDerived:
1822 case CK_BaseToDerivedMemberPointer:
1823 assert(!
path_empty() &&
"Cast kind should have a base path!");
1826 case CK_CPointerToObjCPointerCast:
1827 assert(
getType()->isObjCObjectPointerType());
1829 goto CheckNoBasePath;
1831 case CK_BlockPointerToObjCPointerCast:
1832 assert(
getType()->isObjCObjectPointerType());
1834 goto CheckNoBasePath;
1836 case CK_ReinterpretMemberPointer:
1837 assert(
getType()->isMemberPointerType());
1839 goto CheckNoBasePath;
1845 if (!
getType()->isPointerType()) {
1846 assert(
getType()->isObjCObjectPointerType() ==
1848 assert(
getType()->isBlockPointerType() ==
1851 goto CheckNoBasePath;
1853 case CK_AnyPointerToBlockPointerCast:
1854 assert(
getType()->isBlockPointerType());
1857 goto CheckNoBasePath;
1859 case CK_CopyAndAutoreleaseBlockObject:
1860 assert(
getType()->isBlockPointerType());
1862 goto CheckNoBasePath;
1864 case CK_FunctionToPointerDecay:
1865 assert(
getType()->isPointerType());
1867 goto CheckNoBasePath;
1869 case CK_AddressSpaceConversion: {
1878 (!Ty.
isNull() && !SETy.isNull() &&
1880 goto CheckNoBasePath;
1885 case CK_ArrayToPointerDecay:
1886 case CK_NullToMemberPointer:
1887 case CK_NullToPointer:
1888 case CK_ConstructorConversion:
1889 case CK_IntegralToPointer:
1890 case CK_PointerToIntegral:
1892 case CK_VectorSplat:
1893 case CK_IntegralCast:
1894 case CK_BooleanToSignedIntegral:
1895 case CK_IntegralToFloating:
1896 case CK_FloatingToIntegral:
1897 case CK_FloatingCast:
1898 case CK_ObjCObjectLValueCast:
1899 case CK_FloatingRealToComplex:
1900 case CK_FloatingComplexToReal:
1901 case CK_FloatingComplexCast:
1902 case CK_FloatingComplexToIntegralComplex:
1903 case CK_IntegralRealToComplex:
1904 case CK_IntegralComplexToReal:
1905 case CK_IntegralComplexCast:
1906 case CK_IntegralComplexToFloatingComplex:
1907 case CK_ARCProduceObject:
1908 case CK_ARCConsumeObject:
1909 case CK_ARCReclaimReturnedObject:
1910 case CK_ARCExtendBlockObject:
1911 case CK_ZeroToOCLOpaqueType:
1912 case CK_IntToOCLSampler:
1913 case CK_FloatingToFixedPoint:
1914 case CK_FixedPointToFloating:
1915 case CK_FixedPointCast:
1916 case CK_FixedPointToIntegral:
1917 case CK_IntegralToFixedPoint:
1920 goto CheckNoBasePath;
1923 case CK_LValueToRValue:
1925 case CK_AtomicToNonAtomic:
1926 case CK_NonAtomicToAtomic:
1927 case CK_PointerToBoolean:
1928 case CK_IntegralToBoolean:
1929 case CK_FloatingToBoolean:
1930 case CK_MemberPointerToBoolean:
1931 case CK_FloatingComplexToBoolean:
1932 case CK_IntegralComplexToBoolean:
1933 case CK_LValueBitCast:
1934 case CK_LValueToRValueBitCast:
1935 case CK_UserDefinedConversion:
1936 case CK_BuiltinFnToFnPtr:
1937 case CK_FixedPointToBoolean:
1938 case CK_HLSLArrayRValue:
1939 case CK_HLSLVectorTruncation:
1940 case CK_HLSLMatrixTruncation:
1941 case CK_HLSLElementwiseCast:
1942 case CK_HLSLAggregateSplatCast:
1944 assert(
path_empty() &&
"Cast kind should not have a base path!");
1952#define CAST_OPERATION(Name) case CK_##Name: return #Name;
1953#include "clang/AST/OperationKinds.def"
1955 llvm_unreachable(
"Unhandled cast kind!");
1961static Expr *ignoreImplicitSemaNodes(
Expr *E) {
1962 if (
auto *Materialize = dyn_cast<MaterializeTemporaryExpr>(E))
1963 return Materialize->getSubExpr();
1965 if (
auto *Binder = dyn_cast<CXXBindTemporaryExpr>(E))
1966 return Binder->getSubExpr();
1968 if (
auto *Full = dyn_cast<FullExpr>(E))
1969 return Full->getSubExpr();
1971 if (
auto *CPLIE = dyn_cast<CXXParenListInitExpr>(E);
1972 CPLIE && CPLIE->getInitExprs().size() == 1)
1973 return CPLIE->getInitExprs()[0];
1980 const Expr *SubExpr =
nullptr;
1982 for (
const CastExpr *E =
this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
1987 if (E->getCastKind() == CK_ConstructorConversion) {
1989 ignoreImplicitSemaNodes);
1990 }
else if (E->getCastKind() == CK_UserDefinedConversion) {
1992 "Unexpected SubExpr for CK_UserDefinedConversion.");
1993 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
1994 SubExpr = MCE->getImplicitObjectArgument();
1998 return const_cast<Expr *
>(SubExpr);
2002 const Expr *SubExpr =
nullptr;
2004 for (
const CastExpr *E =
this; E; E = dyn_cast<ImplicitCastExpr>(SubExpr)) {
2007 if (E->getCastKind() == CK_ConstructorConversion)
2010 if (E->getCastKind() == CK_UserDefinedConversion) {
2011 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(SubExpr))
2012 return MCE->getMethodDecl();
2021#define ABSTRACT_STMT(x)
2022#define CASTEXPR(Type, Base) \
2023 case Stmt::Type##Class: \
2024 return static_cast<Type *>(this) \
2025 ->getTrailingObjectsNonStrict<CXXBaseSpecifier *>();
2026#define STMT(Type, Base)
2027#include "clang/AST/StmtNodes.inc"
2029 llvm_unreachable(
"non-cast expressions not possible here");
2043 Field != FieldEnd; ++Field) {
2045 !Field->isUnnamedBitField()) {
2055 case ImplicitCastExprClass:
2057 ->getTrailingObjects<FPOptionsOverride>();
2058 case CStyleCastExprClass:
2060 ->getTrailingObjects<FPOptionsOverride>();
2061 case CXXFunctionalCastExprClass:
2063 ->getTrailingObjects<FPOptionsOverride>();
2064 case CXXStaticCastExprClass:
2066 ->getTrailingObjects<FPOptionsOverride>();
2068 llvm_unreachable(
"Cast does not have FPFeatures");
2077 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2079 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2083 assert((Kind != CK_LValueToRValue ||
2084 !(
T->isNullPtrType() ||
T->getAsCXXRecordDecl())) &&
2085 "invalid type for lvalue-to-rvalue conversion");
2086 ImplicitCastExpr *E =
2087 new (Buffer) ImplicitCastExpr(
T, Kind, Operand, PathSize, FPO,
VK);
2089 llvm::uninitialized_copy(*BasePath,
2096 bool HasFPFeatures) {
2098 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2099 PathSize, HasFPFeatures));
2100 return new (Buffer) ImplicitCastExpr(
EmptyShell(), PathSize, HasFPFeatures);
2109 unsigned PathSize = (BasePath ? BasePath->size() : 0);
2111 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2114 new (Buffer) CStyleCastExpr(
T,
VK, K, Op, PathSize, FPO, WrittenTy, L, R);
2116 llvm::uninitialized_copy(*BasePath,
2123 bool HasFPFeatures) {
2125 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
2126 PathSize, HasFPFeatures));
2127 return new (Buffer) CStyleCastExpr(
EmptyShell(), PathSize, HasFPFeatures);
2134#define BINARY_OPERATION(Name, Spelling) case BO_##Name: return Spelling;
2135#include "clang/AST/OperationKinds.def"
2137 llvm_unreachable(
"Invalid OpCode!");
2143 default: llvm_unreachable(
"Not an overloadable binary operator");
2144 case OO_Plus:
return BO_Add;
2145 case OO_Minus:
return BO_Sub;
2146 case OO_Star:
return BO_Mul;
2147 case OO_Slash:
return BO_Div;
2148 case OO_Percent:
return BO_Rem;
2149 case OO_Caret:
return BO_Xor;
2150 case OO_Amp:
return BO_And;
2151 case OO_Pipe:
return BO_Or;
2152 case OO_Equal:
return BO_Assign;
2153 case OO_Spaceship:
return BO_Cmp;
2154 case OO_Less:
return BO_LT;
2155 case OO_Greater:
return BO_GT;
2156 case OO_PlusEqual:
return BO_AddAssign;
2157 case OO_MinusEqual:
return BO_SubAssign;
2158 case OO_StarEqual:
return BO_MulAssign;
2159 case OO_SlashEqual:
return BO_DivAssign;
2160 case OO_PercentEqual:
return BO_RemAssign;
2161 case OO_CaretEqual:
return BO_XorAssign;
2162 case OO_AmpEqual:
return BO_AndAssign;
2163 case OO_PipeEqual:
return BO_OrAssign;
2164 case OO_LessLess:
return BO_Shl;
2165 case OO_GreaterGreater:
return BO_Shr;
2166 case OO_LessLessEqual:
return BO_ShlAssign;
2167 case OO_GreaterGreaterEqual:
return BO_ShrAssign;
2168 case OO_EqualEqual:
return BO_EQ;
2169 case OO_ExclaimEqual:
return BO_NE;
2170 case OO_LessEqual:
return BO_LE;
2171 case OO_GreaterEqual:
return BO_GE;
2172 case OO_AmpAmp:
return BO_LAnd;
2173 case OO_PipePipe:
return BO_LOr;
2174 case OO_Comma:
return BO_Comma;
2175 case OO_ArrowStar:
return BO_PtrMemI;
2182 OO_Star, OO_Slash, OO_Percent,
2184 OO_LessLess, OO_GreaterGreater,
2186 OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
2187 OO_EqualEqual, OO_ExclaimEqual,
2193 OO_Equal, OO_StarEqual,
2194 OO_SlashEqual, OO_PercentEqual,
2195 OO_PlusEqual, OO_MinusEqual,
2196 OO_LessLessEqual, OO_GreaterGreaterEqual,
2197 OO_AmpEqual, OO_CaretEqual,
2201 return OverOps[Opc];
2213 if (LHS->getType()->isPointerType()) {
2214 if (!RHS->getType()->isIntegerType())
2217 }
else if (RHS->getType()->isPointerType()) {
2218 if (!LHS->getType()->isIntegerType())
2230 if (!Select->getCond()->EvaluateAsBooleanCondition(
EvalResult, Ctx))
2232 PExp =
EvalResult ? Select->getTrueExpr() : Select->getFalseExpr();
2253 BuiltinLoc(BLoc), RParenLoc(RParenLoc), ParentContext(ParentContext) {
2257 ? ExprDependence::Value
2258 : ExprDependence::None);
2264 return "__builtin_FILE";
2266 return "__builtin_FILE_NAME";
2268 return "__builtin_FUNCTION";
2270 return "__builtin_FUNCSIG";
2272 return "__builtin_LINE";
2274 return "__builtin_COLUMN";
2276 return "__builtin_source_location";
2278 llvm_unreachable(
"unexpected IdentKind!");
2282 const Expr *DefaultExpr)
const {
2286 if (
const auto *DIE = dyn_cast_if_present<CXXDefaultInitExpr>(DefaultExpr)) {
2287 Loc = DIE->getUsedLocation();
2288 Context = DIE->getUsedContext();
2289 }
else if (
const auto *DAE =
2290 dyn_cast_if_present<CXXDefaultArgExpr>(DefaultExpr)) {
2291 Loc = DAE->getUsedLocation();
2292 Context = DAE->getUsedContext();
2303 if (
const auto *D = dyn_cast<CXXMethodDecl>(Context);
2305 Context = D->getParent()->getParent();
2310 auto MakeStringLiteral = [&](StringRef Tmp) {
2314 LValuePathEntry Path[1] = {LValuePathEntry::ArrayIndex(0)};
2325 return MakeStringLiteral(
FileName);
2331 return MakeStringLiteral(Path);
2335 const auto *CurDecl = dyn_cast<Decl>(Context);
2339 return MakeStringLiteral(
2359 StringRef Name = F->getName();
2360 if (Name ==
"_M_file_name") {
2364 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(Path);
2365 }
else if (Name ==
"_M_function_name") {
2368 const auto *CurDecl = dyn_cast<Decl>(Context);
2369 Value.getStructField(F->getFieldIndex()) = MakeStringLiteral(
2374 }
else if (Name ==
"_M_line") {
2376 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2377 }
else if (Name ==
"_M_column") {
2379 Value.getStructField(F->getFieldIndex()) =
APValue(IntVal);
2390 llvm_unreachable(
"unhandled case");
2395 unsigned NumOfElements)
2397 EmbedKeywordLoc(Loc), Ctx(&Ctx), Data(Data), Begin(Begin),
2398 NumOfElements(NumOfElements) {
2401 Ctx, llvm::APInt::getZero(Ctx.getTypeSize(
getType())),
getType(), Loc);
2402 assert(
getType()->isSignedIntegerType() &&
"IntTy should be signed");
2408 InitExprs(
C, initExprs.size()), LBraceLoc(lbraceloc),
2411 InitExprs.insert(
C, InitExprs.end(), initExprs.begin(), initExprs.end());
2417 if (NumInits > InitExprs.size())
2418 InitExprs.reserve(
C, NumInits);
2422 InitExprs.resize(
C, NumInits,
nullptr);
2426 if (
Init >= InitExprs.size()) {
2427 InitExprs.insert(
C, InitExprs.end(),
Init - InitExprs.size() + 1,
nullptr);
2439 ArrayFillerOrUnionFieldInit = filler;
2442 for (
unsigned i = 0, e =
getNumInits(); i != e; ++i)
2443 if (
inits[i] ==
nullptr)
2457 Init =
Init->IgnoreParenImpCasts();
2462 assert(
isSemanticForm() &&
"syntactic form never semantically transparent");
2466 assert(
getNumInits() == 1 &&
"multiple inits in glvalue init list");
2485 assert(
isSyntacticForm() &&
"only test syntactic form as zero initializer");
2492 return Lit && Lit->
getValue() == 0;
2497 return SyntacticForm->getBeginLoc();
2502 E = InitExprs.end();
2505 Beg = S->getBeginLoc();
2515 return SyntacticForm->getEndLoc();
2519 for (
Stmt *S : llvm::reverse(InitExprs)) {
2521 End = S->getEndLoc();
2538 return TheBlock->getCaretLocation();
2557 const auto *Ref = dyn_cast<DeclRefExpr>(Unwrapped);
2561 return isa_and_nonnull<DecompositionDecl>(Ref->getDecl());
2588 if (
auto *UO = dyn_cast<UnaryOperator>(E))
2589 if (UO->getOpcode() == UO_Deref)
2592 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
2594 if (BO->isPtrMemOp())
2598 if (BO->getOpcode() == BO_Comma)
2599 return BO->getRHS()->isReadIfDiscardedInCPlusPlus11();
2604 if (
auto *CO = dyn_cast<ConditionalOperator>(E))
2605 return CO->getTrueExpr()->isReadIfDiscardedInCPlusPlus11() &&
2606 CO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2609 dyn_cast<BinaryConditionalOperator>(E)) {
2610 if (
auto *OVE = dyn_cast<OpaqueValueExpr>(BCO->getTrueExpr()))
2611 return OVE->getSourceExpr()->isReadIfDiscardedInCPlusPlus11() &&
2612 BCO->getFalseExpr()->isReadIfDiscardedInCPlusPlus11();
2618 if (
const auto *POE = dyn_cast<PseudoObjectExpr>(E)) {
2646 case ParenExprClass:
2649 case GenericSelectionExprClass:
2652 case CoawaitExprClass:
2653 case CoyieldExprClass:
2656 case ChooseExprClass:
2659 case UnaryOperatorClass: {
2693 case BinaryOperatorClass: {
2705 if (IE->getValue() == 0)
2724 case CompoundAssignOperatorClass:
2725 case VAArgExprClass:
2726 case AtomicExprClass:
2729 case ConditionalOperatorClass: {
2734 return Exp->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx) &&
2735 Exp->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2737 case BinaryConditionalOperatorClass: {
2739 return Exp->getFalseExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2742 case MemberExprClass:
2749 case ArraySubscriptExprClass:
2756 case CXXOperatorCallExprClass: {
2768 case OO_ExclaimEqual:
2771 case OO_GreaterEqual:
2786 case CXXMemberCallExprClass:
2787 case UserDefinedLiteralClass: {
2811 case UnresolvedLookupExprClass:
2812 case CXXUnresolvedConstructExprClass:
2813 case RecoveryExprClass:
2816 case CXXTemporaryObjectExprClass:
2817 case CXXConstructExprClass: {
2822 CE->hasUnusedResultAttr(Ctx)) {
2827 if (
unsigned NumArgs = CE->getNumArgs())
2829 CE->getArg(NumArgs - 1)->getEndLoc());
2835 case ObjCMessageExprClass: {
2856 case ObjCPropertyRefExprClass:
2857 case ObjCSubscriptRefExprClass:
2863 case PseudoObjectExprClass: {
2868 POE->getSyntacticForm())) {
2876 if (
auto *BO = dyn_cast<BinaryOperator>(POE->getSyntacticForm()))
2877 if (BO->isAssignmentOp())
2879 if (
auto *UO = dyn_cast<UnaryOperator>(POE->getSyntacticForm()))
2880 if (UO->isIncrementDecrementOp())
2885 return Result &&
Result->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2888 case StmtExprClass: {
2899 if (
const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
2910 case CXXFunctionalCastExprClass:
2911 case CStyleCastExprClass: {
2925 if (
auto *DRE = dyn_cast<DeclRefExpr>(SubE))
2926 if (
auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2927 if (!VD->isExternallyVisible())
2943 if (CE->
getCastKind() == CK_ConstructorConversion)
2950 dyn_cast<CXXFunctionalCastExpr>(
this)) {
2951 Loc = CXXCE->getBeginLoc();
2952 R1 = CXXCE->getSubExpr()->getSourceRange();
2960 case ImplicitCastExprClass: {
2970 case CXXDefaultArgExprClass:
2973 case CXXDefaultInitExprClass:
2977 case CXXNewExprClass:
2980 case CXXDeleteExprClass:
2982 case MaterializeTemporaryExprClass:
2985 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2986 case CXXBindTemporaryExprClass:
2988 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2989 case ExprWithCleanupsClass:
2991 ->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
2992 case OpaqueValueExprClass:
2994 WarnE, Loc, R1, R2, Ctx);
3005 case ObjCIvarRefExprClass:
3007 case Expr::UnaryOperatorClass:
3009 case ImplicitCastExprClass:
3011 case MaterializeTemporaryExprClass:
3014 case CStyleCastExprClass:
3016 case DeclRefExprClass: {
3019 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3020 if (VD->hasGlobalStorage())
3025 return T->isPointerType() &&
3030 case MemberExprClass: {
3034 case ArraySubscriptExprClass:
3046 assert(
expr->hasPlaceholderType(BuiltinType::BoundMember));
3055 return mem->getMemberDecl()->getType();
3061 assert(
type->isFunctionType());
3099 if (
auto *MCE = dyn_cast<CXXMemberCallExpr>(
this)) {
3100 if (isa_and_nonnull<CXXConversionDecl>(MCE->getMethodDecl()))
3101 return MCE->getImplicitObjectArgument();
3117 auto IgnoreNoopCastsSingleStep = [&Ctx](
Expr *E) {
3118 if (
auto *CE = dyn_cast<CastExpr>(E)) {
3121 Expr *SubExpr = CE->getSubExpr();
3122 bool IsIdentityCast =
3124 bool IsSameWidthCast = (E->
getType()->isPointerType() ||
3126 (SubExpr->
getType()->isPointerType() ||
3131 if (IsIdentityCast || IsSameWidthCast)
3133 }
else if (
auto *NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E))
3134 return NTTP->getReplacement();
3139 IgnoreNoopCastsSingleStep);
3144 if (
auto *Cast = dyn_cast<CXXFunctionalCastExpr>(E)) {
3145 auto *SE = Cast->getSubExpr();
3150 if (
auto *
C = dyn_cast<CXXConstructExpr>(E)) {
3151 auto NumArgs =
C->getNumArgs();
3154 Expr *A =
C->getArg(0);
3161 auto IgnoreImplicitMemberCallSingleStep = [](
Expr *E) {
3162 if (
auto *
C = dyn_cast<CXXMemberCallExpr>(E)) {
3163 Expr *ExprNode =
C->getImplicitObjectArgument();
3167 if (
auto *PE = dyn_cast<ParenExpr>(ExprNode)) {
3168 if (PE->getSourceRange() ==
C->getSourceRange()) {
3181 auto IgnoreImplicitCallSingleStep = [](
Expr *E) {
3182 auto *
C = dyn_cast<CallExpr>(E);
3189 unsigned NumArgs =
C->getNumArgs();
3193 Expr *A =
C->getArg(0);
3210 IgnoreImplicitMemberCallSingleStep, IgnoreImplicitCallSingleStep);
3214 const Expr *E =
this;
3216 E = M->getSubExpr();
3219 E = ICE->getSubExprAsWritten();
3228 E = M->getSubExpr();
3231 if (ICE->getCastKind() == CK_NoOp)
3232 E = ICE->getSubExpr();
3238 E = BE->getSubExpr();
3241 if (ICE->getCastKind() == CK_NoOp)
3242 E = ICE->getSubExpr();
3253 if (!
C.hasSameUnqualifiedType(
getType(),
C.getCanonicalTagType(TempTy)))
3269 if (
const auto *ICE = dyn_cast<ImplicitCastExpr>(E)) {
3270 switch (ICE->getCastKind()) {
3271 case CK_DerivedToBase:
3272 case CK_UncheckedDerivedToBase:
3283 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
3284 if (BO->isPtrMemOp())
3295 const Expr *E =
this;
3300 E =
Paren->getSubExpr();
3305 if (ICE->getCastKind() == CK_NoOp ||
3306 ICE->getCastKind() == CK_LValueToRValue ||
3307 ICE->getCastKind() == CK_DerivedToBase ||
3308 ICE->getCastKind() == CK_UncheckedDerivedToBase) {
3309 E = ICE->getSubExpr();
3314 if (
const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) {
3315 if (UnOp->getOpcode() == UO_Extension) {
3316 E = UnOp->getSubExpr();
3322 = dyn_cast<MaterializeTemporaryExpr>(E)) {
3323 E = M->getSubExpr();
3331 return This->isImplicit();
3339 for (
unsigned I = 0; I < Exprs.size(); ++I)
3347 const Expr **Culprit)
const {
3349 "Expression evaluator can't be called on a dependent expression.");
3361 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
this))
3362 return EWC->getSubExpr()->isConstantInitializer(Ctx,
true, Culprit);
3363 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
this))
3364 return MTE->getSubExpr()->isConstantInitializer(Ctx,
false, Culprit);
3375 case Stmt::ExprWithCleanupsClass:
3377 Ctx, IsForRef, Culprit);
3378 case StringLiteralClass:
3379 case ObjCEncodeExprClass:
3381 case CXXTemporaryObjectExprClass:
3382 case CXXConstructExprClass: {
3391 assert(CE->
getNumArgs() == 1 &&
"trivial ctor with > 1 argument");
3397 case ConstantExprClass: {
3403 case CompoundLiteralExprClass: {
3410 case DesignatedInitUpdateExprClass: {
3415 case InitListExprClass: {
3423 assert(ILE->
isSemanticForm() &&
"InitListExpr must be in semantic form");
3430 for (
unsigned i = 0; i < numInits; i++) {
3438 unsigned ElementNo = 0;
3443 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3444 for (
unsigned i = 0, e = CXXRD->getNumBases(); i < e; i++) {
3445 if (ElementNo < ILE->getNumInits()) {
3453 for (
const auto *Field : RD->fields()) {
3459 if (Field->isUnnamedBitField())
3462 if (ElementNo < ILE->getNumInits()) {
3464 if (Field->isBitField()) {
3473 bool RefType = Field->getType()->isReferenceType();
3484 case ImplicitValueInitExprClass:
3485 case NoInitExprClass:
3487 case ParenExprClass:
3489 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3490 case GenericSelectionExprClass:
3492 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3493 case ChooseExprClass:
3500 ->isConstantInitializer(Ctx, IsForRef, Culprit);
3501 case UnaryOperatorClass: {
3507 case PackIndexingExprClass: {
3510 ->isConstantInitializer(Ctx,
false, Culprit);
3512 case CXXFunctionalCastExprClass:
3513 case CXXStaticCastExprClass:
3514 case ImplicitCastExprClass:
3515 case CStyleCastExprClass:
3516 case ObjCBridgedCastExprClass:
3517 case CXXDynamicCastExprClass:
3518 case CXXReinterpretCastExprClass:
3519 case CXXAddrspaceCastExprClass:
3520 case CXXConstCastExprClass: {
3536 case MaterializeTemporaryExprClass:
3539 ->isConstantInitializer(Ctx,
false, Culprit);
3541 case SubstNonTypeTemplateParmExprClass:
3543 ->isConstantInitializer(Ctx,
false, Culprit);
3544 case CXXDefaultArgExprClass:
3546 ->isConstantInitializer(Ctx,
false, Culprit);
3547 case CXXDefaultInitExprClass:
3549 ->isConstantInitializer(Ctx,
false, Culprit);
3563 if (BuiltinID != Builtin::BI__assume &&
3564 BuiltinID != Builtin::BI__builtin_assume)
3575 return DirectCallee->getAttr<AllocSizeAttr>();
3577 return IndirectCallee->getAttr<AllocSizeAttr>();
3581std::optional<llvm::APInt>
3585 assert(AllocSize && AllocSize->getElemSizeParam().isValid());
3586 unsigned SizeArgNo = AllocSize->getElemSizeParam().getASTIndex();
3589 return std::nullopt;
3591 auto EvaluateAsSizeT = [&](
const Expr *E, llvm::APSInt &Into) {
3597 if (Into.isNegative() || !Into.isIntN(BitsInSizeT))
3599 Into = Into.zext(BitsInSizeT);
3603 llvm::APSInt SizeOfElem;
3604 if (!EvaluateAsSizeT(
getArg(SizeArgNo), SizeOfElem))
3605 return std::nullopt;
3607 if (!AllocSize->getNumElemsParam().isValid())
3610 llvm::APSInt NumberOfElems;
3611 unsigned NumArgNo = AllocSize->getNumElemsParam().getASTIndex();
3612 if (!EvaluateAsSizeT(
getArg(NumArgNo), NumberOfElems))
3613 return std::nullopt;
3616 llvm::APInt BytesAvailable = SizeOfElem.umul_ov(NumberOfElems, Overflow);
3618 return std::nullopt;
3620 return BytesAvailable;
3631 const bool IncludePossibleEffects;
3632 bool HasSideEffects;
3635 explicit SideEffectFinder(
const ASTContext &Context,
bool IncludePossible)
3636 : Inherited(Context),
3637 IncludePossibleEffects(IncludePossible), HasSideEffects(
false) { }
3639 bool hasSideEffects()
const {
return HasSideEffects; }
3641 void VisitDecl(
const Decl *D) {
3647 if (
auto *VD = dyn_cast<VarDecl>(D)) {
3649 if (IncludePossibleEffects && VD->isThisDeclarationADefinition() &&
3650 VD->needsDestruction(Context))
3651 HasSideEffects =
true;
3655 void VisitDeclStmt(
const DeclStmt *DS) {
3656 for (
auto *D : DS->
decls())
3658 Inherited::VisitDeclStmt(DS);
3661 void VisitExpr(
const Expr *E) {
3662 if (!HasSideEffects &&
3664 HasSideEffects =
true;
3670 bool IncludePossibleEffects)
const {
3674 if (!IncludePossibleEffects &&
getExprLoc().isMacroID())
3679#define ABSTRACT_STMT(Type)
3680#define STMT(Type, Base) case Type##Class:
3681#define EXPR(Type, Base)
3682#include "clang/AST/StmtNodes.inc"
3683 llvm_unreachable(
"unexpected Expr kind");
3685 case DependentScopeDeclRefExprClass:
3686 case CXXUnresolvedConstructExprClass:
3687 case CXXDependentScopeMemberExprClass:
3688 case UnresolvedLookupExprClass:
3689 case UnresolvedMemberExprClass:
3690 case PackExpansionExprClass:
3691 case SubstNonTypeTemplateParmPackExprClass:
3692 case FunctionParmPackExprClass:
3693 case RecoveryExprClass:
3694 case CXXFoldExprClass:
3696 return IncludePossibleEffects;
3698 case DeclRefExprClass:
3699 case ObjCIvarRefExprClass:
3700 case PredefinedExprClass:
3701 case IntegerLiteralClass:
3702 case FixedPointLiteralClass:
3703 case FloatingLiteralClass:
3704 case ImaginaryLiteralClass:
3705 case StringLiteralClass:
3706 case CharacterLiteralClass:
3707 case OffsetOfExprClass:
3708 case ImplicitValueInitExprClass:
3709 case UnaryExprOrTypeTraitExprClass:
3710 case AddrLabelExprClass:
3711 case GNUNullExprClass:
3712 case ArrayInitIndexExprClass:
3713 case NoInitExprClass:
3714 case CXXBoolLiteralExprClass:
3715 case CXXNullPtrLiteralExprClass:
3716 case CXXThisExprClass:
3717 case CXXScalarValueInitExprClass:
3718 case TypeTraitExprClass:
3719 case ArrayTypeTraitExprClass:
3720 case ExpressionTraitExprClass:
3721 case CXXNoexceptExprClass:
3722 case SizeOfPackExprClass:
3723 case ObjCStringLiteralClass:
3724 case ObjCEncodeExprClass:
3725 case ObjCBoolLiteralExprClass:
3726 case ObjCAvailabilityCheckExprClass:
3727 case CXXUuidofExprClass:
3728 case OpaqueValueExprClass:
3729 case SourceLocExprClass:
3730 case EmbedExprClass:
3731 case ConceptSpecializationExprClass:
3732 case RequiresExprClass:
3733 case SYCLUniqueStableNameExprClass:
3734 case PackIndexingExprClass:
3735 case HLSLOutArgExprClass:
3736 case OpenACCAsteriskSizeExprClass:
3740 case ConstantExprClass:
3743 Ctx, IncludePossibleEffects);
3746 case CXXOperatorCallExprClass:
3747 case CXXMemberCallExprClass:
3748 case CUDAKernelCallExprClass:
3749 case UserDefinedLiteralClass: {
3754 bool IsPure = FD && (FD->
hasAttr<ConstAttr>() || FD->
hasAttr<PureAttr>());
3755 if (IsPure || !IncludePossibleEffects)
3760 case BlockExprClass:
3761 case CXXBindTemporaryExprClass:
3762 if (!IncludePossibleEffects)
3766 case MSPropertyRefExprClass:
3767 case MSPropertySubscriptExprClass:
3768 case CompoundAssignOperatorClass:
3769 case VAArgExprClass:
3770 case AtomicExprClass:
3771 case CXXThrowExprClass:
3772 case CXXNewExprClass:
3773 case CXXDeleteExprClass:
3774 case CoawaitExprClass:
3775 case DependentCoawaitExprClass:
3776 case CoyieldExprClass:
3780 case StmtExprClass: {
3782 SideEffectFinder Finder(Ctx, IncludePossibleEffects);
3784 return Finder.hasSideEffects();
3787 case ExprWithCleanupsClass:
3788 if (IncludePossibleEffects)
3793 case ParenExprClass:
3794 case ArraySubscriptExprClass:
3795 case MatrixSingleSubscriptExprClass:
3796 case MatrixSubscriptExprClass:
3797 case ArraySectionExprClass:
3798 case OMPArrayShapingExprClass:
3799 case OMPIteratorExprClass:
3800 case MemberExprClass:
3801 case ConditionalOperatorClass:
3802 case BinaryConditionalOperatorClass:
3803 case CompoundLiteralExprClass:
3804 case ExtVectorElementExprClass:
3805 case DesignatedInitExprClass:
3806 case DesignatedInitUpdateExprClass:
3807 case ArrayInitLoopExprClass:
3808 case ParenListExprClass:
3809 case CXXPseudoDestructorExprClass:
3810 case CXXRewrittenBinaryOperatorClass:
3811 case CXXStdInitializerListExprClass:
3812 case SubstNonTypeTemplateParmExprClass:
3813 case MaterializeTemporaryExprClass:
3814 case ShuffleVectorExprClass:
3815 case ConvertVectorExprClass:
3816 case AsTypeExprClass:
3817 case CXXParenListInitExprClass:
3821 case UnaryOperatorClass:
3826 case BinaryOperatorClass:
3831 case InitListExprClass:
3838 case GenericSelectionExprClass:
3840 Ctx, IncludePossibleEffects);
3842 case ChooseExprClass:
3844 Ctx, IncludePossibleEffects);
3846 case CXXDefaultArgExprClass:
3848 Ctx, IncludePossibleEffects);
3850 case CXXDefaultInitExprClass: {
3858 case CXXDynamicCastExprClass: {
3866 case ImplicitCastExprClass:
3867 case CStyleCastExprClass:
3868 case CXXStaticCastExprClass:
3869 case CXXReinterpretCastExprClass:
3870 case CXXConstCastExprClass:
3871 case CXXAddrspaceCastExprClass:
3872 case CXXFunctionalCastExprClass:
3873 case BuiltinBitCastExprClass: {
3878 if (!IncludePossibleEffects)
3888 case CXXTypeidExprClass: {
3890 if (!TE->isPotentiallyEvaluated())
3895 if (IncludePossibleEffects && TE->hasNullCheck())
3901 case CXXConstructExprClass:
3902 case CXXTemporaryObjectExprClass: {
3911 case CXXInheritedCtorInitExprClass: {
3913 if (!ICIE->getConstructor()->isTrivial() && IncludePossibleEffects)
3918 case LambdaExprClass: {
3920 for (
Expr *E : LE->capture_inits())
3926 case PseudoObjectExprClass: {
3933 const Expr *Subexpr = *I;
3935 Subexpr = OVE->getSourceExpr();
3942 case ObjCBoxedExprClass:
3943 case ObjCArrayLiteralClass:
3944 case ObjCDictionaryLiteralClass:
3945 case ObjCSelectorExprClass:
3946 case ObjCProtocolExprClass:
3947 case ObjCIsaExprClass:
3948 case ObjCIndirectCopyRestoreExprClass:
3949 case ObjCSubscriptRefExprClass:
3950 case ObjCBridgedCastExprClass:
3951 case ObjCMessageExprClass:
3952 case ObjCPropertyRefExprClass:
3954 if (IncludePossibleEffects)
3969 if (
auto Call = dyn_cast<CallExpr>(
this))
3970 return Call->getFPFeaturesInEffect(LO);
3971 if (
auto UO = dyn_cast<UnaryOperator>(
this))
3972 return UO->getFPFeaturesInEffect(LO);
3973 if (
auto BO = dyn_cast<BinaryOperator>(
this))
3974 return BO->getFPFeaturesInEffect(LO);
3975 if (
auto Cast = dyn_cast<CastExpr>(
this))
3976 return Cast->getFPFeaturesInEffect(LO);
3977 if (
auto ConvertVector = dyn_cast<ConvertVectorExpr>(
this))
3978 return ConvertVector->getFPFeaturesInEffect(LO);
3991 explicit NonTrivialCallFinder(
const ASTContext &Context)
3992 : Inherited(Context), NonTrivial(
false) { }
3994 bool hasNonTrivialCall()
const {
return NonTrivial; }
3996 void VisitCallExpr(
const CallExpr *E) {
3997 if (
const CXXMethodDecl *
Method
3998 = dyn_cast_or_null<const CXXMethodDecl>(E->
getCalleeDecl())) {
3999 if (
Method->isTrivial()) {
4001 Inherited::VisitStmt(E);
4009 void VisitCXXConstructExpr(
const CXXConstructExpr *E) {
4012 Inherited::VisitStmt(E);
4019 void VisitCXXBindTemporaryExpr(
const CXXBindTemporaryExpr *E) {
4022 if (
const CXXDestructorDecl *DtorDecl =
4024 if (DtorDecl->isTrivial()) {
4025 Inherited::VisitStmt(E);
4036 NonTrivialCallFinder Finder(Ctx);
4038 return Finder.hasNonTrivialCall();
4056 llvm_unreachable(
"Unexpected value dependent expression!");
4084 CE->getSubExpr()->getType()->isIntegerType())
4085 return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4088 }
else if (
const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(
this)) {
4090 return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4091 }
else if (
const ParenExpr *PE = dyn_cast<ParenExpr>(
this)) {
4094 return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4096 dyn_cast<GenericSelectionExpr>(
this)) {
4097 if (GE->isResultDependent())
4099 return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC);
4100 }
else if (
const ChooseExpr *CE = dyn_cast<ChooseExpr>(
this)) {
4101 if (CE->isConditionDependent())
4103 return CE->getChosenSubExpr()->isNullPointerConstant(Ctx, NPC);
4105 = dyn_cast<CXXDefaultArgExpr>(
this)) {
4107 return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
4109 = dyn_cast<CXXDefaultInitExpr>(
this)) {
4111 return DefaultInit->getExpr()->isNullPointerConstant(Ctx, NPC);
4116 = dyn_cast<MaterializeTemporaryExpr>(
this)) {
4117 return M->getSubExpr()->isNullPointerConstant(Ctx, NPC);
4118 }
else if (
const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(
this)) {
4119 if (
const Expr *Source = OVE->getSourceExpr())
4120 return Source->isNullPointerConstant(Ctx, NPC);
4129 if (
getType()->isNullPtrType())
4132 if (
const RecordType *UT =
getType()->getAsUnionType())
4134 UT->getDecl()->getMostRecentDecl()->hasAttr<TransparentUnionAttr>())
4136 const Expr *InitExpr = CLE->getInitializer();
4137 if (
const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
4138 return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
4141 if (!
getType()->isIntegerType() ||
4172 const Expr *E =
this;
4175 "expression is not a property reference");
4178 if (BO->getOpcode() == BO_Comma) {
4193 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
4201 const ObjCMethodDecl *M = dyn_cast<ObjCMethodDecl>(Param->getDeclContext());
4212 if (ICE->getCastKind() == CK_LValueToRValue ||
4213 (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp))
4219 if (
MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
4220 if (
FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
4221 if (Field->isBitField())
4230 if (
DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E)) {
4231 if (
FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
4232 if (Field->isBitField())
4235 if (
BindingDecl *BD = dyn_cast<BindingDecl>(DeclRef->getDecl()))
4236 if (
Expr *E = BD->getBinding())
4241 if (BinOp->isAssignmentOp() && BinOp->getLHS())
4242 return BinOp->getLHS()->getSourceBitField();
4244 if (BinOp->getOpcode() == BO_Comma && BinOp->getRHS())
4245 return BinOp->getRHS()->getSourceBitField();
4249 if (UnOp->isPrefix() && UnOp->isIncrementDecrementOp())
4250 return UnOp->getSubExpr()->getSourceBitField();
4257 if (
auto *DRE = dyn_cast<DeclRefExpr>(E))
4258 return dyn_cast<EnumConstantDecl>(DRE->getDecl());
4267 if (ICE->isGLValue() && ICE->getCastKind() == CK_NoOp)
4274 return ASE->getBase()->getType()->isVectorType();
4279 if (
auto *DRE = dyn_cast<DeclRefExpr>(E))
4280 if (
auto *BD = dyn_cast<BindingDecl>(DRE->getDecl()))
4281 if (
auto *E = BD->getBinding())
4290 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
4291 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
4293 VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
4309 case CXXThisExprClass:
4311 case DeclRefExprClass: {
4317 if (DRE1->getDecl() != DRE2->getDecl())
4320 if ((DRE1->isPRValue() && DRE2->isPRValue()) ||
4321 (DRE1->isLValue() && DRE2->isLValue()))
4326 case ImplicitCastExprClass: {
4329 const auto *ICE1 = dyn_cast<ImplicitCastExpr>(E1);
4330 const auto *ICE2 = dyn_cast<ImplicitCastExpr>(E2);
4333 if (ICE1->getCastKind() != ICE2->getCastKind())
4335 ICE2->IgnoreParenImpCasts());
4339 if (ICE1->getCastKind() == CK_LValueToRValue ||
4340 ICE1->getCastKind() == CK_ArrayToPointerDecay ||
4341 ICE1->getCastKind() == CK_FunctionToPointerDecay) {
4346 const auto *DRE1 = dyn_cast<DeclRefExpr>(E1);
4347 const auto *DRE2 = dyn_cast<DeclRefExpr>(E2);
4351 const auto *Ivar1 = dyn_cast<ObjCIvarRefExpr>(E1);
4352 const auto *Ivar2 = dyn_cast<ObjCIvarRefExpr>(E2);
4353 if (Ivar1 && Ivar2) {
4354 return Ivar1->isFreeIvar() && Ivar2->isFreeIvar() &&
4358 const auto *Array1 = dyn_cast<ArraySubscriptExpr>(E1);
4359 const auto *Array2 = dyn_cast<ArraySubscriptExpr>(E2);
4360 if (Array1 && Array2) {
4364 auto Idx1 = Array1->getIdx();
4365 auto Idx2 = Array2->getIdx();
4366 const auto Integer1 = dyn_cast<IntegerLiteral>(Idx1);
4367 const auto Integer2 = dyn_cast<IntegerLiteral>(Idx2);
4368 if (Integer1 && Integer2) {
4369 if (!llvm::APInt::isSameValue(Integer1->getValue(),
4370 Integer2->getValue()))
4386 if (
const auto *D = dyn_cast<VarDecl>(ME1->getMemberDecl()))
4387 if (D->isStaticDataMember())
4399 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E))
4400 return DRE->getDecl();
4401 if (
const auto *ME = dyn_cast<MemberExpr>(E))
4402 return ME->getMemberDecl();
4421 return VT->getNumElements();
4429 StringRef Comp = Accessor->getName();
4432 if (Comp ==
"hi" || Comp ==
"lo" || Comp ==
"even" || Comp ==
"odd")
4436 if (Comp[0] ==
's' || Comp[0] ==
'S')
4437 Comp = Comp.substr(1);
4439 for (
unsigned i = 0, e = Comp.size(); i != e; ++i)
4440 if (Comp.substr(i + 1).contains(Comp[i]))
4449 StringRef Comp = Accessor->getName();
4450 bool isNumericAccessor =
false;
4451 if (Comp[0] ==
's' || Comp[0] ==
'S') {
4452 Comp = Comp.substr(1);
4453 isNumericAccessor =
true;
4456 bool isHi = Comp ==
"hi";
4457 bool isLo = Comp ==
"lo";
4458 bool isEven = Comp ==
"even";
4459 bool isOdd = Comp ==
"odd";
4475 Elts.push_back(Index);
4483 BuiltinLoc(BLoc), RParenLoc(RP) {
4485 SubExprs =
new (
C)
Stmt*[args.size()];
4486 for (
unsigned i = 0; i != args.size(); i++)
4487 SubExprs[i] = args[i];
4493 if (SubExprs)
C.Deallocate(SubExprs);
4497 llvm::copy(Exprs, SubExprs);
4500GenericSelectionExpr::GenericSelectionExpr(
4504 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex)
4505 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->
getType(),
4506 AssocExprs[ResultIndex]->getValueKind(),
4507 AssocExprs[ResultIndex]->getObjectKind()),
4508 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4509 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4510 assert(AssocTypes.size() == AssocExprs.size() &&
4511 "Must have the same number of association expressions"
4512 " and TypeSourceInfo!");
4513 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4516 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4518 llvm::copy(AssocExprs,
4519 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4520 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4521 getIndexOfStartOfAssociatedTypes());
4526GenericSelectionExpr::GenericSelectionExpr(
4531 unsigned ResultIndex)
4532 :
Expr(GenericSelectionExprClass, AssocExprs[ResultIndex]->
getType(),
4533 AssocExprs[ResultIndex]->getValueKind(),
4534 AssocExprs[ResultIndex]->getObjectKind()),
4535 NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex),
4536 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4537 assert(AssocTypes.size() == AssocExprs.size() &&
4538 "Must have the same number of association expressions"
4539 " and TypeSourceInfo!");
4540 assert(ResultIndex < NumAssocs &&
"ResultIndex is out-of-bounds!");
4543 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4545 llvm::copy(AssocExprs,
4546 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4547 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4548 getIndexOfStartOfAssociatedTypes());
4553GenericSelectionExpr::GenericSelectionExpr(
4557 bool ContainsUnexpandedParameterPack)
4558 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4560 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4561 IsExprPredicate(
true), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4562 assert(AssocTypes.size() == AssocExprs.size() &&
4563 "Must have the same number of association expressions"
4564 " and TypeSourceInfo!");
4567 getTrailingObjects<Stmt *>()[getIndexOfControllingExpression()] =
4569 llvm::copy(AssocExprs,
4570 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4571 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4572 getIndexOfStartOfAssociatedTypes());
4577GenericSelectionExpr::GenericSelectionExpr(
4582 :
Expr(GenericSelectionExprClass, Context.DependentTy,
VK_PRValue,
4584 NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex),
4585 IsExprPredicate(
false), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) {
4586 assert(AssocTypes.size() == AssocExprs.size() &&
4587 "Must have the same number of association expressions"
4588 " and TypeSourceInfo!");
4591 getTrailingObjects<TypeSourceInfo *>()[getIndexOfControllingType()] =
4593 llvm::copy(AssocExprs,
4594 getTrailingObjects<Stmt *>() + getIndexOfStartOfAssociatedExprs());
4595 llvm::copy(AssocTypes, getTrailingObjects<TypeSourceInfo *>() +
4596 getIndexOfStartOfAssociatedTypes());
4601GenericSelectionExpr::GenericSelectionExpr(EmptyShell
Empty,
unsigned NumAssocs)
4602 :
Expr(GenericSelectionExprClass,
Empty), NumAssocs(NumAssocs) {}
4608 bool ContainsUnexpandedParameterPack,
unsigned ResultIndex) {
4609 unsigned NumAssocs = AssocExprs.size();
4610 void *Mem = Context.Allocate(
4611 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4612 alignof(GenericSelectionExpr));
4613 return new (Mem) GenericSelectionExpr(
4614 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4615 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4622 bool ContainsUnexpandedParameterPack) {
4623 unsigned NumAssocs = AssocExprs.size();
4624 void *Mem = Context.Allocate(
4625 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4626 alignof(GenericSelectionExpr));
4627 return new (Mem) GenericSelectionExpr(
4628 Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc,
4629 RParenLoc, ContainsUnexpandedParameterPack);
4637 unsigned ResultIndex) {
4638 unsigned NumAssocs = AssocExprs.size();
4639 void *Mem = Context.Allocate(
4640 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4641 alignof(GenericSelectionExpr));
4642 return new (Mem) GenericSelectionExpr(
4643 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4644 RParenLoc, ContainsUnexpandedParameterPack, ResultIndex);
4651 SourceLocation RParenLoc,
bool ContainsUnexpandedParameterPack) {
4652 unsigned NumAssocs = AssocExprs.size();
4653 void *Mem = Context.Allocate(
4654 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4655 alignof(GenericSelectionExpr));
4656 return new (Mem) GenericSelectionExpr(
4657 Context, GenericLoc, ControllingType, AssocTypes, AssocExprs, DefaultLoc,
4658 RParenLoc, ContainsUnexpandedParameterPack);
4663 unsigned NumAssocs) {
4664 void *Mem = Context.Allocate(
4665 totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs),
4666 alignof(GenericSelectionExpr));
4667 return new (Mem) GenericSelectionExpr(
EmptyShell(), NumAssocs);
4688 EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
4689 NumDesignators(Designators.
size()), NumSubExprs(IndexExprs.
size() + 1) {
4690 this->Designators =
new (
C)
Designator[NumDesignators];
4698 unsigned IndexIdx = 0;
4699 for (
unsigned I = 0; I != NumDesignators; ++I) {
4700 this->Designators[I] = Designators[I];
4703 *Child++ = IndexExprs[IndexIdx++];
4706 *Child++ = IndexExprs[IndexIdx++];
4707 *Child++ = IndexExprs[IndexIdx++];
4711 assert(IndexIdx == IndexExprs.size() &&
"Wrong number of index expressions");
4719 bool UsesColonSyntax,
4721 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(IndexExprs.size() + 1),
4722 alignof(DesignatedInitExpr));
4723 return new (Mem) DesignatedInitExpr(
C,
C.VoidTy, Designators,
4724 ColonOrEqualLoc, UsesColonSyntax,
4729 unsigned NumIndexExprs) {
4730 void *Mem =
C.Allocate(totalSizeToAlloc<Stmt *>(NumIndexExprs + 1),
4731 alignof(DesignatedInitExpr));
4732 return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
4737 unsigned NumDesigs) {
4739 NumDesignators = NumDesigs;
4740 for (
unsigned I = 0; I != NumDesigs; ++I)
4741 Designators[I] = Desigs[I];
4745 DesignatedInitExpr *DIE =
const_cast<DesignatedInitExpr*
>(
this);
4753 auto *DIE =
const_cast<DesignatedInitExpr *
>(
this);
4755 if (
First.isFieldDesignator()) {
4758 for (
unsigned int i = 0; i < DIE->size(); i++) {
4766 return First.getLBracketLoc();
4793 unsigned NumNewDesignators =
Last -
First;
4794 if (NumNewDesignators == 0) {
4795 std::copy_backward(Designators + Idx + 1,
4796 Designators + NumDesignators,
4798 --NumNewDesignators;
4801 if (NumNewDesignators == 1) {
4802 Designators[Idx] = *
First;
4807 =
new (
C)
Designator[NumDesignators - 1 + NumNewDesignators];
4808 std::copy(Designators, Designators + Idx, NewDesignators);
4809 std::copy(
First,
Last, NewDesignators + Idx);
4810 std::copy(Designators + Idx + 1, Designators + NumDesignators,
4811 NewDesignators + Idx + NumNewDesignators);
4812 Designators = NewDesignators;
4813 NumDesignators = NumDesignators - 1 + NumNewDesignators;
4822 BaseAndUpdaterExprs[0] = baseExpr;
4826 BaseAndUpdaterExprs[1] = ILE;
4843 LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
4845 llvm::copy(Exprs, getTrailingObjects());
4849ParenListExpr::ParenListExpr(EmptyShell
Empty,
unsigned NumExprs)
4858 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Stmt *>(Exprs.size()),
4859 alignof(ParenListExpr));
4860 return new (Mem) ParenListExpr(LParenLoc, Exprs, RParenLoc);
4864 unsigned NumExprs) {
4866 Ctx.
Allocate(totalSizeToAlloc<Stmt *>(NumExprs),
alignof(ParenListExpr));
4867 return new (Mem) ParenListExpr(
EmptyShell(), NumExprs);
4874static std::optional<BinaryOperator *>
4879 ComparedTo = E->
getRHS();
4882 ComparedTo = E->
getLHS();
4887 const Expr *AddLHS =
nullptr, *AddRHS =
nullptr;
4890 if (BO && BO->
getOpcode() == clang::BO_Add) {
4896 if (!AddLHS || !AddRHS)
4899 const Decl *LHSDecl, *RHSDecl, *OtherDecl;
4902 RHSDecl = AddRHS->IgnoreParenImpCasts()->getReferencedDeclOfCallee();
4908 if (!LHSDecl && !RHSDecl)
4911 if ((LHSDecl && LHSDecl == OtherDecl && LHSDecl != RHSDecl) ||
4912 (RHSDecl && RHSDecl == OtherDecl && RHSDecl != LHSDecl))
4924 if (!Result.has_value())
4926 QualType AdditionResultType = Result.value()->getType();
4934 Result.value()->setExcludedOverflowPattern(
true);
4941 :
Expr(BinaryOperatorClass, ResTy,
VK, OK) {
4944 "Use CompoundAssignOperator for compound assignments");
4947 SubExprs[LHS] = lhs;
4948 SubExprs[RHS] = rhs;
4960 :
Expr(CompoundAssignOperatorClass, ResTy,
VK, OK) {
4964 "Use CompoundAssignOperator for compound assignments");
4966 SubExprs[LHS] = lhs;
4967 SubExprs[RHS] = rhs;
4975 bool HasFPFeatures) {
4998 void *Mem =
C.Allocate(
sizeof(CompoundAssignOperator) +
Extra,
4999 alignof(CompoundAssignOperator));
5000 return new (Mem) CompoundAssignOperator(
C,
EmptyShell(), HasFPFeatures);
5011 void *Mem =
C.Allocate(
sizeof(CompoundAssignOperator) +
Extra,
5012 alignof(CompoundAssignOperator));
5014 CompoundAssignOperator(
C, lhs, rhs, opc, ResTy,
VK, OK, opLoc, FPFeatures,
5015 CompLHSType, CompResultType);
5019 bool hasFPFeatures) {
5020 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
5029 :
Expr(UnaryOperatorClass,
type,
VK, OK), Val(input) {
5045 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
5053 e = ewc->getSubExpr();
5055 e = m->getSubExpr();
5058 e = ice->getSubExpr();
5064 unsigned numSemanticExprs) {
5066 Context.Allocate(totalSizeToAlloc<Expr *>(1 + numSemanticExprs),
5067 alignof(PseudoObjectExpr));
5068 return new(buffer) PseudoObjectExpr(sh, numSemanticExprs);
5071PseudoObjectExpr::PseudoObjectExpr(EmptyShell shell,
unsigned numSemanticExprs)
5072 :
Expr(PseudoObjectExprClass, shell) {
5078 unsigned resultIndex) {
5079 assert(
syntax &&
"no syntactic expression!");
5080 assert(
semantics.size() &&
"no semantic expressions!");
5094 void *buffer =
C.Allocate(totalSizeToAlloc<Expr *>(
semantics.size() + 1),
5095 alignof(PseudoObjectExpr));
5102 unsigned resultIndex)
5115 "opaque-value semantic expressions for pseudo-object "
5116 "operations must have sources");
5118 llvm::copy(
semantics, Trail.drop_front().begin());
5149 NumSubExprs(args.size()), BuiltinLoc(BLoc), RParenLoc(RP), Op(op) {
5150 assert(args.size() ==
getNumSubExprs(op) &&
"wrong number of subexpressions");
5151 for (
unsigned i = 0; i != args.size(); i++)
5152 SubExprs[i] = args[i];
5158 case AO__c11_atomic_init:
5159 case AO__opencl_atomic_init:
5160 case AO__c11_atomic_load:
5161 case AO__atomic_load_n:
5162 case AO__atomic_test_and_set:
5163 case AO__atomic_clear:
5166 case AO__scoped_atomic_load_n:
5167 case AO__opencl_atomic_load:
5168 case AO__hip_atomic_load:
5169 case AO__c11_atomic_store:
5170 case AO__c11_atomic_exchange:
5171 case AO__atomic_load:
5172 case AO__atomic_store:
5173 case AO__atomic_store_n:
5174 case AO__atomic_exchange_n:
5175 case AO__c11_atomic_fetch_add:
5176 case AO__c11_atomic_fetch_sub:
5177 case AO__c11_atomic_fetch_and:
5178 case AO__c11_atomic_fetch_or:
5179 case AO__c11_atomic_fetch_xor:
5180 case AO__c11_atomic_fetch_nand:
5181 case AO__c11_atomic_fetch_max:
5182 case AO__c11_atomic_fetch_min:
5183 case AO__atomic_fetch_add:
5184 case AO__atomic_fetch_sub:
5185 case AO__atomic_fetch_and:
5186 case AO__atomic_fetch_or:
5187 case AO__atomic_fetch_xor:
5188 case AO__atomic_fetch_nand:
5189 case AO__atomic_add_fetch:
5190 case AO__atomic_sub_fetch:
5191 case AO__atomic_and_fetch:
5192 case AO__atomic_or_fetch:
5193 case AO__atomic_xor_fetch:
5194 case AO__atomic_nand_fetch:
5195 case AO__atomic_min_fetch:
5196 case AO__atomic_max_fetch:
5197 case AO__atomic_fetch_min:
5198 case AO__atomic_fetch_max:
5201 case AO__scoped_atomic_load:
5202 case AO__scoped_atomic_store:
5203 case AO__scoped_atomic_store_n:
5204 case AO__scoped_atomic_fetch_add:
5205 case AO__scoped_atomic_fetch_sub:
5206 case AO__scoped_atomic_fetch_and:
5207 case AO__scoped_atomic_fetch_or:
5208 case AO__scoped_atomic_fetch_xor:
5209 case AO__scoped_atomic_fetch_nand:
5210 case AO__scoped_atomic_add_fetch:
5211 case AO__scoped_atomic_sub_fetch:
5212 case AO__scoped_atomic_and_fetch:
5213 case AO__scoped_atomic_or_fetch:
5214 case AO__scoped_atomic_xor_fetch:
5215 case AO__scoped_atomic_nand_fetch:
5216 case AO__scoped_atomic_min_fetch:
5217 case AO__scoped_atomic_max_fetch:
5218 case AO__scoped_atomic_fetch_min:
5219 case AO__scoped_atomic_fetch_max:
5220 case AO__scoped_atomic_exchange_n:
5221 case AO__scoped_atomic_uinc_wrap:
5222 case AO__scoped_atomic_udec_wrap:
5223 case AO__hip_atomic_exchange:
5224 case AO__hip_atomic_fetch_add:
5225 case AO__hip_atomic_fetch_sub:
5226 case AO__hip_atomic_fetch_and:
5227 case AO__hip_atomic_fetch_or:
5228 case AO__hip_atomic_fetch_xor:
5229 case AO__hip_atomic_fetch_min:
5230 case AO__hip_atomic_fetch_max:
5231 case AO__opencl_atomic_store:
5232 case AO__hip_atomic_store:
5233 case AO__opencl_atomic_exchange:
5234 case AO__opencl_atomic_fetch_add:
5235 case AO__opencl_atomic_fetch_sub:
5236 case AO__opencl_atomic_fetch_and:
5237 case AO__opencl_atomic_fetch_or:
5238 case AO__opencl_atomic_fetch_xor:
5239 case AO__opencl_atomic_fetch_min:
5240 case AO__opencl_atomic_fetch_max:
5241 case AO__atomic_exchange:
5244 case AO__scoped_atomic_exchange:
5245 case AO__c11_atomic_compare_exchange_strong:
5246 case AO__c11_atomic_compare_exchange_weak:
5248 case AO__hip_atomic_compare_exchange_strong:
5249 case AO__opencl_atomic_compare_exchange_strong:
5250 case AO__opencl_atomic_compare_exchange_weak:
5251 case AO__hip_atomic_compare_exchange_weak:
5252 case AO__atomic_compare_exchange:
5253 case AO__atomic_compare_exchange_n:
5256 case AO__scoped_atomic_compare_exchange:
5257 case AO__scoped_atomic_compare_exchange_n:
5260 llvm_unreachable(
"unknown atomic op");
5266 return AT->getValueType();
5271 unsigned ArraySectionCount = 0;
5272 while (
auto *OASE = dyn_cast<ArraySectionExpr>(
Base->IgnoreParens())) {
5273 Base = OASE->getBase();
5274 ++ArraySectionCount;
5277 dyn_cast<ArraySubscriptExpr>(
Base->IgnoreParenImpCasts())) {
5278 Base = ASE->getBase();
5279 ++ArraySectionCount;
5281 Base =
Base->IgnoreParenImpCasts();
5282 auto OriginalTy =
Base->getType();
5283 if (
auto *DRE = dyn_cast<DeclRefExpr>(
Base))
5284 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
5285 OriginalTy = PVD->getOriginalType().getNonReferenceType();
5287 for (
unsigned Cnt = 0; Cnt < ArraySectionCount; ++Cnt) {
5288 if (OriginalTy->isAnyPointerType())
5289 OriginalTy = OriginalTy->getPointeeType();
5290 else if (OriginalTy->isArrayType())
5291 OriginalTy = OriginalTy->castAsArrayTypeUnsafe()->getElementType();
5303 BaseTy = ASE->getElementType();
5320 return ASE->getElementType();
5327 :
Expr(RecoveryExprClass,
T.getNonReferenceType(),
5328 T->isDependentType() ?
VK_LValue : getValueKindForType(
T),
5330 BeginLoc(BeginLoc), EndLoc(EndLoc), NumExprs(SubExprs.size()) {
5331 assert(!
T.isNull());
5332 assert(!llvm::is_contained(SubExprs,
nullptr));
5334 llvm::copy(SubExprs, getTrailingObjects());
5342 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(SubExprs.size()),
5343 alignof(RecoveryExpr));
5344 return new (Mem) RecoveryExpr(Ctx,
T, BeginLoc, EndLoc, SubExprs);
5348 void *Mem = Ctx.
Allocate(totalSizeToAlloc<Expr *>(NumSubExprs),
5349 alignof(RecoveryExpr));
5350 return new (Mem) RecoveryExpr(
EmptyShell(), NumSubExprs);
5355 NumDims == Dims.size() &&
5356 "Preallocated number of dimensions is different from the provided one.");
5357 llvm::copy(Dims, getTrailingObjects<Expr *>());
5362 NumDims == BR.size() &&
5363 "Preallocated number of dimensions is different from the provided one.");
5364 llvm::copy(BR, getTrailingObjects<SourceRange>());
5367OMPArrayShapingExpr::OMPArrayShapingExpr(
QualType ExprTy,
Expr *Op,
5371 RPLoc(R), NumDims(Dims.size()) {
5373 setDimensions(Dims);
5382 assert(Dims.size() == BracketRanges.size() &&
5383 "Different number of dimensions and brackets ranges.");
5384 void *Mem = Context.Allocate(
5385 totalSizeToAlloc<Expr *, SourceRange>(Dims.size() + 1, Dims.size()),
5386 alignof(OMPArrayShapingExpr));
5387 auto *E =
new (Mem) OMPArrayShapingExpr(
T, Op, L, R, Dims);
5388 E->setBracketsRanges(BracketRanges);
5394 void *Mem = Context.Allocate(
5395 totalSizeToAlloc<Expr *, SourceRange>(NumDims + 1, NumDims),
5396 alignof(OMPArrayShapingExpr));
5397 return new (Mem) OMPArrayShapingExpr(
EmptyShell(), NumDims);
5400void OMPIteratorExpr::setIteratorDeclaration(
unsigned I,
Decl *D) {
5401 getTrailingObjects<Decl *>(NumIterators)[I] = D;
5404void OMPIteratorExpr::setAssignmentLoc(
unsigned I,
SourceLocation Loc) {
5405 assert(I < NumIterators &&
5406 "Idx is greater or equal the number of iterators definitions.");
5409 static_cast<int>(RangeLocOffset::AssignLoc)] = Loc;
5412void OMPIteratorExpr::setIteratorRange(
unsigned I,
Expr *Begin,
5416 assert(I < NumIterators &&
5417 "Idx is greater or equal the number of iterators definitions.");
5418 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5419 static_cast<int>(RangeExprOffset::Begin)] =
5421 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5422 static_cast<int>(RangeExprOffset::End)] = End;
5423 getTrailingObjects<Expr *>()[I *
static_cast<int>(RangeExprOffset::Total) +
5424 static_cast<int>(RangeExprOffset::Step)] = Step;
5426 SourceLocation>()[I *
static_cast<int>(RangeLocOffset::Total) +
5427 static_cast<int>(RangeLocOffset::FirstColonLoc)] =
5430 SourceLocation>()[I *
static_cast<int>(RangeLocOffset::Total) +
5431 static_cast<int>(RangeLocOffset::SecondColonLoc)] =
5436 return getTrailingObjects<Decl *>()[I];
5442 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5443 RangeExprOffset::Total) +
5444 static_cast<int>(RangeExprOffset::Begin)];
5446 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5447 RangeExprOffset::Total) +
5448 static_cast<int>(RangeExprOffset::End)];
5450 getTrailingObjects<Expr *>()[I *
static_cast<int>(
5451 RangeExprOffset::Total) +
5452 static_cast<int>(RangeExprOffset::Step)];
5457 return getTrailingObjects<
5459 static_cast<int>(RangeLocOffset::AssignLoc)];
5463 return getTrailingObjects<
5465 static_cast<int>(RangeLocOffset::FirstColonLoc)];
5469 return getTrailingObjects<
5471 static_cast<int>(RangeLocOffset::SecondColonLoc)];
5475 getTrailingObjects<OMPIteratorHelperData>()[I] = D;
5479 return getTrailingObjects<OMPIteratorHelperData>()[I];
5483 return getTrailingObjects<OMPIteratorHelperData>()[I];
5486OMPIteratorExpr::OMPIteratorExpr(
5491 IteratorKwLoc(IteratorKwLoc), LPLoc(L), RPLoc(R),
5492 NumIterators(
Data.size()) {
5493 for (
unsigned I = 0, E =
Data.size(); I < E; ++I) {
5494 const IteratorDefinition &D = Data[I];
5495 setIteratorDeclaration(I, D.IteratorDecl);
5496 setAssignmentLoc(I, D.AssignmentLoc);
5497 setIteratorRange(I, D.Range.Begin, D.ColonLoc, D.Range.End,
5498 D.SecondColonLoc, D.Range.Step);
5499 setHelper(I, Helpers[I]);
5510 assert(
Data.size() == Helpers.size() &&
5511 "Data and helpers must have the same size.");
5512 void *Mem = Context.Allocate(
5513 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5514 Data.size(),
Data.size() *
static_cast<int>(RangeExprOffset::Total),
5515 Data.size() *
static_cast<int>(RangeLocOffset::Total),
5517 alignof(OMPIteratorExpr));
5518 return new (Mem) OMPIteratorExpr(
T, IteratorKwLoc, L, R,
Data, Helpers);
5522 unsigned NumIterators) {
5523 void *Mem = Context.Allocate(
5524 totalSizeToAlloc<Decl *, Expr *, SourceLocation, OMPIteratorHelperData>(
5525 NumIterators, NumIterators *
static_cast<int>(RangeExprOffset::Total),
5526 NumIterators *
static_cast<int>(RangeLocOffset::Total), NumIterators),
5527 alignof(OMPIteratorExpr));
5528 return new (Mem) OMPIteratorExpr(
EmptyShell(), NumIterators);
5535 return new (
C) HLSLOutArgExpr(Ty,
Base, OpV, WB, IsInOut);
5544 return new (
C) OpenACCAsteriskSizeExpr(Loc,
C.IntTy);
5549 return new (
C) OpenACCAsteriskSizeExpr({},
C.IntTy);
5553 bool hasFPFeatures) {
5554 void *Mem =
C.Allocate(totalSizeToAlloc<FPOptionsOverride>(hasFPFeatures),
5555 alignof(ConvertVectorExpr));
5556 return new (Mem) ConvertVectorExpr(hasFPFeatures,
EmptyShell());
5564 unsigned Size = totalSizeToAlloc<FPOptionsOverride>(HasFPFeatures);
5565 void *Mem =
C.Allocate(Size,
alignof(ConvertVectorExpr));
5566 return new (Mem) ConvertVectorExpr(SrcExpr, TI, DstType,
VK, OK, BuiltinLoc,
5567 RParenLoc, FPFeatures);
5573 StaticValue =
new (Ctx)
APValue;
5576 return *StaticValue;
5580 assert(StaticValue);
5581 return *StaticValue;
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
static bool isBooleanType(QualType Ty)
static Expr * IgnoreImplicitConstructorSingleStep(Expr *E)
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
static const Expr * skipTemporaryBindingsNoOpCastsAndParens(const Expr *E)
Skip over any no-op casts and any temporary-binding expressions.
static bool IsDecompositionDeclRefExpr(const Expr *E)
Helper to determine wether E is a CXXConstructExpr constructing a DecompositionDecl.
static unsigned SizeOfCallExprInstance(Expr::StmtClass SC)
static void AssertResultStorageKind(ConstantResultStorageKind Kind)
static void computeOverflowPatternExclusion(const ASTContext &Ctx, const BinaryOperator *E)
Compute and set the OverflowPatternExclusion bit based on whether the BinaryOperator expression match...
static std::optional< BinaryOperator * > getOverflowPatternBinOp(const BinaryOperator *E)
Certain overflow-dependent code patterns can have their integer overflow sanitization disabled.
Defines the clang::Preprocessor interface.
static QualType getUnderlyingType(const SubRegion *R)
static bool isRecordType(QualType T)
Defines the SourceManager interface.
Expr * getExpr()
Get 'expr' part of the associated expression/statement.
static QualType getPointeeType(const MemRegion *R)
static const TypeInfo & getInfo(unsigned id)
a trap message and trap category.
void setValue(const ASTContext &C, const llvm::APInt &Val)
llvm::APInt getValue() const
uint64_t * pVal
Used to store the >64 bits integer value.
uint64_t VAL
Used to store the <= 64 bits integer value.
void setIntValue(const ASTContext &C, const llvm::APInt &Val)
A non-discriminated union of a base, field, or array index.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
static APValue IndeterminateValue()
@ Indeterminate
This object has an indeterminate value (C++ [basic.indet]).
@ None
There is no such object (it's outside its lifetime).
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
Builtin::Context & BuiltinInfo
const LangOptions & getLangOpts() const
Qualifiers::GC getObjCGCAttrKind(QualType Ty) const
Return one of the GCNone, Weak or Strong Objective-C garbage collection attributes.
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
void * Allocate(size_t Size, unsigned Align=8) const
CanQualType UnsignedIntTy
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
StringLiteral * getPredefinedStringLiteralFromCache(StringRef Key) const
Return a string representing the human readable name for the specified function declaration or file n...
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
UnnamedGlobalConstantDecl * getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const
Return a declaration for a uniquified anonymous global constant corresponding to a given APValue.
const TargetInfo & getTargetInfo() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
const Stmt ** const_iterator
QualType getElementType() const
Return the effective 'element' type of this array section.
Expr * getBase()
Get base of the array section.
static QualType getBaseOriginalType(const Expr *Base)
Return original type of the base expression for array section.
QualType getBaseType() const
Returns the effective 'type' of the base of this array section.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
static unsigned getNumSubExprs(AtomicOp Op)
Determine the number of arguments the specified atomic builtin should have.
QualType getValueType() const
AtomicExpr(SourceLocation BLoc, ArrayRef< Expr * > args, QualType t, AtomicOp op, SourceLocation RP)
unsigned getNumSubExprs() const
A builtin binary operation expression such as "x + y" or "x <= y".
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
StringRef getOpcodeStr() const
SourceLocation getOperatorLoc() const
bool hasStoredFPFeatures() const
bool isCompoundAssignmentOp() const
static unsigned sizeOfTrailingObjects(bool HasFPFeatures)
Return the size in bytes needed for the trailing objects.
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
static BinaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static bool isAssignmentOp(Opcode Opc)
static bool isNullPointerArithmeticExtension(ASTContext &Ctx, Opcode Opc, const Expr *LHS, const Expr *RHS)
Return true if a binary operator using the specified opcode and operands would match the 'p = (i8*)nu...
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used only by Serialization.
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
BinaryOperator(const ASTContext &Ctx, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
Build a binary operator, assuming that appropriate storage has been allocated for the trailing object...
BinaryOperatorKind Opcode
A binding in a decomposition declaration.
SourceLocation getCaretLocation() const
const Stmt * getBody() const
const FunctionProtoType * getFunctionType() const
getFunctionType - Return the underlying function type for this block.
bool isUnevaluated(unsigned ID) const
Returns true if this builtin does not perform the side-effects of its arguments.
CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++ [expr....
static CStyleCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)
SourceLocation getLParenLoc() const
Represents a call to a CUDA kernel function.
Represents a base class of a C++ class.
Represents binding an expression to a temporary.
CXXTemporary * getTemporary()
Represents a call to a C++ constructor.
Expr * getArg(unsigned Arg)
Return the specified argument.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
Represents a C++ constructor within a class.
A default argument (C++ [dcl.fct.default]).
A use of a default initializer in a constructor or in aggregate initialization.
Represents a C++ destructor within a class.
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Represents a call to a member function that may be written either with member call syntax (e....
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
A call to an overloaded operator written using operator syntax.
SourceLocation getOperatorLoc() const
Returns the location of the operator symbol in the expression.
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
SourceRange getSourceRange() const
Represents a C++ struct/union/class.
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
A C++ static_cast expression (C++ [expr.static.cast]).
const CXXDestructorDecl * getDestructor() const
Represents the this expression in C++.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
bool hasStoredFPFeatures() const
std::optional< llvm::APInt > evaluateBytesReturnedByAllocSizeCall(const ASTContext &Ctx) const
Evaluates the total size in bytes allocated by calling a function decorated with alloc_size.
static unsigned sizeOfTrailingObjects(unsigned NumPreArgs, unsigned NumArgs, bool HasFPFeatures)
Return the size in bytes needed for the trailing objects.
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
const AllocSizeAttr * getCalleeAllocSizeAttr() const
Try to get the alloc_size attribute of the callee. May return null.
unsigned getBuiltinCallee() const
getBuiltinCallee - If this is a call to a builtin, return the builtin ID of the callee.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
static CallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Create an empty call expression, for deserialization.
bool isCallToStdMove() const
void setPreArg(unsigned I, Stmt *PreArg)
static constexpr unsigned OffsetToTrailingObjects
void computeDependence()
Compute and set dependence bits.
void setStoredFPFeatures(FPOptionsOverride F)
Set FPOptionsOverride in trailing storage. Used only by Serialization.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
CallExpr(StmtClass SC, Expr *Fn, ArrayRef< Expr * > PreArgs, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs, ADLCallKind UsesADL)
Build a call expression, assuming that appropriate storage has been allocated for the trailing object...
static constexpr unsigned sizeToAllocateForCallExprSubclass(unsigned SizeOfTrailingObjects)
static constexpr ADLCallKind UsesADL
bool isBuiltinAssumeFalse(const ASTContext &Ctx) const
Return true if this is a call to __assume() or __builtin_assume() with a non-value-dependent constant...
QualType getCallReturnType(const ASTContext &Ctx) const
getCallReturnType - Get the return type of the call expr.
bool isUnevaluatedBuiltinCall(const ASTContext &Ctx) const
Returns true if this is a call to a builtin which does not evaluate side-effects within its arguments...
unsigned getNumPreArgs() const
bool hasUnusedResultAttr(const ASTContext &Ctx) const
Returns true if this call expression should warn on unused results.
QualType withConst() const
Retrieves a version of this type with const applied.
bool isVolatileQualified() const
Represents the body of a CapturedStmt, and serves as its DeclContext.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
FPOptionsOverride * getTrailingFPFeatures()
Return a pointer to the trailing FPOptions.
NamedDecl * getConversionFunction() const
If this cast applies a user-defined conversion, retrieve the conversion function that it invokes.
Expr * getSubExprAsWritten()
Retrieve the cast subexpression as it was written in the source code, looking through any implicit ca...
CastKind getCastKind() const
bool hasStoredFPFeatures() const
static const FieldDecl * getTargetFieldForToUnionCast(QualType unionType, QualType opType)
CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind, Expr *op, unsigned BasePathSize, bool HasFPFeatures)
const char * getCastKindName() const
SourceLocation getEnd() const
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
void setValue(unsigned Val)
static void print(unsigned val, CharacterLiteralKind Kind, raw_ostream &OS)
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Represents a class template specialization, which refers to a class template with a given set of temp...
bool isExplicitSpecialization() const
CompoundAssignOperator - For compound assignments (e.g.
static CompoundAssignOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
CompoundLiteralExpr - [C99 6.5.2.5].
bool hasStaticStorage() const
APValue & getStaticValue() const
APValue & getOrCreateStaticValue(ASTContext &Ctx) const
CompoundStmt - This represents a group of statements like { stmt stmt }.
ConditionalOperator - The ?
ConstEvaluatedExprVisitor - This class visits 'const Expr *'s.
APValue getAPValueResult() const
static ConstantResultStorageKind getStorageKind(const APValue &Value)
void MoveIntoResult(APValue &Value, const ASTContext &Context)
llvm::APSInt getResultAsAPSInt() const
ConstantResultStorageKind getResultStorageKind() const
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
static ConstantExpr * CreateEmpty(const ASTContext &Context, ConstantResultStorageKind StorageKind)
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
EmbedExpr(const ASTContext &Ctx, SourceLocation Loc, EmbedDataStorage *Data, unsigned Begin, unsigned NumOfElements)
An instance of this object exists for each enum constant that is defined.
ExplicitCastExpr - An explicit cast written in the source code.
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
EnumConstantDecl * getEnumConstantDecl()
If this expression refers to an enum constant, retrieve its declaration.
bool isReadIfDiscardedInCPlusPlus11() const
Determine whether an lvalue-to-rvalue conversion should implicitly be applied to this expression if i...
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
@ SE_AllowSideEffects
Allow any unmodeled side effect.
@ SE_AllowUndefinedBehavior
Allow UB that we can give a value, but not arbitrary unmodeled side effects.
static QualType findBoundMemberType(const Expr *expr)
Given an expression of bound-member type, find the type of the member.
static std::pair< const NamedDecl *, const WarnUnusedResultAttr * > getUnusedResultAttrImpl(const Decl *Callee, QualType ReturnType)
Returns the WarnUnusedResultAttr that is declared on the callee or its return type declaration,...
bool isImplicitCXXThis() const
Whether this expression is an implicit reference to 'this' in C++.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc, SourceRange &R1, SourceRange &R2, ASTContext &Ctx) const
isUnusedResultAWarning - Return true if this immediate expression should be warned about if the resul...
LValueClassification ClassifyLValue(ASTContext &Ctx) const
Reasons why an expression might not be an l-value.
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool refersToVectorElement() const
Returns whether this expression refers to a vector element.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParenLValueCasts() LLVM_READONLY
Skip past any parentheses and lvalue casts which might surround this expression until reaching a fixe...
FPOptions getFPFeaturesInEffect(const LangOptions &LO) const
Returns the set of floating point options that apply to this expression.
const CXXRecordDecl * getBestDynamicClassType() const
For an expression of class type or pointer to class type, return the most derived class decl the expr...
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreConversionOperatorSingleStep() LLVM_READONLY
Skip conversion operators.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
bool isObjCSelfExpr() const
Check if this expression is the ObjC 'self' implicit parameter.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isFlexibleArrayMemberLike(const ASTContext &Context, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution=false) const
Check whether this array fits the idiom of a flexible array member, depending on the value of -fstric...
bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsLValue - Evaluate an expression to see if we can fold it to an lvalue with link time known ...
bool isEvaluatable(const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects) const
isEvaluatable - Call EvaluateAsRValue to see if this expression can be constant folded without side-e...
Expr * IgnoreParenBaseCasts() LLVM_READONLY
Skip past any parentheses and derived-to-base casts until reaching a fixed point.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
NullPointerConstantValueDependence
Enumeration used to describe how isNullPointerConstant() should cope with value-dependent expressions...
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_NeverValueDependent
Specifies that the expression should never be value-dependent.
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
Expr * IgnoreUnlessSpelledInSource()
Skip past any invisible AST nodes which might surround this statement, such as ExprWithCleanups or Im...
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
Expr * IgnoreCasts() LLVM_READONLY
Skip past any casts which might surround this expression until reaching a fixed point.
Decl * getReferencedDeclOfCallee()
Expr * IgnoreImplicitAsWritten() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
const Expr * getBestDynamicClassTypeExpr() const
Get the inner expression that determines the best dynamic class.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind
Enumeration used to describe the kind of Null pointer constant returned from isNullPointerConstant().
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
@ NPCK_ZeroLiteral
Expression is a Null pointer constant built from a literal zero.
@ NPCK_CXX11_nullptr
Expression is a C++11 nullptr.
@ NPCK_GNUNull
Expression is a GNU-style __null constant.
@ NPCK_NotNull
Expression is not a Null pointer constant.
bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsBooleanCondition - Return true if this is a constant which we can fold and convert to a boo...
bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
QualType getEnumCoercedType(const ASTContext &Ctx) const
If this expression is an enumeration constant, return the enumeration type under which said constant ...
bool isBoundMemberFunction(ASTContext &Ctx) const
Returns true if this expression is a bound member function.
bool isConstantInitializer(ASTContext &Ctx, bool ForRef, const Expr **Culprit=nullptr) const
isConstantInitializer - Returns true if this expression can be emitted to IR as a constant,...
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
static bool isSameComparisonOperand(const Expr *E1, const Expr *E2)
Checks that the two Expr's will refer to the same value as a comparison operand.
bool isDefaultArgument() const
Determine whether this expression is a default function argument.
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
bool hasNonTrivialCall(const ASTContext &Ctx) const
Determine whether this expression involves a call to any function that is not trivial.
bool refersToGlobalRegisterVar() const
Returns whether this expression refers to a global register variable.
bool isCXX98IntegralConstantExpr(const ASTContext &Ctx) const
isCXX98IntegralConstantExpr - Return true if this expression is an integral constant expression in C+...
const ValueDecl * getAsBuiltinConstantDeclRef(const ASTContext &Context) const
If this expression is an unambiguous reference to a single declaration, in the style of __builtin_fun...
bool isOBJCGCCandidate(ASTContext &Ctx) const
isOBJCGCCandidate - Return true if this expression may be used in a read/ write barrier.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
const Expr * skipRValueSubobjectAdjustments() const
bool isKnownToHaveBooleanValue(bool Semantic=true) const
isKnownToHaveBooleanValue - Return true if this is an integer expression that is known to return 0 or...
void setDependence(ExprDependence Deps)
Each concrete expr subclass is expected to compute its dependence and call this in the constructor.
const ObjCPropertyRefExpr * getObjCProperty() const
If this expression is an l-value for an Objective C property, find the underlying property reference ...
bool containsDuplicateElements() const
containsDuplicateElements - Return true if any element access is repeated.
bool isArrow() const
isArrow - Return true if the base expression is a pointer to vector, return false if the base express...
void getEncodedElementAccess(SmallVectorImpl< uint32_t > &Elts) const
getEncodedElementAccess - Encode the elements accessed into an llvm aggregate Constant of ConstantInt...
const Expr * getBase() const
unsigned getNumElements() const
getNumElements - Get the number of components being selected.
static int getAccessorIdx(char c, bool isNumericAccessor)
Represents difference between two FPOptions values.
bool requiresTrailingStorage() const
static FPOptions defaultWithoutTrailingStorage(const LangOptions &LO)
Return the default value of FPOptions that's used when trailing storage isn't required.
Represents a member of a struct/union/class.
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool isBitField() const
Determines whether this field is a bitfield.
static FixedPointLiteral * Create(const ASTContext &C, EmptyShell Empty)
Returns an empty fixed-point literal.
std::string getValueAsString(unsigned Radix) const
llvm::APInt getValue() const
Returns an internal integer representation of the literal.
static FixedPointLiteral * CreateFromRawInt(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l, unsigned Scale)
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
double getValueAsApproximateDouble() const
getValueAsApproximateDouble - This returns the value as an inaccurate double.
llvm::APFloat getValue() const
FullExpr - Represents a "full-expression" node.
Represents a function declaration or definition.
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Represents a prototype with parameter type info, e.g.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
bool isExplicitSpecialization() const
TemplateArgumentList * TemplateArguments
The template arguments used to produce the function template specialization from the function templat...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
QualType getReturnType() const
Represents a C11 generic selection.
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
static GenericSelectionExpr * CreateEmpty(const ASTContext &Context, unsigned NumAssocs)
Create an empty generic selection expression for deserialization.
GlobalDecl - represents a global declaration.
static HLSLOutArgExpr * CreateEmpty(const ASTContext &Ctx)
static HLSLOutArgExpr * Create(const ASTContext &C, QualType Ty, OpaqueValueExpr *Base, OpaqueValueExpr *OpV, Expr *WB, bool IsInOut)
One of these records is kept for each identifier that is lexed.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
static ImplicitCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
Describes an C or C++ initializer list.
bool hasArrayFiller() const
Return true if this is an array initializer and its array "filler" has been set.
InitListExpr(const ASTContext &C, SourceLocation lbraceloc, ArrayRef< Expr * > initExprs, SourceLocation rbraceloc)
bool isTransparent() const
Is this a transparent initializer list (that is, an InitListExpr that is purely syntactic,...
void resizeInits(const ASTContext &Context, unsigned NumInits)
Specify the number of initializers.
bool isStringLiteralInit() const
Is this an initializer for an array of characters, initialized by a string literal or an @encode?
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isSemanticForm() const
void setInit(unsigned Init, Expr *expr)
Expr * updateInit(const ASTContext &C, unsigned Init, Expr *expr)
Updates the initializer at index Init with the new expression expr, and returns the old expression at...
void setArrayFiller(Expr *filler)
InitListExpr * getSyntacticForm() const
const Expr * getInit(unsigned Init) const
bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const
Is this the zero initializer {0} in a language which considers it idiomatic?
SourceLocation getEndLoc() const LLVM_READONLY
bool isSyntacticForm() const
ArrayRef< Expr * > inits()
void sawArrayRangeDesignator(bool ARD=true)
Expr ** getInits()
Retrieve the set of initializers.
void reserveInits(const ASTContext &C, unsigned NumInits)
Reserve space for some number of initializers.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
LabelStmt - Represents a label, which has a substatement.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
StrictFlexArraysLevelKind
@ AddUnsignedOverflowTest
if (a + b < a)
@ AddSignedOverflowTest
if (a + b < a)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isOverflowPatternExcluded(OverflowPatternExclusionKind Kind) const
void remapPathPrefix(SmallVectorImpl< char > &Path) const
Remap path prefix according to -fmacro-prefix-path option.
Lexer - This provides a simple interface that turns a text buffer into a stream of tokens.
bool LexFromRawLexer(Token &Result)
LexFromRawLexer - Lex a token from a designated raw lexer (one with no associated preprocessor object...
static SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart, unsigned Characters, const SourceManager &SM, const LangOptions &LangOpts)
AdvanceToTokenCharacter - If the current SourceLocation specifies a location at the start of a token,...
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
static MemberExpr * CreateEmpty(const ASTContext &Context, bool HasQualifier, bool HasFoundDecl, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
void setMemberDecl(ValueDecl *D)
NestedNameSpecifierLoc getQualifierLoc() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name,...
bool hasExplicitTemplateArgs() const
Determines whether the member name was followed by an explicit template argument list.
bool hasQualifier() const
Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...
static MemberExpr * Create(const ASTContext &C, Expr *Base, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *MemberDecl, DeclAccessPair FoundDecl, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, QualType T, ExprValueKind VK, ExprObjectKind OK, NonOdrUseReason NOUR)
bool isImplicitAccess() const
Determine whether the base of this explicit is implicit.
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
DeclarationNameInfo getMemberNameInfo() const
Retrieve the member declaration name info.
A pointer to member type per C++ 8.3.3 - Pointers to members.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
A C++ nested-name-specifier augmented with source location information.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
bool hasQualifier() const
Evaluates true when this nested-name-specifier location is non-empty.
An explicit cast in C or a C-style cast in C++, which uses the syntax ([s1][s2]......
static OMPArrayShapingExpr * CreateEmpty(const ASTContext &Context, unsigned NumDims)
static OMPArrayShapingExpr * Create(const ASTContext &Context, QualType T, Expr *Op, SourceLocation L, SourceLocation R, ArrayRef< Expr * > Dims, ArrayRef< SourceRange > BracketRanges)
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
static OMPIteratorExpr * Create(const ASTContext &Context, QualType T, SourceLocation IteratorKwLoc, SourceLocation L, SourceLocation R, ArrayRef< IteratorDefinition > Data, ArrayRef< OMPIteratorHelperData > Helpers)
static OMPIteratorExpr * CreateEmpty(const ASTContext &Context, unsigned NumIterators)
SourceLocation getSecondColonLoc(unsigned I) const
Gets the location of the second ':' (if any) in the range for the given iteratori definition.
SourceLocation getColonLoc(unsigned I) const
Gets the location of the first ':' in the range for the given iterator definition.
IteratorRange getIteratorRange(unsigned I)
Gets the iterator range for the given iterator.
OMPIteratorHelperData & getHelper(unsigned I)
Fetches helper data for the specified iteration space.
SourceLocation getAssignLoc(unsigned I) const
Gets the location of '=' for the given iterator definition.
Decl * getIteratorDecl(unsigned I)
Gets the iterator declaration for the given iterator.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Represents an ObjC class declaration.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
ObjCMethodFamily getMethodFamily() const
bool isInstanceMessage() const
Determine whether this is an instance message to either a computed object or to super.
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
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
static OffsetOfExpr * CreateEmpty(const ASTContext &C, unsigned NumComps, unsigned NumExprs)
static OffsetOfExpr * Create(const ASTContext &C, QualType type, SourceLocation OperatorLoc, TypeSourceInfo *tsi, ArrayRef< OffsetOfNode > comps, ArrayRef< Expr * > exprs, SourceLocation RParenLoc)
void setIndexExpr(unsigned Idx, Expr *E)
void setComponent(unsigned Idx, OffsetOfNode ON)
FieldDecl * getField() const
For a field offsetof node, returns the field.
IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
@ Identifier
A field in a dependent type, known only by its name.
Kind getKind() const
Determine what kind of offsetof node this is.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
static const OpaqueValueExpr * findInCopyConstruct(const Expr *expr)
Given an expression which invokes a copy constructor — i.e.
OpaqueValueExpr(SourceLocation Loc, QualType T, ExprValueKind VK, ExprObjectKind OK=OK_Ordinary, Expr *SourceExpr=nullptr)
This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...
static OpenACCAsteriskSizeExpr * Create(const ASTContext &C, SourceLocation Loc)
static OpenACCAsteriskSizeExpr * CreateEmpty(const ASTContext &C)
ParenExpr - This represents a parenthesized expression, e.g.
static ParenListExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumExprs)
Create an empty paren list.
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PredefinedExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType FNTy, PredefinedIdentKind IK, bool IsTransparent, StringLiteral *SL)
Create a PredefinedExpr.
StringRef getIdentKindName() const
static PredefinedExpr * CreateEmpty(const ASTContext &Ctx, bool HasFunctionName)
Create an empty PredefinedExpr.
static std::string ComputeName(PredefinedIdentKind IK, const Decl *CurrentDecl, bool ForceElaboratedPrinting=false)
static void processPathToFileName(SmallVectorImpl< char > &FileName, const PresumedLoc &PLoc, const LangOptions &LangOpts, const TargetInfo &TI)
static void processPathForFileMacro(SmallVectorImpl< char > &Path, const LangOptions &LangOpts, const TargetInfo &TI)
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
Callbacks to use to customize the behavior of the pretty-printer.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
semantics_iterator semantics_end()
semantics_iterator semantics_begin()
const Expr *const * const_semantics_iterator
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
ArrayRef< Expr * > semantics()
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
QualType getCanonicalType() const
The collection of all-type qualifiers we support.
void removeAddressSpace()
Represents a struct/union/class.
field_iterator field_end() const
field_range fields() const
specific_decl_iterator< FieldDecl > field_iterator
field_iterator field_begin() const
static RecoveryExpr * Create(ASTContext &Ctx, QualType T, SourceLocation BeginLoc, SourceLocation EndLoc, ArrayRef< Expr * > SubExprs)
static RecoveryExpr * CreateEmpty(ASTContext &Ctx, unsigned NumSubExprs)
TypeSourceInfo * getTypeSourceInfo()
static SYCLUniqueStableNameExpr * Create(const ASTContext &Ctx, SourceLocation OpLoc, SourceLocation LParen, SourceLocation RParen, TypeSourceInfo *TSI)
std::string ComputeName(ASTContext &Context) const
static SYCLUniqueStableNameExpr * CreateEmpty(const ASTContext &Ctx)
void setExprs(const ASTContext &C, ArrayRef< Expr * > Exprs)
ShuffleVectorExpr(const ASTContext &C, ArrayRef< Expr * > args, QualType Type, SourceLocation BLoc, SourceLocation RP)
APValue EvaluateInContext(const ASTContext &Ctx, const Expr *DefaultExpr) const
Return the result of evaluating this SourceLocExpr in the specified (and possibly null) default argum...
SourceLocExpr(const ASTContext &Ctx, SourceLocIdentKind Type, QualType ResultTy, SourceLocation BLoc, SourceLocation RParenLoc, DeclContext *Context)
SourceLocation getLocation() const
const DeclContext * getParentContext() const
If the SourceLocExpr has been resolved return the subexpression representing the resolved value.
StringRef getBuiltinStr() const
Return a string representing the name of the specific builtin function.
static bool MayBeDependent(SourceLocIdentKind Kind)
SourceLocIdentKind getIdentKind() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
CharSourceRange getExpansionRange(SourceLocation Loc) const
Given a SourceLocation object, return the range of tokens covered by the expansion in the ultimate fi...
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
UnaryExprOrTypeTraitExprBitfields UnaryExprOrTypeTraitExprBits
GenericSelectionExprBitfields GenericSelectionExprBits
ParenListExprBitfields ParenListExprBits
StmtIterator child_iterator
Child Iterators: All subclasses must implement 'children' to permit easy iteration over the substatem...
CallExprBitfields CallExprBits
ShuffleVectorExprBitfields ShuffleVectorExprBits
FloatingLiteralBitfields FloatingLiteralBits
child_iterator child_begin()
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
UnaryOperatorBitfields UnaryOperatorBits
SourceLocExprBitfields SourceLocExprBits
ConstantExprBitfields ConstantExprBits
llvm::iterator_range< child_iterator > child_range
StringLiteralBitfields StringLiteralBits
MemberExprBitfields MemberExprBits
DeclRefExprBitfields DeclRefExprBits
ConstStmtIterator const_child_iterator
PredefinedExprBitfields PredefinedExprBits
SourceLocation getBeginLoc() const LLVM_READONLY
BinaryOperatorBitfields BinaryOperatorBits
PseudoObjectExprBitfields PseudoObjectExprBits
llvm::iterator_range< const_child_iterator > const_child_range
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
unsigned getOffsetOfStringByte(const Token &TheTok, unsigned ByteNo) const
getOffsetOfStringByte - This function returns the offset of the specified byte of the string data rep...
unsigned GetStringLength() const
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
unsigned getLength() const
StringLiteralKind getKind() const
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
SourceLocation getLocationOfByte(unsigned ByteNo, const SourceManager &SM, const LangOptions &Features, const TargetInfo &Target, unsigned *StartToken=nullptr, unsigned *StartTokenByteOffset=nullptr) const
getLocationOfByte - Return a source location that points to the specified byte of this string literal...
uint32_t getCodeUnit(size_t i) const
void outputString(raw_ostream &OS) const
static StringLiteral * CreateEmpty(const ASTContext &Ctx, unsigned NumConcatenated, unsigned Length, unsigned CharByteWidth)
Construct an empty string literal.
unsigned getNumConcatenated() const
getNumConcatenated - Get the number of string literal tokens that were concatenated in translation ph...
Represents the declaration of a struct/union/class/enum.
Exposes information about the current target.
A convenient class for passing around template argument information.
A template argument list.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
Location wrapper for a TemplateArgument.
void print(const PrintingPolicy &Policy, raw_ostream &Out, bool IncludeType) const
Print this template argument to the given output stream.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
Token - This structure provides full information about a lexed token.
A container of type source information.
The base class of the type hierarchy.
bool isBooleanType() const
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
CXXRecordDecl * castAsCXXRecordDecl() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isSpecificPlaceholderType(unsigned K) const
Test for a specific placeholder type.
bool isReferenceType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
RecordDecl * castAsRecordDecl() const
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
QualType getArgumentType() const
bool isArgumentType() const
UnaryExprOrTypeTraitExpr(UnaryExprOrTypeTrait ExprKind, TypeSourceInfo *TInfo, QualType resultType, SourceLocation op, SourceLocation rp)
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
SourceLocation getOperatorLoc() const
getOperatorLoc - Return the location of the operator.
Expr * getSubExpr() const
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given unary opcode.
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix)
Retrieve the unary opcode that corresponds to the given overloaded operator.
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used by Serialization & ASTImporter.
UnaryOperator(const ASTContext &Ctx, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
static UnaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Stmt(StmtClass SC, EmptyShell)
Construct an empty statement.
Represents a variable declaration or definition.
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
ConstantResultStorageKind
Describes the kind of result that can be tail-allocated.
@ Ctor_Base
Base object ctor.
bool isa(CodeGen::Address addr)
LLVM_READONLY bool isPrintable(unsigned char c)
Return true if this character is an ASCII printable character; that is, a character that should take ...
LLVM_READONLY auto escapeCStyle(CharT Ch) -> StringRef
Return C-style escaped string for special characters, or an empty string if there is no such mapping.
Expr * IgnoreExprNodes(Expr *E, FnTys &&... Fns)
Given an expression E and functions Fn_1,...,Fn_n : Expr * -> Expr *, Recursively apply each of the f...
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
StmtIterator cast_away_const(const ConstStmtIterator &RHS)
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
std::pair< FileID, unsigned > FileIDAndOffset
ExprDependence computeDependence(FullExpr *E)
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
Expr * IgnoreImplicitCastsExtraSingleStep(Expr *E)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
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.
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,...