37#include "llvm/ADT/DenseSet.h"
38#include "llvm/ADT/STLExtras.h"
39#include "llvm/ADT/STLForwardCompat.h"
40#include "llvm/ADT/ScopeExit.h"
41#include "llvm/ADT/SmallPtrSet.h"
42#include "llvm/ADT/SmallVector.h"
56 return P->hasAttr<PassObjectSizeAttr>();
77 if (HadMultipleCandidates)
88 CK_FunctionToPointerDecay);
92 bool InOverloadResolution,
95 bool AllowObjCWritebackConversion);
99 bool InOverloadResolution,
107 bool AllowObjCConversionOnExplicit);
168 return Rank[(
int)Kind];
193 static const char *
const Name[] = {
197 "Function-to-pointer",
198 "Function pointer conversion",
200 "Integral promotion",
201 "Floating point promotion",
203 "Integral conversion",
204 "Floating conversion",
205 "Complex conversion",
206 "Floating-integral conversion",
207 "Pointer conversion",
208 "Pointer-to-member conversion",
209 "Boolean conversion",
210 "Compatible-types conversion",
211 "Derived-to-base conversion",
213 "SVE Vector conversion",
214 "RVV Vector conversion",
216 "Complex-real conversion",
217 "Block Pointer conversion",
218 "Transparent Union Conversion",
219 "Writeback conversion",
220 "OpenCL Zero Event Conversion",
221 "OpenCL Zero Queue Conversion",
222 "C specific type conversion",
223 "Incompatible pointer conversion",
224 "Fixed point conversion",
225 "HLSL vector truncation",
226 "Non-decaying array conversion",
314 const Expr *Converted) {
317 if (
auto *EWC = dyn_cast<ExprWithCleanups>(Converted)) {
324 while (
auto *ICE = dyn_cast<ImplicitCastExpr>(Converted)) {
325 switch (ICE->getCastKind()) {
327 case CK_IntegralCast:
328 case CK_IntegralToBoolean:
329 case CK_IntegralToFloating:
330 case CK_BooleanToSignedIntegral:
331 case CK_FloatingToIntegral:
332 case CK_FloatingToBoolean:
333 case CK_FloatingCast:
334 Converted = ICE->getSubExpr();
358 QualType &ConstantType,
bool IgnoreFloatToIntegralConversion)
const {
360 "narrowing check outside C++");
371 ToType = ET->getDecl()->getIntegerType();
377 goto FloatingIntegralConversion;
379 goto IntegralConversion;
390 FloatingIntegralConversion:
395 if (IgnoreFloatToIntegralConversion)
398 assert(
Initializer &&
"Unknown conversion expression");
404 if (std::optional<llvm::APSInt> IntConstantValue =
408 Result.convertFromAPInt(*IntConstantValue, IntConstantValue->isSigned(),
409 llvm::APFloat::rmNearestTiesToEven);
411 llvm::APSInt ConvertedValue = *IntConstantValue;
413 Result.convertToInteger(ConvertedValue,
414 llvm::APFloat::rmTowardZero, &ignored);
416 if (*IntConstantValue != ConvertedValue) {
417 ConstantValue =
APValue(*IntConstantValue);
444 Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue)) {
447 ConstantValue = R.
Val;
448 assert(ConstantValue.
isFloat());
449 llvm::APFloat FloatVal = ConstantValue.
getFloat();
452 llvm::APFloat Converted = FloatVal;
453 llvm::APFloat::opStatus ConvertStatus =
455 llvm::APFloat::rmNearestTiesToEven, &ignored);
457 llvm::APFloat::rmNearestTiesToEven, &ignored);
459 if (FloatVal.isNaN() && Converted.isNaN() &&
460 !FloatVal.isSignaling() && !Converted.isSignaling()) {
466 if (!Converted.bitwiseIsEqual(FloatVal)) {
473 if (ConvertStatus & llvm::APFloat::opOverflow) {
495 IntegralConversion: {
503 constexpr auto CanRepresentAll = [](
bool FromSigned,
unsigned FromWidth,
504 bool ToSigned,
unsigned ToWidth) {
505 return (FromWidth < ToWidth + (FromSigned == ToSigned)) &&
506 !(FromSigned && !ToSigned);
509 if (CanRepresentAll(FromSigned, FromWidth, ToSigned, ToWidth))
515 bool DependentBitField =
false;
517 if (BitField->getBitWidth()->isValueDependent())
518 DependentBitField =
true;
519 else if (
unsigned BitFieldWidth = BitField->getBitWidthValue();
520 BitFieldWidth < FromWidth) {
521 if (CanRepresentAll(FromSigned, BitFieldWidth, ToSigned, ToWidth))
525 FromWidth = BitFieldWidth;
533 std::optional<llvm::APSInt> OptInitializerValue =
535 if (!OptInitializerValue) {
539 if (DependentBitField && !(FromSigned && !ToSigned))
545 llvm::APSInt &InitializerValue = *OptInitializerValue;
546 bool Narrowing =
false;
547 if (FromWidth < ToWidth) {
550 if (InitializerValue.isSigned() && InitializerValue.isNegative())
556 InitializerValue.extend(InitializerValue.getBitWidth() + 1);
558 llvm::APSInt ConvertedValue = InitializerValue;
559 ConvertedValue = ConvertedValue.trunc(ToWidth);
560 ConvertedValue.setIsSigned(ToSigned);
561 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
562 ConvertedValue.setIsSigned(InitializerValue.isSigned());
564 if (ConvertedValue != InitializerValue)
569 ConstantValue =
APValue(InitializerValue);
585 ConstantValue = R.
Val;
586 assert(ConstantValue.
isFloat());
587 llvm::APFloat FloatVal = ConstantValue.
getFloat();
592 if (FloatVal.isNaN() && FloatVal.isSignaling()) {
608 raw_ostream &OS = llvm::errs();
609 bool PrintedSomething =
false;
612 PrintedSomething =
true;
616 if (PrintedSomething) {
622 OS <<
" (by copy constructor)";
624 OS <<
" (direct reference binding)";
626 OS <<
" (reference binding)";
628 PrintedSomething =
true;
632 if (PrintedSomething) {
636 PrintedSomething =
true;
639 if (!PrintedSomething) {
640 OS <<
"No conversions required";
647 raw_ostream &OS = llvm::errs();
655 OS <<
"aggregate initialization";
665 raw_ostream &OS = llvm::errs();
667 OS <<
"Worst list element conversion: ";
668 switch (ConversionKind) {
670 OS <<
"Standard conversion: ";
674 OS <<
"User-defined conversion: ";
678 OS <<
"Ellipsis conversion";
681 OS <<
"Ambiguous conversion";
684 OS <<
"Bad conversion";
709 struct DFIArguments {
715 struct DFIParamWithArguments : DFIArguments {
720 struct DFIDeducedMismatchArgs : DFIArguments {
722 unsigned CallArgIndex;
739 Result.Result =
static_cast<unsigned>(TDK);
740 Result.HasDiagnostic =
false;
759 auto *Saved =
new (Context) DFIDeducedMismatchArgs;
770 DFIArguments *Saved =
new (Context) DFIArguments;
782 DFIParamWithArguments *Saved =
new (Context) DFIParamWithArguments;
783 Saved->Param = Info.
Param;
796 Result.HasDiagnostic =
true;
801 CNSInfo *Saved =
new (Context) CNSInfo;
811 llvm_unreachable(
"not a deduction failure");
844 Diag->~PartialDiagnosticAt();
853 Diag->~PartialDiagnosticAt();
889 return TemplateParameter::getFromOpaqueValue(
Data);
894 return static_cast<DFIParamWithArguments*
>(
Data)->Param;
924 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->TemplateArgs;
930 return static_cast<CNSInfo*
>(
Data)->TemplateArgs;
962 return &
static_cast<DFIArguments*
>(
Data)->FirstArg;
994 return &
static_cast<DFIArguments*
>(
Data)->SecondArg;
1009 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->CallArgIndex;
1012 return std::nullopt;
1025 for (
unsigned I = 0; I <
X->getNumParams(); ++I)
1029 if (
auto *FTX =
X->getDescribedFunctionTemplate()) {
1034 FTY->getTemplateParameters()))
1043 OverloadedOperatorKind::OO_EqualEqual);
1055 OverloadedOperatorKind::OO_ExclaimEqual);
1056 if (isa<CXXMethodDecl>(EqFD)) {
1073 auto *NotEqFD = Op->getAsFunction();
1074 if (
auto *UD = dyn_cast<UsingShadowDecl>(Op))
1075 NotEqFD = UD->getUnderlyingDecl()->getAsFunction();
1078 cast<Decl>(Op->getLexicalDeclContext())))
1088 return Op == OO_EqualEqual || Op == OO_Spaceship;
1094 if (!allowsReversed(Op))
1096 if (Op == OverloadedOperatorKind::OO_EqualEqual) {
1097 assert(OriginalArgs.size() == 2);
1099 S, OpLoc, OriginalArgs[1], FD))
1110void OverloadCandidateSet::destroyCandidates() {
1112 for (
auto &
C : i->Conversions)
1113 C.~ImplicitConversionSequence();
1115 i->DeductionFailure.Destroy();
1120 destroyCandidates();
1121 SlabAllocator.Reset();
1122 NumInlineBytesUsed = 0;
1129 class UnbridgedCastsSet {
1139 Entry entry = { &
E,
E };
1140 Entries.push_back(entry);
1146 i = Entries.begin(), e = Entries.end(); i != e; ++i)
1147 *i->Addr = i->Saved;
1161 UnbridgedCastsSet *unbridgedCasts =
nullptr) {
1165 if (placeholder->getKind() == BuiltinType::Overload)
return false;
1169 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
1171 unbridgedCasts->save(S,
E);
1191 UnbridgedCastsSet &unbridged) {
1192 for (
unsigned i = 0, e = Args.size(); i != e; ++i)
1201 NamedDecl *&Match,
bool NewIsUsingDecl) {
1206 bool OldIsUsingDecl =
false;
1207 if (isa<UsingShadowDecl>(OldD)) {
1208 OldIsUsingDecl =
true;
1212 if (NewIsUsingDecl)
continue;
1214 OldD = cast<UsingShadowDecl>(OldD)->getTargetDecl();
1219 if ((OldIsUsingDecl || NewIsUsingDecl) && !isVisible(*I))
1227 bool UseMemberUsingDeclRules =
1228 (OldIsUsingDecl || NewIsUsingDecl) && CurContext->isRecord() &&
1232 if (!IsOverload(New, OldF, UseMemberUsingDeclRules)) {
1233 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
1234 HideUsingShadowDecl(S, cast<UsingShadowDecl>(*I));
1238 if (!isa<FunctionTemplateDecl>(OldD) &&
1239 !shouldLinkPossiblyHiddenDecl(*I, New))
1248 if (!getASTContext().canBuiltinBeRedeclared(OldF)) {
1250 return Ovl_NonFunction;
1252 }
else if (isa<UsingDecl>(OldD) || isa<UsingPackDecl>(OldD)) {
1256 }
else if (isa<TagDecl>(OldD)) {
1258 }
else if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(OldD)) {
1265 if (UUD->getQualifier()->isDependent() && !UUD->isCXXClassMember()) {
1267 return Ovl_NonFunction;
1274 return Ovl_NonFunction;
1299 if (CheckFunctionTemplateSpecialization(New,
nullptr, TemplateSpecResult,
1302 return Ovl_Overload;
1309 return Ovl_Overload;
1313 assert(
D &&
"function decl should not be null");
1315 return !A->isImplicit();
1321 bool UseMemberUsingDeclRules,
1322 bool ConsiderCudaAttrs,
1323 bool UseOverrideRules =
false) {
1340 if ((OldTemplate ==
nullptr) != (NewTemplate ==
nullptr))
1353 if (isa<FunctionNoProtoType>(OldQType.
getTypePtr()) ||
1354 isa<FunctionNoProtoType>(NewQType.
getTypePtr()))
1357 const auto *OldType = cast<FunctionProtoType>(OldQType);
1358 const auto *NewType = cast<FunctionProtoType>(NewQType);
1363 if (OldQType != NewQType && OldType->isVariadic() != NewType->isVariadic())
1378 OldDecl = OldTemplate;
1379 NewDecl = NewTemplate;
1397 bool ConstraintsInTemplateHead =
1408 if (UseMemberUsingDeclRules && ConstraintsInTemplateHead &&
1409 !SameTemplateParameterList)
1411 if (!UseMemberUsingDeclRules &&
1412 (!SameTemplateParameterList || !SameReturnType))
1416 const auto *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1417 const auto *NewMethod = dyn_cast<CXXMethodDecl>(New);
1419 int OldParamsOffset = 0;
1420 int NewParamsOffset = 0;
1428 if (ThisType.isConstQualified())
1442 !isa<CXXConstructorDecl>(NewMethod))
1448 BS.
Quals = NormalizeQualifiers(OldMethod, BS.
Quals);
1449 DS.Quals = NormalizeQualifiers(NewMethod, DS.Quals);
1451 if (OldMethod->isExplicitObjectMemberFunction()) {
1453 DS.Quals.removeVolatile();
1456 return BS.
Quals == DS.Quals;
1460 auto BS =
Base.getNonReferenceType().getCanonicalType().split();
1461 auto DS =
D.getNonReferenceType().getCanonicalType().split();
1463 if (!AreQualifiersEqual(BS, DS))
1466 if (OldMethod->isImplicitObjectMemberFunction() &&
1467 OldMethod->getParent() != NewMethod->getParent()) {
1470 .getCanonicalType();
1480 if (
Base->isLValueReferenceType())
1481 return D->isLValueReferenceType();
1482 return Base->isRValueReferenceType() ==
D->isRValueReferenceType();
1487 auto DiagnoseInconsistentRefQualifiers = [&]() {
1490 if (OldMethod->getRefQualifier() == NewMethod->getRefQualifier())
1492 if (OldMethod->isExplicitObjectMemberFunction() ||
1493 NewMethod->isExplicitObjectMemberFunction())
1495 if (!UseMemberUsingDeclRules && (OldMethod->getRefQualifier() ==
RQ_None ||
1496 NewMethod->getRefQualifier() ==
RQ_None)) {
1497 SemaRef.
Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
1498 << NewMethod->getRefQualifier() << OldMethod->getRefQualifier();
1499 SemaRef.
Diag(OldMethod->getLocation(), diag::note_previous_declaration);
1505 if (OldMethod && OldMethod->isExplicitObjectMemberFunction())
1507 if (NewMethod && NewMethod->isExplicitObjectMemberFunction())
1510 if (OldType->getNumParams() - OldParamsOffset !=
1511 NewType->getNumParams() - NewParamsOffset ||
1513 {OldType->param_type_begin() + OldParamsOffset,
1514 OldType->param_type_end()},
1515 {NewType->param_type_begin() + NewParamsOffset,
1516 NewType->param_type_end()},
1521 if (OldMethod && NewMethod && !OldMethod->isStatic() &&
1522 !NewMethod->isStatic()) {
1523 bool HaveCorrespondingObjectParameters = [&](
const CXXMethodDecl *Old,
1525 auto NewObjectType = New->getFunctionObjectParameterReferenceType();
1529 return F->getRefQualifier() ==
RQ_None &&
1530 !F->isExplicitObjectMemberFunction();
1533 if (IsImplicitWithNoRefQual(Old) != IsImplicitWithNoRefQual(New) &&
1534 CompareType(OldObjectType.getNonReferenceType(),
1535 NewObjectType.getNonReferenceType()))
1537 return CompareType(OldObjectType, NewObjectType);
1538 }(OldMethod, NewMethod);
1540 if (!HaveCorrespondingObjectParameters) {
1541 if (DiagnoseInconsistentRefQualifiers())
1546 if (!UseOverrideRules || (!NewMethod->isExplicitObjectMemberFunction() &&
1547 !OldMethod->isExplicitObjectMemberFunction()))
1552 if (!UseOverrideRules &&
1556 if ((NewRC !=
nullptr) != (OldRC !=
nullptr))
1563 if (NewMethod && OldMethod && OldMethod->isImplicitObjectMemberFunction() &&
1564 NewMethod->isImplicitObjectMemberFunction()) {
1565 if (DiagnoseInconsistentRefQualifiers())
1583 NewI != NewE || OldI != OldE; ++NewI, ++OldI) {
1584 if (NewI == NewE || OldI == OldE)
1586 llvm::FoldingSetNodeID NewID, OldID;
1588 OldI->getCond()->Profile(OldID, SemaRef.
Context,
true);
1594 if (SemaRef.
getLangOpts().CUDA && ConsiderCudaAttrs) {
1597 if (!isa<CXXDestructorDecl>(New)) {
1602 "Unexpected invalid target.");
1606 if (NewTarget != OldTarget) {
1609 if (OldMethod && NewMethod && OldMethod->isVirtual() &&
1610 OldMethod->isConstexpr() && !NewMethod->isConstexpr() &&
1611 !hasExplicitAttr<CUDAHostAttr>(Old) &&
1612 !hasExplicitAttr<CUDADeviceAttr>(Old) &&
1613 !hasExplicitAttr<CUDAHostAttr>(New) &&
1614 !hasExplicitAttr<CUDADeviceAttr>(New)) {
1628 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1634 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1647 bool SuppressUserConversions,
1649 bool InOverloadResolution,
1651 bool AllowObjCWritebackConversion,
1652 bool AllowObjCConversionOnExplicit) {
1655 if (SuppressUserConversions) {
1666 Conversions, AllowExplicit,
1667 AllowObjCConversionOnExplicit)) {
1688 if (
const auto *InitList = dyn_cast<InitListExpr>(From);
1689 InitList && InitList->getNumInits() == 1 &&
1691 const Expr *SingleInit = InitList->getInit(0);
1692 FromType = SingleInit->
getType();
1702 if ((FromCanon == ToCanon ||
1713 if (ToCanon != FromCanon)
1724 Cand != Conversions.
end(); ++Cand)
1767 bool SuppressUserConversions,
1769 bool InOverloadResolution,
1771 bool AllowObjCWritebackConversion,
1772 bool AllowObjCConversionOnExplicit) {
1775 ICS.
Standard, CStyle, AllowObjCWritebackConversion)){
1816 auto *ToResType = cast<HLSLAttributedResourceType>(ToType);
1817 auto *FromResType = cast<HLSLAttributedResourceType>(FromType);
1819 FromResType->getWrappedType()) &&
1821 FromResType->getContainedType()) &&
1822 ToResType->getAttrs() == FromResType->getAttrs()) {
1832 AllowExplicit, InOverloadResolution, CStyle,
1833 AllowObjCWritebackConversion,
1834 AllowObjCConversionOnExplicit);
1839 bool SuppressUserConversions,
1841 bool InOverloadResolution,
1843 bool AllowObjCWritebackConversion) {
1844 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1845 AllowExplicit, InOverloadResolution, CStyle,
1846 AllowObjCWritebackConversion,
1852 bool AllowExplicit) {
1857 bool AllowObjCWritebackConversion =
1860 if (getLangOpts().ObjC)
1864 *
this, From, ToType,
1866 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1868 false, AllowObjCWritebackConversion,
1870 return PerformImplicitConversion(From, ToType, ICS, Action);
1888 if (TyClass != CanFrom->getTypeClass())
return false;
1889 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1890 if (TyClass == Type::Pointer) {
1893 }
else if (TyClass == Type::BlockPointer) {
1896 }
else if (TyClass == Type::MemberPointer) {
1900 if (ToMPT->getClass() != FromMPT->
getClass())
1902 CanTo = ToMPT->getPointeeType();
1908 TyClass = CanTo->getTypeClass();
1909 if (TyClass != CanFrom->getTypeClass())
return false;
1910 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1914 const auto *FromFn = cast<FunctionType>(CanFrom);
1917 const auto *ToFn = cast<FunctionType>(CanTo);
1920 bool Changed =
false;
1929 if (
const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn)) {
1930 const auto *ToFPT = cast<FunctionProtoType>(ToFn);
1931 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
1932 FromFn = cast<FunctionType>(
1943 bool CanUseToFPT, CanUseFromFPT;
1945 CanUseFromFPT, NewParamInfos) &&
1946 CanUseToFPT && !CanUseFromFPT) {
1949 NewParamInfos.empty() ? nullptr : NewParamInfos.data();
1951 FromFPT->getParamTypes(), ExtInfo);
1961 FromFPT = cast<FunctionProtoType>(FromFn);
1965 const auto FromFX = FromFPT->getFunctionEffects();
1966 const auto ToFX = ToFPT->getFunctionEffects();
1967 if (FromFX != ToFX) {
1971 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
1981 assert(
QualType(FromFn, 0).isCanonical());
1982 if (
QualType(FromFn, 0) != CanTo)
return false;
2010 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
2011 &ToSem == &llvm::APFloat::IEEEquad()) ||
2012 (&FromSem == &llvm::APFloat::IEEEquad() &&
2013 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2068 bool InOverloadResolution,
bool CStyle) {
2085 if (ToExtType && FromExtType) {
2087 unsigned ToElts = ToExtType->getNumElements();
2088 if (FromElts < ToElts)
2090 if (FromElts == ToElts)
2096 QualType ToElTy = ToExtType->getElementType();
2101 if (FromExtType && !ToExtType) {
2123 QualType ToElTy = ToExtType->getElementType();
2157 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
2162 !InOverloadResolution && !CStyle) {
2164 << FromType << ToType;
2175 bool InOverloadResolution,
2188 bool InOverloadResolution,
2191 bool AllowObjCWritebackConversion) {
2217 FromType = Fn->getType();
2238 if (Method && !Method->
isStatic() &&
2241 "Non-unary operator on non-static member address");
2242 assert(cast<UnaryOperator>(From->
IgnoreParens())->getOpcode()
2244 "Non-address-of operator on non-static member address");
2245 const Type *ClassType
2249 assert(cast<UnaryOperator>(From->
IgnoreParens())->getOpcode() ==
2251 "Non-address-of operator for overloaded function expression");
2298 FromType =
Atomic->getValueType();
2333 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2353 bool IncompatibleObjC =
false;
2408 }
else if (AllowObjCWritebackConversion &&
2412 FromType, IncompatibleObjC)) {
2418 InOverloadResolution, FromType)) {
2422 From, InOverloadResolution, CStyle)) {
2432 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2468 bool ObjCLifetimeConversion;
2474 ObjCLifetimeConversion)) {
2493 CanonFrom = CanonTo;
2498 if (CanonFrom == CanonTo)
2503 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2547 bool InOverloadResolution,
2557 for (
const auto *it : UD->
fields()) {
2560 ToType = it->getType();
2586 return To->
getKind() == BuiltinType::Int;
2589 return To->
getKind() == BuiltinType::UInt;
2613 if (FromEnumType->getDecl()->isScoped())
2620 if (FromEnumType->getDecl()->isFixed()) {
2621 QualType Underlying = FromEnumType->getDecl()->getIntegerType();
2623 IsIntegralPromotion(
nullptr, Underlying, ToType);
2630 ToType, FromEnumType->getDecl()->getPromotionType());
2655 uint64_t FromSize = Context.
getTypeSize(FromType);
2664 for (
int Idx = 0; Idx < 6; ++Idx) {
2665 uint64_t ToSize = Context.
getTypeSize(PromoteTypes[Idx]);
2666 if (FromSize < ToSize ||
2667 (FromSize == ToSize &&
2668 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2693 std::optional<llvm::APSInt> BitWidth;
2696 MemberDecl->getBitWidth()->getIntegerConstantExpr(Context))) {
2697 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2701 if (*BitWidth < ToSize ||
2703 return To->
getKind() == BuiltinType::Int;
2709 return To->
getKind() == BuiltinType::UInt;
2737 if (FromBuiltin->getKind() == BuiltinType::Float &&
2738 ToBuiltin->getKind() == BuiltinType::Double)
2745 (FromBuiltin->getKind() == BuiltinType::Float ||
2746 FromBuiltin->getKind() == BuiltinType::Double) &&
2747 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2748 ToBuiltin->getKind() == BuiltinType::Float128 ||
2749 ToBuiltin->getKind() == BuiltinType::Ibm128))
2754 if (getLangOpts().
HLSL && FromBuiltin->getKind() == BuiltinType::Half &&
2755 (ToBuiltin->getKind() == BuiltinType::Float ||
2756 ToBuiltin->getKind() == BuiltinType::Double))
2760 if (!getLangOpts().NativeHalfType &&
2761 FromBuiltin->getKind() == BuiltinType::Half &&
2762 ToBuiltin->getKind() == BuiltinType::Float)
2794 bool StripObjCLifetime =
false) {
2797 "Invalid similarly-qualified pointer type");
2808 if (StripObjCLifetime)
2819 if (isa<ObjCObjectPointerType>(ToType))
2828 if (isa<ObjCObjectPointerType>(ToType))
2834 bool InOverloadResolution,
2840 return !InOverloadResolution;
2848 bool InOverloadResolution,
2850 bool &IncompatibleObjC) {
2851 IncompatibleObjC =
false;
2852 if (isObjCPointerConversion(FromType, ToType, ConvertedType,
2859 ConvertedType = ToType;
2866 ConvertedType = ToType;
2873 ConvertedType = ToType;
2881 ConvertedType = ToType;
2891 ConvertedType = ToType;
2899 !getLangOpts().ObjCAutoRefCount) {
2929 if (getLangOpts().MSVCCompat && FromPointeeType->
isFunctionType() &&
2963 IsDerivedFrom(From->
getBeginLoc(), FromPointeeType, ToPointeeType)) {
2997 bool &IncompatibleObjC) {
2998 if (!getLangOpts().
ObjC)
3010 if (ToObjCPtr && FromObjCPtr) {
3021 if (getLangOpts().CPlusPlus && LHS && RHS &&
3023 FromObjCPtr->getPointeeType(), getASTContext()))
3028 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
3036 IncompatibleObjC =
true;
3040 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
3052 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
3080 isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
3081 IncompatibleObjC)) {
3083 IncompatibleObjC =
true;
3085 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
3092 isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
3093 IncompatibleObjC)) {
3096 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
3108 if (FromFunctionType && ToFunctionType) {
3117 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3118 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
3119 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
3122 bool HasObjCConversion =
false;
3126 }
else if (isObjCPointerConversion(FromFunctionType->
getReturnType(),
3127 ToFunctionType->getReturnType(),
3128 ConvertedType, IncompatibleObjC)) {
3130 HasObjCConversion =
true;
3137 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3138 ArgIdx != NumArgs; ++ArgIdx) {
3140 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3144 }
else if (isObjCPointerConversion(FromArgType, ToArgType,
3145 ConvertedType, IncompatibleObjC)) {
3147 HasObjCConversion =
true;
3154 if (HasObjCConversion) {
3158 IncompatibleObjC =
true;
3190 if (!FromFunctionType || !ToFunctionType)
3193 if (Context.
hasSameType(FromPointeeType, ToPointeeType))
3198 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3199 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3204 if (FromEInfo != ToEInfo)
3207 bool IncompatibleObjC =
false;
3209 ToFunctionType->getReturnType())) {
3213 QualType LHS = ToFunctionType->getReturnType();
3214 if ((!getLangOpts().CPlusPlus || !RHS->
isRecordType()) &&
3220 }
else if (isObjCPointerConversion(RHS, LHS,
3221 ConvertedType, IncompatibleObjC)) {
3222 if (IncompatibleObjC)
3231 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3232 ArgIdx != NumArgs; ++ArgIdx) {
3233 IncompatibleObjC =
false;
3235 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3236 if (Context.
hasSameType(FromArgType, ToArgType)) {
3238 }
else if (isObjCPointerConversion(ToArgType, FromArgType,
3239 ConvertedType, IncompatibleObjC)) {
3240 if (IncompatibleObjC)
3249 bool CanUseToFPT, CanUseFromFPT;
3251 CanUseToFPT, CanUseFromFPT,
3255 ConvertedType = ToType;
3293 if (!Context.
hasSameType(FromMember->getClass(), ToMember->getClass())) {
3295 <<
QualType(FromMember->getClass(), 0);
3328 if (!FromFunction || !ToFunction) {
3333 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3341 if (!FunctionParamTypesAreEqual(FromFunction, ToFunction, &ArgPos)) {
3343 << ToFunction->getParamType(ArgPos)
3350 ToFunction->getReturnType())) {
3356 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3366 cast<FunctionProtoType>(ToFunction->getCanonicalTypeUnqualified())
3379 assert(llvm::size(Old) == llvm::size(New) &&
3380 "Can't compare parameters of functions with different number of "
3383 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3385 size_t J =
Reversed ? (llvm::size(New) - Idx - 1) : Idx;
3406 return FunctionParamTypesAreEqual(OldType->
param_types(),
3419 unsigned OldIgnore =
3421 unsigned NewIgnore =
3424 auto *OldPT = cast<FunctionProtoType>(OldFunction->
getFunctionType());
3425 auto *NewPT = cast<FunctionProtoType>(NewFunction->
getFunctionType());
3427 return FunctionParamTypesAreEqual(OldPT->param_types().slice(OldIgnore),
3428 NewPT->param_types().slice(NewIgnore),
3435 bool IgnoreBaseAccess,
3438 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3442 if (Diagnose && !IsCStyleOrFunctionalCast && !FromType->
isAnyPointerType() &&
3446 DiagRuntimeBehavior(From->
getExprLoc(), From,
3447 PDiag(diag::warn_impcast_bool_to_null_pointer)
3449 else if (!isUnevaluatedContext())
3458 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3462 unsigned InaccessibleID = 0;
3463 unsigned AmbiguousID = 0;
3465 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3466 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3468 if (CheckDerivedToBaseConversion(
3469 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3471 &BasePath, IgnoreBaseAccess))
3475 Kind = CK_DerivedToBase;
3478 if (Diagnose && !IsCStyleOrFunctionalCast &&
3479 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3480 assert(getLangOpts().MSVCCompat &&
3481 "this should only be possible with MSVCCompat!");
3493 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3496 Kind = CK_BlockPointerToObjCPointerCast;
3498 Kind = CK_CPointerToObjCPointerCast;
3502 Kind = CK_AnyPointerToBlockPointerCast;
3508 Kind = CK_NullToPointer;
3515 bool InOverloadResolution,
3525 ConvertedType = ToType;
3540 IsDerivedFrom(From->
getBeginLoc(), ToClass, FromClass)) {
3552 bool IgnoreBaseAccess) {
3559 "Expr must be null pointer constant!");
3560 Kind = CK_NullToMemberPointer;
3565 assert(ToPtrType &&
"No member pointer cast has a target type "
3566 "that is not a member pointer.");
3572 assert(FromClass->
isRecordType() &&
"Pointer into non-class.");
3573 assert(ToClass->
isRecordType() &&
"Pointer into non-class.");
3577 bool DerivationOkay =
3578 IsDerivedFrom(From->
getBeginLoc(), ToClass, FromClass, Paths);
3579 assert(DerivationOkay &&
3580 "Should not have been called if derivation isn't OK.");
3581 (void)DerivationOkay;
3584 getUnqualifiedType())) {
3585 std::string PathDisplayStr = getAmbiguousPathsDisplayString(Paths);
3587 << 0 << FromClass << ToClass << PathDisplayStr << From->
getSourceRange();
3591 if (
const RecordType *VBase = Paths.getDetectedVirtual()) {
3593 << FromClass << ToClass <<
QualType(VBase, 0)
3598 if (!IgnoreBaseAccess)
3599 CheckBaseClassAccess(From->
getExprLoc(), FromClass, ToClass,
3601 diag::err_downcast_from_inaccessible_base);
3605 Kind = CK_BaseToDerivedMemberPointer;
3628 bool CStyle,
bool IsTopLevel,
3629 bool &PreviousToQualsIncludeConst,
3630 bool &ObjCLifetimeConversion,
3643 ObjCLifetimeConversion =
true;
3679 !PreviousToQualsIncludeConst)
3697 PreviousToQualsIncludeConst =
3698 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3704 bool CStyle,
bool &ObjCLifetimeConversion) {
3707 ObjCLifetimeConversion =
false;
3717 bool PreviousToQualsIncludeConst =
true;
3718 bool UnwrappedAnyPointer =
false;
3721 !UnwrappedAnyPointer,
3722 PreviousToQualsIncludeConst,
3723 ObjCLifetimeConversion, getASTContext()))
3725 UnwrappedAnyPointer =
true;
3742 bool InOverloadResolution,
3751 InOverloadResolution, InnerSCS,
3768 if (CtorType->getNumParams() > 0) {
3769 QualType FirstArg = CtorType->getParamType(0);
3781 bool AllowExplicit) {
3788 bool Usable = !Info.Constructor->isInvalidDecl() &&
3791 bool SuppressUserConversions =
false;
3792 if (Info.ConstructorTmpl)
3795 CandidateSet, SuppressUserConversions,
3800 CandidateSet, SuppressUserConversions,
3801 false, AllowExplicit);
3805 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
3814 QualType ThisType = Constructor->getFunctionObjectParameterType();
3832 llvm_unreachable(
"Invalid OverloadResult!");
3854 bool AllowObjCConversionOnExplicit) {
3855 assert(AllowExplicit != AllowedExplicit::None ||
3856 !AllowObjCConversionOnExplicit);
3860 bool ConstructorsOnly =
false;
3876 ConstructorsOnly =
true;
3881 = dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
3883 Expr **Args = &From;
3884 unsigned NumArgs = 1;
3885 bool ListInitializing =
false;
3886 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
3889 S, From, ToType, ToRecordDecl, User, CandidateSet,
3890 AllowExplicit == AllowedExplicit::All);
3899 Args = InitList->getInits();
3900 NumArgs = InitList->getNumInits();
3901 ListInitializing =
true;
3909 bool Usable = !Info.Constructor->isInvalidDecl();
3910 if (!ListInitializing)
3911 Usable = Usable && Info.Constructor->isConvertingConstructor(
3914 bool SuppressUserConversions = !ConstructorsOnly;
3922 if (SuppressUserConversions && ListInitializing) {
3923 SuppressUserConversions =
3924 NumArgs == 1 && isa<InitListExpr>(Args[0]) &&
3928 if (Info.ConstructorTmpl)
3930 Info.ConstructorTmpl, Info.FoundDecl,
3932 CandidateSet, SuppressUserConversions,
3934 AllowExplicit == AllowedExplicit::All);
3940 SuppressUserConversions,
3942 AllowExplicit == AllowedExplicit::All);
3949 if (ConstructorsOnly || isa<InitListExpr>(From)) {
3952 }
else if (
const RecordType *FromRecordType =
3955 = dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
3957 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
3958 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
3962 if (isa<UsingShadowDecl>(
D))
3963 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
3967 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(
D)))
3970 Conv = cast<CXXConversionDecl>(
D);
3974 ConvTemplate, FoundDecl, ActingContext, From, ToType,
3975 CandidateSet, AllowObjCConversionOnExplicit,
3976 AllowExplicit != AllowedExplicit::None);
3979 CandidateSet, AllowObjCConversionOnExplicit,
3980 AllowExplicit != AllowedExplicit::None);
3985 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
3994 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
4001 if (isa<InitListExpr>(From)) {
4005 if (Best->Conversions[0].isEllipsis())
4008 User.
Before = Best->Conversions[0].Standard;
4021 = dyn_cast<CXXConversionDecl>(Best->Function)) {
4028 User.
Before = Best->Conversions[0].Standard;
4043 User.
After = Best->FinalConversion;
4046 llvm_unreachable(
"Not a constructor or conversion function?");
4055 llvm_unreachable(
"Invalid OverloadResult!");
4065 CandidateSet, AllowedExplicit::None,
false);
4079 if (!RequireCompleteType(From->
getBeginLoc(), ToType,
4080 diag::err_typecheck_nonviable_condition_incomplete,
4087 *
this, From, Cands);
4113 if (!Conv1 || !Conv2)
4128 if (Block1 != Block2)
4141 if (Conv1FuncRet && Conv2FuncRet &&
4152 CallOpProto->isVariadic(),
false);
4154 CallOpProto->isVariadic(),
true);
4156 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4251 if (!ICS1.
isBad()) {
4252 bool StdInit1 =
false, StdInit2 =
false;
4259 if (StdInit1 != StdInit2)
4270 CAT2->getElementType())) {
4272 if (CAT1->getSize() != CAT2->getSize())
4274 return CAT1->getSize().ult(CAT2->getSize())
4396 return FixedEnumPromotion::None;
4400 return FixedEnumPromotion::None;
4403 if (!
Enum->isFixed())
4404 return FixedEnumPromotion::None;
4408 return FixedEnumPromotion::ToUnderlyingType;
4410 return FixedEnumPromotion::ToPromotedUnderlyingType;
4439 else if (Rank2 < Rank1)
4462 if (FEP1 != FixedEnumPromotion::None && FEP2 != FixedEnumPromotion::None &&
4464 return FEP1 == FixedEnumPromotion::ToUnderlyingType
4474 bool SCS1ConvertsToVoid
4476 bool SCS2ConvertsToVoid
4478 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4483 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4489 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4518 if (FromObjCPtr1 && FromObjCPtr2) {
4523 if (AssignLeft != AssignRight) {
4558 if (UnqualT1 == UnqualT2) {
4570 if (isa<ArrayType>(T1) && T1Quals)
4572 if (isa<ArrayType>(T2) && T2Quals)
4620 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4621 return SCS1IsCompatibleVectorConversion
4628 bool SCS1IsCompatibleSVEVectorConversion =
4630 bool SCS2IsCompatibleSVEVectorConversion =
4633 if (SCS1IsCompatibleSVEVectorConversion !=
4634 SCS2IsCompatibleSVEVectorConversion)
4635 return SCS1IsCompatibleSVEVectorConversion
4642 bool SCS1IsCompatibleRVVVectorConversion =
4644 bool SCS2IsCompatibleRVVVectorConversion =
4647 if (SCS1IsCompatibleRVVVectorConversion !=
4648 SCS2IsCompatibleRVVVectorConversion)
4649 return SCS1IsCompatibleRVVVectorConversion
4689 if (UnqualT1 == UnqualT2)
4707 bool ObjCLifetimeConversion;
4717 if (CanPick1 != CanPick2)
4771 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
4779 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
4796 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
4803 bool FromAssignRight
4812 if (ToPtr1->isObjCIdType() &&
4813 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
4815 if (ToPtr2->isObjCIdType() &&
4816 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
4821 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
4823 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
4828 if (ToPtr1->isObjCClassType() &&
4829 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
4831 if (ToPtr2->isObjCClassType() &&
4832 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
4837 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
4839 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
4845 (ToAssignLeft != ToAssignRight)) {
4856 }
else if (IsSecondSame)
4865 (FromAssignLeft != FromAssignRight))
4879 const Type *FromPointeeType1 = FromMemPointer1->getClass();
4880 const Type *ToPointeeType1 = ToMemPointer1->
getClass();
4881 const Type *FromPointeeType2 = FromMemPointer2->
getClass();
4882 const Type *ToPointeeType2 = ToMemPointer2->
getClass();
4888 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
4895 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
4933 if (!
T.getQualifiers().hasUnaligned())
4947 "T1 must be the pointee type of the reference type");
4948 assert(!OrigT2->
isReferenceType() &&
"T2 cannot be a reference type");
4972 if (UnqualT1 == UnqualT2) {
4974 }
else if (isCompleteType(
Loc, OrigT2) &&
4975 IsDerivedFrom(
Loc, UnqualT2, UnqualT1))
4976 Conv |= ReferenceConversions::DerivedToBase;
4980 Conv |= ReferenceConversions::ObjC;
4982 IsFunctionConversion(UnqualT2, UnqualT1, ConvertedT2)) {
4983 Conv |= ReferenceConversions::Function;
4985 return Ref_Compatible;
4987 bool ConvertedReferent = Conv != 0;
4991 bool PreviousToQualsIncludeConst =
true;
4992 bool TopLevel =
true;
4998 Conv |= ReferenceConversions::Qualification;
5004 Conv |= ReferenceConversions::NestedQualification;
5012 bool ObjCLifetimeConversion =
false;
5014 PreviousToQualsIncludeConst,
5015 ObjCLifetimeConversion, getASTContext()))
5021 if (ObjCLifetimeConversion)
5022 Conv |= ReferenceConversions::ObjCLifetime;
5041 bool AllowExplicit) {
5042 assert(T2->
isRecordType() &&
"Can only find conversions of record types.");
5047 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5048 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
5051 if (isa<UsingShadowDecl>(
D))
5052 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
5055 = dyn_cast<FunctionTemplateDecl>(
D);
5060 Conv = cast<CXXConversionDecl>(
D);
5072 if (!ConvTemplate &&
5096 ConvTemplate, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5097 false, AllowExplicit);
5100 Conv, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5101 false, AllowExplicit);
5104 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5119 if (!Best->FinalConversion.DirectBinding)
5131 "Expected a direct reference binding!");
5137 Cand != CandidateSet.
end(); ++Cand)
5149 llvm_unreachable(
"Invalid OverloadResult!");
5157 bool SuppressUserConversions,
5158 bool AllowExplicit) {
5159 assert(DeclType->
isReferenceType() &&
"Reference init needs a reference");
5186 auto SetAsReferenceBinding = [&](
bool BindsDirectly) {
5191 ICS.
Standard.
Second = (RefConv & Sema::ReferenceConversions::DerivedToBase)
5193 : (RefConv & Sema::ReferenceConversions::ObjC)
5201 Sema::ReferenceConversions::NestedQualification)
5215 (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0;
5238 SetAsReferenceBinding(
true);
5287 SetAsReferenceBinding(S.
getLangOpts().CPlusPlus11 ||
5378 AllowedExplicit::None,
5403 if (isRValRef && LValRefType) {
5421 bool SuppressUserConversions,
5422 bool InOverloadResolution,
5423 bool AllowObjCWritebackConversion,
5424 bool AllowExplicit =
false);
5430 bool SuppressUserConversions,
5431 bool InOverloadResolution,
5432 bool AllowObjCWritebackConversion) {
5445 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT))
5447 InitTy = IAT->getElementType();
5473 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5479 SuppressUserConversions,
5480 InOverloadResolution,
5481 AllowObjCWritebackConversion);
5490 Result.Standard.setAsIdentityConversion();
5491 Result.Standard.setFromType(ToType);
5492 Result.Standard.setAllToTypes(ToType);
5517 bool IsUnbounded =
false;
5521 if (CT->getSize().ult(e)) {
5525 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5528 if (CT->getSize().ugt(e)) {
5534 S, &EmptyList, InitTy, SuppressUserConversions,
5535 InOverloadResolution, AllowObjCWritebackConversion);
5536 if (DfltElt.
isBad()) {
5540 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5545 assert(isa<IncompleteArrayType>(AT) &&
"Expected incomplete array");
5551 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5561 Result.Standard.setAsIdentityConversion();
5562 Result.Standard.setFromType(InitTy);
5563 Result.Standard.setAllToTypes(InitTy);
5564 for (
unsigned i = 0; i < e; ++i) {
5567 S,
Init, InitTy, SuppressUserConversions, InOverloadResolution,
5568 AllowObjCWritebackConversion);
5579 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5593 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5607 AllowedExplicit::None,
5608 InOverloadResolution,
false,
5609 AllowObjCWritebackConversion,
5628 Result.UserDefined.Before.setAsIdentityConversion();
5633 Result.UserDefined.After.setAsIdentityConversion();
5634 Result.UserDefined.After.setFromType(ToType);
5635 Result.UserDefined.After.setAllToTypes(ToType);
5636 Result.UserDefined.ConversionFunction =
nullptr;
5653 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5674 SuppressUserConversions,
5682 InOverloadResolution,
5683 AllowObjCWritebackConversion);
5686 assert(!
Result.isEllipsis() &&
5687 "Sub-initialization cannot result in ellipsis conversion.");
5693 Result.UserDefined.After;
5714 if (NumInits == 1 && !isa<InitListExpr>(From->
getInit(0)))
5716 SuppressUserConversions,
5717 InOverloadResolution,
5718 AllowObjCWritebackConversion);
5721 else if (NumInits == 0) {
5723 Result.Standard.setAsIdentityConversion();
5724 Result.Standard.setFromType(ToType);
5725 Result.Standard.setAllToTypes(ToType);
5744 bool SuppressUserConversions,
5745 bool InOverloadResolution,
5746 bool AllowObjCWritebackConversion,
5747 bool AllowExplicit) {
5748 if (
InitListExpr *FromInitList = dyn_cast<InitListExpr>(From))
5750 InOverloadResolution,AllowObjCWritebackConversion);
5755 SuppressUserConversions, AllowExplicit);
5758 SuppressUserConversions,
5759 AllowedExplicit::None,
5760 InOverloadResolution,
5762 AllowObjCWritebackConversion,
5775 return !ICS.
isBad();
5784 const CXXRecordDecl *ActingContext,
bool InOverloadResolution =
false,
5786 bool SuppressUserConversion =
false) {
5794 assert(FromClassification.
isLValue());
5806 if (ExplicitParameterType.isNull())
5809 ValueKindFromClassification(FromClassification));
5811 S, &TmpExpr, ExplicitParameterType, SuppressUserConversion,
5829 if (isa<CXXDestructorDecl>(Method) || Method->
isStatic()) {
5866 FromType, ImplicitParamType);
5876 FromType, ImplicitParamType);
5891 FromType, ImplicitParamType);
5911 if (!FromClassification.
isRValue()) {
5951 FromRecordType = From->
getType();
5952 DestType = ImplicitParamRecordType;
5953 FromClassification = From->
Classify(Context);
5959 From = CreateMaterializeTemporaryExpr(FromRecordType, From,
5978 << Method->
getDeclName() << FromRecordType << (CVR - 1)
5989 bool IsRValueQualified =
5993 << IsRValueQualified;
6005 llvm_unreachable(
"Lists are not objects");
6008 return Diag(From->
getBeginLoc(), diag::err_member_function_call_bad_type)
6009 << ImplicitParamRecordType << FromRecordType
6015 PerformObjectMemberConversion(From, Qualifier, FoundDecl, Method);
6018 From = FromRes.
get();
6027 CK = CK_AddressSpaceConversion;
6030 From = ImpCastExprToType(From, DestType, CK, From->
getValueKind()).get();
6052 AllowedExplicit::Conversions,
6065 return PerformImplicitConversion(From, Context.
BoolTy, ICS,
6068 if (!DiagnoseMultipleUserDefinedConversion(From, Context.
BoolTy))
6133 llvm_unreachable(
"found a first conversion kind in Second");
6137 llvm_unreachable(
"found a third conversion kind in Second");
6143 llvm_unreachable(
"unknown conversion kind");
6155 "converted constant expression outside C++11");
6188 diag::err_typecheck_converted_constant_expression)
6194 llvm_unreachable(
"bad conversion in converted constant expression");
6200 diag::err_typecheck_converted_constant_expression_disallowed)
6206 diag::err_typecheck_converted_constant_expression_indirect)
6216 diag::err_reference_bind_to_bitfield_in_cce)
6226 "unexpected class type converted constant expr");
6229 T, cast<NonTypeTemplateParmDecl>(Dest)),
6247 bool ReturnPreNarrowingValue =
false;
6250 PreNarrowingType)) {
6263 PreNarrowingValue.
isInt()) {
6266 ReturnPreNarrowingValue =
true;
6278 << CCE << 0 << From->
getType() <<
T;
6281 if (!ReturnPreNarrowingValue)
6282 PreNarrowingValue = {};
6299 if (
Result.isInvalid() ||
Result.get()->isValueDependent()) {
6304 RequireInt, PreNarrowingValue);
6311 return ::BuildConvertedConstantExpression(*
this, From,
T, CCE, Dest,
6318 return ::CheckConvertedConstantExpression(*
this, From,
T,
Value, CCE,
false,
6323 llvm::APSInt &
Value,
6330 if (!R.isInvalid() && !R.get()->isValueDependent())
6338 const APValue &PreNarrowingValue) {
6348 Kind = ConstantExprKind::ClassTemplateArgument;
6350 Kind = ConstantExprKind::NonClassTemplateArgument;
6352 Kind = ConstantExprKind::Normal;
6355 (RequireInt && !Eval.
Val.
isInt())) {
6362 if (Notes.empty()) {
6365 if (
const auto *CE = dyn_cast<ConstantExpr>(
E)) {
6369 "ConstantExpr has no value associated with it");
6375 Value = std::move(PreNarrowingValue);
6381 if (Notes.size() == 1 &&
6382 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6383 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6384 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6385 diag::note_constexpr_invalid_template_arg) {
6386 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6387 for (
unsigned I = 0; I < Notes.size(); ++I)
6388 Diag(Notes[I].first, Notes[I].second);
6392 for (
unsigned I = 0; I < Notes.size(); ++I)
6393 Diag(Notes[I].first, Notes[I].second);
6420 AllowedExplicit::Conversions,
6454 return PerformImplicitConversion(From, Ty, ICS,
6461 assert((isa<UnresolvedMemberExpr, MemberExpr>(MemExprE)) &&
6462 "expected a member expression");
6464 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6465 M && !M->isImplicitAccess())
6466 Base = M->getBase();
6467 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6468 M && !M->isImplicitAccess())
6469 Base = M->getBase();
6503 "Method is not an explicit member function");
6504 assert(NewArgs.empty() &&
"NewArgs should be empty");
6506 NewArgs.reserve(Args.size() + 1);
6508 NewArgs.push_back(This);
6509 NewArgs.append(Args.begin(), Args.end());
6512 Method, Object->getBeginLoc());
6531 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6533 cast<CXXConversionDecl>(ViableConversions[I]->getUnderlyingDecl());
6545 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6548 cast<CXXConversionDecl>(
Found->getUnderlyingDecl());
6553 std::string TypeStr;
6558 "static_cast<" + TypeStr +
">(")
6570 HadMultipleCandidates);
6577 From,
Result.get()->getType());
6590 cast<CXXConversionDecl>(
Found->getUnderlyingDecl());
6603 HadMultipleCandidates);
6608 CK_UserDefinedConversion,
Result.get(),
6609 nullptr,
Result.get()->getValueKind(),
6631 if (isa<UsingShadowDecl>(
D))
6632 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
6634 if (
auto *ConvTemplate = dyn_cast<FunctionTemplateDecl>(
D)) {
6636 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
6642 Conv, FoundDecl, ActingContext, From, ToType, CandidateSet,
6673 ExprResult result = CheckPlaceholderExpr(From);
6676 From = result.
get();
6680 ExprResult Converted = DefaultLvalueConversion(From);
6691 if (!RecordTy || !getLangOpts().CPlusPlus) {
6703 : Converter(Converter), From(From) {}
6708 } IncompleteDiagnoser(Converter, From);
6711 : RequireCompleteType(
Loc,
T, IncompleteDiagnoser))
6718 const auto &Conversions =
6719 cast<CXXRecordDecl>(RecordTy->
getDecl())->getVisibleConversionFunctions();
6721 bool HadMultipleCandidates =
6722 (std::distance(Conversions.begin(), Conversions.end()) > 1);
6726 bool HasUniqueTargetType =
true;
6729 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
6739 Conversion = cast<CXXConversionDecl>(
D);
6741 assert((!ConvTemplate || getLangOpts().
CPlusPlus14) &&
6742 "Conversion operator templates are considered potentially "
6746 if (Converter.
match(CurToType) || ConvTemplate) {
6752 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
6757 else if (HasUniqueTargetType &&
6759 HasUniqueTargetType =
false;
6761 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
6779 HadMultipleCandidates,
6780 ExplicitConversions))
6786 if (!HasUniqueTargetType)
6805 HadMultipleCandidates,
Found))
6814 HadMultipleCandidates,
6815 ExplicitConversions))
6823 switch (ViableConversions.
size()) {
6826 HadMultipleCandidates,
6827 ExplicitConversions))
6837 HadMultipleCandidates,
Found))
6868 if (Proto->getNumParams() < 1)
6872 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
6877 if (Proto->getNumParams() < 2)
6881 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
6901 unsigned SeenAt = 0;
6903 bool HasDefault =
false;
6912 return HasDefault || SeenAt != 0;
6918 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
6923 assert(Proto &&
"Functions without a prototype cannot be overloaded");
6924 assert(!
Function->getDescribedFunctionTemplate() &&
6925 "Use AddTemplateOverloadCandidate for function templates");
6928 if (!isa<CXXConstructorDecl>(Method)) {
6938 CandidateSet, SuppressUserConversions,
6939 PartialOverloading, EarlyConversions, PO);
6953 if (Constructor && Constructor->isDefaulted() && Constructor->isDeleted() &&
6954 Constructor->isMoveConstructor())
6974 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
6987 Candidate.
Viable =
false;
6993 if (getLangOpts().CPlusPlusModules &&
Function->isInAnotherModuleUnit()) {
7000 bool IsImplicitlyInstantiated =
false;
7001 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo()) {
7002 ND = SpecInfo->getTemplate();
7003 IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() ==
7014 const bool IsInlineFunctionInGMF =
7016 (IsImplicitlyInstantiated ||
Function->isInlined());
7019 Candidate.
Viable =
false;
7026 Candidate.
Viable =
false;
7036 if (Args.size() == 1 && Constructor->isSpecializationCopyingObject() &&
7038 IsDerivedFrom(Args[0]->getBeginLoc(), Args[0]->getType(),
7040 Candidate.
Viable =
false;
7052 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.getDecl());
7053 if (Shadow && Args.size() == 1 && Constructor->getNumParams() >= 1 &&
7054 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
7055 QualType P = Constructor->getParamDecl(0)->getType()->getPointeeType();
7061 Candidate.
Viable =
false;
7070 Constructor->getMethodQualifiers().getAddressSpace(),
7071 CandidateSet.
getDestAS(), getASTContext())) {
7072 Candidate.
Viable =
false;
7085 Candidate.
Viable =
false;
7095 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7096 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7097 !PartialOverloading) {
7099 Candidate.
Viable =
false;
7105 if (getLangOpts().
CUDA) {
7113 Candidate.
Viable =
false;
7119 if (
Function->getTrailingRequiresClause()) {
7121 if (CheckFunctionConstraints(
Function, Satisfaction, {},
7124 Candidate.
Viable =
false;
7132 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7135 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7138 }
else if (ArgIdx < NumParams) {
7149 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7152 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7154 Candidate.
Viable =
false;
7166 if (EnableIfAttr *FailedAttr =
7168 Candidate.
Viable =
false;
7178 if (Methods.size() <= 1)
7181 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7189 if (Args.size() < NumNamedArgs)
7192 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7194 if (Args[i]->isTypeDependent()) {
7200 Expr *argExpr = Args[i];
7201 assert(argExpr &&
"SelectBestMethod(): missing expression");
7206 !param->
hasAttr<CFConsumedAttr>())
7207 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7220 getLangOpts().ObjCAutoRefCount,
7224 if (ConversionState.
isBad() ||
7234 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7235 if (Args[i]->isTypeDependent()) {
7239 ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod,
7248 if (Args.size() != NumNamedArgs)
7250 else if (Match && NumNamedArgs == 0 && Methods.size() > 1) {
7253 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7254 QualType ReturnT = Methods[
b]->getReturnType();
7273 assert(!isa<CXXConstructorDecl>(Method) &&
7274 "Shouldn't have `this` for ctors!");
7275 assert(!Method->
isStatic() &&
"Shouldn't have `this` for static methods!");
7277 ThisArg,
nullptr, Method, Method);
7280 ConvertedThis = R.
get();
7282 if (
auto *MD = dyn_cast<CXXMethodDecl>(
Function)) {
7284 assert((MissingImplicitThis || MD->isStatic() ||
7285 isa<CXXConstructorDecl>(MD)) &&
7286 "Expected `this` for non-ctor instance methods");
7288 ConvertedThis =
nullptr;
7293 unsigned ArgSizeNoVarargs = std::min(
Function->param_size(), Args.size());
7296 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7305 ConvertedArgs.push_back(R.
get());
7313 for (
unsigned i = Args.size(), e =
Function->getNumParams(); i != e; ++i) {
7315 if (!
P->hasDefaultArg())
7320 ConvertedArgs.push_back(R.
get());
7332 bool MissingImplicitThis) {
7333 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7334 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7340 Expr *DiscardedThis;
7342 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7343 true, DiscardedThis, ConvertedArgs))
7344 return *EnableIfAttrs.begin();
7346 for (
auto *EIA : EnableIfAttrs) {
7350 if (EIA->getCond()->isValueDependent() ||
7351 !EIA->getCond()->EvaluateWithSubstitution(
7355 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7361template <
typename CheckFn>
7364 CheckFn &&IsSuccessful) {
7367 if (ArgDependent == DIA->getArgDependent())
7368 Attrs.push_back(DIA);
7375 auto WarningBegin = std::stable_partition(
7376 Attrs.begin(), Attrs.end(),
7377 [](
const DiagnoseIfAttr *DIA) { return DIA->isError(); });
7381 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7383 if (ErrAttr != WarningBegin) {
7384 const DiagnoseIfAttr *DIA = *ErrAttr;
7385 S.
Diag(
Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7386 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7387 << DIA->getParent() << DIA->getCond()->getSourceRange();
7391 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7392 if (IsSuccessful(DIA)) {
7393 S.
Diag(
Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7394 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7395 << DIA->getParent() << DIA->getCond()->getSourceRange();
7402 const Expr *ThisArg,
7407 [&](
const DiagnoseIfAttr *DIA) {
7412 if (!DIA->getCond()->EvaluateWithSubstitution(
7413 Result, Context, cast<FunctionDecl>(DIA->getParent()), Args, ThisArg))
7415 return Result.isInt() &&
Result.getInt().getBoolValue();
7422 *
this, ND,
false,
Loc,
7423 [&](
const DiagnoseIfAttr *DIA) {
7434 bool SuppressUserConversions,
7435 bool PartialOverloading,
7436 bool FirstArgumentIsBase) {
7438 NamedDecl *
D = F.getDecl()->getUnderlyingDecl();
7445 if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic()) {
7448 if (Args.size() > 0) {
7449 if (
Expr *
E = Args[0]) {
7457 ObjectClassification =
E->
Classify(Context);
7459 FunctionArgs = Args.slice(1);
7462 AddMethodTemplateCandidate(
7463 FunTmpl, F.getPair(),
7465 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7466 FunctionArgs, CandidateSet, SuppressUserConversions,
7467 PartialOverloading);
7469 AddMethodCandidate(cast<CXXMethodDecl>(FD), F.getPair(),
7470 cast<CXXMethodDecl>(FD)->getParent(), ObjectType,
7471 ObjectClassification, FunctionArgs, CandidateSet,
7472 SuppressUserConversions, PartialOverloading);
7479 if (Args.size() > 0 &&
7480 (!Args[0] || (FirstArgumentIsBase && isa<CXXMethodDecl>(FD) &&
7481 !isa<CXXConstructorDecl>(FD)))) {
7482 assert(cast<CXXMethodDecl>(FD)->isStatic());
7483 FunctionArgs = Args.slice(1);
7486 AddTemplateOverloadCandidate(FunTmpl, F.getPair(),
7487 ExplicitTemplateArgs, FunctionArgs,
7488 CandidateSet, SuppressUserConversions,
7489 PartialOverloading);
7491 AddOverloadCandidate(FD, F.getPair(), FunctionArgs, CandidateSet,
7492 SuppressUserConversions, PartialOverloading);
7502 bool SuppressUserConversions,
7507 if (isa<UsingShadowDecl>(
Decl))
7508 Decl = cast<UsingShadowDecl>(
Decl)->getTargetDecl();
7511 assert(isa<CXXMethodDecl>(TD->getTemplatedDecl()) &&
7512 "Expected a member function template");
7513 AddMethodTemplateCandidate(TD, FoundDecl, ActingContext,
7514 nullptr, ObjectType,
7515 ObjectClassification, Args, CandidateSet,
7516 SuppressUserConversions,
false, PO);
7518 AddMethodCandidate(cast<CXXMethodDecl>(
Decl), FoundDecl, ActingContext,
7519 ObjectType, ObjectClassification, Args, CandidateSet,
7520 SuppressUserConversions,
false, {}, PO);
7530 bool SuppressUserConversions,
7531 bool PartialOverloading,
7536 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7537 assert(!isa<CXXConstructorDecl>(Method) &&
7538 "Use AddOverloadCandidate for constructors");
7556 CandidateSet.
addCandidate(Args.size() + 1, EarlyConversions);
7565 bool IgnoreExplicitObject =
7569 bool ImplicitObjectMethodTreatedAsStatic =
7574 unsigned ExplicitOffset =
7577 unsigned NumParams = Method->
getNumParams() - ExplicitOffset +
7578 int(ImplicitObjectMethodTreatedAsStatic);
7586 Candidate.
Viable =
false;
7598 int(ImplicitObjectMethodTreatedAsStatic);
7600 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
7602 Candidate.
Viable =
false;
7622 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
7627 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
7628 Method, ActingContext,
true);
7629 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
7630 Candidate.
Viable =
false;
7637 if (getLangOpts().
CUDA)
7638 if (!
CUDA().IsAllowedCall(getCurFunctionDecl(
true),
7640 Candidate.
Viable =
false;
7647 if (CheckFunctionConstraints(Method, Satisfaction, {},
7650 Candidate.
Viable =
false;
7658 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7661 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7664 }
else if (ArgIdx < NumParams) {
7670 if (ImplicitObjectMethodTreatedAsStatic) {
7671 ParamType = ArgIdx == 0
7675 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
7679 SuppressUserConversions,
7682 getLangOpts().ObjCAutoRefCount);
7684 Candidate.
Viable =
false;
7696 if (EnableIfAttr *FailedAttr =
7697 CheckEnableIf(Method, CandidateSet.
getLocation(), Args,
true)) {
7698 Candidate.
Viable =
false;
7705 Candidate.
Viable =
false;
7734 PartialOverloading,
false, ObjectType,
7735 ObjectClassification,
7737 return CheckNonDependentConversions(
7738 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
7739 SuppressUserConversions, ActingContext, ObjectType,
7740 ObjectClassification, PO);
7744 CandidateSet.
addCandidate(Conversions.size(), Conversions);
7747 Candidate.
Viable =
false;
7752 cast<CXXMethodDecl>(Candidate.
Function)->isStatic() ||
7767 assert(
Specialization &&
"Missing member function template specialization?");
7769 "Specialization is not a member function?");
7770 AddMethodCandidate(cast<CXXMethodDecl>(
Specialization), FoundDecl,
7771 ActingContext, ObjectType, ObjectClassification, Args,
7772 CandidateSet, SuppressUserConversions, PartialOverloading,
7786 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
7798 Candidate.
Viable =
false;
7817 FunctionTemplate, ExplicitTemplateArgs, Args,
Specialization, Info,
7818 PartialOverloading, AggregateCandidateDeduction,
7822 return CheckNonDependentConversions(
7823 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
7824 SuppressUserConversions,
nullptr,
QualType(), {}, PO);
7828 CandidateSet.
addCandidate(Conversions.size(), Conversions);
7831 Candidate.
Viable =
false;
7839 isa<CXXMethodDecl>(Candidate.
Function) &&
7840 !isa<CXXConstructorDecl>(Candidate.
Function);
7854 assert(
Specialization &&
"Missing function template specialization?");
7855 AddOverloadCandidate(
7856 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
7857 PartialOverloading, AllowExplicit,
7858 false, IsADLCandidate, Conversions, PO,
7871 const bool AllowExplicit =
false;
7874 auto *Method = dyn_cast<CXXMethodDecl>(FD);
7875 bool HasThisConversion = Method && !isa<CXXConstructorDecl>(Method);
7876 unsigned ThisConversions = HasThisConversion ? 1 : 0;
7888 if (HasThisConversion && !cast<CXXMethodDecl>(FD)->isStatic() &&
7891 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
7892 !ParamTypes[0]->isDependentType()) {
7894 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
7895 Method, ActingContext,
true,
7896 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
7898 if (Conversions[ConvIdx].isBad())
7906 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
7908 QualType ParamType = ParamTypes[I + Offset];
7912 ConvIdx = Args.size() - 1 - I;
7913 assert(Args.size() + ThisConversions == 2 &&
7914 "number of args (including 'this') must be exactly 2 for "
7918 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
7921 ConvIdx = ThisConversions + I;
7923 Conversions[ConvIdx]
7925 SuppressUserConversions,
7928 getLangOpts().ObjCAutoRefCount,
7930 if (Conversions[ConvIdx].isBad())
7952 bool AllowObjCPointerConversion) {
7960 bool ObjCLifetimeConversion;
7962 ObjCLifetimeConversion))
7967 if (!AllowObjCPointerConversion)
7971 bool IncompatibleObjC =
false;
7981 bool AllowExplicit,
bool AllowResultConversion) {
7983 "Conversion function templates use AddTemplateConversionCandidate");
7991 if (DeduceReturnType(Conversion, From->
getExprLoc()))
7998 if (!AllowResultConversion &&
8010 AllowObjCConversionOnExplicit))
8030 if (!AllowExplicit && Conversion->
isExplicit()) {
8031 Candidate.
Viable =
false;
8046 const auto *ConversionContext =
8055 From->
Classify(Context), Conversion, ConversionContext,
8060 Candidate.
Viable =
false;
8067 if (CheckFunctionConstraints(Conversion, Satisfaction) ||
8069 Candidate.
Viable =
false;
8081 if (FromCanon == ToCanon ||
8082 IsDerivedFrom(CandidateSet.
getLocation(), FromCanon, ToCanon)) {
8083 Candidate.
Viable =
false;
8100 CK_FunctionToPointerDecay, &ConversionRef,
8104 if (!isCompleteType(From->
getBeginLoc(), ConversionType)) {
8105 Candidate.
Viable =
false;
8119 Buffer, &ConversionFn, CallResultType, VK, From->
getBeginLoc());
8137 Candidate.
Viable =
false;
8149 Candidate.
Viable =
false;
8156 Candidate.
Viable =
false;
8162 "Can only end up with a standard conversion sequence or failure");
8165 if (EnableIfAttr *FailedAttr =
8166 CheckEnableIf(Conversion, CandidateSet.
getLocation(), {})) {
8167 Candidate.
Viable =
false;
8174 Candidate.
Viable =
false;
8183 bool AllowExplicit,
bool AllowResultConversion) {
8185 "Only conversion function templates permitted here");
8197 Candidate.
Viable =
false;
8208 FunctionTemplate, ObjectType, ObjectClassification, ToType,
8214 Candidate.
Viable =
false;
8224 assert(
Specialization &&
"Missing function template specialization?");
8225 AddConversionCandidate(
Specialization, FoundDecl, ActingDC, From, ToType,
8226 CandidateSet, AllowObjCConversionOnExplicit,
8227 AllowExplicit, AllowResultConversion);
8262 *
this, CandidateSet.
getLocation(), Object->getType(),
8263 Object->Classify(Context), Conversion, ActingContext);
8266 if (ObjectInit.
isBad()) {
8267 Candidate.
Viable =
false;
8278 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8279 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8280 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8281 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8284 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8292 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8293 Candidate.
Viable =
false;
8300 if (Args.size() < NumParams) {
8302 Candidate.
Viable =
false;
8309 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8310 if (ArgIdx < NumParams) {
8321 getLangOpts().ObjCAutoRefCount);
8323 Candidate.
Viable =
false;
8337 if (CheckFunctionConstraints(Conversion, Satisfaction, {},
8340 Candidate.
Viable =
false;
8346 if (EnableIfAttr *FailedAttr =
8347 CheckEnableIf(Conversion, CandidateSet.
getLocation(), {})) {
8348 Candidate.
Viable =
false;
8360 NamedDecl *
D = F.getDecl()->getUnderlyingDecl();
8371 assert(!isa<CXXMethodDecl>(FD) &&
8372 "unqualified operator lookup found a member function");
8375 AddTemplateOverloadCandidate(FunTmpl, F.getPair(), ExplicitTemplateArgs,
8376 FunctionArgs, CandidateSet);
8378 AddTemplateOverloadCandidate(
8379 FunTmpl, F.getPair(), ExplicitTemplateArgs,
8380 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
false,
false,
8383 if (ExplicitTemplateArgs)
8385 AddOverloadCandidate(FD, F.getPair(), FunctionArgs, CandidateSet);
8387 AddOverloadCandidate(FD, F.getPair(),
8388 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
8389 false,
false,
true,
false, ADLCallKind::NotADL, {},
8418 if (!isCompleteType(OpLoc, T1) && !T1Rec->isBeingDefined())
8421 if (!T1Rec->getDecl()->getDefinition())
8424 LookupResult Operators(*
this, OpName, OpLoc, LookupOrdinaryName);
8425 LookupQualifiedName(Operators, T1Rec->getDecl());
8429 OperEnd = Operators.
end();
8430 Oper != OperEnd; ++Oper) {
8431 if (Oper->getAsFunction() &&
8434 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
8436 AddMethodCandidate(Oper.getPair(), Args[0]->getType(),
8437 Args[0]->Classify(Context), Args.slice(1),
8438 CandidateSet,
false, PO);
8445 bool IsAssignmentOperator,
8446 unsigned NumContextualBoolArguments) {
8461 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8474 if (ArgIdx < NumContextualBoolArguments) {
8475 assert(ParamTys[ArgIdx] == Context.
BoolTy &&
8476 "Contextual conversion to bool requires bool type");
8482 ArgIdx == 0 && IsAssignmentOperator,
8485 getLangOpts().ObjCAutoRefCount);
8488 Candidate.
Viable =
false;
8501class BuiltinCandidateTypeSet {
8507 TypeSet PointerTypes;
8511 TypeSet MemberPointerTypes;
8515 TypeSet EnumerationTypes;
8519 TypeSet VectorTypes;
8523 TypeSet MatrixTypes;
8526 TypeSet BitIntTypes;
8529 bool HasNonRecordTypes;
8533 bool HasArithmeticOrEnumeralTypes;
8537 bool HasNullPtrType;
8546 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
8548 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
8552 typedef TypeSet::iterator iterator;
8554 BuiltinCandidateTypeSet(
Sema &SemaRef)
8555 : HasNonRecordTypes(
false),
8556 HasArithmeticOrEnumeralTypes(
false),
8557 HasNullPtrType(
false),
8559 Context(SemaRef.Context) { }
8561 void AddTypesConvertedFrom(
QualType Ty,
8563 bool AllowUserConversions,
8564 bool AllowExplicitConversions,
8565 const Qualifiers &VisibleTypeConversionsQuals);
8567 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
8568 llvm::iterator_range<iterator> member_pointer_types() {
8569 return MemberPointerTypes;
8571 llvm::iterator_range<iterator> enumeration_types() {
8572 return EnumerationTypes;
8574 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
8575 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
8576 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
8578 bool containsMatrixType(
QualType Ty)
const {
return MatrixTypes.count(Ty); }
8579 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
8580 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
8581 bool hasNullPtrType()
const {
return HasNullPtrType; }
8596BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
8600 if (!PointerTypes.insert(Ty))
8605 bool buildObjCPtr =
false;
8609 buildObjCPtr =
true;
8621 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
8627 if ((CVR | BaseCVR) != CVR)
continue;
8649 PointerTypes.insert(QPointerTy);
8665BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
8668 if (!MemberPointerTypes.insert(Ty))
8672 assert(PointerTy &&
"type was not a member pointer type!");
8687 if ((CVR | BaseCVR) != CVR)
continue;
8690 MemberPointerTypes.insert(
8706BuiltinCandidateTypeSet::AddTypesConvertedFrom(
QualType Ty,
8708 bool AllowUserConversions,
8709 bool AllowExplicitConversions,
8721 Ty = SemaRef.Context.getArrayDecayedType(Ty);
8728 HasNonRecordTypes = HasNonRecordTypes || !TyRec;
8731 HasArithmeticOrEnumeralTypes =
8735 PointerTypes.insert(Ty);
8739 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
8743 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
8746 HasArithmeticOrEnumeralTypes =
true;
8747 EnumerationTypes.insert(Ty);
8749 HasArithmeticOrEnumeralTypes =
true;
8750 BitIntTypes.insert(Ty);
8754 HasArithmeticOrEnumeralTypes =
true;
8755 VectorTypes.insert(Ty);
8759 HasArithmeticOrEnumeralTypes =
true;
8760 MatrixTypes.insert(Ty);
8762 HasNullPtrType =
true;
8763 }
else if (AllowUserConversions && TyRec) {
8765 if (!SemaRef.isCompleteType(Loc, Ty))
8770 if (isa<UsingShadowDecl>(
D))
8771 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
8775 if (isa<FunctionTemplateDecl>(
D))
8779 if (AllowExplicitConversions || !Conv->
isExplicit()) {
8842 if (isa<UsingShadowDecl>(
D))
8843 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
8877 if (Available.hasAtomic()) {
8878 Available.removeAtomic();
8885 if (Available.hasVolatile()) {
8886 Available.removeVolatile();
8920class BuiltinOperatorOverloadBuilder {
8925 bool HasArithmeticOrEnumeralCandidateType;
8929 static constexpr int ArithmeticTypesCap = 26;
8935 unsigned FirstIntegralType,
8937 unsigned FirstPromotedIntegralType,
8938 LastPromotedIntegralType;
8939 unsigned FirstPromotedArithmeticType,
8940 LastPromotedArithmeticType;
8941 unsigned NumArithmeticTypes;
8943 void InitArithmeticTypes() {
8945 FirstPromotedArithmeticType = 0;
8955 FirstIntegralType = ArithmeticTypes.size();
8956 FirstPromotedIntegralType = ArithmeticTypes.size();
8979 llvm::for_each(CandidateTypes, [&BitIntCandidates](
8980 BuiltinCandidateTypeSet &Candidate) {
8981 for (
QualType BitTy : Candidate.bitint_types())
8984 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
8985 LastPromotedIntegralType = ArithmeticTypes.size();
8986 LastPromotedArithmeticType = ArithmeticTypes.size();
9000 LastIntegralType = ArithmeticTypes.size();
9001 NumArithmeticTypes = ArithmeticTypes.size();
9008 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
9009 ArithmeticTypesCap &&
9010 "Enough inline storage for all arithmetic types.");
9015 void addPlusPlusMinusMinusStyleOverloads(
QualType CandidateTy,
9064 BuiltinOperatorOverloadBuilder(
9067 bool HasArithmeticOrEnumeralCandidateType,
9071 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
9072 HasArithmeticOrEnumeralCandidateType(
9073 HasArithmeticOrEnumeralCandidateType),
9074 CandidateTypes(CandidateTypes),
9075 CandidateSet(CandidateSet) {
9077 InitArithmeticTypes();
9100 if (!HasArithmeticOrEnumeralCandidateType)
9103 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9104 const auto TypeOfT = ArithmeticTypes[Arith];
9106 if (Op == OO_MinusMinus)
9108 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9111 addPlusPlusMinusMinusStyleOverloads(
9128 void addPlusPlusMinusMinusPointerOverloads() {
9129 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9131 if (!PtrTy->getPointeeType()->isObjectType())
9134 addPlusPlusMinusMinusStyleOverloads(
9136 (!PtrTy.isVolatileQualified() &&
9138 (!PtrTy.isRestrictQualified() &&
9153 void addUnaryStarPointerOverloads() {
9154 for (
QualType ParamTy : CandidateTypes[0].pointer_types()) {
9160 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9173 void addUnaryPlusOrMinusArithmeticOverloads() {
9174 if (!HasArithmeticOrEnumeralCandidateType)
9177 for (
unsigned Arith = FirstPromotedArithmeticType;
9178 Arith < LastPromotedArithmeticType; ++Arith) {
9179 QualType ArithTy = ArithmeticTypes[Arith];
9184 for (
QualType VecTy : CandidateTypes[0].vector_types())
9193 void addUnaryPlusPointerOverloads() {
9194 for (
QualType ParamTy : CandidateTypes[0].pointer_types())
9203 void addUnaryTildePromotedIntegralOverloads() {
9204 if (!HasArithmeticOrEnumeralCandidateType)
9207 for (
unsigned Int = FirstPromotedIntegralType;
9208 Int < LastPromotedIntegralType; ++
Int) {
9214 for (
QualType VecTy : CandidateTypes[0].vector_types())
9224 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9228 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9229 for (
QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9234 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9238 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9240 if (AddedTypes.insert(NullPtrTy).second) {
9241 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9260 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9273 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9274 UserDefinedBinaryOperators;
9276 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9277 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9279 CEnd = CandidateSet.
end();
9281 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9284 if (
C->Function->isFunctionTemplateSpecialization())
9293 .getUnqualifiedType();
9296 .getUnqualifiedType();
9304 UserDefinedBinaryOperators.insert(
9314 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9315 for (
QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9319 if (IsSpaceship && PtrTy->isFunctionPointerType())
9322 QualType ParamTypes[2] = {PtrTy, PtrTy};
9325 for (
QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9330 if (!AddedTypes.insert(CanonType).second ||
9331 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9334 QualType ParamTypes[2] = {EnumTy, EnumTy};
9361 for (
int Arg = 0; Arg < 2; ++Arg) {
9362 QualType AsymmetricParamTypes[2] = {
9366 for (
QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9371 AsymmetricParamTypes[Arg] = PtrTy;
9372 if (Arg == 0 || Op == OO_Plus) {
9377 if (Op == OO_Minus) {
9382 QualType ParamTypes[2] = {PtrTy, PtrTy};
9418 void addGenericBinaryArithmeticOverloads() {
9419 if (!HasArithmeticOrEnumeralCandidateType)
9422 for (
unsigned Left = FirstPromotedArithmeticType;
9423 Left < LastPromotedArithmeticType; ++
Left) {
9424 for (
unsigned Right = FirstPromotedArithmeticType;
9425 Right < LastPromotedArithmeticType; ++
Right) {
9427 ArithmeticTypes[
Right] };
9434 for (
QualType Vec1Ty : CandidateTypes[0].vector_types())
9435 for (
QualType Vec2Ty : CandidateTypes[1].vector_types()) {
9436 QualType LandR[2] = {Vec1Ty, Vec2Ty};
9446 void addMatrixBinaryArithmeticOverloads() {
9447 if (!HasArithmeticOrEnumeralCandidateType)
9450 for (
QualType M1 : CandidateTypes[0].matrix_types()) {
9451 AddCandidate(M1, cast<MatrixType>(M1)->getElementType());
9452 AddCandidate(M1, M1);
9455 for (
QualType M2 : CandidateTypes[1].matrix_types()) {
9456 AddCandidate(cast<MatrixType>(M2)->getElementType(), M2);
9457 if (!CandidateTypes[0].containsMatrixType(M2))
9458 AddCandidate(M2, M2);
9493 void addThreeWayArithmeticOverloads() {
9494 addGenericBinaryArithmeticOverloads();
9511 void addBinaryBitwiseArithmeticOverloads() {
9512 if (!HasArithmeticOrEnumeralCandidateType)
9515 for (
unsigned Left = FirstPromotedIntegralType;
9516 Left < LastPromotedIntegralType; ++
Left) {
9517 for (
unsigned Right = FirstPromotedIntegralType;
9520 ArithmeticTypes[
Right] };
9533 void addAssignmentMemberPointerOrEnumeralOverloads() {
9537 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
9538 for (
QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9545 for (
QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9570 void addAssignmentPointerOverloads(
bool isEqualOp) {
9574 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9578 else if (!PtrTy->getPointeeType()->isObjectType())
9589 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
9599 if (!PtrTy.isRestrictQualified() &&
9619 for (
QualType PtrTy : CandidateTypes[1].pointer_types()) {
9633 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
9643 if (!PtrTy.isRestrictQualified() &&
9676 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
9677 if (!HasArithmeticOrEnumeralCandidateType)
9680 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
9681 for (
unsigned Right = FirstPromotedArithmeticType;
9682 Right < LastPromotedArithmeticType; ++
Right) {
9684 ParamTypes[1] = ArithmeticTypes[
Right];
9686 S, ArithmeticTypes[Left], Args[0]);
9699 for (
QualType Vec1Ty : CandidateTypes[0].vector_types())
9700 for (
QualType Vec2Ty : CandidateTypes[0].vector_types()) {
9702 ParamTypes[1] = Vec2Ty;
9730 void addAssignmentIntegralOverloads() {
9731 if (!HasArithmeticOrEnumeralCandidateType)
9734 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
9735 for (
unsigned Right = FirstPromotedIntegralType;
9738 ParamTypes[1] = ArithmeticTypes[
Right];
9740 S, ArithmeticTypes[Left], Args[0]);
9759 void addExclaimOverload() {
9765 void addAmpAmpOrPipePipeOverload() {
9782 void addSubscriptOverloads() {
9783 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9793 for (
QualType PtrTy : CandidateTypes[1].pointer_types()) {
9813 void addArrowStarOverloads() {
9814 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9819 if (!isa<RecordType>(C1))
9828 for (
QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
9834 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
9838 T.isVolatileQualified())
9841 T.isRestrictQualified())
9859 void addConditionalOperatorOverloads() {
9863 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
9864 for (
QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9868 QualType ParamTypes[2] = {PtrTy, PtrTy};
9872 for (
QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9876 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9881 for (
QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9888 QualType ParamTypes[2] = {EnumTy, EnumTy};
9907 VisibleTypeConversionsQuals.
addConst();
9908 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9910 if (Args[ArgIdx]->getType()->isAtomicType())
9911 VisibleTypeConversionsQuals.
addAtomic();
9914 bool HasNonRecordCandidateType =
false;
9915 bool HasArithmeticOrEnumeralCandidateType =
false;
9917 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9918 CandidateTypes.emplace_back(*
this);
9919 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->getType(),
9922 (Op == OO_Exclaim ||
9925 VisibleTypeConversionsQuals);
9926 HasNonRecordCandidateType = HasNonRecordCandidateType ||
9927 CandidateTypes[ArgIdx].hasNonRecordTypes();
9928 HasArithmeticOrEnumeralCandidateType =
9929 HasArithmeticOrEnumeralCandidateType ||
9930 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
9938 if (!HasNonRecordCandidateType &&
9939 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
9943 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
9944 VisibleTypeConversionsQuals,
9945 HasArithmeticOrEnumeralCandidateType,
9946 CandidateTypes, CandidateSet);
9952 llvm_unreachable(
"Expected an overloaded operator");
9957 case OO_Array_Delete:
9960 "Special operators don't use AddBuiltinOperatorCandidates");
9972 if (Args.size() == 1)
9973 OpBuilder.addUnaryPlusPointerOverloads();
9977 if (Args.size() == 1) {
9978 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
9980 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
9981 OpBuilder.addGenericBinaryArithmeticOverloads();
9982 OpBuilder.addMatrixBinaryArithmeticOverloads();
9987 if (Args.size() == 1)
9988 OpBuilder.addUnaryStarPointerOverloads();
9990 OpBuilder.addGenericBinaryArithmeticOverloads();
9991 OpBuilder.addMatrixBinaryArithmeticOverloads();
9996 OpBuilder.addGenericBinaryArithmeticOverloads();
10000 case OO_MinusMinus:
10001 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
10002 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
10005 case OO_EqualEqual:
10006 case OO_ExclaimEqual:
10007 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
10008 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10009 OpBuilder.addGenericBinaryArithmeticOverloads();
10015 case OO_GreaterEqual:
10016 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10017 OpBuilder.addGenericBinaryArithmeticOverloads();
10021 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
10022 OpBuilder.addThreeWayArithmeticOverloads();
10029 case OO_GreaterGreater:
10030 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10034 if (Args.size() == 1)
10040 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10044 OpBuilder.addUnaryTildePromotedIntegralOverloads();
10048 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
10052 case OO_MinusEqual:
10053 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
10057 case OO_SlashEqual:
10058 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
10061 case OO_PercentEqual:
10062 case OO_LessLessEqual:
10063 case OO_GreaterGreaterEqual:
10065 case OO_CaretEqual:
10067 OpBuilder.addAssignmentIntegralOverloads();
10071 OpBuilder.addExclaimOverload();
10076 OpBuilder.addAmpAmpOrPipePipeOverload();
10080 if (Args.size() == 2)
10081 OpBuilder.addSubscriptOverloads();
10085 OpBuilder.addArrowStarOverloads();
10088 case OO_Conditional:
10089 OpBuilder.addConditionalOperatorOverloads();
10090 OpBuilder.addGenericBinaryArithmeticOverloads();
10101 bool PartialOverloading) {
10112 ArgumentDependentLookup(Name,
Loc, Args, Fns);
10116 CandEnd = CandidateSet.
end();
10117 Cand != CandEnd; ++Cand)
10118 if (Cand->Function) {
10122 Fns.
erase(FunTmpl);
10131 if (ExplicitTemplateArgs)
10134 AddOverloadCandidate(
10135 FD, FoundDecl, Args, CandidateSet,
false,
10136 PartialOverloading,
true,
10137 false, ADLCallKind::UsesADL);
10139 AddOverloadCandidate(
10140 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10141 false, PartialOverloading,
10146 auto *FTD = cast<FunctionTemplateDecl>(*I);
10147 AddTemplateOverloadCandidate(
10148 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10149 false, PartialOverloading,
10150 true, ADLCallKind::UsesADL);
10152 *
this, Args, FTD->getTemplatedDecl())) {
10153 AddTemplateOverloadCandidate(
10154 FTD, FoundDecl, ExplicitTemplateArgs, {Args[1], Args[0]},
10155 CandidateSet,
false, PartialOverloading,
10156 true, ADLCallKind::UsesADL,
10164enum class Comparison {
Equal, Better, Worse };
10181 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10182 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10183 if (!Cand1Attr || !Cand2Attr) {
10184 if (Cand1Attr == Cand2Attr)
10185 return Comparison::Equal;
10186 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10192 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10193 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10194 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10195 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10200 return Comparison::Worse;
10202 return Comparison::Better;
10207 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10208 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10209 if (Cand1ID != Cand2ID)
10210 return Comparison::Worse;
10213 return Comparison::Equal;
10221 return Comparison::Equal;
10227 return Comparison::Equal;
10228 return Comparison::Worse;
10231 return Comparison::Better;
10237 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10238 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10240 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10241 return Comparison::Equal;
10243 if (Cand1CPUDisp && !Cand2CPUDisp)
10244 return Comparison::Better;
10245 if (Cand2CPUDisp && !Cand1CPUDisp)
10246 return Comparison::Worse;
10248 if (Cand1CPUSpec && Cand2CPUSpec) {
10249 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10250 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10251 ? Comparison::Better
10252 : Comparison::Worse;
10254 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10255 FirstDiff = std::mismatch(
10256 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10257 Cand2CPUSpec->cpus_begin(),
10259 return LHS->getName() == RHS->getName();
10262 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10263 "Two different cpu-specific versions should not have the same "
10264 "identifier list, otherwise they'd be the same decl!");
10265 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->
getName()
10266 ? Comparison::Better
10267 : Comparison::Worse;
10269 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10275static std::optional<QualType>
10277 if (!isa<CXXMethodDecl>(F) || isa<CXXConstructorDecl>(F))
10278 return std::nullopt;
10280 auto *M = cast<CXXMethodDecl>(F);
10284 return M->getFunctionObjectParameterReferenceType();
10298 PT2->getInstantiatedFromMemberTemplate()))
10309 assert(I < F->getNumParams());
10313 unsigned F1NumParams = F1->
getNumParams() + isa<CXXMethodDecl>(F1);
10314 unsigned F2NumParams = F2->
getNumParams() + isa<CXXMethodDecl>(F2);
10316 if (F1NumParams != F2NumParams)
10319 unsigned I1 = 0, I2 = 0;
10320 for (
unsigned I = 0; I != F1NumParams; ++I) {
10321 QualType T1 = NextParam(F1, I1, I == 0);
10322 QualType T2 = NextParam(F2, I2, I == 0);
10323 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10351 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10352 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10353 if (Mem1 && Mem2) {
10356 if (Mem1->getParent() != Mem2->getParent())
10360 if (Mem1->isInstance() && Mem2->isInstance() &&
10362 Mem1->getFunctionObjectParameterReferenceType(),
10363 Mem1->getFunctionObjectParameterReferenceType()))
10419 bool IsCand1ImplicitHD =
10421 bool IsCand2ImplicitHD =
10436 auto EmitThreshold =
10437 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
10438 (IsCand1ImplicitHD || IsCand2ImplicitHD))
10441 auto Cand1Emittable = P1 > EmitThreshold;
10442 auto Cand2Emittable = P2 > EmitThreshold;
10443 if (Cand1Emittable && !Cand2Emittable)
10445 if (!Cand1Emittable && Cand2Emittable)
10456 unsigned StartArg = 0;
10463 return ICS.isStandard() &&
10475 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
10476 bool HasBetterConversion =
false;
10477 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
10478 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
10479 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
10480 if (Cand1Bad != Cand2Bad) {
10483 HasBetterConversion =
true;
10487 if (HasBetterConversion)
10494 bool HasWorseConversion =
false;
10495 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
10501 HasBetterConversion =
true;
10520 HasWorseConversion =
true;
10535 if (HasBetterConversion && !HasWorseConversion)
10546 isa<CXXConversionDecl>(Cand1.
Function) &&
10547 isa<CXXConversionDecl>(Cand2.
Function)) {
10575 isa<CXXConstructorDecl>(Cand1.
Function) !=
10576 isa<CXXConstructorDecl>(Cand2.
Function))
10577 return isa<CXXConstructorDecl>(Cand1.
Function);
10581 bool Cand1IsSpecialization = Cand1.
Function &&
10583 bool Cand2IsSpecialization = Cand2.
Function &&
10585 if (Cand1IsSpecialization != Cand2IsSpecialization)
10586 return Cand2IsSpecialization;
10592 if (Cand1IsSpecialization && Cand2IsSpecialization) {
10593 const auto *Obj1Context =
10595 const auto *Obj2Context =
10603 Obj1Context ?
QualType(Obj1Context->getTypeForDecl(), 0)
10605 Obj2Context ?
QualType(Obj2Context->getTypeForDecl(), 0)
10614 if (!Cand1IsSpecialization && !Cand2IsSpecialization &&
10624 bool Cand1IsInherited =
10626 bool Cand2IsInherited =
10628 if (Cand1IsInherited != Cand2IsInherited)
10629 return Cand2IsInherited;
10630 else if (Cand1IsInherited) {
10631 assert(Cand2IsInherited);
10634 if (Cand1Class->isDerivedFrom(Cand2Class))
10636 if (Cand2Class->isDerivedFrom(Cand1Class))
10653 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
10654 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
10655 if (Guide1 && Guide2) {
10657 if (Guide1->isImplicit() != Guide2->isImplicit())
10658 return Guide2->isImplicit();
10668 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
10669 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
10670 if (Constructor1 && Constructor2) {
10671 bool isC1Templated = Constructor1->getTemplatedKind() !=
10673 bool isC2Templated = Constructor2->getTemplatedKind() !=
10675 if (isC1Templated != isC2Templated)
10676 return isC2Templated;
10684 if (Cmp != Comparison::Equal)
10685 return Cmp == Comparison::Better;
10688 bool HasPS1 = Cand1.
Function !=
nullptr &&
10690 bool HasPS2 = Cand2.
Function !=
nullptr &&
10692 if (HasPS1 != HasPS2 && HasPS1)
10696 if (MV == Comparison::Better)
10698 if (MV == Comparison::Worse)
10713 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
10714 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
10716 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
10717 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
10738 auto *VA = dyn_cast_or_null<ValueDecl>(A);
10739 auto *VB = dyn_cast_or_null<ValueDecl>(B);
10745 if (!VA->getDeclContext()->getRedeclContext()->Equals(
10746 VB->getDeclContext()->getRedeclContext()) ||
10747 getOwningModule(VA) == getOwningModule(VB) ||
10748 VA->isExternallyVisible() || VB->isExternallyVisible())
10756 if (Context.
hasSameType(VA->getType(), VB->getType()))
10761 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
10762 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
10765 auto *EnumA = cast<EnumDecl>(EA->getDeclContext());
10766 auto *EnumB = cast<EnumDecl>(EB->getDeclContext());
10767 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
10769 EnumB->getIntegerType()))
10772 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
10782 assert(
D &&
"Unknown declaration");
10783 Diag(
Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) <<
D;
10785 Module *M = getOwningModule(
D);
10789 for (
auto *
E : Equiv) {
10790 Module *M = getOwningModule(
E);
10791 Diag(
E->getLocation(), diag::note_equivalent_internal_linkage_decl)
10800 static_cast<CNSInfo *
>(DeductionFailure.Data)
10801 ->Satisfaction.ContainsErrors;
10818 std::transform(
begin(),
end(), std::back_inserter(Candidates),
10834 bool ContainsSameSideCandidate =
10838 S.
CUDA().IdentifyPreference(Caller, Cand->
Function) ==
10841 if (ContainsSameSideCandidate) {
10848 llvm::erase_if(Candidates, IsWrongSideCandidate);
10854 for (
auto *Cand : Candidates) {
10855 Cand->
Best =
false;
10857 if (Best ==
end() ||
10877 PendingBest.push_back(&*Best);
10882 while (!PendingBest.empty()) {
10883 auto *Curr = PendingBest.pop_back_val();
10884 for (
auto *Cand : Candidates) {
10887 PendingBest.push_back(Cand);
10892 EquivalentCands.push_back(Cand->
Function);
10904 if (Best->Function && Best->Function->isDeleted())
10907 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
10909 M->isImplicitObjectMemberFunction()) {
10913 if (!EquivalentCands.empty())
10922enum OverloadCandidateKind {
10925 oc_reversed_binary_operator,
10927 oc_implicit_default_constructor,
10928 oc_implicit_copy_constructor,
10929 oc_implicit_move_constructor,
10930 oc_implicit_copy_assignment,
10931 oc_implicit_move_assignment,
10932 oc_implicit_equality_comparison,
10933 oc_inherited_constructor
10936enum OverloadCandidateSelect {
10939 ocs_described_template,
10942static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
10946 std::string &Description) {
10952 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
10955 OverloadCandidateSelect Select = [&]() {
10956 if (!Description.empty())
10957 return ocs_described_template;
10958 return isTemplate ? ocs_template : ocs_non_template;
10961 OverloadCandidateKind Kind = [&]() {
10962 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
10963 return oc_implicit_equality_comparison;
10966 return oc_reversed_binary_operator;
10968 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
10969 if (!Ctor->isImplicit()) {
10970 if (isa<ConstructorUsingShadowDecl>(
Found))
10971 return oc_inherited_constructor;
10973 return oc_constructor;
10976 if (Ctor->isDefaultConstructor())
10977 return oc_implicit_default_constructor;
10979 if (Ctor->isMoveConstructor())
10980 return oc_implicit_move_constructor;
10982 assert(Ctor->isCopyConstructor() &&
10983 "unexpected sort of implicit constructor");
10984 return oc_implicit_copy_constructor;
10987 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
10990 if (!Meth->isImplicit())
10993 if (Meth->isMoveAssignmentOperator())
10994 return oc_implicit_move_assignment;
10996 if (Meth->isCopyAssignmentOperator())
10997 return oc_implicit_copy_assignment;
10999 assert(isa<CXXConversionDecl>(Meth) &&
"expected conversion");
11003 return oc_function;
11006 return std::make_pair(Kind, Select);
11009void MaybeEmitInheritedConstructorNote(
Sema &S,
const Decl *FoundDecl) {
11012 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
11014 diag::note_ovl_candidate_inherited_constructor)
11015 << Shadow->getNominatedBaseClass();
11024 if (EnableIf->getCond()->isValueDependent() ||
11025 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
11042 bool InOverloadResolution,
11046 if (InOverloadResolution)
11048 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
11050 S.
Diag(
Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
11061 if (InOverloadResolution) {
11064 TemplateArgString +=
" ";
11066 FunTmpl->getTemplateParameters(),
11071 diag::note_ovl_candidate_unsatisfied_constraints)
11072 << TemplateArgString;
11074 S.
Diag(
Loc, diag::err_addrof_function_constraints_not_satisfied)
11083 return P->hasAttr<PassObjectSizeAttr>();
11090 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11091 if (InOverloadResolution)
11093 diag::note_ovl_candidate_has_pass_object_size_params)
11096 S.
Diag(
Loc, diag::err_address_of_function_with_pass_object_size_params)
11112 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11120 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11124 const auto *RD = cast<CXXRecordDecl>(Fn->getParent());
11125 if (!RD->isLambda())
11135 return ConvToCC != CallOpCC;
11141 QualType DestType,
bool TakingAddress) {
11144 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11145 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11147 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11148 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11153 std::string FnDesc;
11154 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11155 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11157 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11160 HandleFunctionTypeMismatch(PD, Fn->getType(), DestType);
11161 Diag(Fn->getLocation(), PD);
11162 MaybeEmitInheritedConstructorNote(*
this,
Found);
11180 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11181 for (
auto I = Cands.begin(),
E = Cands.end(); I !=
E; ++I) {
11185 if (
auto *Template = I->Function->getPrimaryTemplate())
11186 Template->getAssociatedConstraints(AC);
11188 I->Function->getAssociatedConstraints(AC);
11191 if (FirstCand ==
nullptr) {
11192 FirstCand = I->Function;
11194 }
else if (SecondCand ==
nullptr) {
11195 SecondCand = I->Function;
11208 SecondCand, SecondAC))
11217 bool TakingAddress) {
11227 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
11228 NoteOverloadCandidate(*I, FunTmpl->getTemplatedDecl(),
CRK_None, DestType,
11231 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
11232 NoteOverloadCandidate(*I, Fun,
CRK_None, DestType, TakingAddress);
11244 S.
Diag(CaretLoc, PDiag)
11245 << Ambiguous.getFromType() << Ambiguous.getToType();
11246 unsigned CandsShown = 0;
11248 for (I = Ambiguous.begin(),
E = Ambiguous.end(); I !=
E; ++I) {
11260 unsigned I,
bool TakingCandidateAddress) {
11262 assert(Conv.
isBad());
11263 assert(Cand->
Function &&
"for now, candidate must be a function");
11269 bool isObjectArgument =
false;
11270 if (isa<CXXMethodDecl>(Fn) && !isa<CXXConstructorDecl>(Fn)) {
11272 isObjectArgument =
true;
11273 else if (!Fn->hasCXXExplicitFunctionObjectParameter())
11277 std::string FnDesc;
11278 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11289 bool HasParamPack =
11290 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
11291 return Parm->isParameterPack();
11293 if (!isObjectArgument && !HasParamPack)
11294 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
11297 assert(FromExpr &&
"overload set argument came from implicit argument?");
11299 if (isa<UnaryOperator>(
E))
11303 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
11304 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11305 << ToParamRange << ToTy << Name << I + 1;
11306 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11315 CToTy = RT->getPointeeType();
11320 CFromTy = FromPT->getPointeeType();
11321 CToTy = ToPT->getPointeeType();
11331 if (isObjectArgument)
11332 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
11333 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11336 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
11337 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11340 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11345 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
11346 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11349 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11354 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
11355 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11358 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11363 assert(CVR &&
"expected qualifiers mismatch");
11365 if (isObjectArgument) {
11366 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
11367 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11368 << FromTy << (CVR - 1);
11370 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
11371 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11372 << ToParamRange << FromTy << (CVR - 1) << I + 1;
11374 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11380 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
11381 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11382 << (
unsigned)isObjectArgument << I + 1
11385 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11391 if (FromExpr && isa<InitListExpr>(FromExpr)) {
11392 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
11393 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11394 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11399 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11411 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
11412 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11413 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11414 << (
unsigned)(Cand->
Fix.
Kind);
11416 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11421 unsigned BaseToDerivedConversion = 0;
11424 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
11426 !FromPtrTy->getPointeeType()->isIncompleteType() &&
11427 !ToPtrTy->getPointeeType()->isIncompleteType() &&
11429 FromPtrTy->getPointeeType()))
11430 BaseToDerivedConversion = 1;
11438 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
11440 FromIface->isSuperClassOf(ToIface))
11441 BaseToDerivedConversion = 2;
11443 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy,
11446 !ToRefTy->getPointeeType()->isIncompleteType() &&
11448 BaseToDerivedConversion = 3;
11452 if (BaseToDerivedConversion) {
11453 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
11454 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11455 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
11457 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11461 if (isa<ObjCObjectPointerType>(CFromTy) &&
11462 isa<PointerType>(CToTy)) {
11466 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
11467 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11468 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
11470 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11480 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11481 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11482 << (
unsigned)(Cand->
Fix.
Kind);
11491 S.
Diag(Fn->getLocation(), FDiag);
11493 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11500 unsigned NumArgs,
bool IsAddressOf =
false) {
11501 assert(Cand->
Function &&
"Candidate is required to be a function.");
11503 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
11504 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
11511 if (Fn->isInvalidDecl() &&
11515 if (NumArgs < MinParams) {
11532 unsigned NumFormalArgs,
11533 bool IsAddressOf =
false) {
11534 assert(isa<FunctionDecl>(
D) &&
11535 "The templated declaration should at least be a function"
11536 " when diagnosing bad template argument deduction due to too many"
11537 " or too few arguments");
11543 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
11544 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
11547 bool HasExplicitObjectParam =
11548 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
11550 unsigned ParamCount =
11551 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
11552 unsigned mode, modeCount;
11554 if (NumFormalArgs < MinParams) {
11555 if (MinParams != ParamCount || FnTy->isVariadic() ||
11556 FnTy->isTemplateVariadic())
11560 modeCount = MinParams;
11562 if (MinParams != ParamCount)
11566 modeCount = ParamCount;
11569 std::string Description;
11570 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11571 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
11573 if (modeCount == 1 && !IsAddressOf &&
11574 Fn->getParamDecl(HasExplicitObjectParam ? 1 : 0)->getDeclName())
11575 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
11576 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11577 << Description << mode
11578 << Fn->getParamDecl(HasExplicitObjectParam ? 1 : 0) << NumFormalArgs
11579 << HasExplicitObjectParam << Fn->getParametersSourceRange();
11581 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
11582 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11583 << Description << mode << modeCount << NumFormalArgs
11584 << HasExplicitObjectParam << Fn->getParametersSourceRange();
11586 MaybeEmitInheritedConstructorNote(S,
Found);
11591 unsigned NumFormalArgs) {
11592 assert(Cand->
Function &&
"Candidate must be a function");
11602 llvm_unreachable(
"Unsupported: Getting the described template declaration"
11603 " for bad deduction diagnosis");
11610 bool TakingCandidateAddress) {
11616 switch (DeductionFailure.
getResult()) {
11619 "TemplateDeductionResult::Success while diagnosing bad deduction");
11621 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
11622 "while diagnosing bad deduction");
11628 assert(ParamD &&
"no parameter found for incomplete deduction result");
11630 diag::note_ovl_candidate_incomplete_deduction)
11632 MaybeEmitInheritedConstructorNote(S,
Found);
11637 assert(ParamD &&
"no parameter found for incomplete deduction result");
11639 diag::note_ovl_candidate_incomplete_deduction_pack)
11643 MaybeEmitInheritedConstructorNote(S,
Found);
11648 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
11666 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
11667 << ParamD->
getDeclName() << Arg << NonCanonParam;
11668 MaybeEmitInheritedConstructorNote(S,
Found);
11673 assert(ParamD &&
"no parameter found for inconsistent deduction result");
11675 if (isa<TemplateTypeParmDecl>(ParamD))
11677 else if (isa<NonTypeTemplateParmDecl>(ParamD)) {
11687 diag::note_ovl_candidate_inconsistent_deduction_types)
11690 MaybeEmitInheritedConstructorNote(S,
Found);
11710 diag::note_ovl_candidate_inconsistent_deduction)
11713 MaybeEmitInheritedConstructorNote(S,
Found);
11718 assert(ParamD &&
"no parameter found for invalid explicit arguments");
11721 diag::note_ovl_candidate_explicit_arg_mismatch_named)
11726 index = TTP->getIndex();
11728 = dyn_cast<NonTypeTemplateParmDecl>(ParamD))
11729 index = NTTP->getIndex();
11731 index = cast<TemplateTemplateParmDecl>(ParamD)->getIndex();
11733 diag::note_ovl_candidate_explicit_arg_mismatch_unnamed)
11736 MaybeEmitInheritedConstructorNote(S,
Found);
11743 TemplateArgString =
" ";
11746 if (TemplateArgString.size() == 1)
11747 TemplateArgString.clear();
11749 diag::note_ovl_candidate_unsatisfied_constraints)
11750 << TemplateArgString;
11753 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
11763 diag::note_ovl_candidate_instantiation_depth);
11764 MaybeEmitInheritedConstructorNote(S,
Found);
11772 TemplateArgString =
" ";
11775 if (TemplateArgString.size() == 1)
11776 TemplateArgString.clear();
11781 if (PDiag && PDiag->second.getDiagID() ==
11782 diag::err_typename_nested_not_found_enable_if) {
11785 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
11786 <<
"'enable_if'" << TemplateArgString;
11791 if (PDiag && PDiag->second.getDiagID() ==
11792 diag::err_typename_nested_not_found_requirement) {
11794 diag::note_ovl_candidate_disabled_by_requirement)
11795 << PDiag->second.getStringArg(0) << TemplateArgString;
11805 SFINAEArgString =
": ";
11807 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
11811 diag::note_ovl_candidate_substitution_failure)
11812 << TemplateArgString << SFINAEArgString << R;
11813 MaybeEmitInheritedConstructorNote(S,
Found);
11823 TemplateArgString =
" ";
11826 if (TemplateArgString.size() == 1)
11827 TemplateArgString.clear();
11830 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
11833 << TemplateArgString
11858 diag::note_ovl_candidate_non_deduced_mismatch_qualified)
11865 if (TakingCandidateAddress && isa<FunctionDecl>(Templated) &&
11874 diag::note_ovl_candidate_non_deduced_mismatch)
11875 << FirstTA << SecondTA;
11881 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
11882 MaybeEmitInheritedConstructorNote(S,
Found);
11886 diag::note_cuda_ovl_candidate_target_mismatch);
11894 bool TakingCandidateAddress) {
11895 assert(Cand->
Function &&
"Candidate must be a function");
11910 assert(Cand->
Function &&
"Candidate must be a Function.");
11916 std::string FnDesc;
11917 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11918 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
11921 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
11922 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
11924 << llvm::to_underlying(CalleeTarget) << llvm::to_underlying(CallerTarget);
11929 if (Meth !=
nullptr && Meth->
isImplicit()) {
11933 switch (FnKindPair.first) {
11936 case oc_implicit_default_constructor:
11939 case oc_implicit_copy_constructor:
11942 case oc_implicit_move_constructor:
11945 case oc_implicit_copy_assignment:
11948 case oc_implicit_move_assignment:
11953 bool ConstRHS =
false;
11957 ConstRHS = RT->getPointeeType().isConstQualified();
11968 assert(Cand->
Function &&
"Candidate must be a function");
11972 S.
Diag(Callee->getLocation(),
11973 diag::note_ovl_candidate_disabled_by_function_cond_attr)
11974 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
11978 assert(Cand->
Function &&
"Candidate must be a function");
11981 assert(ES.
isExplicit() &&
"not an explicit candidate");
11984 switch (Fn->getDeclKind()) {
11985 case Decl::Kind::CXXConstructor:
11988 case Decl::Kind::CXXConversion:
11991 case Decl::Kind::CXXDeductionGuide:
11992 Kind = Fn->isImplicit() ? 0 : 2;
11995 llvm_unreachable(
"invalid Decl");
12004 First = Pattern->getFirstDecl();
12007 diag::note_ovl_candidate_explicit)
12008 << Kind << (ES.
getExpr() ? 1 : 0)
12013 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
12020 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
12022 std::string FunctionProto;
12023 llvm::raw_string_ostream OS(FunctionProto);
12036 "Non-template implicit deduction guides are only possible for "
12039 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12044 assert(Template &&
"Cannot find the associated function template of "
12045 "CXXDeductionGuideDecl?");
12047 Template->
print(OS);
12048 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12069 bool TakingCandidateAddress,
12071 assert(Cand->
Function &&
"Candidate must be a function");
12079 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
12086 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12091 if (Fn->isDeleted()) {
12092 std::string FnDesc;
12093 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12094 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12097 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12098 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12099 << (Fn->isDeleted() ? (Fn->isDeletedAsWritten() ? 1 : 2) : 0);
12100 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12127 TakingCandidateAddress);
12130 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12131 << (Fn->getPrimaryTemplate() ? 1 : 0);
12132 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12139 S.
Diag(Fn->getLocation(),
12140 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12141 << QualsForPrinting;
12142 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12153 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
12174 if (cast<CXXConstructorDecl>(Fn)->isCopyOrMoveConstructor())
12176 S.
Diag(Fn->getLocation(),
12177 diag::note_ovl_candidate_inherited_constructor_slice)
12178 << (Fn->getPrimaryTemplate() ? 1 : 0)
12179 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
12180 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12186 assert(!Available);
12194 std::string FnDesc;
12195 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12196 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12199 S.
Diag(Fn->getLocation(),
12200 diag::note_ovl_candidate_constraints_not_satisfied)
12201 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12219 bool isLValueReference =
false;
12220 bool isRValueReference =
false;
12221 bool isPointer =
false;
12225 isLValueReference =
true;
12229 isRValueReference =
true;
12245 diag::note_ovl_surrogate_constraints_not_satisfied)
12259 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
12260 std::string TypeStr(
"operator");
12266 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
12271 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
12278 if (ICS.
isBad())
break;
12282 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
12299 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
12329 llvm_unreachable(
"Unhandled deduction result");
12334struct CompareOverloadCandidatesForDisplay {
12340 CompareOverloadCandidatesForDisplay(
12343 : S(S), NumArgs(NArgs), CSK(CSK) {}
12353 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
12355 if (NumArgs < C->
Function->getMinRequiredArguments())
12365 if (L == R)
return false;
12369 if (!R->
Viable)
return true;
12371 if (
int Ord = CompareConversions(*L, *R))
12391 if (LDist == RDist) {
12392 if (LFailureKind == RFailureKind)
12400 return LDist < RDist;
12418 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
12419 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
12420 if (numLFixes != numRFixes) {
12421 return numLFixes < numRFixes;
12425 if (
int Ord = CompareConversions(*L, *R))
12437 if (LRank != RRank)
12438 return LRank < RRank;
12464 struct ConversionSignals {
12465 unsigned KindRank = 0;
12469 ConversionSignals Sig;
12470 Sig.KindRank =
Seq.getKindRank();
12471 if (
Seq.isStandard())
12472 Sig.Rank =
Seq.Standard.getRank();
12473 else if (
Seq.isUserDefined())
12474 Sig.Rank =
Seq.UserDefined.After.getRank();
12480 static ConversionSignals ForObjectArgument() {
12496 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
12498 ? ConversionSignals::ForObjectArgument()
12499 : ConversionSignals::ForSequence(L.Conversions[I]);
12501 ? ConversionSignals::ForObjectArgument()
12502 : ConversionSignals::ForSequence(R.Conversions[I]);
12503 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
12504 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
12529 bool Unfixable =
false;
12537 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
12538 if (Cand->
Conversions[ConvIdx].isInitialized() &&
12547 bool SuppressUserConversions =
false;
12549 unsigned ConvIdx = 0;
12550 unsigned ArgIdx = 0;
12565 if (isa<CXXMethodDecl>(Cand->
Function) &&
12578 assert(ConvCount <= 3);
12584 ConvIdx != ConvCount;
12586 assert(ArgIdx < Args.size() &&
"no argument for this arg conversion");
12587 if (Cand->
Conversions[ConvIdx].isInitialized()) {
12589 }
else if (
ParamIdx < ParamTypes.size()) {
12590 if (ParamTypes[
ParamIdx]->isDependentType())
12591 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
12592 Args[ArgIdx]->getType());
12596 SuppressUserConversions,
12601 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
12617 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
12618 if (!Filter(*Cand))
12622 if (!Cand->Viable) {
12623 if (!Cand->Function && !Cand->IsSurrogate) {
12643 Cands.push_back(Cand);
12647 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
12654 bool DeferHint =
false;
12658 auto WrongSidedCands =
12660 return (Cand.Viable ==
false &&
12663 Cand.Function->template hasAttr<CUDAHostAttr>() &&
12664 Cand.Function->template hasAttr<CUDADeviceAttr>());
12666 DeferHint = !WrongSidedCands.empty();
12684 bool NoteCands =
true;
12685 for (
const Expr *Arg : Args) {
12686 if (Arg->getType()->isWebAssemblyTableType())
12700 bool ReportedAmbiguousConversions =
false;
12703 unsigned CandsShown = 0;
12704 auto I = Cands.begin(),
E = Cands.end();
12705 for (; I !=
E; ++I) {
12721 "Non-viable built-in candidates are not added to Cands.");
12728 if (!ReportedAmbiguousConversions) {
12730 ReportedAmbiguousConversions =
true;
12743 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates,
12755struct CompareTemplateSpecCandidatesForDisplay {
12757 CompareTemplateSpecCandidatesForDisplay(
Sema &S) : S(S) {}
12791 bool ForTakingAddress) {
12793 DeductionFailure, 0, ForTakingAddress);
12796void TemplateSpecCandidateSet::destroyCandidates() {
12798 i->DeductionFailure.Destroy();
12803 destroyCandidates();
12804 Candidates.clear();
12817 Cands.reserve(
size());
12818 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
12819 if (Cand->Specialization)
12820 Cands.push_back(Cand);
12825 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
12832 unsigned CandsShown = 0;
12833 for (I = Cands.begin(),
E = Cands.end(); I !=
E; ++I) {
12839 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
12844 "Non-matching built-in candidates are not added to Cands.");
12849 S.
Diag(
Loc, diag::note_ovl_too_many_candidates) <<
int(
E - I);
12859 QualType Ret = PossiblyAFunctionType;
12862 Ret = ToTypePtr->getPointeeType();
12865 Ret = ToTypeRef->getPointeeType();
12868 Ret = MemTypePtr->getPointeeType();
12875 bool Complain =
true) {
12892class AddressOfFunctionResolver {
12902 bool TargetTypeIsNonStaticMemberFunction;
12903 bool FoundNonTemplateFunction;
12904 bool StaticMemberFunctionFromBoundPointer;
12905 bool HasComplained;
12914 AddressOfFunctionResolver(
Sema &S,
Expr *SourceExpr,
12915 const QualType &TargetType,
bool Complain)
12916 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
12917 Complain(Complain), Context(S.getASTContext()),
12918 TargetTypeIsNonStaticMemberFunction(
12920 FoundNonTemplateFunction(
false),
12921 StaticMemberFunctionFromBoundPointer(
false),
12922 HasComplained(
false),
12925 FailedCandidates(OvlExpr->getNameLoc(),
true) {
12926 ExtractUnqualifiedFunctionTypeFromTargetType();
12930 if (!UME->isImplicitAccess() &&
12932 StaticMemberFunctionFromBoundPointer =
true;
12936 OvlExpr,
false, &dap)) {
12942 TargetTypeIsNonStaticMemberFunction =
true;
12950 Matches.push_back(std::make_pair(dap, Fn));
12958 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
12961 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
12962 if (FoundNonTemplateFunction)
12963 EliminateAllTemplateMatches();
12965 EliminateAllExceptMostSpecializedTemplate();
12970 EliminateSuboptimalCudaMatches();
12973 bool hasComplained()
const {
return HasComplained; }
12976 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
12988 return candidateHasExactlyCorrectType(A) &&
12989 (!candidateHasExactlyCorrectType(B) ||
12995 bool eliminiateSuboptimalOverloadCandidates() {
12998 auto Best = Matches.begin();
12999 for (
auto I = Matches.begin()+1,
E = Matches.end(); I !=
E; ++I)
13000 if (isBetterCandidate(I->second, Best->second))
13004 auto IsBestOrInferiorToBest = [
this, BestFn](
13005 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
13006 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
13011 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
13013 Matches[0] = *Best;
13018 bool isTargetTypeAFunction()
const {
13027 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
13038 bool CanConvertToFunctionPointer =
13040 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13043 else if (TargetTypeIsNonStaticMemberFunction)
13055 FunctionTemplate, &OvlExplicitTemplateArgs, TargetFunctionType,
13057 Result != TemplateDeductionResult::Success) {
13075 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
13079 bool AddMatchingNonTemplateFunction(
NamedDecl* Fn,
13084 bool CanConvertToFunctionPointer =
13086 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13089 else if (TargetTypeIsNonStaticMemberFunction)
13092 if (
FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13099 if (FunDecl->isMultiVersion()) {
13100 const auto *TA = FunDecl->
getAttr<TargetAttr>();
13101 if (TA && !TA->isDefaultVersion())
13103 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13104 if (TVA && !TVA->isDefaultVersion())
13112 HasComplained |= Complain;
13121 candidateHasExactlyCorrectType(FunDecl)) {
13122 Matches.push_back(std::make_pair(
13123 CurAccessFunPair, cast<FunctionDecl>(FunDecl->getCanonicalDecl())));
13124 FoundNonTemplateFunction =
true;
13132 bool FindAllFunctionsThatMatchTargetTypeExactly() {
13137 if (IsInvalidFormOfPointerToMemberFunction())
13153 = dyn_cast<FunctionTemplateDecl>(Fn)) {
13154 if (AddMatchingTemplateFunction(FunctionTemplate, I.getPair()))
13159 AddMatchingNonTemplateFunction(Fn, I.getPair()))
13162 assert(Ret || Matches.empty());
13166 void EliminateAllExceptMostSpecializedTemplate() {
13179 for (
unsigned I = 0,
E = Matches.size(); I !=
E; ++I)
13180 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
13185 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
13187 S.
PDiag(diag::err_addr_ovl_ambiguous)
13188 << Matches[0].second->getDeclName(),
13189 S.
PDiag(diag::note_ovl_candidate)
13190 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
13191 Complain, TargetFunctionType);
13193 if (Result != MatchesCopy.
end()) {
13195 Matches[0].first = Matches[Result - MatchesCopy.
begin()].first;
13196 Matches[0].second = cast<FunctionDecl>(*Result);
13199 HasComplained |= Complain;
13202 void EliminateAllTemplateMatches() {
13205 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
13206 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
13209 Matches[I] = Matches[--N];
13215 void EliminateSuboptimalCudaMatches() {
13221 void ComplainNoMatchesFound()
const {
13222 assert(Matches.empty());
13224 << OvlExpr->
getName() << TargetFunctionType
13226 if (FailedCandidates.
empty())
13237 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
13245 bool IsInvalidFormOfPointerToMemberFunction()
const {
13246 return TargetTypeIsNonStaticMemberFunction &&
13250 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
13258 bool IsStaticMemberFunctionFromBoundPointer()
const {
13259 return StaticMemberFunctionFromBoundPointer;
13262 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
13264 diag::err_invalid_form_pointer_member_function)
13268 void ComplainOfInvalidConversion()
const {
13270 << OvlExpr->
getName() << TargetType;
13273 void ComplainMultipleMatchesFound()
const {
13274 assert(Matches.size() > 1);
13281 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
13283 int getNumMatches()
const {
return Matches.size(); }
13286 if (Matches.size() != 1)
return nullptr;
13287 return Matches[0].second;
13291 if (Matches.size() != 1)
return nullptr;
13292 return &Matches[0].first;
13302 bool *pHadMultipleCandidates) {
13305 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
13307 int NumMatches = Resolver.getNumMatches();
13309 bool ShouldComplain = Complain && !Resolver.hasComplained();
13310 if (NumMatches == 0 && ShouldComplain) {
13311 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
13312 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
13314 Resolver.ComplainNoMatchesFound();
13316 else if (NumMatches > 1 && ShouldComplain)
13317 Resolver.ComplainMultipleMatchesFound();
13318 else if (NumMatches == 1) {
13319 Fn = Resolver.getMatchingFunctionDecl();
13322 ResolveExceptionSpec(AddressOfExpr->
getExprLoc(), FPT);
13323 FoundResult = *Resolver.getMatchingFunctionAccessPair();
13325 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
13326 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
13328 CheckAddressOfMemberAccess(AddressOfExpr, FoundResult);
13332 if (pHadMultipleCandidates)
13333 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
13341 bool IsResultAmbiguous =
false;
13349 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
13350 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
13357 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
13365 auto FoundBetter = [&]() {
13366 IsResultAmbiguous =
false;
13377 if (getLangOpts().CUDA) {
13378 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
13380 if (PreferenceByCUDA != 0) {
13382 if (PreferenceByCUDA > 0)
13390 if (MoreConstrained != FD) {
13391 if (!MoreConstrained) {
13392 IsResultAmbiguous =
true;
13393 AmbiguousDecls.push_back(FD);
13402 if (IsResultAmbiguous)
13413 if (getLangOpts().
CUDA && CheckCUDAPreference(Skipped,
Result) != 0)
13415 if (!getMoreConstrainedFunction(Skipped,
Result))
13424 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
13430 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
13431 Found->isCPUSpecificMultiVersion())
13438 CheckAddressOfMemberAccess(
E, DAP);
13444 SrcExpr = DefaultFunctionArrayConversion(Fixed,
false);
13479 = cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
13508 NoteAllOverloadCandidates(ovl);
13514 if (FoundResult) *FoundResult = I.getPair();
13525 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
13527 unsigned DiagIDForComplaining) {
13534 if (
FunctionDecl *fn = ResolveSingleFunctionTemplateSpecialization(
13546 isa<CXXMethodDecl>(fn) &&
13547 cast<CXXMethodDecl>(fn)->isInstance()) {
13548 if (!complain)
return false;
13551 diag::err_bound_member_function)
13564 SingleFunctionExpression =
13565 FixOverloadedFunctionReference(SrcExpr.
get(), found, fn);
13568 if (doFunctionPointerConversion) {
13569 SingleFunctionExpression =
13570 DefaultFunctionArrayLvalueConversion(SingleFunctionExpression.
get());
13571 if (SingleFunctionExpression.
isInvalid()) {
13578 if (!SingleFunctionExpression.
isUsable()) {
13580 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
13582 << DestTypeForComplaining
13583 << OpRangeForComplaining
13585 NoteAllOverloadCandidates(SrcExpr.
get());
13594 SrcExpr = SingleFunctionExpression;
13604 bool PartialOverloading,
13606 NamedDecl *Callee = FoundDecl.getDecl();
13607 if (isa<UsingShadowDecl>(Callee))
13608 Callee = cast<UsingShadowDecl>(Callee)->getTargetDecl();
13611 if (ExplicitTemplateArgs) {
13612 assert(!KnownValid &&
"Explicit template arguments?");
13621 PartialOverloading);
13626 = dyn_cast<FunctionTemplateDecl>(Callee)) {
13628 ExplicitTemplateArgs, Args, CandidateSet,
13630 PartialOverloading);
13634 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
13640 bool PartialOverloading) {
13663 assert(!(*I)->getDeclContext()->isRecord());
13664 assert(isa<UsingShadowDecl>(*I) ||
13665 !(*I)->getDeclContext()->isFunctionOrMethod());
13666 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
13676 ExplicitTemplateArgs = &TABuffer;
13682 CandidateSet, PartialOverloading,
13687 Args, ExplicitTemplateArgs,
13688 CandidateSet, PartialOverloading);
13696 CandidateSet,
false,
false);
13702 switch (Name.getCXXOverloadedOperator()) {
13703 case OO_New:
case OO_Array_New:
13704 case OO_Delete:
case OO_Array_Delete:
13727 if (DC->isTransparentContext())
13743 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
13748 if (FoundInClass) {
13749 *FoundInClass = RD;
13752 R.
addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
13769 AssociatedNamespaces,
13770 AssociatedClasses);
13774 for (Sema::AssociatedNamespaceSet::iterator
13775 it = AssociatedNamespaces.begin(),
13776 end = AssociatedNamespaces.end(); it !=
end; ++it) {
13778 if (
Std &&
Std->Encloses(*it))
13788 SuggestedNamespaces.insert(*it);
13792 SemaRef.
Diag(R.
getNameLoc(), diag::err_not_found_by_two_phase_lookup)
13794 if (SuggestedNamespaces.empty()) {
13795 SemaRef.
Diag(Best->Function->getLocation(),
13796 diag::note_not_found_by_two_phase_lookup)
13798 }
else if (SuggestedNamespaces.size() == 1) {
13799 SemaRef.
Diag(Best->Function->getLocation(),
13800 diag::note_not_found_by_two_phase_lookup)
13806 SemaRef.
Diag(Best->Function->getLocation(),
13807 diag::note_not_found_by_two_phase_lookup)
13839class BuildRecoveryCallExprRAII {
13844 BuildRecoveryCallExprRAII(
Sema &S) : SemaRef(S), SatStack(S) {
13866 bool EmptyLookup,
bool AllowTypoCorrection) {
13874 BuildRecoveryCallExprRAII RCE(SemaRef);
13884 ExplicitTemplateArgs = &TABuffer;
13892 ExplicitTemplateArgs, Args, &FoundInClass)) {
13894 }
else if (EmptyLookup) {
13899 ExplicitTemplateArgs !=
nullptr,
13900 dyn_cast<MemberExpr>(Fn));
13902 AllowTypoCorrection
13908 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
13923 assert(!R.
empty() &&
"lookup results empty despite recovery");
13934 if ((*R.
begin())->isCXXClassMember())
13936 ExplicitTemplateArgs, S);
13937 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
13939 ExplicitTemplateArgs);
13963 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
13970 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
13972 llvm_unreachable(
"performing ADL for builtin");
13975 assert(getLangOpts().
CPlusPlus &&
"ADL enabled in C");
13979 UnbridgedCastsSet UnbridgedCasts;
13987 AddOverloadedCallCandidates(ULE, Args, *CandidateSet);
13989 if (getLangOpts().MSVCCompat &&
13990 CurContext->isDependentContext() && !isSFINAEContext() &&
13991 (isa<FunctionDecl>(CurContext) || isa<CXXRecordDecl>(CurContext))) {
13994 if (CandidateSet->
empty() ||
14003 RParenLoc, CurFPFeatureOverrides());
14010 if (CandidateSet->
empty())
14013 UnbridgedCasts.restore();
14020 std::optional<QualType>
Result;
14023 if (!Candidate.Function)
14025 if (Candidate.Function->isInvalidDecl())
14027 QualType T = Candidate.Function->getReturnType();
14040 if (Best && *Best != CS.
end())
14041 ConsiderCandidate(**Best);
14044 for (
const auto &
C : CS)
14046 ConsiderCandidate(
C);
14049 for (
const auto &
C : CS)
14050 ConsiderCandidate(
C);
14055 if (
Value.isNull() ||
Value->isUndeducedType())
14072 bool AllowTypoCorrection) {
14073 switch (OverloadResult) {
14084 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14090 if (*Best != CandidateSet->
end() &&
14094 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
14099 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
14109 CandidateSet->
empty(),
14110 AllowTypoCorrection);
14117 for (
const Expr *Arg : Args) {
14118 if (!Arg->getType()->isFunctionType())
14120 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
14121 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
14124 Arg->getExprLoc()))
14132 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
14133 << ULE->
getName() << Fn->getSourceRange()),
14141 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
14142 << ULE->
getName() << Fn->getSourceRange()),
14149 Fn->getSourceRange(), ULE->
getName(),
14150 *CandidateSet, FDecl, Args);
14159 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14167 SubExprs.append(Args.begin(), Args.end());
14174 for (
auto I = CS.
begin(),
E = CS.
end(); I !=
E; ++I) {
14189 bool AllowTypoCorrection,
14190 bool CalleesAddressIsTaken) {
14192 Fn->getExprLoc(), CalleesAddressIsTaken
14197 if (buildOverloadedCallSet(S, Fn, ULE, Args, LParenLoc, &CandidateSet,
14203 if (CalleesAddressIsTaken)
14217 if (
const auto *TP =
14221 VK_PRValue, RParenLoc, CurFPFeatureOverrides());
14227 ExecConfig, &CandidateSet, &Best,
14228 OverloadResult, AllowTypoCorrection);
14237 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
14243 bool HadMultipleCandidates) {
14248 Exp = InitializeExplicitObjectArgument(*
this,
E, Method);
14250 Exp = PerformImplicitObjectArgumentInitialization(
E,
nullptr,
14251 FoundDecl, Method);
14260 auto *CE = dyn_cast<CastExpr>(SubE);
14261 if (CE && CE->getCastKind() == CK_NoOp)
14262 SubE = CE->getSubExpr();
14264 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
14265 SubE = BE->getSubExpr();
14266 if (isa<LambdaExpr>(SubE)) {
14272 PushExpressionEvaluationContext(
14273 ExpressionEvaluationContext::PotentiallyEvaluated);
14274 ExprResult BlockExp = BuildBlockForLambdaConversion(
14276 PopExpressionEvaluationContext();
14294 Expr *ObjectParam = Exp.
get();
14297 CurFPFeatureOverrides());
14307 Exp.
get()->getEndLoc(),
14308 CurFPFeatureOverrides());
14311 if (CheckFunctionCall(Method, CE,
14321 Expr *Input,
bool PerformADL) {
14323 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
14331 Expr *Args[2] = { Input,
nullptr };
14332 unsigned NumArgs = 1;
14337 if (Opc == UO_PostInc || Opc == UO_PostDec) {
14351 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
14357 CurFPFeatureOverrides());
14362 if (Fn.isInvalid())
14366 CurFPFeatureOverrides());
14373 AddNonMemberOperatorCandidates(Fns, ArgsArray, CandidateSet);
14376 AddMemberOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet);
14380 AddArgumentDependentLookupCandidates(OpName, OpLoc, ArgsArray,
14386 AddBuiltinOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet);
14388 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
14403 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FnDecl)) {
14404 CheckMemberOperatorAccess(OpLoc, Input,
nullptr, Best->FoundDecl);
14408 InputInit = InitializeExplicitObjectArgument(*
this, Input, Method);
14410 InputInit = PerformImplicitObjectArgumentInitialization(
14411 Input,
nullptr, Best->FoundDecl, Method);
14414 Base = Input = InputInit.
get();
14425 Input = InputInit.
get();
14430 Base, HadMultipleCandidates,
14442 Context, Op, FnExpr.
get(), ArgsArray, ResultTy, VK, OpLoc,
14443 CurFPFeatureOverrides(),
14446 if (CheckCallReturnType(FnDecl->
getReturnType(), OpLoc, TheCall, FnDecl))
14449 if (CheckFunctionCall(FnDecl, TheCall,
14452 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), FnDecl);
14457 ExprResult InputRes = PerformImplicitConversion(
14458 Input, Best->BuiltinParamTypes[0], Best->Conversions[0],
14463 Input = InputRes.
get();
14483 PDiag(diag::err_ovl_ambiguous_oper_unary)
14500 << (Msg !=
nullptr)
14501 << (Msg ? Msg->
getString() : StringRef())
14512 return CreateBuiltinUnaryOp(OpLoc, Opc, Input);
14528 AddNonMemberOperatorCandidates(Fns, Args, CandidateSet);
14531 AddMemberOperatorCandidates(Op, OpLoc, Args, CandidateSet);
14533 AddMemberOperatorCandidates(Op, OpLoc, {Args[1], Args[0]}, CandidateSet,
14538 AddMemberOperatorCandidates(ExtraOp, OpLoc, Args, CandidateSet);
14540 AddMemberOperatorCandidates(ExtraOp, OpLoc, {Args[1], Args[0]},
14548 if (Op != OO_Equal && PerformADL) {
14550 AddArgumentDependentLookupCandidates(OpName, OpLoc, Args,
14556 AddArgumentDependentLookupCandidates(ExtraOpName, OpLoc, Args,
14575 AddBuiltinOperatorCandidates(Op, OpLoc, Args, CandidateSet);
14581 Expr *RHS,
bool PerformADL,
14582 bool AllowRewrittenCandidates,
14584 Expr *Args[2] = { LHS, RHS };
14588 AllowRewrittenCandidates =
false;
14594 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
14615 if (Fn.isInvalid())
14619 CurFPFeatureOverrides());
14624 if (Opc == BO_PtrMemD) {
14625 auto CheckPlaceholder = [&](
Expr *&Arg) {
14634 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
14636 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
14655 if (Opc == BO_Assign && !Args[0]->getType()->isOverloadableType())
14656 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
14661 Op, OpLoc, AllowRewrittenCandidates));
14663 CandidateSet.
exclude(DefaultedFn);
14664 LookupOverloadedBinOp(CandidateSet, Op, Fns, Args, PerformADL);
14666 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
14675 bool IsReversed = Best->isReversed();
14677 std::swap(Args[0], Args[1]);
14694 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
14698 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
14699 : diag::err_ovl_rewrite_equalequal_not_bool)
14707 if (AllowRewrittenCandidates && !IsReversed &&
14715 if (Cand.Viable && Cand.Function && Cand.isReversed() &&
14717 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
14719 *
this, OpLoc, Cand.Conversions[ArgIdx],
14720 Best->Conversions[ArgIdx]) ==
14722 AmbiguousWith.push_back(Cand.Function);
14729 if (!AmbiguousWith.empty()) {
14730 bool AmbiguousWithSelf =
14731 AmbiguousWith.size() == 1 &&
14733 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
14735 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
14737 if (AmbiguousWithSelf) {
14739 diag::note_ovl_ambiguous_oper_binary_reversed_self);
14744 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
14745 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
14747 !MD->hasCXXExplicitFunctionObjectParameter() &&
14749 MD->getFunctionObjectParameterType(),
14750 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
14752 MD->getFunctionObjectParameterType(),
14755 MD->getFunctionObjectParameterType(),
14758 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
14761 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
14762 for (
auto *F : AmbiguousWith)
14763 Diag(F->getLocation(),
14764 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
14772 if (Op == OO_Equal)
14773 diagnoseNullableToNonnullConversion(Args[0]->getType(),
14774 Args[1]->getType(), OpLoc);
14777 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FnDecl)) {
14779 CheckMemberOperatorAccess(OpLoc, Args[0], Args[1], Best->FoundDecl);
14784 Arg0 = InitializeExplicitObjectArgument(*
this, Args[0], FnDecl);
14787 Arg0 = PerformImplicitObjectArgumentInitialization(
14788 Args[0],
nullptr, Best->FoundDecl, Method);
14790 Arg1 = PerformCopyInitialization(
14801 ExprResult Arg0 = PerformCopyInitialization(
14809 PerformCopyInitialization(
14821 Best->FoundDecl,
Base,
14822 HadMultipleCandidates, OpLoc);
14833 const Expr *ImplicitThis =
nullptr;
14838 Context, ChosenOp, FnExpr.
get(), Args, ResultTy, VK, OpLoc,
14839 CurFPFeatureOverrides(),
14842 if (
const auto *Method = dyn_cast<CXXMethodDecl>(FnDecl);
14845 ImplicitThis = ArgsArray[0];
14846 ArgsArray = ArgsArray.slice(1);
14849 if (CheckCallReturnType(FnDecl->
getReturnType(), OpLoc, TheCall,
14853 if (Op == OO_Equal) {
14855 DiagnoseSelfMove(Args[0], Args[1], OpLoc);
14858 *
this,
AssignedEntity{Args[0], dyn_cast<CXXMethodDecl>(FnDecl)},
14861 if (ImplicitThis) {
14864 cast<CXXMethodDecl>(FnDecl)->getFunctionObjectParameterType());
14866 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
14870 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
14872 VariadicDoesNotApply);
14874 ExprResult R = MaybeBindToTemporary(TheCall);
14878 R = CheckForImmediateInvocation(R, FnDecl);
14885 (Op == OO_Spaceship && IsReversed)) {
14886 if (Op == OO_ExclaimEqual) {
14887 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
14888 R = CreateBuiltinUnaryOp(OpLoc, UO_LNot, R.
get());
14890 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
14892 Expr *ZeroLiteral =
14897 Ctx.Entity = FnDecl;
14898 pushCodeSynthesisContext(Ctx);
14900 R = CreateOverloadedBinOp(
14901 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.
get(),
14902 IsReversed ? R.
get() : ZeroLiteral,
true,
14905 popCodeSynthesisContext();
14910 assert(ChosenOp == Op &&
"unexpected operator name");
14914 if (Best->RewriteKind !=
CRK_None)
14922 ExprResult ArgsRes0 = PerformImplicitConversion(
14923 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
14928 Args[0] = ArgsRes0.
get();
14930 ExprResult ArgsRes1 = PerformImplicitConversion(
14931 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
14936 Args[1] = ArgsRes1.
get();
14946 if (Opc == BO_Comma)
14951 if (DefaultedFn && Opc == BO_Cmp) {
14952 ExprResult E = BuildSynthesizedThreeWayComparison(OpLoc, Fns, Args[0],
14953 Args[1], DefaultedFn);
14954 if (
E.isInvalid() ||
E.isUsable())