38#include "llvm/ADT/DenseSet.h"
39#include "llvm/ADT/STLExtras.h"
40#include "llvm/ADT/STLForwardCompat.h"
41#include "llvm/ADT/ScopeExit.h"
42#include "llvm/ADT/SmallPtrSet.h"
43#include "llvm/ADT/SmallVector.h"
57 return P->hasAttr<PassObjectSizeAttr>();
78 if (HadMultipleCandidates)
89 CK_FunctionToPointerDecay);
93 bool InOverloadResolution,
96 bool AllowObjCWritebackConversion);
100 bool InOverloadResolution,
108 bool AllowObjCConversionOnExplicit);
169 return Rank[(int)Kind];
194 static const char *
const Name[] = {
198 "Function-to-pointer",
199 "Function pointer conversion",
201 "Integral promotion",
202 "Floating point promotion",
204 "Integral conversion",
205 "Floating conversion",
206 "Complex conversion",
207 "Floating-integral conversion",
208 "Pointer conversion",
209 "Pointer-to-member conversion",
210 "Boolean conversion",
211 "Compatible-types conversion",
212 "Derived-to-base conversion",
214 "SVE Vector conversion",
215 "RVV Vector conversion",
217 "Complex-real conversion",
218 "Block Pointer conversion",
219 "Transparent Union Conversion",
220 "Writeback conversion",
221 "OpenCL Zero Event Conversion",
222 "OpenCL Zero Queue Conversion",
223 "C specific type conversion",
224 "Incompatible pointer conversion",
225 "Fixed point conversion",
226 "HLSL vector truncation",
227 "Non-decaying array conversion",
304 FromType = Context.getArrayDecayedType(FromType);
316 const Expr *Converted) {
319 if (
auto *EWC = dyn_cast<ExprWithCleanups>(Converted)) {
326 while (
auto *ICE = dyn_cast<ImplicitCastExpr>(Converted)) {
327 switch (ICE->getCastKind()) {
329 case CK_IntegralCast:
330 case CK_IntegralToBoolean:
331 case CK_IntegralToFloating:
332 case CK_BooleanToSignedIntegral:
333 case CK_FloatingToIntegral:
334 case CK_FloatingToBoolean:
335 case CK_FloatingCast:
336 Converted = ICE->getSubExpr();
360 QualType &ConstantType,
bool IgnoreFloatToIntegralConversion)
const {
362 "narrowing check outside C++");
373 ToType = ED->getIntegerType();
379 goto FloatingIntegralConversion;
381 goto IntegralConversion;
392 FloatingIntegralConversion:
397 if (IgnoreFloatToIntegralConversion)
400 assert(
Initializer &&
"Unknown conversion expression");
406 if (std::optional<llvm::APSInt> IntConstantValue =
410 Result.convertFromAPInt(*IntConstantValue, IntConstantValue->isSigned(),
411 llvm::APFloat::rmNearestTiesToEven);
413 llvm::APSInt ConvertedValue = *IntConstantValue;
415 llvm::APFloat::opStatus Status =
Result.convertToInteger(
416 ConvertedValue, llvm::APFloat::rmTowardZero, &ignored);
419 if (Status == llvm::APFloat::opInvalidOp ||
420 *IntConstantValue != ConvertedValue) {
421 ConstantValue =
APValue(*IntConstantValue);
448 Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue)) {
451 ConstantValue = R.
Val;
452 assert(ConstantValue.
isFloat());
453 llvm::APFloat FloatVal = ConstantValue.
getFloat();
456 llvm::APFloat Converted = FloatVal;
457 llvm::APFloat::opStatus ConvertStatus =
459 llvm::APFloat::rmNearestTiesToEven, &ignored);
461 llvm::APFloat::rmNearestTiesToEven, &ignored);
463 if (FloatVal.isNaN() && Converted.isNaN() &&
464 !FloatVal.isSignaling() && !Converted.isSignaling()) {
470 if (!Converted.bitwiseIsEqual(FloatVal)) {
477 if (ConvertStatus & llvm::APFloat::opOverflow) {
499 IntegralConversion: {
507 constexpr auto CanRepresentAll = [](
bool FromSigned,
unsigned FromWidth,
508 bool ToSigned,
unsigned ToWidth) {
509 return (FromWidth < ToWidth + (FromSigned == ToSigned)) &&
510 !(FromSigned && !ToSigned);
513 if (CanRepresentAll(FromSigned, FromWidth, ToSigned, ToWidth))
519 bool DependentBitField =
false;
521 if (BitField->getBitWidth()->isValueDependent())
522 DependentBitField =
true;
523 else if (
unsigned BitFieldWidth = BitField->getBitWidthValue();
524 BitFieldWidth < FromWidth) {
525 if (CanRepresentAll(FromSigned, BitFieldWidth, ToSigned, ToWidth))
529 FromWidth = BitFieldWidth;
537 std::optional<llvm::APSInt> OptInitializerValue =
539 if (!OptInitializerValue) {
543 if (DependentBitField && !(FromSigned && !ToSigned))
549 llvm::APSInt &InitializerValue = *OptInitializerValue;
550 bool Narrowing =
false;
551 if (FromWidth < ToWidth) {
554 if (InitializerValue.isSigned() && InitializerValue.isNegative())
560 InitializerValue.extend(InitializerValue.getBitWidth() + 1);
562 llvm::APSInt ConvertedValue = InitializerValue;
563 ConvertedValue = ConvertedValue.trunc(ToWidth);
564 ConvertedValue.setIsSigned(ToSigned);
565 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
566 ConvertedValue.setIsSigned(InitializerValue.isSigned());
568 if (ConvertedValue != InitializerValue)
573 ConstantValue =
APValue(InitializerValue);
589 ConstantValue = R.
Val;
590 assert(ConstantValue.
isFloat());
591 llvm::APFloat FloatVal = ConstantValue.
getFloat();
596 if (FloatVal.isNaN() && FloatVal.isSignaling()) {
612 raw_ostream &OS = llvm::errs();
613 bool PrintedSomething =
false;
616 PrintedSomething =
true;
620 if (PrintedSomething) {
626 OS <<
" (by copy constructor)";
628 OS <<
" (direct reference binding)";
630 OS <<
" (reference binding)";
632 PrintedSomething =
true;
636 if (PrintedSomething) {
640 PrintedSomething =
true;
643 if (!PrintedSomething) {
644 OS <<
"No conversions required";
651 raw_ostream &OS = llvm::errs();
659 OS <<
"aggregate initialization";
669 raw_ostream &OS = llvm::errs();
671 OS <<
"Worst list element conversion: ";
672 switch (ConversionKind) {
674 OS <<
"Standard conversion: ";
678 OS <<
"User-defined conversion: ";
682 OS <<
"Ellipsis conversion";
685 OS <<
"Ambiguous conversion";
688 OS <<
"Bad conversion";
713 struct DFIArguments {
719 struct DFIParamWithArguments : DFIArguments {
724 struct DFIDeducedMismatchArgs : DFIArguments {
725 TemplateArgumentList *TemplateArgs;
726 unsigned CallArgIndex;
731 TemplateArgumentList *TemplateArgs;
732 ConstraintSatisfaction Satisfaction;
743 Result.Result =
static_cast<unsigned>(TDK);
744 Result.HasDiagnostic =
false;
763 auto *Saved =
new (Context) DFIDeducedMismatchArgs;
774 DFIArguments *Saved =
new (Context) DFIArguments;
786 DFIParamWithArguments *Saved =
new (Context) DFIParamWithArguments;
787 Saved->Param = Info.
Param;
800 Result.HasDiagnostic =
true;
805 CNSInfo *Saved =
new (Context) CNSInfo;
815 llvm_unreachable(
"not a deduction failure");
848 Diag->~PartialDiagnosticAt();
855 static_cast<CNSInfo *
>(
Data)->Satisfaction.~ConstraintSatisfaction();
858 Diag->~PartialDiagnosticAt();
894 return TemplateParameter::getFromOpaqueValue(
Data);
899 return static_cast<DFIParamWithArguments*
>(
Data)->Param;
929 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->TemplateArgs;
935 return static_cast<CNSInfo*
>(
Data)->TemplateArgs;
967 return &
static_cast<DFIArguments*
>(
Data)->FirstArg;
999 return &
static_cast<DFIArguments*
>(
Data)->SecondArg;
1014 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->CallArgIndex;
1017 return std::nullopt;
1030 for (
unsigned I = 0; I <
X->getNumParams(); ++I)
1034 if (
auto *FTX =
X->getDescribedFunctionTemplate()) {
1039 FTY->getTemplateParameters()))
1048 OverloadedOperatorKind::OO_EqualEqual);
1060 OverloadedOperatorKind::OO_ExclaimEqual);
1078 auto *NotEqFD = Op->getAsFunction();
1079 if (
auto *UD = dyn_cast<UsingShadowDecl>(Op))
1080 NotEqFD = UD->getUnderlyingDecl()->getAsFunction();
1093 return Op == OO_EqualEqual || Op == OO_Spaceship;
1101 if (Op == OverloadedOperatorKind::OO_EqualEqual) {
1102 assert(OriginalArgs.size() == 2);
1104 S,
OpLoc, OriginalArgs[1], FD))
1115void OverloadCandidateSet::destroyCandidates() {
1116 for (
iterator i = Candidates.begin(), e = Candidates.end(); i != e; ++i) {
1117 for (
auto &
C : i->Conversions)
1118 C.~ImplicitConversionSequence();
1120 i->DeductionFailure.Destroy();
1125 destroyCandidates();
1126 SlabAllocator.Reset();
1127 NumInlineBytesUsed = 0;
1131 FirstDeferredCandidate =
nullptr;
1132 DeferredCandidatesCount = 0;
1133 HasDeferredTemplateConstructors =
false;
1134 ResolutionByPerfectCandidateIsDisabled =
false;
1138 class UnbridgedCastsSet {
1148 Entry entry = { &E, E };
1149 Entries.push_back(entry);
1154 for (SmallVectorImpl<Entry>::iterator
1155 i = Entries.begin(), e = Entries.end(); i != e; ++i)
1156 *i->Addr = i->Saved;
1170 UnbridgedCastsSet *unbridgedCasts =
nullptr) {
1174 if (placeholder->getKind() == BuiltinType::Overload)
return false;
1178 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
1180 unbridgedCasts->save(S, E);
1200 UnbridgedCastsSet &unbridged) {
1201 for (
unsigned i = 0, e = Args.size(); i != e; ++i)
1210 bool NewIsUsingDecl) {
1215 bool OldIsUsingDecl =
false;
1217 OldIsUsingDecl =
true;
1221 if (NewIsUsingDecl)
continue;
1228 if ((OldIsUsingDecl || NewIsUsingDecl) && !
isVisible(*I))
1236 bool UseMemberUsingDeclRules =
1237 (OldIsUsingDecl || NewIsUsingDecl) &&
CurContext->isRecord() &&
1238 !
New->getFriendObjectKind();
1242 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
1248 !shouldLinkPossiblyHiddenDecl(*I,
New))
1267 }
else if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(OldD)) {
1274 if (UUD->getQualifier().isDependent() && !UUD->isCXXClassMember()) {
1302 if (
New->getFriendObjectKind() &&
New->getQualifier() &&
1303 !
New->getDescribedFunctionTemplate() &&
1304 !
New->getDependentSpecializationInfo() &&
1305 !
New->getType()->isDependentType()) {
1310 New->setInvalidDecl();
1322 assert(D &&
"function decl should not be null");
1323 if (
auto *A = D->
getAttr<AttrT>())
1324 return !A->isImplicit();
1330 bool UseMemberUsingDeclRules,
1331 bool ConsiderCudaAttrs,
1332 bool UseOverrideRules =
false) {
1338 if (
New->isMSVCRTEntryPoint())
1349 if ((OldTemplate ==
nullptr) != (NewTemplate ==
nullptr))
1372 if (OldQType != NewQType && OldType->isVariadic() != NewType->isVariadic())
1376 if ((
New->isMemberLikeConstrainedFriend() ||
1387 OldDecl = OldTemplate;
1388 NewDecl = NewTemplate;
1406 bool ConstraintsInTemplateHead =
1417 if (UseMemberUsingDeclRules && ConstraintsInTemplateHead &&
1418 !SameTemplateParameterList)
1420 if (!UseMemberUsingDeclRules &&
1421 (!SameTemplateParameterList || !SameReturnType))
1425 const auto *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1426 const auto *NewMethod = dyn_cast<CXXMethodDecl>(
New);
1428 int OldParamsOffset = 0;
1429 int NewParamsOffset = 0;
1437 if (ThisType.isConstQualified())
1457 BS.
Quals = NormalizeQualifiers(OldMethod, BS.
Quals);
1458 DS.Quals = NormalizeQualifiers(NewMethod, DS.Quals);
1460 if (OldMethod->isExplicitObjectMemberFunction()) {
1462 DS.Quals.removeVolatile();
1465 return BS.
Quals == DS.Quals;
1469 auto BS =
Base.getNonReferenceType().getCanonicalType().split();
1470 auto DS = D.getNonReferenceType().getCanonicalType().split();
1472 if (!AreQualifiersEqual(BS, DS))
1475 if (OldMethod->isImplicitObjectMemberFunction() &&
1476 OldMethod->getParent() != NewMethod->getParent()) {
1488 if (
Base->isLValueReferenceType())
1489 return D->isLValueReferenceType();
1490 return Base->isRValueReferenceType() == D->isRValueReferenceType();
1495 auto DiagnoseInconsistentRefQualifiers = [&]() {
1496 if (SemaRef.
LangOpts.CPlusPlus23 && !UseOverrideRules)
1498 if (OldMethod->getRefQualifier() == NewMethod->getRefQualifier())
1500 if (OldMethod->isExplicitObjectMemberFunction() ||
1501 NewMethod->isExplicitObjectMemberFunction())
1503 if (!UseMemberUsingDeclRules && (OldMethod->getRefQualifier() ==
RQ_None ||
1504 NewMethod->getRefQualifier() ==
RQ_None)) {
1505 SemaRef.
Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
1506 << NewMethod->getRefQualifier() << OldMethod->getRefQualifier();
1507 SemaRef.
Diag(OldMethod->getLocation(), diag::note_previous_declaration);
1513 if (OldMethod && OldMethod->isExplicitObjectMemberFunction())
1515 if (NewMethod && NewMethod->isExplicitObjectMemberFunction())
1518 if (OldType->getNumParams() - OldParamsOffset !=
1519 NewType->getNumParams() - NewParamsOffset ||
1521 {OldType->param_type_begin() + OldParamsOffset,
1522 OldType->param_type_end()},
1523 {NewType->param_type_begin() + NewParamsOffset,
1524 NewType->param_type_end()},
1529 if (OldMethod && NewMethod && !OldMethod->isStatic() &&
1530 !NewMethod->isStatic()) {
1531 bool HaveCorrespondingObjectParameters = [&](
const CXXMethodDecl *Old,
1533 auto NewObjectType =
New->getFunctionObjectParameterReferenceType();
1537 return F->getRefQualifier() ==
RQ_None &&
1538 !F->isExplicitObjectMemberFunction();
1541 if (IsImplicitWithNoRefQual(Old) != IsImplicitWithNoRefQual(
New) &&
1542 CompareType(OldObjectType.getNonReferenceType(),
1543 NewObjectType.getNonReferenceType()))
1545 return CompareType(OldObjectType, NewObjectType);
1546 }(OldMethod, NewMethod);
1548 if (!HaveCorrespondingObjectParameters) {
1549 if (DiagnoseInconsistentRefQualifiers())
1554 if (!UseOverrideRules || (!NewMethod->isExplicitObjectMemberFunction() &&
1555 !OldMethod->isExplicitObjectMemberFunction()))
1560 if (!UseOverrideRules &&
1564 if (!NewRC != !OldRC)
1574 if (NewMethod && OldMethod && OldMethod->isImplicitObjectMemberFunction() &&
1575 NewMethod->isImplicitObjectMemberFunction()) {
1576 if (DiagnoseInconsistentRefQualifiers())
1590 NewI =
New->specific_attr_begin<EnableIfAttr>(),
1591 NewE =
New->specific_attr_end<EnableIfAttr>(),
1594 NewI != NewE || OldI != OldE; ++NewI, ++OldI) {
1595 if (NewI == NewE || OldI == OldE)
1597 llvm::FoldingSetNodeID NewID, OldID;
1598 NewI->getCond()->Profile(NewID, SemaRef.
Context,
true);
1599 OldI->getCond()->Profile(OldID, SemaRef.
Context,
true);
1605 if (SemaRef.
getLangOpts().CUDA && ConsiderCudaAttrs) {
1613 "Unexpected invalid target.");
1617 if (NewTarget != OldTarget) {
1620 if (OldMethod && NewMethod && OldMethod->isVirtual() &&
1621 OldMethod->isConstexpr() && !NewMethod->isConstexpr() &&
1639 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1645 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1658 bool SuppressUserConversions,
1660 bool InOverloadResolution,
1662 bool AllowObjCWritebackConversion,
1663 bool AllowObjCConversionOnExplicit) {
1666 if (SuppressUserConversions) {
1677 Conversions, AllowExplicit,
1678 AllowObjCConversionOnExplicit)) {
1699 bool FromListInit =
false;
1700 if (
const auto *InitList = dyn_cast<InitListExpr>(From);
1701 InitList && InitList->getNumInits() == 1 &&
1703 const Expr *SingleInit = InitList->getInit(0);
1704 FromType = SingleInit->
getType();
1706 FromListInit =
true;
1715 if ((FromCanon == ToCanon ||
1727 if (ToCanon != FromCanon)
1738 Cand != Conversions.
end(); ++Cand)
1779static ImplicitConversionSequence
1781 bool SuppressUserConversions,
1783 bool InOverloadResolution,
1785 bool AllowObjCWritebackConversion,
1786 bool AllowObjCConversionOnExplicit) {
1789 ICS.
Standard, CStyle, AllowObjCWritebackConversion)){
1835 bool CanConvert =
false;
1841 FromResType->getWrappedType()) &&
1843 FromResType->getContainedType()) &&
1844 ToResType->getAttrs() == FromResType->getAttrs())
1846 }
else if (ToTy->isHLSLResourceType()) {
1860 AllowExplicit, InOverloadResolution, CStyle,
1861 AllowObjCWritebackConversion,
1862 AllowObjCConversionOnExplicit);
1865ImplicitConversionSequence
1867 bool SuppressUserConversions,
1869 bool InOverloadResolution,
1871 bool AllowObjCWritebackConversion) {
1872 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1873 AllowExplicit, InOverloadResolution, CStyle,
1874 AllowObjCWritebackConversion,
1880 bool AllowExplicit) {
1885 bool AllowObjCWritebackConversion =
1892 *
this, From, ToType,
1894 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1896 false, AllowObjCWritebackConversion,
1910 if (
Context.hasSameUnqualifiedType(FromType, ToType))
1923 if (TyClass != CanFrom->getTypeClass())
return false;
1924 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1925 if (TyClass == Type::Pointer) {
1928 }
else if (TyClass == Type::BlockPointer) {
1931 }
else if (TyClass == Type::MemberPointer) {
1938 CanTo = ToMPT->getPointeeType();
1944 TyClass = CanTo->getTypeClass();
1945 if (TyClass != CanFrom->getTypeClass())
return false;
1946 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1956 bool Changed =
false;
1964 const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn);
1965 const auto *ToFPT = dyn_cast<FunctionProtoType>(ToFn);
1967 if (FromFPT && ToFPT) {
1968 if (FromFPT->hasCFIUncheckedCallee() != ToFPT->hasCFIUncheckedCallee()) {
1970 FromFPT->getReturnType(), FromFPT->getParamTypes(),
1971 FromFPT->getExtProtoInfo().withCFIUncheckedCallee(
1972 ToFPT->hasCFIUncheckedCallee()));
1980 if (FromFPT && ToFPT) {
1981 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
1993 bool CanUseToFPT, CanUseFromFPT;
1994 if (
Context.mergeExtParameterInfo(ToFPT, FromFPT, CanUseToFPT,
1995 CanUseFromFPT, NewParamInfos) &&
1996 CanUseToFPT && !CanUseFromFPT) {
1999 NewParamInfos.empty() ?
nullptr : NewParamInfos.data();
2001 FromFPT->getParamTypes(), ExtInfo);
2006 if (
Context.hasAnyFunctionEffects()) {
2011 const auto FromFX = FromFPT->getFunctionEffects();
2012 const auto ToFX = ToFPT->getFunctionEffects();
2013 if (FromFX != ToFX) {
2017 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
2027 assert(
QualType(FromFn, 0).isCanonical());
2028 if (
QualType(FromFn, 0) != CanTo)
return false;
2055 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
2056 &ToSem == &llvm::APFloat::IEEEquad()) ||
2057 (&FromSem == &llvm::APFloat::IEEEquad() &&
2058 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2113 bool InOverloadResolution,
bool CStyle) {
2130 if (ToExtType && FromExtType) {
2132 unsigned ToElts = ToExtType->getNumElements();
2133 if (FromElts < ToElts)
2135 if (FromElts == ToElts)
2141 QualType ToElTy = ToExtType->getElementType();
2146 if (FromExtType && !ToExtType) {
2160 if (ToExtType->getNumElements() != FromExtType->getNumElements())
2165 FromExtType->getElementType()->isIntegerType()) {
2177 QualType ToElTy = ToExtType->getElementType();
2211 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
2216 !InOverloadResolution && !CStyle) {
2218 << FromType << ToType;
2229 bool InOverloadResolution,
2230 StandardConversionSequence &SCS,
2242 bool InOverloadResolution,
2245 bool AllowObjCWritebackConversion) {
2271 FromType = Fn->getType();
2291 if (Method && !Method->isStatic() &&
2292 !Method->isExplicitObjectMemberFunction()) {
2294 "Non-unary operator on non-static member address");
2297 "Non-address-of operator on non-static member address");
2299 FromType, std::nullopt, Method->getParent());
2303 "Non-address-of operator for overloaded function expression");
2349 FromType =
Atomic->getValueType();
2384 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2404 bool IncompatibleObjC =
false;
2459 }
else if (AllowObjCWritebackConversion &&
2463 FromType, IncompatibleObjC)) {
2469 InOverloadResolution, FromType)) {
2473 From, InOverloadResolution, CStyle)) {
2483 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2519 bool ObjCLifetimeConversion;
2525 ObjCLifetimeConversion)) {
2544 CanonFrom = CanonTo;
2549 if (CanonFrom == CanonTo)
2554 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2566 case AssignConvertType::
2567 CompatibleVoidPtrToNonVoidPtr:
2600 bool InOverloadResolution,
2608 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2609 if (!UD->
hasAttr<TransparentUnionAttr>())
2612 for (
const auto *it : UD->
fields()) {
2615 ToType = it->getType();
2641 return To->
getKind() == BuiltinType::Int;
2644 return To->
getKind() == BuiltinType::UInt;
2668 if (FromED->isScoped())
2675 if (FromED->isFixed()) {
2676 QualType Underlying = FromED->getIntegerType();
2677 return Context.hasSameUnqualifiedType(Underlying, ToType) ||
2684 return Context.hasSameUnqualifiedType(ToType, FromED->getPromotionType());
2709 uint64_t FromSize =
Context.getTypeSize(FromType);
2718 for (
int Idx = 0; Idx < 6; ++Idx) {
2719 uint64_t ToSize =
Context.getTypeSize(PromoteTypes[Idx]);
2720 if (FromSize < ToSize ||
2721 (FromSize == ToSize &&
2722 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2726 return Context.hasSameUnqualifiedType(ToType, PromoteTypes[Idx]);
2747 std::optional<llvm::APSInt> BitWidth;
2750 MemberDecl->getBitWidth()->getIntegerConstantExpr(
Context))) {
2751 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2752 ToSize =
Context.getTypeSize(ToType);
2755 if (*BitWidth < ToSize ||
2757 return To->
getKind() == BuiltinType::Int;
2763 return To->
getKind() == BuiltinType::UInt;
2781 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2791 if (FromBuiltin->getKind() == BuiltinType::Float &&
2792 ToBuiltin->getKind() == BuiltinType::Double)
2799 (FromBuiltin->getKind() == BuiltinType::Float ||
2800 FromBuiltin->getKind() == BuiltinType::Double) &&
2801 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2802 ToBuiltin->getKind() == BuiltinType::Float128 ||
2803 ToBuiltin->getKind() == BuiltinType::Ibm128))
2808 if (
getLangOpts().
HLSL && FromBuiltin->getKind() == BuiltinType::Half &&
2809 (ToBuiltin->getKind() == BuiltinType::Float ||
2810 ToBuiltin->getKind() == BuiltinType::Double))
2815 FromBuiltin->getKind() == BuiltinType::Half &&
2816 ToBuiltin->getKind() == BuiltinType::Float)
2848 bool StripObjCLifetime =
false) {
2851 "Invalid similarly-qualified pointer type");
2862 if (StripObjCLifetime)
2874 return Context.getObjCObjectPointerType(ToPointee);
2875 return Context.getPointerType(ToPointee);
2883 return Context.getObjCObjectPointerType(QualifiedCanonToPointee);
2884 return Context.getPointerType(QualifiedCanonToPointee);
2888 bool InOverloadResolution,
2894 return !InOverloadResolution;
2902 bool InOverloadResolution,
2904 bool &IncompatibleObjC) {
2905 IncompatibleObjC =
false;
2913 ConvertedType = ToType;
2920 ConvertedType = ToType;
2927 ConvertedType = ToType;
2935 ConvertedType = ToType;
2945 ConvertedType = ToType;
2967 if (
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType))
2994 Context.typesAreCompatible(FromPointeeType, ToPointeeType)) {
3016 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType) &&
3025 Context.areCompatibleVectorTypes(FromPointeeType, ToPointeeType)) {
3044 return Context.getQualifiedType(
T, Qs);
3046 return Context.getQualifiedType(
T.getUnqualifiedType(), Qs);
3051 bool &IncompatibleObjC) {
3064 if (ToObjCPtr && FromObjCPtr) {
3072 if (
Context.canAssignObjCInterfaces(ToObjCPtr, FromObjCPtr)) {
3086 if (
Context.canAssignObjCInterfaces(FromObjCPtr, ToObjCPtr)) {
3090 IncompatibleObjC =
true;
3106 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
3135 IncompatibleObjC)) {
3137 IncompatibleObjC =
true;
3138 ConvertedType =
Context.getPointerType(ConvertedType);
3147 IncompatibleObjC)) {
3149 ConvertedType =
Context.getPointerType(ConvertedType);
3162 if (FromFunctionType && ToFunctionType) {
3165 if (
Context.getCanonicalType(FromPointeeType)
3166 ==
Context.getCanonicalType(ToPointeeType))
3171 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3172 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
3173 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
3176 bool HasObjCConversion =
false;
3178 Context.getCanonicalType(ToFunctionType->getReturnType())) {
3181 ToFunctionType->getReturnType(),
3182 ConvertedType, IncompatibleObjC)) {
3184 HasObjCConversion =
true;
3191 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3192 ArgIdx != NumArgs; ++ArgIdx) {
3194 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3195 if (
Context.getCanonicalType(FromArgType)
3196 ==
Context.getCanonicalType(ToArgType)) {
3199 ConvertedType, IncompatibleObjC)) {
3201 HasObjCConversion =
true;
3208 if (HasObjCConversion) {
3212 IncompatibleObjC =
true;
3244 if (!FromFunctionType || !ToFunctionType)
3247 if (
Context.hasSameType(FromPointeeType, ToPointeeType))
3252 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3253 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3258 if (FromEInfo != ToEInfo)
3261 bool IncompatibleObjC =
false;
3263 ToFunctionType->getReturnType())) {
3267 QualType LHS = ToFunctionType->getReturnType();
3272 if (
Context.hasSameType(RHS,LHS)) {
3275 ConvertedType, IncompatibleObjC)) {
3276 if (IncompatibleObjC)
3285 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3286 ArgIdx != NumArgs; ++ArgIdx) {
3287 IncompatibleObjC =
false;
3289 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3290 if (
Context.hasSameType(FromArgType, ToArgType)) {
3293 ConvertedType, IncompatibleObjC)) {
3294 if (IncompatibleObjC)
3303 bool CanUseToFPT, CanUseFromFPT;
3304 if (!
Context.mergeExtParameterInfo(ToFunctionType, FromFunctionType,
3305 CanUseToFPT, CanUseFromFPT,
3309 ConvertedType = ToType;
3348 ToMember->getMostRecentCXXRecordDecl())) {
3350 if (ToMember->isSugared())
3352 ToMember->getMostRecentCXXRecordDecl());
3354 PDiag << ToMember->getQualifier();
3355 if (FromMember->isSugared())
3357 FromMember->getMostRecentCXXRecordDecl());
3359 PDiag << FromMember->getQualifier();
3377 !FromType->
getAs<TemplateSpecializationType>()) {
3383 if (
Context.hasSameType(FromType, ToType)) {
3392 if (!FromFunction || !ToFunction) {
3397 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3407 << ToFunction->getParamType(ArgPos)
3414 ToFunction->getReturnType())) {
3420 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3443 assert(llvm::size(Old) == llvm::size(
New) &&
3444 "Can't compare parameters of functions with different number of "
3447 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3449 size_t J =
Reversed ? (llvm::size(
New) - Idx - 1) : Idx;
3454 Context.removePtrSizeAddrSpace(
Type.getUnqualifiedType());
3456 Context.removePtrSizeAddrSpace((
New.begin() + J)->getUnqualifiedType());
3458 if (!
Context.hasSameType(OldType, NewType)) {
3483 unsigned OldIgnore =
3485 unsigned NewIgnore =
3492 NewPT->param_types().slice(NewIgnore),
3499 bool IgnoreBaseAccess,
3502 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3511 PDiag(diag::warn_impcast_bool_to_null_pointer)
3522 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3523 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {
3526 unsigned InaccessibleID = 0;
3527 unsigned AmbiguousID = 0;
3529 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3530 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3533 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3535 &BasePath, IgnoreBaseAccess))
3539 Kind = CK_DerivedToBase;
3542 if (
Diagnose && !IsCStyleOrFunctionalCast &&
3543 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3545 "this should only be possible with MSVCCompat!");
3557 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3560 Kind = CK_BlockPointerToObjCPointerCast;
3562 Kind = CK_CPointerToObjCPointerCast;
3566 Kind = CK_AnyPointerToBlockPointerCast;
3572 Kind = CK_NullToPointer;
3579 bool InOverloadResolution,
3589 ConvertedType = ToType;
3605 ConvertedType =
Context.getMemberPointerType(
3619 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
3627 Kind = CK_NullToMemberPointer;
3645 PD <<
Context.getCanonicalTagType(Cls);
3655 std::swap(
Base, Derived);
3664 PD <<
int(Direction);
3672 DiagFromTo(PD) <<
QualType(VBase, 0) << OpRange;
3680 ? CK_DerivedToBaseMemberPointer
3681 : CK_BaseToDerivedMemberPointer;
3683 if (!IgnoreBaseAccess)
3687 ? diag::err_upcast_to_inaccessible_base
3688 : diag::err_downcast_from_inaccessible_base,
3690 NestedNameSpecifier BaseQual = FromPtrType->getQualifier(),
3691 DerivedQual = ToPtrType->getQualifier();
3692 if (Direction == MemberPointerConversionDirection::Upcast)
3693 std::swap(BaseQual, DerivedQual);
3694 DiagCls(PD, DerivedQual, Derived);
3695 DiagCls(PD, BaseQual, Base);
3730 bool CStyle,
bool IsTopLevel,
3731 bool &PreviousToQualsIncludeConst,
3732 bool &ObjCLifetimeConversion,
3745 ObjCLifetimeConversion =
true;
3785 !PreviousToQualsIncludeConst)
3803 PreviousToQualsIncludeConst =
3804 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3810 bool CStyle,
bool &ObjCLifetimeConversion) {
3811 FromType =
Context.getCanonicalType(FromType);
3812 ToType =
Context.getCanonicalType(ToType);
3813 ObjCLifetimeConversion =
false;
3823 bool PreviousToQualsIncludeConst =
true;
3824 bool UnwrappedAnyPointer =
false;
3825 while (
Context.UnwrapSimilarTypes(FromType, ToType)) {
3827 !UnwrappedAnyPointer,
3828 PreviousToQualsIncludeConst,
3831 UnwrappedAnyPointer =
true;
3839 return UnwrappedAnyPointer &&
Context.hasSameUnqualifiedType(FromType,ToType);
3848 bool InOverloadResolution,
3857 InOverloadResolution, InnerSCS,
3874 if (CtorType->getNumParams() > 0) {
3875 QualType FirstArg = CtorType->getParamType(0);
3887 bool AllowExplicit) {
3894 bool Usable = !Info.Constructor->isInvalidDecl() &&
3897 bool SuppressUserConversions =
false;
3898 if (Info.ConstructorTmpl)
3901 CandidateSet, SuppressUserConversions,
3906 CandidateSet, SuppressUserConversions,
3907 false, AllowExplicit);
3911 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
3914 switch (
auto Result =
3938 llvm_unreachable(
"Invalid OverloadResult!");
3960 bool AllowObjCConversionOnExplicit) {
3961 assert(AllowExplicit != AllowedExplicit::None ||
3962 !AllowObjCConversionOnExplicit);
3966 bool ConstructorsOnly =
false;
3970 if (
const RecordType *ToRecordType = ToType->
getAsCanonical<RecordType>()) {
3982 ConstructorsOnly =
true;
3986 }
else if (
auto *ToRecordDecl =
3987 dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
3988 ToRecordDecl = ToRecordDecl->getDefinitionOrSelf();
3990 Expr **Args = &From;
3991 unsigned NumArgs = 1;
3992 bool ListInitializing =
false;
3993 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
3996 S, From, ToType, ToRecordDecl, User, CandidateSet,
3997 AllowExplicit == AllowedExplicit::All);
4006 Args = InitList->getInits();
4007 NumArgs = InitList->getNumInits();
4008 ListInitializing =
true;
4016 bool Usable = !Info.Constructor->isInvalidDecl();
4017 if (!ListInitializing)
4018 Usable = Usable && Info.Constructor->isConvertingConstructor(
4021 bool SuppressUserConversions = !ConstructorsOnly;
4029 if (SuppressUserConversions && ListInitializing) {
4030 SuppressUserConversions =
4035 if (Info.ConstructorTmpl)
4037 Info.ConstructorTmpl, Info.FoundDecl,
4039 CandidateSet, SuppressUserConversions,
4041 AllowExplicit == AllowedExplicit::All);
4047 SuppressUserConversions,
4049 AllowExplicit == AllowedExplicit::All);
4059 }
else if (
const RecordType *FromRecordType =
4061 if (
auto *FromRecordDecl =
4062 dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
4063 FromRecordDecl = FromRecordDecl->getDefinitionOrSelf();
4065 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
4066 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4075 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)))
4082 ConvTemplate, FoundDecl, ActingContext, From, ToType,
4083 CandidateSet, AllowObjCConversionOnExplicit,
4084 AllowExplicit != AllowedExplicit::None);
4087 CandidateSet, AllowObjCConversionOnExplicit,
4088 AllowExplicit != AllowedExplicit::None);
4093 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4096 switch (
auto Result =
4102 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
4114 if (Best->Conversions[0].isEllipsis())
4117 User.
Before = Best->Conversions[0].Standard;
4130 = dyn_cast<CXXConversionDecl>(Best->Function)) {
4132 assert(Best->HasFinalConversion);
4140 User.
Before = Best->Conversions[0].Standard;
4155 User.
After = Best->FinalConversion;
4158 llvm_unreachable(
"Not a constructor or conversion function?");
4167 llvm_unreachable(
"Invalid OverloadResult!");
4177 CandidateSet, AllowedExplicit::None,
false);
4192 diag::err_typecheck_nonviable_condition_incomplete,
4199 *
this, From, Cands);
4225 if (!Conv1 || !Conv2)
4240 if (Block1 != Block2)
4253 if (Conv1FuncRet && Conv2FuncRet &&
4262 CallOp->getType()->castAs<
FunctionType>()->getCallConv();
4264 CallOpProto->isVariadic(),
false);
4266 CallOpProto->isVariadic(),
true);
4268 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4363 if (!ICS1.
isBad()) {
4364 bool StdInit1 =
false, StdInit2 =
false;
4371 if (StdInit1 != StdInit2)
4382 CAT2->getElementType())) {
4384 if (CAT1->getSize() != CAT2->getSize())
4386 return CAT1->getSize().ult(CAT2->getSize())
4421 if (ConvFunc1 == ConvFunc2)
4523 if (!
Enum->isFixed())
4559 else if (Rank2 < Rank1)
4594 bool SCS1ConvertsToVoid
4596 bool SCS2ConvertsToVoid
4598 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4603 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4609 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4638 if (FromObjCPtr1 && FromObjCPtr2) {
4643 if (AssignLeft != AssignRight) {
4678 if (UnqualT1 == UnqualT2) {
4740 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4741 return SCS1IsCompatibleVectorConversion
4748 bool SCS1IsCompatibleSVEVectorConversion =
4750 bool SCS2IsCompatibleSVEVectorConversion =
4753 if (SCS1IsCompatibleSVEVectorConversion !=
4754 SCS2IsCompatibleSVEVectorConversion)
4755 return SCS1IsCompatibleSVEVectorConversion
4762 bool SCS1IsCompatibleRVVVectorConversion =
4764 bool SCS2IsCompatibleRVVVectorConversion =
4767 if (SCS1IsCompatibleRVVVectorConversion !=
4768 SCS2IsCompatibleRVVVectorConversion)
4769 return SCS1IsCompatibleRVVVectorConversion
4809 if (UnqualT1 == UnqualT2)
4827 bool ObjCLifetimeConversion;
4837 if (CanPick1 != CanPick2)
4891 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
4899 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
4916 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
4923 bool FromAssignRight
4932 if (ToPtr1->isObjCIdType() &&
4933 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
4935 if (ToPtr2->isObjCIdType() &&
4936 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
4941 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
4943 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
4948 if (ToPtr1->isObjCClassType() &&
4949 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
4951 if (ToPtr2->isObjCClassType() &&
4952 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
4957 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
4959 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
4965 (ToAssignLeft != ToAssignRight)) {
4976 }
else if (IsSecondSame)
4985 (FromAssignLeft != FromAssignRight))
4999 CXXRecordDecl *FromPointee1 = FromMemPointer1->getMostRecentCXXRecordDecl();
5004 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5011 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
5049 if (!
T.getQualifiers().hasUnaligned())
5063 "T1 must be the pointee type of the reference type");
5064 assert(!OrigT2->
isReferenceType() &&
"T2 cannot be a reference type");
5087 if (UnqualT1 == UnqualT2) {
5091 Conv |= ReferenceConversions::DerivedToBase;
5094 Context.canBindObjCObjectType(UnqualT1, UnqualT2))
5095 Conv |= ReferenceConversions::ObjC;
5098 Conv |= ReferenceConversions::Function;
5102 bool ConvertedReferent = Conv != 0;
5106 bool PreviousToQualsIncludeConst =
true;
5107 bool TopLevel =
true;
5113 Conv |= ReferenceConversions::Qualification;
5119 Conv |= ReferenceConversions::NestedQualification;
5127 bool ObjCLifetimeConversion =
false;
5129 PreviousToQualsIncludeConst,
5131 return (ConvertedReferent ||
Context.hasSimilarType(T1, T2))
5136 if (ObjCLifetimeConversion)
5137 Conv |= ReferenceConversions::ObjCLifetime;
5140 }
while (
Context.UnwrapSimilarTypes(T1, T2));
5145 return (ConvertedReferent ||
Context.hasSameUnqualifiedType(T1, T2))
5156 bool AllowExplicit) {
5157 assert(T2->
isRecordType() &&
"Can only find conversions of record types.");
5161 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5162 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5169 = dyn_cast<FunctionTemplateDecl>(D);
5186 if (!ConvTemplate &&
5210 ConvTemplate, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5211 false, AllowExplicit);
5214 Conv, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5215 false, AllowExplicit);
5218 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5224 assert(Best->HasFinalConversion);
5236 if (!Best->FinalConversion.DirectBinding)
5248 "Expected a direct reference binding!");
5254 Cand != CandidateSet.
end(); ++Cand)
5266 llvm_unreachable(
"Invalid OverloadResult!");
5271static ImplicitConversionSequence
5274 bool SuppressUserConversions,
5275 bool AllowExplicit) {
5276 assert(DeclType->
isReferenceType() &&
"Reference init needs a reference");
5303 auto SetAsReferenceBinding = [&](
bool BindsDirectly) {
5308 ICS.
Standard.
Second = (RefConv & Sema::ReferenceConversions::DerivedToBase)
5310 : (RefConv & Sema::ReferenceConversions::ObjC)
5318 Sema::ReferenceConversions::NestedQualification)
5332 (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0;
5356 SetAsReferenceBinding(
true);
5405 SetAsReferenceBinding(S.
getLangOpts().CPlusPlus11 ||
5496 AllowedExplicit::None,
5521 if (isRValRef && LValRefType) {
5538static ImplicitConversionSequence
5540 bool SuppressUserConversions,
5541 bool InOverloadResolution,
5542 bool AllowObjCWritebackConversion,
5543 bool AllowExplicit =
false);
5547static ImplicitConversionSequence
5549 bool SuppressUserConversions,
5550 bool InOverloadResolution,
5551 bool AllowObjCWritebackConversion) {
5564 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT))
5566 InitTy = IAT->getElementType();
5592 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5598 SuppressUserConversions,
5599 InOverloadResolution,
5600 AllowObjCWritebackConversion);
5608 Result.setStandard();
5609 Result.Standard.setAsIdentityConversion();
5610 Result.Standard.setFromType(ToType);
5611 Result.Standard.setAllToTypes(ToType);
5636 bool IsUnbounded =
false;
5640 if (CT->getSize().ult(e)) {
5644 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5647 if (CT->getSize().ugt(e)) {
5653 S, &EmptyList, InitTy, SuppressUserConversions,
5654 InOverloadResolution, AllowObjCWritebackConversion);
5655 if (DfltElt.
isBad()) {
5659 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5670 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5679 Result.setStandard();
5680 Result.Standard.setAsIdentityConversion();
5681 Result.Standard.setFromType(InitTy);
5682 Result.Standard.setAllToTypes(InitTy);
5683 for (
unsigned i = 0; i < e; ++i) {
5686 S,
Init, InitTy, SuppressUserConversions, InOverloadResolution,
5687 AllowObjCWritebackConversion);
5697 if (Result.isBad()) {
5698 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5708 S, From->
getEndLoc(), DfltElt, Result) ==
5726 AllowedExplicit::None,
5727 InOverloadResolution,
false,
5728 AllowObjCWritebackConversion,
5746 Result.setUserDefined();
5747 Result.UserDefined.Before.setAsIdentityConversion();
5749 Result.UserDefined.Before.setFromType(
QualType());
5750 Result.UserDefined.Before.setAllToTypes(
QualType());
5752 Result.UserDefined.After.setAsIdentityConversion();
5753 Result.UserDefined.After.setFromType(ToType);
5754 Result.UserDefined.After.setAllToTypes(ToType);
5755 Result.UserDefined.ConversionFunction =
nullptr;
5772 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5793 SuppressUserConversions,
5801 InOverloadResolution,
5802 AllowObjCWritebackConversion);
5803 if (Result.isFailure())
5805 assert(!Result.isEllipsis() &&
5806 "Sub-initialization cannot result in ellipsis conversion.");
5812 Result.UserDefined.After;
5840 S, From->
getInit(0), ToType, SuppressUserConversions,
5841 InOverloadResolution, AllowObjCWritebackConversion);
5842 if (Result.isStandard())
5843 Result.Standard.FromBracedInitList =
true;
5847 else if (NumInits == 0) {
5848 Result.setStandard();
5849 Result.Standard.setAsIdentityConversion();
5850 Result.Standard.setFromType(ToType);
5851 Result.Standard.setAllToTypes(ToType);
5868static ImplicitConversionSequence
5870 bool SuppressUserConversions,
5871 bool InOverloadResolution,
5872 bool AllowObjCWritebackConversion,
5873 bool AllowExplicit) {
5874 if (
InitListExpr *FromInitList = dyn_cast<InitListExpr>(From))
5876 InOverloadResolution,AllowObjCWritebackConversion);
5881 SuppressUserConversions, AllowExplicit);
5884 SuppressUserConversions,
5885 AllowedExplicit::None,
5886 InOverloadResolution,
5888 AllowObjCWritebackConversion,
5901 return !ICS.
isBad();
5910 const CXXRecordDecl *ActingContext,
bool InOverloadResolution =
false,
5912 bool SuppressUserConversion =
false) {
5920 assert(FromClassification.
isLValue());
5931 if (Method->isExplicitObjectMemberFunction()) {
5932 if (ExplicitParameterType.isNull())
5933 ExplicitParameterType = Method->getFunctionObjectParameterReferenceType();
5935 ValueKindFromClassification(FromClassification));
5937 S, &TmpExpr, ExplicitParameterType, SuppressUserConversion,
5954 Qualifiers Quals = Method->getMethodQualifiers();
5992 FromType, ImplicitParamType);
6002 FromType, ImplicitParamType);
6015 }
else if (!Method->isExplicitObjectMemberFunction()) {
6017 FromType, ImplicitParamType);
6022 switch (Method->getRefQualifier()) {
6037 if (!FromClassification.
isRValue()) {
6059 = (Method->getRefQualifier() ==
RQ_None);
6070 QualType ImplicitParamRecordType =
Method->getFunctionObjectParameterType();
6075 DestType =
Method->getThisType();
6078 FromRecordType = From->
getType();
6079 DestType = ImplicitParamRecordType;
6087 Method->getRefQualifier() !=
6105 <<
Method->getDeclName() << FromRecordType << (CVR - 1)
6107 Diag(
Method->getLocation(), diag::note_previous_decl)
6108 <<
Method->getDeclName();
6116 bool IsRValueQualified =
6120 << IsRValueQualified;
6121 Diag(
Method->getLocation(), diag::note_previous_decl)
6122 <<
Method->getDeclName();
6132 llvm_unreachable(
"Lists are not objects");
6135 return Diag(From->
getBeginLoc(), diag::err_member_function_call_bad_type)
6136 << ImplicitParamRecordType << FromRecordType
6145 From = FromRes.
get();
6154 CK = CK_AddressSpaceConversion;
6179 AllowedExplicit::Conversions,
6260 llvm_unreachable(
"found a first conversion kind in Second");
6264 llvm_unreachable(
"found a third conversion kind in Second");
6270 llvm_unreachable(
"unknown conversion kind");
6280 [[maybe_unused]]
bool isCCEAllowedPreCXX11 =
6282 assert((S.
getLangOpts().CPlusPlus11 || isCCEAllowedPreCXX11) &&
6283 "converted constant expression outside C++11 or TTP matching");
6307 if (
T->isRecordType())
6316 diag::err_typecheck_converted_constant_expression)
6322 llvm_unreachable(
"bad conversion in converted constant expression");
6328 diag::err_typecheck_converted_constant_expression_disallowed)
6334 diag::err_typecheck_converted_constant_expression_indirect)
6344 diag::err_reference_bind_to_bitfield_in_cce)
6352 bool IsTemplateArgument =
6354 if (
T->isRecordType()) {
6355 assert(IsTemplateArgument &&
6356 "unexpected class type converted constant expr");
6365 if (Result.isInvalid())
6372 IsTemplateArgument);
6373 if (Result.isInvalid())
6377 bool ReturnPreNarrowingValue =
false;
6380 PreNarrowingType)) {
6390 PreNarrowingValue.
isInt()) {
6393 ReturnPreNarrowingValue =
true;
6413 << CCE << 0 << From->
getType() <<
T;
6416 if (!ReturnPreNarrowingValue)
6417 PreNarrowingValue = {};
6433 if (Result.isInvalid() || Result.get()->isValueDependent()) {
6438 RequireInt, PreNarrowingValue);
6445 return ::BuildConvertedConstantExpression(*
this, From,
T, CCE, Dest,
6452 return ::CheckConvertedConstantExpression(*
this, From,
T,
Value, CCE,
false,
6457 llvm::APSInt &
Value,
6459 assert(
T->isIntegralOrEnumerationType() &&
"unexpected converted const type");
6464 if (!R.isInvalid() && !R.get()->isValueDependent())
6472 const APValue &PreNarrowingValue) {
6484 Kind = ConstantExprKind::ClassTemplateArgument;
6486 Kind = ConstantExprKind::NonClassTemplateArgument;
6488 Kind = ConstantExprKind::Normal;
6491 (RequireInt && !Eval.
Val.
isInt())) {
6498 if (Notes.empty()) {
6501 if (
const auto *CE = dyn_cast<ConstantExpr>(E)) {
6505 "ConstantExpr has no value associated with it");
6511 Value = std::move(PreNarrowingValue);
6517 if (Notes.size() == 1 &&
6518 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6519 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6520 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6521 diag::note_constexpr_invalid_template_arg) {
6522 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6523 for (
unsigned I = 0; I < Notes.size(); ++I)
6524 Diag(Notes[I].first, Notes[I].second);
6528 for (
unsigned I = 0; I < Notes.size(); ++I)
6529 Diag(Notes[I].first, Notes[I].second);
6548static ImplicitConversionSequence
6556 AllowedExplicit::Conversions,
6598 "expected a member expression");
6600 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6601 M && !M->isImplicitAccess())
6602 Base = M->getBase();
6603 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6604 M && !M->isImplicitAccess())
6605 Base = M->getBase();
6609 if (
T->isPointerType())
6610 T =
T->getPointeeType();
6638 assert(Method->isExplicitObjectMemberFunction() &&
6639 "Method is not an explicit member function");
6640 assert(NewArgs.empty() &&
"NewArgs should be empty");
6642 NewArgs.reserve(Args.size() + 1);
6644 NewArgs.push_back(
This);
6645 NewArgs.append(Args.begin(), Args.end());
6648 Method, Object->getBeginLoc());
6654 return AllowScopedEnumerations ?
T->isIntegralOrEnumerationType()
6655 :
T->isIntegralOrUnscopedEnumerationType();
6667 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6681 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6689 std::string TypeStr;
6694 "static_cast<" + TypeStr +
">(")
6706 HadMultipleCandidates);
6707 if (Result.isInvalid())
6713 From, Result.get()->
getType());
6714 if (Result.isInvalid())
6716 From = Result.get();
6739 HadMultipleCandidates);
6740 if (Result.isInvalid())
6744 CK_UserDefinedConversion, Result.get(),
6745 nullptr, Result.get()->getValueKind(),
6770 if (
auto *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)) {
6772 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
6778 Conv, FoundDecl, ActingContext, From, ToType, CandidateSet,
6812 From = result.
get();
6826 const RecordType *RecordTy =
T->getAsCanonical<RecordType>();
6839 : Converter(Converter), From(From) {}
6844 } IncompleteDiagnoser(Converter, From);
6855 ->getDefinitionOrSelf()
6856 ->getVisibleConversionFunctions();
6858 bool HadMultipleCandidates =
6863 bool HasUniqueTargetType =
true;
6879 "Conversion operator templates are considered potentially "
6883 if (Converter.
match(CurToType) || ConvTemplate) {
6889 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
6894 else if (HasUniqueTargetType &&
6896 HasUniqueTargetType =
false;
6898 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
6916 HadMultipleCandidates,
6917 ExplicitConversions))
6923 if (!HasUniqueTargetType)
6942 HadMultipleCandidates,
Found))
6951 HadMultipleCandidates,
6952 ExplicitConversions))
6960 switch (ViableConversions.
size()) {
6963 HadMultipleCandidates,
6964 ExplicitConversions))
6974 HadMultipleCandidates,
Found))
7005 if (Proto->getNumParams() < 1)
7009 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
7010 if (Context.hasSameUnqualifiedType(T1, ArgType))
7014 if (Proto->getNumParams() < 2)
7018 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
7019 if (Context.hasSameUnqualifiedType(T2, ArgType))
7038 unsigned SeenAt = 0;
7040 bool HasDefault =
false;
7049 return HasDefault || SeenAt != 0;
7055 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
7058 bool StrictPackMatch) {
7061 assert(Proto &&
"Functions without a prototype cannot be overloaded");
7062 assert(!
Function->getDescribedFunctionTemplate() &&
7063 "Use AddTemplateOverloadCandidate for function templates");
7076 CandidateSet, SuppressUserConversions,
7077 PartialOverloading, EarlyConversions, PO,
7113 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
7127 Candidate.
Viable =
false;
7140 bool IsImplicitlyInstantiated =
false;
7141 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo()) {
7142 ND = SpecInfo->getTemplate();
7143 IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() ==
7154 const bool IsInlineFunctionInGMF =
7156 (IsImplicitlyInstantiated ||
Function->isInlined());
7159 Candidate.
Viable =
false;
7166 Candidate.
Viable =
false;
7177 if (Args.size() == 1 &&
Constructor->isSpecializationCopyingObject() &&
7178 (
Context.hasSameUnqualifiedType(ClassType, Args[0]->getType()) ||
7181 Candidate.
Viable =
false;
7193 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.
getDecl());
7194 if (Shadow && Args.size() == 1 &&
Constructor->getNumParams() >= 1 &&
7195 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
7202 Candidate.
Viable =
false;
7211 Constructor->getMethodQualifiers().getAddressSpace(),
7213 Candidate.
Viable =
false;
7226 Candidate.
Viable =
false;
7236 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7237 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7238 !PartialOverloading) {
7240 Candidate.
Viable =
false;
7254 Candidate.
Viable =
false;
7260 if (
Function->getTrailingRequiresClause()) {
7265 Candidate.
Viable =
false;
7274 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7277 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7280 }
else if (ArgIdx < NumParams) {
7291 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7294 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7296 Candidate.
Viable =
false;
7308 if (EnableIfAttr *FailedAttr =
7310 Candidate.
Viable =
false;
7320 if (Methods.size() <= 1)
7323 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7329 if (
Method->param_size() > NumNamedArgs)
7330 NumNamedArgs =
Method->param_size();
7331 if (Args.size() < NumNamedArgs)
7334 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7336 if (Args[i]->isTypeDependent()) {
7342 Expr *argExpr = Args[i];
7343 assert(argExpr &&
"SelectBestMethod(): missing expression");
7348 !param->
hasAttr<CFConsumedAttr>())
7349 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7366 if (ConversionState.
isBad() ||
7376 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7377 if (Args[i]->isTypeDependent()) {
7390 if (Args.size() != NumNamedArgs)
7392 else if (
Match && NumNamedArgs == 0 && Methods.size() > 1) {
7395 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7396 QualType ReturnT = Methods[
b]->getReturnType();
7416 "Shouldn't have `this` for ctors!");
7417 assert(!Method->isStatic() &&
"Shouldn't have `this` for static methods!");
7419 ThisArg, std::nullopt, Method, Method);
7422 ConvertedThis = R.
get();
7424 if (
auto *MD = dyn_cast<CXXMethodDecl>(Function)) {
7426 assert((MissingImplicitThis || MD->isStatic() ||
7428 "Expected `this` for non-ctor instance methods");
7430 ConvertedThis =
nullptr;
7435 unsigned ArgSizeNoVarargs = std::min(Function->param_size(), Args.size());
7438 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7441 S.
Context, Function->getParamDecl(I)),
7447 ConvertedArgs.push_back(R.
get());
7454 if (!Function->isVariadic() && Args.size() < Function->getNumParams()) {
7455 for (
unsigned i = Args.size(), e = Function->getNumParams(); i != e; ++i) {
7462 ConvertedArgs.push_back(R.
get());
7474 bool MissingImplicitThis) {
7475 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7476 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7482 Expr *DiscardedThis;
7484 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7485 true, DiscardedThis, ConvertedArgs))
7486 return *EnableIfAttrs.begin();
7488 for (
auto *EIA : EnableIfAttrs) {
7492 if (EIA->getCond()->isValueDependent() ||
7493 !EIA->getCond()->EvaluateWithSubstitution(
7497 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7503template <
typename CheckFn>
7506 CheckFn &&IsSuccessful) {
7509 if (ArgDependent == DIA->getArgDependent())
7510 Attrs.push_back(DIA);
7517 auto WarningBegin = std::stable_partition(
7518 Attrs.begin(), Attrs.end(), [](
const DiagnoseIfAttr *DIA) {
7519 return DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_error &&
7520 DIA->getWarningGroup().empty();
7525 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7527 if (ErrAttr != WarningBegin) {
7528 const DiagnoseIfAttr *DIA = *ErrAttr;
7529 S.
Diag(Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7530 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7531 << DIA->getParent() << DIA->getCond()->getSourceRange();
7535 auto ToSeverity = [](DiagnoseIfAttr::DefaultSeverity Sev) {
7537 case DiagnoseIfAttr::DS_warning:
7539 case DiagnoseIfAttr::DS_error:
7542 llvm_unreachable(
"Fully covered switch above!");
7545 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7546 if (IsSuccessful(DIA)) {
7547 if (DIA->getWarningGroup().empty() &&
7548 DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_warning) {
7549 S.
Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7550 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7551 << DIA->getParent() << DIA->getCond()->getSourceRange();
7554 DIA->getWarningGroup());
7557 {ToSeverity(DIA->getDefaultSeverity()),
"%0",
7559 S.
Diag(Loc, DiagID) << DIA->getMessage();
7567 const Expr *ThisArg,
7572 [&](
const DiagnoseIfAttr *DIA) {
7577 if (!DIA->getCond()->EvaluateWithSubstitution(
7580 return Result.isInt() &&
Result.getInt().getBoolValue();
7587 *
this, ND,
false, Loc,
7588 [&](
const DiagnoseIfAttr *DIA) {
7590 return DIA->getCond()->EvaluateAsBooleanCondition(
Result,
Context) &&
7599 bool SuppressUserConversions,
7600 bool PartialOverloading,
7601 bool FirstArgumentIsBase) {
7613 if (Args.size() > 0) {
7614 if (
Expr *E = Args[0]) {
7624 FunctionArgs = Args.slice(1);
7628 FunTmpl, F.getPair(),
7630 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7631 FunctionArgs, CandidateSet, SuppressUserConversions,
7632 PartialOverloading);
7636 ObjectClassification, FunctionArgs, CandidateSet,
7637 SuppressUserConversions, PartialOverloading);
7644 if (Args.size() > 0 &&
7648 FunctionArgs = Args.slice(1);
7652 ExplicitTemplateArgs, FunctionArgs,
7653 CandidateSet, SuppressUserConversions,
7654 PartialOverloading);
7657 SuppressUserConversions, PartialOverloading);
7667 bool SuppressUserConversions,
7677 "Expected a member function template");
7679 nullptr, ObjectType,
7680 ObjectClassification, Args, CandidateSet,
7681 SuppressUserConversions,
false, PO);
7684 ObjectType, ObjectClassification, Args, CandidateSet,
7685 SuppressUserConversions,
false, {}, PO);
7698 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7700 "Use AddOverloadCandidate for constructors");
7709 Method->isMoveAssignmentOperator())
7716 bool IgnoreExplicitObject =
7717 (
Method->isExplicitObjectMemberFunction() &&
7720 bool ImplicitObjectMethodTreatedAsStatic =
7723 Method->isImplicitObjectMemberFunction();
7725 unsigned ExplicitOffset =
7726 !IgnoreExplicitObject &&
Method->isExplicitObjectMemberFunction() ? 1 : 0;
7728 unsigned NumParams =
Method->getNumParams() - ExplicitOffset +
7729 int(ImplicitObjectMethodTreatedAsStatic);
7731 unsigned ExtraArgs =
7738 CandidateSet.
addCandidate(Args.size() + ExtraArgs, EarlyConversions);
7754 Candidate.
Viable =
false;
7764 unsigned MinRequiredArgs =
Method->getMinRequiredArguments() -
7766 int(ImplicitObjectMethodTreatedAsStatic);
7768 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
7770 Candidate.
Viable =
false;
7778 if (!IgnoreExplicitObject) {
7781 else if (
Method->isStatic()) {
7791 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
7796 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
7797 Method, ActingContext,
true);
7798 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
7799 Candidate.
Viable =
false;
7810 Candidate.
Viable =
false;
7815 if (
Method->getTrailingRequiresClause()) {
7820 Candidate.
Viable =
false;
7828 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7831 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7834 }
else if (ArgIdx < NumParams) {
7840 if (ImplicitObjectMethodTreatedAsStatic) {
7841 ParamType = ArgIdx == 0
7842 ?
Method->getFunctionObjectParameterReferenceType()
7845 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
7849 SuppressUserConversions,
7854 Candidate.
Viable =
false;
7866 if (EnableIfAttr *FailedAttr =
7868 Candidate.
Viable =
false;
7875 Candidate.
Viable =
false;
7886 bool SuppressUserConversions,
bool PartialOverloading,
7904 PartialOverloading,
false,
7905 false, ObjectType, ObjectClassification,
7909 bool OnlyInitializeNonUserDefinedConversions) {
7910 return S.CheckNonDependentConversions(
7911 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
7912 Sema::CheckNonDependentConversionsFlag(
7913 SuppressUserConversions,
7914 OnlyInitializeNonUserDefinedConversions),
7915 ActingContext, ObjectType, ObjectClassification, PO);
7919 CandidateSet.
addCandidate(Conversions.size(), Conversions);
7922 Candidate.
Viable =
false;
7931 Method->isStatic() ||
7932 (!Method->isExplicitObjectMemberFunction() && ObjectType.
isNull());
7946 assert(
Specialization &&
"Missing member function template specialization?");
7948 "Specialization is not a member function?");
7951 ObjectClassification, Args, CandidateSet, SuppressUserConversions,
7965 if (ExplicitTemplateArgs ||
7968 *
this, CandidateSet, MethodTmpl, FoundDecl, ActingContext,
7969 ExplicitTemplateArgs, ObjectType, ObjectClassification, Args,
7970 SuppressUserConversions, PartialOverloading, PO);
7975 MethodTmpl, FoundDecl, ActingContext, ObjectType, ObjectClassification,
7976 Args, SuppressUserConversions, PartialOverloading, PO);
7994 bool SuppressUserConversions,
bool PartialOverloading,
bool AllowExplicit,
7996 bool AggregateCandidateDeduction) {
8005 Candidate.
Viable =
false;
8025 PartialOverloading, AggregateCandidateDeduction,
8032 bool OnlyInitializeNonUserDefinedConversions) {
8033 return S.CheckNonDependentConversions(
8034 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
8035 Sema::CheckNonDependentConversionsFlag(
8036 SuppressUserConversions,
8037 OnlyInitializeNonUserDefinedConversions),
8038 nullptr, QualType(), {}, PO);
8041 OverloadCandidate &Candidate =
8042 CandidateSet.addCandidate(Conversions.size(), Conversions);
8045 Candidate.
Viable =
false;
8047 CandidateSet.getRewriteInfo().getRewriteKind(Candidate.
Function, PO);
8053 CandidateSet.getKind() ==
8059 ->isExplicitObjectMemberFunction() &&
8075 assert(
Specialization &&
"Missing function template specialization?");
8077 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
8078 PartialOverloading, AllowExplicit,
8079 false, IsADLCandidate, Conversions, PO,
8080 Info.AggregateDeductionCandidateHasMismatchedArity,
8081 Info.hasStrictPackMatch());
8088 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
8095 if (ExplicitTemplateArgs ||
8098 DependentExplicitSpecifier)) {
8102 Args, SuppressUserConversions, PartialOverloading, AllowExplicit,
8103 IsADLCandidate, PO, AggregateCandidateDeduction);
8105 if (DependentExplicitSpecifier)
8112 PartialOverloading, AllowExplicit, IsADLCandidate, PO,
8113 AggregateCandidateDeduction);
8126 const bool AllowExplicit =
false;
8128 bool ForOverloadSetAddressResolution =
8131 auto *
Method = dyn_cast<CXXMethodDecl>(FD);
8132 bool HasThisConversion = !ForOverloadSetAddressResolution &&
Method &&
8134 unsigned ThisConversions = HasThisConversion ? 1 : 0;
8150 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
8151 !ParamTypes[0]->isDependentType()) {
8153 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8154 Method, ActingContext,
true,
8155 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
8165 auto MaybeInvolveUserDefinedConversion = [&](
QualType ParamType,
8189 if (
auto *RD =
ArgType->getAsCXXRecordDecl();
8190 RD && RD->hasDefinition() &&
8191 !RD->getVisibleConversionFunctions().empty())
8198 HasThisConversion &&
Method->hasCXXExplicitFunctionObjectParameter() ? 1
8201 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
8203 QualType ParamType = ParamTypes[I + Offset];
8207 ConvIdx = Args.size() - 1 - I;
8208 assert(Args.size() + ThisConversions == 2 &&
8209 "number of args (including 'this') must be exactly 2 for "
8213 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
8216 ConvIdx = ThisConversions + I;
8221 MaybeInvolveUserDefinedConversion(ParamType, Args[I]->
getType()))
8250 bool AllowObjCPointerConversion) {
8258 bool ObjCLifetimeConversion;
8260 ObjCLifetimeConversion))
8265 if (!AllowObjCPointerConversion)
8269 bool IncompatibleObjC =
false;
8279 bool AllowExplicit,
bool AllowResultConversion,
bool StrictPackMatch) {
8281 "Conversion function templates use AddTemplateConversionCandidate");
8296 if (!AllowResultConversion &&
8308 AllowObjCConversionOnExplicit))
8330 if (!AllowExplicit && Conversion->
isExplicit()) {
8331 Candidate.
Viable =
false;
8358 Candidate.
Viable =
false;
8367 Candidate.
Viable =
false;
8378 QualType ToCanon =
Context.getCanonicalType(ToType).getUnqualifiedType();
8379 if (FromCanon == ToCanon ||
8381 Candidate.
Viable =
false;
8398 CK_FunctionToPointerDecay, &ConversionRef,
8403 Candidate.
Viable =
false;
8433 Candidate.
Viable =
false;
8445 Candidate.
Viable =
false;
8452 Candidate.
Viable =
false;
8458 "Can only end up with a standard conversion sequence or failure");
8461 if (EnableIfAttr *FailedAttr =
8463 Candidate.
Viable =
false;
8470 Candidate.
Viable =
false;
8479 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
8480 bool AllowResultConversion) {
8489 Candidate.
Viable =
false;
8506 Candidate.
Viable =
false;
8516 assert(
Specialization &&
"Missing function template specialization?");
8518 ToType, CandidateSet, AllowObjCConversionOnExplicit,
8519 AllowExplicit, AllowResultConversion,
8527 bool AllowExplicit,
bool AllowResultConversion) {
8529 "Only conversion function templates permitted here");
8540 ToType, AllowObjCConversionOnExplicit, AllowExplicit,
8541 AllowResultConversion);
8549 AllowObjCConversionOnExplicit, AllowExplicit, AllowResultConversion);
8584 *
this, CandidateSet.
getLocation(), Object->getType(),
8585 Object->Classify(
Context), Conversion, ActingContext);
8588 if (ObjectInit.
isBad()) {
8589 Candidate.
Viable =
false;
8600 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8601 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8602 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8603 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8606 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8614 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8615 Candidate.
Viable =
false;
8622 if (Args.size() < NumParams) {
8624 Candidate.
Viable =
false;
8631 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8632 if (ArgIdx < NumParams) {
8645 Candidate.
Viable =
false;
8662 Candidate.
Viable =
false;
8668 if (EnableIfAttr *FailedAttr =
8670 Candidate.
Viable =
false;
8694 "unqualified operator lookup found a member function");
8698 FunctionArgs, CandidateSet);
8704 FunctionArgs[1], FunctionArgs[0]);
8706 Reversed, CandidateSet,
false,
false,
true,
8707 ADLCallKind::NotADL,
8711 if (ExplicitTemplateArgs)
8716 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
8717 false,
false,
true,
false, ADLCallKind::NotADL, {},
8749 if (!T1RD || (!IsComplete && !T1RD->isBeingDefined()))
8757 OperEnd = Operators.
end();
8758 Oper != OperEnd; ++Oper) {
8759 if (Oper->getAsFunction() &&
8762 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
8765 Args[0]->Classify(
Context), Args.slice(1),
8766 CandidateSet,
false, PO);
8773 bool IsAssignmentOperator,
8774 unsigned NumContextualBoolArguments) {
8789 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8802 if (ArgIdx < NumContextualBoolArguments) {
8803 assert(ParamTys[ArgIdx] ==
Context.BoolTy &&
8804 "Contextual conversion to bool requires bool type");
8810 ArgIdx == 0 && IsAssignmentOperator,
8816 Candidate.
Viable =
false;
8829class BuiltinCandidateTypeSet {
8835 TypeSet PointerTypes;
8839 TypeSet MemberPointerTypes;
8843 TypeSet EnumerationTypes;
8847 TypeSet VectorTypes;
8851 TypeSet MatrixTypes;
8854 TypeSet BitIntTypes;
8857 bool HasNonRecordTypes;
8861 bool HasArithmeticOrEnumeralTypes;
8865 bool HasNullPtrType;
8874 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
8876 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
8880 typedef TypeSet::iterator
iterator;
8882 BuiltinCandidateTypeSet(
Sema &SemaRef)
8883 : HasNonRecordTypes(
false),
8884 HasArithmeticOrEnumeralTypes(
false),
8885 HasNullPtrType(
false),
8887 Context(SemaRef.Context) { }
8889 void AddTypesConvertedFrom(
QualType Ty,
8891 bool AllowUserConversions,
8892 bool AllowExplicitConversions,
8893 const Qualifiers &VisibleTypeConversionsQuals);
8895 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
8896 llvm::iterator_range<iterator> member_pointer_types() {
8897 return MemberPointerTypes;
8899 llvm::iterator_range<iterator> enumeration_types() {
8900 return EnumerationTypes;
8902 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
8903 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
8904 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
8906 bool containsMatrixType(QualType Ty)
const {
return MatrixTypes.count(Ty); }
8907 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
8908 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
8909 bool hasNullPtrType()
const {
return HasNullPtrType; }
8924BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(QualType Ty,
8925 const Qualifiers &VisibleQuals) {
8928 if (!PointerTypes.insert(Ty))
8932 const PointerType *PointerTy = Ty->
getAs<PointerType>();
8933 bool buildObjCPtr =
false;
8935 const ObjCObjectPointerType *PTy = Ty->
castAs<ObjCObjectPointerType>();
8937 buildObjCPtr =
true;
8949 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
8955 if ((CVR | BaseCVR) != CVR)
continue;
8970 QualType QPointerTy;
8977 PointerTypes.insert(QPointerTy);
8993BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
8996 if (!MemberPointerTypes.insert(Ty))
8999 const MemberPointerType *PointerTy = Ty->
getAs<MemberPointerType>();
9000 assert(PointerTy &&
"type was not a member pointer type!");
9015 if ((CVR | BaseCVR) != CVR)
continue;
9019 QPointeeTy, std::nullopt, Cls));
9034BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty,
9036 bool AllowUserConversions,
9037 bool AllowExplicitConversions,
9038 const Qualifiers &VisibleQuals) {
9044 if (
const ReferenceType *RefTy = Ty->
getAs<ReferenceType>())
9049 Ty = SemaRef.Context.getArrayDecayedType(Ty);
9056 HasNonRecordTypes = HasNonRecordTypes || !TyIsRec;
9059 HasArithmeticOrEnumeralTypes =
9063 PointerTypes.insert(Ty);
9064 else if (Ty->
getAs<PointerType>() || Ty->
getAs<ObjCObjectPointerType>()) {
9067 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
9071 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
9074 HasArithmeticOrEnumeralTypes =
true;
9075 EnumerationTypes.insert(Ty);
9077 HasArithmeticOrEnumeralTypes =
true;
9078 BitIntTypes.insert(Ty);
9082 HasArithmeticOrEnumeralTypes =
true;
9083 VectorTypes.insert(Ty);
9087 HasArithmeticOrEnumeralTypes =
true;
9088 MatrixTypes.insert(Ty);
9090 HasNullPtrType =
true;
9091 }
else if (AllowUserConversions && TyIsRec) {
9093 if (!SemaRef.isCompleteType(Loc, Ty))
9097 for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) {
9107 if (AllowExplicitConversions || !Conv->
isExplicit()) {
9155 ClassDecl = RHSMPType->getMostRecentCXXRecordDecl();
9203 if (Available.hasAtomic()) {
9204 Available.removeAtomic();
9211 if (Available.hasVolatile()) {
9212 Available.removeVolatile();
9246class BuiltinOperatorOverloadBuilder {
9249 ArrayRef<Expr *> Args;
9250 QualifiersAndAtomic VisibleTypeConversionsQuals;
9251 bool HasArithmeticOrEnumeralCandidateType;
9252 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes;
9253 OverloadCandidateSet &CandidateSet;
9255 static constexpr int ArithmeticTypesCap = 26;
9256 SmallVector<CanQualType, ArithmeticTypesCap> ArithmeticTypes;
9261 unsigned FirstIntegralType,
9263 unsigned FirstPromotedIntegralType,
9264 LastPromotedIntegralType;
9265 unsigned FirstPromotedArithmeticType,
9266 LastPromotedArithmeticType;
9267 unsigned NumArithmeticTypes;
9269 void InitArithmeticTypes() {
9271 FirstPromotedArithmeticType = 0;
9281 FirstIntegralType = ArithmeticTypes.size();
9282 FirstPromotedIntegralType = ArithmeticTypes.size();
9304 llvm::SmallSetVector<CanQualType, 2> BitIntCandidates;
9305 for (BuiltinCandidateTypeSet &Candidate : CandidateTypes) {
9306 for (QualType BitTy : Candidate.bitint_types())
9309 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
9310 LastPromotedIntegralType = ArithmeticTypes.size();
9311 LastPromotedArithmeticType = ArithmeticTypes.size();
9325 LastIntegralType = ArithmeticTypes.size();
9326 NumArithmeticTypes = ArithmeticTypes.size();
9333 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
9334 ArithmeticTypesCap &&
9335 "Enough inline storage for all arithmetic types.");
9340 void addPlusPlusMinusMinusStyleOverloads(QualType CandidateTy,
9343 QualType ParamTypes[2] = {
9383 void AddCandidate(QualType L, QualType R) {
9384 QualType LandR[2] = {L, R};
9389 BuiltinOperatorOverloadBuilder(
9390 Sema &S, ArrayRef<Expr *> Args,
9391 QualifiersAndAtomic VisibleTypeConversionsQuals,
9392 bool HasArithmeticOrEnumeralCandidateType,
9393 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes,
9394 OverloadCandidateSet &CandidateSet)
9396 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
9397 HasArithmeticOrEnumeralCandidateType(
9398 HasArithmeticOrEnumeralCandidateType),
9399 CandidateTypes(CandidateTypes),
9400 CandidateSet(CandidateSet) {
9402 InitArithmeticTypes();
9425 if (!HasArithmeticOrEnumeralCandidateType)
9428 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9429 const auto TypeOfT = ArithmeticTypes[Arith];
9431 if (Op == OO_MinusMinus)
9433 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9436 addPlusPlusMinusMinusStyleOverloads(
9453 void addPlusPlusMinusMinusPointerOverloads() {
9454 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
9456 if (!PtrTy->getPointeeType()->isObjectType())
9459 addPlusPlusMinusMinusStyleOverloads(
9461 (!PtrTy.isVolatileQualified() &&
9463 (!PtrTy.isRestrictQualified() &&
9478 void addUnaryStarPointerOverloads() {
9479 for (QualType ParamTy : CandidateTypes[0].pointer_types()) {
9484 if (
const FunctionProtoType *Proto =PointeeTy->
getAs<FunctionProtoType>())
9485 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9498 void addUnaryPlusOrMinusArithmeticOverloads() {
9499 if (!HasArithmeticOrEnumeralCandidateType)
9502 for (
unsigned Arith = FirstPromotedArithmeticType;
9503 Arith < LastPromotedArithmeticType; ++Arith) {
9504 QualType ArithTy = ArithmeticTypes[Arith];
9509 for (QualType VecTy : CandidateTypes[0].vector_types())
9518 void addUnaryPlusPointerOverloads() {
9519 for (QualType ParamTy : CandidateTypes[0].pointer_types())
9528 void addUnaryTildePromotedIntegralOverloads() {
9529 if (!HasArithmeticOrEnumeralCandidateType)
9532 for (
unsigned Int = FirstPromotedIntegralType;
9533 Int < LastPromotedIntegralType; ++
Int) {
9534 QualType IntTy = ArithmeticTypes[
Int];
9539 for (QualType VecTy : CandidateTypes[0].vector_types())
9549 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9551 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9553 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9554 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9559 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9563 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9565 if (AddedTypes.insert(NullPtrTy).second) {
9566 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9585 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9598 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9599 UserDefinedBinaryOperators;
9601 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9602 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9604 CEnd = CandidateSet.
end();
9606 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9609 if (
C->Function->isFunctionTemplateSpecialization())
9616 QualType FirstParamType =
C->Function->getParamDecl(
Reversed ? 1 : 0)
9618 .getUnqualifiedType();
9619 QualType SecondParamType =
C->Function->getParamDecl(
Reversed ? 0 : 1)
9621 .getUnqualifiedType();
9629 UserDefinedBinaryOperators.insert(
9637 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9639 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9640 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9644 if (IsSpaceship && PtrTy->isFunctionPointerType())
9647 QualType ParamTypes[2] = {PtrTy, PtrTy};
9650 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9655 if (!AddedTypes.insert(CanonType).second ||
9656 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9659 QualType ParamTypes[2] = {EnumTy, EnumTy};
9684 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9686 for (
int Arg = 0; Arg < 2; ++Arg) {
9687 QualType AsymmetricParamTypes[2] = {
9691 for (QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9696 AsymmetricParamTypes[Arg] = PtrTy;
9697 if (Arg == 0 || Op == OO_Plus) {
9702 if (Op == OO_Minus) {
9707 QualType ParamTypes[2] = {PtrTy, PtrTy};
9743 void addGenericBinaryArithmeticOverloads() {
9744 if (!HasArithmeticOrEnumeralCandidateType)
9747 for (
unsigned Left = FirstPromotedArithmeticType;
9748 Left < LastPromotedArithmeticType; ++
Left) {
9749 for (
unsigned Right = FirstPromotedArithmeticType;
9750 Right < LastPromotedArithmeticType; ++
Right) {
9751 QualType LandR[2] = { ArithmeticTypes[
Left],
9752 ArithmeticTypes[
Right] };
9759 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
9760 for (QualType Vec2Ty : CandidateTypes[1].vector_types()) {
9761 QualType LandR[2] = {Vec1Ty, Vec2Ty};
9771 void addMatrixBinaryArithmeticOverloads() {
9772 if (!HasArithmeticOrEnumeralCandidateType)
9775 for (QualType M1 : CandidateTypes[0].matrix_types()) {
9777 AddCandidate(M1, M1);
9780 for (QualType M2 : CandidateTypes[1].matrix_types()) {
9782 if (!CandidateTypes[0].containsMatrixType(M2))
9783 AddCandidate(M2, M2);
9818 void addThreeWayArithmeticOverloads() {
9819 addGenericBinaryArithmeticOverloads();
9836 void addBinaryBitwiseArithmeticOverloads() {
9837 if (!HasArithmeticOrEnumeralCandidateType)
9840 for (
unsigned Left = FirstPromotedIntegralType;
9841 Left < LastPromotedIntegralType; ++
Left) {
9842 for (
unsigned Right = FirstPromotedIntegralType;
9844 QualType LandR[2] = { ArithmeticTypes[
Left],
9845 ArithmeticTypes[
Right] };
9858 void addAssignmentMemberPointerOrEnumeralOverloads() {
9860 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9862 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
9863 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9870 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9895 void addAssignmentPointerOverloads(
bool isEqualOp) {
9897 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9899 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
9903 else if (!PtrTy->getPointeeType()->isObjectType())
9907 QualType ParamTypes[2] = {
9914 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
9924 if (!PtrTy.isRestrictQualified() &&
9944 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
9949 QualType ParamTypes[2] = {
9958 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
9968 if (!PtrTy.isRestrictQualified() &&
10001 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
10002 if (!HasArithmeticOrEnumeralCandidateType)
10005 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
10006 for (
unsigned Right = FirstPromotedArithmeticType;
10007 Right < LastPromotedArithmeticType; ++
Right) {
10008 QualType ParamTypes[2];
10009 ParamTypes[1] = ArithmeticTypes[
Right];
10011 S, ArithmeticTypes[Left], Args[0]);
10014 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10024 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10025 for (QualType Vec2Ty : CandidateTypes[0].vector_types()) {
10026 QualType ParamTypes[2];
10027 ParamTypes[1] = Vec2Ty;
10055 void addAssignmentIntegralOverloads() {
10056 if (!HasArithmeticOrEnumeralCandidateType)
10059 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
10060 for (
unsigned Right = FirstPromotedIntegralType;
10061 Right < LastPromotedIntegralType; ++
Right) {
10062 QualType ParamTypes[2];
10063 ParamTypes[1] = ArithmeticTypes[
Right];
10065 S, ArithmeticTypes[Left], Args[0]);
10068 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10084 void addExclaimOverload() {
10090 void addAmpAmpOrPipePipeOverload() {
10107 void addSubscriptOverloads() {
10108 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10118 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10138 void addArrowStarOverloads() {
10139 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10140 QualType C1Ty = PtrTy;
10142 QualifierCollector Q1;
10153 for (QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
10160 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
10163 if (!VisibleTypeConversionsQuals.
hasVolatile() &&
10164 T.isVolatileQualified())
10166 if (!VisibleTypeConversionsQuals.
hasRestrict() &&
10167 T.isRestrictQualified())
10185 void addConditionalOperatorOverloads() {
10187 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10189 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10190 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
10194 QualType ParamTypes[2] = {PtrTy, PtrTy};
10198 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10202 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
10207 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10208 if (!EnumTy->castAsCanonical<EnumType>()->getDecl()->isScoped())
10214 QualType ParamTypes[2] = {EnumTy, EnumTy};
10233 VisibleTypeConversionsQuals.
addConst();
10234 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10236 if (Args[ArgIdx]->
getType()->isAtomicType())
10237 VisibleTypeConversionsQuals.
addAtomic();
10240 bool HasNonRecordCandidateType =
false;
10241 bool HasArithmeticOrEnumeralCandidateType =
false;
10243 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10244 CandidateTypes.emplace_back(*
this);
10245 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->
getType(),
10248 (Op == OO_Exclaim ||
10250 Op == OO_PipePipe),
10251 VisibleTypeConversionsQuals);
10252 HasNonRecordCandidateType = HasNonRecordCandidateType ||
10253 CandidateTypes[ArgIdx].hasNonRecordTypes();
10254 HasArithmeticOrEnumeralCandidateType =
10255 HasArithmeticOrEnumeralCandidateType ||
10256 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
10264 if (!HasNonRecordCandidateType &&
10265 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
10269 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
10270 VisibleTypeConversionsQuals,
10271 HasArithmeticOrEnumeralCandidateType,
10272 CandidateTypes, CandidateSet);
10278 llvm_unreachable(
"Expected an overloaded operator");
10283 case OO_Array_Delete:
10286 "Special operators don't use AddBuiltinOperatorCandidates");
10298 if (Args.size() == 1)
10299 OpBuilder.addUnaryPlusPointerOverloads();
10303 if (Args.size() == 1) {
10304 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
10306 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
10307 OpBuilder.addGenericBinaryArithmeticOverloads();
10308 OpBuilder.addMatrixBinaryArithmeticOverloads();
10313 if (Args.size() == 1)
10314 OpBuilder.addUnaryStarPointerOverloads();
10316 OpBuilder.addGenericBinaryArithmeticOverloads();
10317 OpBuilder.addMatrixBinaryArithmeticOverloads();
10322 OpBuilder.addGenericBinaryArithmeticOverloads();
10326 case OO_MinusMinus:
10327 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
10328 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
10331 case OO_EqualEqual:
10332 case OO_ExclaimEqual:
10333 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
10334 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10335 OpBuilder.addGenericBinaryArithmeticOverloads();
10341 case OO_GreaterEqual:
10342 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10343 OpBuilder.addGenericBinaryArithmeticOverloads();
10347 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
10348 OpBuilder.addThreeWayArithmeticOverloads();
10355 case OO_GreaterGreater:
10356 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10360 if (Args.size() == 1)
10366 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10370 OpBuilder.addUnaryTildePromotedIntegralOverloads();
10374 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
10378 case OO_MinusEqual:
10379 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
10383 case OO_SlashEqual:
10384 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
10387 case OO_PercentEqual:
10388 case OO_LessLessEqual:
10389 case OO_GreaterGreaterEqual:
10391 case OO_CaretEqual:
10393 OpBuilder.addAssignmentIntegralOverloads();
10397 OpBuilder.addExclaimOverload();
10402 OpBuilder.addAmpAmpOrPipePipeOverload();
10406 if (Args.size() == 2)
10407 OpBuilder.addSubscriptOverloads();
10411 OpBuilder.addArrowStarOverloads();
10414 case OO_Conditional:
10415 OpBuilder.addConditionalOperatorOverloads();
10416 OpBuilder.addGenericBinaryArithmeticOverloads();
10427 bool PartialOverloading) {
10444 CandEnd = CandidateSet.
end();
10445 Cand != CandEnd; ++Cand)
10446 if (Cand->Function) {
10450 Fns.
erase(FunTmpl);
10459 if (ExplicitTemplateArgs)
10463 FD, FoundDecl, Args, CandidateSet,
false,
10464 PartialOverloading,
true,
10465 false, ADLCallKind::UsesADL);
10468 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10469 false, PartialOverloading,
10476 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10477 false, PartialOverloading,
10478 true, ADLCallKind::UsesADL);
10480 *
this, Args, FTD->getTemplatedDecl())) {
10484 if (ReversedArgs.empty())
10488 FTD, FoundDecl, ExplicitTemplateArgs, ReversedArgs, CandidateSet,
10489 false, PartialOverloading,
10490 true, ADLCallKind::UsesADL,
10515 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10516 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10517 if (!Cand1Attr || !Cand2Attr) {
10518 if (Cand1Attr == Cand2Attr)
10519 return Comparison::Equal;
10520 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10526 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10527 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10528 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10529 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10534 return Comparison::Worse;
10536 return Comparison::Better;
10541 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10542 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10543 if (Cand1ID != Cand2ID)
10544 return Comparison::Worse;
10547 return Comparison::Equal;
10555 return Comparison::Equal;
10561 return Comparison::Equal;
10562 return Comparison::Worse;
10565 return Comparison::Better;
10571 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10572 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10574 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10575 return Comparison::Equal;
10577 if (Cand1CPUDisp && !Cand2CPUDisp)
10578 return Comparison::Better;
10579 if (Cand2CPUDisp && !Cand1CPUDisp)
10580 return Comparison::Worse;
10582 if (Cand1CPUSpec && Cand2CPUSpec) {
10583 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10584 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10585 ? Comparison::Better
10586 : Comparison::Worse;
10588 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10589 FirstDiff = std::mismatch(
10590 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10591 Cand2CPUSpec->cpus_begin(),
10593 return LHS->getName() == RHS->getName();
10596 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10597 "Two different cpu-specific versions should not have the same "
10598 "identifier list, otherwise they'd be the same decl!");
10599 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->getName()
10600 ? Comparison::Better
10601 : Comparison::Worse;
10603 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10609static std::optional<QualType>
10612 return std::nullopt;
10618 return M->getFunctionObjectParameterReferenceType();
10632 PT2->getInstantiatedFromMemberTemplate()))
10643 assert(I < F->getNumParams());
10650 if (F1NumParams != F2NumParams)
10653 unsigned I1 = 0, I2 = 0;
10654 for (
unsigned I = 0; I != F1NumParams; ++I) {
10655 QualType T1 = NextParam(F1, I1, I == 0);
10656 QualType T2 = NextParam(F2, I2, I == 0);
10657 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10658 if (!Context.hasSameUnqualifiedType(T1, T2))
10671 bool IsFn1Reversed,
10672 bool IsFn2Reversed) {
10673 assert(Fn1 && Fn2);
10678 IsFn1Reversed ^ IsFn2Reversed))
10681 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10682 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10683 if (Mem1 && Mem2) {
10686 if (Mem1->getParent() != Mem2->getParent())
10690 if (Mem1->isInstance() && Mem2->isInstance() &&
10692 Mem1->getFunctionObjectParameterReferenceType(),
10693 Mem1->getFunctionObjectParameterReferenceType()))
10699static FunctionDecl *
10701 bool IsFn1Reversed,
bool IsFn2Reversed) {
10711 if (Cand1IsSpecialization || Cand2IsSpecialization)
10728 bool PartialOverloading) {
10774 bool IsCand1ImplicitHD =
10776 bool IsCand2ImplicitHD =
10791 auto EmitThreshold =
10792 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
10793 (IsCand1ImplicitHD || IsCand2ImplicitHD))
10796 auto Cand1Emittable = P1 > EmitThreshold;
10797 auto Cand2Emittable = P2 > EmitThreshold;
10798 if (Cand1Emittable && !Cand2Emittable)
10800 if (!Cand1Emittable && Cand2Emittable)
10811 unsigned StartArg = 0;
10819 return ICS.isStandard() &&
10831 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
10832 bool HasBetterConversion =
false;
10833 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
10834 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
10835 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
10836 if (Cand1Bad != Cand2Bad) {
10839 HasBetterConversion =
true;
10843 if (HasBetterConversion)
10850 bool HasWorseConversion =
false;
10851 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
10857 HasBetterConversion =
true;
10876 HasWorseConversion =
true;
10891 if (HasBetterConversion && !HasWorseConversion)
10942 bool Cand1IsSpecialization = Cand1.
Function &&
10944 bool Cand2IsSpecialization = Cand2.
Function &&
10946 if (Cand1IsSpecialization != Cand2IsSpecialization)
10947 return Cand2IsSpecialization;
10953 if (Cand1IsSpecialization && Cand2IsSpecialization) {
10954 const auto *Obj1Context =
10956 const auto *Obj2Context =
10985 bool Cand1IsInherited =
10987 bool Cand2IsInherited =
10989 if (Cand1IsInherited != Cand2IsInherited)
10990 return Cand2IsInherited;
10991 else if (Cand1IsInherited) {
10992 assert(Cand2IsInherited);
10995 if (Cand1Class->isDerivedFrom(Cand2Class))
10997 if (Cand2Class->isDerivedFrom(Cand1Class))
11014 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
11015 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
11016 if (Guide1 && Guide2) {
11018 if (Guide1->isImplicit() != Guide2->isImplicit())
11019 return Guide2->isImplicit();
11029 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
11030 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
11031 if (Constructor1 && Constructor2) {
11032 bool isC1Templated = Constructor1->getTemplatedKind() !=
11034 bool isC2Templated = Constructor2->getTemplatedKind() !=
11036 if (isC1Templated != isC2Templated)
11037 return isC2Templated;
11045 if (Cmp != Comparison::Equal)
11046 return Cmp == Comparison::Better;
11049 bool HasPS1 = Cand1.
Function !=
nullptr &&
11051 bool HasPS2 = Cand2.
Function !=
nullptr &&
11053 if (HasPS1 != HasPS2 && HasPS1)
11057 if (MV == Comparison::Better)
11059 if (MV == Comparison::Worse)
11074 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
11075 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
11077 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
11078 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
11099 auto *VA = dyn_cast_or_null<ValueDecl>(A);
11100 auto *VB = dyn_cast_or_null<ValueDecl>(B);
11106 if (!VA->getDeclContext()->getRedeclContext()->Equals(
11107 VB->getDeclContext()->getRedeclContext()) ||
11109 VA->isExternallyVisible() || VB->isExternallyVisible())
11117 if (
Context.hasSameType(VA->getType(), VB->getType()))
11122 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
11123 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
11128 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
11129 !
Context.hasSameType(EnumA->getIntegerType(),
11130 EnumB->getIntegerType()))
11133 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
11143 assert(D &&
"Unknown declaration");
11144 Diag(Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) << D;
11150 for (
auto *E : Equiv) {
11152 Diag(E->getLocation(), diag::note_equivalent_internal_linkage_decl)
11162 ->Satisfaction.ContainsErrors;
11168 bool PartialOverloading,
bool AllowExplicit,
11170 bool AggregateCandidateDeduction) {
11173 allocateDeferredCandidate<DeferredFunctionTemplateOverloadCandidate>();
11178 false, AllowExplicit, SuppressUserConversions,
11179 PartialOverloading, AggregateCandidateDeduction},
11186 HasDeferredTemplateConstructors |=
11194 bool SuppressUserConversions,
bool PartialOverloading,
11200 allocateDeferredCandidate<DeferredMethodTemplateOverloadCandidate>();
11206 false, SuppressUserConversions, PartialOverloading,
11212 ObjectClassification,
11220 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
11221 bool AllowResultConversion) {
11224 allocateDeferredCandidate<DeferredConversionTemplateOverloadCandidate>();
11228 AllowObjCConversionOnExplicit, AllowResultConversion,
11245 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
11246 nullptr,
C.ObjectType,
C.ObjectClassification,
11247 C.Args,
C.SuppressUserConversions,
C.PartialOverloading,
C.PO);
11254 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
11255 nullptr,
C.Args,
C.SuppressUserConversions,
11256 C.PartialOverloading,
C.AllowExplicit,
C.IsADLCandidate,
C.PO,
11257 C.AggregateCandidateDeduction);
11264 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
C.From,
11265 C.ToType,
C.AllowObjCConversionOnExplicit,
C.AllowExplicit,
11266 C.AllowResultConversion);
11270 Candidates.reserve(Candidates.size() + DeferredCandidatesCount);
11273 switch (Cand->
Kind) {
11292 FirstDeferredCandidate =
nullptr;
11293 DeferredCandidatesCount = 0;
11297OverloadCandidateSet::ResultForBestCandidate(
const iterator &Best) {
11299 if (Best->Function && Best->Function->isDeleted())
11304void OverloadCandidateSet::CudaExcludeWrongSideCandidates(
11321 bool ContainsSameSideCandidate =
11329 if (!ContainsSameSideCandidate)
11332 auto IsWrongSideCandidate = [&](
const OverloadCandidate *Cand) {
11338 llvm::erase_if(Candidates, IsWrongSideCandidate);
11356 DeferredCandidatesCount == 0) &&
11357 "Unexpected deferred template candidates");
11359 bool TwoPhaseResolution =
11360 DeferredCandidatesCount != 0 && !ResolutionByPerfectCandidateIsDisabled;
11362 if (TwoPhaseResolution) {
11364 if (Best !=
end() && Best->isPerfectMatch(S.
Context)) {
11365 if (!(HasDeferredTemplateConstructors &&
11366 isa_and_nonnull<CXXConversionDecl>(Best->Function)))
11372 return BestViableFunctionImpl(S, Loc, Best);
11379 Candidates.reserve(this->Candidates.size());
11380 std::transform(this->Candidates.begin(), this->Candidates.end(),
11381 std::back_inserter(Candidates),
11385 CudaExcludeWrongSideCandidates(S, Candidates);
11388 for (
auto *Cand : Candidates) {
11389 Cand->
Best =
false;
11391 if (Best ==
end() ||
11408 llvm::SmallVector<OverloadCandidate *, 4> PendingBest;
11409 llvm::SmallVector<const NamedDecl *, 4> EquivalentCands;
11410 PendingBest.push_back(&*Best);
11415 while (!PendingBest.empty()) {
11416 auto *Curr = PendingBest.pop_back_val();
11417 for (
auto *Cand : Candidates) {
11420 PendingBest.push_back(Cand);
11425 EquivalentCands.push_back(Cand->
Function);
11437 if (!EquivalentCands.empty())
11445enum OverloadCandidateKind {
11448 oc_reversed_binary_operator,
11450 oc_implicit_default_constructor,
11451 oc_implicit_copy_constructor,
11452 oc_implicit_move_constructor,
11453 oc_implicit_copy_assignment,
11454 oc_implicit_move_assignment,
11455 oc_implicit_equality_comparison,
11456 oc_inherited_constructor
11459enum OverloadCandidateSelect {
11462 ocs_described_template,
11465static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
11466ClassifyOverloadCandidate(Sema &S,
const NamedDecl *
Found,
11467 const FunctionDecl *Fn,
11469 std::string &Description) {
11472 if (FunctionTemplateDecl *FunTmpl =
Fn->getPrimaryTemplate()) {
11475 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
11478 OverloadCandidateSelect Select = [&]() {
11479 if (!Description.empty())
11480 return ocs_described_template;
11481 return isTemplate ? ocs_template : ocs_non_template;
11484 OverloadCandidateKind Kind = [&]() {
11485 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
11486 return oc_implicit_equality_comparison;
11489 return oc_reversed_binary_operator;
11491 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
11492 if (!Ctor->isImplicit()) {
11494 return oc_inherited_constructor;
11496 return oc_constructor;
11499 if (Ctor->isDefaultConstructor())
11500 return oc_implicit_default_constructor;
11502 if (Ctor->isMoveConstructor())
11503 return oc_implicit_move_constructor;
11505 assert(Ctor->isCopyConstructor() &&
11506 "unexpected sort of implicit constructor");
11507 return oc_implicit_copy_constructor;
11510 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
11513 if (!Meth->isImplicit())
11516 if (Meth->isMoveAssignmentOperator())
11517 return oc_implicit_move_assignment;
11519 if (Meth->isCopyAssignmentOperator())
11520 return oc_implicit_copy_assignment;
11526 return oc_function;
11529 return std::make_pair(Kind, Select);
11532void MaybeEmitInheritedConstructorNote(Sema &S,
const Decl *FoundDecl) {
11535 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
11537 diag::note_ovl_candidate_inherited_constructor)
11538 << Shadow->getNominatedBaseClass();
11547 if (EnableIf->getCond()->isValueDependent() ||
11548 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
11565 bool InOverloadResolution,
11569 if (InOverloadResolution)
11571 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
11573 S.
Diag(Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
11584 if (InOverloadResolution) {
11587 TemplateArgString +=
" ";
11589 FunTmpl->getTemplateParameters(),
11594 diag::note_ovl_candidate_unsatisfied_constraints)
11595 << TemplateArgString;
11597 S.
Diag(Loc, diag::err_addrof_function_constraints_not_satisfied)
11606 return P->hasAttr<PassObjectSizeAttr>();
11613 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11614 if (InOverloadResolution)
11616 diag::note_ovl_candidate_has_pass_object_size_params)
11619 S.
Diag(Loc, diag::err_address_of_function_with_pass_object_size_params)
11635 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11643 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11648 if (!RD->isLambda())
11653 CallOp->getType()->castAs<
FunctionType>()->getCallConv();
11658 return ConvToCC != CallOpCC;
11664 QualType DestType,
bool TakingAddress) {
11667 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11668 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11670 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11671 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11676 std::string FnDesc;
11677 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11678 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11680 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11684 Diag(Fn->getLocation(), PD);
11685 MaybeEmitInheritedConstructorNote(*
this,
Found);
11703 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11704 for (
auto I = Cands.begin(), E = Cands.end(); I != E; ++I) {
11708 if (
auto *
Template = I->Function->getPrimaryTemplate())
11709 Template->getAssociatedConstraints(AC);
11711 I->Function->getAssociatedConstraints(AC);
11714 if (FirstCand ==
nullptr) {
11715 FirstCand = I->Function;
11717 }
else if (SecondCand ==
nullptr) {
11718 SecondCand = I->Function;
11731 SecondCand, SecondAC))
11740 bool TakingAddress) {
11750 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
11754 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
11767 S.
Diag(CaretLoc, PDiag)
11769 unsigned CandsShown = 0;
11783 unsigned I,
bool TakingCandidateAddress) {
11785 assert(Conv.
isBad());
11786 assert(Cand->
Function &&
"for now, candidate must be a function");
11792 bool isObjectArgument =
false;
11796 isObjectArgument =
true;
11797 else if (!Fn->hasCXXExplicitFunctionObjectParameter())
11801 std::string FnDesc;
11802 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11813 bool HasParamPack =
11814 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
11815 return Parm->isParameterPack();
11817 if (!isObjectArgument && !HasParamPack)
11818 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
11821 assert(FromExpr &&
"overload set argument came from implicit argument?");
11827 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
11828 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11829 << ToParamRange << ToTy << Name << I + 1;
11830 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11839 CToTy = RT->getPointeeType();
11844 CFromTy = FromPT->getPointeeType();
11845 CToTy = ToPT->getPointeeType();
11855 if (isObjectArgument)
11856 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
11857 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11860 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
11861 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11864 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11869 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
11870 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11873 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11878 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
11879 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11882 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11887 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ptrauth)
11888 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11893 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11898 assert(CVR &&
"expected qualifiers mismatch");
11900 if (isObjectArgument) {
11901 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
11902 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11903 << FromTy << (CVR - 1);
11905 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
11906 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11907 << ToParamRange << FromTy << (CVR - 1) << I + 1;
11909 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11915 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
11916 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11917 << (
unsigned)isObjectArgument << I + 1
11920 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11927 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
11928 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11929 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11934 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11946 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
11947 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11948 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11949 << (
unsigned)(Cand->
Fix.
Kind);
11951 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11956 unsigned BaseToDerivedConversion = 0;
11959 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
11961 !FromPtrTy->getPointeeType()->isIncompleteType() &&
11962 !ToPtrTy->getPointeeType()->isIncompleteType() &&
11964 FromPtrTy->getPointeeType()))
11965 BaseToDerivedConversion = 1;
11973 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
11975 FromIface->isSuperClassOf(ToIface))
11976 BaseToDerivedConversion = 2;
11978 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy,
11981 !ToRefTy->getPointeeType()->isIncompleteType() &&
11983 BaseToDerivedConversion = 3;
11987 if (BaseToDerivedConversion) {
11988 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
11989 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11990 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
11992 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12001 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
12002 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12003 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
12005 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12015 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12016 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12017 << (
unsigned)(Cand->
Fix.
Kind);
12026 S.
Diag(Fn->getLocation(), FDiag);
12028 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12035 unsigned NumArgs,
bool IsAddressOf =
false) {
12036 assert(Cand->
Function &&
"Candidate is required to be a function.");
12038 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12039 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12046 if (Fn->isInvalidDecl() &&
12050 if (NumArgs < MinParams) {
12067 unsigned NumFormalArgs,
12068 bool IsAddressOf =
false) {
12070 "The templated declaration should at least be a function"
12071 " when diagnosing bad template argument deduction due to too many"
12072 " or too few arguments");
12078 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12079 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12082 bool HasExplicitObjectParam =
12083 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
12085 unsigned ParamCount =
12086 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12087 unsigned mode, modeCount;
12089 if (NumFormalArgs < MinParams) {
12090 if (MinParams != ParamCount || FnTy->isVariadic() ||
12091 FnTy->isTemplateVariadic())
12095 modeCount = MinParams;
12097 if (MinParams != ParamCount)
12101 modeCount = ParamCount;
12104 std::string Description;
12105 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12106 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
12108 if (modeCount == 1 && !IsAddressOf &&
12109 Fn->getParamDecl(HasExplicitObjectParam ? 1 : 0)->getDeclName())
12110 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
12111 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12112 << Description << mode
12113 << Fn->getParamDecl(HasExplicitObjectParam ? 1 : 0) << NumFormalArgs
12114 << HasExplicitObjectParam << Fn->getParametersSourceRange();
12116 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
12117 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12118 << Description << mode << modeCount << NumFormalArgs
12119 << HasExplicitObjectParam << Fn->getParametersSourceRange();
12121 MaybeEmitInheritedConstructorNote(S,
Found);
12126 unsigned NumFormalArgs) {
12127 assert(Cand->
Function &&
"Candidate must be a function");
12137 llvm_unreachable(
"Unsupported: Getting the described template declaration"
12138 " for bad deduction diagnosis");
12145 bool TakingCandidateAddress) {
12151 switch (DeductionFailure.
getResult()) {
12154 "TemplateDeductionResult::Success while diagnosing bad deduction");
12156 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
12157 "while diagnosing bad deduction");
12163 assert(ParamD &&
"no parameter found for incomplete deduction result");
12165 diag::note_ovl_candidate_incomplete_deduction)
12167 MaybeEmitInheritedConstructorNote(S,
Found);
12172 assert(ParamD &&
"no parameter found for incomplete deduction result");
12174 diag::note_ovl_candidate_incomplete_deduction_pack)
12176 << (DeductionFailure.
getFirstArg()->pack_size() + 1)
12178 MaybeEmitInheritedConstructorNote(S,
Found);
12183 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
12201 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
12202 << ParamD->
getDeclName() << Arg << NonCanonParam;
12203 MaybeEmitInheritedConstructorNote(S,
Found);
12208 assert(ParamD &&
"no parameter found for inconsistent deduction result");
12222 diag::note_ovl_candidate_inconsistent_deduction_types)
12225 MaybeEmitInheritedConstructorNote(S,
Found);
12245 diag::note_ovl_candidate_inconsistent_deduction)
12248 MaybeEmitInheritedConstructorNote(S,
Found);
12253 assert(ParamD &&
"no parameter found for invalid explicit arguments");
12256 diag::note_ovl_candidate_explicit_arg_mismatch_named)
12261 index = TTP->getIndex();
12263 = dyn_cast<NonTypeTemplateParmDecl>(ParamD))
12264 index = NTTP->getIndex();
12268 diag::note_ovl_candidate_explicit_arg_mismatch_unnamed)
12271 MaybeEmitInheritedConstructorNote(S,
Found);
12278 TemplateArgString =
" ";
12281 if (TemplateArgString.size() == 1)
12282 TemplateArgString.clear();
12284 diag::note_ovl_candidate_unsatisfied_constraints)
12285 << TemplateArgString;
12288 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
12298 diag::note_ovl_candidate_instantiation_depth);
12299 MaybeEmitInheritedConstructorNote(S,
Found);
12307 TemplateArgString =
" ";
12310 if (TemplateArgString.size() == 1)
12311 TemplateArgString.clear();
12316 if (PDiag && PDiag->second.getDiagID() ==
12317 diag::err_typename_nested_not_found_enable_if) {
12320 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
12321 <<
"'enable_if'" << TemplateArgString;
12326 if (PDiag && PDiag->second.getDiagID() ==
12327 diag::err_typename_nested_not_found_requirement) {
12329 diag::note_ovl_candidate_disabled_by_requirement)
12330 << PDiag->second.getStringArg(0) << TemplateArgString;
12340 SFINAEArgString =
": ";
12342 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
12346 diag::note_ovl_candidate_substitution_failure)
12347 << TemplateArgString << SFINAEArgString << R;
12348 MaybeEmitInheritedConstructorNote(S,
Found);
12358 TemplateArgString =
" ";
12361 if (TemplateArgString.size() == 1)
12362 TemplateArgString.clear();
12365 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
12368 << TemplateArgString
12393 diag::note_ovl_candidate_non_deduced_mismatch_qualified)
12409 diag::note_ovl_candidate_non_deduced_mismatch)
12410 << FirstTA << SecondTA;
12416 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
12417 MaybeEmitInheritedConstructorNote(S,
Found);
12421 diag::note_cuda_ovl_candidate_target_mismatch);
12429 bool TakingCandidateAddress) {
12430 assert(Cand->
Function &&
"Candidate must be a function");
12445 assert(Cand->
Function &&
"Candidate must be a Function.");
12451 std::string FnDesc;
12452 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12453 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
12456 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
12457 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12459 << CalleeTarget << CallerTarget;
12464 if (Meth !=
nullptr && Meth->
isImplicit()) {
12468 switch (FnKindPair.first) {
12471 case oc_implicit_default_constructor:
12474 case oc_implicit_copy_constructor:
12477 case oc_implicit_move_constructor:
12480 case oc_implicit_copy_assignment:
12483 case oc_implicit_move_assignment:
12488 bool ConstRHS =
false;
12492 ConstRHS = RT->getPointeeType().isConstQualified();
12503 assert(Cand->
Function &&
"Candidate must be a function");
12507 S.
Diag(Callee->getLocation(),
12508 diag::note_ovl_candidate_disabled_by_function_cond_attr)
12509 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
12513 assert(Cand->
Function &&
"Candidate must be a function");
12516 assert(ES.
isExplicit() &&
"not an explicit candidate");
12519 switch (Fn->getDeclKind()) {
12520 case Decl::Kind::CXXConstructor:
12523 case Decl::Kind::CXXConversion:
12526 case Decl::Kind::CXXDeductionGuide:
12527 Kind = Fn->isImplicit() ? 0 : 2;
12530 llvm_unreachable(
"invalid Decl");
12539 First = Pattern->getFirstDecl();
12542 diag::note_ovl_candidate_explicit)
12543 << Kind << (ES.
getExpr() ? 1 : 0)
12548 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
12555 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
12557 std::string FunctionProto;
12558 llvm::raw_string_ostream OS(FunctionProto);
12571 "Non-template implicit deduction guides are only possible for "
12574 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12579 assert(
Template &&
"Cannot find the associated function template of "
12580 "CXXDeductionGuideDecl?");
12583 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12604 bool TakingCandidateAddress,
12606 assert(Cand->
Function &&
"Candidate must be a function");
12614 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
12621 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12626 if (Fn->isDeleted()) {
12627 std::string FnDesc;
12628 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12629 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12632 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12633 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12634 << (Fn->isDeleted() ? (Fn->isDeletedAsWritten() ? 1 : 2) : 0);
12635 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12662 TakingCandidateAddress);
12665 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12666 << (Fn->getPrimaryTemplate() ? 1 : 0);
12667 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12674 S.
Diag(Fn->getLocation(),
12675 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12676 << QualsForPrinting;
12677 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12688 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
12711 S.
Diag(Fn->getLocation(),
12712 diag::note_ovl_candidate_inherited_constructor_slice)
12713 << (Fn->getPrimaryTemplate() ? 1 : 0)
12714 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
12715 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12721 assert(!Available);
12729 std::string FnDesc;
12730 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12731 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12734 S.
Diag(Fn->getLocation(),
12735 diag::note_ovl_candidate_constraints_not_satisfied)
12736 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12755 bool isLValueReference =
false;
12756 bool isRValueReference =
false;
12757 bool isPointer =
false;
12761 isLValueReference =
true;
12765 isRValueReference =
true;
12781 diag::note_ovl_surrogate_constraints_not_satisfied)
12795 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
12796 std::string TypeStr(
"operator");
12802 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
12807 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
12814 if (ICS.
isBad())
break;
12818 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
12835 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
12865 llvm_unreachable(
"Unhandled deduction result");
12870struct CompareOverloadCandidatesForDisplay {
12872 SourceLocation Loc;
12876 CompareOverloadCandidatesForDisplay(
12877 Sema &S, SourceLocation Loc,
size_t NArgs,
12879 : S(S), NumArgs(NArgs), CSK(CSK) {}
12889 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
12891 if (NumArgs < C->
Function->getMinRequiredArguments())
12898 bool operator()(
const OverloadCandidate *L,
12899 const OverloadCandidate *R) {
12901 if (L == R)
return false;
12905 if (!R->
Viable)
return true;
12907 if (
int Ord = CompareConversions(*L, *R))
12927 if (LDist == RDist) {
12928 if (LFailureKind == RFailureKind)
12936 return LDist < RDist;
12954 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
12955 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
12956 if (numLFixes != numRFixes) {
12957 return numLFixes < numRFixes;
12961 if (
int Ord = CompareConversions(*L, *R))
12973 if (LRank != RRank)
12974 return LRank < RRank;
13000 struct ConversionSignals {
13001 unsigned KindRank = 0;
13004 static ConversionSignals ForSequence(ImplicitConversionSequence &
Seq) {
13005 ConversionSignals Sig;
13006 Sig.KindRank =
Seq.getKindRank();
13007 if (
Seq.isStandard())
13008 Sig.Rank =
Seq.Standard.getRank();
13009 else if (
Seq.isUserDefined())
13010 Sig.Rank =
Seq.UserDefined.After.getRank();
13016 static ConversionSignals ForObjectArgument() {
13026 int CompareConversions(
const OverloadCandidate &L,
13027 const OverloadCandidate &R) {
13032 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
13034 ? ConversionSignals::ForObjectArgument()
13035 : ConversionSignals::ForSequence(L.Conversions[I]);
13037 ? ConversionSignals::ForObjectArgument()
13038 : ConversionSignals::ForSequence(R.Conversions[I]);
13039 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
13040 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
13065 bool Unfixable =
false;
13071 for (
unsigned ConvIdx =
13075 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
13076 if (Cand->
Conversions[ConvIdx].isInitialized() &&
13085 bool SuppressUserConversions =
false;
13087 unsigned ConvIdx = 0;
13088 unsigned ArgIdx = 0;
13117 assert(ConvCount <= 3);
13123 ConvIdx != ConvCount && ArgIdx < Args.size();
13125 if (Cand->
Conversions[ConvIdx].isInitialized()) {
13127 }
else if (
ParamIdx < ParamTypes.size()) {
13128 if (ParamTypes[
ParamIdx]->isDependentType())
13129 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
13134 SuppressUserConversions,
13139 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
13158 for (
iterator Cand = Candidates.begin(), LastCand = Candidates.end();
13159 Cand != LastCand; ++Cand) {
13160 if (!Filter(*Cand))
13185 Cands.push_back(Cand);
13189 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
13196 bool DeferHint =
false;
13200 auto WrongSidedCands =
13202 return (Cand.
Viable ==
false &&
13208 DeferHint = !WrongSidedCands.empty();
13224 S.
Diag(PD.first, PD.second);
13229 bool NoteCands =
true;
13230 for (
const Expr *Arg : Args) {
13231 if (Arg->getType()->isWebAssemblyTableType())
13240 {Candidates.begin(), Candidates.end()});
13246 bool ReportedAmbiguousConversions =
false;
13249 unsigned CandsShown = 0;
13250 auto I = Cands.begin(), E = Cands.end();
13251 for (; I != E; ++I) {
13267 "Non-viable built-in candidates are not added to Cands.");
13274 if (!ReportedAmbiguousConversions) {
13276 ReportedAmbiguousConversions =
true;
13290 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13301struct CompareTemplateSpecCandidatesForDisplay {
13303 CompareTemplateSpecCandidatesForDisplay(Sema &S) : S(S) {}
13305 bool operator()(
const TemplateSpecCandidate *L,
13306 const TemplateSpecCandidate *R) {
13337 bool ForTakingAddress) {
13342void TemplateSpecCandidateSet::destroyCandidates() {
13344 i->DeductionFailure.Destroy();
13349 destroyCandidates();
13350 Candidates.clear();
13363 Cands.reserve(
size());
13364 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
13365 if (Cand->Specialization)
13366 Cands.push_back(Cand);
13371 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
13378 unsigned CandsShown = 0;
13379 for (I = Cands.begin(), E = Cands.end(); I != E; ++I) {
13385 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
13390 "Non-matching built-in candidates are not added to Cands.");
13395 S.
Diag(Loc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13405 QualType Ret = PossiblyAFunctionType;
13408 Ret = ToTypePtr->getPointeeType();
13411 Ret = ToTypeRef->getPointeeType();
13414 Ret = MemTypePtr->getPointeeType();
13416 Context.getCanonicalType(Ret).getUnqualifiedType();
13421 bool Complain =
true) {
13438class AddressOfFunctionResolver {
13441 const QualType& TargetType;
13442 QualType TargetFunctionType;
13446 ASTContext& Context;
13448 bool TargetTypeIsNonStaticMemberFunction;
13449 bool FoundNonTemplateFunction;
13450 bool StaticMemberFunctionFromBoundPointer;
13451 bool HasComplained;
13453 OverloadExpr::FindResult OvlExprInfo;
13454 OverloadExpr *OvlExpr;
13455 TemplateArgumentListInfo OvlExplicitTemplateArgs;
13456 SmallVector<std::pair<DeclAccessPair, FunctionDecl*>, 4> Matches;
13457 TemplateSpecCandidateSet FailedCandidates;
13460 AddressOfFunctionResolver(Sema &S, Expr *SourceExpr,
13461 const QualType &TargetType,
bool Complain)
13462 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
13463 Complain(Complain), Context(S.getASTContext()),
13464 TargetTypeIsNonStaticMemberFunction(
13465 !!TargetType->getAs<MemberPointerType>()),
13466 FoundNonTemplateFunction(
false),
13467 StaticMemberFunctionFromBoundPointer(
false),
13468 HasComplained(
false),
13469 OvlExprInfo(OverloadExpr::find(SourceExpr)),
13471 FailedCandidates(OvlExpr->getNameLoc(),
true) {
13472 ExtractUnqualifiedFunctionTypeFromTargetType();
13475 if (UnresolvedMemberExpr *UME = dyn_cast<UnresolvedMemberExpr>(OvlExpr))
13476 if (!UME->isImplicitAccess() &&
13478 StaticMemberFunctionFromBoundPointer =
true;
13480 DeclAccessPair dap;
13482 OvlExpr,
false, &dap)) {
13483 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn))
13484 if (!
Method->isStatic()) {
13488 TargetTypeIsNonStaticMemberFunction =
true;
13496 Matches.push_back(std::make_pair(dap, Fn));
13504 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
13507 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
13508 if (FoundNonTemplateFunction) {
13509 EliminateAllTemplateMatches();
13510 EliminateLessPartialOrderingConstrainedMatches();
13512 EliminateAllExceptMostSpecializedTemplate();
13517 EliminateSuboptimalCudaMatches();
13520 bool hasComplained()
const {
return HasComplained; }
13523 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
13530 bool isBetterCandidate(
const FunctionDecl *A,
const FunctionDecl *B) {
13534 return candidateHasExactlyCorrectType(A) &&
13535 (!candidateHasExactlyCorrectType(B) ||
13541 bool eliminiateSuboptimalOverloadCandidates() {
13544 auto Best = Matches.begin();
13545 for (
auto I = Matches.begin()+1, E = Matches.end(); I != E; ++I)
13546 if (isBetterCandidate(I->second, Best->second))
13549 const FunctionDecl *BestFn = Best->second;
13550 auto IsBestOrInferiorToBest = [
this, BestFn](
13551 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
13552 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
13557 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
13559 Matches[0] = *Best;
13564 bool isTargetTypeAFunction()
const {
13573 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
13579 const DeclAccessPair& CurAccessFunPair) {
13580 if (CXXMethodDecl *
Method
13584 bool CanConvertToFunctionPointer =
13585 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13586 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13589 else if (TargetTypeIsNonStaticMemberFunction)
13599 TemplateDeductionInfo Info(FailedCandidates.
getLocation());
13603 Result != TemplateDeductionResult::Success) {
13621 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
13625 bool AddMatchingNonTemplateFunction(NamedDecl* Fn,
13626 const DeclAccessPair& CurAccessFunPair) {
13627 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn)) {
13630 bool CanConvertToFunctionPointer =
13631 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13632 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13635 else if (TargetTypeIsNonStaticMemberFunction)
13638 if (FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13645 if (FunDecl->isMultiVersion()) {
13646 const auto *TA = FunDecl->getAttr<TargetAttr>();
13647 if (TA && !TA->isDefaultVersion())
13649 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13650 if (TVA && !TVA->isDefaultVersion())
13658 HasComplained |= Complain;
13667 candidateHasExactlyCorrectType(FunDecl)) {
13668 Matches.push_back(std::make_pair(
13670 FoundNonTemplateFunction =
true;
13678 bool FindAllFunctionsThatMatchTargetTypeExactly() {
13683 if (IsInvalidFormOfPointerToMemberFunction())
13686 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
13690 NamedDecl *
Fn = (*I)->getUnderlyingDecl();
13699 = dyn_cast<FunctionTemplateDecl>(Fn)) {
13705 AddMatchingNonTemplateFunction(Fn, I.getPair()))
13708 assert(Ret || Matches.empty());
13712 void EliminateAllExceptMostSpecializedTemplate() {
13724 UnresolvedSet<4> MatchesCopy;
13725 for (
unsigned I = 0, E = Matches.size(); I != E; ++I)
13726 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
13731 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
13733 S.
PDiag(diag::err_addr_ovl_ambiguous)
13734 << Matches[0].second->getDeclName(),
13735 S.
PDiag(diag::note_ovl_candidate)
13736 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
13737 Complain, TargetFunctionType);
13741 Matches[0].first = Matches[
Result - MatchesCopy.
begin()].first;
13745 HasComplained |= Complain;
13748 void EliminateAllTemplateMatches() {
13751 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
13752 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
13755 Matches[I] = Matches[--N];
13761 void EliminateLessPartialOrderingConstrainedMatches() {
13766 assert(Matches[0].second->getPrimaryTemplate() ==
nullptr &&
13767 "Call EliminateAllTemplateMatches() first");
13768 SmallVector<std::pair<DeclAccessPair, FunctionDecl *>, 4> Results;
13769 Results.push_back(Matches[0]);
13770 for (
unsigned I = 1, N = Matches.size(); I < N; ++I) {
13771 assert(Matches[I].second->getPrimaryTemplate() ==
nullptr);
13773 S, Matches[I].second, Results[0].second,
13777 Results.push_back(Matches[I]);
13780 if (F == Matches[I].second) {
13782 Results.push_back(Matches[I]);
13785 std::swap(Matches, Results);
13788 void EliminateSuboptimalCudaMatches() {
13794 void ComplainNoMatchesFound()
const {
13795 assert(Matches.empty());
13797 << OvlExpr->
getName() << TargetFunctionType
13799 if (FailedCandidates.
empty())
13806 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
13809 if (FunctionDecl *Fun =
13810 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
13818 bool IsInvalidFormOfPointerToMemberFunction()
const {
13819 return TargetTypeIsNonStaticMemberFunction &&
13823 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
13831 bool IsStaticMemberFunctionFromBoundPointer()
const {
13832 return StaticMemberFunctionFromBoundPointer;
13835 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
13837 diag::err_invalid_form_pointer_member_function)
13841 void ComplainOfInvalidConversion()
const {
13843 << OvlExpr->
getName() << TargetType;
13846 void ComplainMultipleMatchesFound()
const {
13847 assert(Matches.size() > 1);
13854 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
13856 int getNumMatches()
const {
return Matches.size(); }
13858 FunctionDecl* getMatchingFunctionDecl()
const {
13859 if (Matches.size() != 1)
return nullptr;
13860 return Matches[0].second;
13863 const DeclAccessPair* getMatchingFunctionAccessPair()
const {
13864 if (Matches.size() != 1)
return nullptr;
13865 return &Matches[0].first;
13875 bool *pHadMultipleCandidates) {
13878 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
13880 int NumMatches = Resolver.getNumMatches();
13882 bool ShouldComplain = Complain && !Resolver.hasComplained();
13883 if (NumMatches == 0 && ShouldComplain) {
13884 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
13885 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
13887 Resolver.ComplainNoMatchesFound();
13889 else if (NumMatches > 1 && ShouldComplain)
13890 Resolver.ComplainMultipleMatchesFound();
13891 else if (NumMatches == 1) {
13892 Fn = Resolver.getMatchingFunctionDecl();
13896 FoundResult = *Resolver.getMatchingFunctionAccessPair();
13898 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
13899 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
13905 if (pHadMultipleCandidates)
13906 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
13914 bool IsResultAmbiguous =
false;
13922 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
13923 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
13930 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
13938 auto FoundBetter = [&]() {
13939 IsResultAmbiguous =
false;
13951 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
13953 if (PreferenceByCUDA != 0) {
13955 if (PreferenceByCUDA > 0)
13971 if (MoreConstrained != FD) {
13972 if (!MoreConstrained) {
13973 IsResultAmbiguous =
true;
13974 AmbiguousDecls.push_back(FD);
13983 if (IsResultAmbiguous)
14004 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
14006 assert(E->
getType() ==
Context.OverloadTy &&
"SrcExpr must be an overload");
14010 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
14011 Found->isCPUSpecificMultiVersion())
14059 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
14090 if (ForTypeDeduction &&
14104 if (FoundResult) *FoundResult = I.getPair();
14115 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
14117 unsigned DiagIDForComplaining) {
14138 if (!complain)
return false;
14141 diag::err_bound_member_function)
14154 SingleFunctionExpression =
14158 if (doFunctionPointerConversion) {
14159 SingleFunctionExpression =
14161 if (SingleFunctionExpression.
isInvalid()) {
14168 if (!SingleFunctionExpression.
isUsable()) {
14170 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
14172 << DestTypeForComplaining
14173 << OpRangeForComplaining
14184 SrcExpr = SingleFunctionExpression;
14194 bool PartialOverloading,
14201 if (ExplicitTemplateArgs) {
14202 assert(!KnownValid &&
"Explicit template arguments?");
14211 PartialOverloading);
14216 = dyn_cast<FunctionTemplateDecl>(Callee)) {
14218 ExplicitTemplateArgs, Args, CandidateSet,
14220 PartialOverloading);
14224 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
14230 bool PartialOverloading) {
14253 assert(!(*I)->getDeclContext()->isRecord());
14255 !(*I)->getDeclContext()->isFunctionOrMethod());
14256 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
14266 ExplicitTemplateArgs = &TABuffer;
14272 CandidateSet, PartialOverloading,
14277 Args, ExplicitTemplateArgs,
14278 CandidateSet, PartialOverloading);
14286 CandidateSet,
false,
false);
14293 case OO_New:
case OO_Array_New:
14294 case OO_Delete:
case OO_Array_Delete:
14317 if (DC->isTransparentContext())
14333 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
14338 if (FoundInClass) {
14339 *FoundInClass = RD;
14342 R.
addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
14359 AssociatedNamespaces,
14360 AssociatedClasses);
14364 for (Sema::AssociatedNamespaceSet::iterator
14365 it = AssociatedNamespaces.begin(),
14366 end = AssociatedNamespaces.end(); it !=
end; ++it) {
14378 SuggestedNamespaces.insert(*it);
14382 SemaRef.
Diag(R.
getNameLoc(), diag::err_not_found_by_two_phase_lookup)
14384 if (SuggestedNamespaces.empty()) {
14385 SemaRef.
Diag(Best->Function->getLocation(),
14386 diag::note_not_found_by_two_phase_lookup)
14388 }
else if (SuggestedNamespaces.size() == 1) {
14389 SemaRef.
Diag(Best->Function->getLocation(),
14390 diag::note_not_found_by_two_phase_lookup)
14396 SemaRef.
Diag(Best->Function->getLocation(),
14397 diag::note_not_found_by_two_phase_lookup)
14429class BuildRecoveryCallExprRAII {
14431 Sema::SatisfactionStackResetRAII SatStack;
14434 BuildRecoveryCallExprRAII(Sema &S) : SemaRef(S), SatStack(S) {
14456 bool EmptyLookup,
bool AllowTypoCorrection) {
14464 BuildRecoveryCallExprRAII RCE(SemaRef);
14474 ExplicitTemplateArgs = &TABuffer;
14482 ExplicitTemplateArgs, Args, &FoundInClass)) {
14484 }
else if (EmptyLookup) {
14489 ExplicitTemplateArgs !=
nullptr,
14490 dyn_cast<MemberExpr>(Fn));
14492 AllowTypoCorrection
14498 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
14513 assert(!R.
empty() &&
"lookup results empty despite recovery");
14524 if ((*R.
begin())->isCXXClassMember())
14526 ExplicitTemplateArgs, S);
14527 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
14529 ExplicitTemplateArgs);
14553 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
14560 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
14562 llvm_unreachable(
"performing ADL for builtin");
14569 UnbridgedCastsSet UnbridgedCasts;
14584 if (CandidateSet->
empty() ||
14600 if (CandidateSet->
empty())
14603 UnbridgedCasts.restore();
14610 std::optional<QualType> Result;
14622 else if (Result !=
T)
14630 if (Best && *Best != CS.
end())
14631 ConsiderCandidate(**Best);
14634 for (
const auto &
C : CS)
14636 ConsiderCandidate(
C);
14639 for (
const auto &
C : CS)
14640 ConsiderCandidate(
C);
14644 auto Value = *Result;
14645 if (
Value.isNull() ||
Value->isUndeducedType())
14662 bool AllowTypoCorrection) {
14663 switch (OverloadResult) {
14674 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14680 if (*Best != CandidateSet->
end() &&
14684 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
14689 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
14699 CandidateSet->
empty(),
14700 AllowTypoCorrection);
14707 for (
const Expr *Arg : Args) {
14708 if (!Arg->getType()->isFunctionType())
14710 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
14711 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
14714 Arg->getExprLoc()))
14722 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
14723 << ULE->
getName() << Fn->getSourceRange()),
14731 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
14732 << ULE->
getName() << Fn->getSourceRange()),
14739 Fn->getSourceRange(), ULE->
getName(),
14740 *CandidateSet, FDecl, Args);
14749 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14757 SubExprs.append(Args.begin(), Args.end());
14764 for (
auto I = CS.
begin(), E = CS.
end(); I != E; ++I) {
14779 bool AllowTypoCorrection,
14780 bool CalleesAddressIsTaken) {
14795 if (CalleesAddressIsTaken)
14806 Best != CandidateSet.
end()) {
14807 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
14808 M && M->isImplicitObjectMemberFunction()) {
14819 CUDA().recordPotentialODRUsedVariable(Args, CandidateSet);
14837 if (
const auto *TP =
14847 ExecConfig, &CandidateSet, &Best,
14848 OverloadResult, AllowTypoCorrection);
14857 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
14863 bool HadMultipleCandidates) {
14873 if (
Method->isExplicitObjectMemberFunction())
14877 E, std::nullopt, FoundDecl,
Method);
14881 if (
Method->getParent()->isLambda() &&
14882 Method->getConversionType()->isBlockPointerType()) {
14886 auto *CE = dyn_cast<CastExpr>(SubE);
14887 if (CE && CE->getCastKind() == CK_NoOp)
14888 SubE = CE->getSubExpr();
14890 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
14891 SubE = BE->getSubExpr();
14914 if (
Method->isExplicitObjectMemberFunction()) {
14920 Expr *ObjectParam = Exp.
get();
14934 Exp.
get()->getEndLoc(),
14948 Expr *Input,
bool PerformADL) {
14950 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
14958 Expr *Args[2] = { Input,
nullptr };
14959 unsigned NumArgs = 1;
14964 if (Opc == UO_PostInc || Opc == UO_PostDec) {
14978 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
14989 if (Fn.isInvalid())
15015 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15034 if (
Method->isExplicitObjectMemberFunction())
15038 Input, std::nullopt, Best->FoundDecl,
Method);
15041 Base = Input = InputInit.
get();
15052 Input = InputInit.
get();
15057 Base, HadMultipleCandidates,
15069 Context, Op, FnExpr.
get(), ArgsArray, ResultTy,
VK, OpLoc,
15085 Input, Best->BuiltinParamTypes[0], Best->Conversions[0],
15090 Input = InputRes.
get();
15110 PDiag(diag::err_ovl_ambiguous_oper_unary)
15127 << (Msg !=
nullptr)
15128 << (Msg ? Msg->
getString() : StringRef())
15181 if (Op != OO_Equal && PerformADL) {
15188 Context.DeclarationNames.getCXXOperatorName(ExtraOp);
15214 Expr *RHS,
bool PerformADL,
15215 bool AllowRewrittenCandidates,
15217 Expr *Args[2] = { LHS, RHS };
15221 AllowRewrittenCandidates =
false;
15227 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
15248 if (Fn.isInvalid())
15257 if (Opc == BO_PtrMemD) {
15258 auto CheckPlaceholder = [&](
Expr *&Arg) {
15267 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
15288 if (Opc == BO_Assign && !Args[0]->
getType()->isOverloadableType())
15294 Op, OpLoc, AllowRewrittenCandidates));
15296 CandidateSet.
exclude(DefaultedFn);
15299 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15308 bool IsReversed = Best->isReversed();
15310 std::swap(Args[0], Args[1]);
15327 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
15331 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
15332 : diag::err_ovl_rewrite_equalequal_not_bool)
15340 if (AllowRewrittenCandidates && !IsReversed &&
15350 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
15353 Best->Conversions[ArgIdx]) ==
15355 AmbiguousWith.push_back(Cand.
Function);
15362 if (!AmbiguousWith.empty()) {
15363 bool AmbiguousWithSelf =
15364 AmbiguousWith.size() == 1 &&
15366 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
15368 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
15370 if (AmbiguousWithSelf) {
15372 diag::note_ovl_ambiguous_oper_binary_reversed_self);
15377 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
15378 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
15380 !MD->hasCXXExplicitFunctionObjectParameter() &&
15381 Context.hasSameUnqualifiedType(
15382 MD->getFunctionObjectParameterType(),
15383 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
15384 Context.hasSameUnqualifiedType(
15385 MD->getFunctionObjectParameterType(),
15387 Context.hasSameUnqualifiedType(
15388 MD->getFunctionObjectParameterType(),
15391 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
15394 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
15395 for (
auto *F : AmbiguousWith)
15397 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
15405 if (Op == OO_Equal)
15416 if (
Method->isExplicitObjectMemberFunction()) {
15421 Args[0], std::nullopt, Best->FoundDecl,
Method);
15454 Best->FoundDecl,
Base,
15455 HadMultipleCandidates, OpLoc);
15466 const Expr *ImplicitThis =
nullptr;
15471 Context, ChosenOp, FnExpr.
get(), Args, ResultTy,
VK, OpLoc,
15475 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(FnDecl);
15478 ImplicitThis = ArgsArray[0];
15479 ArgsArray = ArgsArray.slice(1);
15486 if (Op == OO_Equal) {
15491 *
this,
AssignedEntity{Args[0], dyn_cast<CXXMethodDecl>(FnDecl)},
15494 if (ImplicitThis) {
15499 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
15503 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
15518 (Op == OO_Spaceship && IsReversed)) {
15519 if (Op == OO_ExclaimEqual) {
15520 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
15523 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
15525 Expr *ZeroLiteral =
15534 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.
get(),
15535 IsReversed ? R.
get() : ZeroLiteral,
true,
15543 assert(ChosenOp == Op &&
"unexpected operator name");
15547 if (Best->RewriteKind !=
CRK_None)
15556 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15561 Args[0] = ArgsRes0.
get();
15564 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15569 Args[1] = ArgsRes1.
get();
15579 if (Opc == BO_Comma)
15584 if (DefaultedFn && Opc == BO_Cmp) {
15586 Args[1], DefaultedFn);
15601 Opc >= BO_Assign && Opc <= BO_OrAssign) {
15602 Diag(OpLoc, diag::err_ovl_no_viable_oper)
15605 if (Args[0]->
getType()->isIncompleteType()) {
15606 Diag(OpLoc, diag::note_assign_lhs_incomplete)
15622 assert(
Result.isInvalid() &&
15623 "C++ binary operator overloading is missing candidates!");
15634 << Args[0]->getSourceRange()
15635 << Args[1]->getSourceRange()),
15645 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
15649 Diag(OpLoc, diag::err_ovl_deleted_comparison)
15650 << Args[0]->
getType() << DeletedFD;
15663 PDiag(diag::err_ovl_deleted_oper)
15665 .getCXXOverloadedOperator())
15666 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
15667 << Args[0]->getSourceRange() << Args[1]->getSourceRange()),
15691 "cannot use prvalue expressions more than once");
15692 Expr *OrigLHS = LHS;
15693 Expr *OrigRHS = RHS;
15710 true, DefaultedFn);
15711 if (
Less.isInvalid())
15738 for (; I >= 0; --I) {
15740 auto *VI = Info->lookupValueInfo(Comparisons[I].
Result);
15763 Context, OrigLHS, OrigRHS, BO_Cmp,
Result.get()->getType(),
15764 Result.get()->getValueKind(),
Result.get()->getObjectKind(), OpLoc,
15766 Expr *SemanticForm[] = {LHS, RHS,
Result.get()};
15776 unsigned NumArgsSlots =
15777 MethodArgs.size() + std::max<unsigned>(Args.size(), NumParams);
15780 MethodArgs.reserve(MethodArgs.size() + NumArgsSlots);
15781 bool IsError =
false;
15784 for (
unsigned i = 0; i != NumParams; i++) {
15786 if (i < Args.size()) {
15790 S.
Context, Method->getParamDecl(i)),
15804 MethodArgs.push_back(Arg);
15814 Args.push_back(
Base);
15815 for (
auto *e : ArgExpr) {
15819 Context.DeclarationNames.getCXXOperatorName(OO_Subscript);
15824 ArgExpr.back()->getEndLoc());
15836 if (Fn.isInvalid())
15846 UnbridgedCastsSet UnbridgedCasts;
15859 if (Args.size() == 2)
15862 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15882 if (
Method->isExplicitObjectMemberFunction()) {
15887 Args[0] = Res.
get();
15891 Args[0], std::nullopt, Best->FoundDecl,
Method);
15895 MethodArgs.push_back(Arg0.
get());
15899 *
this, MethodArgs,
Method, ArgExpr, LLoc);
15907 *
this, FnDecl, Best->FoundDecl,
Base, HadMultipleCandidates,
15918 Context, OO_Subscript, FnExpr.
get(), MethodArgs, ResultTy,
VK, RLoc,
15935 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15940 Args[0] = ArgsRes0.
get();
15943 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15948 Args[1] = ArgsRes1.
get();
15956 CandidateSet.
empty()
15957 ? (
PDiag(diag::err_ovl_no_oper)
15958 << Args[0]->getType() << 0
15959 << Args[0]->getSourceRange() << Range)
15960 : (
PDiag(diag::err_ovl_no_viable_subscript)
15961 << Args[0]->getType() << Args[0]->getSourceRange() << Range);
15968 if (Args.size() == 2) {
15971 LLoc,
PDiag(diag::err_ovl_ambiguous_oper_binary)
15973 << Args[0]->getSourceRange() << Range),
15978 PDiag(diag::err_ovl_ambiguous_subscript_call)
15980 << Args[0]->getSourceRange() << Range),
15989 PDiag(diag::err_ovl_deleted_oper)
15990 <<
"[]" << (Msg !=
nullptr)
15991 << (Msg ? Msg->
getString() : StringRef())
15992 << Args[0]->getSourceRange() << Range),
16006 Expr *ExecConfig,
bool IsExecConfig,
16007 bool AllowRecovery) {
16016 if (
BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
16017 assert(op->getType() ==
Context.BoundMemberTy);
16018 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
16031 QualType objectType = op->getLHS()->getType();
16032 if (op->getOpcode() == BO_PtrMemI)
16036 Qualifiers difference = objectQuals - funcQuals;
16040 std::string qualsString = difference.
getAsString();
16041 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
16044 << (qualsString.find(
' ') == std::string::npos ? 1 : 2);
16048 Context, MemExprE, Args, resultType, valueKind, RParenLoc,
16058 if (CheckOtherCall(call, proto))
16068 if (!AllowRecovery)
16070 std::vector<Expr *> SubExprs = {MemExprE};
16071 llvm::append_range(SubExprs, Args);
16079 UnbridgedCastsSet UnbridgedCasts;
16085 bool HadMultipleCandidates =
false;
16093 UnbridgedCasts.restore();
16111 TemplateArgs = &TemplateArgsBuffer;
16115 E = UnresExpr->
decls_end(); I != E; ++I) {
16117 QualType ExplicitObjectType = ObjectType;
16124 bool HasExplicitParameter =
false;
16125 if (
const auto *M = dyn_cast<FunctionDecl>(
Func);
16126 M && M->hasCXXExplicitFunctionObjectParameter())
16127 HasExplicitParameter =
true;
16128 else if (
const auto *M = dyn_cast<FunctionTemplateDecl>(
Func);
16130 M->getTemplatedDecl()->hasCXXExplicitFunctionObjectParameter())
16131 HasExplicitParameter =
true;
16133 if (HasExplicitParameter)
16141 }
else if ((
Method = dyn_cast<CXXMethodDecl>(
Func))) {
16148 ObjectClassification, Args, CandidateSet,
16152 I.getPair(), ActingDC, TemplateArgs,
16153 ExplicitObjectType, ObjectClassification,
16154 Args, CandidateSet,
16159 HadMultipleCandidates = (CandidateSet.
size() > 1);
16163 UnbridgedCasts.restore();
16166 bool Succeeded =
false;
16171 FoundDecl = Best->FoundDecl;
16191 PDiag(diag::err_ovl_no_viable_member_function_in_call)
16198 PDiag(diag::err_ovl_ambiguous_member_call)
16205 CandidateSet, Best->Function, Args,
true);
16216 MemExprE = Res.
get();
16220 if (
Method->isStatic()) {
16222 ExecConfig, IsExecConfig);
16232 assert(
Method &&
"Member call to something that isn't a method?");
16237 if (
Method->isExplicitObjectMemberFunction()) {
16245 HadMultipleCandidates, MemExpr->
getExprLoc());
16252 TheCall->setUsesMemberSyntax(
true);
16262 Proto->getNumParams());
16268 return BuildRecoveryExpr(ResultType);
16273 return BuildRecoveryExpr(ResultType);
16283 if (
auto *MemE = dyn_cast<MemberExpr>(NakedMemExpr)) {
16284 if (
const EnableIfAttr *
Attr =
16286 Diag(MemE->getMemberLoc(),
16287 diag::err_ovl_no_viable_member_function_in_call)
16290 diag::note_ovl_candidate_disabled_by_function_cond_attr)
16291 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
16297 TheCall->getDirectCallee()->isPureVirtual()) {
16303 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
16314 if (
auto *DD = dyn_cast<CXXDestructorDecl>(TheCall->getDirectCallee())) {
16318 CallCanBeVirtual,
true,
16323 TheCall->getDirectCallee());
16335 UnbridgedCastsSet UnbridgedCasts;
16339 assert(Object.get()->getType()->isRecordType() &&
16340 "Requires object type argument");
16354 diag::err_incomplete_object_call, Object.get()))
16357 auto *
Record = Object.get()->getType()->castAsCXXRecordDecl();
16363 Oper != OperEnd; ++Oper) {
16365 Object.get()->Classify(
Context), Args, CandidateSet,
16377 bool IgnoreSurrogateFunctions =
false;
16380 if (!Candidate.
Viable &&
16382 IgnoreSurrogateFunctions =
true;
16404 !IgnoreSurrogateFunctions && I != E; ++I) {
16426 Object.get(), Args, CandidateSet);
16431 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16444 CandidateSet.
empty()
16445 ? (
PDiag(diag::err_ovl_no_oper)
16446 << Object.get()->getType() << 1
16447 << Object.get()->getSourceRange())
16448 : (
PDiag(diag::err_ovl_no_viable_object_call)
16449 << Object.get()->getType() << Object.get()->getSourceRange());
16459 PDiag(diag::err_ovl_ambiguous_object_call)
16460 << Object.get()->getType()
16461 << Object.get()->getSourceRange()),
16472 PDiag(diag::err_ovl_deleted_object_call)
16473 << Object.get()->getType() << (Msg !=
nullptr)
16474 << (Msg ? Msg->
getString() : StringRef())
16475 << Object.get()->getSourceRange()),
16481 if (Best == CandidateSet.
end())
16484 UnbridgedCasts.restore();
16486 if (Best->Function ==
nullptr) {
16491 Best->Conversions[0].UserDefined.ConversionFunction);
16497 assert(Conv == Best->FoundDecl.getDecl() &&
16498 "Found Decl & conversion-to-functionptr should be same, right?!");
16506 Conv, HadMultipleCandidates);
16507 if (
Call.isInvalid())
16511 Context,
Call.get()->getType(), CK_UserDefinedConversion,
Call.get(),
16525 if (
Method->isInvalidDecl())
16532 Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc);
16535 Obj, HadMultipleCandidates,
16542 MethodArgs.reserve(NumParams + 1);
16544 bool IsError =
false;
16548 if (
Method->isExplicitObjectMemberFunction()) {
16552 Object.get(), std::nullopt, Best->FoundDecl,
Method);
16557 MethodArgs.push_back(Object.get());
16561 *
this, MethodArgs,
Method, Args, LParenLoc);
16564 if (Proto->isVariadic()) {
16566 for (
unsigned i = NumParams, e = Args.size(); i < e; i++) {
16570 MethodArgs.push_back(Arg.
get());
16585 Context, OO_Call, NewFn.
get(), MethodArgs, ResultTy,
VK, RParenLoc,
16599 bool *NoArrowOperatorFound) {
16600 assert(
Base->getType()->isRecordType() &&
16601 "left-hand side must have class type");
16615 Context.DeclarationNames.getCXXOperatorName(OO_Arrow);
16619 diag::err_typecheck_incomplete_tag,
Base))
16627 Oper != OperEnd; ++Oper) {
16633 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16644 if (CandidateSet.
empty()) {
16646 if (NoArrowOperatorFound) {
16649 *NoArrowOperatorFound =
true;
16652 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
16653 << BaseType <<
Base->getSourceRange();
16654 if (BaseType->isRecordType() && !BaseType->isPointerType()) {
16655 Diag(OpLoc, diag::note_typecheck_member_reference_suggestion)
16659 Diag(OpLoc, diag::err_ovl_no_viable_oper)
16660 <<
"operator->" <<
Base->getSourceRange();
16668 <<
"->" <<
Base->getType()
16669 <<
Base->getSourceRange()),
16677 <<
"->" << (Msg !=
nullptr)
16678 << (Msg ? Msg->
getString() : StringRef())
16679 <<
Base->getSourceRange()),
16690 if (
Method->isExplicitObjectMemberFunction()) {
16697 Base, std::nullopt, Best->FoundDecl,
Method);
16705 Base, HadMultipleCandidates, OpLoc);
16739 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16752 PDiag(diag::err_ovl_no_viable_function_in_call)
16767 nullptr, HadMultipleCandidates,
16770 if (Fn.isInvalid())
16776 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
16782 ConvArgs[ArgIdx] = InputInit.
get();
16809 Scope *S =
nullptr;
16812 if (!MemberLookup.
empty()) {
16839 if (CandidateSet->
empty() || CandidateSetError) {
16852 Loc,
nullptr, CandidateSet, &Best,
16865 if (
ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
16870 if (SubExpr.
get() == PE->getSubExpr())
16874 ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.
get());
16882 assert(
Context.hasSameType(ICE->getSubExpr()->getType(),
16884 "Implicit cast type cannot be determined from overload");
16885 assert(ICE->path_empty() &&
"fixing up hierarchy conversion?");
16886 if (SubExpr.
get() == ICE->getSubExpr())
16894 if (
auto *GSE = dyn_cast<GenericSelectionExpr>(E)) {
16895 if (!GSE->isResultDependent()) {
16900 if (SubExpr.
get() == GSE->getResultExpr())
16907 unsigned ResultIdx = GSE->getResultIndex();
16908 AssocExprs[ResultIdx] = SubExpr.
get();
16910 if (GSE->isExprPredicate())
16912 Context, GSE->getGenericLoc(), GSE->getControllingExpr(),
16913 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
16914 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
16917 Context, GSE->getGenericLoc(), GSE->getControllingType(),
16918 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
16919 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
16928 assert(UnOp->getOpcode() == UO_AddrOf &&
16929 "Can only take the address of an overloaded function");
16931 if (!
Method->isImplicitObjectMemberFunction()) {
16942 if (SubExpr.
get() == UnOp->getSubExpr())
16950 "fixed to something other than a decl ref");
16953 assert(Qualifier &&
16954 "fixed to a member ref with no nested name qualifier");
16960 Fn->getType(), Qualifier,
16963 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
16968 UnOp->getOperatorLoc(),
false,
16976 if (SubExpr.
get() == UnOp->getSubExpr())
16989 if (ULE->hasExplicitTemplateArgs()) {
16990 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
16991 TemplateArgs = &TemplateArgsBuffer;
16996 getLangOpts().CPlusPlus && !Fn->hasCXXExplicitFunctionObjectParameter()
17001 if (
unsigned BID = Fn->getBuiltinID()) {
17002 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
17009 Fn,
Type, ValueKind, ULE->getNameInfo(), ULE->getQualifierLoc(),
17010 Found.getDecl(), ULE->getTemplateKeywordLoc(), TemplateArgs);
17018 if (MemExpr->hasExplicitTemplateArgs()) {
17019 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
17020 TemplateArgs = &TemplateArgsBuffer;
17027 if (MemExpr->isImplicitAccess()) {
17030 Fn, Fn->getType(),
VK_LValue, MemExpr->getNameInfo(),
17031 MemExpr->getQualifierLoc(),
Found.getDecl(),
17032 MemExpr->getTemplateKeywordLoc(), TemplateArgs);
17037 if (MemExpr->getQualifier())
17038 Loc = MemExpr->getQualifierLoc().getBeginLoc();
17043 Base = MemExpr->getBase();
17049 type = Fn->getType();
17056 Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),
17057 MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn,
Found,
17058 true, MemExpr->getMemberNameInfo(),
17062 llvm_unreachable(
"Invalid reference to overloaded function");
17073 if (!PartialOverloading || !
Function)
17077 if (
const auto *Proto =
17078 dyn_cast<FunctionProtoType>(
Function->getFunctionType()))
17079 if (Proto->isTemplateVariadic())
17081 if (
auto *Pattern =
Function->getTemplateInstantiationPattern())
17082 if (
const auto *Proto =
17083 dyn_cast<FunctionProtoType>(Pattern->getFunctionType()))
17084 if (Proto->isTemplateVariadic())
17097 << IsMember << Name << (Msg !=
nullptr)
17098 << (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 const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
This file declares semantic analysis functions specific to ARM.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static bool hasExplicitAttr(const VarDecl *D)
This file declares semantic analysis for CUDA constructs.
static void BuildBasePathArray(const CXXBasePath &Path, CXXCastPath &BasePathArray)
static bool isRecordType(QualType T)
static void TryUserDefinedConversion(Sema &S, QualType DestType, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt a user-defined conversion between two types (C++ [dcl.init]), which enumerates all conversion...
This file declares semantic analysis for Objective-C.
static ImplicitConversionSequence::CompareKind CompareStandardConversionSequences(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareStandardConversionSequences - Compare two standard conversion sequences to determine whether o...
static bool sameFunctionParameterTypeLists(Sema &S, FunctionDecl *Fn1, FunctionDecl *Fn2, bool IsFn1Reversed, bool IsFn2Reversed)
We're allowed to use constraints partial ordering only if the candidates have the same parameter type...
static bool isNullPointerConstantForConversion(Expr *Expr, bool InOverloadResolution, ASTContext &Context)
static bool shouldSkipNotingLambdaConversionDecl(const FunctionDecl *Fn)
static const FunctionType * getConversionOpReturnTyAsFunction(CXXConversionDecl *Conv)
static bool functionHasPassObjectSizeParams(const FunctionDecl *FD)
static Comparison compareEnableIfAttrs(const Sema &S, const FunctionDecl *Cand1, const FunctionDecl *Cand2)
Compares the enable_if attributes of two FunctionDecls, for the purposes of overload resolution.
static Qualifiers CollectVRQualifiers(ASTContext &Context, Expr *ArgExpr)
CollectVRQualifiers - This routine returns Volatile/Restrict qualifiers, if any, found in visible typ...
@ ToPromotedUnderlyingType
static void AddOverloadedCallCandidate(Sema &S, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading, bool KnownValid)
Add a single candidate to the overload set.
static void AddTemplateOverloadCandidateImmediately(Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, bool AllowExplicit, Sema::ADLCallKind IsADLCandidate, OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction)
static ExprResult FinishOverloadedCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, OverloadCandidateSet *CandidateSet, OverloadCandidateSet::iterator *Best, OverloadingResult OverloadResult, bool AllowTypoCorrection)
FinishOverloadedCallExpr - given an OverloadCandidateSet, builds and returns the completed call expre...
static bool isQualificationConversionStep(QualType FromType, QualType ToType, bool CStyle, bool IsTopLevel, bool &PreviousToQualsIncludeConst, bool &ObjCLifetimeConversion, const ASTContext &Ctx)
Perform a single iteration of the loop for checking if a qualification conversion is valid.
static ImplicitConversionSequence::CompareKind CompareQualificationConversions(Sema &S, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareQualificationConversions - Compares two standard conversion sequences to determine whether the...
static void dropPointerConversion(StandardConversionSequence &SCS)
dropPointerConversions - If the given standard conversion sequence involves any pointer conversions,...
static SourceLocation GetLocationForCandidate(const OverloadCandidate *Cand)
static void DiagnoseArityMismatch(Sema &S, NamedDecl *Found, Decl *D, unsigned NumFormalArgs, bool IsAddressOf=false)
General arity mismatch diagnosis over a candidate in a candidate set.
static const Expr * IgnoreNarrowingConversion(ASTContext &Ctx, const Expr *Converted)
Skip any implicit casts which could be either part of a narrowing conversion or after one in an impli...
static bool allowAmbiguity(ASTContext &Context, const FunctionDecl *F1, const FunctionDecl *F2)
static unsigned RankDeductionFailure(const DeductionFailureInfo &DFI)
static QualType BuildSimilarlyQualifiedPointerType(const Type *FromPtr, QualType ToPointee, QualType ToType, ASTContext &Context, bool StripObjCLifetime=false)
BuildSimilarlyQualifiedPointerType - In a pointer conversion from the pointer type FromPtr to a point...
static void forAllQualifierCombinations(QualifiersAndAtomic Quals, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static bool FindConversionForRefInit(Sema &S, ImplicitConversionSequence &ICS, QualType DeclType, SourceLocation DeclLoc, Expr *Init, QualType T2, bool AllowRvalues, bool AllowExplicit)
Look for a user-defined conversion to a value reference-compatible with DeclType.
static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static Expr * GetExplicitObjectExpr(Sema &S, Expr *Obj, const FunctionDecl *Fun)
static bool hasDeprecatedStringLiteralToCharPtrConversion(const ImplicitConversionSequence &ICS)
static void AddBuiltinAssignmentOperatorCandidates(Sema &S, QualType T, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
Helper function for AddBuiltinOperatorCandidates() that adds the volatile- and non-volatile-qualified...
static bool CheckConvertedConstantConversions(Sema &S, StandardConversionSequence &SCS)
Check that the specified conversion is permitted in a converted constant expression,...
static void NoteBuiltinOperatorCandidate(Sema &S, StringRef Opc, SourceLocation OpLoc, OverloadCandidate *Cand)
static ImplicitConversionSequence::CompareKind compareConversionFunctions(Sema &S, FunctionDecl *Function1, FunctionDecl *Function2)
Compare the user-defined conversion functions or constructors of two user-defined conversion sequence...
static void forAllQualifierCombinationsImpl(QualifiersAndAtomic Available, QualifiersAndAtomic Applied, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static const char * GetImplicitConversionName(ImplicitConversionKind Kind)
GetImplicitConversionName - Return the name of this kind of implicit conversion.
static bool checkAddressOfFunctionIsAvailable(Sema &S, const FunctionDecl *FD, bool Complain, bool InOverloadResolution, SourceLocation Loc)
Returns true if we can take the address of the function.
static ImplicitConversionSequence::CompareKind CompareDerivedToBaseConversions(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareDerivedToBaseConversions - Compares two standard conversion sequences to determine whether the...
static bool convertArgsForAvailabilityChecks(Sema &S, FunctionDecl *Function, Expr *ThisArg, SourceLocation CallLoc, ArrayRef< Expr * > Args, Sema::SFINAETrap &Trap, bool MissingImplicitThis, Expr *&ConvertedThis, SmallVectorImpl< Expr * > &ConvertedArgs)
static TemplateDecl * getDescribedTemplate(Decl *Templated)
static void CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand, ArrayRef< Expr * > Args, OverloadCandidateSet::CandidateSetKind CSK)
CompleteNonViableCandidate - Normally, overload resolution only computes up to the first bad conversi...
static QualType AdoptQualifiers(ASTContext &Context, QualType T, Qualifiers Qs)
Adopt the given qualifiers for the given type.
static void NoteAmbiguousUserConversions(Sema &S, SourceLocation OpLoc, OverloadCandidate *Cand)
static bool CheckArityMismatch(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool IsAddressOf=false)
Additional arity mismatch diagnosis specific to a function overload candidates.
static ImplicitConversionSequence::CompareKind compareStandardConversionSubsets(ASTContext &Context, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
static bool hasDependentExplicit(FunctionTemplateDecl *FTD)
static bool IsVectorConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, ImplicitConversionKind &ElConv, Expr *From, bool InOverloadResolution, bool CStyle)
Determine whether the conversion from FromType to ToType is a valid vector conversion.
static ImplicitConversionSequence TryContextuallyConvertToObjCPointer(Sema &S, Expr *From)
TryContextuallyConvertToObjCPointer - Attempt to contextually convert the expression From to an Objec...
static ExprResult CheckConvertedConstantExpression(Sema &S, Expr *From, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, NamedDecl *Dest)
CheckConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static 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 bool FunctionsCorrespond(ASTContext &Ctx, const FunctionDecl *X, const FunctionDecl *Y)
static ImplicitConversionSequence TryImplicitConversion(Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion, bool AllowObjCConversionOnExplicit)
TryImplicitConversion - Attempt to perform an implicit conversion from the given expression (Expr) to...
static ExprResult BuildConvertedConstantExpression(Sema &S, Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest, APValue &PreNarrowingValue)
BuildConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static 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 void AddMethodTemplateCandidateImmediately(Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, OverloadCandidateParamOrder PO)
static void AddTemplateConversionCandidateImmediately(Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion)
static ImplicitConversionSequence TryContextuallyConvertToBool(Sema &S, Expr *From)
TryContextuallyConvertToBool - Attempt to contextually convert the expression From to bool (C++0x [co...
static ImplicitConversionSequence TryObjectArgumentInitialization(Sema &S, SourceLocation Loc, QualType FromType, Expr::Classification FromClassification, CXXMethodDecl *Method, const CXXRecordDecl *ActingContext, bool InOverloadResolution=false, QualType ExplicitParameterType=QualType(), bool SuppressUserConversion=false)
TryObjectArgumentInitialization - Try to initialize the object parameter of the given member function...
static bool recordConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, DeclAccessPair &Found)
static ImplicitConversionSequence::CompareKind CompareImplicitConversionSequences(Sema &S, SourceLocation Loc, const ImplicitConversionSequence &ICS1, const ImplicitConversionSequence &ICS2)
CompareImplicitConversionSequences - Compare two implicit conversion sequences to determine whether o...
static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool TakingCandidateAddress, LangAS CtorDestAS=LangAS::Default)
Generates a 'note' diagnostic for an overload candidate.
static ImplicitConversionSequence TryCopyInitialization(Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion, bool AllowExplicit=false)
TryCopyInitialization - Try to copy-initialize a value of type ToType from the expression From.
static ExprResult diagnoseAmbiguousConversion(Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter, QualType T, UnresolvedSetImpl &ViableConversions)
static void markUnaddressableCandidatesUnviable(Sema &S, OverloadCandidateSet &CS)
static QualType GetExplicitObjectType(Sema &S, const Expr *MemExprE)
Sema::AllowedExplicit AllowedExplicit
static QualType AdjustAddressSpaceForBuiltinOperandType(Sema &S, QualType T, Expr *Arg)
Helper function for adjusting address spaces for the pointer or reference operands of builtin operato...
static 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 AddTemplateOverloadCandidate(Sema &S, OverloadCandidateSet &CandidateSet, DeferredMethodTemplateOverloadCandidate &C)
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 FunctionDecl * getMorePartialOrderingConstrained(Sema &S, FunctionDecl *Fn1, FunctionDecl *Fn2, bool IsFn1Reversed, bool IsFn2Reversed)
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 trap message and trap category.
A class for storing results from argument-dependent lookup.
void erase(NamedDecl *D)
Removes any data associated with a given decl.
llvm::mapped_iterator< decltype(Decls)::iterator, select_second > iterator
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
unsigned getIntWidth(QualType T) const
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
const TargetInfo * getAuxTargetInfo() const
CanQualType UnsignedLongTy
QualType getRestrictType(QualType T) const
Return the uniqued reference to the type for a restrict qualified type.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
QualType getObjCIdType() const
Represents the Objective-CC id type.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
bool isSameTemplateParameterList(const TemplateParameterList *X, const TemplateParameterList *Y) const
Determine whether two template parameter lists are similar enough that they may be used in declaratio...
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
QualType getVolatileType(QualType T) const
Return the uniqued reference to the type for a volatile qualified type.
CanQualType UnsignedLongLongTy
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
CanQualType UnsignedShortTy
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
QualType getCVRQualifiedType(QualType T, unsigned CVR) const
Return a type with additional const, volatile, or restrict qualifiers.
bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)
Return true if the given vector types are of the same unqualified type or if they are equivalent to t...
const TargetInfo & getTargetInfo() const
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
QualType getConstantArrayType(const ASTContext &Ctx) const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
Attr - This represents one attribute.
A builtin binary operation expression such as "x + y" or "x <= y".
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
StringRef getOpcodeStr() const
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
static bool isCompoundAssignmentOp(Opcode Opc)
This class is used for builtin types like 'int'.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
const RecordType * getDetectedVirtual() const
The virtual base discovered on the path (if we are merely detecting virtuals).
bool isAmbiguous(CanQualType BaseType)
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
Represents a C++ constructor within a class.
bool isCopyOrMoveConstructor(unsigned &TypeQuals) const
Determine whether this is a copy or move constructor.
bool isConvertingConstructor(bool AllowExplicit) const
Whether this constructor is a converting constructor (C++ [class.conv.ctor]), which can be used for u...
Represents a C++ conversion function within a class.
bool isExplicit() const
Return true if the declaration is already resolved to be explicit.
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Represents a call to a member function that may be written either with member call syntax (e....
static CXXMemberCallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
static CXXOperatorCallExpr * Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation OperatorLoc, FPOptionsOverride FPFeatures, ADLCallKind UsesADL=NotADL)
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 setUsesMemberSyntax(bool V=true)
void markDependentForPostponedNameLookup()
Used by Sema to implement MSVC-compatible delayed name lookup.
Represents a canonical, potentially-qualified type.
bool isAtLeastAsQualifiedAs(CanQual< T > Other, const ASTContext &Ctx) const
Determines whether this canonical type is at least as qualified as the Other canonical type.
static CanQual< Type > CreateUnsafe(QualType Other)
CanProxy< U > castAs() const
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.
bool isVolatileQualified() const
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
bool isPartial() const
True iff the comparison is not totally ordered.
bool isStrong() const
True iff the comparison is "strong".
Complex values, per C99 6.2.5p11.
QualType getElementType() const
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
Represents the canonical version of C arrays with a specified constant size.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
A reference to a declared variable, function, enum, etc.
void setHadMultipleCandidates(bool V=true)
Sets the flag telling whether this expression refers to a function that was resolved from an overload...
Decl - This represents one declaration (or definition), e.g.
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
specific_attr_iterator< T > specific_attr_end() const
specific_attr_iterator< T > specific_attr_begin() const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
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...
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void overloadCandidatesShown(unsigned N)
Call this after showing N overload candidates.
unsigned getNumOverloadCandidatesToShow() const
When a call or operator fails, print out up to this many candidate overloads as suggestions.
OverloadsShown getShowOverloads() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
RAII object that enters a new expression evaluation context.
Store information needed for an explicit specifier.
bool isExplicit() const
Determine whether this specifier is known to correspond to an explicit declaration.
ExplicitSpecKind getKind() const
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(FunctionDecl *Function)
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
The return type of classify().
static Classification makeSimpleLValue()
Create a simple, modifiable lvalue.
This represents one expression.
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
ExtVectorType - Extended vector type.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
const ParmVarDecl * getParamDecl(unsigned i) const
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
bool hasCXXExplicitFunctionObjectParameter() const
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
bool isVariadic() const
Whether this function is variadic.
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
unsigned getNumNonObjectParams() const
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
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.
void setInitializerListContainerType(QualType T, bool IA)
bool hasInitializerListContainerType() const
unsigned getKindRank() const
Return a ranking of the implicit conversion sequence kind, where smaller ranks represent better conve...
bool isInitializerListOfIncompleteArray() const
BadConversionSequence Bad
When ConversionKind == BadConversion, provides the details of the bad conversion.
QualType getInitializerListContainerType() const
void DiagnoseAmbiguousConversion(Sema &S, SourceLocation CaretLoc, const PartialDiagnostic &PDiag) const
Diagnoses an ambiguous conversion.
Describes an C or C++ initializer list.
bool hasDesignatedInit() const
Determine whether this initializer list contains a designated initializer.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
const Expr * getInit(unsigned Init) const
SourceLocation getEndLoc() const LLVM_READONLY
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeTemplateParameter(QualType T, NamedDecl *Param)
Create the initialization entity for a template parameter.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
An lvalue reference type, per C++11 [dcl.ref].
bool isCompatibleWithMSVC(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
UnresolvedSetImpl::iterator iterator
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'.
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
bool 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.
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.
NestedNameSpecifier getQualifier() const
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
QualType getPointeeType() const
Describes a module or submodule.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents an ObjC class declaration.
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCMethodDecl - Represents an instance or class method declaration.
Represents a pointer to an Objective C object.
bool isSpecialized() const
Whether this type is specialized, meaning that it has type arguments.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
void clear(CandidateSetKind CSK)
Clear out all of the candidates.
void AddDeferredTemplateCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, bool AllowExplicit, CallExpr::ADLCallKind IsADLCandidate, OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction)
bool isNewCandidate(Decl *F, OverloadCandidateParamOrder PO=OverloadCandidateParamOrder::Normal)
Determine when this overload candidate will be new to the overload set.
void AddDeferredConversionTemplateCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion)
void AddDeferredMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, OverloadCandidateParamOrder PO)
void DisableResolutionByPerfectCandidate()
ConversionSequenceList allocateConversionSequences(unsigned NumConversions)
Allocate storage for conversion sequences for NumConversions conversions.
llvm::MutableArrayRef< Expr * > getPersistentArgsArray(unsigned N)
Provide storage for any Expr* arg that must be preserved until deferred template candidates are deduc...
OperatorRewriteInfo getRewriteInfo() const
bool shouldDeferTemplateArgumentDeduction(const LangOptions &Opts) 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.
void InjectNonDeducedTemplateCandidates(Sema &S)
CandidateSetKind getKind() const
size_t nonDeferredCandidatesCount() const
SmallVector< OverloadCandidate *, 32 > CompleteCandidates(Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, SourceLocation OpLoc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
NestedNameSpecifier getQualifier() const
Fetches the nested-name qualifier, if one was given.
SourceLocation getNameLoc() const
Gets the location of the name.
UnresolvedSetImpl::iterator decls_iterator
decls_iterator decls_begin() const
unsigned getNumDecls() const
Gets the number of declarations in the unresolved set.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
decls_iterator decls_end() const
DeclarationName getName() const
Gets the name looked up.
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
ParenExpr - This represents a parenthesized expression, e.g.
Represents a parameter to a function.
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
bool isEquivalent(PointerAuthQualifier Other) const
std::string getAsString() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
bool isMoreQualifiedThan(QualType Other, const ASTContext &Ctx) const
Determine whether this type is more qualified than the other given type, requiring exact equality for...
bool isConstQualified() const
Determine whether this type is const-qualified.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualType apply(const ASTContext &Context, QualType QT) const
Apply the collected qualifiers to the given type.
QualifiersAndAtomic withVolatile()
QualifiersAndAtomic withAtomic()
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
bool hasOnlyConst() const
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
void removeObjCLifetime()
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
void removeAddressSpace()
void setAddressSpace(LangAS space)
PointerAuthQualifier getPointerAuth() const
bool hasObjCGCAttr() const
ObjCLifetime getObjCLifetime() const
std::string getAsString() const
LangAS getAddressSpace() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
field_range fields() const
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Scope - A scope is a transient data structure that is used while parsing the program.
Smart pointer class that efficiently represents Objective-C method names.
unsigned getNumArgs() const
bool areCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an SVE builtin and a VectorType that is a fixed-length representat...
bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible SVE vector types, false otherwise.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
bool IsAllowedCall(const FunctionDecl *Caller, const FunctionDecl *Callee)
Determines whether Caller may invoke Callee, based on their CUDA host/device attributes.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
bool inferTargetForImplicitSpecialMember(CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, CXXMethodDecl *MemberDecl, bool ConstRHS, bool Diagnose)
Given a implicit special member, infer its CUDA target from the calls it needs to make to underlying ...
static bool isImplicitHostDeviceFunction(const FunctionDecl *D)
void EraseUnwantedMatches(const FunctionDecl *Caller, llvm::SmallVectorImpl< std::pair< DeclAccessPair, FunctionDecl * > > &Matches)
Finds a function in Matches with highest calling priority from Caller context and erases all function...
CUDAFunctionPreference IdentifyPreference(const FunctionDecl *Caller, const FunctionDecl *Callee)
Identifies relative preference of a given Caller/Callee combination, based on their host/device attri...
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
Expr * stripARCUnbridgedCast(Expr *e)
stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast type, remove the placeholder cast.
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
virtual SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for one of the candidate conversions.
virtual SemaDiagnosticBuilder diagnoseNoMatch(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic complaining that the expression does not have integral or enumeration type.
virtual SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for the explicit conversion function.
virtual SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when the only matching conversion function is explicit.
virtual SemaDiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when we picked a conversion function (for cases when we are not allowed to pick a ...
virtual SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when there are multiple possible conversion functions.
virtual bool match(QualType T)=0
Determine whether the specified type is a valid destination type for this conversion.
virtual SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when the expression has incomplete class type.
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.
bool TryFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy) const
Same as IsFunctionConversion, but if this would return true, it sets ResultTy to ToType.
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function, const Expr *ThisArg, ArrayRef< const Expr * > Args, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any non-ArgDependent DiagnoseIf...
ExprResult PerformContextuallyConvertToObjCPointer(Expr *From)
PerformContextuallyConvertToObjCPointer - Perform a contextual conversion of the expression From to a...
bool buildOverloadedCallSet(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, MultiExprArg Args, SourceLocation RParenLoc, OverloadCandidateSet *CandidateSet, ExprResult *Result)
Constructs and populates an OverloadedCandidateSet from the given function.
void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow)
Hides a using shadow declaration.
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
ExprResult BuildLiteralOperatorCall(LookupResult &R, DeclarationNameInfo &SuffixInfo, ArrayRef< Expr * > Args, SourceLocation LitEndLoc, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to a literal operator descri...
bool IsStringInit(Expr *Init, const ArrayType *AT)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
void AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
Adds a conversion function template specialization candidate to the overload set, using template argu...
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
void AddBuiltinCandidate(QualType *ParamTys, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool IsAssignmentOperator=false, unsigned NumContextualBoolArguments=0)
AddBuiltinCandidate - Add a candidate for a built-in operator.
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void AddArgumentDependentLookupCandidates(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, TemplateArgumentListInfo *ExplicitTemplateArgs, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add function candidates found via argument-dependent lookup to the set of overloading candidates.
ExprResult EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue)
EvaluateConvertedConstantExpression - Evaluate an Expression That is a converted constant expression ...
FPOptionsOverride CurFPFeatureOverrides()
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
DiagnosticsEngine & getDiagnostics() const
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
bool CheckNonDependentConversions(FunctionTemplateDecl *FunctionTemplate, ArrayRef< QualType > ParamTypes, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, ConversionSequenceList &Conversions, CheckNonDependentConversionsFlag UserConversionFlag, CXXRecordDecl *ActingContext=nullptr, QualType ObjectType=QualType(), Expr::Classification ObjectClassification={}, OverloadCandidateParamOrder PO={})
Check that implicit conversion sequences can be formed for each argument whose corresponding paramete...
bool isObjCPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType, bool &IncompatibleObjC)
isObjCPointerConversion - Determines whether this is an Objective-C pointer conversion.
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
bool FunctionParamTypesAreEqual(ArrayRef< QualType > Old, ArrayRef< QualType > New, unsigned *ArgPos=nullptr, bool Reversed=false)
FunctionParamTypesAreEqual - This routine checks two function proto types for equality of their param...
ExprResult PerformImplicitObjectArgumentInitialization(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, CXXMethodDecl *Method)
PerformObjectArgumentInitialization - Perform initialization of the implicit object parameter for the...
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
ASTContext & getASTContext() const
UnresolvedSetIterator getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd, TemplateSpecCandidateSet &FailedCandidates, SourceLocation Loc, const PartialDiagnostic &NoneDiag, const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag, bool Complain=true, QualType TargetType=QualType())
Retrieve the most specialized of the given function template specializations.
bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType)
IsIntegralPromotion - Determines whether the conversion from the expression From (whose potentially-a...
bool IsFloatingPointPromotion(QualType FromType, QualType ToType)
IsFloatingPointPromotion - Determines whether the conversion from FromType to ToType is a floating po...
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
void PopExpressionEvaluationContext()
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction, const FunctionDecl *NewFunction, unsigned *ArgPos=nullptr, bool Reversed=false)
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
llvm::SmallSetVector< CXXRecordDecl *, 16 > AssociatedClassSet
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr, const SourceRange &, DeclAccessPair FoundDecl)
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType)
bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType, bool &IncompatibleObjC)
IsPointerConversion - Determines whether the conversion of the expression From, which has the (possib...
@ Conversions
Allow explicit conversion functions but not explicit constructors.
void DiagnoseUseOfDeletedFunction(SourceLocation Loc, SourceRange Range, DeclarationName Name, OverloadCandidateSet &CandidateSet, FunctionDecl *Fn, MultiExprArg Args, bool IsMember=false)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool IsComplexPromotion(QualType FromType, QualType ToType)
Determine if a conversion is a complex promotion.
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
void AddConversionCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true, bool StrictPackMatch=false)
AddConversionCandidate - Add a C++ conversion function as a candidate in the candidate set (C++ [over...
bool IsBlockPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc, ArrayRef< Expr * > Args, AssociatedNamespaceSet &AssociatedNamespaces, AssociatedClassSet &AssociatedClasses)
Find the associated classes and namespaces for argument-dependent lookup for a call with the given se...
void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, OverloadCandidateParamOrder PO={})
Add a C++ member function template as a candidate to the candidate set, using template argument deduc...
void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation OpLoc)
DiagnoseSelfMove - Emits a warning if a value is moved to itself.
bool isSameOrCompatibleFunctionType(QualType Param, QualType Arg)
Compare types for equality with respect to possibly compatible function types (noreturn adjustment,...
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
const LangOptions & getLangOpts() const
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A, const NamedDecl *B)
Determine if A and B are equivalent internal linkage declarations from different modules,...
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr)
Diagnose an empty lookup.
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult BuildSynthesizedThreeWayComparison(SourceLocation OpLoc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, FunctionDecl *DefaultedFn)
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc, const Expr *Op, const CXXMethodDecl *MD)
AccessResult CheckUnresolvedMemberAccess(UnresolvedMemberExpr *E, DeclAccessPair FoundDecl)
Perform access-control checking on a previously-unresolved member access which has now been resolved ...
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
const LangOptions & LangOpts
bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType)
IsMemberPointerConversion - Determines whether the conversion of the expression From,...
ExprResult BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef< Expr * > Arg, SourceLocation RParenLoc, Expr *Config=nullptr, bool IsExecConfig=false, ADLCallKind UsesADL=ADLCallKind::NotADL)
BuildResolvedCallExpr - Build a call to a resolved expression, i.e.
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
MemberPointerConversionDirection
bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any ArgDependent DiagnoseIfAttr...
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
void popCodeSynthesisContext()
bool AreConstraintExpressionsEqual(const NamedDecl *Old, const Expr *OldConstr, const TemplateCompareNewDeclInfo &New, const Expr *NewConstr)
ReferenceConversionsScope::ReferenceConversions ReferenceConversions
MemberPointerConversionResult CheckMemberPointerConversion(QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind, CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange, bool IgnoreBaseAccess, MemberPointerConversionDirection Direction)
CheckMemberPointerConversion - Check the member pointer conversion from the expression From to the ty...
Expr * BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit)
Build a CXXThisExpr and mark it referenced in the current context.
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add the overload candidates named by callee and/or found by argument dependent lookup to the given ov...
ExprResult DefaultLvalueConversion(Expr *E)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
void NoteOverloadCandidate(const NamedDecl *Found, const FunctionDecl *Fn, OverloadCandidateRewriteKind RewriteKind=OverloadCandidateRewriteKind(), QualType DestType=QualType(), bool TakingAddress=false)
bool DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType)
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
void ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, ADLResult &Functions)
FunctionDecl * resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult)
Given an expression that refers to an overloaded function, try to resolve that function to a single f...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, SourceLocation Loc={}, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
AccessResult CheckAddressOfMemberAccess(Expr *OvlExpr, DeclAccessPair FoundDecl)
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
EnableIfAttr * CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc, ArrayRef< Expr * > Args, bool MissingImplicitThis=false)
Check the enable_if expressions on the given function.
ExprResult CreateUnresolvedLookupExpr(CXXRecordDecl *NamingClass, NestedNameSpecifierLoc NNSLoc, DeclarationNameInfo DNI, const UnresolvedSetImpl &Fns, bool PerformADL=true)
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversion=false, OverloadCandidateParamOrder PO={})
AddMethodCandidate - Adds a named decl (which is some kind of method) as a method candidate to the gi...
void diagnoseEquivalentInternalLinkageDeclarations(SourceLocation Loc, const NamedDecl *D, ArrayRef< const NamedDecl * > Equiv)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
ExprResult ActOnConditionalOp(SourceLocation QuestionLoc, SourceLocation ColonLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr)
ActOnConditionalOp - Parse a ?
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
bool resolveAndFixAddressOfSingleOverloadCandidate(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false)
Given an overloaded function, tries to turn it into a non-overloaded function reference using resolve...
CallExpr::ADLCallKind ADLCallKind
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
bool anyAltivecTypes(QualType srcType, QualType destType)
bool isLaxVectorConversion(QualType srcType, QualType destType)
Is this a legal conversion between two types, one of which is known to be a vector type?
ExprResult BuildOverloadedCallExpr(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, bool AllowTypoCorrection=true, bool CalleesAddressIsTaken=false)
BuildOverloadedCallExpr - Given the call expression that calls Fn (which eventually refers to the dec...
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
bool isSFINAEContext() const
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,...
void AddFunctionCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, bool SuppressUserConversions=false, bool PartialOverloading=false, bool FirstArgumentIsBase=false)
Add all of the function declarations in the given function set to the overload candidate set.
bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose=true)
CheckPointerConversion - Check the pointer conversion from the expression From to the type ToType.
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void AddNonMemberOperatorCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
Add all of the non-member operator function declarations in the given function set to the overload ca...
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc, CallExpr *CE, FunctionDecl *FD)
CheckCallReturnType - Checks that a call expression's return type is complete.
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, ReferenceConversions *Conv=nullptr)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
MemberPointerConversionResult
SourceManager & SourceMgr
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
NamespaceDecl * getStdNamespace() const
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
void AddSurrogateCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, const FunctionProtoType *Proto, Expr *Object, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddSurrogateCandidate - Adds a "surrogate" candidate function that converts the given Object to a fun...
MemberExpr * BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, bool HadMultipleCandidates, const DeclarationNameInfo &MemberNameInfo, QualType Ty, ExprValueKind VK, ExprObjectKind OK, const TemplateArgumentListInfo *TemplateArgs=nullptr)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
bool IsFunctionConversion(QualType FromType, QualType ToType) const
Determine whether the conversion from FromType to ToType is a valid conversion of ExtInfo/ExtProtoInf...
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(const NamedDecl *D1, ArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, ArrayRef< AssociatedConstraint > AC2)
If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...
ForRangeStatus BuildForRangeBeginEndCall(SourceLocation Loc, SourceLocation RangeLoc, const DeclarationNameInfo &NameInfo, LookupResult &MemberLookup, OverloadCandidateSet *CandidateSet, Expr *Range, ExprResult *CallExpr)
Build a call to 'begin' or 'end' for a C++11 for-range statement.
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
ExprResult InitializeExplicitObjectArgument(Sema &S, Expr *Obj, FunctionDecl *Fun)
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method, SourceLocation CallLoc)
Returns true if the explicit object parameter was invalid.
bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType)
Helper function to determine whether this is the (deprecated) C++ conversion from a string literal to...
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool ExecConfig=false)
ConvertArgumentsForCall - Converts the arguments specified in Args/NumArgs to the parameter types of ...
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false, bool PartialOverloading=false)
Returns the more specialized function template according to the rules of function template partial or...
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
void AddMemberOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, OverloadCandidateParamOrder PO={})
Add overload candidates for overloaded operators that are member functions.
void CheckVirtualDtorCall(CXXDestructorDecl *dtor, SourceLocation Loc, bool IsDelete, bool CallCanBeVirtual, bool WarnOnNonAbstractTypes, SourceLocation DtorLoc)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto, const Expr *ThisArg, ArrayRef< const Expr * > Args, bool IsMemberFunction, SourceLocation Loc, SourceRange Range, VariadicCallType CallType)
Handles the checks for format strings, non-POD arguments to vararg functions, NULL arguments passed t...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
void dump() const
dump - Print this standard conversion sequence to standard error.
void setFromType(QualType T)
DeclAccessPair FoundCopyConstructor
bool isIdentityConversion() const
unsigned BindsToRvalue
Whether we're binding to an rvalue.
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
QualType getFromType() const
ImplicitConversionKind First
First – The first conversion can be an lvalue-to-rvalue conversion, array-to-pointer conversion,...
unsigned BindsImplicitObjectArgumentWithoutRefQualifier
Whether this binds an implicit object argument to a non-static member function without a ref-qualifie...
unsigned ReferenceBinding
ReferenceBinding - True when this is a reference binding (C++ [over.ics.ref]).
void setAsIdentityConversion()
StandardConversionSequence - Set the standard conversion sequence to the identity conversion.
unsigned DeprecatedStringLiteralToCharPtr
Whether this is the deprecated conversion of a string literal to a pointer to non-const character dat...
CXXConstructorDecl * CopyConstructor
CopyConstructor - The copy constructor that is used to perform this conversion, when the conversion i...
unsigned IncompatibleObjC
IncompatibleObjC - Whether this is an Objective-C conversion that we should warn about (if we actuall...
unsigned ObjCLifetimeConversionBinding
Whether this binds a reference to an object with a different Objective-C lifetime qualifier.
ImplicitConversionKind Third
Third - The third conversion can be a qualification conversion or a function conversion.
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)
unsigned FromBracedInitList
Whether the source expression was originally a single element braced-init-list.
QualType getToType(unsigned Idx) const
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
StringRef getString() const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
virtual bool hasIbm128Type() const
Determine whether the __ibm128 type is supported on this target.
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
A convenient class for passing around template argument information.
A template argument list.
Represents a template argument.
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
QualType getAsType() const
Retrieve the type for a type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
@ Template
The template argument is a template name that was provided for a template template parameter.
@ Pack
The template argument is actually a parameter pack.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
@ Template
A single template declaration.
bool hasAssociatedConstraints() const
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
SmallVector< TemplateSpecCandidate, 16 >::iterator iterator
void NoteCandidates(Sema &S, SourceLocation Loc)
NoteCandidates - When no template specialization match is found, prints diagnostic messages containin...
void clear()
Clear out all of the candidates.
SourceLocation getLocation() const
TemplateSpecCandidate & addCandidate()
Add a new candidate with NumConversions conversion sequence slots to the overload set.
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
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
bool isConvertibleToFixedPointType() const
Return true if this can be converted to (or from) a fixed point type.
CXXRecordDecl * castAsCXXRecordDecl() const
bool isArithmeticType() const
bool isPointerType() const
bool isArrayParameterType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isExtVectorBoolType() const
bool isObjCObjectOrInterfaceType() const
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isLValueReferenceType() const
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const BuiltinType * getAsPlaceholderType() const
bool isMemberPointerType() const
bool 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.
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isBFloat16Type() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isVectorType() const
bool isObjCClassType() const
bool isRealFloatingType() const
Floating point categories.
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isHLSLAttributedResourceType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given unary opcode.
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
DeclarationName getMemberName() const
Retrieve the name of the member that this expression refers to.
QualType getBaseType() const
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getMemberLoc() const
Retrieve the location of the name of the member that this expression refers to.
A set of unresolved declarations.
ArrayRef< DeclAccessPair > pairs() const
void addDecl(NamedDecl *D)
The iterator over UnresolvedSets.
A set of unresolved declarations.
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
static UserDefinedLiteral * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation LitEndLoc, SourceLocation SuffixLoc, FPOptionsOverride FPFeatures)
unsigned getNumElements() const
QualType getElementType() const
Provides information about an attempted template argument deduction, whose success or failure was des...
TemplateArgumentList * takeSugared()
Take ownership of the deduced template argument lists.
TemplateArgument SecondArg
The second template argument to which the template argument deduction failure refers.
TemplateParameter Param
The template parameter to which a template argument deduction failure refers.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
TemplateArgument FirstArg
The first template argument to which the template argument deduction failure refers.
ConstraintSatisfaction AssociatedConstraintsSatisfaction
The constraint satisfaction details resulting from the associated constraints satisfaction tests.
void takeSFINAEDiagnostic(PartialDiagnosticAt &PD)
Take ownership of the SFINAE diagnostic.
unsigned CallArgIndex
The index of the function argument that caused a deduction failure.
bool hasStrictPackMatch() const
specific_attr_iterator - Iterates over a subrange of an AttrVec, only providing attributes that are o...
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
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)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
bool isBetterOverloadCandidate(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2, SourceLocation Loc, OverloadCandidateSet::CandidateSetKind Kind, bool PartialOverloading=false)
isBetterOverloadCandidate - Determines whether the first overload candidate is a better candidate tha...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ ovl_fail_final_conversion_not_exact
This conversion function template specialization candidate is not viable because the final conversion...
@ ovl_fail_enable_if
This candidate function was not viable because an enable_if attribute disabled it.
@ ovl_fail_illegal_constructor
This conversion candidate was not considered because it is an illegal instantiation of a constructor ...
@ ovl_fail_bad_final_conversion
This conversion candidate is not viable because its result type is not implicitly convertible to the ...
@ ovl_fail_module_mismatched
This candidate was not viable because it has internal linkage and is from a different module unit tha...
@ ovl_fail_too_few_arguments
@ ovl_fail_addr_not_available
This candidate was not viable because its address could not be taken.
@ ovl_fail_too_many_arguments
@ ovl_non_default_multiversion_function
This candidate was not viable because it is a non-default multiversioned function.
@ ovl_fail_constraints_not_satisfied
This candidate was not viable because its associated constraints were not satisfied.
@ ovl_fail_bad_conversion
@ ovl_fail_bad_target
(CUDA) This candidate was not viable because the callee was not accessible from the caller's target (...
@ ovl_fail_inhctor_slice
This inherited constructor is not viable because it would slice the argument.
@ ovl_fail_object_addrspace_mismatch
This constructor/conversion candidate fail due to an address space mismatch between the object being ...
@ ovl_fail_explicit
This candidate constructor or conversion function is explicit but the context doesn't permit explicit...
@ ovl_fail_trivial_conversion
This conversion candidate was not considered because it duplicates the work of a trivial or derived-t...
@ Comparison
A comparison.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
ImplicitConversionRank
ImplicitConversionRank - The rank of an implicit conversion kind.
@ ICR_Conversion
Conversion.
@ ICR_Writeback_Conversion
ObjC ARC writeback conversion.
@ ICR_HLSL_Dimension_Reduction
HLSL Matching Dimension Reduction.
@ ICR_HLSL_Dimension_Reduction_Conversion
HLSL Dimension reduction with conversion.
@ ICR_HLSL_Scalar_Widening
HLSL Scalar Widening.
@ ICR_C_Conversion
Conversion only allowed in the C standard (e.g. void* to char*).
@ ICR_OCL_Scalar_Widening
OpenCL Scalar Widening.
@ ICR_Complex_Real_Conversion
Complex <-> Real conversion.
@ ICR_HLSL_Scalar_Widening_Conversion
HLSL Scalar Widening with conversion.
@ ICR_HLSL_Dimension_Reduction_Promotion
HLSL Dimension reduction with promotion.
@ ICR_Promotion
Promotion.
@ ICR_Exact_Match
Exact Match.
@ ICR_C_Conversion_Extension
Conversion not allowed by the C standard, but that we accept as an extension anyway.
@ ICR_HLSL_Scalar_Widening_Promotion
HLSL Scalar Widening with promotion.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_ViableCandidates
Requests that only viable candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
Expr::ConstantExprKind ConstantExprKind
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OverloadsShown
Specifies which overload candidates to display when overload resolution fails.
@ Ovl_Best
Show just the "best" overload candidates.
llvm::MutableArrayRef< ImplicitConversionSequence > ConversionSequenceList
A list of implicit conversion sequences for the arguments of an OverloadCandidate.
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
OverloadCandidateRewriteKind
The kinds of rewrite we perform on overload candidates.
@ CRK_Reversed
Candidate is a rewritten candidate with a reversed order of parameters.
@ CRK_None
Candidate is not a rewritten candidate.
@ CRK_DifferentOperator
Candidate is a rewritten candidate with a different operator name.
MutableArrayRef< Expr * > MultiExprArg
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Result
The result type of a method or function.
const FunctionProtoType * T
ImplicitConversionKind
ImplicitConversionKind - The kind of implicit conversion used to convert an argument to a parameter's...
@ ICK_Complex_Conversion
Complex conversions (C99 6.3.1.6)
@ ICK_Floating_Promotion
Floating point promotions (C++ [conv.fpprom])
@ ICK_Boolean_Conversion
Boolean conversions (C++ [conv.bool])
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
@ ICK_Fixed_Point_Conversion
Fixed point type conversions according to N1169.
@ ICK_Vector_Conversion
Vector conversions.
@ ICK_Block_Pointer_Conversion
Block Pointer conversions.
@ ICK_Pointer_Member
Pointer-to-member conversions (C++ [conv.mem])
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
@ ICK_HLSL_Array_RValue
HLSL non-decaying array rvalue cast.
@ ICK_SVE_Vector_Conversion
Arm SVE Vector conversions.
@ ICK_HLSL_Vector_Truncation
HLSL vector truncation.
@ ICK_Incompatible_Pointer_Conversion
C-only conversion between pointers with incompatible types.
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
@ ICK_RVV_Vector_Conversion
RISC-V RVV Vector conversions.
@ ICK_Complex_Promotion
Complex promotions (Clang extension)
@ ICK_Num_Conversion_Kinds
The number of conversion kinds.
@ ICK_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])
@ Template
We are parsing a template declaration.
ActionResult< CXXBaseSpecifier * > BaseResult
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
@ Compatible
Compatible - the types are compatible according to the standard.
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
@ FunctionTemplate
The name was classified as a function template name.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
CXXSpecialMemberKind
Kinds of C++ special members.
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool shouldEnforceArgLimit(bool PartialOverloading, FunctionDecl *Function)
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
NarrowingKind
NarrowingKind - The kind of narrowing conversion being performed by a standard conversion sequence ac...
@ NK_Not_Narrowing
Not a narrowing conversion.
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
@ TPOC_Conversion
Partial ordering of function templates for a call to a conversion function.
@ TPOC_Call
Partial ordering of function templates for a function call.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateDeductionResult
Describes the result of template argument deduction.
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
@ CUDATargetMismatch
CUDA Target attributes do not match.
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ Invalid
The declaration was invalid; do nothing.
@ Success
Template argument deduction was successful.
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
@ AlreadyDiagnosed
Some error which was already diagnosed.
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
U cast(CodeGen::Address addr)
ConstructorInfo getConstructorInfo(NamedDecl *ND)
@ None
The alignment was not explicit in code.
CCEKind
Contexts in which a converted constant expression is required.
@ TemplateArg
Value of a non-type template parameter.
@ Noexcept
Condition in a noexcept(bool) specifier.
@ ArrayBound
Array bound in array declarator or new-expression.
@ TempArgStrict
As above, but applies strict template checking rules.
@ ExplicitBool
Condition in an explicit(bool) specifier.
ImplicitConversionRank GetConversionRank(ImplicitConversionKind Kind)
GetConversionRank - Retrieve the implicit conversion rank corresponding to the given implicit convers...
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
@ EST_None
no exception specification
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
__DEVICE__ _Tp abs(const std::complex< _Tp > &__c)
Represents an ambiguous user-defined conversion sequence.
ConversionSet::const_iterator const_iterator
ConversionSet & conversions()
SmallVector< std::pair< NamedDecl *, FunctionDecl * >, 4 > ConversionSet
void setFromType(QualType T)
void setToType(QualType T)
void addConversion(NamedDecl *Found, FunctionDecl *D)
void copyFrom(const AmbiguousConversionSequence &)
const Expr * ConstraintExpr
UnsignedOrNone ArgPackSubstIndex
QualType getToType() const
QualType getFromType() const
OverloadFixItKind Kind
The type of fix applied.
unsigned NumConversionsFixed
The number of Conversions fixed.
void setConversionChecker(TypeComparisonFuncTy Foo)
Resets the default conversion checker method.
std::vector< FixItHint > Hints
The list of Hints generated so far.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
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.
unsigned HasDiagnostic
Indicates whether a diagnostic is stored in Diagnostic.
TemplateDeductionResult getResult() const
void Destroy()
Free any memory associated with this deduction failure.
char Diagnostic[sizeof(PartialDiagnosticAt)]
A diagnostic indicating why deduction failed.
UnsignedOrNone getCallArgIndex()
Return the index of the call argument that this deduction failure refers to, if any.
TemplateParameter getTemplateParameter()
Retrieve the template parameter this deduction failure refers to, if any.
TemplateArgumentList * getTemplateArgumentList()
Retrieve the template argument list associated with this deduction failure, if any.
const TemplateArgument * getFirstArg()
Return the first template argument this deduction failure refers to, if any.
DeferredTemplateOverloadCandidate * Next
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
Information about operator rewrites to consider when adding operator functions to a candidate set.
bool allowsReversed(OverloadedOperatorKind Op) const
Determine whether reversing parameter order is allowed for operator Op.
bool shouldAddReversed(Sema &S, ArrayRef< Expr * > OriginalArgs, FunctionDecl *FD) const
Determine whether we should add a rewritten candidate for FD with reversed parameter order.
bool isAcceptableCandidate(const FunctionDecl *FD) const
bool isReversible() const
Determines whether this operator could be implemented by a function with reversed parameter order.
SourceLocation OpLoc
The source location of the operator.
bool AllowRewrittenCandidates
Whether we should include rewritten candidates in the overload set.
OverloadCandidateRewriteKind getRewriteKind(const FunctionDecl *FD, OverloadCandidateParamOrder PO)
Determine the kind of rewrite that should be performed for this candidate.
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
unsigned StrictPackMatch
Have we matched any packs on the parameter side, versus any non-packs on the argument side,...
unsigned IgnoreObjectArgument
IgnoreObjectArgument - True to indicate that the first argument's conversion, which for this function...
bool TryToFixBadConversion(unsigned Idx, Sema &S)
bool NotValidBecauseConstraintExprHasError() const
unsigned IsADLCandidate
True if the candidate was found using ADL.
unsigned IsSurrogate
IsSurrogate - True to indicate that this candidate is a surrogate for a conversion to a function poin...
QualType BuiltinParamTypes[3]
BuiltinParamTypes - Provides the parameter types of a built-in overload candidate.
DeclAccessPair FoundDecl
FoundDecl - The original declaration that was looked up / invented / otherwise found,...
FunctionDecl * Function
Function - The actual function that this candidate represents.
unsigned RewriteKind
Whether this is a rewritten candidate, and if so, of what kind?
ConversionFixItGenerator Fix
The FixIt hints which can be used to fix the Bad candidate.
unsigned Best
Whether this candidate is the best viable function, or tied for being the best viable function.
StandardConversionSequence FinalConversion
FinalConversion - For a conversion function (where Function is a CXXConversionDecl),...
unsigned getNumParams() const
unsigned HasFinalConversion
Whether FinalConversion has been set.
unsigned TookAddressOfOverload
unsigned FailureKind
FailureKind - The reason why this candidate is not viable.
unsigned ExplicitCallArguments
The number of call arguments that were explicitly provided, to be used while performing partial order...
ConversionSequenceList Conversions
The conversion sequences used to convert the function arguments to the function parameters.
DeductionFailureInfo DeductionFailure
unsigned Viable
Viable - True to indicate that this overload candidate is viable.
CXXConversionDecl * Surrogate
Surrogate - The conversion function for which this candidate is a surrogate, but only if IsSurrogate ...
OverloadCandidateRewriteKind getRewriteKind() const
Get RewriteKind value in OverloadCandidateRewriteKind type (This function is to workaround the spurio...
bool HasFormOfMemberPointer
OverloadExpr * Expression
bool SuppressUserConversions
Do not consider any user-defined conversions when constructing the initializing sequence.
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Decl * Entity
The entity that is being synthesized.
Abstract class used to diagnose incomplete types.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
TemplateSpecCandidate - This is a generalization of OverloadCandidate which keeps track of template a...
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.
DeclAccessPair FoundDecl
The declaration that was looked up, together with its access.
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.