41#include "llvm/ADT/DenseSet.h"
42#include "llvm/ADT/STLExtras.h"
43#include "llvm/ADT/STLForwardCompat.h"
44#include "llvm/ADT/ScopeExit.h"
45#include "llvm/ADT/SmallPtrSet.h"
46#include "llvm/ADT/SmallVector.h"
60 return P->hasAttr<PassObjectSizeAttr>();
84 NameInfo, Fn->getType(),
VK_LValue, FoundDecl,
86 if (HadMultipleCandidates)
87 DRE->setHadMultipleCandidates(
true);
93 DRE->setType(Fn->getType());
97 CK_FunctionToPointerDecay);
102 bool HadMultipleCandidates,
105 FoundDecl,
Base, HadMultipleCandidates, NameInfo,
111 bool HadMultipleCandidates,
118 bool InOverloadResolution,
121 bool AllowObjCWritebackConversion);
125 bool InOverloadResolution,
133 bool AllowObjCConversionOnExplicit);
201 return Rank[(int)Kind];
226 static const char *
const Name[] = {
230 "Function-to-pointer",
231 "Function pointer conversion",
233 "Integral promotion",
234 "Floating point promotion",
236 "Integral conversion",
237 "Floating conversion",
238 "Complex conversion",
239 "Floating-integral conversion",
240 "Pointer conversion",
241 "Pointer-to-member conversion",
242 "Boolean conversion",
243 "Compatible-types conversion",
244 "Derived-to-base conversion",
246 "SVE Vector conversion",
247 "RVV Vector conversion",
249 "Complex-real conversion",
250 "Block Pointer conversion",
251 "Transparent Union Conversion",
252 "Writeback conversion",
253 "OpenCL Zero Event Conversion",
254 "OpenCL Zero Queue Conversion",
255 "C specific type conversion",
256 "Incompatible pointer conversion",
257 "Fixed point conversion",
258 "HLSL vector truncation",
259 "HLSL matrix truncation",
260 "Non-decaying array conversion",
338 FromType = Context.getArrayDecayedType(FromType);
350 const Expr *Converted) {
353 if (
auto *EWC = dyn_cast<ExprWithCleanups>(Converted)) {
360 while (
auto *ICE = dyn_cast<ImplicitCastExpr>(Converted)) {
361 switch (ICE->getCastKind()) {
363 case CK_IntegralCast:
364 case CK_IntegralToBoolean:
365 case CK_IntegralToFloating:
366 case CK_BooleanToSignedIntegral:
367 case CK_FloatingToIntegral:
368 case CK_FloatingToBoolean:
369 case CK_FloatingCast:
370 Converted = ICE->getSubExpr();
396 QualType &ConstantType,
bool IgnoreFloatToIntegralConversion,
397 bool AllowRelaxedEval)
const {
399 "narrowing check outside C++");
410 ToType = ED->getIntegerType();
416 goto FloatingIntegralConversion;
418 goto IntegralConversion;
429 FloatingIntegralConversion:
434 if (IgnoreFloatToIntegralConversion)
437 assert(
Initializer &&
"Unknown conversion expression");
443 if (std::optional<llvm::APSInt> IntConstantValue =
447 Result.convertFromAPInt(*IntConstantValue, IntConstantValue->isSigned(),
448 llvm::APFloat::rmNearestTiesToEven);
450 llvm::APSInt ConvertedValue = *IntConstantValue;
452 llvm::APFloat::opStatus Status =
Result.convertToInteger(
453 ConvertedValue, llvm::APFloat::rmTowardZero, &ignored);
456 if (Status == llvm::APFloat::opInvalidOp ||
457 *IntConstantValue != ConvertedValue) {
458 ConstantValue =
APValue(*IntConstantValue);
486 Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue,
487 AllowRelaxedEval)))) {
490 ConstantValue = R.Val;
491 assert(ConstantValue.
isFloat());
492 llvm::APFloat FloatVal = ConstantValue.
getFloat();
495 llvm::APFloat Converted = FloatVal;
496 llvm::APFloat::opStatus ConvertStatus =
498 llvm::APFloat::rmNearestTiesToEven, &ignored);
500 llvm::APFloat::rmNearestTiesToEven, &ignored);
502 if (FloatVal.isNaN() && Converted.isNaN() &&
503 !FloatVal.isSignaling() && !Converted.isSignaling()) {
509 if (!Converted.bitwiseIsEqual(FloatVal)) {
516 if (ConvertStatus & llvm::APFloat::opOverflow) {
538 IntegralConversion: {
546 constexpr auto CanRepresentAll = [](
bool FromSigned,
unsigned FromWidth,
547 bool ToSigned,
unsigned ToWidth) {
548 return (FromWidth < ToWidth + (FromSigned == ToSigned)) &&
549 !(FromSigned && !ToSigned);
552 if (CanRepresentAll(FromSigned, FromWidth, ToSigned, ToWidth))
558 bool DependentBitField =
false;
560 if (BitField->getBitWidth()->isValueDependent())
561 DependentBitField =
true;
562 else if (
unsigned BitFieldWidth = BitField->getBitWidthValue();
563 BitFieldWidth < FromWidth) {
564 if (CanRepresentAll(FromSigned, BitFieldWidth, ToSigned, ToWidth))
568 FromWidth = BitFieldWidth;
576 std::optional<llvm::APSInt> OptInitializerValue =
577 Initializer->getIntegerConstantExpr(Ctx, AllowRelaxedEval);
578 if (!OptInitializerValue) {
582 if (DependentBitField && !(FromSigned && !ToSigned))
588 llvm::APSInt &InitializerValue = *OptInitializerValue;
589 bool Narrowing =
false;
590 if (FromWidth < ToWidth) {
593 if (InitializerValue.isSigned() && InitializerValue.isNegative())
599 InitializerValue.extend(InitializerValue.getBitWidth() + 1);
601 llvm::APSInt ConvertedValue = InitializerValue;
602 ConvertedValue = ConvertedValue.trunc(ToWidth);
603 ConvertedValue.setIsSigned(ToSigned);
604 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
605 ConvertedValue.setIsSigned(InitializerValue.isSigned());
607 if (ConvertedValue != InitializerValue)
612 ConstantValue =
APValue(InitializerValue);
628 ConstantValue = R.Val;
629 assert(ConstantValue.
isFloat());
630 llvm::APFloat FloatVal = ConstantValue.
getFloat();
635 if (FloatVal.isNaN() && FloatVal.isSignaling()) {
651 raw_ostream &OS = llvm::errs();
652 bool PrintedSomething =
false;
655 PrintedSomething =
true;
659 if (PrintedSomething) {
665 OS <<
" (by copy constructor)";
667 OS <<
" (direct reference binding)";
669 OS <<
" (reference binding)";
671 PrintedSomething =
true;
675 if (PrintedSomething) {
679 PrintedSomething =
true;
682 if (!PrintedSomething) {
683 OS <<
"No conversions required";
690 raw_ostream &OS = llvm::errs();
698 OS <<
"aggregate initialization";
708 raw_ostream &OS = llvm::errs();
710 OS <<
"Worst list element conversion: ";
711 switch (ConversionKind) {
713 OS <<
"Standard conversion: ";
717 OS <<
"User-defined conversion: ";
721 OS <<
"Ellipsis conversion";
724 OS <<
"Ambiguous conversion";
727 OS <<
"Bad conversion";
752 struct DFIArguments {
758 struct DFIParamWithArguments : DFIArguments {
763 struct DFIDeducedMismatchArgs : DFIArguments {
764 TemplateArgumentList *TemplateArgs;
765 unsigned CallArgIndex;
770 TemplateArgumentList *TemplateArgs;
771 ConstraintSatisfaction Satisfaction;
782 Result.Result =
static_cast<unsigned>(TDK);
783 Result.HasDiagnostic =
false;
803 Result.HasDiagnostic =
true;
810 auto *Saved =
new (Context) DFIDeducedMismatchArgs;
821 DFIArguments *Saved =
new (Context) DFIArguments;
833 DFIParamWithArguments *Saved =
new (Context) DFIParamWithArguments;
834 Saved->Param = Info.
Param;
847 Result.HasDiagnostic =
true;
852 CNSInfo *Saved =
new (Context) CNSInfo;
862 llvm_unreachable(
"not a deduction failure");
895 Diag->~PartialDiagnosticAt();
902 static_cast<CNSInfo *
>(
Data)->Satisfaction.~ConstraintSatisfaction();
905 Diag->~PartialDiagnosticAt();
941 return TemplateParameter::getFromOpaqueValue(
Data);
946 return static_cast<DFIParamWithArguments*
>(
Data)->Param;
976 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->TemplateArgs;
982 return static_cast<CNSInfo*
>(
Data)->TemplateArgs;
1014 return &
static_cast<DFIArguments*
>(
Data)->FirstArg;
1046 return &
static_cast<DFIArguments*
>(
Data)->SecondArg;
1061 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->CallArgIndex;
1064 return std::nullopt;
1077 for (
unsigned I = 0; I <
X->getNumParams(); ++I)
1081 if (
auto *FTX =
X->getDescribedFunctionTemplate()) {
1086 FTY->getTemplateParameters()))
1095 OverloadedOperatorKind::OO_EqualEqual);
1107 OverloadedOperatorKind::OO_ExclaimEqual);
1125 auto *NotEqFD = Op->getAsFunction();
1126 if (
auto *UD = dyn_cast<UsingShadowDecl>(Op))
1127 NotEqFD = UD->getUnderlyingDecl()->getAsFunction();
1140 return Op == OO_EqualEqual || Op == OO_Spaceship;
1148 if (Op == OverloadedOperatorKind::OO_EqualEqual) {
1149 assert(OriginalArgs.size() == 2);
1151 S,
OpLoc, OriginalArgs[1], FD))
1162void OverloadCandidateSet::destroyCandidates() {
1163 for (
iterator i = Candidates.begin(), e = Candidates.end(); i != e; ++i) {
1164 for (
auto &
C : i->Conversions)
1165 C.~ImplicitConversionSequence();
1167 i->DeductionFailure.Destroy();
1172 destroyCandidates();
1173 SlabAllocator.Reset();
1174 NumInlineBytesUsed = 0;
1178 FirstDeferredCandidate =
nullptr;
1179 DeferredCandidatesCount = 0;
1180 HasDeferredTemplateConstructors =
false;
1181 ResolutionByPerfectCandidateIsDisabled =
false;
1185 class UnbridgedCastsSet {
1195 Entry entry = { &E, E };
1196 Entries.push_back(entry);
1201 for (SmallVectorImpl<Entry>::iterator
1202 i = Entries.begin(), e = Entries.end(); i != e; ++i)
1203 *i->Addr = i->Saved;
1217 UnbridgedCastsSet *unbridgedCasts =
nullptr) {
1221 if (placeholder->getKind() == BuiltinType::Overload)
return false;
1225 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
1227 unbridgedCasts->save(S, E);
1247 UnbridgedCastsSet &unbridged) {
1248 for (
unsigned i = 0, e = Args.size(); i != e; ++i)
1257 bool NewIsUsingDecl) {
1262 bool OldIsUsingDecl =
false;
1264 OldIsUsingDecl =
true;
1268 if (NewIsUsingDecl)
continue;
1275 if ((OldIsUsingDecl || NewIsUsingDecl) && !
isVisible(*I))
1283 bool UseMemberUsingDeclRules =
1284 (OldIsUsingDecl || NewIsUsingDecl) &&
CurContext->isRecord() &&
1285 !
New->getFriendObjectKind();
1289 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
1295 !shouldLinkPossiblyHiddenDecl(*I,
New))
1314 }
else if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(OldD)) {
1321 if (UUD->getQualifier().isDependent() && !UUD->isCXXClassMember()) {
1349 if (
New->getFriendObjectKind() &&
New->getQualifier() &&
1350 !
New->getDescribedFunctionTemplate() &&
1351 !
New->getDependentSpecializationInfo() &&
1352 !
New->getType()->isDependentType()) {
1357 New->setInvalidDecl();
1369 assert(D &&
"function decl should not be null");
1370 if (
auto *A = D->
getAttr<AttrT>())
1371 return !A->isImplicit();
1377 bool UseMemberUsingDeclRules,
1378 bool ConsiderCudaAttrs,
1379 bool UseOverrideRules =
false) {
1385 if (
New->isMSVCRTEntryPoint())
1396 if ((OldTemplate ==
nullptr) != (NewTemplate ==
nullptr))
1419 if (OldQType != NewQType && OldType->isVariadic() != NewType->isVariadic())
1423 if ((
New->isMemberLikeConstrainedFriend() ||
1434 OldDecl = OldTemplate;
1435 NewDecl = NewTemplate;
1453 bool ConstraintsInTemplateHead =
1464 if (UseMemberUsingDeclRules && ConstraintsInTemplateHead &&
1465 !SameTemplateParameterList)
1467 if (!UseMemberUsingDeclRules &&
1468 (!SameTemplateParameterList || !SameReturnType))
1472 const auto *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1473 const auto *NewMethod = dyn_cast<CXXMethodDecl>(
New);
1475 int OldParamsOffset = 0;
1476 int NewParamsOffset = 0;
1484 if (ThisType.isConstQualified())
1504 BS.
Quals = NormalizeQualifiers(OldMethod, BS.
Quals);
1505 DS.Quals = NormalizeQualifiers(NewMethod, DS.Quals);
1507 if (OldMethod->isExplicitObjectMemberFunction()) {
1509 DS.Quals.removeVolatile();
1512 return BS.
Quals == DS.Quals;
1516 auto BS =
Base.getNonReferenceType().getCanonicalType().split();
1517 auto DS = D.getNonReferenceType().getCanonicalType().split();
1519 if (!AreQualifiersEqual(BS, DS))
1522 if (OldMethod->isImplicitObjectMemberFunction() &&
1523 OldMethod->getParent() != NewMethod->getParent()) {
1535 if (
Base->isLValueReferenceType())
1536 return D->isLValueReferenceType();
1537 return Base->isRValueReferenceType() == D->isRValueReferenceType();
1542 auto DiagnoseInconsistentRefQualifiers = [&]() {
1543 if (SemaRef.
LangOpts.CPlusPlus23 && !UseOverrideRules)
1545 if (OldMethod->getRefQualifier() == NewMethod->getRefQualifier())
1547 if (OldMethod->isExplicitObjectMemberFunction() ||
1548 NewMethod->isExplicitObjectMemberFunction())
1550 if (!UseMemberUsingDeclRules && (OldMethod->getRefQualifier() ==
RQ_None ||
1551 NewMethod->getRefQualifier() ==
RQ_None)) {
1552 SemaRef.
Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
1553 << OldMethod->getRefQualifier() << NewMethod->getRefQualifier();
1554 SemaRef.
Diag(OldMethod->getLocation(), diag::note_previous_declaration);
1563 bool ShouldDiagnoseInconsistentRefQualifiers =
false;
1564 bool HaveInconsistentQualifiers =
false;
1566 if (OldMethod && OldMethod->isExplicitObjectMemberFunction())
1568 if (NewMethod && NewMethod->isExplicitObjectMemberFunction())
1571 if (OldType->getNumParams() - OldParamsOffset !=
1572 NewType->getNumParams() - NewParamsOffset ||
1574 {OldType->param_type_begin() + OldParamsOffset,
1575 OldType->param_type_end()},
1576 {NewType->param_type_begin() + NewParamsOffset,
1577 NewType->param_type_end()},
1582 if (OldMethod && NewMethod && !OldMethod->isStatic() &&
1583 !NewMethod->isStatic()) {
1584 bool HaveCorrespondingObjectParameters = [&](
const CXXMethodDecl *Old,
1586 auto NewObjectType =
New->getFunctionObjectParameterReferenceType();
1590 return F->getRefQualifier() ==
RQ_None &&
1591 !F->isExplicitObjectMemberFunction();
1594 if (IsImplicitWithNoRefQual(Old) != IsImplicitWithNoRefQual(
New) &&
1595 CompareType(OldObjectType.getNonReferenceType(),
1596 NewObjectType.getNonReferenceType()))
1598 return CompareType(OldObjectType, NewObjectType);
1599 }(OldMethod, NewMethod);
1601 if (!HaveCorrespondingObjectParameters) {
1602 ShouldDiagnoseInconsistentRefQualifiers =
true;
1606 if (!UseOverrideRules || (!NewMethod->isExplicitObjectMemberFunction() &&
1607 !OldMethod->isExplicitObjectMemberFunction()))
1608 HaveInconsistentQualifiers =
true;
1612 if (NewMethod && OldMethod && OldMethod->isImplicitObjectMemberFunction() &&
1613 NewMethod->isImplicitObjectMemberFunction())
1614 ShouldDiagnoseInconsistentRefQualifiers =
true;
1616 if (!UseOverrideRules &&
1620 if (!NewRC != !OldRC)
1640 NewI =
New->specific_attr_begin<EnableIfAttr>(),
1641 NewE =
New->specific_attr_end<EnableIfAttr>(),
1644 NewI != NewE || OldI != OldE; ++NewI, ++OldI) {
1645 if (NewI == NewE || OldI == OldE)
1647 llvm::FoldingSetNodeID NewID, OldID;
1648 NewI->getCond()->Profile(NewID, SemaRef.
Context,
true);
1649 OldI->getCond()->Profile(OldID, SemaRef.
Context,
true);
1654 if ((ShouldDiagnoseInconsistentRefQualifiers &&
1655 DiagnoseInconsistentRefQualifiers()) ||
1656 HaveInconsistentQualifiers)
1660 if (SemaRef.
getLangOpts().CUDA && ConsiderCudaAttrs) {
1668 "Unexpected invalid target.");
1672 if (NewTarget != OldTarget) {
1675 if (OldMethod && NewMethod && OldMethod->isVirtual() &&
1676 OldMethod->isConstexpr() && !NewMethod->isConstexpr() &&
1694 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1700 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1713 bool SuppressUserConversions,
1715 bool InOverloadResolution,
1717 bool AllowObjCWritebackConversion,
1718 bool AllowObjCConversionOnExplicit) {
1721 if (SuppressUserConversions) {
1732 Conversions, AllowExplicit,
1733 AllowObjCConversionOnExplicit)) {
1754 bool FromListInit =
false;
1755 if (
const auto *InitList = dyn_cast<InitListExpr>(From);
1756 InitList && InitList->getNumInits() == 1 &&
1758 const Expr *SingleInit = InitList->getInit(0);
1759 FromType = SingleInit->
getType();
1761 FromListInit =
true;
1770 if ((FromCanon == ToCanon ||
1782 if (ToCanon != FromCanon)
1793 Cand != Conversions.
end(); ++Cand)
1834static ImplicitConversionSequence
1836 bool SuppressUserConversions,
1838 bool InOverloadResolution,
1840 bool AllowObjCWritebackConversion,
1841 bool AllowObjCConversionOnExplicit) {
1844 ICS.
Standard, CStyle, AllowObjCWritebackConversion)){
1895 bool CanConvert =
false;
1901 FromResType->getWrappedType()) &&
1903 FromResType->getContainedType()) &&
1904 ToResType->getAttrs() == FromResType->getAttrs())
1906 }
else if (ToTy->isHLSLResourceType()) {
1920 AllowExplicit, InOverloadResolution, CStyle,
1921 AllowObjCWritebackConversion,
1922 AllowObjCConversionOnExplicit);
1925ImplicitConversionSequence
1927 bool SuppressUserConversions,
1929 bool InOverloadResolution,
1931 bool AllowObjCWritebackConversion) {
1932 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1933 AllowExplicit, InOverloadResolution, CStyle,
1934 AllowObjCWritebackConversion,
1940 bool AllowExplicit) {
1945 bool AllowObjCWritebackConversion =
1952 *
this, From, ToType,
1954 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1956 false, AllowObjCWritebackConversion,
1970 if (
Context.hasSameUnqualifiedType(FromType, ToType))
1983 if (TyClass != CanFrom->getTypeClass())
return false;
1984 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1985 if (TyClass == Type::Pointer) {
1988 }
else if (TyClass == Type::BlockPointer) {
1991 }
else if (TyClass == Type::MemberPointer) {
1998 CanTo = ToMPT->getPointeeType();
2004 TyClass = CanTo->getTypeClass();
2005 if (TyClass != CanFrom->getTypeClass())
return false;
2006 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
2016 bool Changed =
false;
2024 const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn);
2025 const auto *ToFPT = dyn_cast<FunctionProtoType>(ToFn);
2027 if (FromFPT && ToFPT) {
2028 if (FromFPT->hasCFIUncheckedCallee() != ToFPT->hasCFIUncheckedCallee()) {
2030 FromFPT->getReturnType(), FromFPT->getParamTypes(),
2031 FromFPT->getExtProtoInfo().withCFIUncheckedCallee(
2032 ToFPT->hasCFIUncheckedCallee()));
2040 if (FromFPT && ToFPT) {
2041 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
2053 bool CanUseToFPT, CanUseFromFPT;
2054 if (
Context.mergeExtParameterInfo(ToFPT, FromFPT, CanUseToFPT,
2055 CanUseFromFPT, NewParamInfos) &&
2056 CanUseToFPT && !CanUseFromFPT) {
2059 NewParamInfos.empty() ?
nullptr : NewParamInfos.data();
2061 FromFPT->getParamTypes(), ExtInfo);
2066 if (
Context.hasAnyFunctionEffects()) {
2071 const auto FromFX = FromFPT->getFunctionEffects();
2072 const auto ToFX = ToFPT->getFunctionEffects();
2073 if (FromFX != ToFX) {
2077 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
2087 assert(
QualType(FromFn, 0).isCanonical());
2088 if (
QualType(FromFn, 0) != CanTo)
return false;
2115 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
2116 &ToSem == &llvm::APFloat::IEEEquad()) ||
2117 (&FromSem == &llvm::APFloat::IEEEquad() &&
2118 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2174 bool InOverloadResolution,
bool CStyle) {
2184 if (ToMatrixType && FromMatrixType) {
2186 unsigned ToCols = ToMatrixType->getNumColumns();
2187 if (FromCols < ToCols)
2190 unsigned FromRows = FromMatrixType->
getNumRows();
2191 unsigned ToRows = ToMatrixType->getNumRows();
2192 if (FromRows < ToRows)
2195 if (FromRows == ToRows && FromCols == ToCols)
2201 QualType ToElTy = ToMatrixType->getElementType();
2210 QualType ToElTy = ToMatrixType->getElementType();
2213 if (FromMatrixType && !ToMatrixType) {
2232 bool InOverloadResolution,
bool CStyle) {
2249 if (ToExtType && FromExtType) {
2251 unsigned ToElts = ToExtType->getNumElements();
2252 if (FromElts < ToElts)
2254 if (FromElts == ToElts)
2260 QualType ToElTy = ToExtType->getElementType();
2265 if (FromExtType && !ToExtType) {
2279 if (ToExtType->getNumElements() != FromExtType->getNumElements())
2284 FromExtType->getElementType()->isIntegerType()) {
2296 QualType ToElTy = ToExtType->getElementType();
2331 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
2336 !InOverloadResolution && !CStyle) {
2338 << FromType << ToType;
2349 bool InOverloadResolution,
2350 StandardConversionSequence &SCS,
2355 bool InOverloadResolution,
2356 StandardConversionSequence &SCS,
2368 bool InOverloadResolution,
2371 bool AllowObjCWritebackConversion) {
2397 FromType = Fn->getType();
2417 if (Method && !Method->isStatic() &&
2418 !Method->isExplicitObjectMemberFunction()) {
2420 "Non-unary operator on non-static member address");
2423 "Non-address-of operator on non-static member address");
2425 FromType, std::nullopt, Method->getParent());
2429 "Non-address-of operator for overloaded function expression");
2475 FromType =
Atomic->getValueType();
2510 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2530 bool IncompatibleObjC =
false;
2592 }
else if (AllowObjCWritebackConversion &&
2596 FromType, IncompatibleObjC)) {
2602 InOverloadResolution, FromType)) {
2606 From, InOverloadResolution, CStyle)) {
2611 From, InOverloadResolution, CStyle)) {
2621 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2630 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2660 bool ObjCLifetimeConversion;
2666 ObjCLifetimeConversion)) {
2685 CanonFrom = CanonTo;
2690 if (CanonFrom == CanonTo)
2695 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2707 case AssignConvertType::
2708 CompatibleVoidPtrToNonVoidPtr:
2741 bool InOverloadResolution,
2750 if (!UD->
hasAttr<TransparentUnionAttr>())
2753 for (
const auto *it : UD->
fields()) {
2756 ToType = it->getType();
2782 return To->
getKind() == BuiltinType::Int;
2785 return To->
getKind() == BuiltinType::UInt;
2809 if (FromED->isScoped())
2816 if (FromED->isFixed()) {
2817 QualType Underlying = FromED->getIntegerType();
2818 return Context.hasSameUnqualifiedType(Underlying, ToType) ||
2825 return Context.hasSameUnqualifiedType(ToType, FromED->getPromotionType());
2850 uint64_t FromSize =
Context.getTypeSize(FromType);
2859 for (
int Idx = 0; Idx < 6; ++Idx) {
2860 uint64_t ToSize =
Context.getTypeSize(PromoteTypes[Idx]);
2861 if (FromSize < ToSize ||
2862 (FromSize == ToSize &&
2863 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2867 return Context.hasSameUnqualifiedType(ToType, PromoteTypes[Idx]);
2888 std::optional<llvm::APSInt> BitWidth;
2891 MemberDecl->getBitWidth()->getIntegerConstantExpr(
Context))) {
2892 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2893 ToSize =
Context.getTypeSize(ToType);
2896 if (*BitWidth < ToSize ||
2898 return To->
getKind() == BuiltinType::Int;
2904 return To->
getKind() == BuiltinType::UInt;
2922 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2932 if (FromBuiltin->getKind() == BuiltinType::Float &&
2933 ToBuiltin->getKind() == BuiltinType::Double)
2940 (FromBuiltin->getKind() == BuiltinType::Float ||
2941 FromBuiltin->getKind() == BuiltinType::Double) &&
2942 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2943 ToBuiltin->getKind() == BuiltinType::Float128 ||
2944 ToBuiltin->getKind() == BuiltinType::Ibm128))
2949 if (
getLangOpts().
HLSL && FromBuiltin->getKind() == BuiltinType::Half &&
2950 (ToBuiltin->getKind() == BuiltinType::Float ||
2951 ToBuiltin->getKind() == BuiltinType::Double))
2956 FromBuiltin->getKind() == BuiltinType::Half &&
2957 ToBuiltin->getKind() == BuiltinType::Float)
2986 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2998 if (
const EnumType *ToEnumType = ToType->
getAs<EnumType>()) {
3010 return Context.getTypeSize(FromType) >
Context.getTypeSize(ToType);
3025 bool StripObjCLifetime =
false) {
3028 "Invalid similarly-qualified pointer type");
3039 if (StripObjCLifetime)
3051 return Context.getObjCObjectPointerType(ToPointee);
3052 return Context.getPointerType(ToPointee);
3060 return Context.getObjCObjectPointerType(QualifiedCanonToPointee);
3061 return Context.getPointerType(QualifiedCanonToPointee);
3065 bool InOverloadResolution,
3071 return !InOverloadResolution;
3079 bool InOverloadResolution,
3081 bool &IncompatibleObjC) {
3082 IncompatibleObjC =
false;
3090 ConvertedType = ToType;
3097 ConvertedType = ToType;
3104 ConvertedType = ToType;
3112 ConvertedType = ToType;
3122 ConvertedType = ToType;
3144 if (
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType))
3171 Context.typesAreCompatible(FromPointeeType, ToPointeeType)) {
3193 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType) &&
3202 Context.areCompatibleVectorTypes(FromPointeeType, ToPointeeType)) {
3221 return Context.getQualifiedType(
T, Qs);
3223 return Context.getQualifiedType(
T.getUnqualifiedType(), Qs);
3228 bool &IncompatibleObjC) {
3241 if (ToObjCPtr && FromObjCPtr) {
3249 if (
Context.canAssignObjCInterfaces(ToObjCPtr, FromObjCPtr)) {
3263 if (
Context.canAssignObjCInterfaces(FromObjCPtr, ToObjCPtr)) {
3267 IncompatibleObjC =
true;
3283 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
3312 IncompatibleObjC)) {
3314 IncompatibleObjC =
true;
3315 ConvertedType =
Context.getPointerType(ConvertedType);
3324 IncompatibleObjC)) {
3326 ConvertedType =
Context.getPointerType(ConvertedType);
3339 if (FromFunctionType && ToFunctionType) {
3342 if (
Context.getCanonicalType(FromPointeeType)
3343 ==
Context.getCanonicalType(ToPointeeType))
3348 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3349 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
3350 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
3353 bool HasObjCConversion =
false;
3355 Context.getCanonicalType(ToFunctionType->getReturnType())) {
3358 ToFunctionType->getReturnType(),
3359 ConvertedType, IncompatibleObjC)) {
3361 HasObjCConversion =
true;
3368 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3369 ArgIdx != NumArgs; ++ArgIdx) {
3371 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3372 if (
Context.getCanonicalType(FromArgType)
3373 ==
Context.getCanonicalType(ToArgType)) {
3376 ConvertedType, IncompatibleObjC)) {
3378 HasObjCConversion =
true;
3385 if (HasObjCConversion) {
3389 IncompatibleObjC =
true;
3421 if (!FromFunctionType || !ToFunctionType)
3424 if (
Context.hasSameType(FromPointeeType, ToPointeeType))
3429 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3430 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3435 if (FromEInfo != ToEInfo)
3438 bool IncompatibleObjC =
false;
3440 ToFunctionType->getReturnType())) {
3444 QualType LHS = ToFunctionType->getReturnType();
3449 if (
Context.hasSameType(RHS,LHS)) {
3452 ConvertedType, IncompatibleObjC)) {
3453 if (IncompatibleObjC)
3462 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3463 ArgIdx != NumArgs; ++ArgIdx) {
3464 IncompatibleObjC =
false;
3466 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3467 if (
Context.hasSameType(FromArgType, ToArgType)) {
3470 ConvertedType, IncompatibleObjC)) {
3471 if (IncompatibleObjC)
3480 bool CanUseToFPT, CanUseFromFPT;
3481 if (!
Context.mergeExtParameterInfo(ToFunctionType, FromFunctionType,
3482 CanUseToFPT, CanUseFromFPT,
3486 ConvertedType = ToType;
3525 ToMember->getMostRecentCXXRecordDecl())) {
3527 if (ToMember->isSugared())
3529 ToMember->getMostRecentCXXRecordDecl());
3531 PDiag << ToMember->getQualifier();
3532 if (FromMember->isSugared())
3534 FromMember->getMostRecentCXXRecordDecl());
3536 PDiag << FromMember->getQualifier();
3554 !FromType->
getAs<TemplateSpecializationType>()) {
3560 if (
Context.hasSameType(FromType, ToType)) {
3569 if (!FromFunction || !ToFunction) {
3574 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3584 << ToFunction->getParamType(ArgPos)
3591 ToFunction->getReturnType())) {
3597 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3620 assert(llvm::size(Old) == llvm::size(
New) &&
3621 "Can't compare parameters of functions with different number of "
3624 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3626 size_t J =
Reversed ? (llvm::size(
New) - Idx - 1) : Idx;
3631 Context.removePtrSizeAddrSpace(
Type.getUnqualifiedType());
3633 Context.removePtrSizeAddrSpace((
New.begin() + J)->getUnqualifiedType());
3635 if (!
Context.hasSameType(OldType, NewType)) {
3660 unsigned OldIgnore =
3662 unsigned NewIgnore =
3669 NewPT->param_types().slice(NewIgnore),
3676 bool IgnoreBaseAccess,
3679 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3688 PDiag(diag::warn_impcast_bool_to_null_pointer)
3699 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3700 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {
3703 unsigned InaccessibleID = 0;
3704 unsigned AmbiguousID = 0;
3706 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3707 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3710 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3712 &BasePath, IgnoreBaseAccess))
3716 Kind = CK_DerivedToBase;
3719 if (
Diagnose && !IsCStyleOrFunctionalCast &&
3720 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3722 "this should only be possible with MSVCCompat!");
3734 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3737 Kind = CK_BlockPointerToObjCPointerCast;
3739 Kind = CK_CPointerToObjCPointerCast;
3743 Kind = CK_AnyPointerToBlockPointerCast;
3749 Kind = CK_NullToPointer;
3756 bool InOverloadResolution,
3766 ConvertedType = ToType;
3782 ConvertedType =
Context.getMemberPointerType(
3796 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
3804 Kind = CK_NullToMemberPointer;
3822 PD <<
Context.getCanonicalTagType(Cls);
3832 std::swap(
Base, Derived);
3841 PD <<
int(Direction);
3849 DiagFromTo(PD) <<
QualType(VBase, 0) << OpRange;
3857 ? CK_DerivedToBaseMemberPointer
3858 : CK_BaseToDerivedMemberPointer;
3860 if (!IgnoreBaseAccess)
3864 ? diag::err_upcast_to_inaccessible_base
3865 : diag::err_downcast_from_inaccessible_base,
3867 NestedNameSpecifier BaseQual = FromPtrType->getQualifier(),
3868 DerivedQual = ToPtrType->getQualifier();
3869 if (Direction == MemberPointerConversionDirection::Upcast)
3870 std::swap(BaseQual, DerivedQual);
3871 DiagCls(PD, DerivedQual, Derived);
3872 DiagCls(PD, BaseQual, Base);
3907 bool CStyle,
bool IsTopLevel,
3908 bool &PreviousToQualsIncludeConst,
3909 bool &ObjCLifetimeConversion,
3922 ObjCLifetimeConversion =
true;
3962 !PreviousToQualsIncludeConst)
3980 PreviousToQualsIncludeConst =
3981 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3987 bool CStyle,
bool &ObjCLifetimeConversion) {
3988 FromType =
Context.getCanonicalType(FromType);
3989 ToType =
Context.getCanonicalType(ToType);
3990 ObjCLifetimeConversion =
false;
4000 bool PreviousToQualsIncludeConst =
true;
4001 bool UnwrappedAnyPointer =
false;
4002 while (
Context.UnwrapSimilarTypes(FromType, ToType)) {
4004 !UnwrappedAnyPointer,
4005 PreviousToQualsIncludeConst,
4008 UnwrappedAnyPointer =
true;
4016 return UnwrappedAnyPointer &&
Context.hasSameUnqualifiedType(FromType,ToType);
4025 bool InOverloadResolution,
4034 InOverloadResolution, InnerSCS,
4049 bool InOverloadResolution,
4052 const OverflowBehaviorType *ToOBT = ToType->
getAs<OverflowBehaviorType>();
4063 InOverloadResolution, InnerSCS, CStyle,
4080 if (CtorType->getNumParams() > 0) {
4081 QualType FirstArg = CtorType->getParamType(0);
4093 bool AllowExplicit) {
4100 bool Usable = !Info.Constructor->isInvalidDecl() &&
4103 bool SuppressUserConversions =
false;
4104 if (Info.ConstructorTmpl)
4107 CandidateSet, SuppressUserConversions,
4112 CandidateSet, SuppressUserConversions,
4113 false, AllowExplicit);
4117 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4144 llvm_unreachable(
"Invalid OverloadResult!");
4166 bool AllowObjCConversionOnExplicit) {
4167 assert(AllowExplicit != AllowedExplicit::None ||
4168 !AllowObjCConversionOnExplicit);
4172 bool ConstructorsOnly =
false;
4176 if (
const RecordType *ToRecordType = ToType->
getAsCanonical<RecordType>()) {
4188 ConstructorsOnly =
true;
4192 }
else if (
auto *ToRecordDecl =
4193 dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
4194 ToRecordDecl = ToRecordDecl->getDefinitionOrSelf();
4196 Expr **Args = &From;
4197 unsigned NumArgs = 1;
4198 bool ListInitializing =
false;
4199 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
4202 S, From, ToType, ToRecordDecl, User, CandidateSet,
4203 AllowExplicit == AllowedExplicit::All);
4212 Args = InitList->getInits();
4213 NumArgs = InitList->getNumInits();
4214 ListInitializing =
true;
4222 bool Usable = !Info.Constructor->isInvalidDecl();
4223 if (!ListInitializing)
4224 Usable = Usable && Info.Constructor->isConvertingConstructor(
4227 bool SuppressUserConversions = !ConstructorsOnly;
4235 if (SuppressUserConversions && ListInitializing) {
4236 SuppressUserConversions =
4241 if (Info.ConstructorTmpl)
4243 Info.ConstructorTmpl, Info.FoundDecl,
4245 CandidateSet, SuppressUserConversions,
4247 AllowExplicit == AllowedExplicit::All);
4253 SuppressUserConversions,
4255 AllowExplicit == AllowedExplicit::All);
4265 }
else if (
const RecordType *FromRecordType =
4267 if (
auto *FromRecordDecl =
4268 dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
4269 FromRecordDecl = FromRecordDecl->getDefinitionOrSelf();
4271 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
4272 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4281 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)))
4288 ConvTemplate, FoundDecl, ActingContext, From, ToType,
4289 CandidateSet, AllowObjCConversionOnExplicit,
4290 AllowExplicit != AllowedExplicit::None);
4293 CandidateSet, AllowObjCConversionOnExplicit,
4294 AllowExplicit != AllowedExplicit::None);
4299 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4308 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
4320 if (Best->Conversions[0].isEllipsis())
4323 User.
Before = Best->Conversions[0].Standard;
4336 = dyn_cast<CXXConversionDecl>(Best->Function)) {
4338 assert(Best->HasFinalConversion);
4346 User.
Before = Best->Conversions[0].Standard;
4361 User.
After = Best->FinalConversion;
4364 llvm_unreachable(
"Not a constructor or conversion function?");
4373 llvm_unreachable(
"Invalid OverloadResult!");
4383 CandidateSet, AllowedExplicit::None,
false);
4398 diag::err_typecheck_nonviable_condition_incomplete,
4405 *
this, From, Cands);
4431 if (!Conv1 || !Conv2)
4446 if (Block1 != Block2)
4459 if (Conv1FuncRet && Conv2FuncRet &&
4470 CallOpProto->isVariadic(),
false);
4472 CallOpProto->isVariadic(),
true);
4474 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4569 if (!ICS1.
isBad()) {
4570 bool StdInit1 =
false, StdInit2 =
false;
4577 if (StdInit1 != StdInit2)
4588 CAT2->getElementType())) {
4590 if (CAT1->getSize() != CAT2->getSize())
4592 return CAT1->getSize().ult(CAT2->getSize())
4627 if (ConvFunc1 == ConvFunc2)
4729 if (!
Enum->isFixed())
4765 else if (Rank2 < Rank1)
4800 bool SCS1ConvertsToVoid
4802 bool SCS2ConvertsToVoid
4804 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4809 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4815 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4844 if (FromObjCPtr1 && FromObjCPtr2) {
4849 if (AssignLeft != AssignRight) {
4888 if (UnqualT1 == UnqualT2) {
4950 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4951 return SCS1IsCompatibleVectorConversion
4958 bool SCS1IsCompatibleSVEVectorConversion =
4960 bool SCS2IsCompatibleSVEVectorConversion =
4963 if (SCS1IsCompatibleSVEVectorConversion !=
4964 SCS2IsCompatibleSVEVectorConversion)
4965 return SCS1IsCompatibleSVEVectorConversion
4972 bool SCS1IsCompatibleRVVVectorConversion =
4974 bool SCS2IsCompatibleRVVVectorConversion =
4977 if (SCS1IsCompatibleRVVVectorConversion !=
4978 SCS2IsCompatibleRVVVectorConversion)
4979 return SCS1IsCompatibleRVVVectorConversion
5038 if (UnqualT1 == UnqualT2)
5056 bool ObjCLifetimeConversion;
5066 if (CanPick1 != CanPick2)
5120 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5128 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
5145 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
5152 bool FromAssignRight
5161 if (ToPtr1->isObjCIdType() &&
5162 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
5164 if (ToPtr2->isObjCIdType() &&
5165 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
5170 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
5172 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
5177 if (ToPtr1->isObjCClassType() &&
5178 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
5180 if (ToPtr2->isObjCClassType() &&
5181 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
5186 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
5188 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
5194 (ToAssignLeft != ToAssignRight)) {
5205 }
else if (IsSecondSame)
5214 (FromAssignLeft != FromAssignRight))
5228 CXXRecordDecl *FromPointee1 = FromMemPointer1->getMostRecentCXXRecordDecl();
5233 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5240 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
5278 if (!
T.getQualifiers().hasUnaligned())
5292 "T1 must be the pointee type of the reference type");
5293 assert(!OrigT2->
isReferenceType() &&
"T2 cannot be a reference type");
5316 if (UnqualT1 == UnqualT2) {
5320 Conv |= ReferenceConversions::DerivedToBase;
5323 Context.canBindObjCObjectType(UnqualT1, UnqualT2))
5324 Conv |= ReferenceConversions::ObjC;
5327 Conv |= ReferenceConversions::Function;
5331 bool ConvertedReferent = Conv != 0;
5335 bool PreviousToQualsIncludeConst =
true;
5336 bool TopLevel =
true;
5342 Conv |= ReferenceConversions::Qualification;
5348 Conv |= ReferenceConversions::NestedQualification;
5356 bool ObjCLifetimeConversion =
false;
5358 PreviousToQualsIncludeConst,
5360 return (ConvertedReferent ||
Context.hasSimilarType(T1, T2))
5365 if (ObjCLifetimeConversion)
5366 Conv |= ReferenceConversions::ObjCLifetime;
5369 }
while (
Context.UnwrapSimilarTypes(T1, T2));
5374 return (ConvertedReferent ||
Context.hasSameUnqualifiedType(T1, T2))
5385 bool AllowExplicit) {
5386 assert(T2->
isRecordType() &&
"Can only find conversions of record types.");
5390 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5391 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5398 = dyn_cast<FunctionTemplateDecl>(D);
5415 if (!ConvTemplate &&
5439 ConvTemplate, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5440 false, AllowExplicit);
5443 Conv, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5444 false, AllowExplicit);
5447 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5453 assert(Best->HasFinalConversion);
5465 if (!Best->FinalConversion.DirectBinding)
5477 "Expected a direct reference binding!");
5483 Cand != CandidateSet.
end(); ++Cand)
5495 llvm_unreachable(
"Invalid OverloadResult!");
5500static ImplicitConversionSequence
5503 bool SuppressUserConversions,
5504 bool AllowExplicit) {
5505 assert(DeclType->
isReferenceType() &&
"Reference init needs a reference");
5532 auto SetAsReferenceBinding = [&](
bool BindsDirectly) {
5537 ICS.
Standard.
Second = (RefConv & Sema::ReferenceConversions::DerivedToBase)
5539 : (RefConv & Sema::ReferenceConversions::ObjC)
5547 Sema::ReferenceConversions::NestedQualification)
5561 (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0;
5585 SetAsReferenceBinding(
true);
5634 SetAsReferenceBinding(S.
getLangOpts().CPlusPlus11 ||
5725 AllowedExplicit::None,
5750 if (isRValRef && LValRefType) {
5767static ImplicitConversionSequence
5769 bool SuppressUserConversions,
5770 bool InOverloadResolution,
5771 bool AllowObjCWritebackConversion,
5772 bool AllowExplicit =
false);
5776static ImplicitConversionSequence
5778 bool SuppressUserConversions,
5779 bool InOverloadResolution,
5780 bool AllowObjCWritebackConversion) {
5793 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT))
5795 InitTy = IAT->getElementType();
5821 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5827 SuppressUserConversions,
5828 InOverloadResolution,
5829 AllowObjCWritebackConversion);
5838 Result.Standard.setAsIdentityConversion();
5839 Result.Standard.setFromType(ToType);
5840 Result.Standard.setAllToTypes(ToType);
5865 bool IsUnbounded =
false;
5869 if (CT->getSize().ult(e)) {
5873 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5876 if (CT->getSize().ugt(e)) {
5882 S, &EmptyList, InitTy, SuppressUserConversions,
5883 InOverloadResolution, AllowObjCWritebackConversion);
5884 if (DfltElt.
isBad()) {
5888 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5899 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5909 Result.Standard.setAsIdentityConversion();
5910 Result.Standard.setFromType(InitTy);
5911 Result.Standard.setAllToTypes(InitTy);
5912 for (
unsigned i = 0; i < e; ++i) {
5915 S,
Init, InitTy, SuppressUserConversions, InOverloadResolution,
5916 AllowObjCWritebackConversion);
5927 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5941 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5955 AllowedExplicit::None,
5956 InOverloadResolution,
false,
5957 AllowObjCWritebackConversion,
5976 Result.UserDefined.Before.setAsIdentityConversion();
5981 Result.UserDefined.After.setAsIdentityConversion();
5982 Result.UserDefined.After.setFromType(ToType);
5983 Result.UserDefined.After.setAllToTypes(ToType);
5984 Result.UserDefined.ConversionFunction =
nullptr;
6001 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
6022 SuppressUserConversions,
6030 InOverloadResolution,
6031 AllowObjCWritebackConversion);
6034 assert(!
Result.isEllipsis() &&
6035 "Sub-initialization cannot result in ellipsis conversion.");
6041 Result.UserDefined.After;
6069 S, From->
getInit(0), ToType, SuppressUserConversions,
6070 InOverloadResolution, AllowObjCWritebackConversion);
6072 Result.Standard.FromBracedInitList =
true;
6076 else if (NumInits == 0) {
6078 Result.Standard.setAsIdentityConversion();
6079 Result.Standard.setFromType(ToType);
6080 Result.Standard.setAllToTypes(ToType);
6097static ImplicitConversionSequence
6099 bool SuppressUserConversions,
6100 bool InOverloadResolution,
6101 bool AllowObjCWritebackConversion,
6102 bool AllowExplicit) {
6103 if (
InitListExpr *FromInitList = dyn_cast<InitListExpr>(From))
6105 InOverloadResolution,AllowObjCWritebackConversion);
6110 SuppressUserConversions, AllowExplicit);
6113 SuppressUserConversions,
6114 AllowedExplicit::None,
6115 InOverloadResolution,
6117 AllowObjCWritebackConversion,
6130 return !ICS.
isBad();
6139 const CXXRecordDecl *ActingContext,
bool InOverloadResolution =
false,
6141 bool SuppressUserConversion =
false) {
6149 assert(FromClassification.
isLValue());
6160 if (Method->isExplicitObjectMemberFunction()) {
6161 if (ExplicitParameterType.isNull())
6162 ExplicitParameterType = Method->getFunctionObjectParameterReferenceType();
6164 ValueKindFromClassification(FromClassification));
6166 S, &TmpExpr, ExplicitParameterType, SuppressUserConversion,
6183 Qualifiers Quals = Method->getMethodQualifiers();
6221 FromType, ImplicitParamType);
6231 FromType, ImplicitParamType);
6244 }
else if (!Method->isExplicitObjectMemberFunction()) {
6246 FromType, ImplicitParamType);
6251 switch (Method->getRefQualifier()) {
6266 if (!FromClassification.
isRValue()) {
6288 = (Method->getRefQualifier() ==
RQ_None);
6299 QualType ImplicitParamRecordType =
Method->getFunctionObjectParameterType();
6312 DestType =
Method->getThisType();
6315 FromRecordType = From->
getType();
6316 DestType = ImplicitParamRecordType;
6324 Method->getRefQualifier() !=
6342 <<
Method->getDeclName() << FromRecordType << (CVR - 1)
6344 Diag(
Method->getLocation(), diag::note_previous_decl)
6345 <<
Method->getDeclName();
6353 bool IsRValueQualified =
6357 << IsRValueQualified;
6358 Diag(
Method->getLocation(), diag::note_previous_decl)
6359 <<
Method->getDeclName();
6369 llvm_unreachable(
"Lists are not objects");
6372 return Diag(From->
getBeginLoc(), diag::err_member_function_call_bad_type)
6373 << ImplicitParamRecordType << FromRecordType
6382 From = FromRes.
get();
6391 CK = CK_AddressSpaceConversion;
6416 AllowedExplicit::Conversions,
6427 return AMDGPU().ExpandAMDGPUPredicateBuiltIn(From);
6500 llvm_unreachable(
"found a first conversion kind in Second");
6504 llvm_unreachable(
"found a third conversion kind in Second");
6510 llvm_unreachable(
"unknown conversion kind");
6520 [[maybe_unused]]
bool isCCEAllowedPreCXX11 =
6523 assert((S.
getLangOpts().CPlusPlus11 || isCCEAllowedPreCXX11) &&
6524 "converted constant expression outside C++11 or TTP matching");
6559 if (
T->isRecordType())
6568 diag::err_typecheck_converted_constant_expression)
6574 llvm_unreachable(
"bad conversion in converted constant expression");
6580 diag::err_typecheck_converted_constant_expression_disallowed)
6586 diag::err_typecheck_converted_constant_expression_indirect)
6596 diag::err_reference_bind_to_bitfield_in_cce)
6604 bool IsTemplateArgument =
6606 if (
T->isRecordType()) {
6607 assert(IsTemplateArgument &&
6608 "unexpected class type converted constant expr");
6624 IsTemplateArgument);
6631 bool ReturnPreNarrowingValue =
false;
6634 S.
Context,
Result.get(), PreNarrowingValue, PreNarrowingType,
6635 false, AllowRelaxedEval)) {
6645 PreNarrowingValue.
isInt()) {
6648 ReturnPreNarrowingValue =
true;
6674 << CCE << 0 << From->
getType() <<
T;
6679 if (!ReturnPreNarrowingValue)
6680 PreNarrowingValue = {};
6696 if (
Result.isInvalid() ||
Result.get()->isValueDependent()) {
6701 RequireInt, PreNarrowingValue);
6708 return ::BuildConvertedConstantExpression(*
this, From,
T, CCE, Dest,
6715 return ::CheckConvertedConstantExpression(*
this, From,
T,
Value, CCE,
false,
6720 llvm::APSInt &
Value,
6722 assert(
T->isIntegralOrEnumerationType() &&
"unexpected converted const type");
6727 if (!R.isInvalid() && !R.get()->isValueDependent())
6735 const APValue &PreNarrowingValue) {
6749 Kind = ConstantExprKind::ClassTemplateArgument;
6751 Kind = ConstantExprKind::NonClassTemplateArgument;
6753 Kind = ConstantExprKind::Normal;
6756 (RequireInt && !Eval.
Val.
isInt())) {
6765 if (Notes.empty() && !CantFold) {
6766 for (
auto &Info : MSWarning)
6767 Diag(Info.first, Info.second);
6770 if (
const auto *CE = dyn_cast<ConstantExpr>(E)) {
6774 "ConstantExpr has no value associated with it");
6780 Value = std::move(PreNarrowingValue);
6786 if (Notes.size() == 1 &&
6787 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6788 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6789 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6790 diag::note_constexpr_invalid_template_arg) {
6791 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6792 for (
unsigned I = 0; I < Notes.size(); ++I)
6793 Diag(Notes[I].first, Notes[I].second);
6797 for (
unsigned I = 0; I < Notes.size(); ++I)
6798 Diag(Notes[I].first, Notes[I].second);
6817static ImplicitConversionSequence
6825 AllowedExplicit::Conversions,
6867 "expected a member expression");
6869 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6870 M && !M->isImplicitAccess())
6871 Base = M->getBase();
6872 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6873 M && !M->isImplicitAccess())
6874 Base = M->getBase();
6878 if (
T->isPointerType())
6879 T =
T->getPointeeType();
6907 assert(Method->isExplicitObjectMemberFunction() &&
6908 "Method is not an explicit member function");
6909 assert(NewArgs.empty() &&
"NewArgs should be empty");
6911 NewArgs.reserve(Args.size() + 1);
6913 NewArgs.push_back(
This);
6914 NewArgs.append(Args.begin(), Args.end());
6917 Method,
Object->getBeginLoc());
6923 return AllowScopedEnumerations ?
T->isIntegralOrEnumerationType()
6924 :
T->isIntegralOrUnscopedEnumerationType();
6936 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6950 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6958 std::string TypeStr;
6963 "static_cast<" + TypeStr +
">(")
6975 HadMultipleCandidates);
6982 From,
Result.get()->getType());
7008 HadMultipleCandidates);
7013 CK_UserDefinedConversion,
Result.get(),
7014 nullptr,
Result.get()->getValueKind(),
7039 if (
auto *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)) {
7041 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
7047 Conv, FoundDecl, ActingContext, From, ToType, CandidateSet,
7081 From = result.
get();
7087 From = Converted.
isUsable() ? Converted.
get() :
nullptr;
7096 const RecordType *RecordTy =
T->getAsCanonical<RecordType>();
7109 : Converter(Converter), From(From) {}
7114 } IncompleteDiagnoser(Converter, From);
7125 ->getDefinitionOrSelf()
7126 ->getVisibleConversionFunctions();
7128 bool HadMultipleCandidates =
7133 bool HasUniqueTargetType =
true;
7149 "Conversion operator templates are considered potentially "
7153 if (Converter.
match(CurToType) || ConvTemplate) {
7159 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
7164 else if (HasUniqueTargetType &&
7166 HasUniqueTargetType =
false;
7168 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
7186 HadMultipleCandidates,
7187 ExplicitConversions))
7193 if (!HasUniqueTargetType)
7212 HadMultipleCandidates,
Found))
7221 HadMultipleCandidates,
7222 ExplicitConversions))
7230 switch (ViableConversions.
size()) {
7233 HadMultipleCandidates,
7234 ExplicitConversions))
7244 HadMultipleCandidates,
Found))
7275 if (Proto->getNumParams() < 1)
7279 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
7280 if (Context.hasSameUnqualifiedType(T1, ArgType))
7284 if (Proto->getNumParams() < 2)
7288 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
7289 if (Context.hasSameUnqualifiedType(T2, ArgType))
7308 unsigned SeenAt = 0;
7310 bool HasDefault =
false;
7319 return HasDefault || SeenAt != 0;
7325 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
7328 bool StrictPackMatch) {
7331 assert(Proto &&
"Functions without a prototype cannot be overloaded");
7332 assert(!
Function->getDescribedFunctionTemplate() &&
7333 "Use AddTemplateOverloadCandidate for function templates");
7346 CandidateSet, SuppressUserConversions,
7347 PartialOverloading, EarlyConversions, PO,
7383 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
7397 Candidate.
Viable =
false;
7410 bool IsImplicitlyInstantiated =
false;
7411 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo()) {
7412 ND = SpecInfo->getTemplate();
7413 IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() ==
7424 const bool IsInlineFunctionInGMF =
7426 (IsImplicitlyInstantiated ||
Function->isInlined());
7431 const bool IsCurrentUnitGMFDecl =
7432 Function->isFromGlobalModule() && CurrentModule &&
7433 Function->getOwningModule()->getTopLevelModule() ==
7437 !IsCurrentUnitGMFDecl) {
7438 Candidate.
Viable =
false;
7445 Candidate.
Viable =
false;
7456 if (Args.size() == 1 &&
Constructor->isSpecializationCopyingObject() &&
7457 (
Context.hasSameUnqualifiedType(ClassType, Args[0]->getType()) ||
7460 Candidate.
Viable =
false;
7472 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.
getDecl());
7473 if (Shadow && Args.size() == 1 &&
Constructor->getNumParams() >= 1 &&
7474 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
7481 Candidate.
Viable =
false;
7490 Constructor->getMethodQualifiers().getAddressSpace(),
7492 Candidate.
Viable =
false;
7505 Candidate.
Viable =
false;
7515 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7516 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7517 !PartialOverloading) {
7519 Candidate.
Viable =
false;
7533 Candidate.
Viable =
false;
7539 if (
Function->getTrailingRequiresClause()) {
7544 Candidate.
Viable =
false;
7553 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7556 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7559 }
else if (ArgIdx < NumParams) {
7570 Args[ArgIdx]->
getType().getAddressSpace() ==
7572 Diag(Args[ArgIdx]->getBeginLoc(), diag::warn_hlsl_groupshared_inout);
7575 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7578 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7580 Candidate.
Viable =
false;
7592 if (EnableIfAttr *FailedAttr =
7594 Candidate.
Viable =
false;
7604 if (Methods.size() <= 1)
7607 for (
unsigned b = 0, e = Methods.size(); b < e; b++) {
7613 if (
Method->param_size() > NumNamedArgs)
7614 NumNamedArgs =
Method->param_size();
7615 if (Args.size() < NumNamedArgs)
7618 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7620 if (Args[i]->isTypeDependent()) {
7626 Expr *argExpr = Args[i];
7627 assert(argExpr &&
"SelectBestMethod(): missing expression");
7632 !param->
hasAttr<CFConsumedAttr>())
7633 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7650 if (ConversionState.
isBad() ||
7660 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7661 if (Args[i]->isTypeDependent()) {
7674 if (Args.size() != NumNamedArgs)
7676 else if (
Match && NumNamedArgs == 0 && Methods.size() > 1) {
7679 for (
unsigned b = 0, e = Methods.size(); b < e; b++) {
7680 QualType ReturnT = Methods[b]->getReturnType();
7700 "Shouldn't have `this` for ctors!");
7701 assert(!Method->isStatic() &&
"Shouldn't have `this` for static methods!");
7703 ThisArg, std::nullopt, Method, Method);
7706 ConvertedThis = R.get();
7708 if (
auto *MD = dyn_cast<CXXMethodDecl>(Function)) {
7710 assert((MissingImplicitThis || MD->isStatic() ||
7712 "Expected `this` for non-ctor instance methods");
7714 ConvertedThis =
nullptr;
7719 unsigned ArgSizeNoVarargs = std::min(Function->param_size(), Args.size());
7722 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7725 S.
Context, Function->getParamDecl(I)),
7731 ConvertedArgs.push_back(R.get());
7738 if (!Function->isVariadic() && Args.size() < Function->getNumParams()) {
7739 for (
unsigned i = Args.size(), e = Function->getNumParams(); i != e; ++i) {
7746 ConvertedArgs.push_back(R.get());
7758 bool MissingImplicitThis) {
7759 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7760 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7766 llvm::scope_exit UndelayDiags(
7768 DelayedDiagnostics.popUndelayed(CurrentState);
7772 Expr *DiscardedThis;
7774 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7775 true, DiscardedThis, ConvertedArgs))
7776 return *EnableIfAttrs.begin();
7778 for (
auto *EIA : EnableIfAttrs) {
7782 if (EIA->getCond()->isValueDependent() ||
7783 !EIA->getCond()->EvaluateWithSubstitution(
7787 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7793template <
typename CheckFn>
7796 CheckFn &&IsSuccessful) {
7799 if (ArgDependent == DIA->getArgDependent())
7800 Attrs.push_back(DIA);
7807 auto WarningBegin = std::stable_partition(
7808 Attrs.begin(), Attrs.end(), [](
const DiagnoseIfAttr *DIA) {
7809 return DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_error &&
7810 DIA->getWarningGroup().empty();
7815 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7817 if (ErrAttr != WarningBegin) {
7818 const DiagnoseIfAttr *DIA = *ErrAttr;
7819 S.
Diag(Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7820 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7821 << DIA->getParent() << DIA->getCond()->getSourceRange();
7825 auto ToSeverity = [](DiagnoseIfAttr::DefaultSeverity Sev) {
7827 case DiagnoseIfAttr::DS_warning:
7829 case DiagnoseIfAttr::DS_error:
7832 llvm_unreachable(
"Fully covered switch above!");
7835 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7836 if (IsSuccessful(DIA)) {
7837 if (DIA->getWarningGroup().empty() &&
7838 DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_warning) {
7839 S.
Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7840 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7841 << DIA->getParent() << DIA->getCond()->getSourceRange();
7844 DIA->getWarningGroup());
7847 {ToSeverity(DIA->getDefaultSeverity()),
"%0",
7849 S.
Diag(Loc, DiagID) << DIA->getMessage();
7857 const Expr *ThisArg,
7862 [&](
const DiagnoseIfAttr *DIA) {
7867 if (!DIA->getCond()->EvaluateWithSubstitution(
7870 return Result.isInt() &&
Result.getInt().getBoolValue();
7877 *
this, ND,
false, Loc,
7878 [&](
const DiagnoseIfAttr *DIA) {
7880 return DIA->getCond()->EvaluateAsBooleanCondition(
Result,
Context) &&
7889 bool SuppressUserConversions,
7890 bool PartialOverloading,
7891 bool FirstArgumentIsBase) {
7903 if (Args.size() > 0) {
7904 if (
Expr *E = Args[0]) {
7914 FunctionArgs = Args.slice(1);
7918 FunTmpl, F.getPair(),
7920 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7921 FunctionArgs, CandidateSet, SuppressUserConversions,
7922 PartialOverloading);
7926 ObjectClassification, FunctionArgs, CandidateSet,
7927 SuppressUserConversions, PartialOverloading);
7934 if (Args.size() > 0 &&
7938 FunctionArgs = Args.slice(1);
7942 ExplicitTemplateArgs, FunctionArgs,
7943 CandidateSet, SuppressUserConversions,
7944 PartialOverloading);
7947 SuppressUserConversions, PartialOverloading);
7957 bool SuppressUserConversions,
7967 "Expected a member function template");
7969 nullptr, ObjectType,
7970 ObjectClassification, Args, CandidateSet,
7971 SuppressUserConversions,
false, PO);
7974 ObjectType, ObjectClassification, Args, CandidateSet,
7975 SuppressUserConversions,
false, {}, PO);
7988 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7990 "Use AddOverloadCandidate for constructors");
7999 Method->isMoveAssignmentOperator())
8006 bool IgnoreExplicitObject =
8007 (
Method->isExplicitObjectMemberFunction() &&
8010 bool ImplicitObjectMethodTreatedAsStatic =
8013 Method->isImplicitObjectMemberFunction();
8015 unsigned ExplicitOffset =
8016 !IgnoreExplicitObject &&
Method->isExplicitObjectMemberFunction() ? 1 : 0;
8018 unsigned NumParams =
Method->getNumParams() - ExplicitOffset +
8019 int(ImplicitObjectMethodTreatedAsStatic);
8021 unsigned ExtraArgs =
8028 CandidateSet.
addCandidate(Args.size() + ExtraArgs, EarlyConversions);
8044 Candidate.
Viable =
false;
8054 unsigned MinRequiredArgs =
Method->getMinRequiredArguments() -
8056 int(ImplicitObjectMethodTreatedAsStatic);
8058 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
8060 Candidate.
Viable =
false;
8068 if (!IgnoreExplicitObject) {
8071 else if (
Method->isStatic()) {
8081 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
8086 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8087 Method, ActingContext,
true);
8088 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
8089 Candidate.
Viable =
false;
8100 Candidate.
Viable =
false;
8105 if (
Method->getTrailingRequiresClause()) {
8110 Candidate.
Viable =
false;
8118 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
8121 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
8124 }
else if (ArgIdx < NumParams) {
8130 if (ImplicitObjectMethodTreatedAsStatic) {
8131 ParamType = ArgIdx == 0
8132 ?
Method->getFunctionObjectParameterReferenceType()
8135 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
8139 SuppressUserConversions,
8144 Candidate.
Viable =
false;
8156 if (EnableIfAttr *FailedAttr =
8158 Candidate.
Viable =
false;
8165 Candidate.
Viable =
false;
8176 bool SuppressUserConversions,
bool PartialOverloading,
8194 PartialOverloading,
false,
8195 false, ObjectType, ObjectClassification,
8199 bool OnlyInitializeNonUserDefinedConversions) {
8200 return S.CheckNonDependentConversions(
8201 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
8202 Sema::CheckNonDependentConversionsFlag(
8203 SuppressUserConversions,
8204 OnlyInitializeNonUserDefinedConversions),
8205 ActingContext, ObjectType, ObjectClassification, PO);
8209 CandidateSet.
addCandidate(Conversions.size(), Conversions);
8212 Candidate.
Viable =
false;
8221 Method->isStatic() ||
8222 (!Method->isExplicitObjectMemberFunction() && ObjectType.
isNull());
8236 assert(
Specialization &&
"Missing member function template specialization?");
8238 "Specialization is not a member function?");
8241 ObjectClassification, Args, CandidateSet, SuppressUserConversions,
8255 if (ExplicitTemplateArgs ||
8258 *
this, CandidateSet, MethodTmpl, FoundDecl, ActingContext,
8259 ExplicitTemplateArgs, ObjectType, ObjectClassification, Args,
8260 SuppressUserConversions, PartialOverloading, PO);
8265 MethodTmpl, FoundDecl, ActingContext, ObjectType, ObjectClassification,
8266 Args, SuppressUserConversions, PartialOverloading, PO);
8284 bool SuppressUserConversions,
bool PartialOverloading,
bool AllowExplicit,
8286 bool AggregateCandidateDeduction) {
8295 Candidate.
Viable =
false;
8315 PartialOverloading, AggregateCandidateDeduction,
8322 bool OnlyInitializeNonUserDefinedConversions) {
8323 return S.CheckNonDependentConversions(
8324 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
8325 Sema::CheckNonDependentConversionsFlag(
8326 SuppressUserConversions,
8327 OnlyInitializeNonUserDefinedConversions),
8328 nullptr, QualType(), {}, PO);
8331 OverloadCandidate &Candidate =
8332 CandidateSet.addCandidate(Conversions.size(), Conversions);
8335 Candidate.
Viable =
false;
8337 CandidateSet.getRewriteInfo().getRewriteKind(Candidate.
Function, PO);
8343 CandidateSet.getKind() ==
8349 ->isExplicitObjectMemberFunction() &&
8365 assert(
Specialization &&
"Missing function template specialization?");
8367 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
8368 PartialOverloading, AllowExplicit,
8369 false, IsADLCandidate, Conversions, PO,
8370 Info.AggregateDeductionCandidateHasMismatchedArity,
8371 Info.hasStrictPackMatch());
8378 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
8385 if (ExplicitTemplateArgs ||
8388 DependentExplicitSpecifier)) {
8392 Args, SuppressUserConversions, PartialOverloading, AllowExplicit,
8393 IsADLCandidate, PO, AggregateCandidateDeduction);
8395 if (DependentExplicitSpecifier)
8402 PartialOverloading, AllowExplicit, IsADLCandidate, PO,
8403 AggregateCandidateDeduction);
8416 const bool AllowExplicit =
false;
8418 bool ForOverloadSetAddressResolution =
8421 auto *
Method = dyn_cast<CXXMethodDecl>(FD);
8422 bool HasThisConversion = !ForOverloadSetAddressResolution &&
Method &&
8424 unsigned ThisConversions = HasThisConversion ? 1 : 0;
8440 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
8441 !ParamTypes[0]->isDependentType()) {
8443 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8444 Method, ActingContext,
true,
8445 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
8455 auto MaybeInvolveUserDefinedConversion = [&](
QualType ParamType,
8479 if (
auto *RD =
ArgType->getAsCXXRecordDecl();
8480 RD && RD->hasDefinition() &&
8481 !RD->getVisibleConversionFunctions().empty())
8488 HasThisConversion &&
Method->hasCXXExplicitFunctionObjectParameter() ? 1
8491 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
8493 QualType ParamType = ParamTypes[I + Offset];
8497 ConvIdx = Args.size() - 1 - I;
8498 assert(Args.size() + ThisConversions == 2 &&
8499 "number of args (including 'this') must be exactly 2 for "
8503 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
8506 ConvIdx = ThisConversions + I;
8511 MaybeInvolveUserDefinedConversion(ParamType, Args[I]->
getType()))
8540 bool AllowObjCPointerConversion) {
8548 bool ObjCLifetimeConversion;
8550 ObjCLifetimeConversion))
8555 if (!AllowObjCPointerConversion)
8559 bool IncompatibleObjC =
false;
8569 bool AllowExplicit,
bool AllowResultConversion,
bool StrictPackMatch) {
8571 "Conversion function templates use AddTemplateConversionCandidate");
8586 if (!AllowResultConversion &&
8598 AllowObjCConversionOnExplicit))
8620 if (!AllowExplicit && Conversion->
isExplicit()) {
8621 Candidate.
Viable =
false;
8648 Candidate.
Viable =
false;
8657 Candidate.
Viable =
false;
8668 QualType ToCanon =
Context.getCanonicalType(ToType).getUnqualifiedType();
8669 if (FromCanon == ToCanon ||
8671 Candidate.
Viable =
false;
8688 CK_FunctionToPointerDecay, &ConversionRef,
8693 Candidate.
Viable =
false;
8723 Candidate.
Viable =
false;
8735 Candidate.
Viable =
false;
8742 Candidate.
Viable =
false;
8748 "Can only end up with a standard conversion sequence or failure");
8751 if (EnableIfAttr *FailedAttr =
8753 Candidate.
Viable =
false;
8760 Candidate.
Viable =
false;
8769 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
8770 bool AllowResultConversion) {
8779 Candidate.
Viable =
false;
8796 Candidate.
Viable =
false;
8806 assert(
Specialization &&
"Missing function template specialization?");
8808 ToType, CandidateSet, AllowObjCConversionOnExplicit,
8809 AllowExplicit, AllowResultConversion,
8817 bool AllowExplicit,
bool AllowResultConversion) {
8819 "Only conversion function templates permitted here");
8830 ToType, AllowObjCConversionOnExplicit, AllowExplicit,
8831 AllowResultConversion);
8839 AllowObjCConversionOnExplicit, AllowExplicit, AllowResultConversion);
8878 if (ObjectInit.
isBad()) {
8879 Candidate.
Viable =
false;
8890 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8891 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8892 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8893 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8896 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8904 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8905 Candidate.
Viable =
false;
8912 if (Args.size() < NumParams) {
8914 Candidate.
Viable =
false;
8921 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8922 if (ArgIdx < NumParams) {
8935 Candidate.
Viable =
false;
8952 Candidate.
Viable =
false;
8958 if (EnableIfAttr *FailedAttr =
8960 Candidate.
Viable =
false;
8984 "unqualified operator lookup found a member function");
8988 FunctionArgs, CandidateSet);
8994 FunctionArgs[1], FunctionArgs[0]);
8996 Reversed, CandidateSet,
false,
false,
true,
8997 ADLCallKind::NotADL,
9001 if (ExplicitTemplateArgs)
9006 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
9007 false,
false,
true,
false, ADLCallKind::NotADL, {},
9039 if (!T1RD || (!IsComplete && !T1RD->isBeingDefined()))
9047 OperEnd = Operators.
end();
9048 Oper != OperEnd; ++Oper) {
9049 if (Oper->getAsFunction() &&
9052 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
9055 Args[0]->Classify(
Context), Args.slice(1),
9056 CandidateSet,
false, PO);
9063 bool IsAssignmentOperator,
9064 unsigned NumContextualBoolArguments) {
9079 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9092 if (ArgIdx < NumContextualBoolArguments) {
9093 assert(ParamTys[ArgIdx] ==
Context.BoolTy &&
9094 "Contextual conversion to bool requires bool type");
9100 ArgIdx == 0 && IsAssignmentOperator,
9106 Candidate.
Viable =
false;
9119class BuiltinCandidateTypeSet {
9125 TypeSet PointerTypes;
9129 TypeSet MemberPointerTypes;
9133 TypeSet EnumerationTypes;
9137 TypeSet VectorTypes;
9141 TypeSet MatrixTypes;
9144 TypeSet BitIntTypes;
9147 bool HasNonRecordTypes;
9151 bool HasArithmeticOrEnumeralTypes;
9155 bool HasNullPtrType;
9164 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
9166 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
9170 typedef TypeSet::iterator
iterator;
9172 BuiltinCandidateTypeSet(
Sema &SemaRef)
9173 : HasNonRecordTypes(
false),
9174 HasArithmeticOrEnumeralTypes(
false),
9175 HasNullPtrType(
false),
9177 Context(SemaRef.Context) { }
9179 void AddTypesConvertedFrom(
QualType Ty,
9181 bool AllowUserConversions,
9182 bool AllowExplicitConversions,
9183 const Qualifiers &VisibleTypeConversionsQuals);
9185 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
9186 llvm::iterator_range<iterator> member_pointer_types() {
9187 return MemberPointerTypes;
9189 llvm::iterator_range<iterator> enumeration_types() {
9190 return EnumerationTypes;
9192 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
9193 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
9194 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
9196 bool containsMatrixType(QualType Ty)
const {
return MatrixTypes.count(Ty); }
9197 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
9198 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
9199 bool hasNullPtrType()
const {
return HasNullPtrType; }
9214BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(QualType Ty,
9215 const Qualifiers &VisibleQuals) {
9218 if (!PointerTypes.insert(Ty))
9222 const PointerType *PointerTy = Ty->
getAs<PointerType>();
9223 bool buildObjCPtr =
false;
9225 const ObjCObjectPointerType *PTy = Ty->
castAs<ObjCObjectPointerType>();
9227 buildObjCPtr =
true;
9239 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
9245 if ((CVR | BaseCVR) != CVR)
continue;
9260 QualType QPointerTy;
9267 PointerTypes.insert(QPointerTy);
9283BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
9286 if (!MemberPointerTypes.insert(Ty))
9289 const MemberPointerType *PointerTy = Ty->
getAs<MemberPointerType>();
9290 assert(PointerTy &&
"type was not a member pointer type!");
9305 if ((CVR | BaseCVR) != CVR)
continue;
9309 QPointeeTy, std::nullopt, Cls));
9324BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty,
9326 bool AllowUserConversions,
9327 bool AllowExplicitConversions,
9328 const Qualifiers &VisibleQuals) {
9334 if (
const ReferenceType *RefTy = Ty->
getAs<ReferenceType>())
9339 Ty = SemaRef.Context.getArrayDecayedType(Ty);
9346 HasNonRecordTypes = HasNonRecordTypes || !TyIsRec;
9349 HasArithmeticOrEnumeralTypes =
9353 PointerTypes.insert(Ty);
9354 else if (Ty->
getAs<PointerType>() || Ty->
getAs<ObjCObjectPointerType>()) {
9357 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
9361 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
9364 HasArithmeticOrEnumeralTypes =
true;
9365 EnumerationTypes.insert(Ty);
9367 HasArithmeticOrEnumeralTypes =
true;
9368 BitIntTypes.insert(Ty);
9372 HasArithmeticOrEnumeralTypes =
true;
9373 VectorTypes.insert(Ty);
9377 HasArithmeticOrEnumeralTypes =
true;
9378 MatrixTypes.insert(Ty);
9380 HasNullPtrType =
true;
9381 }
else if (AllowUserConversions && TyIsRec) {
9383 if (!SemaRef.isCompleteType(Loc, Ty))
9387 for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) {
9397 if (AllowExplicitConversions || !Conv->
isExplicit()) {
9445 ClassDecl = RHSMPType->getMostRecentCXXRecordDecl();
9493 if (Available.hasAtomic()) {
9494 Available.removeAtomic();
9501 if (Available.hasVolatile()) {
9502 Available.removeVolatile();
9536class BuiltinOperatorOverloadBuilder {
9539 ArrayRef<Expr *> Args;
9540 QualifiersAndAtomic VisibleTypeConversionsQuals;
9541 bool HasArithmeticOrEnumeralCandidateType;
9542 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes;
9543 OverloadCandidateSet &CandidateSet;
9545 static constexpr int ArithmeticTypesCap = 26;
9546 SmallVector<CanQualType, ArithmeticTypesCap> ArithmeticTypes;
9551 unsigned FirstIntegralType,
9553 unsigned FirstPromotedIntegralType,
9554 LastPromotedIntegralType;
9555 unsigned FirstPromotedArithmeticType,
9556 LastPromotedArithmeticType;
9557 unsigned NumArithmeticTypes;
9559 void InitArithmeticTypes() {
9561 FirstPromotedArithmeticType = 0;
9571 FirstIntegralType = ArithmeticTypes.size();
9572 FirstPromotedIntegralType = ArithmeticTypes.size();
9594 llvm::SmallSetVector<CanQualType, 2> BitIntCandidates;
9595 for (BuiltinCandidateTypeSet &Candidate : CandidateTypes) {
9596 for (QualType BitTy : Candidate.bitint_types())
9599 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
9600 LastPromotedIntegralType = ArithmeticTypes.size();
9601 LastPromotedArithmeticType = ArithmeticTypes.size();
9615 LastIntegralType = ArithmeticTypes.size();
9616 NumArithmeticTypes = ArithmeticTypes.size();
9623 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
9624 ArithmeticTypesCap &&
9625 "Enough inline storage for all arithmetic types.");
9630 void addPlusPlusMinusMinusStyleOverloads(QualType CandidateTy,
9633 QualType ParamTypes[2] = {
9673 void AddCandidate(QualType L, QualType R) {
9674 QualType LandR[2] = {L,
R};
9679 BuiltinOperatorOverloadBuilder(
9680 Sema &S, ArrayRef<Expr *> Args,
9681 QualifiersAndAtomic VisibleTypeConversionsQuals,
9682 bool HasArithmeticOrEnumeralCandidateType,
9683 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes,
9684 OverloadCandidateSet &CandidateSet)
9686 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
9687 HasArithmeticOrEnumeralCandidateType(
9688 HasArithmeticOrEnumeralCandidateType),
9689 CandidateTypes(CandidateTypes),
9690 CandidateSet(CandidateSet) {
9692 InitArithmeticTypes();
9715 if (!HasArithmeticOrEnumeralCandidateType)
9718 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9719 const auto TypeOfT = ArithmeticTypes[Arith];
9721 if (Op == OO_MinusMinus)
9723 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9726 addPlusPlusMinusMinusStyleOverloads(
9743 void addPlusPlusMinusMinusPointerOverloads() {
9744 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
9746 if (!PtrTy->getPointeeType()->isObjectType())
9749 addPlusPlusMinusMinusStyleOverloads(
9751 (!PtrTy.isVolatileQualified() &&
9753 (!PtrTy.isRestrictQualified() &&
9768 void addUnaryStarPointerOverloads() {
9769 for (QualType ParamTy : CandidateTypes[0].pointer_types()) {
9774 if (
const FunctionProtoType *Proto =PointeeTy->
getAs<FunctionProtoType>())
9775 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9788 void addUnaryPlusOrMinusArithmeticOverloads() {
9789 if (!HasArithmeticOrEnumeralCandidateType)
9792 for (
unsigned Arith = FirstPromotedArithmeticType;
9793 Arith < LastPromotedArithmeticType; ++Arith) {
9794 QualType ArithTy = ArithmeticTypes[Arith];
9799 for (QualType VecTy : CandidateTypes[0].vector_types())
9808 void addUnaryPlusPointerOverloads() {
9809 for (QualType ParamTy : CandidateTypes[0].pointer_types())
9818 void addUnaryTildePromotedIntegralOverloads() {
9819 if (!HasArithmeticOrEnumeralCandidateType)
9822 for (
unsigned Int = FirstPromotedIntegralType;
9823 Int < LastPromotedIntegralType; ++
Int) {
9824 QualType IntTy = ArithmeticTypes[
Int];
9829 for (QualType VecTy : CandidateTypes[0].vector_types())
9839 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9841 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9843 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9844 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9849 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9853 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9855 if (AddedTypes.insert(NullPtrTy).second) {
9856 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9875 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9888 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9889 UserDefinedBinaryOperators;
9891 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9892 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9894 CEnd = CandidateSet.
end();
9896 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9899 if (
C->Function->isFunctionTemplateSpecialization())
9906 QualType FirstParamType =
C->Function->getParamDecl(
Reversed ? 1 : 0)
9908 .getUnqualifiedType();
9909 QualType SecondParamType =
C->Function->getParamDecl(
Reversed ? 0 : 1)
9911 .getUnqualifiedType();
9919 UserDefinedBinaryOperators.insert(
9927 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9929 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9930 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9934 if (IsSpaceship && PtrTy->isFunctionPointerType())
9937 QualType ParamTypes[2] = {PtrTy, PtrTy};
9940 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9945 if (!AddedTypes.insert(CanonType).second ||
9946 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9949 QualType ParamTypes[2] = {EnumTy, EnumTy};
9974 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9976 for (
int Arg = 0; Arg < 2; ++Arg) {
9977 QualType AsymmetricParamTypes[2] = {
9981 for (QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9986 AsymmetricParamTypes[Arg] = PtrTy;
9987 if (Arg == 0 || Op == OO_Plus) {
9992 if (Op == OO_Minus) {
9997 QualType ParamTypes[2] = {PtrTy, PtrTy};
10033 void addGenericBinaryArithmeticOverloads() {
10034 if (!HasArithmeticOrEnumeralCandidateType)
10037 for (
unsigned Left = FirstPromotedArithmeticType;
10038 Left < LastPromotedArithmeticType; ++
Left) {
10039 for (
unsigned Right = FirstPromotedArithmeticType;
10040 Right < LastPromotedArithmeticType; ++
Right) {
10041 QualType LandR[2] = { ArithmeticTypes[
Left],
10042 ArithmeticTypes[
Right] };
10049 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10050 for (QualType Vec2Ty : CandidateTypes[1].vector_types()) {
10051 QualType LandR[2] = {Vec1Ty, Vec2Ty};
10061 void addMatrixBinaryArithmeticOverloads() {
10062 if (!HasArithmeticOrEnumeralCandidateType)
10065 for (QualType M1 : CandidateTypes[0].matrix_types()) {
10067 AddCandidate(M1, M1);
10070 for (QualType M2 : CandidateTypes[1].matrix_types()) {
10072 if (!CandidateTypes[0].containsMatrixType(M2))
10073 AddCandidate(M2, M2);
10108 void addThreeWayArithmeticOverloads() {
10109 addGenericBinaryArithmeticOverloads();
10126 void addBinaryBitwiseArithmeticOverloads() {
10127 if (!HasArithmeticOrEnumeralCandidateType)
10130 for (
unsigned Left = FirstPromotedIntegralType;
10131 Left < LastPromotedIntegralType; ++
Left) {
10132 for (
unsigned Right = FirstPromotedIntegralType;
10133 Right < LastPromotedIntegralType; ++
Right) {
10134 QualType LandR[2] = { ArithmeticTypes[
Left],
10135 ArithmeticTypes[
Right] };
10148 void addAssignmentMemberPointerOrEnumeralOverloads() {
10150 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10152 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10153 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10160 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10185 void addAssignmentPointerOverloads(
bool isEqualOp) {
10187 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10189 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10193 else if (!PtrTy->getPointeeType()->isObjectType())
10197 QualType ParamTypes[2] = {
10204 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10206 if (NeedVolatile) {
10214 if (!PtrTy.isRestrictQualified() &&
10222 if (NeedVolatile) {
10234 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10239 QualType ParamTypes[2] = {
10248 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10250 if (NeedVolatile) {
10258 if (!PtrTy.isRestrictQualified() &&
10266 if (NeedVolatile) {
10291 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
10292 if (!HasArithmeticOrEnumeralCandidateType)
10295 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
10296 for (
unsigned Right = FirstPromotedArithmeticType;
10297 Right < LastPromotedArithmeticType; ++
Right) {
10298 QualType ParamTypes[2];
10299 ParamTypes[1] = ArithmeticTypes[
Right];
10301 S, ArithmeticTypes[Left], Args[0]);
10304 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10314 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10315 for (QualType Vec2Ty : CandidateTypes[0].vector_types()) {
10316 QualType ParamTypes[2];
10317 ParamTypes[1] = Vec2Ty;
10345 void addAssignmentIntegralOverloads() {
10346 if (!HasArithmeticOrEnumeralCandidateType)
10349 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
10350 for (
unsigned Right = FirstPromotedIntegralType;
10351 Right < LastPromotedIntegralType; ++
Right) {
10352 QualType ParamTypes[2];
10353 ParamTypes[1] = ArithmeticTypes[
Right];
10355 S, ArithmeticTypes[Left], Args[0]);
10358 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10374 void addExclaimOverload() {
10380 void addAmpAmpOrPipePipeOverload() {
10397 void addSubscriptOverloads() {
10398 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10408 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10428 void addArrowStarOverloads() {
10429 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10430 QualType C1Ty = PtrTy;
10432 QualifierCollector Q1;
10443 for (QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
10450 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
10453 if (!VisibleTypeConversionsQuals.
hasVolatile() &&
10454 T.isVolatileQualified())
10456 if (!VisibleTypeConversionsQuals.
hasRestrict() &&
10457 T.isRestrictQualified())
10475 void addConditionalOperatorOverloads() {
10477 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10479 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10480 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
10484 QualType ParamTypes[2] = {PtrTy, PtrTy};
10488 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10492 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
10497 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10498 if (!EnumTy->castAsCanonical<EnumType>()->getDecl()->isScoped())
10504 QualType ParamTypes[2] = {EnumTy, EnumTy};
10523 VisibleTypeConversionsQuals.
addConst();
10524 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10526 if (Args[ArgIdx]->
getType()->isAtomicType())
10527 VisibleTypeConversionsQuals.
addAtomic();
10530 bool HasNonRecordCandidateType =
false;
10531 bool HasArithmeticOrEnumeralCandidateType =
false;
10533 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10534 CandidateTypes.emplace_back(*
this);
10535 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->
getType(),
10538 (Op == OO_Exclaim ||
10540 Op == OO_PipePipe),
10541 VisibleTypeConversionsQuals);
10542 HasNonRecordCandidateType = HasNonRecordCandidateType ||
10543 CandidateTypes[ArgIdx].hasNonRecordTypes();
10544 HasArithmeticOrEnumeralCandidateType =
10545 HasArithmeticOrEnumeralCandidateType ||
10546 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
10554 if (!HasNonRecordCandidateType &&
10555 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
10559 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
10560 VisibleTypeConversionsQuals,
10561 HasArithmeticOrEnumeralCandidateType,
10562 CandidateTypes, CandidateSet);
10568 llvm_unreachable(
"Expected an overloaded operator");
10573 case OO_Array_Delete:
10576 "Special operators don't use AddBuiltinOperatorCandidates");
10588 if (Args.size() == 1)
10589 OpBuilder.addUnaryPlusPointerOverloads();
10593 if (Args.size() == 1) {
10594 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
10596 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
10597 OpBuilder.addGenericBinaryArithmeticOverloads();
10598 OpBuilder.addMatrixBinaryArithmeticOverloads();
10603 if (Args.size() == 1)
10604 OpBuilder.addUnaryStarPointerOverloads();
10606 OpBuilder.addGenericBinaryArithmeticOverloads();
10607 OpBuilder.addMatrixBinaryArithmeticOverloads();
10612 OpBuilder.addGenericBinaryArithmeticOverloads();
10616 case OO_MinusMinus:
10617 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
10618 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
10621 case OO_EqualEqual:
10622 case OO_ExclaimEqual:
10623 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
10624 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10625 OpBuilder.addGenericBinaryArithmeticOverloads();
10631 case OO_GreaterEqual:
10632 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10633 OpBuilder.addGenericBinaryArithmeticOverloads();
10637 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
10638 OpBuilder.addThreeWayArithmeticOverloads();
10645 case OO_GreaterGreater:
10646 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10650 if (Args.size() == 1)
10656 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10660 OpBuilder.addUnaryTildePromotedIntegralOverloads();
10664 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
10668 case OO_MinusEqual:
10669 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
10673 case OO_SlashEqual:
10674 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
10677 case OO_PercentEqual:
10678 case OO_LessLessEqual:
10679 case OO_GreaterGreaterEqual:
10681 case OO_CaretEqual:
10683 OpBuilder.addAssignmentIntegralOverloads();
10687 OpBuilder.addExclaimOverload();
10692 OpBuilder.addAmpAmpOrPipePipeOverload();
10696 if (Args.size() == 2)
10697 OpBuilder.addSubscriptOverloads();
10701 OpBuilder.addArrowStarOverloads();
10704 case OO_Conditional:
10705 OpBuilder.addConditionalOperatorOverloads();
10706 OpBuilder.addGenericBinaryArithmeticOverloads();
10717 bool PartialOverloading) {
10734 CandEnd = CandidateSet.
end();
10735 Cand != CandEnd; ++Cand)
10736 if (Cand->Function) {
10740 Fns.
erase(FunTmpl);
10749 if (ExplicitTemplateArgs)
10753 FD, FoundDecl, Args, CandidateSet,
false,
10754 PartialOverloading,
true,
10755 false, ADLCallKind::UsesADL);
10758 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10759 false, PartialOverloading,
10766 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10767 false, PartialOverloading,
10768 true, ADLCallKind::UsesADL);
10770 *
this, Args, FTD->getTemplatedDecl())) {
10774 if (ReversedArgs.empty())
10778 FTD, FoundDecl, ExplicitTemplateArgs, ReversedArgs, CandidateSet,
10779 false, PartialOverloading,
10780 true, ADLCallKind::UsesADL,
10805 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10806 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10807 if (!Cand1Attr || !Cand2Attr) {
10808 if (Cand1Attr == Cand2Attr)
10809 return Comparison::Equal;
10810 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10816 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10817 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10818 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10819 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10824 return Comparison::Worse;
10826 return Comparison::Better;
10831 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10832 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10833 if (Cand1ID != Cand2ID)
10834 return Comparison::Worse;
10837 return Comparison::Equal;
10845 return Comparison::Equal;
10851 return Comparison::Equal;
10852 return Comparison::Worse;
10855 return Comparison::Better;
10861 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10862 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10864 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10865 return Comparison::Equal;
10867 if (Cand1CPUDisp && !Cand2CPUDisp)
10868 return Comparison::Better;
10869 if (Cand2CPUDisp && !Cand1CPUDisp)
10870 return Comparison::Worse;
10872 if (Cand1CPUSpec && Cand2CPUSpec) {
10873 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10874 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10875 ? Comparison::Better
10876 : Comparison::Worse;
10878 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10879 FirstDiff = std::mismatch(
10880 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10881 Cand2CPUSpec->cpus_begin(),
10883 return LHS->getName() == RHS->getName();
10886 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10887 "Two different cpu-specific versions should not have the same "
10888 "identifier list, otherwise they'd be the same decl!");
10889 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->getName()
10890 ? Comparison::Better
10891 : Comparison::Worse;
10893 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10899static std::optional<QualType>
10902 return std::nullopt;
10908 return M->getFunctionObjectParameterReferenceType();
10922 PT2->getInstantiatedFromMemberTemplate()))
10933 assert(I < F->getNumParams());
10940 if (F1NumParams != F2NumParams)
10943 unsigned I1 = 0, I2 = 0;
10944 for (
unsigned I = 0; I != F1NumParams; ++I) {
10945 QualType T1 = NextParam(F1, I1, I == 0);
10946 QualType T2 = NextParam(F2, I2, I == 0);
10947 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10948 if (!Context.hasSameUnqualifiedType(T1, T2))
10961 bool IsFn1Reversed,
10962 bool IsFn2Reversed) {
10963 assert(Fn1 && Fn2);
10968 IsFn1Reversed ^ IsFn2Reversed))
10971 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10972 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10973 if (Mem1 && Mem2) {
10976 if (Mem1->getParent() != Mem2->getParent())
10980 if (Mem1->isInstance() && Mem2->isInstance() &&
10982 Mem1->getFunctionObjectParameterReferenceType(),
10983 Mem2->getFunctionObjectParameterReferenceType()))
10989static FunctionDecl *
10991 bool IsFn1Reversed,
bool IsFn2Reversed) {
11001 if (Cand1IsSpecialization || Cand2IsSpecialization)
11018 bool PartialOverloading) {
11064 bool IsCand1ImplicitHD =
11066 bool IsCand2ImplicitHD =
11081 auto EmitThreshold =
11082 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
11083 (IsCand1ImplicitHD || IsCand2ImplicitHD))
11086 auto Cand1Emittable = P1 > EmitThreshold;
11087 auto Cand2Emittable = P2 > EmitThreshold;
11088 if (Cand1Emittable && !Cand2Emittable)
11090 if (!Cand1Emittable && Cand2Emittable)
11101 unsigned StartArg = 0;
11109 return ICS.isStandard() &&
11121 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
11122 bool HasBetterConversion =
false;
11123 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11124 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
11125 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
11126 if (Cand1Bad != Cand2Bad) {
11129 HasBetterConversion =
true;
11133 if (HasBetterConversion)
11140 bool HasWorseConversion =
false;
11141 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11147 HasBetterConversion =
true;
11166 HasWorseConversion =
true;
11181 if (HasBetterConversion && !HasWorseConversion)
11232 bool Cand1IsSpecialization = Cand1.
Function &&
11234 bool Cand2IsSpecialization = Cand2.
Function &&
11236 if (Cand1IsSpecialization != Cand2IsSpecialization)
11237 return Cand2IsSpecialization;
11243 if (Cand1IsSpecialization && Cand2IsSpecialization) {
11244 const auto *Obj1Context =
11246 const auto *Obj2Context =
11275 bool Cand1IsInherited =
11277 bool Cand2IsInherited =
11279 if (Cand1IsInherited != Cand2IsInherited)
11280 return Cand2IsInherited;
11281 else if (Cand1IsInherited) {
11282 assert(Cand2IsInherited);
11285 if (Cand1Class->isDerivedFrom(Cand2Class))
11287 if (Cand2Class->isDerivedFrom(Cand1Class))
11304 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
11305 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
11306 if (Guide1 && Guide2) {
11308 if (Guide1->isImplicit() != Guide2->isImplicit())
11309 return Guide2->isImplicit();
11319 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
11320 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
11321 if (Constructor1 && Constructor2) {
11322 bool isC1Templated = Constructor1->getTemplatedKind() !=
11324 bool isC2Templated = Constructor2->getTemplatedKind() !=
11326 if (isC1Templated != isC2Templated)
11327 return isC2Templated;
11335 if (
Cmp != Comparison::Equal)
11336 return Cmp == Comparison::Better;
11339 bool HasPS1 = Cand1.
Function !=
nullptr &&
11341 bool HasPS2 = Cand2.
Function !=
nullptr &&
11343 if (HasPS1 != HasPS2 && HasPS1)
11347 if (MV == Comparison::Better)
11349 if (MV == Comparison::Worse)
11364 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
11365 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
11367 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
11368 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
11389 auto *VA = dyn_cast_or_null<ValueDecl>(A);
11390 auto *VB = dyn_cast_or_null<ValueDecl>(B);
11396 if (!VA->getDeclContext()->getRedeclContext()->Equals(
11397 VB->getDeclContext()->getRedeclContext()) ||
11399 VA->isExternallyVisible() || VB->isExternallyVisible())
11407 if (
Context.hasSameType(VA->getType(), VB->getType()))
11412 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
11413 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
11418 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
11419 !
Context.hasSameType(EnumA->getIntegerType(),
11420 EnumB->getIntegerType()))
11423 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
11433 assert(D &&
"Unknown declaration");
11434 Diag(Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) << D;
11440 for (
auto *E : Equiv) {
11442 Diag(E->getLocation(), diag::note_equivalent_internal_linkage_decl)
11452 ->Satisfaction.ContainsErrors;
11458 bool PartialOverloading,
bool AllowExplicit,
11460 bool AggregateCandidateDeduction) {
11463 allocateDeferredCandidate<DeferredFunctionTemplateOverloadCandidate>();
11468 false, AllowExplicit, SuppressUserConversions,
11469 PartialOverloading, AggregateCandidateDeduction},
11476 HasDeferredTemplateConstructors |=
11484 bool SuppressUserConversions,
bool PartialOverloading,
11490 allocateDeferredCandidate<DeferredMethodTemplateOverloadCandidate>();
11496 false, SuppressUserConversions, PartialOverloading,
11502 ObjectClassification,
11510 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
11511 bool AllowResultConversion) {
11514 allocateDeferredCandidate<DeferredConversionTemplateOverloadCandidate>();
11518 AllowObjCConversionOnExplicit, AllowResultConversion,
11535 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
11536 nullptr,
C.ObjectType,
C.ObjectClassification,
11537 C.Args,
C.SuppressUserConversions,
C.PartialOverloading,
C.PO);
11544 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
11545 nullptr,
C.Args,
C.SuppressUserConversions,
11546 C.PartialOverloading,
C.AllowExplicit,
C.IsADLCandidate,
C.PO,
11547 C.AggregateCandidateDeduction);
11554 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
C.From,
11555 C.ToType,
C.AllowObjCConversionOnExplicit,
C.AllowExplicit,
11556 C.AllowResultConversion);
11560 Candidates.reserve(Candidates.size() + DeferredCandidatesCount);
11563 switch (Cand->
Kind) {
11582 FirstDeferredCandidate =
nullptr;
11583 DeferredCandidatesCount = 0;
11587OverloadCandidateSet::ResultForBestCandidate(
const iterator &Best) {
11589 if (Best->Function && Best->Function->isDeleted())
11594void OverloadCandidateSet::CudaExcludeWrongSideCandidates(
11611 bool ContainsSameSideCandidate =
11619 if (!ContainsSameSideCandidate)
11622 auto IsWrongSideCandidate = [&](
const OverloadCandidate *Cand) {
11628 llvm::erase_if(Candidates, IsWrongSideCandidate);
11646 DeferredCandidatesCount == 0) &&
11647 "Unexpected deferred template candidates");
11649 bool TwoPhaseResolution =
11650 DeferredCandidatesCount != 0 && !ResolutionByPerfectCandidateIsDisabled;
11652 if (TwoPhaseResolution) {
11654 if (Best !=
end() && Best->isPerfectMatch(S.
Context)) {
11655 if (!(HasDeferredTemplateConstructors &&
11656 isa_and_nonnull<CXXConversionDecl>(Best->Function)))
11662 return BestViableFunctionImpl(S, Loc, Best);
11669 Candidates.reserve(this->Candidates.size());
11670 std::transform(this->Candidates.begin(), this->Candidates.end(),
11671 std::back_inserter(Candidates),
11675 CudaExcludeWrongSideCandidates(S, Candidates);
11678 for (
auto *Cand : Candidates) {
11679 Cand->
Best =
false;
11681 if (Best ==
end() ||
11698 llvm::SmallVector<OverloadCandidate *, 4> PendingBest;
11699 llvm::SmallVector<const NamedDecl *, 4> EquivalentCands;
11700 PendingBest.push_back(&*Best);
11705 while (!PendingBest.empty()) {
11706 auto *Curr = PendingBest.pop_back_val();
11707 for (
auto *Cand : Candidates) {
11710 PendingBest.push_back(Cand);
11715 EquivalentCands.push_back(Cand->
Function);
11727 if (!EquivalentCands.empty())
11735enum OverloadCandidateKind {
11738 oc_reversed_binary_operator,
11740 oc_implicit_default_constructor,
11741 oc_implicit_copy_constructor,
11742 oc_implicit_move_constructor,
11743 oc_implicit_copy_assignment,
11744 oc_implicit_move_assignment,
11745 oc_implicit_equality_comparison,
11746 oc_inherited_constructor
11749enum OverloadCandidateSelect {
11752 ocs_described_template,
11755static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
11756ClassifyOverloadCandidate(Sema &S,
const NamedDecl *
Found,
11757 const FunctionDecl *Fn,
11759 std::string &Description) {
11762 if (FunctionTemplateDecl *FunTmpl =
Fn->getPrimaryTemplate()) {
11765 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
11768 OverloadCandidateSelect Select = [&]() {
11769 if (!Description.empty())
11770 return ocs_described_template;
11771 return isTemplate ? ocs_template : ocs_non_template;
11774 OverloadCandidateKind Kind = [&]() {
11775 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
11776 return oc_implicit_equality_comparison;
11779 return oc_reversed_binary_operator;
11781 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
11782 if (!Ctor->isImplicit()) {
11784 return oc_inherited_constructor;
11786 return oc_constructor;
11789 if (Ctor->isDefaultConstructor())
11790 return oc_implicit_default_constructor;
11792 if (Ctor->isMoveConstructor())
11793 return oc_implicit_move_constructor;
11795 assert(Ctor->isCopyConstructor() &&
11796 "unexpected sort of implicit constructor");
11797 return oc_implicit_copy_constructor;
11800 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
11803 if (!Meth->isImplicit())
11806 if (Meth->isMoveAssignmentOperator())
11807 return oc_implicit_move_assignment;
11809 if (Meth->isCopyAssignmentOperator())
11810 return oc_implicit_copy_assignment;
11816 return oc_function;
11819 return std::make_pair(Kind, Select);
11822void MaybeEmitInheritedConstructorNote(Sema &S,
const Decl *FoundDecl) {
11825 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
11827 diag::note_ovl_candidate_inherited_constructor)
11828 << Shadow->getNominatedBaseClass();
11837 if (EnableIf->getCond()->isValueDependent() ||
11838 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
11855 bool InOverloadResolution,
11859 if (InOverloadResolution)
11861 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
11863 S.
Diag(Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
11874 if (InOverloadResolution) {
11877 TemplateArgString +=
" ";
11879 FunTmpl->getTemplateParameters(),
11884 diag::note_ovl_candidate_unsatisfied_constraints)
11885 << TemplateArgString;
11887 S.
Diag(Loc, diag::err_addrof_function_constraints_not_satisfied)
11896 return P->hasAttr<PassObjectSizeAttr>();
11903 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11904 if (InOverloadResolution)
11906 diag::note_ovl_candidate_has_pass_object_size_params)
11909 S.
Diag(Loc, diag::err_address_of_function_with_pass_object_size_params)
11925 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11933 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11938 if (!RD->isLambda())
11948 return ConvToCC != CallOpCC;
11954 QualType DestType,
bool TakingAddress) {
11957 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11958 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11960 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11961 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11966 std::string FnDesc;
11967 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11968 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11970 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11974 Diag(Fn->getLocation(), PD);
11975 MaybeEmitInheritedConstructorNote(*
this,
Found);
11993 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11994 for (
auto I = Cands.begin(), E = Cands.end(); I != E; ++I) {
11998 if (
auto *
Template = I->Function->getPrimaryTemplate())
11999 Template->getAssociatedConstraints(AC);
12001 I->Function->getAssociatedConstraints(AC);
12004 if (FirstCand ==
nullptr) {
12005 FirstCand = I->Function;
12007 }
else if (SecondCand ==
nullptr) {
12008 SecondCand = I->Function;
12021 SecondCand, SecondAC))
12030 bool TakingAddress) {
12040 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
12044 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
12057 S.
Diag(CaretLoc, PDiag)
12059 unsigned CandsShown = 0;
12073 unsigned I,
bool TakingCandidateAddress) {
12075 assert(Conv.
isBad());
12076 assert(Cand->
Function &&
"for now, candidate must be a function");
12082 bool isObjectArgument =
false;
12086 isObjectArgument =
true;
12091 std::string FnDesc;
12092 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12103 bool HasParamPack =
12104 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
12105 return Parm->isParameterPack();
12107 if (!isObjectArgument && !HasParamPack && I < Fn->getNumParams())
12108 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
12111 assert(FromExpr &&
"overload set argument came from implicit argument?");
12117 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
12118 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12119 << ToParamRange << ToTy << Name << I + 1;
12120 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12129 CToTy = RT->getPointeeType();
12134 CFromTy = FromPT->getPointeeType();
12135 CToTy = ToPT->getPointeeType();
12145 if (isObjectArgument)
12146 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
12147 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12150 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
12151 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12154 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12159 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
12160 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12163 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12168 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
12169 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12172 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12177 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ptrauth)
12178 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12183 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12188 assert(CVR &&
"expected qualifiers mismatch");
12190 if (isObjectArgument) {
12191 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
12192 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12193 << FromTy << (CVR - 1);
12195 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
12196 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12197 << ToParamRange << FromTy << (CVR - 1) << I + 1;
12199 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12205 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
12206 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12207 << (
unsigned)isObjectArgument << I + 1
12210 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12217 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
12218 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12219 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12224 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12236 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
12237 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12238 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12239 << (
unsigned)(Cand->
Fix.
Kind);
12241 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12246 unsigned BaseToDerivedConversion = 0;
12249 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12251 !FromPtrTy->getPointeeType()->isIncompleteType() &&
12252 !ToPtrTy->getPointeeType()->isIncompleteType() &&
12254 FromPtrTy->getPointeeType()))
12255 BaseToDerivedConversion = 1;
12263 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12265 FromIface->isSuperClassOf(ToIface))
12266 BaseToDerivedConversion = 2;
12268 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy,
12271 !ToRefTy->getPointeeType()->isIncompleteType() &&
12273 BaseToDerivedConversion = 3;
12277 if (BaseToDerivedConversion) {
12278 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
12279 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12280 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
12282 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12291 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
12292 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12293 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
12295 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12305 if (FromTy == S.
Context.AMDGPUFeaturePredicateTy &&
12308 diag::err_amdgcn_predicate_type_needs_explicit_bool_cast)
12315 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12316 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12317 << (
unsigned)(Cand->
Fix.
Kind);
12326 S.
Diag(Fn->getLocation(), FDiag);
12328 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12335 unsigned NumArgs,
bool IsAddressOf =
false) {
12336 assert(Cand->
Function &&
"Candidate is required to be a function.");
12338 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12339 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12346 if (Fn->isInvalidDecl() &&
12350 if (NumArgs < MinParams) {
12367 unsigned NumFormalArgs,
12368 bool IsAddressOf =
false) {
12370 "The templated declaration should at least be a function"
12371 " when diagnosing bad template argument deduction due to too many"
12372 " or too few arguments");
12378 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12379 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12382 bool HasExplicitObjectParam =
12383 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
12385 unsigned ParamCount =
12386 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12387 unsigned mode, modeCount;
12389 if (NumFormalArgs < MinParams) {
12390 if (MinParams != ParamCount || FnTy->isVariadic() ||
12391 FnTy->isTemplateVariadic())
12395 modeCount = MinParams;
12397 if (MinParams != ParamCount)
12401 modeCount = ParamCount;
12404 std::string Description;
12405 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12406 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
12408 unsigned FirstNonObjectParamIdx = HasExplicitObjectParam ? 1 : 0;
12409 if (modeCount == 1 && !IsAddressOf &&
12410 FirstNonObjectParamIdx < Fn->getNumParams() &&
12411 Fn->getParamDecl(FirstNonObjectParamIdx)->getDeclName())
12412 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
12413 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12414 << Description << mode << Fn->getParamDecl(FirstNonObjectParamIdx)
12415 << NumFormalArgs << HasExplicitObjectParam
12416 << Fn->getParametersSourceRange();
12418 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
12419 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12420 << Description << mode << modeCount << NumFormalArgs
12421 << HasExplicitObjectParam << Fn->getParametersSourceRange();
12423 MaybeEmitInheritedConstructorNote(S,
Found);
12428 unsigned NumFormalArgs) {
12429 assert(Cand->
Function &&
"Candidate must be a function");
12439 llvm_unreachable(
"Unsupported: Getting the described template declaration"
12440 " for bad deduction diagnosis");
12446 unsigned NumArgs,
bool TakingCandidateAddress,
12450 NamedDecl *ParamD = dyn_cast_if_present<TemplateTypeParmDecl *>(Param);
12452 ParamD = dyn_cast_if_present<NonTypeTemplateParmDecl *>(Param);
12454 ParamD = dyn_cast_if_present<TemplateTemplateParmDecl *>(Param);
12455 switch (DeductionFailure.
getResult()) {
12458 "TemplateDeductionResult::Success while diagnosing bad deduction");
12460 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
12461 "while diagnosing bad deduction");
12467 assert(ParamD &&
"no parameter found for incomplete deduction result");
12469 diag::note_ovl_candidate_incomplete_deduction)
12471 MaybeEmitInheritedConstructorNote(S,
Found);
12476 assert(ParamD &&
"no parameter found for incomplete deduction result");
12478 diag::note_ovl_candidate_incomplete_deduction_pack)
12480 << (DeductionFailure.
getFirstArg()->pack_size() + 1)
12482 MaybeEmitInheritedConstructorNote(S,
Found);
12487 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
12505 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
12506 << ParamD->
getDeclName() << Arg << NonCanonParam;
12507 MaybeEmitInheritedConstructorNote(S,
Found);
12512 assert(ParamD &&
"no parameter found for inconsistent deduction result");
12526 diag::note_ovl_candidate_inconsistent_deduction_types)
12529 MaybeEmitInheritedConstructorNote(S,
Found);
12549 diag::note_ovl_candidate_inconsistent_deduction)
12552 MaybeEmitInheritedConstructorNote(S,
Found);
12557 assert(ParamD &&
"no parameter found for invalid explicit arguments");
12560 diag::note_ovl_candidate_explicit_arg_mismatch);
12562 Diag << diag::ExplicitArgMismatchNameKind::Named << ParamD->
getDeclName();
12564 Diag << diag::ExplicitArgMismatchNameKind::Unnamed
12569 Diag << diag::ExplicitArgMismatchReasonKind::Detailed << DiagContent;
12571 Diag << diag::ExplicitArgMismatchReasonKind::Vague;
12574 MaybeEmitInheritedConstructorNote(S,
Found);
12581 TemplateArgString =
" ";
12584 if (TemplateArgString.size() == 1)
12585 TemplateArgString.clear();
12587 diag::note_ovl_candidate_unsatisfied_constraints)
12588 << TemplateArgString;
12591 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
12601 diag::note_ovl_candidate_instantiation_depth);
12602 MaybeEmitInheritedConstructorNote(S,
Found);
12610 TemplateArgString =
" ";
12613 if (TemplateArgString.size() == 1)
12614 TemplateArgString.clear();
12619 if (PDiag && PDiag->second.getDiagID() ==
12620 diag::err_typename_nested_not_found_enable_if) {
12623 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
12624 <<
"'enable_if'" << TemplateArgString;
12629 if (PDiag && PDiag->second.getDiagID() ==
12630 diag::err_typename_nested_not_found_requirement) {
12632 diag::note_ovl_candidate_disabled_by_requirement)
12633 << PDiag->second.getStringArg(0) << TemplateArgString;
12643 SFINAEArgString =
": ";
12645 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
12649 diag::note_ovl_candidate_substitution_failure)
12650 << TemplateArgString << SFINAEArgString << R;
12651 MaybeEmitInheritedConstructorNote(S,
Found);
12661 TemplateArgString =
" ";
12664 if (TemplateArgString.size() == 1)
12665 TemplateArgString.clear();
12668 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
12671 << TemplateArgString
12696 CandidateSetKind ==
12698 ? diag::note_friend_template_non_deduced_mismatch_qualified
12699 : diag::note_ovl_candidate_non_deduced_mismatch_qualified)
12716 ? diag::note_friend_template_non_deduced_mismatch
12717 : diag::note_ovl_candidate_non_deduced_mismatch)
12718 << FirstTA << SecondTA;
12724 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
12725 MaybeEmitInheritedConstructorNote(S,
Found);
12729 diag::note_cuda_ovl_candidate_target_mismatch);
12737 bool TakingCandidateAddress) {
12738 assert(Cand->
Function &&
"Candidate must be a function");
12753 assert(Cand->
Function &&
"Candidate must be a Function.");
12759 std::string FnDesc;
12760 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12761 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
12764 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
12765 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12767 << CalleeTarget << CallerTarget;
12772 if (Meth !=
nullptr && Meth->
isImplicit()) {
12776 switch (FnKindPair.first) {
12779 case oc_implicit_default_constructor:
12782 case oc_implicit_copy_constructor:
12785 case oc_implicit_move_constructor:
12788 case oc_implicit_copy_assignment:
12791 case oc_implicit_move_assignment:
12796 bool ConstRHS =
false;
12800 ConstRHS = RT->getPointeeType().isConstQualified();
12811 assert(Cand->
Function &&
"Candidate must be a function");
12815 S.
Diag(Callee->getLocation(),
12816 diag::note_ovl_candidate_disabled_by_function_cond_attr)
12817 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
12821 assert(Cand->
Function &&
"Candidate must be a function");
12824 assert(ES.
isExplicit() &&
"not an explicit candidate");
12827 switch (Fn->getDeclKind()) {
12828 case Decl::Kind::CXXConstructor:
12831 case Decl::Kind::CXXConversion:
12834 case Decl::Kind::CXXDeductionGuide:
12835 Kind = Fn->isImplicit() ? 0 : 2;
12838 llvm_unreachable(
"invalid Decl");
12847 First = Pattern->getFirstDecl();
12850 diag::note_ovl_candidate_explicit)
12851 << Kind << (ES.
getExpr() ? 1 : 0)
12856 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
12863 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
12865 std::string FunctionProto;
12866 llvm::raw_string_ostream OS(FunctionProto);
12879 "Non-template implicit deduction guides are only possible for "
12882 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12887 assert(
Template &&
"Cannot find the associated function template of "
12888 "CXXDeductionGuideDecl?");
12891 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12912 bool TakingCandidateAddress,
12914 assert(Cand->
Function &&
"Candidate must be a function");
12922 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
12929 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12934 if (Fn->isDeleted()) {
12935 std::string FnDesc;
12936 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12937 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12940 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12941 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12942 << (Fn->isDeleted()
12943 ? (Fn->getCanonicalDecl()->isDeletedAsWritten() ? 1 : 2)
12945 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12972 TakingCandidateAddress);
12975 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12976 << (Fn->getPrimaryTemplate() ? 1 : 0);
12977 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12984 S.
Diag(Fn->getLocation(),
12985 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12986 << QualsForPrinting;
12987 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12998 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
13021 S.
Diag(Fn->getLocation(),
13022 diag::note_ovl_candidate_inherited_constructor_slice)
13023 << (Fn->getPrimaryTemplate() ? 1 : 0)
13024 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
13025 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
13031 assert(!Available);
13039 std::string FnDesc;
13040 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
13041 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
13044 S.
Diag(Fn->getLocation(),
13045 diag::note_ovl_candidate_constraints_not_satisfied)
13046 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
13065 bool isLValueReference =
false;
13066 bool isRValueReference =
false;
13067 bool isPointer =
false;
13071 isLValueReference =
true;
13075 isRValueReference =
true;
13091 diag::note_ovl_surrogate_constraints_not_satisfied)
13105 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
13106 std::string TypeStr(
"operator");
13112 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13117 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13124 if (ICS.
isBad())
break;
13128 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
13145 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
13175 llvm_unreachable(
"Unhandled deduction result");
13180struct CompareOverloadCandidatesForDisplay {
13182 SourceLocation Loc;
13186 CompareOverloadCandidatesForDisplay(
13187 Sema &S, SourceLocation Loc,
size_t NArgs,
13189 : S(S), NumArgs(NArgs), CSK(CSK) {}
13199 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
13201 if (NumArgs < C->
Function->getMinRequiredArguments())
13208 bool operator()(
const OverloadCandidate *L,
13209 const OverloadCandidate *R) {
13211 if (L == R)
return false;
13215 if (!
R->Viable)
return true;
13217 if (
int Ord = CompareConversions(*L, *R))
13220 }
else if (
R->Viable)
13223 assert(L->
Viable ==
R->Viable);
13236 int RDist =
std::abs((
int)
R->getNumParams() - (
int)NumArgs);
13237 if (LDist == RDist) {
13238 if (LFailureKind == RFailureKind)
13246 return LDist < RDist;
13263 unsigned numRFixes =
R->Fix.NumConversionsFixed;
13264 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
13265 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
13266 if (numLFixes != numRFixes) {
13267 return numLFixes < numRFixes;
13271 if (
int Ord = CompareConversions(*L, *R))
13283 if (LRank != RRank)
13284 return LRank < RRank;
13310 struct ConversionSignals {
13311 unsigned KindRank = 0;
13314 static ConversionSignals ForSequence(ImplicitConversionSequence &
Seq) {
13315 ConversionSignals Sig;
13316 Sig.KindRank =
Seq.getKindRank();
13317 if (
Seq.isStandard())
13318 Sig.Rank =
Seq.Standard.getRank();
13319 else if (
Seq.isUserDefined())
13320 Sig.Rank =
Seq.UserDefined.After.getRank();
13326 static ConversionSignals ForObjectArgument() {
13336 int CompareConversions(
const OverloadCandidate &L,
13337 const OverloadCandidate &R) {
13342 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
13344 ? ConversionSignals::ForObjectArgument()
13345 : ConversionSignals::ForSequence(L.Conversions[I]);
13346 auto RS =
R.IgnoreObjectArgument
13347 ? ConversionSignals::ForObjectArgument()
13348 : ConversionSignals::ForSequence(
R.Conversions[I]);
13349 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
13350 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
13375 bool Unfixable =
false;
13381 for (
unsigned ConvIdx =
13385 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
13386 if (Cand->
Conversions[ConvIdx].isInitialized() &&
13395 bool SuppressUserConversions =
false;
13397 unsigned ConvIdx = 0;
13398 unsigned ArgIdx = 0;
13427 assert(ConvCount <= 3);
13433 ConvIdx != ConvCount && ArgIdx < Args.size();
13435 if (Cand->
Conversions[ConvIdx].isInitialized()) {
13437 }
else if (
ParamIdx < ParamTypes.size()) {
13438 if (ParamTypes[
ParamIdx]->isDependentType())
13439 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
13444 SuppressUserConversions,
13449 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
13468 for (
iterator Cand = Candidates.begin(), LastCand = Candidates.end();
13469 Cand != LastCand; ++Cand) {
13470 if (!Filter(*Cand))
13495 Cands.push_back(Cand);
13499 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
13506 bool DeferHint =
false;
13510 auto WrongSidedCands =
13512 return (Cand.
Viable ==
false &&
13518 DeferHint = !WrongSidedCands.empty();
13534 S.
Diag(PD.first, PD.second);
13539 bool NoteCands =
true;
13540 for (
const Expr *Arg : Args) {
13541 if (Arg->getType()->isWebAssemblyTableType())
13550 {Candidates.begin(), Candidates.end()});
13556 bool ReportedAmbiguousConversions =
false;
13559 unsigned CandsShown = 0;
13560 auto I = Cands.begin(), E = Cands.end();
13561 for (; I != E; ++I) {
13577 "Non-viable built-in candidates are not added to Cands.");
13584 if (!ReportedAmbiguousConversions) {
13586 ReportedAmbiguousConversions =
true;
13600 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13605 const Sema &S)
const {
13611 if (Caller && Caller->
hasAttr<CUDAHostAttr>() &&
13612 Caller->
hasAttr<CUDADeviceAttr>())
13633struct CompareTemplateSpecCandidatesForDisplay {
13635 CompareTemplateSpecCandidatesForDisplay(Sema &S) : S(S) {}
13637 bool operator()(
const TemplateSpecCandidate *L,
13638 const TemplateSpecCandidate *R) {
13669 Sema &S,
bool ForTakingAddress,
13676void TemplateSpecCandidateSet::destroyCandidates() {
13678 i->DeductionFailure.Destroy();
13683 destroyCandidates();
13684 Candidates.clear();
13697 Cands.reserve(
size());
13698 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
13699 if (Cand->Specialization)
13700 Cands.push_back(Cand);
13705 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
13712 unsigned CandsShown = 0;
13713 for (I = Cands.begin(), E = Cands.end(); I != E; ++I) {
13719 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
13724 "Non-matching built-in candidates are not added to Cands.");
13729 S.
Diag(Loc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13739 QualType Ret = PossiblyAFunctionType;
13742 Ret = ToTypePtr->getPointeeType();
13745 Ret = ToTypeRef->getPointeeType();
13748 Ret = MemTypePtr->getPointeeType();
13750 Context.getCanonicalType(Ret).getUnqualifiedType();
13755 bool Complain =
true) {
13772class AddressOfFunctionResolver {
13775 const QualType& TargetType;
13776 QualType TargetFunctionType;
13780 ASTContext& Context;
13782 bool TargetTypeIsNonStaticMemberFunction;
13783 bool FoundNonTemplateFunction;
13784 bool StaticMemberFunctionFromBoundPointer;
13785 bool HasComplained;
13787 OverloadExpr::FindResult OvlExprInfo;
13788 OverloadExpr *OvlExpr;
13789 TemplateArgumentListInfo OvlExplicitTemplateArgs;
13790 SmallVector<std::pair<DeclAccessPair, FunctionDecl*>, 4> Matches;
13791 TemplateSpecCandidateSet FailedCandidates;
13794 AddressOfFunctionResolver(Sema &S, Expr *SourceExpr,
13795 const QualType &TargetType,
bool Complain)
13796 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
13797 Complain(Complain), Context(S.getASTContext()),
13798 TargetTypeIsNonStaticMemberFunction(
13799 !!TargetType->getAs<MemberPointerType>()),
13800 FoundNonTemplateFunction(
false),
13801 StaticMemberFunctionFromBoundPointer(
false),
13802 HasComplained(
false),
13803 OvlExprInfo(OverloadExpr::find(SourceExpr)),
13805 FailedCandidates(OvlExpr->getNameLoc(),
true) {
13806 ExtractUnqualifiedFunctionTypeFromTargetType();
13809 if (UnresolvedMemberExpr *UME = dyn_cast<UnresolvedMemberExpr>(OvlExpr))
13810 if (!UME->isImplicitAccess() &&
13812 StaticMemberFunctionFromBoundPointer =
true;
13814 DeclAccessPair dap;
13816 OvlExpr,
false, &dap)) {
13817 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn))
13818 if (!
Method->isStatic()) {
13822 TargetTypeIsNonStaticMemberFunction =
true;
13830 Matches.push_back(std::make_pair(dap, Fn));
13838 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
13840 EliminateSuboptimalCudaMatches();
13844 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
13845 if (FoundNonTemplateFunction) {
13846 EliminateAllTemplateMatches();
13847 EliminateLessPartialOrderingConstrainedMatches();
13849 EliminateAllExceptMostSpecializedTemplate();
13854 bool hasComplained()
const {
return HasComplained; }
13857 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
13864 bool isBetterCandidate(
const FunctionDecl *A,
const FunctionDecl *B) {
13868 return candidateHasExactlyCorrectType(A) &&
13869 (!candidateHasExactlyCorrectType(B) ||
13875 bool eliminiateSuboptimalOverloadCandidates() {
13878 auto Best = Matches.begin();
13879 for (
auto I = Matches.begin()+1, E = Matches.end(); I != E; ++I)
13880 if (isBetterCandidate(I->second, Best->second))
13883 const FunctionDecl *BestFn = Best->second;
13884 auto IsBestOrInferiorToBest = [
this, BestFn](
13885 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
13886 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
13891 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
13893 Matches[0] = *Best;
13898 bool isTargetTypeAFunction()
const {
13907 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
13913 const DeclAccessPair& CurAccessFunPair) {
13914 if (CXXMethodDecl *
Method
13918 bool CanConvertToFunctionPointer =
13919 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13920 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13923 else if (TargetTypeIsNonStaticMemberFunction)
13933 TemplateDeductionInfo Info(FailedCandidates.
getLocation());
13937 Result != TemplateDeductionResult::Success) {
13955 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
13959 bool AddMatchingNonTemplateFunction(NamedDecl* Fn,
13960 const DeclAccessPair& CurAccessFunPair) {
13961 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn)) {
13964 bool CanConvertToFunctionPointer =
13965 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13966 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13969 else if (TargetTypeIsNonStaticMemberFunction)
13972 if (FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13979 if (FunDecl->isMultiVersion()) {
13980 const auto *TA = FunDecl->getAttr<TargetAttr>();
13981 if (TA && !TA->isDefaultVersion())
13983 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13984 if (TVA && !TVA->isDefaultVersion())
13992 HasComplained |= Complain;
14001 candidateHasExactlyCorrectType(FunDecl)) {
14002 Matches.push_back(std::make_pair(
14004 FoundNonTemplateFunction =
true;
14012 bool FindAllFunctionsThatMatchTargetTypeExactly() {
14017 if (IsInvalidFormOfPointerToMemberFunction())
14020 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
14024 NamedDecl *
Fn = (*I)->getUnderlyingDecl();
14033 = dyn_cast<FunctionTemplateDecl>(Fn)) {
14039 AddMatchingNonTemplateFunction(Fn, I.getPair()))
14042 assert(Ret || Matches.empty());
14046 void EliminateAllExceptMostSpecializedTemplate() {
14058 UnresolvedSet<4> MatchesCopy;
14059 for (
unsigned I = 0, E = Matches.size(); I != E; ++I)
14060 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
14065 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
14067 S.
PDiag(diag::err_addr_ovl_ambiguous)
14068 << Matches[0].second->getDeclName(),
14069 S.
PDiag(diag::note_ovl_candidate)
14070 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
14071 Complain, TargetFunctionType);
14075 Matches[0].first = Matches[
Result - MatchesCopy.
begin()].first;
14079 HasComplained |= Complain;
14082 void EliminateAllTemplateMatches() {
14085 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
14086 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
14089 Matches[I] = Matches[--N];
14095 void EliminateLessPartialOrderingConstrainedMatches() {
14100 assert(Matches[0].second->getPrimaryTemplate() ==
nullptr &&
14101 "Call EliminateAllTemplateMatches() first");
14102 SmallVector<std::pair<DeclAccessPair, FunctionDecl *>, 4> Results;
14103 Results.push_back(Matches[0]);
14104 for (
unsigned I = 1, N = Matches.size(); I < N; ++I) {
14105 assert(Matches[I].second->getPrimaryTemplate() ==
nullptr);
14107 S, Matches[I].second, Results[0].second,
14111 Results.push_back(Matches[I]);
14114 if (F == Matches[I].second) {
14116 Results.push_back(Matches[I]);
14119 std::swap(Matches, Results);
14122 void EliminateSuboptimalCudaMatches() {
14128 void ComplainNoMatchesFound()
const {
14129 assert(Matches.empty());
14131 << OvlExpr->
getName() << TargetFunctionType
14133 if (FailedCandidates.
empty())
14140 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
14143 if (FunctionDecl *Fun =
14144 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
14152 bool IsInvalidFormOfPointerToMemberFunction()
const {
14153 return TargetTypeIsNonStaticMemberFunction &&
14157 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
14165 bool IsStaticMemberFunctionFromBoundPointer()
const {
14166 return StaticMemberFunctionFromBoundPointer;
14169 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
14171 diag::err_invalid_form_pointer_member_function)
14175 void ComplainOfInvalidConversion()
const {
14177 << OvlExpr->
getName() << TargetType;
14180 void ComplainMultipleMatchesFound()
const {
14181 assert(Matches.size() > 1);
14188 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
14190 int getNumMatches()
const {
return Matches.size(); }
14192 FunctionDecl* getMatchingFunctionDecl()
const {
14193 if (Matches.size() != 1)
return nullptr;
14194 return Matches[0].second;
14197 const DeclAccessPair* getMatchingFunctionAccessPair()
const {
14198 if (Matches.size() != 1)
return nullptr;
14199 return &Matches[0].first;
14209 bool *pHadMultipleCandidates) {
14212 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
14214 int NumMatches = Resolver.getNumMatches();
14216 bool ShouldComplain = Complain && !Resolver.hasComplained();
14217 if (NumMatches == 0 && ShouldComplain) {
14218 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
14219 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
14221 Resolver.ComplainNoMatchesFound();
14223 else if (NumMatches > 1 && ShouldComplain)
14224 Resolver.ComplainMultipleMatchesFound();
14225 else if (NumMatches == 1) {
14226 Fn = Resolver.getMatchingFunctionDecl();
14230 FoundResult = *Resolver.getMatchingFunctionAccessPair();
14232 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
14233 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
14239 if (pHadMultipleCandidates)
14240 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
14248 bool IsResultAmbiguous =
false;
14256 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
14257 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
14264 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
14272 auto FoundBetter = [&]() {
14273 IsResultAmbiguous =
false;
14285 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
14287 if (PreferenceByCUDA != 0) {
14289 if (PreferenceByCUDA > 0)
14305 if (MoreConstrained != FD) {
14306 if (!MoreConstrained) {
14307 IsResultAmbiguous =
true;
14308 AmbiguousDecls.push_back(FD);
14317 if (IsResultAmbiguous)
14338 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
14340 assert(E->
getType() ==
Context.OverloadTy &&
"SrcExpr must be an overload");
14344 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
14345 Found->isCPUSpecificMultiVersion())
14393 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
14424 if (ForTypeDeduction &&
14438 if (FoundResult) *FoundResult = I.getPair();
14449 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
14451 unsigned DiagIDForComplaining) {
14472 if (!complain)
return false;
14475 diag::err_bound_member_function)
14488 SingleFunctionExpression =
14492 if (doFunctionPointerConversion) {
14493 SingleFunctionExpression =
14495 if (SingleFunctionExpression.
isInvalid()) {
14502 if (!SingleFunctionExpression.
isUsable()) {
14504 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
14506 << DestTypeForComplaining
14507 << OpRangeForComplaining
14518 SrcExpr = SingleFunctionExpression;
14528 bool PartialOverloading,
14535 if (ExplicitTemplateArgs) {
14536 assert(!KnownValid &&
"Explicit template arguments?");
14545 PartialOverloading);
14550 = dyn_cast<FunctionTemplateDecl>(Callee)) {
14552 ExplicitTemplateArgs, Args, CandidateSet,
14554 PartialOverloading);
14558 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
14564 bool PartialOverloading) {
14587 assert(!(*I)->getDeclContext()->isRecord());
14589 !(*I)->getDeclContext()->isFunctionOrMethod());
14590 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
14600 ExplicitTemplateArgs = &TABuffer;
14606 CandidateSet, PartialOverloading,
14611 Args, ExplicitTemplateArgs,
14612 CandidateSet, PartialOverloading);
14620 CandidateSet,
false,
false);
14627 case OO_New:
case OO_Array_New:
14628 case OO_Delete:
case OO_Array_Delete:
14652 if (DC->isTransparentContext())
14658 R.suppressDiagnostics();
14663 for (
auto &Cand : ResolvedCandidates) {
14676 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
14681 if (FoundInClass) {
14682 *FoundInClass = RD;
14685 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
14702 AssociatedNamespaces,
14703 AssociatedClasses);
14707 for (Sema::AssociatedNamespaceSet::iterator
14708 it = AssociatedNamespaces.begin(),
14709 end = AssociatedNamespaces.end(); it !=
end; ++it) {
14721 SuggestedNamespaces.insert(*it);
14725 SemaRef.
Diag(R.getNameLoc(), diag::err_not_found_by_two_phase_lookup)
14726 << R.getLookupName();
14727 if (SuggestedNamespaces.empty()) {
14728 SemaRef.
Diag(Best->Function->getLocation(),
14729 diag::note_not_found_by_two_phase_lookup)
14730 << R.getLookupName() << 0;
14731 }
else if (SuggestedNamespaces.size() == 1) {
14732 SemaRef.
Diag(Best->Function->getLocation(),
14733 diag::note_not_found_by_two_phase_lookup)
14734 << R.getLookupName() << 1 << *SuggestedNamespaces.begin();
14739 SemaRef.
Diag(Best->Function->getLocation(),
14740 diag::note_not_found_by_two_phase_lookup)
14741 << R.getLookupName() << 2;
14767 ResolvedCandidateSet,
14768 nullptr, Args,
nullptr);
14772class BuildRecoveryCallExprRAII {
14774 Sema::SatisfactionStackResetRAII SatStack;
14777 BuildRecoveryCallExprRAII(Sema &S) : SemaRef(S), SatStack(S) {
14798 bool AllowTypoCorrection) {
14806 BuildRecoveryCallExprRAII RCE(SemaRef);
14816 ExplicitTemplateArgs = &TABuffer;
14824 ResolvedCandidateSet, ExplicitTemplateArgs, Args, &FoundInClass)) {
14826 }
else if (ResolvedCandidateSet.
empty()) {
14831 ExplicitTemplateArgs !=
nullptr,
14832 dyn_cast<MemberExpr>(Fn));
14834 AllowTypoCorrection
14840 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
14855 assert(!R.empty() &&
"lookup results empty despite recovery");
14858 if (R.isAmbiguous()) {
14859 R.suppressDiagnostics();
14866 if ((*R.begin())->isCXXClassMember())
14868 ExplicitTemplateArgs, S);
14869 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
14871 ExplicitTemplateArgs);
14895 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
14902 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
14904 llvm_unreachable(
"performing ADL for builtin");
14911 UnbridgedCastsSet UnbridgedCasts;
14926 if (CandidateSet->
empty() ||
14942 if (CandidateSet->
empty())
14945 UnbridgedCasts.restore();
14952 std::optional<QualType>
Result;
14972 if (Best && *Best != CS.
end())
14973 ConsiderCandidate(**Best);
14976 for (
const auto &
C : CS)
14978 ConsiderCandidate(
C);
14981 for (
const auto &
C : CS)
14982 ConsiderCandidate(
C);
14987 if (
Value.isNull() ||
Value->isUndeducedType())
15004 bool AllowTypoCorrection) {
15005 switch (OverloadResult) {
15016 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
15022 if (*Best != CandidateSet->
end() &&
15026 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
15031 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
15041 *CandidateSet, AllowTypoCorrection);
15048 for (
const Expr *Arg : Args) {
15049 if (!Arg->getType()->isFunctionType())
15051 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
15052 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
15055 Arg->getExprLoc()))
15063 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
15064 << ULE->
getName() << Fn->getSourceRange()),
15072 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
15073 << ULE->
getName() << Fn->getSourceRange()),
15080 Fn->getSourceRange(), ULE->
getName(),
15081 *CandidateSet, FDecl, Args);
15090 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
15098 SubExprs.append(Args.begin(), Args.end());
15105 for (
auto I = CS.
begin(), E = CS.
end(); I != E; ++I) {
15120 bool AllowTypoCorrection,
15121 bool CalleesAddressIsTaken) {
15136 if (CalleesAddressIsTaken)
15147 Best != CandidateSet.
end()) {
15148 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
15149 M && M->isImplicitObjectMemberFunction()) {
15160 CUDA().recordPotentialODRUsedVariable(Args, CandidateSet);
15178 if (
const auto *TP =
15188 ExecConfig, &CandidateSet, &Best,
15189 OverloadResult, AllowTypoCorrection);
15198 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
15204 bool HadMultipleCandidates) {
15214 if (
Method->isExplicitObjectMemberFunction())
15218 E, std::nullopt, FoundDecl,
Method);
15222 if (
Method->getParent()->isLambda() &&
15223 Method->getConversionType()->isBlockPointerType()) {
15227 auto *CE = dyn_cast<CastExpr>(SubE);
15228 if (CE && CE->getCastKind() == CK_NoOp)
15229 SubE = CE->getSubExpr();
15231 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
15232 SubE = BE->getSubExpr();
15255 if (
Method->isExplicitObjectMemberFunction()) {
15261 Expr *ObjectParam = Exp.
get();
15275 Exp.
get()->getEndLoc(),
15290 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15307 Expr *Input,
bool PerformADL) {
15309 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15317 Expr *Args[2] = { Input,
nullptr };
15318 unsigned NumArgs = 1;
15323 if (Opc == UO_PostInc || Opc == UO_PostDec) {
15337 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
15348 if (Fn.isInvalid())
15359 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15378 if (
Method->isExplicitObjectMemberFunction())
15382 Input, std::nullopt, Best->FoundDecl,
Method);
15385 Base = Input = InputInit.
get();
15396 Input = InputInit.
get();
15401 Base, HadMultipleCandidates,
15413 Context, Op, FnExpr.
get(), ArgsArray, ResultTy,
VK, OpLoc,
15429 Input, Best->BuiltinParamTypes[0], Best->Conversions[0],
15434 Input = InputRes.
get();
15455 PDiag(diag::err_ovl_ambiguous_oper_unary)
15472 << (Msg !=
nullptr)
15473 << (Msg ? Msg->
getString() : StringRef())
15526 if (Op != OO_Equal && PerformADL) {
15533 Context.DeclarationNames.getCXXOperatorName(ExtraOp);
15559 Expr *RHS,
bool PerformADL,
15560 bool AllowRewrittenCandidates,
15562 Expr *Args[2] = { LHS, RHS };
15566 AllowRewrittenCandidates =
false;
15572 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
15593 if (Fn.isInvalid())
15602 if (Opc == BO_PtrMemD) {
15603 auto CheckPlaceholder = [&](
Expr *&Arg) {
15612 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
15636 if (Opc == BO_Assign &&
15645 Op, OpLoc, AllowRewrittenCandidates));
15647 CandidateSet.
exclude(DefaultedFn);
15650 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15659 bool IsReversed = Best->isReversed();
15661 std::swap(Args[0], Args[1]);
15678 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
15682 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
15683 : diag::err_ovl_rewrite_equalequal_not_bool)
15691 if (AllowRewrittenCandidates && !IsReversed &&
15701 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
15704 Best->Conversions[ArgIdx]) ==
15706 AmbiguousWith.push_back(Cand.
Function);
15713 if (!AmbiguousWith.empty()) {
15714 bool AmbiguousWithSelf =
15715 AmbiguousWith.size() == 1 &&
15717 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
15719 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
15721 if (AmbiguousWithSelf) {
15723 diag::note_ovl_ambiguous_oper_binary_reversed_self);
15728 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
15729 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
15731 !MD->hasCXXExplicitFunctionObjectParameter() &&
15732 Context.hasSameUnqualifiedType(
15733 MD->getFunctionObjectParameterType(),
15734 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
15735 Context.hasSameUnqualifiedType(
15736 MD->getFunctionObjectParameterType(),
15738 Context.hasSameUnqualifiedType(
15739 MD->getFunctionObjectParameterType(),
15742 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
15745 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
15746 for (
auto *F : AmbiguousWith)
15748 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
15756 if (Op == OO_Equal)
15767 if (
Method->isExplicitObjectMemberFunction()) {
15772 Args[0], std::nullopt, Best->FoundDecl,
Method);
15805 Best->FoundDecl,
Base,
15806 HadMultipleCandidates, OpLoc);
15817 const Expr *ImplicitThis =
nullptr;
15822 Context, ChosenOp, FnExpr.
get(), Args, ResultTy,
VK, OpLoc,
15827 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(FnDecl);
15830 ImplicitThis = ArgsArray[0];
15831 ArgsArray = ArgsArray.slice(1);
15838 if (Op == OO_Equal) {
15843 *
this,
AssignedEntity{Args[0], dyn_cast<CXXMethodDecl>(FnDecl)},
15846 if (ImplicitThis) {
15851 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
15855 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
15870 (Op == OO_Spaceship && IsReversed)) {
15871 if (Op == OO_ExclaimEqual) {
15872 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
15875 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
15877 Expr *ZeroLiteral =
15886 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.get(),
15887 IsReversed ? R.get() : ZeroLiteral,
true,
15895 assert(ChosenOp == Op &&
"unexpected operator name");
15899 if (Best->RewriteKind !=
CRK_None)
15908 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15913 Args[0] = ArgsRes0.
get();
15916 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15921 Args[1] = ArgsRes1.
get();
15931 if (Opc == BO_Comma)
15936 if (DefaultedFn && Opc == BO_Cmp) {
15938 Args[1], DefaultedFn);
15953 Opc >= BO_Assign && Opc <= BO_OrAssign) {
15954 Diag(OpLoc, diag::err_ovl_no_viable_oper)
15957 if (Args[0]->
getType()->isIncompleteType()) {
15958 Diag(OpLoc, diag::note_assign_lhs_incomplete)
15975 assert(
Result.isInvalid() &&
15976 "C++ binary operator overloading is missing candidates!");
15987 << Args[0]->getSourceRange()
15988 << Args[1]->getSourceRange()),
15999 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
16003 Diag(OpLoc, diag::err_ovl_deleted_comparison)
16004 << Args[0]->
getType() << DeletedFD;
16017 PDiag(diag::err_ovl_deleted_oper)
16019 .getCXXOverloadedOperator())
16020 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
16021 << Args[0]->getSourceRange() << Args[1]->getSourceRange()),
16045 "cannot use prvalue expressions more than once");
16046 Expr *OrigLHS = LHS;
16047 Expr *OrigRHS = RHS;
16064 true, DefaultedFn);
16065 if (
Less.isInvalid())
16092 for (; I >= 0; --I) {
16094 auto *VI = Info->lookupValueInfo(Comparisons[I].
Result);
16117 Context, OrigLHS, OrigRHS, BO_Cmp,
Result.get()->getType(),
16118 Result.get()->getValueKind(),
Result.get()->getObjectKind(), OpLoc,
16120 Expr *SemanticForm[] = {LHS, RHS,
Result.get()};
16130 unsigned NumArgsSlots =
16131 MethodArgs.size() + std::max<unsigned>(Args.size(), NumParams);
16134 MethodArgs.reserve(MethodArgs.size() + NumArgsSlots);
16135 bool IsError =
false;
16138 for (
unsigned i = 0; i != NumParams; i++) {
16140 if (i < Args.size()) {
16144 S.
Context, Method->getParamDecl(i)),
16158 MethodArgs.push_back(Arg);
16168 Args.push_back(
Base);
16169 for (
auto *e : ArgExpr) {
16173 Context.DeclarationNames.getCXXOperatorName(OO_Subscript);
16178 ArgExpr.back()->getEndLoc());
16190 if (Fn.isInvalid())
16200 UnbridgedCastsSet UnbridgedCasts;
16213 if (Args.size() == 2)
16216 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16236 if (
Method->isExplicitObjectMemberFunction()) {
16241 Args[0] = Res.
get();
16245 Args[0], std::nullopt, Best->FoundDecl,
Method);
16249 MethodArgs.push_back(Arg0.
get());
16253 *
this, MethodArgs,
Method, ArgExpr, LLoc);
16262 HadMultipleCandidates, OpLocInfo);
16272 Context, OO_Subscript, FnExpr.
get(), MethodArgs, ResultTy,
VK, RLoc,
16289 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
16294 Args[0] = ArgsRes0.
get();
16297 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
16302 Args[1] = ArgsRes1.
get();
16310 CandidateSet.
empty()
16311 ? (
PDiag(diag::err_ovl_no_oper)
16312 << Args[0]->getType() << 0
16313 << Args[0]->getSourceRange() << Range)
16314 : (
PDiag(diag::err_ovl_no_viable_subscript)
16315 << Args[0]->getType() << Args[0]->getSourceRange() << Range);
16322 if (Args.size() == 2) {
16325 LLoc,
PDiag(diag::err_ovl_ambiguous_oper_binary)
16327 << Args[0]->getSourceRange() << Range),
16332 PDiag(diag::err_ovl_ambiguous_subscript_call)
16334 << Args[0]->getSourceRange() << Range),
16343 PDiag(diag::err_ovl_deleted_oper)
16344 <<
"[]" << (Msg !=
nullptr)
16345 << (Msg ? Msg->
getString() : StringRef())
16346 << Args[0]->getSourceRange() << Range),
16360 Expr *ExecConfig,
bool IsExecConfig,
16361 bool AllowRecovery) {
16370 if (
BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
16371 assert(op->getType() ==
Context.BoundMemberTy);
16372 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
16385 QualType objectType = op->getLHS()->getType();
16386 if (op->getOpcode() == BO_PtrMemI)
16390 Qualifiers difference = objectQuals - funcQuals;
16394 std::string qualsString = difference.
getAsString();
16395 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
16398 << (qualsString.find(
' ') == std::string::npos ? 1 : 2);
16402 Context, MemExprE, Args, resultType, valueKind, RParenLoc,
16412 if (CheckOtherCall(call, proto))
16422 if (!AllowRecovery)
16424 std::vector<Expr *> SubExprs = {MemExprE};
16425 llvm::append_range(SubExprs, Args);
16433 UnbridgedCastsSet UnbridgedCasts;
16439 bool HadMultipleCandidates =
false;
16447 UnbridgedCasts.restore();
16465 TemplateArgs = &TemplateArgsBuffer;
16469 E = UnresExpr->
decls_end(); I != E; ++I) {
16471 QualType ExplicitObjectType = ObjectType;
16478 bool HasExplicitParameter =
false;
16479 if (
const auto *M = dyn_cast<FunctionDecl>(
Func);
16480 M && M->hasCXXExplicitFunctionObjectParameter())
16481 HasExplicitParameter =
true;
16482 else if (
const auto *M = dyn_cast<FunctionTemplateDecl>(
Func);
16484 M->getTemplatedDecl()->hasCXXExplicitFunctionObjectParameter())
16485 HasExplicitParameter =
true;
16487 if (HasExplicitParameter)
16495 }
else if ((
Method = dyn_cast<CXXMethodDecl>(
Func))) {
16502 ObjectClassification, Args, CandidateSet,
16506 I.getPair(), ActingDC, TemplateArgs,
16507 ExplicitObjectType, ObjectClassification,
16508 Args, CandidateSet,
16513 HadMultipleCandidates = (CandidateSet.
size() > 1);
16517 UnbridgedCasts.restore();
16520 bool Succeeded =
false;
16525 FoundDecl = Best->FoundDecl;
16545 PDiag(diag::err_ovl_no_viable_member_function_in_call)
16552 PDiag(diag::err_ovl_ambiguous_member_call)
16559 CandidateSet, Best->Function, Args,
true);
16570 MemExprE = Res.
get();
16574 if (
Method->isStatic()) {
16576 ExecConfig, IsExecConfig);
16586 assert(
Method &&
"Member call to something that isn't a method?");
16591 if (
Method->isExplicitObjectMemberFunction()) {
16600 TemplateArgs = &TemplateArgsBuffer;
16606 Method, FoundDecl, MemExpr, HadMultipleCandidates,
16614 TheCall->setUsesMemberSyntax(
true);
16624 Proto->getNumParams());
16630 return BuildRecoveryExpr(ResultType);
16635 return BuildRecoveryExpr(ResultType);
16645 if (
auto *MemE = dyn_cast<MemberExpr>(NakedMemExpr)) {
16646 if (
const EnableIfAttr *
Attr =
16648 Diag(MemE->getMemberLoc(),
16649 diag::err_ovl_no_viable_member_function_in_call)
16652 diag::note_ovl_candidate_disabled_by_function_cond_attr)
16653 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
16659 TheCall->getDirectCallee()->isPureVirtual()) {
16665 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
16676 if (
auto *DD = dyn_cast<CXXDestructorDecl>(TheCall->getDirectCallee())) {
16680 CallCanBeVirtual,
true,
16685 TheCall->getDirectCallee());
16697 UnbridgedCastsSet UnbridgedCasts;
16701 assert(
Object.get()->getType()->isRecordType() &&
16702 "Requires object type argument");
16716 diag::err_incomplete_object_call,
Object.get()))
16719 auto *
Record =
Object.get()->getType()->castAsCXXRecordDecl();
16722 R.suppressAccessDiagnostics();
16725 Oper != OperEnd; ++Oper) {
16739 bool IgnoreSurrogateFunctions =
false;
16742 if (!Candidate.
Viable &&
16744 IgnoreSurrogateFunctions =
true;
16766 !IgnoreSurrogateFunctions && I != E; ++I) {
16788 Object.get(), Args, CandidateSet);
16793 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16806 CandidateSet.
empty()
16807 ? (
PDiag(diag::err_ovl_no_oper)
16808 <<
Object.get()->getType() << 1
16809 <<
Object.get()->getSourceRange())
16810 : (
PDiag(diag::err_ovl_no_viable_object_call)
16811 <<
Object.get()->getType() <<
Object.get()->getSourceRange());
16818 if (!R.isAmbiguous())
16821 PDiag(diag::err_ovl_ambiguous_object_call)
16822 <<
Object.get()->getType()
16823 <<
Object.get()->getSourceRange()),
16834 PDiag(diag::err_ovl_deleted_object_call)
16835 <<
Object.get()->getType() << (Msg !=
nullptr)
16836 << (Msg ? Msg->
getString() : StringRef())
16837 <<
Object.get()->getSourceRange()),
16843 if (Best == CandidateSet.
end())
16846 UnbridgedCasts.restore();
16848 if (Best->Function ==
nullptr) {
16853 Best->Conversions[0].UserDefined.ConversionFunction);
16857 "Found Decl & conversion-to-functionptr should be same, right?!");
16869 Conv, HadMultipleCandidates);
16870 if (
Call.isInvalid())
16874 Context,
Call.get()->getType(), CK_UserDefinedConversion,
Call.get(),
16888 if (
Method->isInvalidDecl())
16895 Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc);
16898 HadMultipleCandidates, OpLocInfo);
16903 MethodArgs.reserve(NumParams + 1);
16905 bool IsError =
false;
16909 if (
Method->isExplicitObjectMemberFunction()) {
16918 MethodArgs.push_back(
Object.get());
16922 *
this, MethodArgs,
Method, Args, LParenLoc);
16925 if (Proto->isVariadic()) {
16927 for (
unsigned i = NumParams, e = Args.size(); i < e; i++) {
16931 MethodArgs.push_back(Arg.
get());
16946 Context, OO_Call, NewFn.
get(), MethodArgs, ResultTy,
VK, RParenLoc,
16960 bool *NoArrowOperatorFound) {
16961 assert(
Base->getType()->isRecordType() &&
16962 "left-hand side must have class type");
16976 Context.DeclarationNames.getCXXOperatorName(OO_Arrow);
16980 diag::err_typecheck_incomplete_tag,
Base))
16985 R.suppressAccessDiagnostics();
16988 Oper != OperEnd; ++Oper) {
16994 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
17005 if (CandidateSet.
empty()) {
17007 if (NoArrowOperatorFound) {
17010 *NoArrowOperatorFound =
true;
17013 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
17014 << BaseType <<
Base->getSourceRange();
17015 if (BaseType->isRecordType() && !BaseType->isPointerType()) {
17016 Diag(OpLoc, diag::note_typecheck_member_reference_suggestion)
17020 Diag(OpLoc, diag::err_ovl_no_viable_oper)
17021 <<
"operator->" <<
Base->getSourceRange();
17026 if (!R.isAmbiguous())
17029 <<
"->" <<
Base->getType()
17030 <<
Base->getSourceRange()),
17038 <<
"->" << (Msg !=
nullptr)
17039 << (Msg ? Msg->
getString() : StringRef())
17040 <<
Base->getSourceRange()),
17051 if (
Method->isExplicitObjectMemberFunction()) {
17058 Base, std::nullopt, Best->FoundDecl,
Method);
17066 Base, HadMultipleCandidates, OpLoc);
17100 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
17113 PDiag(diag::err_ovl_no_viable_function_in_call)
17114 << R.getLookupName()),
17121 << R.getLookupName()),
17128 HadMultipleCandidates, SuffixInfo);
17129 if (Fn.isInvalid())
17135 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
17141 ConvArgs[ArgIdx] = InputInit.
get();
17168 Scope *S =
nullptr;
17171 if (!MemberLookup.
empty()) {
17198 if (CandidateSet->
empty() || CandidateSetError) {
17211 Loc,
nullptr, CandidateSet, &Best,
17224 if (
ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
17229 if (SubExpr.
get() == PE->getSubExpr())
17233 ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.
get());
17241 assert(
Context.hasSameType(ICE->getSubExpr()->getType(),
17243 "Implicit cast type cannot be determined from overload");
17244 assert(ICE->path_empty() &&
"fixing up hierarchy conversion?");
17245 if (SubExpr.
get() == ICE->getSubExpr())
17253 if (
auto *GSE = dyn_cast<GenericSelectionExpr>(E)) {
17254 if (!GSE->isResultDependent()) {
17259 if (SubExpr.
get() == GSE->getResultExpr())
17266 unsigned ResultIdx = GSE->getResultIndex();
17267 AssocExprs[ResultIdx] = SubExpr.
get();
17269 if (GSE->isExprPredicate())
17271 Context, GSE->getGenericLoc(), GSE->getControllingExpr(),
17272 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17273 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17276 Context, GSE->getGenericLoc(), GSE->getControllingType(),
17277 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17278 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17287 assert(UnOp->getOpcode() == UO_AddrOf &&
17288 "Can only take the address of an overloaded function");
17290 if (!
Method->isImplicitObjectMemberFunction()) {
17301 if (SubExpr.
get() == UnOp->getSubExpr())
17309 "fixed to something other than a decl ref");
17312 assert(Qualifier &&
17313 "fixed to a member ref with no nested name qualifier");
17319 Fn->getType(), Qualifier,
17322 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
17327 UnOp->getOperatorLoc(),
false,
17335 if (SubExpr.
get() == UnOp->getSubExpr())
17348 if (ULE->hasExplicitTemplateArgs()) {
17349 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
17350 TemplateArgs = &TemplateArgsBuffer;
17355 getLangOpts().CPlusPlus && !Fn->hasCXXExplicitFunctionObjectParameter()
17360 if (
unsigned BID = Fn->getBuiltinID()) {
17361 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
17368 Fn,
Type, ValueKind, ULE->getNameInfo(), ULE->getQualifierLoc(),
17369 Found.getDecl(), ULE->getTemplateKeywordLoc(), TemplateArgs);
17377 if (MemExpr->hasExplicitTemplateArgs()) {
17378 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
17379 TemplateArgs = &TemplateArgsBuffer;
17386 if (MemExpr->isImplicitAccess()) {
17389 Fn, Fn->getType(),
VK_LValue, MemExpr->getNameInfo(),
17390 MemExpr->getQualifierLoc(),
Found.getDecl(),
17391 MemExpr->getTemplateKeywordLoc(), TemplateArgs);
17396 if (MemExpr->getQualifier())
17397 Loc = MemExpr->getQualifierLoc().getBeginLoc();
17402 Base = MemExpr->getBase();
17408 type = Fn->getType();
17415 Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),
17416 MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn,
Found,
17417 true, MemExpr->getMemberNameInfo(),
17421 llvm_unreachable(
"Invalid reference to overloaded function");
17432 if (!PartialOverloading || !
Function)
17436 if (
const auto *Proto =
17437 dyn_cast<FunctionProtoType>(
Function->getFunctionType()))
17438 if (Proto->isTemplateVariadic())
17440 if (
auto *Pattern =
Function->getTemplateInstantiationPattern())
17441 if (
const auto *Proto =
17442 dyn_cast<FunctionProtoType>(Pattern->getFunctionType()))
17443 if (Proto->isTemplateVariadic())
17456 << IsMember << Name << (Msg !=
nullptr)
17457 << (Msg ? Msg->
getString() : StringRef())
Defines the clang::ASTContext interface.
Defines the Diagnostic-related interfaces.
static bool isBooleanType(QualType Ty)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
Result
Implement __builtin_bit_cast and related operations.
static const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
This file declares semantic analysis functions specific to AMDGPU.
This file declares semantic analysis functions specific to ARM.
static AccessResult DeduceTemplateArguments(Sema &S, FriendTemplateDecl *FTD, DeclContext *DC, const TemplateSpecializationType *TST, ArrayRef< TemplateParameterList * > TPLs, TemplateSpecCandidateSet *FailedTSC, MultiLevelTemplateArgumentList &DeducedArgs)
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static bool hasExplicitAttr(const VarDecl *D)
This file declares semantic analysis for CUDA constructs.
static void BuildBasePathArray(const CXXBasePath &Path, CXXCastPath &BasePathArray)
static bool isRecordType(QualType T)
static void TryUserDefinedConversion(Sema &S, QualType DestType, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt a user-defined conversion between two types (C++ [dcl.init]), which enumerates all conversion...
This file declares semantic analysis for Objective-C.
static ImplicitConversionSequence::CompareKind CompareStandardConversionSequences(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareStandardConversionSequences - Compare two standard conversion sequences to determine whether o...
static bool sameFunctionParameterTypeLists(Sema &S, FunctionDecl *Fn1, FunctionDecl *Fn2, bool IsFn1Reversed, bool IsFn2Reversed)
We're allowed to use constraints partial ordering only if the candidates have the same parameter type...
static bool isNullPointerConstantForConversion(Expr *Expr, bool InOverloadResolution, ASTContext &Context)
static void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, DeductionFailureInfo &DeductionFailure, unsigned NumArgs, bool TakingCandidateAddress, TemplateSpecCandidateSetKind CandidateSetKind=TemplateSpecCandidateSetKind::Normal)
Diagnose a failed template-argument deduction.
static bool shouldSkipNotingLambdaConversionDecl(const FunctionDecl *Fn)
static const FunctionType * getConversionOpReturnTyAsFunction(CXXConversionDecl *Conv)
static bool functionHasPassObjectSizeParams(const FunctionDecl *FD)
static Comparison compareEnableIfAttrs(const Sema &S, const FunctionDecl *Cand1, const FunctionDecl *Cand2)
Compares the enable_if attributes of two FunctionDecls, for the purposes of overload resolution.
static Qualifiers CollectVRQualifiers(ASTContext &Context, Expr *ArgExpr)
CollectVRQualifiers - This routine returns Volatile/Restrict qualifiers, if any, found in visible typ...
@ ToPromotedUnderlyingType
static void AddOverloadedCallCandidate(Sema &S, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading, bool KnownValid)
Add a single candidate to the overload set.
static void AddTemplateOverloadCandidateImmediately(Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, bool AllowExplicit, Sema::ADLCallKind IsADLCandidate, OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction)
static bool IsVectorOrMatrixElementConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, Expr *From)
static ExprResult FinishOverloadedCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, OverloadCandidateSet *CandidateSet, OverloadCandidateSet::iterator *Best, OverloadingResult OverloadResult, bool AllowTypoCorrection)
FinishOverloadedCallExpr - given an OverloadCandidateSet, builds and returns the completed call expre...
static bool isQualificationConversionStep(QualType FromType, QualType ToType, bool CStyle, bool IsTopLevel, bool &PreviousToQualsIncludeConst, bool &ObjCLifetimeConversion, const ASTContext &Ctx)
Perform a single iteration of the loop for checking if a qualification conversion is valid.
static ImplicitConversionSequence::CompareKind CompareQualificationConversions(Sema &S, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareQualificationConversions - Compares two standard conversion sequences to determine whether the...
static void dropPointerConversion(StandardConversionSequence &SCS)
dropPointerConversions - If the given standard conversion sequence involves any pointer conversions,...
static SourceLocation GetLocationForCandidate(const OverloadCandidate *Cand)
static void DiagnoseArityMismatch(Sema &S, NamedDecl *Found, Decl *D, unsigned NumFormalArgs, bool IsAddressOf=false)
General arity mismatch diagnosis over a candidate in a candidate set.
static const Expr * IgnoreNarrowingConversion(ASTContext &Ctx, const Expr *Converted)
Skip any implicit casts which could be either part of a narrowing conversion or after one in an impli...
static bool allowAmbiguity(ASTContext &Context, const FunctionDecl *F1, const FunctionDecl *F2)
static unsigned RankDeductionFailure(const DeductionFailureInfo &DFI)
static QualType BuildSimilarlyQualifiedPointerType(const Type *FromPtr, QualType ToPointee, QualType ToType, ASTContext &Context, bool StripObjCLifetime=false)
BuildSimilarlyQualifiedPointerType - In a pointer conversion from the pointer type FromPtr to a point...
static void forAllQualifierCombinations(QualifiersAndAtomic Quals, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static bool FindConversionForRefInit(Sema &S, ImplicitConversionSequence &ICS, QualType DeclType, SourceLocation DeclLoc, Expr *Init, QualType T2, bool AllowRvalues, bool AllowExplicit)
Look for a user-defined conversion to a value reference-compatible with DeclType.
static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static Expr * GetExplicitObjectExpr(Sema &S, Expr *Obj, const FunctionDecl *Fun)
static bool hasDeprecatedStringLiteralToCharPtrConversion(const ImplicitConversionSequence &ICS)
static void AddBuiltinAssignmentOperatorCandidates(Sema &S, QualType T, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
Helper function for AddBuiltinOperatorCandidates() that adds the volatile- and non-volatile-qualified...
static bool CheckConvertedConstantConversions(Sema &S, StandardConversionSequence &SCS)
Check that the specified conversion is permitted in a converted constant expression,...
static bool tryOverflowBehaviorTypeConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static void NoteBuiltinOperatorCandidate(Sema &S, StringRef Opc, SourceLocation OpLoc, OverloadCandidate *Cand)
static ImplicitConversionSequence::CompareKind compareConversionFunctions(Sema &S, FunctionDecl *Function1, FunctionDecl *Function2)
Compare the user-defined conversion functions or constructors of two user-defined conversion sequence...
static void forAllQualifierCombinationsImpl(QualifiersAndAtomic Available, QualifiersAndAtomic Applied, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static const char * GetImplicitConversionName(ImplicitConversionKind Kind)
GetImplicitConversionName - Return the name of this kind of implicit conversion.
static bool checkAddressOfFunctionIsAvailable(Sema &S, const FunctionDecl *FD, bool Complain, bool InOverloadResolution, SourceLocation Loc)
Returns true if we can take the address of the function.
static ImplicitConversionSequence::CompareKind CompareDerivedToBaseConversions(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareDerivedToBaseConversions - Compares two standard conversion sequences to determine whether the...
static bool convertArgsForAvailabilityChecks(Sema &S, FunctionDecl *Function, Expr *ThisArg, SourceLocation CallLoc, ArrayRef< Expr * > Args, Sema::SFINAETrap &Trap, bool MissingImplicitThis, Expr *&ConvertedThis, SmallVectorImpl< Expr * > &ConvertedArgs)
static TemplateDecl * getDescribedTemplate(Decl *Templated)
static void CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand, ArrayRef< Expr * > Args, OverloadCandidateSet::CandidateSetKind CSK)
CompleteNonViableCandidate - Normally, overload resolution only computes up to the first bad conversi...
static QualType AdoptQualifiers(ASTContext &Context, QualType T, Qualifiers Qs)
Adopt the given qualifiers for the given type.
static void NoteAmbiguousUserConversions(Sema &S, SourceLocation OpLoc, OverloadCandidate *Cand)
static bool CheckArityMismatch(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool IsAddressOf=false)
Additional arity mismatch diagnosis specific to a function overload candidates.
static ImplicitConversionSequence::CompareKind compareStandardConversionSubsets(ASTContext &Context, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
static bool hasDependentExplicit(FunctionTemplateDecl *FTD)
static bool IsVectorConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, ImplicitConversionKind &ElConv, Expr *From, bool InOverloadResolution, bool CStyle)
Determine whether the conversion from FromType to ToType is a valid vector conversion.
static ImplicitConversionSequence TryContextuallyConvertToObjCPointer(Sema &S, Expr *From)
TryContextuallyConvertToObjCPointer - Attempt to contextually convert the expression From to an Objec...
static ExprResult CheckConvertedConstantExpression(Sema &S, Expr *From, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, NamedDecl *Dest)
CheckConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static bool DiagnoseTwoPhaseOperatorLookup(Sema &SemaRef, OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, const OverloadCandidateSet &ResolvedCandidateSet)
Attempt to recover from ill-formed use of a non-dependent operator in a template, where the non-depen...
static std::optional< QualType > getImplicitObjectParamType(ASTContext &Context, const FunctionDecl *F)
Compute the type of the implicit object parameter for the given function, if any.
static bool checkPlaceholderForOverload(Sema &S, Expr *&E, UnbridgedCastsSet *unbridgedCasts=nullptr)
checkPlaceholderForOverload - Do any interesting placeholder-like preprocessing on the given expressi...
static FixedEnumPromotion getFixedEnumPromtion(Sema &S, const StandardConversionSequence &SCS)
Returns kind of fixed enum promotion the SCS uses.
static bool isAllowableExplicitConversion(Sema &S, QualType ConvType, QualType ToType, bool AllowObjCPointerConversion)
Determine whether this is an allowable conversion from the result of an explicit conversion operator ...
static bool isNonViableMultiVersionOverload(FunctionDecl *FD)
static bool FunctionsCorrespond(ASTContext &Ctx, const FunctionDecl *X, const FunctionDecl *Y)
static ImplicitConversionSequence TryImplicitConversion(Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion, bool AllowObjCConversionOnExplicit)
TryImplicitConversion - Attempt to perform an implicit conversion from the given expression (Expr) to...
static ExprResult BuildConvertedConstantExpression(Sema &S, Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest, APValue &PreNarrowingValue)
BuildConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static ImplicitConversionSequence TryListConversion(Sema &S, InitListExpr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion)
TryListConversion - Try to copy-initialize a value of type ToType from the initializer list From.
static bool IsOverloadOrOverrideImpl(Sema &SemaRef, FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs, bool UseOverrideRules=false)
static QualType withoutUnaligned(ASTContext &Ctx, QualType T)
static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand)
CUDA: diagnose an invalid call across targets.
static void MaybeDiagnoseAmbiguousConstraints(Sema &S, ArrayRef< OverloadCandidate > Cands)
static bool diagnoseNoViableConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, UnresolvedSetImpl &ExplicitConversions)
static void AddMethodTemplateCandidateImmediately(Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, OverloadCandidateParamOrder PO)
static void AddTemplateConversionCandidateImmediately(Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion)
static ImplicitConversionSequence TryContextuallyConvertToBool(Sema &S, Expr *From)
TryContextuallyConvertToBool - Attempt to contextually convert the expression From to bool (C++0x [co...
static ImplicitConversionSequence TryObjectArgumentInitialization(Sema &S, SourceLocation Loc, QualType FromType, Expr::Classification FromClassification, CXXMethodDecl *Method, const CXXRecordDecl *ActingContext, bool InOverloadResolution=false, QualType ExplicitParameterType=QualType(), bool SuppressUserConversion=false)
TryObjectArgumentInitialization - Try to initialize the object parameter of the given member function...
static bool recordConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, DeclAccessPair &Found)
static ImplicitConversionSequence::CompareKind CompareImplicitConversionSequences(Sema &S, SourceLocation Loc, const ImplicitConversionSequence &ICS1, const ImplicitConversionSequence &ICS2)
CompareImplicitConversionSequences - Compare two implicit conversion sequences to determine whether o...
static ImplicitConversionSequence::CompareKind CompareOverflowBehaviorConversions(Sema &S, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareOverflowBehaviorConversions - Compares two standard conversion sequences to determine whether ...
static ExprResult BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MutableArrayRef< Expr * > Args, SourceLocation RParenLoc, const OverloadCandidateSet &ResolvedCandidateSet, bool AllowTypoCorrection)
Attempts to recover from a call where no functions were found.
static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool TakingCandidateAddress, LangAS CtorDestAS=LangAS::Default)
Generates a 'note' diagnostic for an overload candidate.
static ImplicitConversionSequence TryCopyInitialization(Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion, bool AllowExplicit=false)
TryCopyInitialization - Try to copy-initialize a value of type ToType from the expression From.
static ExprResult diagnoseAmbiguousConversion(Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter, QualType T, UnresolvedSetImpl &ViableConversions)
static void markUnaddressableCandidatesUnviable(Sema &S, OverloadCandidateSet &CS)
static QualType GetExplicitObjectType(Sema &S, const Expr *MemExprE)
Sema::AllowedExplicit AllowedExplicit
static QualType AdjustAddressSpaceForBuiltinOperandType(Sema &S, QualType T, Expr *Arg)
Helper function for adjusting address spaces for the pointer or reference operands of builtin operato...
static bool DiagnoseTwoPhaseLookup(Sema &SemaRef, SourceLocation FnLoc, const CXXScopeSpec &SS, LookupResult &R, OverloadCandidateSet::CandidateSetKind CSK, const OverloadCandidateSet &ResolvedCandidates, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, CXXRecordDecl **FoundInClass=nullptr)
Attempt to recover from an ill-formed use of a non-dependent name in a template, where the non-depend...
static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand)
static bool isBetterReferenceBindingKind(const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
Determine whether one of the given reference bindings is better than the other based on what kind of ...
static ExprResult CreateFunctionRefExpr(Sema &S, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, FunctionDecl *Fn, NamedDecl *FoundDecl, const Expr *Base, bool HadMultipleCandidates, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
A convenience routine for creating a decayed reference to a function.
static bool canBeDeclaredInNamespace(const DeclarationName &Name)
Determine whether a declaration with the specified name could be moved into a different namespace.
static ExprResult finishContextualImplicitConversion(Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter)
static bool IsStandardConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle, bool AllowObjCWritebackConversion)
IsStandardConversion - Determines whether there is a standard conversion sequence (C++ [conv],...
static bool isNonTrivialObjCLifetimeConversion(Qualifiers FromQuals, Qualifiers ToQuals)
Determine whether the lifetime conversion between the two given qualifiers sets is nontrivial.
static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, unsigned I, bool TakingCandidateAddress)
static bool completeFunctionType(Sema &S, FunctionDecl *FD, SourceLocation Loc, bool Complain=true)
static bool shouldAddReversedEqEq(Sema &S, SourceLocation OpLoc, Expr *FirstOperand, FunctionDecl *EqFD)
static bool isFunctionAlwaysEnabled(const ASTContext &Ctx, const FunctionDecl *FD)
static bool PrepareExplicitObjectArgument(Sema &S, CXXMethodDecl *Method, Expr *Object, MultiExprArg &Args, SmallVectorImpl< Expr * > &NewArgs)
static OverloadingResult IsInitializerListConstructorConversion(Sema &S, Expr *From, QualType ToType, CXXRecordDecl *To, UserDefinedConversionSequence &User, OverloadCandidateSet &CandidateSet, bool AllowExplicit)
static bool IsMatrixConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, ImplicitConversionKind &ElConv, Expr *From, bool InOverloadResolution, bool CStyle)
Determine whether the conversion from FromType to ToType is a valid matrix conversion.
static bool checkAddressOfCandidateIsAvailable(Sema &S, const FunctionDecl *FD)
static bool IsFloatingPointConversion(Sema &S, QualType FromType, QualType ToType)
Determine whether the conversion from FromType to ToType is a valid floating point conversion.
static bool isFirstArgumentCompatibleWithType(ASTContext &Context, CXXConstructorDecl *Constructor, QualType Type)
static Comparison isBetterMultiversionCandidate(const OverloadCandidate &Cand1, const OverloadCandidate &Cand2)
static void NoteImplicitDeductionGuide(Sema &S, FunctionDecl *Fn)
static void collectViableConversionCandidates(Sema &SemaRef, Expr *From, QualType ToType, UnresolvedSetImpl &ViableConversions, OverloadCandidateSet &CandidateSet)
static ImplicitConversionSequence TryReferenceInit(Sema &S, Expr *Init, QualType DeclType, SourceLocation DeclLoc, bool SuppressUserConversions, bool AllowExplicit)
Compute an implicit conversion sequence for reference initialization.
static bool isNonDependentlyExplicit(FunctionTemplateDecl *FTD)
Determine whether a given function template has a simple explicit specifier or a non-value-dependent ...
static bool checkArgPlaceholdersForOverload(Sema &S, MultiExprArg Args, UnbridgedCastsSet &unbridged)
checkArgPlaceholdersForOverload - Check a set of call operands for placeholders.
static QualType makeQualifiedLValueReferenceType(QualType Base, QualifiersAndAtomic Quals, Sema &S)
static QualType chooseRecoveryType(OverloadCandidateSet &CS, OverloadCandidateSet::iterator *Best)
static void AddTemplateOverloadCandidate(Sema &S, OverloadCandidateSet &CandidateSet, DeferredMethodTemplateOverloadCandidate &C)
static void NoteSurrogateCandidate(Sema &S, OverloadCandidate *Cand)
static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand)
static bool diagnoseDiagnoseIfAttrsWith(Sema &S, const NamedDecl *ND, bool ArgDependent, SourceLocation Loc, CheckFn &&IsSuccessful)
static OverloadingResult IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType, UserDefinedConversionSequence &User, OverloadCandidateSet &Conversions, AllowedExplicit AllowExplicit, bool AllowObjCConversionOnExplicit)
Determines whether there is a user-defined conversion sequence (C++ [over.ics.user]) that converts ex...
static bool IsAcceptableNonMemberOperatorCandidate(ASTContext &Context, FunctionDecl *Fn, ArrayRef< Expr * > Args)
IsAcceptableNonMemberOperatorCandidate - Determine whether Fn is an acceptable non-member overloaded ...
static FunctionDecl * getMorePartialOrderingConstrained(Sema &S, FunctionDecl *Fn1, FunctionDecl *Fn2, bool IsFn1Reversed, bool IsFn2Reversed)
static bool IsTransparentUnionStandardConversion(Sema &S, Expr *From, QualType &ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static const FunctionProtoType * tryGetFunctionProtoType(QualType FromType)
Attempts to get the FunctionProtoType from a Type.
static bool PrepareArgumentsForCallToObjectOfClassType(Sema &S, SmallVectorImpl< Expr * > &MethodArgs, CXXMethodDecl *Method, MultiExprArg Args, SourceLocation LParenLoc)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
a trap message and trap category.
A class for storing results from argument-dependent lookup.
void erase(NamedDecl *D)
Removes any data associated with a given decl.
llvm::mapped_iterator< decltype(Decls)::iterator, select_second > iterator
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
unsigned getIntWidth(QualType T) const
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
CanQualType getLogicalOperationType() const
The result type of logical operations, '<', '>', '!=', etc.
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
const TargetInfo * getAuxTargetInfo() const
CanQualType UnsignedLongTy
QualType getRestrictType(QualType T) const
Return the uniqued reference to the type for a restrict qualified type.
bool areCompatibleOverflowBehaviorTypes(QualType LHS, QualType RHS)
Return true if two OverflowBehaviorTypes are compatible for assignment.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
QualType getObjCIdType() const
Represents the Objective-CC id type.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
bool isSameTemplateParameterList(const TemplateParameterList *X, const TemplateParameterList *Y) const
Determine whether two template parameter lists are similar enough that they may be used in declaratio...
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
QualType getVolatileType(QualType T) const
Return the uniqued reference to the type for a volatile qualified type.
CanQualType UnsignedLongLongTy
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
CanQualType UnsignedShortTy
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
QualType getCVRQualifiedType(QualType T, unsigned CVR) const
Return a type with additional const, volatile, or restrict qualifiers.
bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)
Return true if the given vector types are of the same unqualified type or if they are equivalent to t...
const TargetInfo & getTargetInfo() const
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
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.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
QualType getConstantArrayType(const ASTContext &Ctx) const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
Attr - This represents one attribute.
A builtin binary operation expression such as "x + y" or "x <= y".
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
StringRef getOpcodeStr() const
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
static bool isCompoundAssignmentOp(Opcode Opc)
This class is used for builtin types like 'int'.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
const RecordType * getDetectedVirtual() const
The virtual base discovered on the path (if we are merely detecting virtuals).
bool isAmbiguous(CanQualType BaseType) const
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
Represents a C++ constructor within a class.
bool isCopyOrMoveConstructor(unsigned &TypeQuals) const
Determine whether this is a copy or move constructor.
bool isConvertingConstructor(bool AllowExplicit) const
Whether this constructor is a converting constructor (C++ [class.conv.ctor]), which can be used for u...
Represents a C++ conversion function within a class.
bool isExplicit() const
Return true if the declaration is already resolved to be explicit.
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Represents a call to a member function that may be written either with member call syntax (e....
static CXXMemberCallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
static CXXOperatorCallExpr * Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation OperatorLoc, FPOptionsOverride FPFeatures, ADLCallKind UsesADL=NotADL, bool IsReversed=false)
Represents a C++ struct/union/class.
bool isLambda() const
Determine whether this class describes a lambda function object.
llvm::iterator_range< conversion_iterator > getVisibleConversionFunctions() const
Get all conversion functions visible in current class, including conversion function templates.
bool isHLSLBuiltinRecord() const
Returns true if the class is a built-in HLSL record.
bool hasDefinition() const
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
A rewritten comparison expression that was originally written using operator syntax.
Represents a C++ nested-name-specifier or a global scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
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.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
void setUsesMemberSyntax(bool V=true)
void markDependentForPostponedNameLookup()
Used by Sema to implement MSVC-compatible delayed name lookup.
Represents a canonical, potentially-qualified type.
bool isAtLeastAsQualifiedAs(CanQual< T > Other, const ASTContext &Ctx) const
Determines whether this canonical type is at least as qualified as the Other canonical type.
static CanQual< Type > CreateUnsafe(QualType Other)
CanProxy< U > castAs() const
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.
bool isVolatileQualified() const
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
bool isPartial() const
True iff the comparison is not totally ordered.
bool isStrong() const
True iff the comparison is "strong".
Complex values, per C99 6.2.5p11.
QualType getElementType() const
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())
Represents the canonical version of C arrays with a specified constant size.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() 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.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
A reference to a declared variable, function, enum, etc.
void setHadMultipleCandidates(bool V=true)
Sets the flag telling whether this expression refers to a function that was resolved from an overload...
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)
Decl - This represents one declaration (or definition), e.g.
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
specific_attr_iterator< T > specific_attr_end() const
specific_attr_iterator< T > specific_attr_begin() const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
The name of a declaration.
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void overloadCandidatesShown(unsigned N)
Call this after showing N overload candidates.
unsigned getNumOverloadCandidatesToShow() const
When a call or operator fails, print out up to this many candidate overloads as suggestions.
OverloadsShown getShowOverloads() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
RAII object that enters a new expression evaluation context.
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
EnumDecl * getDefinitionOrSelf() const
Store information needed for an explicit specifier.
bool isExplicit() const
Determine whether this specifier is known to correspond to an explicit declaration.
ExplicitSpecKind getKind() const
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(const FunctionDecl *Function)
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
The return type of classify().
static Classification makeSimpleLValue()
Create a simple, modifiable lvalue.
This represents one expression.
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
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.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
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.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
ExtVectorType - Extended vector type.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
For a defaulted function, the kind of defaulted function that it is.
CXXSpecialMemberKind asSpecialMember() const
bool isComparison() const
bool isSpecialMember() const
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
const ParmVarDecl * getParamDecl(unsigned i) const
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
bool hasCXXExplicitFunctionObjectParameter() const
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
bool isVariadic() const
Whether this function is variadic.
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
unsigned getNumNonObjectParams() const
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
DefaultedFunctionKind getDefaultedFunctionKind() const
Determine the kind of defaulting that would be done for a given function.
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isTargetMultiVersionDefault() const
True if this function is the default version of a multiversioned dispatch function as a part of the t...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
unsigned getNumParams() const
Qualifiers getMethodQuals() const
QualType getParamType(unsigned i) const
bool isVariadic() const
Whether this function prototype is variadic.
ArrayRef< QualType > param_types() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
A class which abstracts out some details necessary for making a call.
ExtInfo withNoReturn(bool noReturn) const
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
CallingConv getCallConv() const
QualType getReturnType() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
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.
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)
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
void dump() const
dump - Print this implicit conversion sequence to standard error.
bool isUserDefined() const
@ StaticObjectArgumentConversion
StandardConversionSequence Standard
When ConversionKind == StandardConversion, provides the details of the standard conversion sequence.
void setBad(BadConversionSequence::FailureKind Failure, Expr *FromExpr, QualType ToType)
Sets this sequence as a bad conversion for an explicit argument.
UserDefinedConversionSequence UserDefined
When ConversionKind == UserDefinedConversion, provides the details of the user-defined conversion seq...
static ImplicitConversionSequence getNullptrToBool(QualType SourceType, QualType DestType, bool NeedLValToRVal)
Form an "implicit" conversion sequence from nullptr_t to bool, for a direct-initialization of a bool ...
AmbiguousConversionSequence Ambiguous
When ConversionKind == AmbiguousConversion, provides the details of the ambiguous conversion.
bool hasInitializerListContainerType() const
unsigned getKindRank() const
Return a ranking of the implicit conversion sequence kind, where smaller ranks represent better conve...
bool isInitializerListOfIncompleteArray() const
BadConversionSequence Bad
When ConversionKind == BadConversion, provides the details of the bad conversion.
QualType getInitializerListContainerType() const
void DiagnoseAmbiguousConversion(Sema &S, SourceLocation CaretLoc, const PartialDiagnostic &PDiag) const
Diagnoses an ambiguous conversion.
Describes an C or C++ initializer list.
bool hasDesignatedInit() const
Determine whether this initializer list contains a designated initializer.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
const Expr * getInit(unsigned Init) const
SourceLocation getEndLoc() const LLVM_READONLY
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeTemplateParameter(QualType T, NamedDecl *Param)
Create the initialization entity for a template parameter.
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'.
An lvalue reference type, per C++11 [dcl.ref].
bool isCompatibleWithMSVC() const
Represents the results of name lookup.
void addAllDecls(const LookupResult &Other)
Add all the declarations from another set of lookup results.
DeclClass * getAsSingle() const
bool empty() const
Return true if no decls were found.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
void suppressAccessDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup due to access control violat...
UnresolvedSetImpl::iterator iterator
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
SourceLocation getMemberLoc() const
getMemberLoc - Return the location of the "member", in X->F, it is the location of 'F'.
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding the member name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name,...
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
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 ...
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments (if present) into the given structure.
bool performsVirtualDispatch(const LangOptions &LO) const
Returns true if virtual dispatch is performed.
SourceLocation getBeginLoc() const LLVM_READONLY
DeclarationNameInfo getMemberNameInfo() const
Retrieve the member declaration name info.
DeclAccessPair getFoundDecl() const
Retrieves the declaration found by lookup.
A pointer to member type per C++ 8.3.3 - Pointers to members.
NestedNameSpecifier getQualifier() const
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
QualType getPointeeType() const
Describes a module or submodule.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
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.
std::string getQualifiedNameAsString() const
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Represents an ObjC class declaration.
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCMethodDecl - Represents an instance or class method declaration.
Represents a pointer to an Objective C object.
bool isSpecialized() const
Whether this type is specialized, meaning that it has type arguments.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
void clear(CandidateSetKind CSK)
Clear out all of the candidates.
void AddDeferredTemplateCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, bool AllowExplicit, CallExpr::ADLCallKind IsADLCandidate, OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction)
bool isNewCandidate(Decl *F, OverloadCandidateParamOrder PO=OverloadCandidateParamOrder::Normal)
Determine when this overload candidate will be new to the overload set.
bool shouldDeferTemplateArgumentDeduction(const Sema &S) const
void AddDeferredConversionTemplateCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion)
void AddDeferredMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, OverloadCandidateParamOrder PO)
void DisableResolutionByPerfectCandidate()
ConversionSequenceList allocateConversionSequences(unsigned NumConversions)
Allocate storage for conversion sequences for NumConversions conversions.
llvm::MutableArrayRef< Expr * > getPersistentArgsArray(unsigned N)
Provide storage for any Expr* arg that must be preserved until deferred template candidates are deduc...
OperatorRewriteInfo getRewriteInfo() const
@ CSK_AddressOfOverloadSet
C++ [over.match.call.general] Resolve a call through the address of an overload set.
@ CSK_InitByConstructor
C++ [over.match.ctor], [over.match.list] Initialization of an object of class type by constructor,...
@ CSK_InitByUserDefinedConversion
C++ [over.match.copy]: Copy-initialization of an object of class type by user-defined conversion.
@ CSK_Normal
Normal lookup.
@ CSK_Operator
C++ [over.match.oper]: Lookup of operator function candidates in a call using operator syntax.
@ CSK_CodeCompletion
When doing overload resolution during code completion, we want to show all viable candidates,...
SmallVectorImpl< OverloadCandidate >::iterator iterator
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
bool shouldDeferDiags(Sema &S, ArrayRef< Expr * > Args, SourceLocation OpLoc)
Whether diagnostics should be deferred.
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
void exclude(Decl *F)
Exclude a function from being considered by overload resolution.
SourceLocation getLocation() const
OverloadCandidate & addCandidate(unsigned NumConversions=0, ConversionSequenceList Conversions={})
Add a new candidate with NumConversions conversion sequence slots to the overload set.
void InjectNonDeducedTemplateCandidates(Sema &S)
CandidateSetKind getKind() const
size_t nonDeferredCandidatesCount() const
SmallVector< OverloadCandidate *, 32 > CompleteCandidates(Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, SourceLocation OpLoc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
NestedNameSpecifier getQualifier() const
Fetches the nested-name qualifier, if one was given.
SourceLocation getNameLoc() const
Gets the location of the name.
UnresolvedSetImpl::iterator decls_iterator
decls_iterator decls_begin() const
unsigned getNumDecls() const
Gets the number of declarations in the unresolved set.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
decls_iterator decls_end() const
DeclarationName getName() const
Gets the name looked up.
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
ParenExpr - This represents a parenthesized expression, e.g.
Represents a parameter to a function.
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
bool isEquivalent(PointerAuthQualifier Other) const
std::string getAsString() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
QualType withConst() const
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
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 getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
bool isMoreQualifiedThan(QualType Other, const ASTContext &Ctx) const
Determine whether this type is more qualified than the other given type, requiring exact equality for...
bool isConstQualified() const
Determine whether this type is const-qualified.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualType apply(const ASTContext &Context, QualType QT) const
Apply the collected qualifiers to the given type.
QualifiersAndAtomic withVolatile()
QualifiersAndAtomic withAtomic()
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
bool hasOnlyConst() const
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
void removeObjCLifetime()
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
void removeAddressSpace()
void setAddressSpace(LangAS space)
PointerAuthQualifier getPointerAuth() const
bool hasObjCGCAttr() const
ObjCLifetime getObjCLifetime() const
std::string getAsString() const
LangAS getAddressSpace() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
field_range fields() const
RecordDecl * getDefinitionOrSelf() const
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Scope - A scope is a transient data structure that is used while parsing the program.
Smart pointer class that efficiently represents Objective-C method names.
unsigned getNumArgs() const
bool areCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an SVE builtin and a VectorType that is a fixed-length representat...
bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible SVE vector types, false otherwise.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
bool IsAllowedCall(const FunctionDecl *Caller, const FunctionDecl *Callee)
Determines whether Caller may invoke Callee, based on their CUDA host/device attributes.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
bool inferTargetForImplicitSpecialMember(CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, CXXMethodDecl *MemberDecl, bool ConstRHS, bool Diagnose)
Given a implicit special member, infer its CUDA target from the calls it needs to make to underlying ...
static bool isImplicitHostDeviceFunction(const FunctionDecl *D)
void EraseUnwantedMatches(const FunctionDecl *Caller, llvm::SmallVectorImpl< std::pair< DeclAccessPair, FunctionDecl * > > &Matches)
Finds a function in Matches with highest calling priority from Caller context and erases all function...
CUDAFunctionPreference IdentifyPreference(const FunctionDecl *Caller, const FunctionDecl *Callee)
Identifies relative preference of a given Caller/Callee combination, based on their host/device attri...
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
Expr * stripARCUnbridgedCast(Expr *e)
stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast type, remove the placeholder cast.
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
virtual SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for one of the candidate conversions.
virtual SemaDiagnosticBuilder diagnoseNoMatch(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic complaining that the expression does not have integral or enumeration type.
virtual SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for the explicit conversion function.
virtual SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when the only matching conversion function is explicit.
virtual SemaDiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when we picked a conversion function (for cases when we are not allowed to pick a ...
virtual SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when there are multiple possible conversion functions.
virtual bool match(QualType T)=0
Determine whether the specified type is a valid destination type for this conversion.
virtual SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when the expression has incomplete class type.
RAII class to control scope of DeferDiags.
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
DelayedDiagnosticsState pushUndelayed()
Enter a new scope where access and deprecation diagnostics are not delayed.
bool match(QualType T) override
Match an integral or (possibly scoped) enumeration type.
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Sema - This implements semantic analysis and AST building for C.
bool TryFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy) const
Same as IsFunctionConversion, but if this would return true, it sets ResultTy to ToType.
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function, const Expr *ThisArg, ArrayRef< const Expr * > Args, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any non-ArgDependent DiagnoseIf...
ExprResult PerformContextuallyConvertToObjCPointer(Expr *From)
PerformContextuallyConvertToObjCPointer - Perform a contextual conversion of the expression From to a...
bool buildOverloadedCallSet(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, MultiExprArg Args, SourceLocation RParenLoc, OverloadCandidateSet *CandidateSet, ExprResult *Result)
Constructs and populates an OverloadedCandidateSet from the given function.
void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow)
Hides a using shadow declaration.
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
ExprResult BuildLiteralOperatorCall(LookupResult &R, DeclarationNameInfo &SuffixInfo, ArrayRef< Expr * > Args, SourceLocation LitEndLoc, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to a literal operator descri...
bool IsStringInit(Expr *Init, const ArrayType *AT)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
void AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
Adds a conversion function template specialization candidate to the overload set, using template argu...
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
void AddBuiltinCandidate(QualType *ParamTys, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool IsAssignmentOperator=false, unsigned NumContextualBoolArguments=0)
AddBuiltinCandidate - Add a candidate for a built-in operator.
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void AddArgumentDependentLookupCandidates(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, TemplateArgumentListInfo *ExplicitTemplateArgs, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add function candidates found via argument-dependent lookup to the set of overloading candidates.
ExprResult EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue)
EvaluateConvertedConstantExpression - Evaluate an Expression That is a converted constant expression ...
FPOptionsOverride CurFPFeatureOverrides()
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
DiagnosticsEngine & getDiagnostics() const
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
bool CheckNonDependentConversions(FunctionTemplateDecl *FunctionTemplate, ArrayRef< QualType > ParamTypes, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, ConversionSequenceList &Conversions, CheckNonDependentConversionsFlag UserConversionFlag, CXXRecordDecl *ActingContext=nullptr, QualType ObjectType=QualType(), Expr::Classification ObjectClassification={}, OverloadCandidateParamOrder PO={})
Check that implicit conversion sequences can be formed for each argument whose corresponding paramete...
bool isObjCPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType, bool &IncompatibleObjC)
isObjCPointerConversion - Determines whether this is an Objective-C pointer conversion.
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
bool FunctionParamTypesAreEqual(ArrayRef< QualType > Old, ArrayRef< QualType > New, unsigned *ArgPos=nullptr, bool Reversed=false)
FunctionParamTypesAreEqual - This routine checks two function proto types for equality of their param...
ExprResult PerformImplicitObjectArgumentInitialization(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, CXXMethodDecl *Method)
PerformObjectArgumentInitialization - Perform initialization of the implicit object parameter for the...
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
ASTContext & getASTContext() const
UnresolvedSetIterator getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd, TemplateSpecCandidateSet &FailedCandidates, SourceLocation Loc, const PartialDiagnostic &NoneDiag, const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag, bool Complain=true, QualType TargetType=QualType())
Retrieve the most specialized of the given function template specializations.
bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType)
IsIntegralPromotion - Determines whether the conversion from the expression From (whose potentially-a...
bool IsFloatingPointPromotion(QualType FromType, QualType ToType)
IsFloatingPointPromotion - Determines whether the conversion from FromType to ToType is a floating po...
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
void PopExpressionEvaluationContext()
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction, const FunctionDecl *NewFunction, unsigned *ArgPos=nullptr, bool Reversed=false)
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
void LookupOverloadedUnaryOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded unary operator.
llvm::SmallSetVector< CXXRecordDecl *, 16 > AssociatedClassSet
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr, const SourceRange &, DeclAccessPair FoundDecl)
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType)
bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType, bool &IncompatibleObjC)
IsPointerConversion - Determines whether the conversion of the expression From, which has the (possib...
@ Conversions
Allow explicit conversion functions but not explicit constructors.
void DiagnoseUseOfDeletedFunction(SourceLocation Loc, SourceRange Range, DeclarationName Name, OverloadCandidateSet &CandidateSet, FunctionDecl *Fn, MultiExprArg Args, bool IsMember=false)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool IsComplexPromotion(QualType FromType, QualType ToType)
Determine if a conversion is a complex promotion.
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
void AddConversionCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true, bool StrictPackMatch=false)
AddConversionCandidate - Add a C++ conversion function as a candidate in the candidate set (C++ [over...
bool IsBlockPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc, ArrayRef< Expr * > Args, AssociatedNamespaceSet &AssociatedNamespaces, AssociatedClassSet &AssociatedClasses)
Find the associated classes and namespaces for argument-dependent lookup for a call with the given se...
void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, OverloadCandidateParamOrder PO={})
Add a C++ member function template as a candidate to the candidate set, using template argument deduc...
void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation OpLoc)
DiagnoseSelfMove - Emits a warning if a value is moved to itself.
bool isSameOrCompatibleFunctionType(QualType Param, QualType Arg)
Compare types for equality with respect to possibly compatible function types (noreturn adjustment,...
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
const LangOptions & getLangOpts() const
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A, const NamedDecl *B)
Determine if A and B are equivalent internal linkage declarations from different modules,...
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr)
Diagnose an empty lookup.
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult BuildSynthesizedThreeWayComparison(SourceLocation OpLoc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, FunctionDecl *DefaultedFn)
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc, const Expr *Op, const CXXMethodDecl *MD)
AccessResult CheckUnresolvedMemberAccess(UnresolvedMemberExpr *E, DeclAccessPair FoundDecl)
Perform access-control checking on a previously-unresolved member access which has now been resolved ...
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
const LangOptions & LangOpts
bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType)
IsMemberPointerConversion - Determines whether the conversion of the expression From,...
ExprResult BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef< Expr * > Arg, SourceLocation RParenLoc, Expr *Config=nullptr, bool IsExecConfig=false, ADLCallKind UsesADL=ADLCallKind::NotADL)
BuildResolvedCallExpr - Build a call to a resolved expression, i.e.
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
MemberPointerConversionDirection
bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any ArgDependent DiagnoseIfAttr...
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
void popCodeSynthesisContext()
bool AreConstraintExpressionsEqual(const NamedDecl *Old, const Expr *OldConstr, const TemplateCompareNewDeclInfo &New, const Expr *NewConstr)
ReferenceConversionsScope::ReferenceConversions ReferenceConversions
MemberPointerConversionResult CheckMemberPointerConversion(QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind, CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange, bool IgnoreBaseAccess, MemberPointerConversionDirection Direction)
CheckMemberPointerConversion - Check the member pointer conversion from the expression From to the ty...
Expr * BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit)
Build a CXXThisExpr and mark it referenced in the current context.
bool IsOverflowBehaviorTypeConversion(QualType FromType, QualType ToType)
IsOverflowBehaviorTypeConversion - Determines whether the conversion from FromType to ToType necessar...
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add the overload candidates named by callee and/or found by argument dependent lookup to the given ov...
ExprResult DefaultLvalueConversion(Expr *E)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
void NoteOverloadCandidate(const NamedDecl *Found, const FunctionDecl *Fn, OverloadCandidateRewriteKind RewriteKind=OverloadCandidateRewriteKind(), QualType DestType=QualType(), bool TakingAddress=false)
bool DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType)
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
void ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, ADLResult &Functions)
FunctionDecl * resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult)
Given an expression that refers to an overloaded function, try to resolve that function to a single f...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
bool IsOverflowBehaviorTypePromotion(QualType FromType, QualType ToType)
IsOverflowBehaviorTypePromotion - Determines whether the conversion from FromType to ToType involves ...
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, SourceLocation Loc={}, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
AccessResult CheckAddressOfMemberAccess(Expr *OvlExpr, DeclAccessPair FoundDecl)
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
EnableIfAttr * CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc, ArrayRef< Expr * > Args, bool MissingImplicitThis=false)
Check the enable_if expressions on the given function.
ExprResult CreateUnresolvedLookupExpr(CXXRecordDecl *NamingClass, NestedNameSpecifierLoc NNSLoc, DeclarationNameInfo DNI, const UnresolvedSetImpl &Fns, bool PerformADL=true)
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversion=false, OverloadCandidateParamOrder PO={})
AddMethodCandidate - Adds a named decl (which is some kind of method) as a method candidate to the gi...
void diagnoseEquivalentInternalLinkageDeclarations(SourceLocation Loc, const NamedDecl *D, ArrayRef< const NamedDecl * > Equiv)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
ExprResult ActOnConditionalOp(SourceLocation QuestionLoc, SourceLocation ColonLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr)
ActOnConditionalOp - Parse a ?
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
bool resolveAndFixAddressOfSingleOverloadCandidate(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false)
Given an overloaded function, tries to turn it into a non-overloaded function reference using resolve...
CallExpr::ADLCallKind ADLCallKind
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
bool anyAltivecTypes(QualType srcType, QualType destType)
bool isLaxVectorConversion(QualType srcType, QualType destType)
Is this a legal conversion between two types, one of which is known to be a vector type?
ExprResult BuildOverloadedCallExpr(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, bool AllowTypoCorrection=true, bool CalleesAddressIsTaken=false)
BuildOverloadedCallExpr - Given the call expression that calls Fn (which eventually refers to the dec...
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
bool isSFINAEContext() const
ExprResult BuildCallToObjectOfClassType(Scope *S, Expr *Object, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc)
BuildCallToObjectOfClassType - Build a call to an object of class type (C++ [over....
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
bool CanPerformAggregateInitializationForOverloadResolution(const InitializedEntity &Entity, InitListExpr *From)
Determine whether we can perform aggregate initialization for the purposes of overload resolution.
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
void AddFunctionCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, bool SuppressUserConversions=false, bool PartialOverloading=false, bool FirstArgumentIsBase=false)
Add all of the function declarations in the given function set to the overload candidate set.
bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose=true)
CheckPointerConversion - Check the pointer conversion from the expression From to the type ToType.
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void AddNonMemberOperatorCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
Add all of the non-member operator function declarations in the given function set to the overload ca...
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc, CallExpr *CE, FunctionDecl *FD)
CheckCallReturnType - Checks that a call expression's return type is complete.
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, ReferenceConversions *Conv=nullptr)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
MemberPointerConversionResult
SourceManager & SourceMgr
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
NamespaceDecl * getStdNamespace() const
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
void AddSurrogateCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, const FunctionProtoType *Proto, Expr *Object, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddSurrogateCandidate - Adds a "surrogate" candidate function that converts the given Object to a fun...
MemberExpr * BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, bool HadMultipleCandidates, const DeclarationNameInfo &MemberNameInfo, QualType Ty, ExprValueKind VK, ExprObjectKind OK, const TemplateArgumentListInfo *TemplateArgs=nullptr)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
bool IsFunctionConversion(QualType FromType, QualType ToType) const
Determine whether the conversion from FromType to ToType is a valid conversion of ExtInfo/ExtProtoInf...
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(const NamedDecl *D1, ArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, ArrayRef< AssociatedConstraint > AC2)
If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...
ForRangeStatus BuildForRangeBeginEndCall(SourceLocation Loc, SourceLocation RangeLoc, const DeclarationNameInfo &NameInfo, LookupResult &MemberLookup, OverloadCandidateSet *CandidateSet, Expr *Range, ExprResult *CallExpr)
Build a call to 'begin' or 'end' for a C++11 for-range statement.
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
ExprResult InitializeExplicitObjectArgument(Sema &S, Expr *Obj, FunctionDecl *Fun)
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method, SourceLocation CallLoc)
Returns true if the explicit object parameter was invalid.
bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType)
Helper function to determine whether this is the (deprecated) C++ conversion from a string literal to...
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool ExecConfig=false)
ConvertArgumentsForCall - Converts the arguments specified in Args/NumArgs to the parameter types of ...
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false, bool PartialOverloading=false)
Returns the more specialized function template according to the rules of function template partial or...
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
void AddMemberOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, OverloadCandidateParamOrder PO={})
Add overload candidates for overloaded operators that are member functions.
void CheckVirtualDtorCall(CXXDestructorDecl *dtor, SourceLocation Loc, bool IsDelete, bool CallCanBeVirtual, bool WarnOnNonAbstractTypes, SourceLocation DtorLoc)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto, const Expr *ThisArg, ArrayRef< const Expr * > Args, bool IsMemberFunction, SourceLocation Loc, SourceRange Range, VariadicCallType CallType)
Handles the checks for format strings, non-POD arguments to vararg functions, NULL arguments passed t...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
void dump() const
dump - Print this standard conversion sequence to standard error.
void setFromType(QualType T)
DeclAccessPair FoundCopyConstructor
bool isIdentityConversion() const
unsigned BindsToRvalue
Whether we're binding to an rvalue.
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
QualType getFromType() const
ImplicitConversionKind First
First – The first conversion can be an lvalue-to-rvalue conversion, array-to-pointer conversion,...
unsigned BindsImplicitObjectArgumentWithoutRefQualifier
Whether this binds an implicit object argument to a non-static member function without a ref-qualifie...
unsigned ReferenceBinding
ReferenceBinding - True when this is a reference binding (C++ [over.ics.ref]).
void setAsIdentityConversion()
StandardConversionSequence - Set the standard conversion sequence to the identity conversion.
unsigned DeprecatedStringLiteralToCharPtr
Whether this is the deprecated conversion of a string literal to a pointer to non-const character dat...
CXXConstructorDecl * CopyConstructor
CopyConstructor - The copy constructor that is used to perform this conversion, when the conversion i...
unsigned IncompatibleObjC
IncompatibleObjC - Whether this is an Objective-C conversion that we should warn about (if we actuall...
unsigned ObjCLifetimeConversionBinding
Whether this binds a reference to an object with a different Objective-C lifetime qualifier.
ImplicitConversionKind Third
Third - The third conversion can be a qualification conversion or a function conversion.
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false, bool AllowRelaxedEval=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
unsigned QualificationIncludesObjCLifetime
Whether the qualification conversion involves a change in the Objective-C lifetime (for automatic ref...
void setToType(unsigned Idx, QualType T)
bool isPointerConversionToBool() const
isPointerConversionToBool - Determines whether this conversion is a conversion of a pointer or pointe...
void * ToTypePtrs[3]
ToType - The types that this conversion is converting to in each step.
unsigned IsLvalueReference
Whether this is an lvalue reference binding (otherwise, it's an rvalue reference binding).
ImplicitConversionKind Dimension
Dimension - Between the second and third conversion a vector or matrix dimension conversion may occur...
unsigned BindsToFunctionLvalue
Whether we're binding to a function lvalue.
unsigned DirectBinding
DirectBinding - True when this is a reference binding that is a direct binding (C++ [dcl....
ImplicitConversionRank getRank() const
getRank - Retrieve the rank of this standard conversion sequence (C++ 13.3.3.1.1p3).
bool isPointerConversionToVoidPointer(ASTContext &Context) const
isPointerConversionToVoidPointer - Determines whether this conversion is a conversion of a pointer to...
void setAllToTypes(QualType T)
unsigned FromBracedInitList
Whether the source expression was originally a single element braced-init-list.
QualType getToType(unsigned Idx) const
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
StringRef getString() const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
virtual bool hasIbm128Type() const
Determine whether the __ibm128 type is supported on this target.
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
A convenient class for passing around template argument information.
A template argument list.
Represents a template argument.
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
QualType getAsType() const
Retrieve the type for a type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
@ Template
The template argument is a template name that was provided for a template template parameter.
@ Pack
The template argument is actually a parameter pack.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
@ Template
A single template declaration.
bool hasAssociatedConstraints() const
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
SmallVector< TemplateSpecCandidate, 16 >::iterator iterator
void NoteCandidates(Sema &S, SourceLocation Loc)
NoteCandidates - When no template specialization match is found, prints diagnostic messages containin...
void clear()
Clear out all of the candidates.
SourceLocation getLocation() const
TemplateSpecCandidate & addCandidate()
Add a new candidate with NumConversions conversion sequence slots to the overload set.
Declaration of a template type parameter.
const Type * getTypeForDecl() const
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isBlockPointerType() const
bool isBooleanType() const
bool isObjCBuiltinType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
bool isIncompleteArrayType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isFloat16Type() const
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
bool isRValueReferenceType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
bool isConvertibleToFixedPointType() const
Return true if this can be converted to (or from) a fixed point type.
CXXRecordDecl * castAsCXXRecordDecl() const
bool isArithmeticType() const
bool isPointerType() const
bool isArrayParameterType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isObjCQualifiedIdType() const
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.
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isExtVectorBoolType() const
bool isObjCObjectOrInterfaceType() const
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isLValueReferenceType() const
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const BuiltinType * getAsPlaceholderType() const
bool isMemberPointerType() const
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isObjCIdType() const
bool isMatrixType() const
bool isOverflowBehaviorType() const
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isObjectType() const
Determine whether this type is an object type.
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isBFloat16Type() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isVectorType() const
bool isObjCClassType() const
bool isRealFloatingType() const
Floating point categories.
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isHLSLAttributedResourceType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
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 StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
DeclarationName getMemberName() const
Retrieve the name of the member that this expression refers to.
QualType getBaseType() const
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getMemberLoc() const
Retrieve the location of the name of the member that this expression refers to.
A set of unresolved declarations.
ArrayRef< DeclAccessPair > pairs() const
void addDecl(NamedDecl *D)
The iterator over UnresolvedSets.
A set of unresolved declarations.
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
static UserDefinedLiteral * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation LitEndLoc, SourceLocation SuffixLoc, FPOptionsOverride FPFeatures)
unsigned getNumElements() const
QualType getElementType() const
Provides information about an attempted template argument deduction, whose success or failure was des...
TemplateArgumentList * takeSugared()
Take ownership of the deduced template argument lists.
TemplateArgument SecondArg
The second template argument to which the template argument deduction failure refers.
TemplateParameter Param
The template parameter to which a template argument deduction failure refers.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
TemplateArgument FirstArg
The first template argument to which the template argument deduction failure refers.
ConstraintSatisfaction AssociatedConstraintsSatisfaction
The constraint satisfaction details resulting from the associated constraints satisfaction tests.
void takeSFINAEDiagnostic(PartialDiagnosticAt &PD)
Take ownership of the SFINAE diagnostic.
unsigned CallArgIndex
The index of the function argument that caused a deduction failure.
bool hasStrictPackMatch() const
specific_attr_iterator - Iterates over a subrange of an AttrVec, only providing attributes that are o...
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
PRESERVE_NONE bool Ret(InterpState &S)
void checkAssignmentLifetime(Sema &SemaRef, const AssignedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for assigning to the ent...
Top level wrappers for InstallAPI frontend operations.
ImplicitConversionRank GetDimensionConversionRank(ImplicitConversionRank Base, ImplicitConversionKind Dimension)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
bool isBetterOverloadCandidate(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2, SourceLocation Loc, OverloadCandidateSet::CandidateSetKind Kind, bool PartialOverloading=false)
isBetterOverloadCandidate - Determines whether the first overload candidate is a better candidate tha...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ ovl_fail_final_conversion_not_exact
This conversion function template specialization candidate is not viable because the final conversion...
@ ovl_fail_enable_if
This candidate function was not viable because an enable_if attribute disabled it.
@ ovl_fail_illegal_constructor
This conversion candidate was not considered because it is an illegal instantiation of a constructor ...
@ ovl_fail_bad_final_conversion
This conversion candidate is not viable because its result type is not implicitly convertible to the ...
@ ovl_fail_module_mismatched
This candidate was not viable because it has internal linkage and is from a different module unit tha...
@ ovl_fail_too_few_arguments
@ ovl_fail_addr_not_available
This candidate was not viable because its address could not be taken.
@ ovl_fail_too_many_arguments
@ ovl_non_default_multiversion_function
This candidate was not viable because it is a non-default multiversioned function.
@ ovl_fail_constraints_not_satisfied
This candidate was not viable because its associated constraints were not satisfied.
@ ovl_fail_bad_conversion
@ ovl_fail_bad_target
(CUDA) This candidate was not viable because the callee was not accessible from the caller's target (...
@ ovl_fail_inhctor_slice
This inherited constructor is not viable because it would slice the argument.
@ ovl_fail_object_addrspace_mismatch
This constructor/conversion candidate fail due to an address space mismatch between the object being ...
@ ovl_fail_explicit
This candidate constructor or conversion function is explicit but the context doesn't permit explicit...
@ ovl_fail_trivial_conversion
This conversion candidate was not considered because it duplicates the work of a trivial or derived-t...
@ Comparison
A comparison.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
ImplicitConversionRank
ImplicitConversionRank - The rank of an implicit conversion kind.
@ ICR_Conversion
Conversion.
@ ICR_Writeback_Conversion
ObjC ARC writeback conversion.
@ ICR_HLSL_Dimension_Reduction
HLSL Matching Dimension Reduction.
@ ICR_HLSL_Dimension_Reduction_Conversion
HLSL Dimension reduction with conversion.
@ ICR_HLSL_Scalar_Widening
HLSL Scalar Widening.
@ ICR_C_Conversion
Conversion only allowed in the C standard (e.g. void* to char*).
@ ICR_OCL_Scalar_Widening
OpenCL Scalar Widening.
@ ICR_Complex_Real_Conversion
Complex <-> Real conversion.
@ ICR_HLSL_Scalar_Widening_Conversion
HLSL Scalar Widening with conversion.
@ ICR_HLSL_Dimension_Reduction_Promotion
HLSL Dimension reduction with promotion.
@ ICR_Promotion
Promotion.
@ ICR_Exact_Match
Exact Match.
@ ICR_C_Conversion_Extension
Conversion not allowed by the C standard, but that we accept as an extension anyway.
@ ICR_HLSL_Scalar_Widening_Promotion
HLSL Scalar Widening with promotion.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_ViableCandidates
Requests that only viable candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ 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.
Expr::ConstantExprKind ConstantExprKind
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OverloadsShown
Specifies which overload candidates to display when overload resolution fails.
@ Ovl_Best
Show just the "best" overload candidates.
llvm::MutableArrayRef< ImplicitConversionSequence > ConversionSequenceList
A list of implicit conversion sequences for the arguments of an OverloadCandidate.
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
OverloadCandidateRewriteKind
The kinds of rewrite we perform on overload candidates.
@ CRK_Reversed
Candidate is a rewritten candidate with a reversed order of parameters.
@ CRK_None
Candidate is not a rewritten candidate.
@ CRK_DifferentOperator
Candidate is a rewritten candidate with a different operator name.
MutableArrayRef< Expr * > MultiExprArg
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Result
The result type of a method or function.
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
ImplicitConversionKind
ImplicitConversionKind - The kind of implicit conversion used to convert an argument to a parameter's...
@ ICK_Complex_Conversion
Complex conversions (C99 6.3.1.6)
@ ICK_Floating_Promotion
Floating point promotions (C++ [conv.fpprom])
@ ICK_Boolean_Conversion
Boolean conversions (C++ [conv.bool])
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
@ ICK_Fixed_Point_Conversion
Fixed point type conversions according to N1169.
@ ICK_Vector_Conversion
Vector conversions.
@ ICK_Block_Pointer_Conversion
Block Pointer conversions.
@ ICK_Pointer_Member
Pointer-to-member conversions (C++ [conv.mem])
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
@ ICK_HLSL_Array_RValue
HLSL non-decaying array rvalue cast.
@ ICK_SVE_Vector_Conversion
Arm SVE Vector conversions.
@ ICK_HLSL_Vector_Truncation
HLSL vector truncation.
@ ICK_Incompatible_Pointer_Conversion
C-only conversion between pointers with incompatible types.
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
@ ICK_RVV_Vector_Conversion
RISC-V RVV Vector conversions.
@ ICK_Complex_Promotion
Complex promotions (Clang extension)
@ ICK_Num_Conversion_Kinds
The number of conversion kinds.
@ ICK_HLSL_Matrix_Splat
HLSL matrix splat from scalar or boolean type.
@ ICK_Function_Conversion
Function pointer conversion (C++17 [conv.fctptr])
@ ICK_Vector_Splat
A vector splat from an arithmetic type.
@ ICK_Zero_Queue_Conversion
Zero constant to queue.
@ ICK_Identity
Identity conversion (no conversion)
@ ICK_Derived_To_Base
Derived-to-base (C++ [over.best.ics])
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
@ ICK_Qualification
Qualification conversions (C++ [conv.qual])
@ ICK_Pointer_Conversion
Pointer conversions (C++ [conv.ptr])
@ ICK_TransparentUnionConversion
Transparent Union Conversions.
@ ICK_Integral_Promotion
Integral promotions (C++ [conv.prom])
@ ICK_HLSL_Matrix_Truncation
HLSL Matrix truncation.
@ ICK_Floating_Conversion
Floating point conversions (C++ [conv.double].
@ ICK_Compatible_Conversion
Conversions between compatible types in C99.
@ ICK_C_Only_Conversion
Conversions allowed in C, but not C++.
@ ICK_Writeback_Conversion
Objective-C ARC writeback conversion.
@ ICK_Zero_Event_Conversion
Zero constant to event (OpenCL1.2 6.12.10)
@ ICK_Complex_Real
Complex-real conversions (C99 6.3.1.7)
@ ICK_Function_To_Pointer
Function-to-pointer (C++ [conv.array])
@ Template
We are parsing a template declaration.
TemplateSpecCandidateSetKind
ActionResult< CXXBaseSpecifier * > BaseResult
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
@ Compatible
Compatible - the types are compatible according to the standard.
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
@ FunctionTemplate
The name was classified as a function template name.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
CXXSpecialMemberKind
Kinds of C++ special members.
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
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_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool shouldEnforceArgLimit(bool PartialOverloading, FunctionDecl *Function)
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
NarrowingKind
NarrowingKind - The kind of narrowing conversion being performed by a standard conversion sequence ac...
@ NK_Not_Narrowing
Not a narrowing conversion.
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
@ TPOC_Conversion
Partial ordering of function templates for a call to a conversion function.
@ TPOC_Call
Partial ordering of function templates for a function call.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateDeductionResult
Describes the result of template argument deduction.
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
@ CUDATargetMismatch
CUDA Target attributes do not match.
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ Invalid
The declaration was invalid; do nothing.
@ Success
Template argument deduction was successful.
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
@ AlreadyDiagnosed
Some error which was already diagnosed.
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
U cast(CodeGen::Address addr)
ConstructorInfo getConstructorInfo(NamedDecl *ND)
@ None
The alignment was not explicit in code.
CCEKind
Contexts in which a converted constant expression is required.
@ TemplateArg
Value of a non-type template parameter.
@ Noexcept
Condition in a noexcept(bool) specifier.
@ ArrayBound
Array bound in array declarator or new-expression.
@ TempArgStrict
As above, but applies strict template checking rules.
@ PackIndex
Index of a pack indexing expression or specifier.
@ ExplicitBool
Condition in an explicit(bool) specifier.
ImplicitConversionRank GetConversionRank(ImplicitConversionKind Kind)
GetConversionRank - Retrieve the implicit conversion rank corresponding to the given implicit convers...
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
@ EST_None
no exception specification
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
__DEVICE__ _Tp abs(const std::complex< _Tp > &__c)
Represents an ambiguous user-defined conversion sequence.
ConversionSet::const_iterator const_iterator
ConversionSet & conversions()
SmallVector< std::pair< NamedDecl *, FunctionDecl * >, 4 > ConversionSet
void setFromType(QualType T)
void setToType(QualType T)
void addConversion(NamedDecl *Found, FunctionDecl *D)
void copyFrom(const AmbiguousConversionSequence &)
const Expr * ConstraintExpr
UnsignedOrNone ArgPackSubstIndex
QualType getToType() const
QualType getFromType() const
OverloadFixItKind Kind
The type of fix applied.
unsigned NumConversionsFixed
The number of Conversions fixed.
void setConversionChecker(TypeComparisonFuncTy Foo)
Resets the default conversion checker method.
std::vector< FixItHint > Hints
The list of Hints generated so far.
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.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
SourceLocation getCXXLiteralOperatorNameLoc() const
getCXXLiteralOperatorNameLoc - Returns the location of the literal operator name (not the operator ke...
A structure used to record information about a failed template argument deduction,...
void * Data
Opaque pointer containing additional data about this deduction failure.
const TemplateArgument * getSecondArg()
Return the second template argument this deduction failure refers to, if any.
unsigned Result
A Sema::TemplateDeductionResult.
PartialDiagnosticAt * getSFINAEDiagnostic()
Retrieve the diagnostic which caused this deduction failure, if any.
unsigned HasDiagnostic
Indicates whether a diagnostic is stored in Diagnostic.
TemplateDeductionResult getResult() const
void Destroy()
Free any memory associated with this deduction failure.
char Diagnostic[sizeof(PartialDiagnosticAt)]
A diagnostic indicating why deduction failed.
UnsignedOrNone getCallArgIndex()
Return the index of the call argument that this deduction failure refers to, if any.
TemplateParameter getTemplateParameter()
Retrieve the template parameter this deduction failure refers to, if any.
TemplateArgumentList * getTemplateArgumentList()
Retrieve the template argument list associated with this deduction failure, if any.
const TemplateArgument * getFirstArg()
Return the first template argument this deduction failure refers to, if any.
DeferredTemplateOverloadCandidate * Next
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
SmallVectorImpl< PartialDiagnosticAt > * ExtendedDiag
Location where we spot ptr to int cast or null subobject while evaluating constant expression in MS c...
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
Information about operator rewrites to consider when adding operator functions to a candidate set.
bool allowsReversed(OverloadedOperatorKind Op) const
Determine whether reversing parameter order is allowed for operator Op.
bool shouldAddReversed(Sema &S, ArrayRef< Expr * > OriginalArgs, FunctionDecl *FD) const
Determine whether we should add a rewritten candidate for FD with reversed parameter order.
bool isAcceptableCandidate(const FunctionDecl *FD) const
bool isReversible() const
Determines whether this operator could be implemented by a function with reversed parameter order.
SourceLocation OpLoc
The source location of the operator.
bool AllowRewrittenCandidates
Whether we should include rewritten candidates in the overload set.
OverloadCandidateRewriteKind getRewriteKind(const FunctionDecl *FD, OverloadCandidateParamOrder PO)
Determine the kind of rewrite that should be performed for this candidate.
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
unsigned StrictPackMatch
Have we matched any packs on the parameter side, versus any non-packs on the argument side,...
unsigned IgnoreObjectArgument
IgnoreObjectArgument - True to indicate that the first argument's conversion, which for this function...
bool TryToFixBadConversion(unsigned Idx, Sema &S)
bool NotValidBecauseConstraintExprHasError() const
unsigned IsADLCandidate
True if the candidate was found using ADL.
unsigned IsSurrogate
IsSurrogate - True to indicate that this candidate is a surrogate for a conversion to a function poin...
QualType BuiltinParamTypes[3]
BuiltinParamTypes - Provides the parameter types of a built-in overload candidate.
DeclAccessPair FoundDecl
FoundDecl - The original declaration that was looked up / invented / otherwise found,...
FunctionDecl * Function
Function - The actual function that this candidate represents.
unsigned RewriteKind
Whether this is a rewritten candidate, and if so, of what kind?
ConversionFixItGenerator Fix
The FixIt hints which can be used to fix the Bad candidate.
unsigned Best
Whether this candidate is the best viable function, or tied for being the best viable function.
StandardConversionSequence FinalConversion
FinalConversion - For a conversion function (where Function is a CXXConversionDecl),...
unsigned getNumParams() const
unsigned HasFinalConversion
Whether FinalConversion has been set.
unsigned TookAddressOfOverload
unsigned FailureKind
FailureKind - The reason why this candidate is not viable.
unsigned ExplicitCallArguments
The number of call arguments that were explicitly provided, to be used while performing partial order...
ConversionSequenceList Conversions
The conversion sequences used to convert the function arguments to the function parameters.
DeductionFailureInfo DeductionFailure
unsigned Viable
Viable - True to indicate that this overload candidate is viable.
CXXConversionDecl * Surrogate
Surrogate - The conversion function for which this candidate is a surrogate, but only if IsSurrogate ...
OverloadCandidateRewriteKind getRewriteKind() const
Get RewriteKind value in OverloadCandidateRewriteKind type (This function is to workaround the spurio...
bool HasFormOfMemberPointer
OverloadExpr * Expression
bool SuppressUserConversions
Do not consider any user-defined conversions when constructing the initializing sequence.
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Decl * Entity
The entity that is being synthesized.
Abstract class used to diagnose incomplete types.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
TemplateSpecCandidate - This is a generalization of OverloadCandidate which keeps track of template a...
DeductionFailureInfo DeductionFailure
Template argument deduction info.
Decl * Specialization
Specialization - The actual specialization that this candidate represents.
DeclAccessPair FoundDecl
The declaration that was looked up, together with its access.
void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)
void NoteDeductionFailure(Sema &S, bool ForTakingAddress, TemplateSpecCandidateSetKind CandidateSetKind)
Diagnose a template argument deduction failure.
UserDefinedConversionSequence - Represents a user-defined conversion sequence (C++ 13....
StandardConversionSequence Before
Represents the standard conversion that occurs before the actual user-defined conversion.
FunctionDecl * ConversionFunction
ConversionFunction - The function that will perform the user-defined conversion.
bool HadMultipleCandidates
HadMultipleCandidates - When this is true, it means that the conversion function was resolved from an...
StandardConversionSequence After
After - Represents the standard conversion that occurs after the actual user-defined conversion.
bool EllipsisConversion
EllipsisConversion - When this is true, it means user-defined conversion sequence starts with a ....
DeclAccessPair FoundConversionFunction
The declaration that we found via name lookup, which might be the same as ConversionFunction or it mi...
void dump() const
dump - Print this user-defined conversion sequence to standard error.
Describes an entity that is being assigned.