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 or TTP matching");
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)
6224 bool IsTemplateArgument =
6227 assert(IsTemplateArgument &&
6228 "unexpected class type converted constant expr");
6231 T, cast<NonTypeTemplateParmDecl>(Dest)),
6244 IsTemplateArgument);
6249 bool ReturnPreNarrowingValue =
false;
6252 PreNarrowingType)) {
6262 PreNarrowingValue.
isInt()) {
6265 ReturnPreNarrowingValue =
true;
6285 << CCE << 0 << From->
getType() <<
T;
6288 if (!ReturnPreNarrowingValue)
6289 PreNarrowingValue = {};
6306 if (
Result.isInvalid() ||
Result.get()->isValueDependent()) {
6311 RequireInt, PreNarrowingValue);
6318 return ::BuildConvertedConstantExpression(*
this, From,
T, CCE, Dest,
6325 return ::CheckConvertedConstantExpression(*
this, From,
T,
Value, CCE,
false,
6330 llvm::APSInt &
Value,
6337 if (!R.isInvalid() && !R.get()->isValueDependent())
6345 const APValue &PreNarrowingValue) {
6357 Kind = ConstantExprKind::ClassTemplateArgument;
6359 Kind = ConstantExprKind::NonClassTemplateArgument;
6361 Kind = ConstantExprKind::Normal;
6364 (RequireInt && !Eval.
Val.
isInt())) {
6371 if (Notes.empty()) {
6374 if (
const auto *CE = dyn_cast<ConstantExpr>(
E)) {
6378 "ConstantExpr has no value associated with it");
6384 Value = std::move(PreNarrowingValue);
6390 if (Notes.size() == 1 &&
6391 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6392 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6393 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6394 diag::note_constexpr_invalid_template_arg) {
6395 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6396 for (
unsigned I = 0; I < Notes.size(); ++I)
6397 Diag(Notes[I].first, Notes[I].second);
6401 for (
unsigned I = 0; I < Notes.size(); ++I)
6402 Diag(Notes[I].first, Notes[I].second);
6429 AllowedExplicit::Conversions,
6463 return PerformImplicitConversion(From, Ty, ICS,
6470 assert((isa<UnresolvedMemberExpr, MemberExpr>(MemExprE)) &&
6471 "expected a member expression");
6473 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6474 M && !M->isImplicitAccess())
6475 Base = M->getBase();
6476 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6477 M && !M->isImplicitAccess())
6478 Base = M->getBase();
6512 "Method is not an explicit member function");
6513 assert(NewArgs.empty() &&
"NewArgs should be empty");
6515 NewArgs.reserve(Args.size() + 1);
6517 NewArgs.push_back(This);
6518 NewArgs.append(Args.begin(), Args.end());
6521 Method, Object->getBeginLoc());
6540 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6542 cast<CXXConversionDecl>(ViableConversions[I]->getUnderlyingDecl());
6554 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6557 cast<CXXConversionDecl>(
Found->getUnderlyingDecl());
6562 std::string TypeStr;
6567 "static_cast<" + TypeStr +
">(")
6579 HadMultipleCandidates);
6586 From,
Result.get()->getType());
6599 cast<CXXConversionDecl>(
Found->getUnderlyingDecl());
6612 HadMultipleCandidates);
6617 CK_UserDefinedConversion,
Result.get(),
6618 nullptr,
Result.get()->getValueKind(),
6640 if (isa<UsingShadowDecl>(
D))
6641 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
6643 if (
auto *ConvTemplate = dyn_cast<FunctionTemplateDecl>(
D)) {
6645 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
6651 Conv, FoundDecl, ActingContext, From, ToType, CandidateSet,
6682 ExprResult result = CheckPlaceholderExpr(From);
6685 From = result.
get();
6689 ExprResult Converted = DefaultLvalueConversion(From);
6700 if (!RecordTy || !getLangOpts().CPlusPlus) {
6712 : Converter(Converter), From(From) {}
6717 } IncompleteDiagnoser(Converter, From);
6720 : RequireCompleteType(
Loc,
T, IncompleteDiagnoser))
6727 const auto &Conversions =
6728 cast<CXXRecordDecl>(RecordTy->
getDecl())->getVisibleConversionFunctions();
6730 bool HadMultipleCandidates =
6731 (std::distance(Conversions.begin(), Conversions.end()) > 1);
6735 bool HasUniqueTargetType =
true;
6738 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
6748 Conversion = cast<CXXConversionDecl>(
D);
6750 assert((!ConvTemplate || getLangOpts().
CPlusPlus14) &&
6751 "Conversion operator templates are considered potentially "
6755 if (Converter.
match(CurToType) || ConvTemplate) {
6761 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
6766 else if (HasUniqueTargetType &&
6768 HasUniqueTargetType =
false;
6770 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
6788 HadMultipleCandidates,
6789 ExplicitConversions))
6795 if (!HasUniqueTargetType)
6814 HadMultipleCandidates,
Found))
6823 HadMultipleCandidates,
6824 ExplicitConversions))
6832 switch (ViableConversions.
size()) {
6835 HadMultipleCandidates,
6836 ExplicitConversions))
6846 HadMultipleCandidates,
Found))
6877 if (Proto->getNumParams() < 1)
6881 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
6886 if (Proto->getNumParams() < 2)
6890 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
6910 unsigned SeenAt = 0;
6912 bool HasDefault =
false;
6921 return HasDefault || SeenAt != 0;
6927 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
6930 bool HasMatchedPackOnParmToNonPackOnArg) {
6933 assert(Proto &&
"Functions without a prototype cannot be overloaded");
6934 assert(!
Function->getDescribedFunctionTemplate() &&
6935 "Use AddTemplateOverloadCandidate for function templates");
6938 if (!isa<CXXConstructorDecl>(Method)) {
6948 CandidateSet, SuppressUserConversions,
6949 PartialOverloading, EarlyConversions, PO,
6950 HasMatchedPackOnParmToNonPackOnArg);
6964 if (Constructor && Constructor->isDefaulted() && Constructor->isDeleted() &&
6965 Constructor->isMoveConstructor())
6985 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
6994 HasMatchedPackOnParmToNonPackOnArg;
7000 Candidate.
Viable =
false;
7006 if (getLangOpts().CPlusPlusModules &&
Function->isInAnotherModuleUnit()) {
7013 bool IsImplicitlyInstantiated =
false;
7014 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo()) {
7015 ND = SpecInfo->getTemplate();
7016 IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() ==
7027 const bool IsInlineFunctionInGMF =
7029 (IsImplicitlyInstantiated ||
Function->isInlined());
7032 Candidate.
Viable =
false;
7039 Candidate.
Viable =
false;
7049 if (Args.size() == 1 && Constructor->isSpecializationCopyingObject() &&
7051 IsDerivedFrom(Args[0]->getBeginLoc(), Args[0]->getType(),
7053 Candidate.
Viable =
false;
7065 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.getDecl());
7066 if (Shadow && Args.size() == 1 && Constructor->getNumParams() >= 1 &&
7067 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
7068 QualType P = Constructor->getParamDecl(0)->getType()->getPointeeType();
7074 Candidate.
Viable =
false;
7083 Constructor->getMethodQualifiers().getAddressSpace(),
7084 CandidateSet.
getDestAS(), getASTContext())) {
7085 Candidate.
Viable =
false;
7098 Candidate.
Viable =
false;
7108 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7109 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7110 !PartialOverloading) {
7112 Candidate.
Viable =
false;
7118 if (getLangOpts().
CUDA) {
7126 Candidate.
Viable =
false;
7132 if (
Function->getTrailingRequiresClause()) {
7134 if (CheckFunctionConstraints(
Function, Satisfaction, {},
7137 Candidate.
Viable =
false;
7145 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7148 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7151 }
else if (ArgIdx < NumParams) {
7162 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7165 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7167 Candidate.
Viable =
false;
7179 if (EnableIfAttr *FailedAttr =
7181 Candidate.
Viable =
false;
7191 if (Methods.size() <= 1)
7194 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7202 if (Args.size() < NumNamedArgs)
7205 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7207 if (Args[i]->isTypeDependent()) {
7213 Expr *argExpr = Args[i];
7214 assert(argExpr &&
"SelectBestMethod(): missing expression");
7219 !param->
hasAttr<CFConsumedAttr>())
7220 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7233 getLangOpts().ObjCAutoRefCount,
7237 if (ConversionState.
isBad() ||
7247 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7248 if (Args[i]->isTypeDependent()) {
7252 ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod,
7261 if (Args.size() != NumNamedArgs)
7263 else if (Match && NumNamedArgs == 0 && Methods.size() > 1) {
7266 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7267 QualType ReturnT = Methods[
b]->getReturnType();
7286 assert(!isa<CXXConstructorDecl>(Method) &&
7287 "Shouldn't have `this` for ctors!");
7288 assert(!Method->
isStatic() &&
"Shouldn't have `this` for static methods!");
7290 ThisArg,
nullptr, Method, Method);
7293 ConvertedThis = R.
get();
7295 if (
auto *MD = dyn_cast<CXXMethodDecl>(
Function)) {
7297 assert((MissingImplicitThis || MD->isStatic() ||
7298 isa<CXXConstructorDecl>(MD)) &&
7299 "Expected `this` for non-ctor instance methods");
7301 ConvertedThis =
nullptr;
7306 unsigned ArgSizeNoVarargs = std::min(
Function->param_size(), Args.size());
7309 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7318 ConvertedArgs.push_back(R.
get());
7326 for (
unsigned i = Args.size(), e =
Function->getNumParams(); i != e; ++i) {
7328 if (!
P->hasDefaultArg())
7333 ConvertedArgs.push_back(R.
get());
7345 bool MissingImplicitThis) {
7346 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7347 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7353 Expr *DiscardedThis;
7355 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7356 true, DiscardedThis, ConvertedArgs))
7357 return *EnableIfAttrs.begin();
7359 for (
auto *EIA : EnableIfAttrs) {
7363 if (EIA->getCond()->isValueDependent() ||
7364 !EIA->getCond()->EvaluateWithSubstitution(
7368 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7374template <
typename CheckFn>
7377 CheckFn &&IsSuccessful) {
7380 if (ArgDependent == DIA->getArgDependent())
7381 Attrs.push_back(DIA);
7388 auto WarningBegin = std::stable_partition(
7389 Attrs.begin(), Attrs.end(), [](
const DiagnoseIfAttr *DIA) {
7390 return DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_error &&
7391 DIA->getWarningGroup().empty();
7396 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7398 if (ErrAttr != WarningBegin) {
7399 const DiagnoseIfAttr *DIA = *ErrAttr;
7400 S.
Diag(
Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7401 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7402 << DIA->getParent() << DIA->getCond()->getSourceRange();
7406 auto ToSeverity = [](DiagnoseIfAttr::DefaultSeverity Sev) {
7408 case DiagnoseIfAttr::DS_warning:
7410 case DiagnoseIfAttr::DS_error:
7413 llvm_unreachable(
"Fully covered switch above!");
7416 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7417 if (IsSuccessful(DIA)) {
7418 if (DIA->getWarningGroup().empty() &&
7419 DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_warning) {
7420 S.
Diag(
Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7421 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7422 << DIA->getParent() << DIA->getCond()->getSourceRange();
7425 DIA->getWarningGroup());
7428 {ToSeverity(DIA->getDefaultSeverity()),
"%0",
7430 S.
Diag(
Loc, DiagID) << DIA->getMessage();
7438 const Expr *ThisArg,
7443 [&](
const DiagnoseIfAttr *DIA) {
7448 if (!DIA->getCond()->EvaluateWithSubstitution(
7449 Result, Context, cast<FunctionDecl>(DIA->getParent()), Args, ThisArg))
7451 return Result.isInt() &&
Result.getInt().getBoolValue();
7458 *
this, ND,
false,
Loc,
7459 [&](
const DiagnoseIfAttr *DIA) {
7470 bool SuppressUserConversions,
7471 bool PartialOverloading,
7472 bool FirstArgumentIsBase) {
7474 NamedDecl *
D = F.getDecl()->getUnderlyingDecl();
7481 if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic()) {
7484 if (Args.size() > 0) {
7485 if (
Expr *
E = Args[0]) {
7493 ObjectClassification =
E->
Classify(Context);
7495 FunctionArgs = Args.slice(1);
7498 AddMethodTemplateCandidate(
7499 FunTmpl, F.getPair(),
7501 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7502 FunctionArgs, CandidateSet, SuppressUserConversions,
7503 PartialOverloading);
7505 AddMethodCandidate(cast<CXXMethodDecl>(FD), F.getPair(),
7506 cast<CXXMethodDecl>(FD)->getParent(), ObjectType,
7507 ObjectClassification, FunctionArgs, CandidateSet,
7508 SuppressUserConversions, PartialOverloading);
7515 if (Args.size() > 0 &&
7516 (!Args[0] || (FirstArgumentIsBase && isa<CXXMethodDecl>(FD) &&
7517 !isa<CXXConstructorDecl>(FD)))) {
7518 assert(cast<CXXMethodDecl>(FD)->isStatic());
7519 FunctionArgs = Args.slice(1);
7522 AddTemplateOverloadCandidate(FunTmpl, F.getPair(),
7523 ExplicitTemplateArgs, FunctionArgs,
7524 CandidateSet, SuppressUserConversions,
7525 PartialOverloading);
7527 AddOverloadCandidate(FD, F.getPair(), FunctionArgs, CandidateSet,
7528 SuppressUserConversions, PartialOverloading);
7538 bool SuppressUserConversions,
7543 if (isa<UsingShadowDecl>(
Decl))
7544 Decl = cast<UsingShadowDecl>(
Decl)->getTargetDecl();
7547 assert(isa<CXXMethodDecl>(TD->getTemplatedDecl()) &&
7548 "Expected a member function template");
7549 AddMethodTemplateCandidate(TD, FoundDecl, ActingContext,
7550 nullptr, ObjectType,
7551 ObjectClassification, Args, CandidateSet,
7552 SuppressUserConversions,
false, PO);
7554 AddMethodCandidate(cast<CXXMethodDecl>(
Decl), FoundDecl, ActingContext,
7555 ObjectType, ObjectClassification, Args, CandidateSet,
7556 SuppressUserConversions,
false, {}, PO);
7569 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7570 assert(!isa<CXXConstructorDecl>(Method) &&
7571 "Use AddOverloadCandidate for constructors");
7589 CandidateSet.
addCandidate(Args.size() + 1, EarlyConversions);
7598 HasMatchedPackOnParmToNonPackOnArg;
7600 bool IgnoreExplicitObject =
7604 bool ImplicitObjectMethodTreatedAsStatic =
7609 unsigned ExplicitOffset =
7612 unsigned NumParams = Method->
getNumParams() - ExplicitOffset +
7613 int(ImplicitObjectMethodTreatedAsStatic);
7621 Candidate.
Viable =
false;
7633 int(ImplicitObjectMethodTreatedAsStatic);
7635 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
7637 Candidate.
Viable =
false;
7657 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
7662 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
7663 Method, ActingContext,
true);
7664 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
7665 Candidate.
Viable =
false;
7672 if (getLangOpts().
CUDA)
7673 if (!
CUDA().IsAllowedCall(getCurFunctionDecl(
true),
7675 Candidate.
Viable =
false;
7682 if (CheckFunctionConstraints(Method, Satisfaction, {},
7685 Candidate.
Viable =
false;
7693 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7696 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7699 }
else if (ArgIdx < NumParams) {
7705 if (ImplicitObjectMethodTreatedAsStatic) {
7706 ParamType = ArgIdx == 0
7710 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
7714 SuppressUserConversions,
7717 getLangOpts().ObjCAutoRefCount);
7719 Candidate.
Viable =
false;
7731 if (EnableIfAttr *FailedAttr =
7732 CheckEnableIf(Method, CandidateSet.
getLocation(), Args,
true)) {
7733 Candidate.
Viable =
false;
7740 Candidate.
Viable =
false;
7769 PartialOverloading,
false,
7770 false, ObjectType, ObjectClassification,
7772 return CheckNonDependentConversions(
7773 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
7774 SuppressUserConversions, ActingContext, ObjectType,
7775 ObjectClassification, PO);
7779 CandidateSet.
addCandidate(Conversions.size(), Conversions);
7782 Candidate.
Viable =
false;
7787 cast<CXXMethodDecl>(Candidate.
Function)->isStatic() ||
7802 assert(
Specialization &&
"Missing member function template specialization?");
7804 "Specialization is not a member function?");
7805 AddMethodCandidate(cast<CXXMethodDecl>(
Specialization), FoundDecl,
7806 ActingContext, ObjectType, ObjectClassification, Args,
7807 CandidateSet, SuppressUserConversions, PartialOverloading,
7822 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
7834 Candidate.
Viable =
false;
7853 FunctionTemplate, ExplicitTemplateArgs, Args,
Specialization, Info,
7854 PartialOverloading, AggregateCandidateDeduction,
7859 return CheckNonDependentConversions(
7860 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
7861 SuppressUserConversions,
nullptr,
QualType(), {}, PO);
7865 CandidateSet.
addCandidate(Conversions.size(), Conversions);
7868 Candidate.
Viable =
false;
7876 isa<CXXMethodDecl>(Candidate.
Function) &&
7877 !isa<CXXConstructorDecl>(Candidate.
Function);
7891 assert(
Specialization &&
"Missing function template specialization?");
7892 AddOverloadCandidate(
7893 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
7894 PartialOverloading, AllowExplicit,
7895 false, IsADLCandidate, Conversions, PO,
7909 const bool AllowExplicit =
false;
7912 auto *Method = dyn_cast<CXXMethodDecl>(FD);
7913 bool HasThisConversion = Method && !isa<CXXConstructorDecl>(Method);
7914 unsigned ThisConversions = HasThisConversion ? 1 : 0;
7926 if (HasThisConversion && !cast<CXXMethodDecl>(FD)->isStatic() &&
7929 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
7930 !ParamTypes[0]->isDependentType()) {
7932 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
7933 Method, ActingContext,
true,
7934 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
7936 if (Conversions[ConvIdx].isBad())
7944 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
7946 QualType ParamType = ParamTypes[I + Offset];
7950 ConvIdx = Args.size() - 1 - I;
7951 assert(Args.size() + ThisConversions == 2 &&
7952 "number of args (including 'this') must be exactly 2 for "
7956 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
7959 ConvIdx = ThisConversions + I;
7961 Conversions[ConvIdx]
7963 SuppressUserConversions,
7966 getLangOpts().ObjCAutoRefCount,
7968 if (Conversions[ConvIdx].isBad())
7990 bool AllowObjCPointerConversion) {
7998 bool ObjCLifetimeConversion;
8000 ObjCLifetimeConversion))
8005 if (!AllowObjCPointerConversion)
8009 bool IncompatibleObjC =
false;
8019 bool AllowExplicit,
bool AllowResultConversion,
8020 bool HasMatchedPackOnParmToNonPackOnArg) {
8022 "Conversion function templates use AddTemplateConversionCandidate");
8030 if (DeduceReturnType(Conversion, From->
getExprLoc()))
8037 if (!AllowResultConversion &&
8049 AllowObjCConversionOnExplicit))
8066 HasMatchedPackOnParmToNonPackOnArg;
8071 if (!AllowExplicit && Conversion->
isExplicit()) {
8072 Candidate.
Viable =
false;
8087 const auto *ConversionContext =
8096 From->
Classify(Context), Conversion, ConversionContext,
8101 Candidate.
Viable =
false;
8108 if (CheckFunctionConstraints(Conversion, Satisfaction) ||
8110 Candidate.
Viable =
false;
8122 if (FromCanon == ToCanon ||
8123 IsDerivedFrom(CandidateSet.
getLocation(), FromCanon, ToCanon)) {
8124 Candidate.
Viable =
false;
8141 CK_FunctionToPointerDecay, &ConversionRef,
8145 if (!isCompleteType(From->
getBeginLoc(), ConversionType)) {
8146 Candidate.
Viable =
false;
8160 Buffer, &ConversionFn, CallResultType, VK, From->
getBeginLoc());
8178 Candidate.
Viable =
false;
8190 Candidate.
Viable =
false;
8197 Candidate.
Viable =
false;
8203 "Can only end up with a standard conversion sequence or failure");
8206 if (EnableIfAttr *FailedAttr =
8207 CheckEnableIf(Conversion, CandidateSet.
getLocation(), {})) {
8208 Candidate.
Viable =
false;
8215 Candidate.
Viable =
false;
8224 bool AllowExplicit,
bool AllowResultConversion) {
8226 "Only conversion function templates permitted here");
8238 Candidate.
Viable =
false;
8249 FunctionTemplate, ObjectType, ObjectClassification, ToType,
8255 Candidate.
Viable =
false;
8265 assert(
Specialization &&
"Missing function template specialization?");
8266 AddConversionCandidate(
Specialization, FoundDecl, ActingDC, From, ToType,
8267 CandidateSet, AllowObjCConversionOnExplicit,
8268 AllowExplicit, AllowResultConversion,
8304 *
this, CandidateSet.
getLocation(), Object->getType(),
8305 Object->Classify(Context), Conversion, ActingContext);
8308 if (ObjectInit.
isBad()) {
8309 Candidate.
Viable =
false;
8320 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8321 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8322 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8323 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8326 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8334 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8335 Candidate.
Viable =
false;
8342 if (Args.size() < NumParams) {
8344 Candidate.
Viable =
false;
8351 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8352 if (ArgIdx < NumParams) {
8363 getLangOpts().ObjCAutoRefCount);
8365 Candidate.
Viable =
false;
8379 if (CheckFunctionConstraints(Conversion, Satisfaction, {},
8382 Candidate.
Viable =
false;
8388 if (EnableIfAttr *FailedAttr =
8389 CheckEnableIf(Conversion, CandidateSet.
getLocation(), {})) {
8390 Candidate.
Viable =
false;
8402 NamedDecl *
D = F.getDecl()->getUnderlyingDecl();
8413 assert(!isa<CXXMethodDecl>(FD) &&
8414 "unqualified operator lookup found a member function");
8417 AddTemplateOverloadCandidate(FunTmpl, F.getPair(), ExplicitTemplateArgs,
8418 FunctionArgs, CandidateSet);
8420 AddTemplateOverloadCandidate(
8421 FunTmpl, F.getPair(), ExplicitTemplateArgs,
8422 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
false,
false,
8425 if (ExplicitTemplateArgs)
8427 AddOverloadCandidate(FD, F.getPair(), FunctionArgs, CandidateSet);
8429 AddOverloadCandidate(FD, F.getPair(),
8430 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
8431 false,
false,
true,
false, ADLCallKind::NotADL, {},
8460 if (!isCompleteType(OpLoc, T1) && !T1Rec->isBeingDefined())
8463 if (!T1Rec->getDecl()->getDefinition())
8466 LookupResult Operators(*
this, OpName, OpLoc, LookupOrdinaryName);
8467 LookupQualifiedName(Operators, T1Rec->getDecl());
8471 OperEnd = Operators.
end();
8472 Oper != OperEnd; ++Oper) {
8473 if (Oper->getAsFunction() &&
8476 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
8478 AddMethodCandidate(Oper.getPair(), Args[0]->getType(),
8479 Args[0]->Classify(Context), Args.slice(1),
8480 CandidateSet,
false, PO);
8487 bool IsAssignmentOperator,
8488 unsigned NumContextualBoolArguments) {
8503 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8516 if (ArgIdx < NumContextualBoolArguments) {
8517 assert(ParamTys[ArgIdx] == Context.
BoolTy &&
8518 "Contextual conversion to bool requires bool type");
8524 ArgIdx == 0 && IsAssignmentOperator,
8527 getLangOpts().ObjCAutoRefCount);
8530 Candidate.
Viable =
false;
8543class BuiltinCandidateTypeSet {
8549 TypeSet PointerTypes;
8553 TypeSet MemberPointerTypes;
8557 TypeSet EnumerationTypes;
8561 TypeSet VectorTypes;
8565 TypeSet MatrixTypes;
8568 TypeSet BitIntTypes;
8571 bool HasNonRecordTypes;
8575 bool HasArithmeticOrEnumeralTypes;
8579 bool HasNullPtrType;
8588 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
8590 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
8594 typedef TypeSet::iterator iterator;
8596 BuiltinCandidateTypeSet(
Sema &SemaRef)
8597 : HasNonRecordTypes(
false),
8598 HasArithmeticOrEnumeralTypes(
false),
8599 HasNullPtrType(
false),
8601 Context(SemaRef.Context) { }
8603 void AddTypesConvertedFrom(
QualType Ty,
8605 bool AllowUserConversions,
8606 bool AllowExplicitConversions,
8607 const Qualifiers &VisibleTypeConversionsQuals);
8609 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
8610 llvm::iterator_range<iterator> member_pointer_types() {
8611 return MemberPointerTypes;
8613 llvm::iterator_range<iterator> enumeration_types() {
8614 return EnumerationTypes;
8616 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
8617 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
8618 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
8620 bool containsMatrixType(
QualType Ty)
const {
return MatrixTypes.count(Ty); }
8621 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
8622 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
8623 bool hasNullPtrType()
const {
return HasNullPtrType; }
8638BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
8642 if (!PointerTypes.insert(Ty))
8647 bool buildObjCPtr =
false;
8651 buildObjCPtr =
true;
8663 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
8669 if ((CVR | BaseCVR) != CVR)
continue;
8691 PointerTypes.insert(QPointerTy);
8707BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
8710 if (!MemberPointerTypes.insert(Ty))
8714 assert(PointerTy &&
"type was not a member pointer type!");
8729 if ((CVR | BaseCVR) != CVR)
continue;
8732 MemberPointerTypes.insert(
8748BuiltinCandidateTypeSet::AddTypesConvertedFrom(
QualType Ty,
8750 bool AllowUserConversions,
8751 bool AllowExplicitConversions,
8763 Ty = SemaRef.Context.getArrayDecayedType(Ty);
8770 HasNonRecordTypes = HasNonRecordTypes || !TyRec;
8773 HasArithmeticOrEnumeralTypes =
8777 PointerTypes.insert(Ty);
8781 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
8785 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
8788 HasArithmeticOrEnumeralTypes =
true;
8789 EnumerationTypes.insert(Ty);
8791 HasArithmeticOrEnumeralTypes =
true;
8792 BitIntTypes.insert(Ty);
8796 HasArithmeticOrEnumeralTypes =
true;
8797 VectorTypes.insert(Ty);
8801 HasArithmeticOrEnumeralTypes =
true;
8802 MatrixTypes.insert(Ty);
8804 HasNullPtrType =
true;
8805 }
else if (AllowUserConversions && TyRec) {
8807 if (!SemaRef.isCompleteType(Loc, Ty))
8812 if (isa<UsingShadowDecl>(
D))
8813 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
8817 if (isa<FunctionTemplateDecl>(
D))
8821 if (AllowExplicitConversions || !Conv->
isExplicit()) {
8884 if (isa<UsingShadowDecl>(
D))
8885 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
8919 if (Available.hasAtomic()) {
8920 Available.removeAtomic();
8927 if (Available.hasVolatile()) {
8928 Available.removeVolatile();
8962class BuiltinOperatorOverloadBuilder {
8967 bool HasArithmeticOrEnumeralCandidateType;
8971 static constexpr int ArithmeticTypesCap = 26;
8977 unsigned FirstIntegralType,
8979 unsigned FirstPromotedIntegralType,
8980 LastPromotedIntegralType;
8981 unsigned FirstPromotedArithmeticType,
8982 LastPromotedArithmeticType;
8983 unsigned NumArithmeticTypes;
8985 void InitArithmeticTypes() {
8987 FirstPromotedArithmeticType = 0;
8997 FirstIntegralType = ArithmeticTypes.size();
8998 FirstPromotedIntegralType = ArithmeticTypes.size();
9021 llvm::for_each(CandidateTypes, [&BitIntCandidates](
9022 BuiltinCandidateTypeSet &Candidate) {
9023 for (
QualType BitTy : Candidate.bitint_types())
9026 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
9027 LastPromotedIntegralType = ArithmeticTypes.size();
9028 LastPromotedArithmeticType = ArithmeticTypes.size();
9042 LastIntegralType = ArithmeticTypes.size();
9043 NumArithmeticTypes = ArithmeticTypes.size();
9050 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
9051 ArithmeticTypesCap &&
9052 "Enough inline storage for all arithmetic types.");
9057 void addPlusPlusMinusMinusStyleOverloads(
QualType CandidateTy,
9106 BuiltinOperatorOverloadBuilder(
9109 bool HasArithmeticOrEnumeralCandidateType,
9113 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
9114 HasArithmeticOrEnumeralCandidateType(
9115 HasArithmeticOrEnumeralCandidateType),
9116 CandidateTypes(CandidateTypes),
9117 CandidateSet(CandidateSet) {
9119 InitArithmeticTypes();
9142 if (!HasArithmeticOrEnumeralCandidateType)
9145 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9146 const auto TypeOfT = ArithmeticTypes[Arith];
9148 if (Op == OO_MinusMinus)
9150 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9153 addPlusPlusMinusMinusStyleOverloads(
9170 void addPlusPlusMinusMinusPointerOverloads() {
9171 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9173 if (!PtrTy->getPointeeType()->isObjectType())
9176 addPlusPlusMinusMinusStyleOverloads(
9178 (!PtrTy.isVolatileQualified() &&
9180 (!PtrTy.isRestrictQualified() &&
9195 void addUnaryStarPointerOverloads() {
9196 for (
QualType ParamTy : CandidateTypes[0].pointer_types()) {
9202 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9215 void addUnaryPlusOrMinusArithmeticOverloads() {
9216 if (!HasArithmeticOrEnumeralCandidateType)
9219 for (
unsigned Arith = FirstPromotedArithmeticType;
9220 Arith < LastPromotedArithmeticType; ++Arith) {
9221 QualType ArithTy = ArithmeticTypes[Arith];
9226 for (
QualType VecTy : CandidateTypes[0].vector_types())
9235 void addUnaryPlusPointerOverloads() {
9236 for (
QualType ParamTy : CandidateTypes[0].pointer_types())
9245 void addUnaryTildePromotedIntegralOverloads() {
9246 if (!HasArithmeticOrEnumeralCandidateType)
9249 for (
unsigned Int = FirstPromotedIntegralType;
9250 Int < LastPromotedIntegralType; ++
Int) {
9256 for (
QualType VecTy : CandidateTypes[0].vector_types())
9266 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9270 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9271 for (
QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9276 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9280 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9282 if (AddedTypes.insert(NullPtrTy).second) {
9283 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9302 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9315 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9316 UserDefinedBinaryOperators;
9318 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9319 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9321 CEnd = CandidateSet.
end();
9323 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9326 if (
C->Function->isFunctionTemplateSpecialization())
9335 .getUnqualifiedType();
9338 .getUnqualifiedType();
9346 UserDefinedBinaryOperators.insert(
9356 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9357 for (
QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9361 if (IsSpaceship && PtrTy->isFunctionPointerType())
9364 QualType ParamTypes[2] = {PtrTy, PtrTy};
9367 for (
QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9372 if (!AddedTypes.insert(CanonType).second ||
9373 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9376 QualType ParamTypes[2] = {EnumTy, EnumTy};
9403 for (
int Arg = 0; Arg < 2; ++Arg) {
9404 QualType AsymmetricParamTypes[2] = {
9408 for (
QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9413 AsymmetricParamTypes[Arg] = PtrTy;
9414 if (Arg == 0 || Op == OO_Plus) {
9419 if (Op == OO_Minus) {
9424 QualType ParamTypes[2] = {PtrTy, PtrTy};
9460 void addGenericBinaryArithmeticOverloads() {
9461 if (!HasArithmeticOrEnumeralCandidateType)
9464 for (
unsigned Left = FirstPromotedArithmeticType;
9465 Left < LastPromotedArithmeticType; ++
Left) {
9466 for (
unsigned Right = FirstPromotedArithmeticType;
9467 Right < LastPromotedArithmeticType; ++
Right) {
9469 ArithmeticTypes[
Right] };
9476 for (
QualType Vec1Ty : CandidateTypes[0].vector_types())
9477 for (
QualType Vec2Ty : CandidateTypes[1].vector_types()) {
9478 QualType LandR[2] = {Vec1Ty, Vec2Ty};
9488 void addMatrixBinaryArithmeticOverloads() {
9489 if (!HasArithmeticOrEnumeralCandidateType)
9492 for (
QualType M1 : CandidateTypes[0].matrix_types()) {
9493 AddCandidate(M1, cast<MatrixType>(M1)->getElementType());
9494 AddCandidate(M1, M1);
9497 for (
QualType M2 : CandidateTypes[1].matrix_types()) {
9498 AddCandidate(cast<MatrixType>(M2)->getElementType(), M2);
9499 if (!CandidateTypes[0].containsMatrixType(M2))
9500 AddCandidate(M2, M2);
9535 void addThreeWayArithmeticOverloads() {
9536 addGenericBinaryArithmeticOverloads();
9553 void addBinaryBitwiseArithmeticOverloads() {
9554 if (!HasArithmeticOrEnumeralCandidateType)
9557 for (
unsigned Left = FirstPromotedIntegralType;
9558 Left < LastPromotedIntegralType; ++
Left) {
9559 for (
unsigned Right = FirstPromotedIntegralType;
9562 ArithmeticTypes[
Right] };
9575 void addAssignmentMemberPointerOrEnumeralOverloads() {
9579 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
9580 for (
QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9587 for (
QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9612 void addAssignmentPointerOverloads(
bool isEqualOp) {
9616 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9620 else if (!PtrTy->getPointeeType()->isObjectType())
9631 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
9641 if (!PtrTy.isRestrictQualified() &&
9661 for (
QualType PtrTy : CandidateTypes[1].pointer_types()) {
9675 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
9685 if (!PtrTy.isRestrictQualified() &&
9718 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
9719 if (!HasArithmeticOrEnumeralCandidateType)
9722 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
9723 for (
unsigned Right = FirstPromotedArithmeticType;
9724 Right < LastPromotedArithmeticType; ++
Right) {
9726 ParamTypes[1] = ArithmeticTypes[
Right];
9728 S, ArithmeticTypes[Left], Args[0]);
9741 for (
QualType Vec1Ty : CandidateTypes[0].vector_types())
9742 for (
QualType Vec2Ty : CandidateTypes[0].vector_types()) {
9744 ParamTypes[1] = Vec2Ty;
9772 void addAssignmentIntegralOverloads() {
9773 if (!HasArithmeticOrEnumeralCandidateType)
9776 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
9777 for (
unsigned Right = FirstPromotedIntegralType;
9780 ParamTypes[1] = ArithmeticTypes[
Right];
9782 S, ArithmeticTypes[Left], Args[0]);
9801 void addExclaimOverload() {
9807 void addAmpAmpOrPipePipeOverload() {
9824 void addSubscriptOverloads() {
9825 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9835 for (
QualType PtrTy : CandidateTypes[1].pointer_types()) {
9855 void addArrowStarOverloads() {
9856 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9861 if (!isa<RecordType>(C1))
9870 for (
QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
9876 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
9880 T.isVolatileQualified())
9883 T.isRestrictQualified())
9901 void addConditionalOperatorOverloads() {
9905 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
9906 for (
QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9910 QualType ParamTypes[2] = {PtrTy, PtrTy};
9914 for (
QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9918 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9923 for (
QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9930 QualType ParamTypes[2] = {EnumTy, EnumTy};
9949 VisibleTypeConversionsQuals.
addConst();
9950 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9952 if (Args[ArgIdx]->getType()->isAtomicType())
9953 VisibleTypeConversionsQuals.
addAtomic();
9956 bool HasNonRecordCandidateType =
false;
9957 bool HasArithmeticOrEnumeralCandidateType =
false;
9959 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9960 CandidateTypes.emplace_back(*
this);
9961 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->getType(),
9964 (Op == OO_Exclaim ||
9967 VisibleTypeConversionsQuals);
9968 HasNonRecordCandidateType = HasNonRecordCandidateType ||
9969 CandidateTypes[ArgIdx].hasNonRecordTypes();
9970 HasArithmeticOrEnumeralCandidateType =
9971 HasArithmeticOrEnumeralCandidateType ||
9972 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
9980 if (!HasNonRecordCandidateType &&
9981 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
9985 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
9986 VisibleTypeConversionsQuals,
9987 HasArithmeticOrEnumeralCandidateType,
9988 CandidateTypes, CandidateSet);
9994 llvm_unreachable(
"Expected an overloaded operator");
9999 case OO_Array_Delete:
10002 "Special operators don't use AddBuiltinOperatorCandidates");
10014 if (Args.size() == 1)
10015 OpBuilder.addUnaryPlusPointerOverloads();
10019 if (Args.size() == 1) {
10020 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
10022 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
10023 OpBuilder.addGenericBinaryArithmeticOverloads();
10024 OpBuilder.addMatrixBinaryArithmeticOverloads();
10029 if (Args.size() == 1)
10030 OpBuilder.addUnaryStarPointerOverloads();
10032 OpBuilder.addGenericBinaryArithmeticOverloads();
10033 OpBuilder.addMatrixBinaryArithmeticOverloads();
10038 OpBuilder.addGenericBinaryArithmeticOverloads();
10042 case OO_MinusMinus:
10043 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
10044 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
10047 case OO_EqualEqual:
10048 case OO_ExclaimEqual:
10049 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
10050 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10051 OpBuilder.addGenericBinaryArithmeticOverloads();
10057 case OO_GreaterEqual:
10058 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10059 OpBuilder.addGenericBinaryArithmeticOverloads();
10063 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
10064 OpBuilder.addThreeWayArithmeticOverloads();
10071 case OO_GreaterGreater:
10072 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10076 if (Args.size() == 1)
10082 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10086 OpBuilder.addUnaryTildePromotedIntegralOverloads();
10090 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
10094 case OO_MinusEqual:
10095 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
10099 case OO_SlashEqual:
10100 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
10103 case OO_PercentEqual:
10104 case OO_LessLessEqual:
10105 case OO_GreaterGreaterEqual:
10107 case OO_CaretEqual:
10109 OpBuilder.addAssignmentIntegralOverloads();
10113 OpBuilder.addExclaimOverload();
10118 OpBuilder.addAmpAmpOrPipePipeOverload();
10122 if (Args.size() == 2)
10123 OpBuilder.addSubscriptOverloads();
10127 OpBuilder.addArrowStarOverloads();
10130 case OO_Conditional:
10131 OpBuilder.addConditionalOperatorOverloads();
10132 OpBuilder.addGenericBinaryArithmeticOverloads();
10143 bool PartialOverloading) {
10154 ArgumentDependentLookup(Name,
Loc, Args, Fns);
10158 CandEnd = CandidateSet.
end();
10159 Cand != CandEnd; ++Cand)
10160 if (Cand->Function) {
10164 Fns.
erase(FunTmpl);
10173 if (ExplicitTemplateArgs)
10176 AddOverloadCandidate(
10177 FD, FoundDecl, Args, CandidateSet,
false,
10178 PartialOverloading,
true,
10179 false, ADLCallKind::UsesADL);
10181 AddOverloadCandidate(
10182 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10183 false, PartialOverloading,
10188 auto *FTD = cast<FunctionTemplateDecl>(*I);
10189 AddTemplateOverloadCandidate(
10190 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10191 false, PartialOverloading,
10192 true, ADLCallKind::UsesADL);
10194 *
this, Args, FTD->getTemplatedDecl())) {
10195 AddTemplateOverloadCandidate(
10196 FTD, FoundDecl, ExplicitTemplateArgs, {Args[1], Args[0]},
10197 CandidateSet,
false, PartialOverloading,
10198 true, ADLCallKind::UsesADL,
10206enum class Comparison {
Equal, Better, Worse };
10223 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10224 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10225 if (!Cand1Attr || !Cand2Attr) {
10226 if (Cand1Attr == Cand2Attr)
10227 return Comparison::Equal;
10228 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10234 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10235 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10236 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10237 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10242 return Comparison::Worse;
10244 return Comparison::Better;
10249 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10250 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10251 if (Cand1ID != Cand2ID)
10252 return Comparison::Worse;
10255 return Comparison::Equal;
10263 return Comparison::Equal;
10269 return Comparison::Equal;
10270 return Comparison::Worse;
10273 return Comparison::Better;
10279 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10280 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10282 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10283 return Comparison::Equal;
10285 if (Cand1CPUDisp && !Cand2CPUDisp)
10286 return Comparison::Better;
10287 if (Cand2CPUDisp && !Cand1CPUDisp)
10288 return Comparison::Worse;
10290 if (Cand1CPUSpec && Cand2CPUSpec) {
10291 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10292 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10293 ? Comparison::Better
10294 : Comparison::Worse;
10296 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10297 FirstDiff = std::mismatch(
10298 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10299 Cand2CPUSpec->cpus_begin(),
10301 return LHS->getName() == RHS->getName();
10304 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10305 "Two different cpu-specific versions should not have the same "
10306 "identifier list, otherwise they'd be the same decl!");
10307 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->
getName()
10308 ? Comparison::Better
10309 : Comparison::Worse;
10311 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10317static std::optional<QualType>
10319 if (!isa<CXXMethodDecl>(F) || isa<CXXConstructorDecl>(F))
10320 return std::nullopt;
10322 auto *M = cast<CXXMethodDecl>(F);
10326 return M->getFunctionObjectParameterReferenceType();
10340 PT2->getInstantiatedFromMemberTemplate()))
10351 assert(I < F->getNumParams());
10355 unsigned F1NumParams = F1->
getNumParams() + isa<CXXMethodDecl>(F1);
10356 unsigned F2NumParams = F2->
getNumParams() + isa<CXXMethodDecl>(F2);
10358 if (F1NumParams != F2NumParams)
10361 unsigned I1 = 0, I2 = 0;
10362 for (
unsigned I = 0; I != F1NumParams; ++I) {
10363 QualType T1 = NextParam(F1, I1, I == 0);
10364 QualType T2 = NextParam(F2, I2, I == 0);
10365 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10393 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10394 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10395 if (Mem1 && Mem2) {
10398 if (Mem1->getParent() != Mem2->getParent())
10402 if (Mem1->isInstance() && Mem2->isInstance() &&
10404 Mem1->getFunctionObjectParameterReferenceType(),
10405 Mem1->getFunctionObjectParameterReferenceType()))
10461 bool IsCand1ImplicitHD =
10463 bool IsCand2ImplicitHD =
10478 auto EmitThreshold =
10479 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
10480 (IsCand1ImplicitHD || IsCand2ImplicitHD))
10483 auto Cand1Emittable = P1 > EmitThreshold;
10484 auto Cand2Emittable = P2 > EmitThreshold;
10485 if (Cand1Emittable && !Cand2Emittable)
10487 if (!Cand1Emittable && Cand2Emittable)
10498 unsigned StartArg = 0;
10505 return ICS.isStandard() &&
10517 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
10518 bool HasBetterConversion =
false;
10519 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
10520 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
10521 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
10522 if (Cand1Bad != Cand2Bad) {
10525 HasBetterConversion =
true;
10529 if (HasBetterConversion)
10536 bool HasWorseConversion =
false;
10537 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
10543 HasBetterConversion =
true;
10562 HasWorseConversion =
true;
10577 if (HasBetterConversion && !HasWorseConversion)
10588 isa<CXXConversionDecl>(Cand1.
Function) &&
10589 isa<CXXConversionDecl>(Cand2.
Function)) {
10617 isa<CXXConstructorDecl>(Cand1.
Function) !=
10618 isa<CXXConstructorDecl>(Cand2.
Function))
10619 return isa<CXXConstructorDecl>(Cand1.
Function);
10627 bool Cand1IsSpecialization = Cand1.
Function &&
10629 bool Cand2IsSpecialization = Cand2.
Function &&
10631 if (Cand1IsSpecialization != Cand2IsSpecialization)
10632 return Cand2IsSpecialization;
10638 if (Cand1IsSpecialization && Cand2IsSpecialization) {
10639 const auto *Obj1Context =
10641 const auto *Obj2Context =
10649 Obj1Context ?
QualType(Obj1Context->getTypeForDecl(), 0)
10651 Obj2Context ?
QualType(Obj2Context->getTypeForDecl(), 0)
10660 if (!Cand1IsSpecialization && !Cand2IsSpecialization &&
10670 bool Cand1IsInherited =
10672 bool Cand2IsInherited =
10674 if (Cand1IsInherited != Cand2IsInherited)
10675 return Cand2IsInherited;
10676 else if (Cand1IsInherited) {
10677 assert(Cand2IsInherited);
10680 if (Cand1Class->isDerivedFrom(Cand2Class))
10682 if (Cand2Class->isDerivedFrom(Cand1Class))
10699 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
10700 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
10701 if (Guide1 && Guide2) {
10703 if (Guide1->isImplicit() != Guide2->isImplicit())
10704 return Guide2->isImplicit();
10714 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
10715 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
10716 if (Constructor1 && Constructor2) {
10717 bool isC1Templated = Constructor1->getTemplatedKind() !=
10719 bool isC2Templated = Constructor2->getTemplatedKind() !=
10721 if (isC1Templated != isC2Templated)
10722 return isC2Templated;
10730 if (Cmp != Comparison::Equal)
10731 return Cmp == Comparison::Better;
10734 bool HasPS1 = Cand1.
Function !=
nullptr &&
10736 bool HasPS2 = Cand2.
Function !=
nullptr &&
10738 if (HasPS1 != HasPS2 && HasPS1)
10742 if (MV == Comparison::Better)
10744 if (MV == Comparison::Worse)
10759 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
10760 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
10762 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
10763 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
10784 auto *VA = dyn_cast_or_null<ValueDecl>(A);
10785 auto *VB = dyn_cast_or_null<ValueDecl>(B);
10791 if (!VA->getDeclContext()->getRedeclContext()->Equals(
10792 VB->getDeclContext()->getRedeclContext()) ||
10793 getOwningModule(VA) == getOwningModule(VB) ||
10794 VA->isExternallyVisible() || VB->isExternallyVisible())
10802 if (Context.
hasSameType(VA->getType(), VB->getType()))
10807 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
10808 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
10811 auto *EnumA = cast<EnumDecl>(EA->getDeclContext());
10812 auto *EnumB = cast<EnumDecl>(EB->getDeclContext());
10813 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
10815 EnumB->getIntegerType()))
10818 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
10828 assert(
D &&
"Unknown declaration");
10829 Diag(
Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) <<
D;
10831 Module *M = getOwningModule(
D);
10835 for (
auto *
E : Equiv) {
10836 Module *M = getOwningModule(
E);
10837 Diag(
E->getLocation(), diag::note_equivalent_internal_linkage_decl)
10846 static_cast<CNSInfo *
>(DeductionFailure.Data)
10847 ->Satisfaction.ContainsErrors;
10864 std::transform(
begin(),
end(), std::back_inserter(Candidates),
10880 bool ContainsSameSideCandidate =
10884 S.
CUDA().IdentifyPreference(Caller, Cand->
Function) ==
10887 if (ContainsSameSideCandidate) {
10894 llvm::erase_if(Candidates, IsWrongSideCandidate);
10900 for (
auto *Cand : Candidates) {
10901 Cand->
Best =
false;
10903 if (Best ==
end() ||
10923 PendingBest.push_back(&*Best);
10928 while (!PendingBest.empty()) {
10929 auto *Curr = PendingBest.pop_back_val();
10930 for (
auto *Cand : Candidates) {
10933 PendingBest.push_back(Cand);
10938 EquivalentCands.push_back(Cand->
Function);
10950 if (Best->Function && Best->Function->isDeleted())
10953 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
10955 M->isImplicitObjectMemberFunction()) {
10959 if (!EquivalentCands.empty())
10968enum OverloadCandidateKind {
10971 oc_reversed_binary_operator,
10973 oc_implicit_default_constructor,
10974 oc_implicit_copy_constructor,
10975 oc_implicit_move_constructor,
10976 oc_implicit_copy_assignment,
10977 oc_implicit_move_assignment,
10978 oc_implicit_equality_comparison,
10979 oc_inherited_constructor
10982enum OverloadCandidateSelect {
10985 ocs_described_template,
10988static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
10992 std::string &Description) {
10998 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
11001 OverloadCandidateSelect Select = [&]() {
11002 if (!Description.empty())
11003 return ocs_described_template;
11004 return isTemplate ? ocs_template : ocs_non_template;
11007 OverloadCandidateKind Kind = [&]() {
11008 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
11009 return oc_implicit_equality_comparison;
11012 return oc_reversed_binary_operator;
11014 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
11015 if (!Ctor->isImplicit()) {
11016 if (isa<ConstructorUsingShadowDecl>(
Found))
11017 return oc_inherited_constructor;
11019 return oc_constructor;
11022 if (Ctor->isDefaultConstructor())
11023 return oc_implicit_default_constructor;
11025 if (Ctor->isMoveConstructor())
11026 return oc_implicit_move_constructor;
11028 assert(Ctor->isCopyConstructor() &&
11029 "unexpected sort of implicit constructor");
11030 return oc_implicit_copy_constructor;
11033 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
11036 if (!Meth->isImplicit())
11039 if (Meth->isMoveAssignmentOperator())
11040 return oc_implicit_move_assignment;
11042 if (Meth->isCopyAssignmentOperator())
11043 return oc_implicit_copy_assignment;
11045 assert(isa<CXXConversionDecl>(Meth) &&
"expected conversion");
11049 return oc_function;
11052 return std::make_pair(Kind, Select);
11055void MaybeEmitInheritedConstructorNote(
Sema &S,
const Decl *FoundDecl) {
11058 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
11060 diag::note_ovl_candidate_inherited_constructor)
11061 << Shadow->getNominatedBaseClass();
11070 if (EnableIf->getCond()->isValueDependent() ||
11071 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
11088 bool InOverloadResolution,
11092 if (InOverloadResolution)
11094 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
11096 S.
Diag(
Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
11107 if (InOverloadResolution) {
11110 TemplateArgString +=
" ";
11112 FunTmpl->getTemplateParameters(),
11117 diag::note_ovl_candidate_unsatisfied_constraints)
11118 << TemplateArgString;
11120 S.
Diag(
Loc, diag::err_addrof_function_constraints_not_satisfied)
11129 return P->hasAttr<PassObjectSizeAttr>();
11136 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11137 if (InOverloadResolution)
11139 diag::note_ovl_candidate_has_pass_object_size_params)
11142 S.
Diag(
Loc, diag::err_address_of_function_with_pass_object_size_params)
11158 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11166 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11170 const auto *RD = cast<CXXRecordDecl>(Fn->getParent());
11171 if (!RD->isLambda())
11181 return ConvToCC != CallOpCC;
11187 QualType DestType,
bool TakingAddress) {
11190 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11191 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11193 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11194 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11199 std::string FnDesc;
11200 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11201 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11203 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11206 HandleFunctionTypeMismatch(PD, Fn->getType(), DestType);
11207 Diag(Fn->getLocation(), PD);
11208 MaybeEmitInheritedConstructorNote(*
this,
Found);
11226 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11227 for (
auto I = Cands.begin(),
E = Cands.end(); I !=
E; ++I) {
11231 if (
auto *Template = I->Function->getPrimaryTemplate())
11232 Template->getAssociatedConstraints(AC);
11234 I->Function->getAssociatedConstraints(AC);
11237 if (FirstCand ==
nullptr) {
11238 FirstCand = I->Function;
11240 }
else if (SecondCand ==
nullptr) {
11241 SecondCand = I->Function;
11254 SecondCand, SecondAC))
11263 bool TakingAddress) {
11273 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
11274 NoteOverloadCandidate(*I, FunTmpl->getTemplatedDecl(),
CRK_None, DestType,
11277 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
11278 NoteOverloadCandidate(*I, Fun,
CRK_None, DestType, TakingAddress);
11290 S.
Diag(CaretLoc, PDiag)
11291 << Ambiguous.getFromType() << Ambiguous.getToType();
11292 unsigned CandsShown = 0;
11294 for (I = Ambiguous.begin(),
E = Ambiguous.end(); I !=
E; ++I) {
11306 unsigned I,
bool TakingCandidateAddress) {
11308 assert(Conv.
isBad());
11309 assert(Cand->
Function &&
"for now, candidate must be a function");
11315 bool isObjectArgument =
false;
11316 if (isa<CXXMethodDecl>(Fn) && !isa<CXXConstructorDecl>(Fn)) {
11318 isObjectArgument =
true;
11319 else if (!Fn->hasCXXExplicitFunctionObjectParameter())
11323 std::string FnDesc;
11324 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11335 bool HasParamPack =
11336 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
11337 return Parm->isParameterPack();
11339 if (!isObjectArgument && !HasParamPack)
11340 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
11343 assert(FromExpr &&
"overload set argument came from implicit argument?");
11345 if (isa<UnaryOperator>(
E))
11349 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
11350 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11351 << ToParamRange << ToTy << Name << I + 1;
11352 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11361 CToTy = RT->getPointeeType();
11366 CFromTy = FromPT->getPointeeType();
11367 CToTy = ToPT->getPointeeType();
11377 if (isObjectArgument)
11378 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
11379 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11382 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
11383 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11386 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11391 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
11392 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11395 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11400 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
11401 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11404 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11409 assert(CVR &&
"expected qualifiers mismatch");
11411 if (isObjectArgument) {
11412 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
11413 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11414 << FromTy << (CVR - 1);
11416 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
11417 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11418 << ToParamRange << FromTy << (CVR - 1) << I + 1;
11420 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11426 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
11427 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11428 << (
unsigned)isObjectArgument << I + 1
11431 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11437 if (FromExpr && isa<InitListExpr>(FromExpr)) {
11438 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
11439 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11440 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11445 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11457 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
11458 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11459 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11460 << (
unsigned)(Cand->
Fix.
Kind);
11462 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11467 unsigned BaseToDerivedConversion = 0;
11470 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
11472 !FromPtrTy->getPointeeType()->isIncompleteType() &&
11473 !ToPtrTy->getPointeeType()->isIncompleteType() &&
11475 FromPtrTy->getPointeeType()))
11476 BaseToDerivedConversion = 1;
11484 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
11486 FromIface->isSuperClassOf(ToIface))
11487 BaseToDerivedConversion = 2;
11489 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy,
11492 !ToRefTy->getPointeeType()->isIncompleteType() &&
11494 BaseToDerivedConversion = 3;
11498 if (BaseToDerivedConversion) {
11499 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
11500 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11501 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
11503 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11507 if (isa<ObjCObjectPointerType>(CFromTy) &&
11508 isa<PointerType>(CToTy)) {
11512 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
11513 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11514 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
11516 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11526 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11527 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11528 << (
unsigned)(Cand->
Fix.
Kind);
11537 S.
Diag(Fn->getLocation(), FDiag);
11539 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11546 unsigned NumArgs,
bool IsAddressOf =
false) {
11547 assert(Cand->
Function &&
"Candidate is required to be a function.");
11549 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
11550 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
11557 if (Fn->isInvalidDecl() &&
11561 if (NumArgs < MinParams) {
11578 unsigned NumFormalArgs,
11579 bool IsAddressOf =
false) {
11580 assert(isa<FunctionDecl>(
D) &&
11581 "The templated declaration should at least be a function"
11582 " when diagnosing bad template argument deduction due to too many"
11583 " or too few arguments");
11589 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
11590 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
11593 bool HasExplicitObjectParam =
11594 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
11596 unsigned ParamCount =
11597 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
11598 unsigned mode, modeCount;
11600 if (NumFormalArgs < MinParams) {
11601 if (MinParams != ParamCount || FnTy->isVariadic() ||
11602 FnTy->isTemplateVariadic())
11606 modeCount = MinParams;
11608 if (MinParams != ParamCount)
11612 modeCount = ParamCount;
11615 std::string Description;
11616 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11617 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
11619 if (modeCount == 1 && !IsAddressOf &&
11620 Fn->getParamDecl(HasExplicitObjectParam ? 1 : 0)->getDeclName())
11621 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
11622 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11623 << Description << mode
11624 << Fn->getParamDecl(HasExplicitObjectParam ? 1 : 0) << NumFormalArgs
11625 << HasExplicitObjectParam << Fn->getParametersSourceRange();
11627 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
11628 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11629 << Description << mode << modeCount << NumFormalArgs
11630 << HasExplicitObjectParam << Fn->getParametersSourceRange();
11632 MaybeEmitInheritedConstructorNote(S,
Found);
11637 unsigned NumFormalArgs) {
11638 assert(Cand->
Function &&
"Candidate must be a function");
11648 llvm_unreachable(
"Unsupported: Getting the described template declaration"
11649 " for bad deduction diagnosis");
11656 bool TakingCandidateAddress) {
11662 switch (DeductionFailure.
getResult()) {
11665 "TemplateDeductionResult::Success while diagnosing bad deduction");
11667 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
11668 "while diagnosing bad deduction");
11674 assert(ParamD &&
"no parameter found for incomplete deduction result");
11676 diag::note_ovl_candidate_incomplete_deduction)
11678 MaybeEmitInheritedConstructorNote(S,
Found);
11683 assert(ParamD &&
"no parameter found for incomplete deduction result");
11685 diag::note_ovl_candidate_incomplete_deduction_pack)
11689 MaybeEmitInheritedConstructorNote(S,
Found);
11694 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
11712 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
11713 << ParamD->
getDeclName() << Arg << NonCanonParam;
11714 MaybeEmitInheritedConstructorNote(S,
Found);
11719 assert(ParamD &&
"no parameter found for inconsistent deduction result");
11721 if (isa<TemplateTypeParmDecl>(ParamD))
11723 else if (isa<NonTypeTemplateParmDecl>(ParamD)) {
11733 diag::note_ovl_candidate_inconsistent_deduction_types)
11736 MaybeEmitInheritedConstructorNote(S,
Found);
11756 diag::note_ovl_candidate_inconsistent_deduction)
11759 MaybeEmitInheritedConstructorNote(S,
Found);
11764 assert(ParamD &&
"no parameter found for invalid explicit arguments");
11767 diag::note_ovl_candidate_explicit_arg_mismatch_named)
11772 index = TTP->getIndex();
11774 = dyn_cast<NonTypeTemplateParmDecl>(ParamD))
11775 index = NTTP->getIndex();
11777 index = cast<TemplateTemplateParmDecl>(ParamD)->getIndex();
11779 diag::note_ovl_candidate_explicit_arg_mismatch_unnamed)
11782 MaybeEmitInheritedConstructorNote(S,
Found);
11789 TemplateArgString =
" ";
11792 if (TemplateArgString.size() == 1)
11793 TemplateArgString.clear();
11795 diag::note_ovl_candidate_unsatisfied_constraints)
11796 << TemplateArgString;
11799 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
11809 diag::note_ovl_candidate_instantiation_depth);
11810 MaybeEmitInheritedConstructorNote(S,
Found);
11818 TemplateArgString =
" ";
11821 if (TemplateArgString.size() == 1)
11822 TemplateArgString.clear();
11827 if (PDiag && PDiag->second.getDiagID() ==
11828 diag::err_typename_nested_not_found_enable_if) {
11831 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
11832 <<
"'enable_if'" << TemplateArgString;
11837 if (PDiag && PDiag->second.getDiagID() ==
11838 diag::err_typename_nested_not_found_requirement) {
11840 diag::note_ovl_candidate_disabled_by_requirement)
11841 << PDiag->second.getStringArg(0) << TemplateArgString;
11851 SFINAEArgString =
": ";
11853 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
11857 diag::note_ovl_candidate_substitution_failure)
11858 << TemplateArgString << SFINAEArgString << R;
11859 MaybeEmitInheritedConstructorNote(S,
Found);
11869 TemplateArgString =
" ";
11872 if (TemplateArgString.size() == 1)
11873 TemplateArgString.clear();
11876 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
11879 << TemplateArgString
11904 diag::note_ovl_candidate_non_deduced_mismatch_qualified)
11911 if (TakingCandidateAddress && isa<FunctionDecl>(Templated) &&
11920 diag::note_ovl_candidate_non_deduced_mismatch)
11921 << FirstTA << SecondTA;
11927 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
11928 MaybeEmitInheritedConstructorNote(S,
Found);
11932 diag::note_cuda_ovl_candidate_target_mismatch);
11940 bool TakingCandidateAddress) {
11941 assert(Cand->
Function &&
"Candidate must be a function");
11956 assert(Cand->
Function &&
"Candidate must be a Function.");
11962 std::string FnDesc;
11963 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11964 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
11967 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
11968 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
11970 << llvm::to_underlying(CalleeTarget) << llvm::to_underlying(CallerTarget);
11975 if (Meth !=
nullptr && Meth->
isImplicit()) {
11979 switch (FnKindPair.first) {
11982 case oc_implicit_default_constructor:
11985 case oc_implicit_copy_constructor:
11988 case oc_implicit_move_constructor:
11991 case oc_implicit_copy_assignment:
11994 case oc_implicit_move_assignment:
11999 bool ConstRHS =
false;
12003 ConstRHS = RT->getPointeeType().isConstQualified();
12014 assert(Cand->
Function &&
"Candidate must be a function");
12018 S.
Diag(Callee->getLocation(),
12019 diag::note_ovl_candidate_disabled_by_function_cond_attr)
12020 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
12024 assert(Cand->
Function &&
"Candidate must be a function");
12027 assert(ES.
isExplicit() &&
"not an explicit candidate");
12030 switch (Fn->getDeclKind()) {
12031 case Decl::Kind::CXXConstructor:
12034 case Decl::Kind::CXXConversion:
12037 case Decl::Kind::CXXDeductionGuide:
12038 Kind = Fn->isImplicit() ? 0 : 2;
12041 llvm_unreachable(
"invalid Decl");
12050 First = Pattern->getFirstDecl();
12053 diag::note_ovl_candidate_explicit)
12054 << Kind << (ES.
getExpr() ? 1 : 0)
12059 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
12066 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
12068 std::string FunctionProto;
12069 llvm::raw_string_ostream OS(FunctionProto);
12082 "Non-template implicit deduction guides are only possible for "
12085 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12090 assert(Template &&
"Cannot find the associated function template of "
12091 "CXXDeductionGuideDecl?");
12093 Template->
print(OS);
12094 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12115 bool TakingCandidateAddress,
12117 assert(Cand->
Function &&
"Candidate must be a function");
12125 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
12132 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12137 if (Fn->isDeleted()) {
12138 std::string FnDesc;
12139 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12140 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12143 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12144 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12145 << (Fn->isDeleted() ? (Fn->isDeletedAsWritten() ? 1 : 2) : 0);
12146 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12173 TakingCandidateAddress);
12176 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12177 << (Fn->getPrimaryTemplate() ? 1 : 0);
12178 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12185 S.
Diag(Fn->getLocation(),
12186 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12187 << QualsForPrinting;
12188 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12199 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
12220 if (cast<CXXConstructorDecl>(Fn)->isCopyOrMoveConstructor())
12222 S.
Diag(Fn->getLocation(),
12223 diag::note_ovl_candidate_inherited_constructor_slice)
12224 << (Fn->getPrimaryTemplate() ? 1 : 0)
12225 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
12226 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12232 assert(!Available);
12240 std::string FnDesc;
12241 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12242 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12245 S.
Diag(Fn->getLocation(),
12246 diag::note_ovl_candidate_constraints_not_satisfied)
12247 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12265 bool isLValueReference =
false;
12266 bool isRValueReference =
false;
12267 bool isPointer =
false;
12271 isLValueReference =
true;
12275 isRValueReference =
true;
12291 diag::note_ovl_surrogate_constraints_not_satisfied)
12305 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
12306 std::string TypeStr(
"operator");
12312 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
12317 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
12324 if (ICS.
isBad())
break;
12328 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
12345 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
12375 llvm_unreachable(
"Unhandled deduction result");
12380struct CompareOverloadCandidatesForDisplay {
12386 CompareOverloadCandidatesForDisplay(
12389 : S(S), NumArgs(NArgs), CSK(CSK) {}
12399 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
12401 if (NumArgs < C->
Function->getMinRequiredArguments())
12411 if (L == R)
return false;
12415 if (!R->
Viable)
return true;
12417 if (
int Ord = CompareConversions(*L, *R))
12437 if (LDist == RDist) {
12438 if (LFailureKind == RFailureKind)
12446 return LDist < RDist;
12464 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
12465 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
12466 if (numLFixes != numRFixes) {
12467 return numLFixes < numRFixes;
12471 if (
int Ord = CompareConversions(*L, *R))
12483 if (LRank != RRank)
12484 return LRank < RRank;
12510 struct ConversionSignals {
12511 unsigned KindRank = 0;
12515 ConversionSignals Sig;
12516 Sig.KindRank =
Seq.getKindRank();
12517 if (
Seq.isStandard())
12518 Sig.Rank =
Seq.Standard.getRank();
12519 else if (
Seq.isUserDefined())
12520 Sig.Rank =
Seq.UserDefined.After.getRank();
12526 static ConversionSignals ForObjectArgument() {
12542 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
12544 ? ConversionSignals::ForObjectArgument()
12545 : ConversionSignals::ForSequence(L.Conversions[I]);
12547 ? ConversionSignals::ForObjectArgument()
12548 : ConversionSignals::ForSequence(R.Conversions[I]);
12549 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
12550 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
12575 bool Unfixable =
false;
12583 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
12584 if (Cand->
Conversions[ConvIdx].isInitialized() &&
12593 bool SuppressUserConversions =
false;
12595 unsigned ConvIdx = 0;
12596 unsigned ArgIdx = 0;
12611 if (isa<CXXMethodDecl>(Cand->
Function) &&
12624 assert(ConvCount <= 3);
12630 ConvIdx != ConvCount;
12632 assert(ArgIdx < Args.size() &&
"no argument for this arg conversion");
12633 if (Cand->
Conversions[ConvIdx].isInitialized()) {
12635 }
else if (
ParamIdx < ParamTypes.size()) {
12636 if (ParamTypes[
ParamIdx]->isDependentType())
12637 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
12638 Args[ArgIdx]->getType());
12642 SuppressUserConversions,
12647 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
12663 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
12664 if (!Filter(*Cand))
12668 if (!Cand->Viable) {
12669 if (!Cand->Function && !Cand->IsSurrogate) {
12689 Cands.push_back(Cand);
12693 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
12700 bool DeferHint =
false;
12704 auto WrongSidedCands =
12706 return (Cand.Viable ==
false &&
12709 Cand.Function->template hasAttr<CUDAHostAttr>() &&
12710 Cand.Function->template hasAttr<CUDADeviceAttr>());
12712 DeferHint = !WrongSidedCands.empty();
12730 bool NoteCands =
true;
12731 for (
const Expr *Arg : Args) {
12732 if (Arg->getType()->isWebAssemblyTableType())
12746 bool ReportedAmbiguousConversions =
false;
12749 unsigned CandsShown = 0;
12750 auto I = Cands.begin(),
E = Cands.end();
12751 for (; I !=
E; ++I) {
12767 "Non-viable built-in candidates are not added to Cands.");
12774 if (!ReportedAmbiguousConversions) {
12776 ReportedAmbiguousConversions =
true;
12789 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates,
12801struct CompareTemplateSpecCandidatesForDisplay {
12803 CompareTemplateSpecCandidatesForDisplay(
Sema &S) : S(S) {}
12837 bool ForTakingAddress) {
12839 DeductionFailure, 0, ForTakingAddress);
12842void TemplateSpecCandidateSet::destroyCandidates() {
12844 i->DeductionFailure.Destroy();
12849 destroyCandidates();
12850 Candidates.clear();
12863 Cands.reserve(
size());
12864 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
12865 if (Cand->Specialization)
12866 Cands.push_back(Cand);
12871 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
12878 unsigned CandsShown = 0;
12879 for (I = Cands.begin(),
E = Cands.end(); I !=
E; ++I) {
12885 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
12890 "Non-matching built-in candidates are not added to Cands.");
12895 S.
Diag(
Loc, diag::note_ovl_too_many_candidates) <<
int(
E - I);
12905 QualType Ret = PossiblyAFunctionType;
12908 Ret = ToTypePtr->getPointeeType();
12911 Ret = ToTypeRef->getPointeeType();
12914 Ret = MemTypePtr->getPointeeType();
12921 bool Complain =
true) {
12938class AddressOfFunctionResolver {
12948 bool TargetTypeIsNonStaticMemberFunction;
12949 bool FoundNonTemplateFunction;
12950 bool StaticMemberFunctionFromBoundPointer;
12951 bool HasComplained;
12960 AddressOfFunctionResolver(
Sema &S,
Expr *SourceExpr,
12961 const QualType &TargetType,
bool Complain)
12962 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
12963 Complain(Complain), Context(S.getASTContext()),
12964 TargetTypeIsNonStaticMemberFunction(
12966 FoundNonTemplateFunction(
false),
12967 StaticMemberFunctionFromBoundPointer(
false),
12968 HasComplained(
false),
12971 FailedCandidates(OvlExpr->getNameLoc(),
true) {
12972 ExtractUnqualifiedFunctionTypeFromTargetType();
12976 if (!UME->isImplicitAccess() &&
12978 StaticMemberFunctionFromBoundPointer =
true;
12982 OvlExpr,
false, &dap)) {
12988 TargetTypeIsNonStaticMemberFunction =
true;
12996 Matches.push_back(std::make_pair(dap, Fn));
13004 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
13007 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
13008 if (FoundNonTemplateFunction)
13009 EliminateAllTemplateMatches();
13011 EliminateAllExceptMostSpecializedTemplate();
13016 EliminateSuboptimalCudaMatches();
13019 bool hasComplained()
const {
return HasComplained; }
13022 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
13034 return candidateHasExactlyCorrectType(A) &&
13035 (!candidateHasExactlyCorrectType(B) ||
13041 bool eliminiateSuboptimalOverloadCandidates() {
13044 auto Best = Matches.begin();
13045 for (
auto I = Matches.begin()+1,
E = Matches.end(); I !=
E; ++I)
13046 if (isBetterCandidate(I->second, Best->second))
13050 auto IsBestOrInferiorToBest = [
this, BestFn](
13051 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
13052 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
13057 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
13059 Matches[0] = *Best;
13064 bool isTargetTypeAFunction()
const {
13073 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
13084 bool CanConvertToFunctionPointer =
13086 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13089 else if (TargetTypeIsNonStaticMemberFunction)
13101 FunctionTemplate, &OvlExplicitTemplateArgs, TargetFunctionType,
13103 Result != TemplateDeductionResult::Success) {
13121 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
13125 bool AddMatchingNonTemplateFunction(
NamedDecl* Fn,
13130 bool CanConvertToFunctionPointer =
13132 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13135 else if (TargetTypeIsNonStaticMemberFunction)
13138 if (
FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13145 if (FunDecl->isMultiVersion()) {
13146 const auto *TA = FunDecl->
getAttr<TargetAttr>();
13147 if (TA && !TA->isDefaultVersion())
13149 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13150 if (TVA && !TVA->isDefaultVersion())
13158 HasComplained |= Complain;
13167 candidateHasExactlyCorrectType(FunDecl)) {
13168 Matches.push_back(std::make_pair(
13169 CurAccessFunPair, cast<FunctionDecl>(FunDecl->getCanonicalDecl())));
13170 FoundNonTemplateFunction =
true;
13178 bool FindAllFunctionsThatMatchTargetTypeExactly() {
13183 if (IsInvalidFormOfPointerToMemberFunction())
13199 = dyn_cast<FunctionTemplateDecl>(Fn)) {
13200 if (AddMatchingTemplateFunction(FunctionTemplate, I.getPair()))
13205 AddMatchingNonTemplateFunction(Fn, I.getPair()))
13208 assert(Ret || Matches.empty());
13212 void EliminateAllExceptMostSpecializedTemplate() {
13225 for (
unsigned I = 0,
E = Matches.size(); I !=
E; ++I)
13226 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
13231 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
13233 S.
PDiag(diag::err_addr_ovl_ambiguous)
13234 << Matches[0].second->getDeclName(),
13235 S.
PDiag(diag::note_ovl_candidate)
13236 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
13237 Complain, TargetFunctionType);
13239 if (Result != MatchesCopy.
end()) {
13241 Matches[0].first = Matches[Result - MatchesCopy.
begin()].first;
13242 Matches[0].second = cast<FunctionDecl>(*Result);
13245 HasComplained |= Complain;
13248 void EliminateAllTemplateMatches() {
13251 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
13252 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
13255 Matches[I] = Matches[--N];
13261 void EliminateSuboptimalCudaMatches() {
13267 void ComplainNoMatchesFound()
const {
13268 assert(Matches.empty());
13270 << OvlExpr->
getName() << TargetFunctionType
13272 if (FailedCandidates.
empty())
13283 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
13291 bool IsInvalidFormOfPointerToMemberFunction()
const {
13292 return TargetTypeIsNonStaticMemberFunction &&
13296 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
13304 bool IsStaticMemberFunctionFromBoundPointer()
const {
13305 return StaticMemberFunctionFromBoundPointer;
13308 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
13310 diag::err_invalid_form_pointer_member_function)
13314 void ComplainOfInvalidConversion()
const {
13316 << OvlExpr->
getName() << TargetType;
13319 void ComplainMultipleMatchesFound()
const {
13320 assert(Matches.size() > 1);
13327 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
13329 int getNumMatches()
const {
return Matches.size(); }
13332 if (Matches.size() != 1)
return nullptr;
13333 return Matches[0].second;
13337 if (Matches.size() != 1)
return nullptr;
13338 return &Matches[0].first;
13348 bool *pHadMultipleCandidates) {
13351 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
13353 int NumMatches = Resolver.getNumMatches();
13355 bool ShouldComplain = Complain && !Resolver.hasComplained();
13356 if (NumMatches == 0 && ShouldComplain) {
13357 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
13358 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
13360 Resolver.ComplainNoMatchesFound();
13362 else if (NumMatches > 1 && ShouldComplain)
13363 Resolver.ComplainMultipleMatchesFound();
13364 else if (NumMatches == 1) {
13365 Fn = Resolver.getMatchingFunctionDecl();
13368 ResolveExceptionSpec(AddressOfExpr->
getExprLoc(), FPT);
13369 FoundResult = *Resolver.getMatchingFunctionAccessPair();
13371 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
13372 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
13374 CheckAddressOfMemberAccess(AddressOfExpr, FoundResult);
13378 if (pHadMultipleCandidates)
13379 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
13387 bool IsResultAmbiguous =
false;
13395 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
13396 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
13403 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
13411 auto FoundBetter = [&]() {
13412 IsResultAmbiguous =
false;
13423 if (getLangOpts().CUDA) {
13424 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
13426 if (PreferenceByCUDA != 0) {
13428 if (PreferenceByCUDA > 0)
13436 if (MoreConstrained != FD) {
13437 if (!MoreConstrained) {
13438 IsResultAmbiguous =
true;
13439 AmbiguousDecls.push_back(FD);
13448 if (IsResultAmbiguous)
13459 if (getLangOpts().
CUDA && CheckCUDAPreference(Skipped,
Result) != 0)
13461 if (!getMoreConstrainedFunction(Skipped,
Result))
13470 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
13476 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
13477 Found->isCPUSpecificMultiVersion())
13484 CheckAddressOfMemberAccess(
E, DAP);
13490 SrcExpr = DefaultFunctionArrayConversion(Fixed,
false);
13525 = cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
13554 NoteAllOverloadCandidates(ovl);
13560 if (FoundResult) *FoundResult = I.getPair();
13571 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
13573 unsigned DiagIDForComplaining) {
13580 if (
FunctionDecl *fn = ResolveSingleFunctionTemplateSpecialization(
13592 isa<CXXMethodDecl>(fn) &&
13593 cast<CXXMethodDecl>(fn)->isInstance()) {
13594 if (!complain)
return false;
13597 diag::err_bound_member_function)
13610 SingleFunctionExpression =
13611 FixOverloadedFunctionReference(SrcExpr.
get(), found, fn);
13614 if (doFunctionPointerConversion) {
13615 SingleFunctionExpression =
13616 DefaultFunctionArrayLvalueConversion(SingleFunctionExpression.
get());
13617 if (SingleFunctionExpression.
isInvalid()) {
13624 if (!SingleFunctionExpression.
isUsable()) {
13626 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
13628 << DestTypeForComplaining
13629 << OpRangeForComplaining
13631 NoteAllOverloadCandidates(SrcExpr.
get());
13640 SrcExpr = SingleFunctionExpression;
13650 bool PartialOverloading,
13652 NamedDecl *Callee = FoundDecl.getDecl();
13653 if (isa<UsingShadowDecl>(Callee))
13654 Callee = cast<UsingShadowDecl>(Callee)->getTargetDecl();
13657 if (ExplicitTemplateArgs) {
13658 assert(!KnownValid &&
"Explicit template arguments?");
13667 PartialOverloading);
13672 = dyn_cast<FunctionTemplateDecl>(Callee)) {
13674 ExplicitTemplateArgs, Args, CandidateSet,
13676 PartialOverloading);
13680 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
13686 bool PartialOverloading) {
13709 assert(!(*I)->getDeclContext()->isRecord());
13710 assert(isa<UsingShadowDecl>(*I) ||
13711 !(*I)->getDeclContext()->isFunctionOrMethod());
13712 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
13722 ExplicitTemplateArgs = &TABuffer;
13728 CandidateSet, PartialOverloading,
13733 Args, ExplicitTemplateArgs,
13734 CandidateSet, PartialOverloading);
13742 CandidateSet,
false,
false);
13748 switch (Name.getCXXOverloadedOperator()) {
13749 case OO_New:
case OO_Array_New:
13750 case OO_Delete:
case OO_Array_Delete:
13773 if (DC->isTransparentContext())
13789 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
13794 if (FoundInClass) {
13795 *FoundInClass = RD;
13798 R.
addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
13815 AssociatedNamespaces,
13816 AssociatedClasses);
13820 for (Sema::AssociatedNamespaceSet::iterator
13821 it = AssociatedNamespaces.begin(),
13822 end = AssociatedNamespaces.end(); it !=
end; ++it) {
13824 if (
Std &&
Std->Encloses(*it))
13834 SuggestedNamespaces.insert(*it);
13838 SemaRef.
Diag(R.
getNameLoc(), diag::err_not_found_by_two_phase_lookup)
13840 if (SuggestedNamespaces.empty()) {
13841 SemaRef.
Diag(Best->Function->getLocation(),
13842 diag::note_not_found_by_two_phase_lookup)
13844 }
else if (SuggestedNamespaces.size() == 1) {
13845 SemaRef.
Diag(Best->Function->getLocation(),
13846 diag::note_not_found_by_two_phase_lookup)
13852 SemaRef.
Diag(Best->Function->getLocation(),
13853 diag::note_not_found_by_two_phase_lookup)
13885class BuildRecoveryCallExprRAII {
13890 BuildRecoveryCallExprRAII(
Sema &S) : SemaRef(S), SatStack(S) {
13912 bool EmptyLookup,
bool AllowTypoCorrection) {
13920 BuildRecoveryCallExprRAII RCE(SemaRef);
13930 ExplicitTemplateArgs = &TABuffer;
13938 ExplicitTemplateArgs, Args, &FoundInClass)) {
13940 }
else if (EmptyLookup) {
13945 ExplicitTemplateArgs !=
nullptr,
13946 dyn_cast<MemberExpr>(Fn));
13948 AllowTypoCorrection
13954 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
13969 assert(!R.
empty() &&
"lookup results empty despite recovery");
13980 if ((*R.
begin())->isCXXClassMember())
13982 ExplicitTemplateArgs, S);
13983 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
13985 ExplicitTemplateArgs);
14009 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
14016 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
14018 llvm_unreachable(
"performing ADL for builtin");
14021 assert(getLangOpts().
CPlusPlus &&
"ADL enabled in C");
14025 UnbridgedCastsSet UnbridgedCasts;
14033 AddOverloadedCallCandidates(ULE, Args, *CandidateSet);
14035 if (getLangOpts().MSVCCompat &&
14036 CurContext->isDependentContext() && !isSFINAEContext() &&
14037 (isa<FunctionDecl>(CurContext) || isa<CXXRecordDecl>(CurContext))) {
14040 if (CandidateSet->
empty() ||
14049 RParenLoc, CurFPFeatureOverrides());
14056 if (CandidateSet->
empty())
14059 UnbridgedCasts.restore();
14066 std::optional<QualType>
Result;
14069 if (!Candidate.Function)
14071 if (Candidate.Function->isInvalidDecl())
14073 QualType T = Candidate.Function->getReturnType();
14086 if (Best && *Best != CS.
end())
14087 ConsiderCandidate(**Best);
14090 for (
const auto &
C : CS)
14092 ConsiderCandidate(
C);
14095 for (
const auto &
C : CS)
14096 ConsiderCandidate(
C);
14101 if (
Value.isNull() ||
Value->isUndeducedType())
14118 bool AllowTypoCorrection) {
14119 switch (OverloadResult) {
14130 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14136 if (*Best != CandidateSet->
end() &&
14140 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
14145 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
14155 CandidateSet->
empty(),
14156 AllowTypoCorrection);
14163 for (
const Expr *Arg : Args) {
14164 if (!Arg->getType()->isFunctionType())
14166 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
14167 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
14170 Arg->getExprLoc()))
14178 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
14179 << ULE->
getName() << Fn->getSourceRange()),
14187 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
14188 << ULE->
getName() << Fn->getSourceRange()),
14195 Fn->getSourceRange(), ULE->
getName(),
14196 *CandidateSet, FDecl, Args);
14205 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14213 SubExprs.append(Args.begin(), Args.end());
14220 for (
auto I = CS.
begin(),
E = CS.
end(); I !=
E; ++I) {
14235 bool AllowTypoCorrection,
14236 bool CalleesAddressIsTaken) {
14238 Fn->getExprLoc(), CalleesAddressIsTaken
14243 if (buildOverloadedCallSet(S, Fn, ULE, Args, LParenLoc, &CandidateSet,
14249 if (CalleesAddressIsTaken)
14263 if (
const auto *TP =
14267 VK_PRValue, RParenLoc, CurFPFeatureOverrides());
14273 ExecConfig, &CandidateSet, &Best,
14274 OverloadResult, AllowTypoCorrection);
14283 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
14289 bool HadMultipleCandidates) {
14294 Exp = InitializeExplicitObjectArgument(*
this,
E, Method);
14296 Exp = PerformImplicitObjectArgumentInitialization(
E,
nullptr,
14297 FoundDecl, Method);
14306 auto *CE = dyn_cast<CastExpr>(SubE);
14307 if (CE && CE->getCastKind() == CK_NoOp)
14308 SubE = CE->getSubExpr();
14310 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
14311 SubE = BE->getSubExpr();
14312 if (isa<LambdaExpr>(SubE)) {
14318 PushExpressionEvaluationContext(
14319 ExpressionEvaluationContext::PotentiallyEvaluated);
14320 ExprResult BlockExp = BuildBlockForLambdaConversion(
14322 PopExpressionEvaluationContext();
14340 Expr *ObjectParam = Exp.
get();
14343 CurFPFeatureOverrides());
14353 Exp.
get()->getEndLoc(),
14354 CurFPFeatureOverrides());
14357 if (CheckFunctionCall(Method, CE,
14367 Expr *Input,
bool PerformADL) {
14369 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
14377 Expr *Args[2] = { Input,
nullptr };
14378 unsigned NumArgs = 1;
14383 if (Opc == UO_PostInc || Opc == UO_PostDec) {
14397 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
14403 CurFPFeatureOverrides());
14408 if (Fn.isInvalid())
14412 CurFPFeatureOverrides());
14419 AddNonMemberOperatorCandidates(Fns, ArgsArray, CandidateSet);
14422 AddMemberOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet);
14426 AddArgumentDependentLookupCandidates(OpName, OpLoc, ArgsArray,
14432 AddBuiltinOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet);
14434 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
14449 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FnDecl)) {
14450 CheckMemberOperatorAccess(OpLoc, Input,
nullptr, Best->FoundDecl);
14454 InputInit = InitializeExplicitObjectArgument(*
this, Input, Method);
14456 InputInit = PerformImplicitObjectArgumentInitialization(
14457 Input,
nullptr, Best->FoundDecl, Method);
14460 Base = Input = InputInit.
get();
14471 Input = InputInit.
get();
14476 Base, HadMultipleCandidates,
14488 Context, Op, FnExpr.
get(), ArgsArray, ResultTy, VK, OpLoc,
14489 CurFPFeatureOverrides(),
14492 if (CheckCallReturnType(FnDecl->
getReturnType(), OpLoc, TheCall, FnDecl))
14495 if (CheckFunctionCall(FnDecl, TheCall,
14498 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), FnDecl);
14503 ExprResult InputRes = PerformImplicitConversion(
14504 Input, Best->BuiltinParamTypes[0], Best->Conversions[0],
14509 Input = InputRes.
get();
14529 PDiag(diag::err_ovl_ambiguous_oper_unary)
14546 << (Msg !=
nullptr)
14547 << (Msg ? Msg->
getString() : StringRef())
14558 return CreateBuiltinUnaryOp(OpLoc, Opc, Input);
14574 AddNonMemberOperatorCandidates(Fns, Args, CandidateSet);
14577 AddMemberOperatorCandidates(Op, OpLoc, Args, CandidateSet);
14579 AddMemberOperatorCandidates(Op, OpLoc, {Args[1], Args[0]}, CandidateSet,
14584 AddMemberOperatorCandidates(ExtraOp, OpLoc, Args, CandidateSet);
14586 AddMemberOperatorCandidates(ExtraOp, OpLoc, {Args[1], Args[0]},
14594 if (Op != OO_Equal && PerformADL) {
14596 AddArgumentDependentLookupCandidates(OpName, OpLoc, Args,
14602 AddArgumentDependentLookupCandidates(ExtraOpName, OpLoc, Args,
14621 AddBuiltinOperatorCandidates(Op, OpLoc, Args, CandidateSet);
14627 Expr *RHS,
bool PerformADL,
14628 bool AllowRewrittenCandidates,
14630 Expr *Args[2] = { LHS, RHS };
14634 AllowRewrittenCandidates =
false;
14640 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
14661 if (Fn.isInvalid())
14665 CurFPFeatureOverrides());
14670 if (Opc == BO_PtrMemD) {
14671 auto CheckPlaceholder = [&](
Expr *&Arg) {
14680 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
14682 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
14701 if (Opc == BO_Assign && !Args[0]->getType()->isOverloadableType())
14702 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
14707 Op, OpLoc, AllowRewrittenCandidates));
14709 CandidateSet.
exclude(DefaultedFn);
14710 LookupOverloadedBinOp(CandidateSet, Op, Fns, Args, PerformADL);
14712 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
14721 bool IsReversed = Best->isReversed();
14723 std::swap(Args[0], Args[1]);
14740 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
14744 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
14745 : diag::err_ovl_rewrite_equalequal_not_bool)
14753 if (AllowRewrittenCandidates && !IsReversed &&
14761 if (Cand.Viable && Cand.Function && Cand.isReversed() &&
14763 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
14765 *
this, OpLoc, Cand.Conversions[ArgIdx],
14766 Best->Conversions[ArgIdx]) ==
14768 AmbiguousWith.push_back(Cand.Function);
14775 if (!AmbiguousWith.empty()) {
14776 bool AmbiguousWithSelf =
14777 AmbiguousWith.size() == 1 &&
14779 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
14781 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
14783 if (AmbiguousWithSelf) {
14785 diag::note_ovl_ambiguous_oper_binary_reversed_self);
14790 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
14791 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
14793 !MD->hasCXXExplicitFunctionObjectParameter() &&
14795 MD->getFunctionObjectParameterType(),
14796 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
14798 MD->getFunctionObjectParameterType(),
14801 MD->getFunctionObjectParameterType(),
14804 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
14807 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
14808 for (
auto *F : AmbiguousWith)
14809 Diag(F->getLocation(),
14810 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
14818 if (Op == OO_Equal)
14819 diagnoseNullableToNonnullConversion(Args[0]->getType(),
14820 Args[1]->getType(), OpLoc);
14823 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FnDecl)) {
14825 CheckMemberOperatorAccess(OpLoc, Args[0], Args[1], Best->FoundDecl);
14830 Arg0 = InitializeExplicitObjectArgument(*
this, Args[0], FnDecl);
14833 Arg0 = PerformImplicitObjectArgumentInitialization(
14834 Args[0],
nullptr, Best->FoundDecl, Method);
14836 Arg1 = PerformCopyInitialization(
14847 ExprResult Arg0 = PerformCopyInitialization(
14855 PerformCopyInitialization(
14867 Best->FoundDecl,
Base,
14868 HadMultipleCandidates, OpLoc);
14879 const Expr *ImplicitThis =
nullptr;
14884 Context, ChosenOp, FnExpr.
get(), Args, ResultTy, VK, OpLoc,
14885 CurFPFeatureOverrides(),
14888 if (
const auto *Method = dyn_cast<CXXMethodDecl>(FnDecl);
14891 ImplicitThis = ArgsArray[0];
14892 ArgsArray = ArgsArray.slice(1);
14895 if (CheckCallReturnType(FnDecl->
getReturnType(), OpLoc, TheCall,
14899 if (Op == OO_Equal) {
14901 DiagnoseSelfMove(Args[0], Args[1], OpLoc);
14904 *
this,
AssignedEntity{Args[0], dyn_cast<CXXMethodDecl>(FnDecl)},
14907 if (ImplicitThis) {
14910 cast<CXXMethodDecl>(FnDecl)->getFunctionObjectParameterType());
14912 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
14916 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
14918 VariadicDoesNotApply);
14920 ExprResult R = MaybeBindToTemporary(TheCall);
14924 R = CheckForImmediateInvocation(R, FnDecl);
14931 (Op == OO_Spaceship && IsReversed)) {
14932 if (Op == OO_ExclaimEqual) {
14933 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
14934 R = CreateBuiltinUnaryOp(OpLoc, UO_LNot, R.
get());
14936 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
14938 Expr *ZeroLiteral =
14943 Ctx.Entity = FnDecl;
14944 pushCodeSynthesisContext(Ctx);
14946 R = CreateOverloadedBinOp(
14947 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.
get(),
14948 IsReversed ? R.
get() : ZeroLiteral,
true,
14951 popCodeSynthesisContext();
14956 assert(ChosenOp == Op &&
"unexpected operator name");
14960 if (Best->RewriteKind !=
CRK_None)
14968 ExprResult ArgsRes0 = PerformImplicitConversion(
14969 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
14974 Args[0] = ArgsRes0.
get();
14976 ExprResult ArgsRes1 = PerformImplicitConversion(
14977 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
14982 Args[1] = ArgsRes1.
get();
14992 if (Opc == BO_Comma)
14997 if (DefaultedFn && Opc == BO_Cmp) {
14998 ExprResult E = BuildSynthesizedThreeWayComparison(OpLoc, Fns, Args[0],
14999 Args[1], DefaultedFn);
15000 if (
E.isInvalid() ||
E.isUsable())
15014 Opc >= BO_Assign && Opc <= BO_OrAssign) {
15015 Diag(OpLoc, diag::err_ovl_no_viable_oper)
15018 if (Args[0]->getType()->isIncompleteType()) {
15019 Diag(OpLoc, diag::note_assign_lhs_incomplete)
15033 Result = CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
15035 assert(
Result.isInvalid() &&
15036 "C++ binary operator overloading is missing candidates!");
15045 << Args[0]->getType()
15046 << Args[1]->getType()
15047 << Args[0]->getSourceRange()
15048 << Args[1]->getSourceRange()),
15054 if (isImplicitlyDeleted(Best->Function)) {
15058 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
15063 Diag(OpLoc, diag::err_ovl_deleted_comparison)
15064 << Args[0]->
getType() << DeletedFD;
15069 NoteDeletedFunction(DeletedFD);
15077 PDiag(diag::err_ovl_deleted_oper)
15079 .getCXXOverloadedOperator())
15080 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
15081 << Args[0]->getSourceRange() << Args[1]->getSourceRange()),
15089 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
15105 "cannot use prvalue expressions more than once");
15106 Expr *OrigLHS = LHS;
15107 Expr *OrigRHS = RHS;
15111 LHS =
new (Context)
15114 RHS =
new (Context)
15118 ExprResult Eq = CreateOverloadedBinOp(OpLoc, BO_EQ, Fns, LHS, RHS,
true,
true,
15120 if (
Eq.isInvalid())
15123 ExprResult Less = CreateOverloadedBinOp(OpLoc, BO_LT, Fns, LHS, RHS,
true,
15124 true, DefaultedFn);
15125 if (
Less.isInvalid())
15130 Greater = CreateOverloadedBinOp(OpLoc, BO_LT, Fns, RHS, LHS,
true,
true,
15137 struct Comparison {
15152 for (; I >= 0; --I) {
15154 auto *VI = Info->lookupValueInfo(Comparisons[I].
Result);
15165 Result = ActOnConditionalOp(OpLoc, OpLoc, Comparisons[I].Cmp.get(),
15177 Context, OrigLHS, OrigRHS, BO_Cmp,
Result.get()->getType(),
15178 Result.get()->getValueKind(),
Result.get()->getObjectKind(), OpLoc,
15179 CurFPFeatureOverrides());
15180 Expr *SemanticForm[] = {LHS, RHS,
Result.get()};
15190 unsigned NumArgsSlots =
15191 MethodArgs.size() + std::max<unsigned>(Args.size(), NumParams);
15194 MethodArgs.reserve(MethodArgs.size() + NumArgsSlots);
15195 bool IsError =
false;
15198 for (
unsigned i = 0; i != NumParams; i++) {
15200 if (i < Args.size()) {
15218 MethodArgs.push_back(Arg);
15228 Args.push_back(
Base);
15229 for (
auto *e : ArgExpr) {
15238 ArgExpr.back()->getEndLoc());
15250 if (Fn.isInvalid())
15256 CurFPFeatureOverrides());
15260 UnbridgedCastsSet UnbridgedCasts;
15270 AddMemberOperatorCandidates(OO_Subscript, LLoc, Args, CandidateSet);
15273 if (Args.size() == 2)
15274 AddBuiltinOperatorCandidates(OO_Subscript, LLoc, Args, CandidateSet);
15276 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15289 CheckMemberOperatorAccess(LLoc, Args[0], ArgExpr, Best->FoundDecl);
15298 InitializeExplicitObjectArgument(*
this, Args[0], Method);
15301 Args[0] = Res.
get();
15304 ExprResult Arg0 = PerformImplicitObjectArgumentInitialization(
15305 Args[0],
nullptr, Best->FoundDecl, Method);
15309 MethodArgs.push_back(Arg0.
get());
15313 *
this, MethodArgs, Method, ArgExpr, LLoc);
15321 *
this, FnDecl, Best->FoundDecl,
Base, HadMultipleCandidates,
15332 Context, OO_Subscript, FnExpr.
get(), MethodArgs, ResultTy, VK, RLoc,
15333 CurFPFeatureOverrides());
15335 if (CheckCallReturnType(FnDecl->
getReturnType(), LLoc, TheCall, FnDecl))
15338 if (CheckFunctionCall(Method, TheCall,
15342 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall),
15348 ExprResult ArgsRes0 = PerformImplicitConversion(
15349 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15354 Args[0] = ArgsRes0.
get();
15356 ExprResult ArgsRes1 = PerformImplicitConversion(
15357 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15362 Args[1] = ArgsRes1.
get();
15370 CandidateSet.
empty()
15371 ? (PDiag(diag::err_ovl_no_oper)
15372 << Args[0]->getType() << 0
15373 << Args[0]->getSourceRange() <<
Range)
15374 : (PDiag(diag::err_ovl_no_viable_subscript)
15375 << Args[0]->getType() << Args[0]->getSourceRange() <<
Range);
15382 if (Args.size() == 2) {
15385 LLoc, PDiag(diag::err_ovl_ambiguous_oper_binary)
15386 <<
"[]" << Args[0]->getType() << Args[1]->getType()
15387 << Args[0]->getSourceRange() <<
Range),
15392 PDiag(diag::err_ovl_ambiguous_subscript_call)
15393 << Args[0]->getType()
15394 << Args[0]->getSourceRange() <<
Range),
15403 PDiag(diag::err_ovl_deleted_oper)
15404 <<
"[]" << (Msg !=
nullptr)
15405 << (Msg ? Msg->
getString() : StringRef())
15406 << Args[0]->getSourceRange() <<
Range),
15413 return CreateBuiltinArraySubscriptExpr(Args[0], LLoc, Args[1], RLoc);
15420 Expr *ExecConfig,
bool IsExecConfig,
15421 bool AllowRecovery) {
15430 if (
BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
15432 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
15445 QualType objectType = op->getLHS()->getType();
15446 if (op->getOpcode() == BO_PtrMemI)
15450 Qualifiers difference = objectQuals - funcQuals;
15454 std::string qualsString = difference.
getAsString();
15455 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
15458 << (qualsString.find(
' ') == std::string::npos ? 1 : 2);
15462 Context, MemExprE, Args, resultType, valueKind, RParenLoc,
15465 if (CheckCallReturnType(proto->
getReturnType(), op->getRHS()->getBeginLoc(),
15469 if (ConvertArgumentsForCall(call, op,
nullptr, proto, Args, RParenLoc))
15472 if (CheckOtherCall(call, proto))
15475 return MaybeBindToTemporary(call);
15482 if (!AllowRecovery)
15484 std::vector<Expr *> SubExprs = {MemExprE};
15485 llvm::append_range(SubExprs, Args);
15486 return CreateRecoveryExpr(MemExprE->
getBeginLoc(), RParenLoc, SubExprs,
15489 if (isa<CXXPseudoDestructorExpr>(NakedMemExpr))
15491 RParenLoc, CurFPFeatureOverrides());
15493 UnbridgedCastsSet UnbridgedCasts;
15499 bool HadMultipleCandidates =
false;
15502 if (isa<MemberExpr>(NakedMemExpr)) {
15503 MemExpr = cast<MemberExpr>(NakedMemExpr);
15507 UnbridgedCasts.restore();
15525 TemplateArgs = &TemplateArgsBuffer;
15531 QualType ExplicitObjectType = ObjectType;
15535 if (isa<UsingShadowDecl>(
Func))
15536 Func = cast<UsingShadowDecl>(
Func)->getTargetDecl();
15538 bool HasExplicitParameter =
false;
15539 if (
const auto *M = dyn_cast<FunctionDecl>(
Func);
15540 M && M->hasCXXExplicitFunctionObjectParameter())
15541 HasExplicitParameter =
true;
15542 else if (
const auto *M = dyn_cast<FunctionTemplateDecl>(
Func);
15544 M->getTemplatedDecl()->hasCXXExplicitFunctionObjectParameter())
15545 HasExplicitParameter =
true;
15547 if (HasExplicitParameter)
15551 if (getLangOpts().MicrosoftExt && isa<CXXConstructorDecl>(
Func)) {
15552 AddOverloadCandidate(cast<CXXConstructorDecl>(
Func), I.getPair(), Args,
15555 }
else if ((Method = dyn_cast<CXXMethodDecl>(
Func))) {
15561 AddMethodCandidate(Method, I.getPair(), ActingDC, ExplicitObjectType,
15562 ObjectClassification, Args, CandidateSet,
15565 AddMethodTemplateCandidate(cast<FunctionTemplateDecl>(
Func),
15566 I.getPair(), ActingDC, TemplateArgs,
15567 ExplicitObjectType, ObjectClassification,
15568 Args, CandidateSet,
15573 HadMultipleCandidates = (CandidateSet.
size() > 1);
15577 UnbridgedCasts.restore();
15580 bool Succeeded =
false;
15584 Method = cast<CXXMethodDecl>(Best->Function);
15585 FoundDecl = Best->FoundDecl;
15586 CheckUnresolvedMemberAccess(UnresExpr, Best->FoundDecl);
15587 if (DiagnoseUseOfOverloadedDecl(Best->FoundDecl, UnresExpr->
getNameLoc()))
15595 if (Method != FoundDecl.getDecl() &&
15596 DiagnoseUseOfOverloadedDecl(Method, UnresExpr->
getNameLoc()))
15605 PDiag(diag::err_ovl_no_viable_member_function_in_call)
15612 PDiag(diag::err_ovl_ambiguous_member_call)
15617 DiagnoseUseOfDeletedFunction(
15619 CandidateSet, Best->Function, Args,
true);
15627 FixOverloadedFunctionReference(MemExprE, FoundDecl, Method);
15630 MemExprE = Res.
get();
15635 return BuildResolvedCallExpr(MemExprE, Method, LParenLoc, Args, RParenLoc,
15636 ExecConfig, IsExecConfig);
15646 assert(Method &&
"Member call to something that isn't a method?");
15659 HadMultipleCandidates, MemExpr->
getExprLoc());
15665 CurFPFeatureOverrides(), Proto->getNumParams());
15668 ExprResult ObjectArg = PerformImplicitObjectArgumentInitialization(
15669 MemExpr->
getBase(), Qualifier, FoundDecl, Method);
15674 RParenLoc, CurFPFeatureOverrides(),
15675 Proto->getNumParams());
15681 return BuildRecoveryExpr(ResultType);
15684 if (ConvertArgumentsForCall(TheCall, MemExpr, Method, Proto, Args,
15686 return BuildRecoveryExpr(ResultType);
15688 DiagnoseSentinelCalls(Method, LParenLoc, Args);
15690 if (CheckFunctionCall(Method, TheCall, Proto))
15696 if (
auto *MemE = dyn_cast<MemberExpr>(NakedMemExpr)) {
15697 if (
const EnableIfAttr *
Attr =
15698 CheckEnableIf(Method, LParenLoc, Args,
true)) {
15699 Diag(MemE->getMemberLoc(),
15700 diag::err_ovl_no_viable_member_function_in_call)
15703 diag::note_ovl_candidate_disabled_by_function_cond_attr)
15704 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
15709 if (isa<CXXConstructorDecl, CXXDestructorDecl>(CurContext) &&
15710 TheCall->getDirectCallee()->isPureVirtual()) {
15716 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
15717 << MD->
getDeclName() << isa<CXXDestructorDecl>(CurContext)
15721 if (getLangOpts().AppleKext)
15727 if (
auto *DD = dyn_cast<CXXDestructorDecl>(TheCall->getDirectCallee())) {
15729 bool CallCanBeVirtual = !MemExpr->
hasQualifier() || getLangOpts().AppleKext;
15730 CheckVirtualDtorCall(DD, MemExpr->
getBeginLoc(),
false,
15731 CallCanBeVirtual,
true,
15735 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall),
15736 TheCall->getDirectCallee());
15748 UnbridgedCastsSet UnbridgedCasts;
15752 assert(Object.get()->getType()->isRecordType() &&
15753 "Requires object type argument");
15766 if (RequireCompleteType(LParenLoc, Object.get()->getType(),
15767 diag::err_incomplete_object_call, Object.get()))
15771 LookupResult R(*
this, OpName, LParenLoc, LookupOrdinaryName);
15772 LookupQualifiedName(R,
Record->getDecl());
15773 R.suppressAccessDiagnostics();
15776 Oper != OperEnd; ++Oper) {
15777 AddMethodCandidate(Oper.getPair(), Object.get()->getType(),
15778 Object.get()->Classify(Context), Args, CandidateSet,
15790 bool IgnoreSurrogateFunctions =
false;
15791 if (CandidateSet.
size() == 1 &&
Record->getAsCXXRecordDecl()->isLambda()) {
15793 if (!Candidate.
Viable &&
15795 IgnoreSurrogateFunctions =
true;
15815 const auto &Conversions =
15816 cast<CXXRecordDecl>(
Record->getDecl())->getVisibleConversionFunctions();
15817 for (
auto I = Conversions.begin(),
E = Conversions.end();
15818 !IgnoreSurrogateFunctions && I !=
E; ++I) {
15821 if (isa<UsingShadowDecl>(
D))
15822 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
15826 if (isa<FunctionTemplateDecl>(
D))
15839 AddSurrogateCandidate(Conv, I.getPair(), ActingContext, Proto,
15840 Object.get(), Args, CandidateSet);
15845 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15858 CandidateSet.
empty()
15859 ? (PDiag(diag::err_ovl_no_oper)
15860 << Object.get()->getType() << 1
15861 << Object.get()->getSourceRange())
15862 : (PDiag(diag::err_ovl_no_viable_object_call)
15863 << Object.get()->getType() << Object.get()->getSourceRange());
15870 if (!R.isAmbiguous())
15873 PDiag(diag::err_ovl_ambiguous_object_call)
15874 << Object.get()->getType()
15875 << Object.get()->getSourceRange()),
15886 PDiag(diag::err_ovl_deleted_object_call)
15887 << Object.get()->getType() << (Msg !=
nullptr)
15888 << (Msg ? Msg->
getString() : StringRef())
15889 << Object.get()->getSourceRange()),
15895 if (Best == CandidateSet.
end())
15898 UnbridgedCasts.restore();
15900 if (Best->Function ==
nullptr) {
15904 = cast<CXXConversionDecl>(
15905 Best->Conversions[0].UserDefined.ConversionFunction);
15907 CheckMemberOperatorAccess(LParenLoc, Object.get(),
nullptr,
15909 if (DiagnoseUseOfDecl(Best->FoundDecl, LParenLoc))
15911 assert(Conv == Best->FoundDecl.getDecl() &&
15912 "Found Decl & conversion-to-functionptr should be same, right?!");
15919 ExprResult Call = BuildCXXMemberCallExpr(Object.get(), Best->FoundDecl,
15920 Conv, HadMultipleCandidates);
15921 if (
Call.isInvalid())
15925 Context,
Call.get()->getType(), CK_UserDefinedConversion,
Call.get(),
15926 nullptr,
VK_PRValue, CurFPFeatureOverrides());
15928 return BuildCallExpr(S,
Call.get(), LParenLoc, Args, RParenLoc);
15931 CheckMemberOperatorAccess(LParenLoc, Object.get(),
nullptr, Best->FoundDecl);
15936 CXXMethodDecl *Method = cast<CXXMethodDecl>(Best->Function);
15949 Obj, HadMultipleCandidates,
15956 MethodArgs.reserve(NumParams + 1);
15958 bool IsError =
false;
15965 ExprResult ObjRes = PerformImplicitObjectArgumentInitialization(
15966 Object.get(),
nullptr, Best->FoundDecl, Method);
15971 MethodArgs.push_back(Object.get());
15975 *
this, MethodArgs, Method, Args, LParenLoc);
15978 if (Proto->isVariadic()) {
15980 for (
unsigned i = NumParams, e = Args.size(); i < e; i++) {
15981 ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod,
15984 MethodArgs.push_back(Arg.
get());
15991 DiagnoseSentinelCalls(Method, LParenLoc, Args);
15999 Context, OO_Call, NewFn.
get(), MethodArgs, ResultTy, VK, RParenLoc,
16000 CurFPFeatureOverrides());
16002 if (CheckCallReturnType(Method->
getReturnType(), LParenLoc, TheCall, Method))
16005 if (CheckFunctionCall(Method, TheCall, Proto))
16008 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), Method);
16013 bool *NoArrowOperatorFound) {
16014 assert(
Base->getType()->isRecordType() &&
16015 "left-hand side must have class type");
16032 if (RequireCompleteType(
Loc,
Base->getType(),
16033 diag::err_typecheck_incomplete_tag,
Base))
16036 LookupResult R(*
this, OpName, OpLoc, LookupOrdinaryName);
16041 Oper != OperEnd; ++Oper) {
16042 AddMethodCandidate(Oper.getPair(),
Base->getType(),
Base->Classify(Context),
16047 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16058 if (CandidateSet.
empty()) {
16060 if (NoArrowOperatorFound) {
16063 *NoArrowOperatorFound =
true;
16066 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
16067 << BaseType <<
Base->getSourceRange();
16069 Diag(OpLoc, diag::note_typecheck_member_reference_suggestion)
16073 Diag(OpLoc, diag::err_ovl_no_viable_oper)
16074 <<
"operator->" <<
Base->getSourceRange();
16082 <<
"->" <<
Base->getType()
16083 <<
Base->getSourceRange()),
16091 <<
"->" << (Msg !=
nullptr)
16092 << (Msg ? Msg->
getString() : StringRef())
16093 <<
Base->getSourceRange()),
16099 CheckMemberOperatorAccess(OpLoc,
Base,
nullptr, Best->FoundDecl);
16102 CXXMethodDecl *Method = cast<CXXMethodDecl>(Best->Function);
16105 ExprResult R = InitializeExplicitObjectArgument(*
this,
Base, Method);
16111 Base,
nullptr, Best->FoundDecl, Method);
16119 Base, HadMultipleCandidates, OpLoc);
16129 ResultTy, VK, OpLoc, CurFPFeatureOverrides());
16131 if (CheckCallReturnType(Method->
getReturnType(), OpLoc, TheCall, Method))
16134 if (CheckFunctionCall(Method, TheCall,
16138 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), Method);
16150 AddNonMemberOperatorCandidates(R.
asUnresolvedSet(), Args, CandidateSet,
16153 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16166 PDiag(diag::err_ovl_no_viable_function_in_call)
16181 nullptr, HadMultipleCandidates,
16184 if (Fn.isInvalid())
16190 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
16191 ExprResult InputInit = PerformCopyInitialization(
16196 ConvArgs[ArgIdx] = InputInit.
get();
16204 Context, Fn.get(),
llvm::ArrayRef(ConvArgs, Args.size()), ResultTy, VK,
16205 LitEndLoc, UDSuffixLoc, CurFPFeatureOverrides());
16207 if (CheckCallReturnType(FD->
getReturnType(), UDSuffixLoc, UDL, FD))
16210 if (CheckFunctionCall(FD, UDL,
nullptr))
16213 return CheckForImmediateInvocation(MaybeBindToTemporary(UDL), FD);
16223 Scope *S =
nullptr;
16226 if (!MemberLookup.
empty()) {
16236 return FRS_DiagnosticIssued;
16241 return FRS_DiagnosticIssued;
16244 ExprResult FnR = CreateUnresolvedLookupExpr(
nullptr,
16248 return FRS_DiagnosticIssued;
16251 bool CandidateSetError = buildOverloadedCallSet(S, Fn, Fn,
Range,
Loc,
16253 if (CandidateSet->
empty() || CandidateSetError) {
16255 return FRS_NoViableFunction;
16263 return FRS_NoViableFunction;
16266 Loc,
nullptr, CandidateSet, &Best,
16271 return FRS_DiagnosticIssued;
16274 return FRS_Success;
16279 if (
ParenExpr *PE = dyn_cast<ParenExpr>(
E)) {
16281 FixOverloadedFunctionReference(PE->getSubExpr(),
Found, Fn);
16284 if (SubExpr.
get() == PE->getSubExpr())
16287 return new (Context)
16288 ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.
get());
16293 FixOverloadedFunctionReference(ICE->getSubExpr(),
Found, Fn);
16296 assert(Context.
hasSameType(ICE->getSubExpr()->getType(),
16298 "Implicit cast type cannot be determined from overload");
16299 assert(ICE->path_empty() &&
"fixing up hierarchy conversion?");
16300 if (SubExpr.
get() == ICE->getSubExpr())
16305 CurFPFeatureOverrides());
16308 if (
auto *GSE = dyn_cast<GenericSelectionExpr>(
E)) {
16309 if (!GSE->isResultDependent()) {
16311 FixOverloadedFunctionReference(GSE->getResultExpr(),
Found, Fn);
16314 if (SubExpr.
get() == GSE->getResultExpr())
16321 unsigned ResultIdx = GSE->getResultIndex();
16322 AssocExprs[ResultIdx] = SubExpr.
get();
16324 if (GSE->isExprPredicate())
16326 Context, GSE->getGenericLoc(), GSE->getControllingExpr(),
16327 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
16328 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
16331 Context, GSE->getGenericLoc(), GSE->getControllingType(),
16332 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
16333 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
16342 assert(UnOp->getOpcode() == UO_AddrOf &&
16343 "Can only take the address of an overloaded function");
16353 FixOverloadedFunctionReference(UnOp->getSubExpr(),
Found, Fn);
16356 if (SubExpr.
get() == UnOp->getSubExpr())
16359 if (CheckUseOfCXXMethodAsAddressOfOperand(UnOp->getBeginLoc(),
16360 SubExpr.
get(), Method))
16363 assert(isa<DeclRefExpr>(SubExpr.
get()) &&
16364 "fixed to something other than a decl ref");
16365 assert(cast<DeclRefExpr>(SubExpr.
get())->getQualifier() &&
16366 "fixed to a member ref with no nested name qualifier");
16377 (void)isCompleteType(UnOp->getOperatorLoc(), MemPtrType);
16381 UnOp->getOperatorLoc(),
false,
16382 CurFPFeatureOverrides());
16386 FixOverloadedFunctionReference(UnOp->getSubExpr(),
Found, Fn);
16389 if (SubExpr.
get() == UnOp->getSubExpr())
16392 return CreateBuiltinUnaryOp(UnOp->getOperatorLoc(), UO_AddrOf,
16399 if (ULE->hasExplicitTemplateArgs()) {
16400 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
16401 TemplateArgs = &TemplateArgsBuffer;
16406 getLangOpts().CPlusPlus && !Fn->hasCXXExplicitFunctionObjectParameter()
16411 if (
unsigned BID = Fn->getBuiltinID()) {
16419 Fn,
Type, ValueKind, ULE->getNameInfo(), ULE->getQualifierLoc(),
16420 Found.getDecl(), ULE->getTemplateKeywordLoc(), TemplateArgs);
16428 if (MemExpr->hasExplicitTemplateArgs()) {
16429 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
16430 TemplateArgs = &TemplateArgsBuffer;
16437 if (MemExpr->isImplicitAccess()) {
16438 if (cast<CXXMethodDecl>(Fn)->isStatic()) {
16440 Fn, Fn->getType(),
VK_LValue, MemExpr->getNameInfo(),
16441 MemExpr->getQualifierLoc(),
Found.getDecl(),
16442 MemExpr->getTemplateKeywordLoc(), TemplateArgs);
16447 if (MemExpr->getQualifier())
16448 Loc = MemExpr->getQualifierLoc().getBeginLoc();
16450 BuildCXXThisExpr(
Loc, MemExpr->getBaseType(),
true);
16453 Base = MemExpr->getBase();
16457 if (cast<CXXMethodDecl>(Fn)->isStatic()) {
16459 type = Fn->getType();
16465 return BuildMemberExpr(
16466 Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),
16467 MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn,
Found,
16468 true, MemExpr->getMemberNameInfo(),
16472 llvm_unreachable(
"Invalid reference to overloaded function");
16478 return FixOverloadedFunctionReference(
E.get(),
Found, Fn);
16483 if (!PartialOverloading || !
Function)
16487 if (
const auto *Proto =
16488 dyn_cast<FunctionProtoType>(
Function->getFunctionType()))
16489 if (Proto->isTemplateVariadic())
16491 if (
auto *Pattern =
Function->getTemplateInstantiationPattern())
16492 if (
const auto *Proto =
16493 dyn_cast<FunctionProtoType>(Pattern->getFunctionType()))
16494 if (Proto->isTemplateVariadic())
16507 << IsMember << Name << (Msg !=
nullptr)
16508 << (Msg ? Msg->
getString() : StringRef())
Defines the clang::ASTContext interface.
Defines the Diagnostic-related interfaces.
static bool isBooleanType(QualType Ty)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
static bool EvaluateAsBooleanCondition(const Expr *E, bool &Result, EvalInfo &Info)
static const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
static std::string getName(const CallEvent &Call)
static bool hasExplicitAttr(const VarDecl *D)
This file declares semantic analysis for CUDA constructs.
static void BuildBasePathArray(const CXXBasePath &Path, CXXCastPath &BasePathArray)
static bool isRecordType(QualType T)
static void TryUserDefinedConversion(Sema &S, QualType DestType, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt a user-defined conversion between two types (C++ [dcl.init]), which enumerates all conversion...
This file declares semantic analysis for Objective-C.
static ImplicitConversionSequence::CompareKind CompareStandardConversionSequences(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareStandardConversionSequences - Compare two standard conversion sequences to determine whether o...
static bool isNullPointerConstantForConversion(Expr *Expr, bool InOverloadResolution, ASTContext &Context)
static bool shouldSkipNotingLambdaConversionDecl(const FunctionDecl *Fn)
static const FunctionType * getConversionOpReturnTyAsFunction(CXXConversionDecl *Conv)
static bool functionHasPassObjectSizeParams(const FunctionDecl *FD)
static Comparison compareEnableIfAttrs(const Sema &S, const FunctionDecl *Cand1, const FunctionDecl *Cand2)
Compares the enable_if attributes of two FunctionDecls, for the purposes of overload resolution.
static Qualifiers CollectVRQualifiers(ASTContext &Context, Expr *ArgExpr)
CollectVRQualifiers - This routine returns Volatile/Restrict qualifiers, if any, found in visible typ...
@ ToPromotedUnderlyingType
static void AddOverloadedCallCandidate(Sema &S, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading, bool KnownValid)
Add a single candidate to the overload set.
static ExprResult FinishOverloadedCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, OverloadCandidateSet *CandidateSet, OverloadCandidateSet::iterator *Best, OverloadingResult OverloadResult, bool AllowTypoCorrection)
FinishOverloadedCallExpr - given an OverloadCandidateSet, builds and returns the completed call expre...
static bool isQualificationConversionStep(QualType FromType, QualType ToType, bool CStyle, bool IsTopLevel, bool &PreviousToQualsIncludeConst, bool &ObjCLifetimeConversion, const ASTContext &Ctx)
Perform a single iteration of the loop for checking if a qualification conversion is valid.
static ImplicitConversionSequence::CompareKind CompareQualificationConversions(Sema &S, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareQualificationConversions - Compares two standard conversion sequences to determine whether the...
static void dropPointerConversion(StandardConversionSequence &SCS)
dropPointerConversions - If the given standard conversion sequence involves any pointer conversions,...
static SourceLocation GetLocationForCandidate(const OverloadCandidate *Cand)
static void DiagnoseArityMismatch(Sema &S, NamedDecl *Found, Decl *D, unsigned NumFormalArgs, bool IsAddressOf=false)
General arity mismatch diagnosis over a candidate in a candidate set.
static const Expr * IgnoreNarrowingConversion(ASTContext &Ctx, const Expr *Converted)
Skip any implicit casts which could be either part of a narrowing conversion or after one in an impli...
static bool allowAmbiguity(ASTContext &Context, const FunctionDecl *F1, const FunctionDecl *F2)
static unsigned RankDeductionFailure(const DeductionFailureInfo &DFI)
static QualType BuildSimilarlyQualifiedPointerType(const Type *FromPtr, QualType ToPointee, QualType ToType, ASTContext &Context, bool StripObjCLifetime=false)
BuildSimilarlyQualifiedPointerType - In a pointer conversion from the pointer type FromPtr to a point...
static void forAllQualifierCombinations(QualifiersAndAtomic Quals, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static bool FindConversionForRefInit(Sema &S, ImplicitConversionSequence &ICS, QualType DeclType, SourceLocation DeclLoc, Expr *Init, QualType T2, bool AllowRvalues, bool AllowExplicit)
Look for a user-defined conversion to a value reference-compatible with DeclType.
static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static Expr * GetExplicitObjectExpr(Sema &S, Expr *Obj, const FunctionDecl *Fun)
static bool hasDeprecatedStringLiteralToCharPtrConversion(const ImplicitConversionSequence &ICS)
static ExprResult CheckConvertedConstantExpression(Sema &S, Expr *From, QualType T, APValue &Value, Sema::CCEKind CCE, bool RequireInt, NamedDecl *Dest)
CheckConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static void AddBuiltinAssignmentOperatorCandidates(Sema &S, QualType T, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
Helper function for AddBuiltinOperatorCandidates() that adds the volatile- and non-volatile-qualified...
static bool CheckConvertedConstantConversions(Sema &S, StandardConversionSequence &SCS)
Check that the specified conversion is permitted in a converted constant expression,...
static void NoteBuiltinOperatorCandidate(Sema &S, StringRef Opc, SourceLocation OpLoc, OverloadCandidate *Cand)
static ImplicitConversionSequence::CompareKind compareConversionFunctions(Sema &S, FunctionDecl *Function1, FunctionDecl *Function2)
Compare the user-defined conversion functions or constructors of two user-defined conversion sequence...
static void forAllQualifierCombinationsImpl(QualifiersAndAtomic Available, QualifiersAndAtomic Applied, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static const char * GetImplicitConversionName(ImplicitConversionKind Kind)
GetImplicitConversionName - Return the name of this kind of implicit conversion.
static bool checkAddressOfFunctionIsAvailable(Sema &S, const FunctionDecl *FD, bool Complain, bool InOverloadResolution, SourceLocation Loc)
Returns true if we can take the address of the function.
static ImplicitConversionSequence::CompareKind CompareDerivedToBaseConversions(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareDerivedToBaseConversions - Compares two standard conversion sequences to determine whether the...
static bool convertArgsForAvailabilityChecks(Sema &S, FunctionDecl *Function, Expr *ThisArg, SourceLocation CallLoc, ArrayRef< Expr * > Args, Sema::SFINAETrap &Trap, bool MissingImplicitThis, Expr *&ConvertedThis, SmallVectorImpl< Expr * > &ConvertedArgs)
static TemplateDecl * getDescribedTemplate(Decl *Templated)
static void CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand, ArrayRef< Expr * > Args, OverloadCandidateSet::CandidateSetKind CSK)
CompleteNonViableCandidate - Normally, overload resolution only computes up to the first bad conversi...
static QualType AdoptQualifiers(ASTContext &Context, QualType T, Qualifiers Qs)
Adopt the given qualifiers for the given type.
static void NoteAmbiguousUserConversions(Sema &S, SourceLocation OpLoc, OverloadCandidate *Cand)
static bool CheckArityMismatch(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool IsAddressOf=false)
Additional arity mismatch diagnosis specific to a function overload candidates.
static ImplicitConversionSequence::CompareKind compareStandardConversionSubsets(ASTContext &Context, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
static bool IsVectorConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, ImplicitConversionKind &ElConv, Expr *From, bool InOverloadResolution, bool CStyle)
Determine whether the conversion from FromType to ToType is a valid vector conversion.
static ImplicitConversionSequence TryContextuallyConvertToObjCPointer(Sema &S, Expr *From)
TryContextuallyConvertToObjCPointer - Attempt to contextually convert the expression From to an Objec...
static ExprResult CreateFunctionRefExpr(Sema &S, FunctionDecl *Fn, NamedDecl *FoundDecl, const Expr *Base, bool HadMultipleCandidates, SourceLocation Loc=SourceLocation(), const DeclarationNameLoc &LocInfo=DeclarationNameLoc())
A convenience routine for creating a decayed reference to a function.
static std::optional< QualType > getImplicitObjectParamType(ASTContext &Context, const FunctionDecl *F)
Compute the type of the implicit object parameter for the given function, if any.
static bool checkPlaceholderForOverload(Sema &S, Expr *&E, UnbridgedCastsSet *unbridgedCasts=nullptr)
checkPlaceholderForOverload - Do any interesting placeholder-like preprocessing on the given expressi...
static FixedEnumPromotion getFixedEnumPromtion(Sema &S, const StandardConversionSequence &SCS)
Returns kind of fixed enum promotion the SCS uses.
static bool isAllowableExplicitConversion(Sema &S, QualType ConvType, QualType ToType, bool AllowObjCPointerConversion)
Determine whether this is an allowable conversion from the result of an explicit conversion operator ...
static bool isNonViableMultiVersionOverload(FunctionDecl *FD)
static ExprResult BuildConvertedConstantExpression(Sema &S, Expr *From, QualType T, Sema::CCEKind CCE, NamedDecl *Dest, APValue &PreNarrowingValue)
BuildConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static bool FunctionsCorrespond(ASTContext &Ctx, const FunctionDecl *X, const FunctionDecl *Y)
static ImplicitConversionSequence TryImplicitConversion(Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion, bool AllowObjCConversionOnExplicit)
TryImplicitConversion - Attempt to perform an implicit conversion from the given expression (Expr) to...
static bool IsVectorElementConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, Expr *From)
static ImplicitConversionSequence TryListConversion(Sema &S, InitListExpr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion)
TryListConversion - Try to copy-initialize a value of type ToType from the initializer list From.
static bool IsOverloadOrOverrideImpl(Sema &SemaRef, FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs, bool UseOverrideRules=false)
static QualType withoutUnaligned(ASTContext &Ctx, QualType T)
static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand)
CUDA: diagnose an invalid call across targets.
static void MaybeDiagnoseAmbiguousConstraints(Sema &S, ArrayRef< OverloadCandidate > Cands)
static bool diagnoseNoViableConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, UnresolvedSetImpl &ExplicitConversions)
static ImplicitConversionSequence TryContextuallyConvertToBool(Sema &S, Expr *From)
TryContextuallyConvertToBool - Attempt to contextually convert the expression From to bool (C++0x [co...
static ImplicitConversionSequence TryObjectArgumentInitialization(Sema &S, SourceLocation Loc, QualType FromType, Expr::Classification FromClassification, CXXMethodDecl *Method, const CXXRecordDecl *ActingContext, bool InOverloadResolution=false, QualType ExplicitParameterType=QualType(), bool SuppressUserConversion=false)
TryObjectArgumentInitialization - Try to initialize the object parameter of the given member function...
static bool recordConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, DeclAccessPair &Found)
static ImplicitConversionSequence::CompareKind CompareImplicitConversionSequences(Sema &S, SourceLocation Loc, const ImplicitConversionSequence &ICS1, const ImplicitConversionSequence &ICS2)
CompareImplicitConversionSequences - Compare two implicit conversion sequences to determine whether o...
static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool TakingCandidateAddress, LangAS CtorDestAS=LangAS::Default)
Generates a 'note' diagnostic for an overload candidate.
static ImplicitConversionSequence TryCopyInitialization(Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion, bool AllowExplicit=false)
TryCopyInitialization - Try to copy-initialize a value of type ToType from the expression From.
static ExprResult diagnoseAmbiguousConversion(Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter, QualType T, UnresolvedSetImpl &ViableConversions)
static void markUnaddressableCandidatesUnviable(Sema &S, OverloadCandidateSet &CS)
static QualType GetExplicitObjectType(Sema &S, const Expr *MemExprE)
static bool sameFunctionParameterTypeLists(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2)
We're allowed to use constraints partial ordering only if the candidates have the same parameter type...
static QualType AdjustAddressSpaceForBuiltinOperandType(Sema &S, QualType T, Expr *Arg)
Helper function for adjusting address spaces for the pointer or reference operands of builtin operato...
static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand)
static bool DiagnoseTwoPhaseLookup(Sema &SemaRef, SourceLocation FnLoc, const CXXScopeSpec &SS, LookupResult &R, OverloadCandidateSet::CandidateSetKind CSK, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, CXXRecordDecl **FoundInClass=nullptr)
Attempt to recover from an ill-formed use of a non-dependent name in a template, where the non-depend...
static bool isBetterReferenceBindingKind(const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
Determine whether one of the given reference bindings is better than the other based on what kind of ...
static bool canBeDeclaredInNamespace(const DeclarationName &Name)
Determine whether a declaration with the specified name could be moved into a different namespace.
static ExprResult finishContextualImplicitConversion(Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter)
static bool IsStandardConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle, bool AllowObjCWritebackConversion)
IsStandardConversion - Determines whether there is a standard conversion sequence (C++ [conv],...
static bool DiagnoseTwoPhaseOperatorLookup(Sema &SemaRef, OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args)
Attempt to recover from ill-formed use of a non-dependent operator in a template, where the non-depen...
static bool isNonTrivialObjCLifetimeConversion(Qualifiers FromQuals, Qualifiers ToQuals)
Determine whether the lifetime conversion between the two given qualifiers sets is nontrivial.
static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, unsigned I, bool TakingCandidateAddress)
static bool completeFunctionType(Sema &S, FunctionDecl *FD, SourceLocation Loc, bool Complain=true)
static bool shouldAddReversedEqEq(Sema &S, SourceLocation OpLoc, Expr *FirstOperand, FunctionDecl *EqFD)
static bool isFunctionAlwaysEnabled(const ASTContext &Ctx, const FunctionDecl *FD)
static bool PrepareExplicitObjectArgument(Sema &S, CXXMethodDecl *Method, Expr *Object, MultiExprArg &Args, SmallVectorImpl< Expr * > &NewArgs)
static OverloadingResult IsInitializerListConstructorConversion(Sema &S, Expr *From, QualType ToType, CXXRecordDecl *To, UserDefinedConversionSequence &User, OverloadCandidateSet &CandidateSet, bool AllowExplicit)
static bool checkAddressOfCandidateIsAvailable(Sema &S, const FunctionDecl *FD)
static bool IsFloatingPointConversion(Sema &S, QualType FromType, QualType ToType)
Determine whether the conversion from FromType to ToType is a valid floating point conversion.
static bool isFirstArgumentCompatibleWithType(ASTContext &Context, CXXConstructorDecl *Constructor, QualType Type)
static Comparison isBetterMultiversionCandidate(const OverloadCandidate &Cand1, const OverloadCandidate &Cand2)
static void NoteImplicitDeductionGuide(Sema &S, FunctionDecl *Fn)
static void collectViableConversionCandidates(Sema &SemaRef, Expr *From, QualType ToType, UnresolvedSetImpl &ViableConversions, OverloadCandidateSet &CandidateSet)
static ImplicitConversionSequence TryReferenceInit(Sema &S, Expr *Init, QualType DeclType, SourceLocation DeclLoc, bool SuppressUserConversions, bool AllowExplicit)
Compute an implicit conversion sequence for reference initialization.
static bool isNonDependentlyExplicit(FunctionTemplateDecl *FTD)
Determine whether a given function template has a simple explicit specifier or a non-value-dependent ...
static bool checkArgPlaceholdersForOverload(Sema &S, MultiExprArg Args, UnbridgedCastsSet &unbridged)
checkArgPlaceholdersForOverload - Check a set of call operands for placeholders.
static QualType makeQualifiedLValueReferenceType(QualType Base, QualifiersAndAtomic Quals, Sema &S)
static QualType chooseRecoveryType(OverloadCandidateSet &CS, OverloadCandidateSet::iterator *Best)
static void NoteSurrogateCandidate(Sema &S, OverloadCandidate *Cand)
static ExprResult BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MutableArrayRef< Expr * > Args, SourceLocation RParenLoc, bool EmptyLookup, bool AllowTypoCorrection)
Attempts to recover from a call where no functions were found.
static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand)
static bool diagnoseDiagnoseIfAttrsWith(Sema &S, const NamedDecl *ND, bool ArgDependent, SourceLocation Loc, CheckFn &&IsSuccessful)
static OverloadingResult IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType, UserDefinedConversionSequence &User, OverloadCandidateSet &Conversions, AllowedExplicit AllowExplicit, bool AllowObjCConversionOnExplicit)
Determines whether there is a user-defined conversion sequence (C++ [over.ics.user]) that converts ex...
static bool IsAcceptableNonMemberOperatorCandidate(ASTContext &Context, FunctionDecl *Fn, ArrayRef< Expr * > Args)
IsAcceptableNonMemberOperatorCandidate - Determine whether Fn is an acceptable non-member overloaded ...
static void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, DeductionFailureInfo &DeductionFailure, unsigned NumArgs, bool TakingCandidateAddress)
Diagnose a failed template-argument deduction.
static bool IsTransparentUnionStandardConversion(Sema &S, Expr *From, QualType &ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static const FunctionProtoType * tryGetFunctionProtoType(QualType FromType)
Attempts to get the FunctionProtoType from a Type.
static bool PrepareArgumentsForCallToObjectOfClassType(Sema &S, SmallVectorImpl< Expr * > &MethodArgs, CXXMethodDecl *Method, MultiExprArg Args, SourceLocation LParenLoc)
static TemplateDeductionResult DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch, bool PartialOrdering, PackFold PackFold, bool *HasDeducedAnyParam)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
A class for storing results from argument-dependent lookup.
void erase(NamedDecl *D)
Removes any data associated with a given decl.
llvm::mapped_iterator< decltype(Decls)::iterator, select_second > iterator
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible SVE vector types, false otherwise.
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
unsigned getIntWidth(QualType T) const
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
QualType getMemberPointerType(QualType T, const Type *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
DeclarationNameTable DeclarationNames
QualType getRecordType(const RecordDecl *Decl) const
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool mergeExtParameterInfo(const FunctionProtoType *FirstFnType, const FunctionProtoType *SecondFnType, bool &CanUseFirst, bool &CanUseSecond, SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &NewParamInfos)
This function merges the ExtParameterInfo lists of two functions.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod, bool IsBuiltin=false) const
Retrieves the default calling convention for the current target.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
Builtin::Context & BuiltinInfo
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
QualType removePtrSizeAddrSpace(QualType T) const
Remove the existing address space on the type if it is a pointer size address space and return the ty...
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
bool canBindObjCObjectType(QualType To, QualType From)
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
const TargetInfo * getAuxTargetInfo() const
CanQualType UnsignedLongTy
bool hasAnyFunctionEffects() const
QualType getRestrictType(QualType T) const
Return the uniqued reference to the type for a restrict qualified type.
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
CanQualType BoundMemberTy
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
QualType getObjCIdType() const
Represents the Objective-CC id type.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
bool isSameTemplateParameterList(const TemplateParameterList *X, const TemplateParameterList *Y) const
Determine whether two template parameter lists are similar enough that they may be used in declaratio...
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
QualType getVolatileType(QualType T) const
Return the uniqued reference to the type for a volatile qualified type.
CanQualType UnsignedLongLongTy
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
CanQualType UnsignedShortTy
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
bool hasSimilarType(QualType T1, QualType T2) const
Determine if two types are similar, according to the C++ rules.
bool areCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an SVE builtin and a VectorType that is a fixed-length representat...
QualType getCVRQualifiedType(QualType T, unsigned CVR) const
Return a type with additional const, volatile, or restrict qualifiers.
bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)
Return true if the given vector types are of the same unqualified type or if they are equivalent to t...
const TargetInfo & getTargetInfo() const
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
bool UnwrapSimilarTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const
Attempt to unwrap two types that may be similar (C++ [conv.qual]).
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
QualType getConstantArrayType(const ASTContext &Ctx) const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
Attr - This represents one attribute.
A builtin binary operation expression such as "x + y" or "x <= y".
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
StringRef getOpcodeStr() const
bool isCompoundAssignmentOp() const
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
This class is used for builtin types like 'int'.
bool isDirectlyAddressable(unsigned ID) const
Determines whether this builtin can have its address taken with no special action required.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
bool isExplicit() const
Return true if the declaration is already resolved to be explicit.
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Represents a call to a member function that may be written either with member call syntax (e....
static CXXMemberCallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this method.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
QualType getThisType() const
Return the type of the this pointer.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
Qualifiers getMethodQualifiers() const
QualType getFunctionObjectParameterType() const
static CXXOperatorCallExpr * Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation OperatorLoc, FPOptionsOverride FPFeatures, ADLCallKind UsesADL=NotADL)
Represents a C++ struct/union/class.
bool isLambda() const
Determine whether this class describes a lambda function object.
llvm::iterator_range< conversion_iterator > getVisibleConversionFunctions() const
Get all conversion functions visible in current class, including conversion function templates.
bool hasDefinition() const
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
A rewritten comparison expression that was originally written using operator syntax.
Represents a C++ nested-name-specifier or a global scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
void markDependentForPostponedNameLookup()
Used by Sema to implement MSVC-compatible delayed name lookup.
static CallExpr * CreateTemporary(void *Mem, Expr *Fn, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, ADLCallKind UsesADL=NotADL)
Create a temporary call expression with no arguments in the memory pointed to by Mem.
bool isAtLeastAsQualifiedAs(CanQual< T > Other, const ASTContext &Ctx) const
Determines whether this canonical type is at least as qualified as the Other canonical type.
static CanQual< Type > CreateUnsafe(QualType Other)
Builds a canonical type from a QualType.
CanProxy< U > castAs() const
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.
bool isVolatileQualified() const
const ComparisonCategoryInfo * lookupInfoForType(QualType Ty) const
bool isPartial() const
True iff the comparison is not totally ordered.
bool isStrong() const
True iff the comparison is "strong".
Complex values, per C99 6.2.5p11.
QualType getElementType() const
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
Represents the canonical version of C arrays with a specified constant size.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
A reference to a declared variable, function, enum, etc.
void setHadMultipleCandidates(bool V=true)
Sets the flag telling whether this expression refers to a function that was resolved from an overload...
Decl - This represents one declaration (or definition), e.g.
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
unsigned getTemplateDepth() const
Determine the number of levels of template parameter surrounding this declaration.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
specific_attr_iterator< T > specific_attr_end() const
specific_attr_iterator< T > specific_attr_begin() const
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
DeclarationNameLoc - Additional source/type location info for a declaration name.
The name of a declaration.
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
SourceLocation getBeginLoc() const LLVM_READONLY
Expr * getTrailingRequiresClause()
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void overloadCandidatesShown(unsigned N)
Call this after showing N overload candidates.
unsigned getNumOverloadCandidatesToShow() const
When a call or operator fails, print out up to this many candidate overloads as suggestions.
OverloadsShown getShowOverloads() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
RAII object that enters a new expression evaluation context.
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
EnumDecl * getDecl() const
Store information needed for an explicit specifier.
bool isExplicit() const
Determine whether this specifier is known to correspond to an explicit declaration.
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(FunctionDecl *Function)
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
The return type of classify().
static Classification makeSimpleLValue()
Create a simple, modifiable lvalue.
This represents one expression.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
bool isIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
ExtVectorType - Extended vector type.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
const ParmVarDecl * getParamDecl(unsigned i) const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
bool hasCXXExplicitFunctionObjectParameter() const
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
param_iterator param_begin()
bool isVariadic() const
Whether this function is variadic.
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
bool isDeleted() const
Whether this function has been deleted.
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
unsigned getNumNonObjectParams() const
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
bool isDefaulted() const
Whether this function is defaulted.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isTargetMultiVersionDefault() const
True if this function is the default version of a multiversioned dispatch function as a part of the t...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
unsigned getNumParams() const
Qualifiers getMethodQuals() const
QualType getParamType(unsigned i) const
bool isVariadic() const
Whether this function prototype is variadic.
ArrayRef< QualType > param_types() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
A class which abstracts out some details necessary for making a call.
ExtInfo withNoReturn(bool noReturn) const
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
CallingConv getCallConv() const
QualType getReturnType() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
One of these records is kept for each identifier that is lexed.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
void dump() const
dump - Print this implicit conversion sequence to standard error.
bool isUserDefined() const
@ StaticObjectArgumentConversion
StandardConversionSequence Standard
When ConversionKind == StandardConversion, provides the details of the standard conversion sequence.
void setBad(BadConversionSequence::FailureKind Failure, Expr *FromExpr, QualType ToType)
Sets this sequence as a bad conversion for an explicit argument.
UserDefinedConversionSequence UserDefined
When ConversionKind == UserDefinedConversion, provides the details of the user-defined conversion seq...
static ImplicitConversionSequence getNullptrToBool(QualType SourceType, QualType DestType, bool NeedLValToRVal)
Form an "implicit" conversion sequence from nullptr_t to bool, for a direct-initialization of a bool ...
AmbiguousConversionSequence Ambiguous
When ConversionKind == AmbiguousConversion, provides the details of the ambiguous conversion.
bool hasInitializerListContainerType() const
unsigned getKindRank() const
Return a ranking of the implicit conversion sequence kind, where smaller ranks represent better conve...
bool isInitializerListOfIncompleteArray() const
BadConversionSequence Bad
When ConversionKind == BadConversion, provides the details of the bad conversion.
QualType getInitializerListContainerType() const
void DiagnoseAmbiguousConversion(Sema &S, SourceLocation CaretLoc, const PartialDiagnostic &PDiag) const
Diagnoses an ambiguous conversion.
Describes an C or C++ initializer list.
bool hasDesignatedInit() const
Determine whether this initializer list contains a designated initializer.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
const Expr * getInit(unsigned Init) const
SourceLocation getEndLoc() const LLVM_READONLY
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeTemplateParameter(QualType T, NonTypeTemplateParmDecl *Param)
Create the initialization entity for a template parameter.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
An lvalue reference type, per C++11 [dcl.ref].
bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const
Represents the results of name lookup.
void addAllDecls(const LookupResult &Other)
Add all the declarations from another set of lookup results.
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
DeclClass * getAsSingle() const
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
bool empty() const
Return true if no decls were found.
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
SourceLocation getNameLoc() const
Gets the location of the identifier.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
void suppressAccessDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup due to access control violat...
const UnresolvedSetImpl & asUnresolvedSet() const
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
DeclarationName getLookupName() const
Gets the name to look up.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
SourceLocation getMemberLoc() const
getMemberLoc - Return the location of the "member", in X->F, it is the location of 'F'.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
bool hasQualifier() const
Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...
bool performsVirtualDispatch(const LangOptions &LO) const
Returns true if virtual dispatch is performed.
NestedNameSpecifier * getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getExprLoc() const LLVM_READONLY
DeclAccessPair getFoundDecl() const
Retrieves the declaration found by lookup.
A pointer to member type per C++ 8.3.3 - Pointers to members.
QualType getPointeeType() const
const Type * getClass() const
Describes a module or submodule.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
This represents a decl that may have a name.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents an ObjC class declaration.
Interfaces are the core concept in Objective-C for object oriented design.
ObjCMethodDecl - Represents an instance or class method declaration.
ArrayRef< ParmVarDecl * > parameters() const
unsigned param_size() const
Represents a pointer to an Objective C object.
bool isSpecialized() const
Whether this type is specialized, meaning that it has type arguments.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
void clear(CandidateSetKind CSK)
Clear out all of the candidates.
bool isNewCandidate(Decl *F, OverloadCandidateParamOrder PO=OverloadCandidateParamOrder::Normal)
Determine when this overload candidate will be new to the overload set.
ConversionSequenceList allocateConversionSequences(unsigned NumConversions)
Allocate storage for conversion sequences for NumConversions conversions.
OperatorRewriteInfo getRewriteInfo() const
@ CSK_AddressOfOverloadSet
C++ [over.match.call.general] Resolve a call through the address of an overload set.
@ CSK_InitByConstructor
C++ [over.match.ctor], [over.match.list] Initialization of an object of class type by constructor,...
@ CSK_InitByUserDefinedConversion
C++ [over.match.copy]: Copy-initialization of an object of class type by user-defined conversion.
@ CSK_Normal
Normal lookup.
@ CSK_Operator
C++ [over.match.oper]: Lookup of operator function candidates in a call using operator syntax.
SmallVectorImpl< OverloadCandidate >::iterator iterator
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
bool shouldDeferDiags(Sema &S, ArrayRef< Expr * > Args, SourceLocation OpLoc)
Whether diagnostics should be deferred.
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
void exclude(Decl *F)
Exclude a function from being considered by overload resolution.
SourceLocation getLocation() const
OverloadCandidate & addCandidate(unsigned NumConversions=0, ConversionSequenceList Conversions={})
Add a new candidate with NumConversions conversion sequence slots to the overload set.
CandidateSetKind getKind() const
SmallVector< OverloadCandidate *, 32 > CompleteCandidates(Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, SourceLocation OpLoc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
NestedNameSpecifier * getQualifier() const
Fetches the nested-name qualifier, if one was given.
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
SourceLocation getNameLoc() const
Gets the location of the name.
decls_iterator decls_begin() const
unsigned getNumDecls() const
Gets the number of declarations in the unresolved set.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
decls_iterator decls_end() const
DeclarationName getName() const
Gets the name looked up.
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
ParenExpr - This represents a parenthesized expression, e.g.
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
void addConst()
Add the const type qualifier to this QualType.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
bool isMoreQualifiedThan(QualType Other, const ASTContext &Ctx) const
Determine whether this type is more qualified than the other given type, requiring exact equality for...
bool isConstQualified() const
Determine whether this type is const-qualified.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualType apply(const ASTContext &Context, QualType QT) const
Apply the collected qualifiers to the given type.
QualifiersAndAtomic withVolatile()
QualifiersAndAtomic withAtomic()
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
bool hasOnlyConst() const
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
void removeObjCLifetime()
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
void removeAddressSpace()
void setAddressSpace(LangAS space)
bool hasObjCGCAttr() const
ObjCLifetime getObjCLifetime() const
std::string getAsString() const
LangAS getAddressSpace() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
field_range fields() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Scope - A scope is a transient data structure that is used while parsing the program.
Smart pointer class that efficiently represents Objective-C method names.
unsigned getNumArgs() const
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
bool IsAllowedCall(const FunctionDecl *Caller, const FunctionDecl *Callee)
Determines whether Caller may invoke Callee, based on their CUDA host/device attributes.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
bool inferTargetForImplicitSpecialMember(CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, CXXMethodDecl *MemberDecl, bool ConstRHS, bool Diagnose)
Given a implicit special member, infer its CUDA target from the calls it needs to make to underlying ...
static bool isImplicitHostDeviceFunction(const FunctionDecl *D)
void EraseUnwantedMatches(const FunctionDecl *Caller, llvm::SmallVectorImpl< std::pair< DeclAccessPair, FunctionDecl * > > &Matches)
Finds a function in Matches with highest calling priority from Caller context and erases all function...
CUDAFunctionPreference IdentifyPreference(const FunctionDecl *Caller, const FunctionDecl *Callee)
Identifies relative preference of a given Caller/Callee combination, based on their host/device attri...
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
Expr * stripARCUnbridgedCast(Expr *e)
stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast type, remove the placeholder cast.
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
virtual SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for one of the candidate conversions.
virtual SemaDiagnosticBuilder diagnoseNoMatch(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic complaining that the expression does not have integral or enumeration type.
virtual SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for the explicit conversion function.
virtual SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when the only matching conversion function is explicit.
virtual SemaDiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when we picked a conversion function (for cases when we are not allowed to pick a ...
virtual SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when there are multiple possible conversion functions.
virtual bool match(QualType T)=0
Determine whether the specified type is a valid destination type for this conversion.
virtual SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when the expression has incomplete class type.
For a defaulted function, the kind of defaulted function that it is.
bool isSpecialMember() const
bool isComparison() const
CXXSpecialMemberKind asSpecialMember() const
RAII class to control scope of DeferDiags.
bool match(QualType T) override
Match an integral or (possibly scoped) enumeration type.
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Sema - This implements semantic analysis and AST building for C.
ExprResult PerformImplicitObjectArgumentInitialization(Expr *From, NestedNameSpecifier *Qualifier, NamedDecl *FoundDecl, CXXMethodDecl *Method)
PerformObjectArgumentInitialization - Perform initialization of the implicit object parameter for the...
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function, const Expr *ThisArg, ArrayRef< const Expr * > Args, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any non-ArgDependent DiagnoseIf...
ExprResult PerformContextuallyConvertToObjCPointer(Expr *From)
PerformContextuallyConvertToObjCPointer - Perform a contextual conversion of the expression From to a...
bool buildOverloadedCallSet(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, MultiExprArg Args, SourceLocation RParenLoc, OverloadCandidateSet *CandidateSet, ExprResult *Result)
Constructs and populates an OverloadedCandidateSet from the given function.
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr, TypoExpr **Out=nullptr)
Diagnose an empty lookup.
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
ExprResult BuildLiteralOperatorCall(LookupResult &R, DeclarationNameInfo &SuffixInfo, ArrayRef< Expr * > Args, SourceLocation LitEndLoc, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to a literal operator descri...
bool IsStringInit(Expr *Init, const ArrayType *AT)
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
void AddConversionCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true, bool HasMatchedPackOnParmToNonPackOnArg=false)
AddConversionCandidate - Add a C++ conversion function as a candidate in the candidate set (C++ [over...
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
void AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
Adds a conversion function template specialization candidate to the overload set, using template argu...
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
void AddBuiltinCandidate(QualType *ParamTys, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool IsAssignmentOperator=false, unsigned NumContextualBoolArguments=0)
AddBuiltinCandidate - Add a candidate for a built-in operator.
void AddArgumentDependentLookupCandidates(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, TemplateArgumentListInfo *ExplicitTemplateArgs, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add function candidates found via argument-dependent lookup to the set of overloading candidates.
ExprResult EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue)
EvaluateConvertedConstantExpression - Evaluate an Expression That is a converted constant expression ...
FPOptionsOverride CurFPFeatureOverrides()
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool HasMatchedPackOnParmToNonPackOnArg=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
DiagnosticsEngine & getDiagnostics() const
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
bool isObjCPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType, bool &IncompatibleObjC)
isObjCPointerConversion - Determines whether this is an Objective-C pointer conversion.
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
bool FunctionParamTypesAreEqual(ArrayRef< QualType > Old, ArrayRef< QualType > New, unsigned *ArgPos=nullptr, bool Reversed=false)
FunctionParamTypesAreEqual - This routine checks two function proto types for equality of their param...
ASTContext & getASTContext() const
UnresolvedSetIterator getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd, TemplateSpecCandidateSet &FailedCandidates, SourceLocation Loc, const PartialDiagnostic &NoneDiag, const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag, bool Complain=true, QualType TargetType=QualType())
Retrieve the most specialized of the given function template specializations.
bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType)
IsIntegralPromotion - Determines whether the conversion from the expression From (whose potentially-a...
bool IsFloatingPointPromotion(QualType FromType, QualType ToType)
IsFloatingPointPromotion - Determines whether the conversion from FromType to ToType is a floating po...
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction, const FunctionDecl *NewFunction, unsigned *ArgPos=nullptr, bool Reversed=false)
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr, const SourceRange &, DeclAccessPair FoundDecl)
QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType)
bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType, bool &IncompatibleObjC)
IsPointerConversion - Determines whether the conversion of the expression From, which has the (possib...
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
void DiagnoseUseOfDeletedFunction(SourceLocation Loc, SourceRange Range, DeclarationName Name, OverloadCandidateSet &CandidateSet, FunctionDecl *Fn, MultiExprArg Args, bool IsMember=false)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool IsComplexPromotion(QualType FromType, QualType ToType)
Determine if a conversion is a complex promotion.
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
bool IsBlockPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc, ArrayRef< Expr * > Args, AssociatedNamespaceSet &AssociatedNamespaces, AssociatedClassSet &AssociatedClasses)
Find the associated classes and namespaces for argument-dependent lookup for a call with the given se...
void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, OverloadCandidateParamOrder PO={})
Add a C++ member function template as a candidate to the candidate set, using template argument deduc...
bool isSameOrCompatibleFunctionType(QualType Param, QualType Arg)
Compare types for equality with respect to possibly compatible function types (noreturn adjustment,...
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
bool CheckMemberPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess)
CheckMemberPointerConversion - Check the member pointer conversion from the expression From to the ty...
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
const LangOptions & getLangOpts() const
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A, const NamedDecl *B)
Determine if A and B are equivalent internal linkage declarations from different modules,...
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult BuildSynthesizedThreeWayComparison(SourceLocation OpLoc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, FunctionDecl *DefaultedFn)
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
const LangOptions & LangOpts
bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType)
IsMemberPointerConversion - Determines whether the conversion of the expression From,...
ExprResult BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef< Expr * > Arg, SourceLocation RParenLoc, Expr *Config=nullptr, bool IsExecConfig=false, ADLCallKind UsesADL=ADLCallKind::NotADL)
BuildResolvedCallExpr - Build a call to a resolved expression, i.e.
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any ArgDependent DiagnoseIfAttr...
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
bool AreConstraintExpressionsEqual(const NamedDecl *Old, const Expr *OldConstr, const TemplateCompareNewDeclInfo &New, const Expr *NewConstr)
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false)
Returns the more specialized function template according to the rules of function template partial or...
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add the overload candidates named by callee and/or found by argument dependent lookup to the given ov...
bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(NamedDecl *D1, ArrayRef< const Expr * > AC1, NamedDecl *D2, ArrayRef< const Expr * > AC2)
If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...
ExprResult DefaultLvalueConversion(Expr *E)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
void NoteOverloadCandidate(const NamedDecl *Found, const FunctionDecl *Fn, OverloadCandidateRewriteKind RewriteKind=OverloadCandidateRewriteKind(), QualType DestType=QualType(), bool TakingAddress=false)
bool DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType)
FunctionDecl * resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult)
Given an expression that refers to an overloaded function, try to resolve that function to a single f...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ Compatible
Compatible - the types are compatible according to the standard.
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
EnableIfAttr * CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc, ArrayRef< Expr * > Args, bool MissingImplicitThis=false)
Check the enable_if expressions on the given function.
ExprResult CreateUnresolvedLookupExpr(CXXRecordDecl *NamingClass, NestedNameSpecifierLoc NNSLoc, DeclarationNameInfo DNI, const UnresolvedSetImpl &Fns, bool PerformADL=true)
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversion=false, OverloadCandidateParamOrder PO={})
AddMethodCandidate - Adds a named decl (which is some kind of method) as a method candidate to the gi...
void diagnoseEquivalentInternalLinkageDeclarations(SourceLocation Loc, const NamedDecl *D, ArrayRef< const NamedDecl * > Equiv)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
bool resolveAndFixAddressOfSingleOverloadCandidate(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false)
Given an overloaded function, tries to turn it into a non-overloaded function reference using resolve...
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
bool anyAltivecTypes(QualType srcType, QualType destType)
bool isLaxVectorConversion(QualType srcType, QualType destType)
Is this a legal conversion between two types, one of which is known to be a vector type?
ExprResult BuildOverloadedCallExpr(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, bool AllowTypoCorrection=true, bool CalleesAddressIsTaken=false)
BuildOverloadedCallExpr - Given the call expression that calls Fn (which eventually refers to the dec...
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
ExprResult BuildCallToObjectOfClassType(Scope *S, Expr *Object, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc)
BuildCallToObjectOfClassType - Build a call to an object of class type (C++ [over....
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
bool CanPerformAggregateInitializationForOverloadResolution(const InitializedEntity &Entity, InitListExpr *From)
Determine whether we can perform aggregate initialization for the purposes of overload resolution.
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
CCEKind
Contexts in which a converted constant expression is required.
@ CCEK_ExplicitBool
Condition in an explicit(bool) specifier.
@ CCEK_InjectedTTP
Injected parameter of a template template parameter.
@ CCEK_Noexcept
Condition in a noexcept(bool) specifier.
@ CCEK_ArrayBound
Array bound in array declarator or new-expression.
@ CCEK_TemplateArg
Value of a non-type template parameter.
void AddFunctionCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, bool SuppressUserConversions=false, bool PartialOverloading=false, bool FirstArgumentIsBase=false)
Add all of the function declarations in the given function set to the overload candidate set.
bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose=true)
CheckPointerConversion - Check the pointer conversion from the expression From to the type ToType.
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void AddNonMemberOperatorCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
Add all of the non-member operator function declarations in the given function set to the overload ca...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, ReferenceConversions *Conv=nullptr)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
SourceManager & SourceMgr
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
NamespaceDecl * getStdNamespace() const
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
void AddSurrogateCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, const FunctionProtoType *Proto, Expr *Object, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddSurrogateCandidate - Adds a "surrogate" candidate function that converts the given Object to a fun...
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base)
Determine whether the type Derived is a C++ class that is derived from the type Base.
ForRangeStatus BuildForRangeBeginEndCall(SourceLocation Loc, SourceLocation RangeLoc, const DeclarationNameInfo &NameInfo, LookupResult &MemberLookup, OverloadCandidateSet *CandidateSet, Expr *Range, ExprResult *CallExpr)
Build a call to 'begin' or 'end' for a C++11 for-range statement.
ExprResult InitializeExplicitObjectArgument(Sema &S, Expr *Obj, FunctionDecl *Fun)
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method, SourceLocation CallLoc)
Returns true if the explicit object parameter was invalid.
bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType)
Helper function to determine whether this is the (deprecated) C++ conversion from a string literal to...
bool CheckNonDependentConversions(FunctionTemplateDecl *FunctionTemplate, ArrayRef< QualType > ParamTypes, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, ConversionSequenceList &Conversions, bool SuppressUserConversions, CXXRecordDecl *ActingContext=nullptr, QualType ObjectType=QualType(), Expr::Classification ObjectClassification={}, OverloadCandidateParamOrder PO={})
Check that implicit conversion sequences can be formed for each argument whose corresponding paramete...
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
bool IsFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy)
Determine whether the conversion from FromType to ToType is a valid conversion that strips "noexcept"...
void AddMemberOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, OverloadCandidateParamOrder PO={})
Add overload candidates for overloaded operators that are member functions.
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
void dump() const
dump - Print this standard conversion sequence to standard error.
void setFromType(QualType T)
DeclAccessPair FoundCopyConstructor
bool isIdentityConversion() const
unsigned BindsToRvalue
Whether we're binding to an rvalue.
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
QualType getFromType() const
ImplicitConversionKind First
First – The first conversion can be an lvalue-to-rvalue conversion, array-to-pointer conversion,...
unsigned BindsImplicitObjectArgumentWithoutRefQualifier
Whether this binds an implicit object argument to a non-static member function without a ref-qualifie...
unsigned ReferenceBinding
ReferenceBinding - True when this is a reference binding (C++ [over.ics.ref]).
void setAsIdentityConversion()
StandardConversionSequence - Set the standard conversion sequence to the identity conversion.
unsigned DeprecatedStringLiteralToCharPtr
Whether this is the deprecated conversion of a string literal to a pointer to non-const character dat...
CXXConstructorDecl * CopyConstructor
CopyConstructor - The copy constructor that is used to perform this conversion, when the conversion i...
unsigned IncompatibleObjC
IncompatibleObjC - Whether this is an Objective-C conversion that we should warn about (if we actuall...
unsigned ObjCLifetimeConversionBinding
Whether this binds a reference to an object with a different Objective-C lifetime qualifier.
ImplicitConversionKind Third
Third - The third conversion can be a qualification conversion or a function conversion.
unsigned QualificationIncludesObjCLifetime
Whether the qualification conversion involves a change in the Objective-C lifetime (for automatic ref...
void setToType(unsigned Idx, QualType T)
bool isPointerConversionToBool() const
isPointerConversionToBool - Determines whether this conversion is a conversion of a pointer or pointe...
void * ToTypePtrs[3]
ToType - The types that this conversion is converting to in each step.
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
unsigned IsLvalueReference
Whether this is an lvalue reference binding (otherwise, it's an rvalue reference binding).
ImplicitConversionKind Dimension
Dimension - Between the second and third conversion a vector or matrix dimension conversion may occur...
unsigned BindsToFunctionLvalue
Whether we're binding to a function lvalue.
unsigned DirectBinding
DirectBinding - True when this is a reference binding that is a direct binding (C++ [dcl....
ImplicitConversionRank getRank() const
getRank - Retrieve the rank of this standard conversion sequence (C++ 13.3.3.1.1p3).
bool isPointerConversionToVoidPointer(ASTContext &Context) const
isPointerConversionToVoidPointer - Determines whether this conversion is a conversion of a pointer to...
void setAllToTypes(QualType T)
QualType getToType(unsigned Idx) const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
StringRef getString() const
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
virtual bool hasIbm128Type() const
Determine whether the __ibm128 type is supported on this target.
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
A convenient class for passing around template argument information.
A template argument list.
Represents a template argument.
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
QualType getAsType() const
Retrieve the type for a type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
@ Template
The template argument is a template name that was provided for a template template parameter.
@ Pack
The template argument is actually a parameter pack.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
@ Template
A single template declaration.
bool hasAssociatedConstraints() const
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
SmallVector< TemplateSpecCandidate, 16 >::iterator iterator
void NoteCandidates(Sema &S, SourceLocation Loc)
NoteCandidates - When no template specialization match is found, prints diagnostic messages containin...
void clear()
Clear out all of the candidates.
SourceLocation getLocation() const
TemplateSpecCandidate & addCandidate()
Add a new candidate with NumConversions conversion sequence slots to the overload set.
Represents a type template specialization; the template must be a class template, a type alias templa...
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
const Type * getTypeForDecl() const
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isBlockPointerType() const
bool isBooleanType() const
bool isObjCBuiltinType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
bool isIncompleteArrayType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isFloat16Type() const
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
bool isRValueReferenceType() const
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
bool isConvertibleToFixedPointType() const
Return true if this can be converted to (or from) a fixed point type.
bool isArithmeticType() const
bool isPointerType() const
bool isArrayParameterType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isObjCObjectOrInterfaceType() const
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isLValueReferenceType() const
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const BuiltinType * getAsPlaceholderType() const
bool isMemberPointerType() const
bool isObjCIdType() const
bool isMatrixType() const
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isObjectType() const
Determine whether this type is an object type.
bool isBFloat16Type() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isVectorType() const
bool isObjCClassType() const
bool isRealFloatingType() const
Floating point categories.
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
bool isHLSLAttributedResourceType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given unary opcode.
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
DeclarationName getMemberName() const
Retrieve the name of the member that this expression refers to.
QualType getBaseType() const
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getMemberLoc() const
Retrieve the location of the name of the member that this expression refers to.
A set of unresolved declarations.
ArrayRef< DeclAccessPair > pairs() const
void addDecl(NamedDecl *D)
The iterator over UnresolvedSets.
A set of unresolved declarations.
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
static UserDefinedLiteral * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation LitEndLoc, SourceLocation SuffixLoc, FPOptionsOverride FPFeatures)
unsigned getNumElements() const
QualType getElementType() const
Provides information about an attempted template argument deduction, whose success or failure was des...
TemplateArgumentList * takeSugared()
Take ownership of the deduced template argument lists.
TemplateArgument SecondArg
The second template argument to which the template argument deduction failure refers.
TemplateParameter Param
The template parameter to which a template argument deduction failure refers.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
bool AggregateDeductionCandidateHasMismatchedArity
TemplateArgument FirstArg
The first template argument to which the template argument deduction failure refers.
ConstraintSatisfaction AssociatedConstraintsSatisfaction
The constraint satisfaction details resulting from the associated constraints satisfaction tests.
bool hasMatchedPackOnParmToNonPackOnArg() const
void takeSFINAEDiagnostic(PartialDiagnosticAt &PD)
Take ownership of the SFINAE diagnostic.
unsigned CallArgIndex
The index of the function argument that caused a deduction failure.
specific_attr_iterator - Iterates over a subrange of an AttrVec, only providing attributes that are o...
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
bool Ret(InterpState &S, CodePtr &PC)
void checkAssignmentLifetime(Sema &SemaRef, const AssignedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for assigning to the ent...
The JSON file list parser is used to communicate input to InstallAPI.
ImplicitConversionRank GetDimensionConversionRank(ImplicitConversionRank Base, ImplicitConversionKind Dimension)
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ ovl_fail_final_conversion_not_exact
This conversion function template specialization candidate is not viable because the final conversion...
@ ovl_fail_enable_if
This candidate function was not viable because an enable_if attribute disabled it.
@ ovl_fail_illegal_constructor
This conversion candidate was not considered because it is an illegal instantiation of a constructor ...
@ ovl_fail_bad_final_conversion
This conversion candidate is not viable because its result type is not implicitly convertible to the ...
@ ovl_fail_module_mismatched
This candidate was not viable because it has internal linkage and is from a different module unit tha...
@ ovl_fail_too_few_arguments
@ ovl_fail_addr_not_available
This candidate was not viable because its address could not be taken.
@ ovl_fail_too_many_arguments
@ ovl_non_default_multiversion_function
This candidate was not viable because it is a non-default multiversioned function.
@ ovl_fail_constraints_not_satisfied
This candidate was not viable because its associated constraints were not satisfied.
@ ovl_fail_bad_conversion
@ ovl_fail_bad_target
(CUDA) This candidate was not viable because the callee was not accessible from the caller's target (...
@ ovl_fail_inhctor_slice
This inherited constructor is not viable because it would slice the argument.
@ ovl_fail_object_addrspace_mismatch
This constructor/conversion candidate fail due to an address space mismatch between the object being ...
@ ovl_fail_explicit
This candidate constructor or conversion function is explicit but the context doesn't permit explicit...
@ ovl_fail_trivial_conversion
This conversion candidate was not considered because it duplicates the work of a trivial or derived-t...
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
ImplicitConversionRank
ImplicitConversionRank - The rank of an implicit conversion kind.
@ ICR_Conversion
Conversion.
@ ICR_Writeback_Conversion
ObjC ARC writeback conversion.
@ ICR_HLSL_Dimension_Reduction
HLSL Matching Dimension Reduction.
@ ICR_HLSL_Dimension_Reduction_Conversion
HLSL Dimension reduction with conversion.
@ ICR_HLSL_Scalar_Widening
HLSL Scalar Widening.
@ ICR_C_Conversion
Conversion only allowed in the C standard (e.g. void* to char*).
@ ICR_OCL_Scalar_Widening
OpenCL Scalar Widening.
@ ICR_Complex_Real_Conversion
Complex <-> Real conversion.
@ ICR_HLSL_Scalar_Widening_Conversion
HLSL Scalar Widening with conversion.
@ ICR_HLSL_Dimension_Reduction_Promotion
HLSL Dimension reduction with promotion.
@ ICR_Promotion
Promotion.
@ ICR_Exact_Match
Exact Match.
@ ICR_C_Conversion_Extension
Conversion not allowed by the C standard, but that we accept as an extension anyway.
@ ICR_HLSL_Scalar_Widening_Promotion
HLSL Scalar Widening with promotion.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_ViableCandidates
Requests that only viable candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
OverloadsShown
Specifies which overload candidates to display when overload resolution fails.
@ Ovl_Best
Show just the "best" overload candidates.
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
OverloadCandidateRewriteKind
The kinds of rewrite we perform on overload candidates.
@ CRK_Reversed
Candidate is a rewritten candidate with a reversed order of parameters.
@ CRK_None
Candidate is not a rewritten candidate.
@ CRK_DifferentOperator
Candidate is a rewritten candidate with a different operator name.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Result
The result type of a method or function.
ImplicitConversionKind
ImplicitConversionKind - The kind of implicit conversion used to convert an argument to a parameter's...
@ ICK_Complex_Conversion
Complex conversions (C99 6.3.1.6)
@ ICK_Floating_Promotion
Floating point promotions (C++ [conv.fpprom])
@ ICK_Boolean_Conversion
Boolean conversions (C++ [conv.bool])
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
@ ICK_Fixed_Point_Conversion
Fixed point type conversions according to N1169.
@ ICK_Vector_Conversion
Vector conversions.
@ ICK_Block_Pointer_Conversion
Block Pointer conversions.
@ ICK_Pointer_Member
Pointer-to-member conversions (C++ [conv.mem])
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
@ ICK_HLSL_Array_RValue
HLSL non-decaying array rvalue cast.
@ ICK_SVE_Vector_Conversion
Arm SVE Vector conversions.
@ ICK_HLSL_Vector_Truncation
HLSL vector truncation.
@ ICK_Incompatible_Pointer_Conversion
C-only conversion between pointers with incompatible types.
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
@ ICK_RVV_Vector_Conversion
RISC-V RVV Vector conversions.
@ ICK_Complex_Promotion
Complex promotions (Clang extension)
@ ICK_Num_Conversion_Kinds
The number of conversion kinds.
@ ICK_Function_Conversion
Function pointer conversion (C++17 [conv.fctptr])
@ ICK_Vector_Splat
A vector splat from an arithmetic type.
@ ICK_Zero_Queue_Conversion
Zero constant to queue.
@ ICK_Identity
Identity conversion (no conversion)
@ ICK_Derived_To_Base
Derived-to-base (C++ [over.best.ics])
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
@ ICK_Qualification
Qualification conversions (C++ [conv.qual])
@ ICK_Pointer_Conversion
Pointer conversions (C++ [conv.ptr])
@ ICK_TransparentUnionConversion
Transparent Union Conversions.
@ ICK_Integral_Promotion
Integral promotions (C++ [conv.prom])
@ ICK_Floating_Conversion
Floating point conversions (C++ [conv.double].
@ ICK_Compatible_Conversion
Conversions between compatible types in C99.
@ ICK_C_Only_Conversion
Conversions allowed in C, but not C++.
@ ICK_Writeback_Conversion
Objective-C ARC writeback conversion.
@ ICK_Zero_Event_Conversion
Zero constant to event (OpenCL1.2 6.12.10)
@ ICK_Complex_Real
Complex-real conversions (C99 6.3.1.7)
@ ICK_Function_To_Pointer
Function-to-pointer (C++ [conv.array])
ActionResult< Expr * > ExprResult
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
CXXSpecialMemberKind
Kinds of C++ special members.
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool isBetterOverloadCandidate(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2, SourceLocation Loc, OverloadCandidateSet::CandidateSetKind Kind)
isBetterOverloadCandidate - Determines whether the first overload candidate is a better candidate tha...
const FunctionProtoType * T
bool shouldEnforceArgLimit(bool PartialOverloading, FunctionDecl *Function)
NarrowingKind
NarrowingKind - The kind of narrowing conversion being performed by a standard conversion sequence ac...
@ NK_Not_Narrowing
Not a narrowing conversion.
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
@ TPOC_Conversion
Partial ordering of function templates for a call to a conversion function.
@ TPOC_Call
Partial ordering of function templates for a function call.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
TemplateDeductionResult
Describes the result of template argument deduction.
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
@ CUDATargetMismatch
CUDA Target attributes do not match.
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ Invalid
The declaration was invalid; do nothing.
@ Success
Template argument deduction was successful.
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
@ AlreadyDiagnosed
Some error which was already diagnosed.
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
ConstructorInfo getConstructorInfo(NamedDecl *ND)
@ None
The alignment was not explicit in code.
ImplicitConversionRank GetConversionRank(ImplicitConversionKind Kind)
GetConversionRank - Retrieve the implicit conversion rank corresponding to the given implicit convers...
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ EST_None
no exception specification
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
__DEVICE__ _Tp abs(const std::complex< _Tp > &__c)
Represents an ambiguous user-defined conversion sequence.
ConversionSet::const_iterator const_iterator
ConversionSet & conversions()
void setFromType(QualType T)
void setToType(QualType T)
void addConversion(NamedDecl *Found, FunctionDecl *D)
SmallVector< std::pair< NamedDecl *, FunctionDecl * >, 4 > ConversionSet
void copyFrom(const AmbiguousConversionSequence &)
QualType getToType() const
QualType getFromType() const
OverloadFixItKind Kind
The type of fix applied.
unsigned NumConversionsFixed
The number of Conversions fixed.
void setConversionChecker(TypeComparisonFuncTy Foo)
Resets the default conversion checker method.
std::vector< FixItHint > Hints
The list of Hints generated so far.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
const DeclarationNameLoc & getInfo() const
SourceLocation getCXXLiteralOperatorNameLoc() const
getCXXLiteralOperatorNameLoc - Returns the location of the literal operator name (not the operator ke...
A structure used to record information about a failed template argument deduction,...
void * Data
Opaque pointer containing additional data about this deduction failure.
const TemplateArgument * getSecondArg()
Return the second template argument this deduction failure refers to, if any.
unsigned Result
A Sema::TemplateDeductionResult.
PartialDiagnosticAt * getSFINAEDiagnostic()
Retrieve the diagnostic which caused this deduction failure, if any.
std::optional< unsigned > getCallArgIndex()
Return the index of the call argument that this deduction failure refers to, if any.
unsigned HasDiagnostic
Indicates whether a diagnostic is stored in Diagnostic.
TemplateDeductionResult getResult() const
void Destroy()
Free any memory associated with this deduction failure.
char Diagnostic[sizeof(PartialDiagnosticAt)]
A diagnostic indicating why deduction failed.
TemplateParameter getTemplateParameter()
Retrieve the template parameter this deduction failure refers to, if any.
TemplateArgumentList * getTemplateArgumentList()
Retrieve the template argument list associated with this deduction failure, if any.
const TemplateArgument * getFirstArg()
Return the first template argument this deduction failure refers to, if any.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
Information about operator rewrites to consider when adding operator functions to a candidate set.
bool shouldAddReversed(Sema &S, ArrayRef< Expr * > OriginalArgs, FunctionDecl *FD)
Determine whether we should add a rewritten candidate for FD with reversed parameter order.
bool allowsReversed(OverloadedOperatorKind Op)
Determine whether reversing parameter order is allowed for operator Op.
bool AllowRewrittenCandidates
Whether we should include rewritten candidates in the overload set.
bool isReversible()
Determines whether this operator could be implemented by a function with reversed parameter order.
bool isAcceptableCandidate(const FunctionDecl *FD)
OverloadCandidateRewriteKind getRewriteKind(const FunctionDecl *FD, OverloadCandidateParamOrder PO)
Determine the kind of rewrite that should be performed for this candidate.
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
unsigned IgnoreObjectArgument
IgnoreObjectArgument - True to indicate that the first argument's conversion, which for this function...
bool TryToFixBadConversion(unsigned Idx, Sema &S)
bool NotValidBecauseConstraintExprHasError() const
unsigned IsADLCandidate
True if the candidate was found using ADL.
unsigned IsSurrogate
IsSurrogate - True to indicate that this candidate is a surrogate for a conversion to a function poin...
QualType BuiltinParamTypes[3]
BuiltinParamTypes - Provides the parameter types of a built-in overload candidate.
DeclAccessPair FoundDecl
FoundDecl - The original declaration that was looked up / invented / otherwise found,...
FunctionDecl * Function
Function - The actual function that this candidate represents.
unsigned RewriteKind
Whether this is a rewritten candidate, and if so, of what kind?
ConversionFixItGenerator Fix
The FixIt hints which can be used to fix the Bad candidate.
unsigned Best
Whether this candidate is the best viable function, or tied for being the best viable function.
StandardConversionSequence FinalConversion
FinalConversion - For a conversion function (where Function is a CXXConversionDecl),...
unsigned getNumParams() const
unsigned TookAddressOfOverload
bool HasMatchedPackOnParmToNonPackOnArg
Have we matched any packs on the parameter side, versus any non-packs on the argument side,...
unsigned ExplicitCallArguments
The number of call arguments that were explicitly provided, to be used while performing partial order...
unsigned char FailureKind
FailureKind - The reason why this candidate is not viable.
ConversionSequenceList Conversions
The conversion sequences used to convert the function arguments to the function parameters.
DeductionFailureInfo DeductionFailure
unsigned Viable
Viable - True to indicate that this overload candidate is viable.
CXXConversionDecl * Surrogate
Surrogate - The conversion function for which this candidate is a surrogate, but only if IsSurrogate ...
OverloadCandidateRewriteKind getRewriteKind() const
Get RewriteKind value in OverloadCandidateRewriteKind type (This function is to workaround the spurio...
bool HasFormOfMemberPointer
OverloadExpr * Expression
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
ReferenceConversions
The conversions that would be performed on an lvalue of type T2 when binding a reference of type T1 t...
Abstract class used to diagnose incomplete types.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
TemplateSpecCandidate - This is a generalization of OverloadCandidate which keeps track of template a...
void NoteDeductionFailure(Sema &S, bool ForTakingAddress)
Diagnose a template argument deduction failure.
DeductionFailureInfo DeductionFailure
Template argument deduction info.
Decl * Specialization
Specialization - The actual specialization that this candidate represents.
void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)
UserDefinedConversionSequence - Represents a user-defined conversion sequence (C++ 13....
StandardConversionSequence Before
Represents the standard conversion that occurs before the actual user-defined conversion.
FunctionDecl * ConversionFunction
ConversionFunction - The function that will perform the user-defined conversion.
bool HadMultipleCandidates
HadMultipleCandidates - When this is true, it means that the conversion function was resolved from an...
StandardConversionSequence After
After - Represents the standard conversion that occurs after the actual user-defined conversion.
bool EllipsisConversion
EllipsisConversion - When this is true, it means user-defined conversion sequence starts with a ....
DeclAccessPair FoundConversionFunction
The declaration that we found via name lookup, which might be the same as ConversionFunction or it mi...
void dump() const
dump - Print this user-defined conversion sequence to standard error.
Describes an entity that is being assigned.