41#include "llvm/ADT/DenseSet.h"
42#include "llvm/ADT/STLExtras.h"
43#include "llvm/ADT/STLForwardCompat.h"
44#include "llvm/ADT/ScopeExit.h"
45#include "llvm/ADT/SmallPtrSet.h"
46#include "llvm/ADT/SmallString.h"
47#include "llvm/ADT/SmallVector.h"
48#include "llvm/Support/Casting.h"
62 return P->hasAttr<PassObjectSizeAttr>();
83 if (HadMultipleCandidates)
94 CK_FunctionToPointerDecay);
98 bool InOverloadResolution,
101 bool AllowObjCWritebackConversion);
105 bool InOverloadResolution,
113 bool AllowObjCConversionOnExplicit);
174 return Rank[(
int)Kind];
199 static const char *
const Name[] = {
203 "Function-to-pointer",
204 "Function pointer conversion",
206 "Integral promotion",
207 "Floating point promotion",
209 "Integral conversion",
210 "Floating conversion",
211 "Complex conversion",
212 "Floating-integral conversion",
213 "Pointer conversion",
214 "Pointer-to-member conversion",
215 "Boolean conversion",
216 "Compatible-types conversion",
217 "Derived-to-base conversion",
219 "SVE Vector conversion",
220 "RVV Vector conversion",
222 "Complex-real conversion",
223 "Block Pointer conversion",
224 "Transparent Union Conversion",
225 "Writeback conversion",
226 "OpenCL Zero Event Conversion",
227 "OpenCL Zero Queue Conversion",
228 "C specific type conversion",
229 "Incompatible pointer conversion",
230 "Fixed point conversion",
231 "HLSL vector truncation",
232 "Non-decaying array conversion",
320 const Expr *Converted) {
323 if (
auto *EWC = dyn_cast<ExprWithCleanups>(Converted)) {
330 while (
auto *ICE = dyn_cast<ImplicitCastExpr>(Converted)) {
331 switch (ICE->getCastKind()) {
333 case CK_IntegralCast:
334 case CK_IntegralToBoolean:
335 case CK_IntegralToFloating:
336 case CK_BooleanToSignedIntegral:
337 case CK_FloatingToIntegral:
338 case CK_FloatingToBoolean:
339 case CK_FloatingCast:
340 Converted = ICE->getSubExpr();
364 QualType &ConstantType,
bool IgnoreFloatToIntegralConversion)
const {
366 "narrowing check outside C++");
377 ToType = ET->getDecl()->getIntegerType();
383 goto FloatingIntegralConversion;
385 goto IntegralConversion;
396 FloatingIntegralConversion:
401 if (IgnoreFloatToIntegralConversion)
404 assert(
Initializer &&
"Unknown conversion expression");
410 if (std::optional<llvm::APSInt> IntConstantValue =
414 Result.convertFromAPInt(*IntConstantValue, IntConstantValue->isSigned(),
415 llvm::APFloat::rmNearestTiesToEven);
417 llvm::APSInt ConvertedValue = *IntConstantValue;
419 Result.convertToInteger(ConvertedValue,
420 llvm::APFloat::rmTowardZero, &ignored);
422 if (*IntConstantValue != ConvertedValue) {
423 ConstantValue =
APValue(*IntConstantValue);
450 Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue)) {
453 ConstantValue = R.
Val;
454 assert(ConstantValue.
isFloat());
455 llvm::APFloat FloatVal = ConstantValue.
getFloat();
458 llvm::APFloat Converted = FloatVal;
459 llvm::APFloat::opStatus ConvertStatus =
461 llvm::APFloat::rmNearestTiesToEven, &ignored);
463 llvm::APFloat::rmNearestTiesToEven, &ignored);
465 if (FloatVal.isNaN() && Converted.isNaN() &&
466 !FloatVal.isSignaling() && !Converted.isSignaling()) {
472 if (!Converted.bitwiseIsEqual(FloatVal)) {
479 if (ConvertStatus & llvm::APFloat::opOverflow) {
501 IntegralConversion: {
509 constexpr auto CanRepresentAll = [](
bool FromSigned,
unsigned FromWidth,
510 bool ToSigned,
unsigned ToWidth) {
511 return (FromWidth < ToWidth + (FromSigned == ToSigned)) &&
512 (FromSigned <= ToSigned);
515 if (CanRepresentAll(FromSigned, FromWidth, ToSigned, ToWidth))
521 bool DependentBitField =
false;
523 if (BitField->getBitWidth()->isValueDependent())
524 DependentBitField =
true;
525 else if (
unsigned BitFieldWidth = BitField->getBitWidthValue(Ctx);
526 BitFieldWidth < FromWidth) {
527 if (CanRepresentAll(FromSigned, BitFieldWidth, ToSigned, ToWidth))
531 FromWidth = BitFieldWidth;
539 std::optional<llvm::APSInt> OptInitializerValue =
541 if (!OptInitializerValue) {
545 if (DependentBitField && (FromSigned <= ToSigned))
551 llvm::APSInt &InitializerValue = *OptInitializerValue;
552 bool Narrowing =
false;
553 if (FromWidth < ToWidth) {
556 if (InitializerValue.isSigned() && InitializerValue.isNegative())
562 InitializerValue.extend(InitializerValue.getBitWidth() + 1);
564 llvm::APSInt ConvertedValue = InitializerValue;
565 ConvertedValue = ConvertedValue.trunc(ToWidth);
566 ConvertedValue.setIsSigned(ToSigned);
567 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
568 ConvertedValue.setIsSigned(InitializerValue.isSigned());
570 if (ConvertedValue != InitializerValue)
575 ConstantValue =
APValue(InitializerValue);
591 ConstantValue = R.
Val;
592 assert(ConstantValue.
isFloat());
593 llvm::APFloat FloatVal = ConstantValue.
getFloat();
598 if (FloatVal.isNaN() && FloatVal.isSignaling()) {
614 raw_ostream &OS = llvm::errs();
615 bool PrintedSomething =
false;
618 PrintedSomething =
true;
622 if (PrintedSomething) {
628 OS <<
" (by copy constructor)";
630 OS <<
" (direct reference binding)";
632 OS <<
" (reference binding)";
634 PrintedSomething =
true;
638 if (PrintedSomething) {
642 PrintedSomething =
true;
645 if (!PrintedSomething) {
646 OS <<
"No conversions required";
653 raw_ostream &OS = llvm::errs();
661 OS <<
"aggregate initialization";
671 raw_ostream &OS = llvm::errs();
673 OS <<
"Worst list element conversion: ";
674 switch (ConversionKind) {
676 OS <<
"Standard conversion: ";
680 OS <<
"User-defined conversion: ";
684 OS <<
"Ellipsis conversion";
687 OS <<
"Ambiguous conversion";
690 OS <<
"Bad conversion";
715 struct DFIArguments {
721 struct DFIParamWithArguments : DFIArguments {
726 struct DFIDeducedMismatchArgs : DFIArguments {
728 unsigned CallArgIndex;
745 Result.Result =
static_cast<unsigned>(TDK);
746 Result.HasDiagnostic =
false;
765 auto *Saved =
new (Context) DFIDeducedMismatchArgs;
776 DFIArguments *Saved =
new (Context) DFIArguments;
788 DFIParamWithArguments *Saved =
new (Context) DFIParamWithArguments;
789 Saved->Param = Info.
Param;
802 Result.HasDiagnostic =
true;
807 CNSInfo *Saved =
new (Context) CNSInfo;
817 llvm_unreachable(
"not a deduction failure");
850 Diag->~PartialDiagnosticAt();
859 Diag->~PartialDiagnosticAt();
895 return TemplateParameter::getFromOpaqueValue(
Data);
900 return static_cast<DFIParamWithArguments*
>(
Data)->Param;
930 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->TemplateArgs;
936 return static_cast<CNSInfo*
>(
Data)->TemplateArgs;
968 return &
static_cast<DFIArguments*
>(
Data)->FirstArg;
1000 return &
static_cast<DFIArguments*
>(
Data)->SecondArg;
1015 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->CallArgIndex;
1018 return std::nullopt;
1031 for (
unsigned I = 0; I <
X->getNumParams(); ++I)
1035 if (
auto *FTX =
X->getDescribedFunctionTemplate()) {
1040 FTY->getTemplateParameters()))
1049 OverloadedOperatorKind::OO_EqualEqual);
1061 OverloadedOperatorKind::OO_ExclaimEqual);
1062 if (isa<CXXMethodDecl>(EqFD)) {
1079 auto *NotEqFD = Op->getAsFunction();
1080 if (
auto *UD = dyn_cast<UsingShadowDecl>(Op))
1081 NotEqFD = UD->getUnderlyingDecl()->getAsFunction();
1084 cast<Decl>(Op->getLexicalDeclContext())))
1094 return Op == OO_EqualEqual || Op == OO_Spaceship;
1100 if (!allowsReversed(Op))
1102 if (Op == OverloadedOperatorKind::OO_EqualEqual) {
1103 assert(OriginalArgs.size() == 2);
1105 S, OpLoc, OriginalArgs[1], FD))
1116void OverloadCandidateSet::destroyCandidates() {
1118 for (
auto &
C : i->Conversions)
1119 C.~ImplicitConversionSequence();
1121 i->DeductionFailure.Destroy();
1126 destroyCandidates();
1127 SlabAllocator.Reset();
1128 NumInlineBytesUsed = 0;
1135 class UnbridgedCastsSet {
1145 Entry entry = { &
E,
E };
1146 Entries.push_back(entry);
1152 i = Entries.begin(), e = Entries.end(); i != e; ++i)
1153 *i->Addr = i->Saved;
1167 UnbridgedCastsSet *unbridgedCasts =
nullptr) {
1171 if (placeholder->getKind() == BuiltinType::Overload)
return false;
1175 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
1177 unbridgedCasts->save(S,
E);
1197 UnbridgedCastsSet &unbridged) {
1198 for (
unsigned i = 0, e = Args.size(); i != e; ++i)
1207 NamedDecl *&Match,
bool NewIsUsingDecl) {
1212 bool OldIsUsingDecl =
false;
1213 if (isa<UsingShadowDecl>(OldD)) {
1214 OldIsUsingDecl =
true;
1218 if (NewIsUsingDecl)
continue;
1220 OldD = cast<UsingShadowDecl>(OldD)->getTargetDecl();
1225 if ((OldIsUsingDecl || NewIsUsingDecl) && !isVisible(*I))
1233 bool UseMemberUsingDeclRules =
1234 (OldIsUsingDecl || NewIsUsingDecl) && CurContext->isRecord() &&
1238 if (!IsOverload(New, OldF, UseMemberUsingDeclRules)) {
1239 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
1240 HideUsingShadowDecl(S, cast<UsingShadowDecl>(*I));
1244 if (!isa<FunctionTemplateDecl>(OldD) &&
1245 !shouldLinkPossiblyHiddenDecl(*I, New))
1254 if (!getASTContext().canBuiltinBeRedeclared(OldF)) {
1256 return Ovl_NonFunction;
1258 }
else if (isa<UsingDecl>(OldD) || isa<UsingPackDecl>(OldD)) {
1262 }
else if (isa<TagDecl>(OldD)) {
1264 }
else if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(OldD)) {
1271 if (UUD->getQualifier()->isDependent() && !UUD->isCXXClassMember()) {
1273 return Ovl_NonFunction;
1280 return Ovl_NonFunction;
1305 if (CheckFunctionTemplateSpecialization(New,
nullptr, TemplateSpecResult,
1308 return Ovl_Overload;
1315 return Ovl_Overload;
1320 bool UseMemberUsingDeclRules,
1321 bool ConsiderCudaAttrs,
1322 bool UseOverrideRules =
false) {
1339 if ((OldTemplate ==
nullptr) != (NewTemplate ==
nullptr))
1352 if (isa<FunctionNoProtoType>(OldQType.
getTypePtr()) ||
1353 isa<FunctionNoProtoType>(NewQType.
getTypePtr()))
1356 const auto *OldType = cast<FunctionProtoType>(OldQType);
1357 const auto *NewType = cast<FunctionProtoType>(NewQType);
1362 if (OldQType != NewQType && OldType->isVariadic() != NewType->isVariadic())
1377 OldDecl = OldTemplate;
1378 NewDecl = NewTemplate;
1396 bool ConstraintsInTemplateHead =
1407 if (UseMemberUsingDeclRules && ConstraintsInTemplateHead &&
1408 !SameTemplateParameterList)
1410 if (!UseMemberUsingDeclRules &&
1411 (!SameTemplateParameterList || !SameReturnType))
1415 const auto *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1416 const auto *NewMethod = dyn_cast<CXXMethodDecl>(New);
1418 int OldParamsOffset = 0;
1419 int NewParamsOffset = 0;
1437 !isa<CXXConstructorDecl>(NewMethod))
1443 auto BS =
Base.getNonReferenceType().getCanonicalType().split();
1444 BS.Quals = NormalizeQualifiers(OldMethod, BS.Quals);
1446 auto DS =
D.getNonReferenceType().getCanonicalType().split();
1447 DS.Quals = NormalizeQualifiers(NewMethod, DS.Quals);
1449 if (BS.Quals != DS.Quals)
1452 if (OldMethod->isImplicitObjectMemberFunction() &&
1453 OldMethod->getParent() != NewMethod->getParent()) {
1466 if (
Base->isLValueReferenceType())
1467 return D->isLValueReferenceType();
1468 return Base->isRValueReferenceType() ==
D->isRValueReferenceType();
1473 auto DiagnoseInconsistentRefQualifiers = [&]() {
1476 if (OldMethod->getRefQualifier() == NewMethod->getRefQualifier())
1478 if (OldMethod->isExplicitObjectMemberFunction() ||
1479 NewMethod->isExplicitObjectMemberFunction())
1481 if (!UseMemberUsingDeclRules && (OldMethod->getRefQualifier() ==
RQ_None ||
1482 NewMethod->getRefQualifier() ==
RQ_None)) {
1483 SemaRef.
Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
1484 << NewMethod->getRefQualifier() << OldMethod->getRefQualifier();
1485 SemaRef.
Diag(OldMethod->getLocation(), diag::note_previous_declaration);
1491 if (OldMethod && OldMethod->isExplicitObjectMemberFunction())
1493 if (NewMethod && NewMethod->isExplicitObjectMemberFunction())
1496 if (OldType->getNumParams() - OldParamsOffset !=
1497 NewType->getNumParams() - NewParamsOffset ||
1499 {OldType->param_type_begin() + OldParamsOffset,
1500 OldType->param_type_end()},
1501 {NewType->param_type_begin() + NewParamsOffset,
1502 NewType->param_type_end()},
1507 if (OldMethod && NewMethod && !OldMethod->isStatic() &&
1508 !NewMethod->isStatic()) {
1509 bool HaveCorrespondingObjectParameters = [&](
const CXXMethodDecl *Old,
1511 auto NewObjectType = New->getFunctionObjectParameterReferenceType();
1515 return F->getRefQualifier() ==
RQ_None &&
1516 !F->isExplicitObjectMemberFunction();
1519 if (IsImplicitWithNoRefQual(Old) != IsImplicitWithNoRefQual(New) &&
1520 CompareType(OldObjectType.getNonReferenceType(),
1521 NewObjectType.getNonReferenceType()))
1523 return CompareType(OldObjectType, NewObjectType);
1524 }(OldMethod, NewMethod);
1526 if (!HaveCorrespondingObjectParameters) {
1527 if (DiagnoseInconsistentRefQualifiers())
1532 if (!UseOverrideRules || (!NewMethod->isExplicitObjectMemberFunction() &&
1533 !OldMethod->isExplicitObjectMemberFunction()))
1538 if (!UseOverrideRules &&
1542 if ((NewRC !=
nullptr) != (OldRC !=
nullptr))
1549 if (NewMethod && OldMethod && OldMethod->isImplicitObjectMemberFunction() &&
1550 NewMethod->isImplicitObjectMemberFunction()) {
1551 if (DiagnoseInconsistentRefQualifiers())
1569 NewI != NewE || OldI != OldE; ++NewI, ++OldI) {
1570 if (NewI == NewE || OldI == OldE)
1572 llvm::FoldingSetNodeID NewID, OldID;
1574 OldI->getCond()->Profile(OldID, SemaRef.
Context,
true);
1579 if (SemaRef.
getLangOpts().CUDA && ConsiderCudaAttrs) {
1582 if (!isa<CXXDestructorDecl>(New)) {
1587 "Unexpected invalid target.");
1591 if (NewTarget != OldTarget)
1602 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1608 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1621 bool SuppressUserConversions,
1623 bool InOverloadResolution,
1625 bool AllowObjCWritebackConversion,
1626 bool AllowObjCConversionOnExplicit) {
1629 if (SuppressUserConversions) {
1640 Conversions, AllowExplicit,
1641 AllowObjCConversionOnExplicit)) {
1662 if (
const auto *InitList = dyn_cast<InitListExpr>(From);
1663 InitList && InitList->getNumInits() == 1 &&
1665 const Expr *SingleInit = InitList->getInit(0);
1666 FromType = SingleInit->
getType();
1676 if ((FromCanon == ToCanon ||
1687 if (ToCanon != FromCanon)
1698 Cand != Conversions.
end(); ++Cand)
1741 bool SuppressUserConversions,
1743 bool InOverloadResolution,
1745 bool AllowObjCWritebackConversion,
1746 bool AllowObjCConversionOnExplicit) {
1749 ICS.
Standard, CStyle, AllowObjCWritebackConversion)){
1789 AllowExplicit, InOverloadResolution, CStyle,
1790 AllowObjCWritebackConversion,
1791 AllowObjCConversionOnExplicit);
1796 bool SuppressUserConversions,
1798 bool InOverloadResolution,
1800 bool AllowObjCWritebackConversion) {
1801 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1802 AllowExplicit, InOverloadResolution, CStyle,
1803 AllowObjCWritebackConversion,
1809 bool AllowExplicit) {
1814 bool AllowObjCWritebackConversion
1815 = getLangOpts().ObjCAutoRefCount &&
1816 (Action == AA_Passing || Action == AA_Sending);
1817 if (getLangOpts().ObjC)
1821 *
this, From, ToType,
1823 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1825 false, AllowObjCWritebackConversion,
1827 return PerformImplicitConversion(From, ToType, ICS, Action);
1845 if (TyClass != CanFrom->getTypeClass())
return false;
1846 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1847 if (TyClass == Type::Pointer) {
1850 }
else if (TyClass == Type::BlockPointer) {
1853 }
else if (TyClass == Type::MemberPointer) {
1857 if (ToMPT->getClass() != FromMPT->
getClass())
1859 CanTo = ToMPT->getPointeeType();
1865 TyClass = CanTo->getTypeClass();
1866 if (TyClass != CanFrom->getTypeClass())
return false;
1867 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1871 const auto *FromFn = cast<FunctionType>(CanFrom);
1874 const auto *ToFn = cast<FunctionType>(CanTo);
1877 bool Changed =
false;
1886 if (
const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn)) {
1887 const auto *ToFPT = cast<FunctionProtoType>(ToFn);
1888 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
1889 FromFn = cast<FunctionType>(
1900 bool CanUseToFPT, CanUseFromFPT;
1902 CanUseFromFPT, NewParamInfos) &&
1903 CanUseToFPT && !CanUseFromFPT) {
1906 NewParamInfos.empty() ? nullptr : NewParamInfos.data();
1908 FromFPT->getParamTypes(), ExtInfo);
1918 FromFPT = cast<FunctionProtoType>(FromFn);
1922 const auto FromFX = FromFPT->getFunctionEffects();
1923 const auto ToFX = ToFPT->getFunctionEffects();
1924 if (FromFX != ToFX) {
1928 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
1938 assert(
QualType(FromFn, 0).isCanonical());
1939 if (
QualType(FromFn, 0) != CanTo)
return false;
1967 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
1968 &ToSem == &llvm::APFloat::IEEEquad()) ||
1969 (&FromSem == &llvm::APFloat::IEEEquad() &&
1970 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2025 bool InOverloadResolution,
bool CStyle) {
2040 unsigned FromElts = FromExtType->getNumElements();
2041 unsigned ToElts = ToExtType->getNumElements();
2042 if (FromElts < ToElts)
2044 if (FromElts == ToElts)
2049 QualType FromElTy = FromExtType->getElementType();
2050 QualType ToElTy = ToExtType->getElementType();
2064 QualType ToElTy = ToExtType->getElementType();
2098 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
2103 !InOverloadResolution && !CStyle) {
2105 << FromType << ToType;
2116 bool InOverloadResolution,
2129 bool InOverloadResolution,
2132 bool AllowObjCWritebackConversion) {
2158 FromType = Fn->getType();
2179 if (Method && !Method->
isStatic() &&
2182 "Non-unary operator on non-static member address");
2183 assert(cast<UnaryOperator>(From->
IgnoreParens())->getOpcode()
2185 "Non-address-of operator on non-static member address");
2186 const Type *ClassType
2190 assert(cast<UnaryOperator>(From->
IgnoreParens())->getOpcode() ==
2192 "Non-address-of operator for overloaded function expression");
2211 FromType =
Atomic->getValueType();
2259 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2279 bool IncompatibleObjC =
false;
2334 }
else if (AllowObjCWritebackConversion &&
2338 FromType, IncompatibleObjC)) {
2344 InOverloadResolution, FromType)) {
2348 From, InOverloadResolution, CStyle)) {
2358 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2394 bool ObjCLifetimeConversion;
2400 ObjCLifetimeConversion)) {
2419 CanonFrom = CanonTo;
2424 if (CanonFrom == CanonTo)
2429 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2473 bool InOverloadResolution,
2483 for (
const auto *it : UD->
fields()) {
2486 ToType = it->getType();
2512 return To->
getKind() == BuiltinType::Int;
2515 return To->
getKind() == BuiltinType::UInt;
2539 if (FromEnumType->getDecl()->isScoped())
2546 if (FromEnumType->getDecl()->isFixed()) {
2547 QualType Underlying = FromEnumType->getDecl()->getIntegerType();
2549 IsIntegralPromotion(
nullptr, Underlying, ToType);
2556 ToType, FromEnumType->getDecl()->getPromotionType());
2581 uint64_t FromSize = Context.
getTypeSize(FromType);
2590 for (
int Idx = 0; Idx < 6; ++Idx) {
2591 uint64_t ToSize = Context.
getTypeSize(PromoteTypes[Idx]);
2592 if (FromSize < ToSize ||
2593 (FromSize == ToSize &&
2594 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2619 std::optional<llvm::APSInt> BitWidth;
2622 MemberDecl->getBitWidth()->getIntegerConstantExpr(Context))) {
2623 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2627 if (*BitWidth < ToSize ||
2629 return To->
getKind() == BuiltinType::Int;
2635 return To->
getKind() == BuiltinType::UInt;
2663 if (FromBuiltin->getKind() == BuiltinType::Float &&
2664 ToBuiltin->getKind() == BuiltinType::Double)
2671 (FromBuiltin->getKind() == BuiltinType::Float ||
2672 FromBuiltin->getKind() == BuiltinType::Double) &&
2673 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2674 ToBuiltin->getKind() == BuiltinType::Float128 ||
2675 ToBuiltin->getKind() == BuiltinType::Ibm128))
2680 if (getLangOpts().
HLSL && FromBuiltin->getKind() == BuiltinType::Half &&
2681 (ToBuiltin->getKind() == BuiltinType::Float ||
2682 ToBuiltin->getKind() == BuiltinType::Double))
2686 if (!getLangOpts().NativeHalfType &&
2687 FromBuiltin->getKind() == BuiltinType::Half &&
2688 ToBuiltin->getKind() == BuiltinType::Float)
2720 bool StripObjCLifetime =
false) {
2723 "Invalid similarly-qualified pointer type");
2734 if (StripObjCLifetime)
2745 if (isa<ObjCObjectPointerType>(ToType))
2754 if (isa<ObjCObjectPointerType>(ToType))
2760 bool InOverloadResolution,
2766 return !InOverloadResolution;
2774 bool InOverloadResolution,
2776 bool &IncompatibleObjC) {
2777 IncompatibleObjC =
false;
2778 if (isObjCPointerConversion(FromType, ToType, ConvertedType,
2785 ConvertedType = ToType;
2792 ConvertedType = ToType;
2799 ConvertedType = ToType;
2807 ConvertedType = ToType;
2817 ConvertedType = ToType;
2825 !getLangOpts().ObjCAutoRefCount) {
2855 if (getLangOpts().MSVCCompat && FromPointeeType->
isFunctionType() &&
2889 IsDerivedFrom(From->
getBeginLoc(), FromPointeeType, ToPointeeType)) {
2923 bool &IncompatibleObjC) {
2924 if (!getLangOpts().
ObjC)
2936 if (ToObjCPtr && FromObjCPtr) {
2947 if (getLangOpts().CPlusPlus && LHS && RHS &&
2949 FromObjCPtr->getPointeeType()))
2954 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
2962 IncompatibleObjC =
true;
2966 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
2978 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
3006 isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
3007 IncompatibleObjC)) {
3009 IncompatibleObjC =
true;
3011 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
3018 isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
3019 IncompatibleObjC)) {
3022 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
3034 if (FromFunctionType && ToFunctionType) {
3043 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3044 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
3045 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
3048 bool HasObjCConversion =
false;
3052 }
else if (isObjCPointerConversion(FromFunctionType->
getReturnType(),
3053 ToFunctionType->getReturnType(),
3054 ConvertedType, IncompatibleObjC)) {
3056 HasObjCConversion =
true;
3063 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3064 ArgIdx != NumArgs; ++ArgIdx) {
3066 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3070 }
else if (isObjCPointerConversion(FromArgType, ToArgType,
3071 ConvertedType, IncompatibleObjC)) {
3073 HasObjCConversion =
true;
3080 if (HasObjCConversion) {
3084 IncompatibleObjC =
true;
3116 if (!FromFunctionType || !ToFunctionType)
3119 if (Context.
hasSameType(FromPointeeType, ToPointeeType))
3124 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3125 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3130 if (FromEInfo != ToEInfo)
3133 bool IncompatibleObjC =
false;
3135 ToFunctionType->getReturnType())) {
3139 QualType LHS = ToFunctionType->getReturnType();
3140 if ((!getLangOpts().CPlusPlus || !RHS->
isRecordType()) &&
3146 }
else if (isObjCPointerConversion(RHS, LHS,
3147 ConvertedType, IncompatibleObjC)) {
3148 if (IncompatibleObjC)
3157 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3158 ArgIdx != NumArgs; ++ArgIdx) {
3159 IncompatibleObjC =
false;
3161 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3162 if (Context.
hasSameType(FromArgType, ToArgType)) {
3164 }
else if (isObjCPointerConversion(ToArgType, FromArgType,
3165 ConvertedType, IncompatibleObjC)) {
3166 if (IncompatibleObjC)
3175 bool CanUseToFPT, CanUseFromFPT;
3177 CanUseToFPT, CanUseFromFPT,
3181 ConvertedType = ToType;
3219 if (!Context.
hasSameType(FromMember->getClass(), ToMember->getClass())) {
3221 <<
QualType(FromMember->getClass(), 0);
3254 if (!FromFunction || !ToFunction) {
3259 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3267 if (!FunctionParamTypesAreEqual(FromFunction, ToFunction, &ArgPos)) {
3269 << ToFunction->getParamType(ArgPos)
3276 ToFunction->getReturnType())) {
3282 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3292 cast<FunctionProtoType>(ToFunction->getCanonicalTypeUnqualified())
3305 assert(llvm::size(Old) == llvm::size(New) &&
3306 "Can't compare parameters of functions with different number of "
3309 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3311 size_t J =
Reversed ? (llvm::size(New) - Idx - 1) : Idx;
3332 return FunctionParamTypesAreEqual(OldType->
param_types(),
3345 unsigned OldIgnore =
3347 unsigned NewIgnore =
3350 auto *OldPT = cast<FunctionProtoType>(OldFunction->
getFunctionType());
3351 auto *NewPT = cast<FunctionProtoType>(NewFunction->
getFunctionType());
3353 return FunctionParamTypesAreEqual(OldPT->param_types().slice(OldIgnore),
3354 NewPT->param_types().slice(NewIgnore),
3361 bool IgnoreBaseAccess,
3364 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3368 if (Diagnose && !IsCStyleOrFunctionalCast && !FromType->
isAnyPointerType() &&
3372 DiagRuntimeBehavior(From->
getExprLoc(), From,
3373 PDiag(diag::warn_impcast_bool_to_null_pointer)
3375 else if (!isUnevaluatedContext())
3384 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3388 unsigned InaccessibleID = 0;
3389 unsigned AmbiguousID = 0;
3391 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3392 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3394 if (CheckDerivedToBaseConversion(
3395 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3397 &BasePath, IgnoreBaseAccess))
3401 Kind = CK_DerivedToBase;
3404 if (Diagnose && !IsCStyleOrFunctionalCast &&
3405 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3406 assert(getLangOpts().MSVCCompat &&
3407 "this should only be possible with MSVCCompat!");
3419 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3422 Kind = CK_BlockPointerToObjCPointerCast;
3424 Kind = CK_CPointerToObjCPointerCast;
3428 Kind = CK_AnyPointerToBlockPointerCast;
3434 Kind = CK_NullToPointer;
3441 bool InOverloadResolution,
3451 ConvertedType = ToType;
3466 IsDerivedFrom(From->
getBeginLoc(), ToClass, FromClass)) {
3478 bool IgnoreBaseAccess) {
3485 "Expr must be null pointer constant!");
3486 Kind = CK_NullToMemberPointer;
3491 assert(ToPtrType &&
"No member pointer cast has a target type "
3492 "that is not a member pointer.");
3498 assert(FromClass->
isRecordType() &&
"Pointer into non-class.");
3499 assert(ToClass->
isRecordType() &&
"Pointer into non-class.");
3503 bool DerivationOkay =
3504 IsDerivedFrom(From->
getBeginLoc(), ToClass, FromClass, Paths);
3505 assert(DerivationOkay &&
3506 "Should not have been called if derivation isn't OK.");
3507 (void)DerivationOkay;
3510 getUnqualifiedType())) {
3511 std::string PathDisplayStr = getAmbiguousPathsDisplayString(Paths);
3513 << 0 << FromClass << ToClass << PathDisplayStr << From->
getSourceRange();
3517 if (
const RecordType *VBase = Paths.getDetectedVirtual()) {
3519 << FromClass << ToClass <<
QualType(VBase, 0)
3524 if (!IgnoreBaseAccess)
3525 CheckBaseClassAccess(From->
getExprLoc(), FromClass, ToClass,
3527 diag::err_downcast_from_inaccessible_base);
3531 Kind = CK_BaseToDerivedMemberPointer;
3554 bool CStyle,
bool IsTopLevel,
3555 bool &PreviousToQualsIncludeConst,
3556 bool &ObjCLifetimeConversion) {
3568 ObjCLifetimeConversion =
true;
3604 !PreviousToQualsIncludeConst)
3622 PreviousToQualsIncludeConst =
3623 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3629 bool CStyle,
bool &ObjCLifetimeConversion) {
3632 ObjCLifetimeConversion =
false;
3642 bool PreviousToQualsIncludeConst =
true;
3643 bool UnwrappedAnyPointer =
false;
3646 FromType, ToType, CStyle, !UnwrappedAnyPointer,
3647 PreviousToQualsIncludeConst, ObjCLifetimeConversion))
3649 UnwrappedAnyPointer =
true;
3666 bool InOverloadResolution,
3675 InOverloadResolution, InnerSCS,
3692 if (CtorType->getNumParams() > 0) {
3693 QualType FirstArg = CtorType->getParamType(0);
3705 bool AllowExplicit) {
3712 bool Usable = !Info.Constructor->isInvalidDecl() &&
3715 bool SuppressUserConversions =
false;
3716 if (Info.ConstructorTmpl)
3719 CandidateSet, SuppressUserConversions,
3724 CandidateSet, SuppressUserConversions,
3725 false, AllowExplicit);
3729 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
3738 QualType ThisType = Constructor->getFunctionObjectParameterType();
3756 llvm_unreachable(
"Invalid OverloadResult!");
3778 bool AllowObjCConversionOnExplicit) {
3779 assert(AllowExplicit != AllowedExplicit::None ||
3780 !AllowObjCConversionOnExplicit);
3784 bool ConstructorsOnly =
false;
3800 ConstructorsOnly =
true;
3805 = dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
3807 Expr **Args = &From;
3808 unsigned NumArgs = 1;
3809 bool ListInitializing =
false;
3810 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
3813 S, From, ToType, ToRecordDecl, User, CandidateSet,
3814 AllowExplicit == AllowedExplicit::All);
3823 Args = InitList->getInits();
3824 NumArgs = InitList->getNumInits();
3825 ListInitializing =
true;
3833 bool Usable = !Info.Constructor->isInvalidDecl();
3834 if (!ListInitializing)
3835 Usable = Usable && Info.Constructor->isConvertingConstructor(
3838 bool SuppressUserConversions = !ConstructorsOnly;
3846 if (SuppressUserConversions && ListInitializing) {
3847 SuppressUserConversions =
3848 NumArgs == 1 && isa<InitListExpr>(Args[0]) &&
3852 if (Info.ConstructorTmpl)
3854 Info.ConstructorTmpl, Info.FoundDecl,
3856 CandidateSet, SuppressUserConversions,
3858 AllowExplicit == AllowedExplicit::All);
3864 SuppressUserConversions,
3866 AllowExplicit == AllowedExplicit::All);
3873 if (ConstructorsOnly || isa<InitListExpr>(From)) {
3876 }
else if (
const RecordType *FromRecordType =
3879 = dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
3881 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
3882 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
3886 if (isa<UsingShadowDecl>(
D))
3887 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
3891 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(
D)))
3894 Conv = cast<CXXConversionDecl>(
D);
3898 ConvTemplate, FoundDecl, ActingContext, From, ToType,
3899 CandidateSet, AllowObjCConversionOnExplicit,
3900 AllowExplicit != AllowedExplicit::None);
3903 CandidateSet, AllowObjCConversionOnExplicit,
3904 AllowExplicit != AllowedExplicit::None);
3909 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
3918 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
3925 if (isa<InitListExpr>(From)) {
3929 if (Best->Conversions[0].isEllipsis())
3932 User.
Before = Best->Conversions[0].Standard;
3945 = dyn_cast<CXXConversionDecl>(Best->Function)) {
3952 User.
Before = Best->Conversions[0].Standard;
3967 User.
After = Best->FinalConversion;
3970 llvm_unreachable(
"Not a constructor or conversion function?");
3979 llvm_unreachable(
"Invalid OverloadResult!");
3989 CandidateSet, AllowedExplicit::None,
false);
4003 if (!RequireCompleteType(From->
getBeginLoc(), ToType,
4004 diag::err_typecheck_nonviable_condition_incomplete,
4011 *
this, From, Cands);
4037 if (!Conv1 || !Conv2)
4052 if (Block1 != Block2)
4065 if (Conv1FuncRet && Conv2FuncRet &&
4076 CallOpProto->isVariadic(),
false);
4078 CallOpProto->isVariadic(),
true);
4080 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4175 if (!ICS1.
isBad()) {
4176 bool StdInit1 =
false, StdInit2 =
false;
4183 if (StdInit1 != StdInit2)
4194 CAT2->getElementType())) {
4196 if (CAT1->getSize() != CAT2->getSize())
4198 return CAT1->getSize().ult(CAT2->getSize())
4320 return FixedEnumPromotion::None;
4324 return FixedEnumPromotion::None;
4327 if (!
Enum->isFixed())
4328 return FixedEnumPromotion::None;
4332 return FixedEnumPromotion::ToUnderlyingType;
4334 return FixedEnumPromotion::ToPromotedUnderlyingType;
4363 else if (Rank2 < Rank1)
4386 if (FEP1 != FixedEnumPromotion::None && FEP2 != FixedEnumPromotion::None &&
4388 return FEP1 == FixedEnumPromotion::ToUnderlyingType
4398 bool SCS1ConvertsToVoid
4400 bool SCS2ConvertsToVoid
4402 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4407 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4413 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4442 if (FromObjCPtr1 && FromObjCPtr2) {
4447 if (AssignLeft != AssignRight) {
4482 if (UnqualT1 == UnqualT2) {
4494 if (isa<ArrayType>(T1) && T1Quals)
4496 if (isa<ArrayType>(T2) && T2Quals)
4544 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4545 return SCS1IsCompatibleVectorConversion
4552 bool SCS1IsCompatibleSVEVectorConversion =
4554 bool SCS2IsCompatibleSVEVectorConversion =
4557 if (SCS1IsCompatibleSVEVectorConversion !=
4558 SCS2IsCompatibleSVEVectorConversion)
4559 return SCS1IsCompatibleSVEVectorConversion
4566 bool SCS1IsCompatibleRVVVectorConversion =
4568 bool SCS2IsCompatibleRVVVectorConversion =
4571 if (SCS1IsCompatibleRVVVectorConversion !=
4572 SCS2IsCompatibleRVVVectorConversion)
4573 return SCS1IsCompatibleRVVVectorConversion
4613 if (UnqualT1 == UnqualT2)
4631 bool ObjCLifetimeConversion;
4641 if (CanPick1 != CanPick2)
4695 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
4703 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
4720 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
4727 bool FromAssignRight
4736 if (ToPtr1->isObjCIdType() &&
4737 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
4739 if (ToPtr2->isObjCIdType() &&
4740 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
4745 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
4747 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
4752 if (ToPtr1->isObjCClassType() &&
4753 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
4755 if (ToPtr2->isObjCClassType() &&
4756 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
4761 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
4763 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
4769 (ToAssignLeft != ToAssignRight)) {
4780 }
else if (IsSecondSame)
4789 (FromAssignLeft != FromAssignRight))
4803 const Type *FromPointeeType1 = FromMemPointer1->getClass();
4804 const Type *ToPointeeType1 = ToMemPointer1->
getClass();
4805 const Type *FromPointeeType2 = FromMemPointer2->
getClass();
4806 const Type *ToPointeeType2 = ToMemPointer2->
getClass();
4812 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
4819 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
4857 if (!
T.getQualifiers().hasUnaligned())
4871 "T1 must be the pointee type of the reference type");
4872 assert(!OrigT2->
isReferenceType() &&
"T2 cannot be a reference type");
4896 if (UnqualT1 == UnqualT2) {
4898 }
else if (isCompleteType(
Loc, OrigT2) &&
4899 IsDerivedFrom(
Loc, UnqualT2, UnqualT1))
4900 Conv |= ReferenceConversions::DerivedToBase;
4904 Conv |= ReferenceConversions::ObjC;
4906 IsFunctionConversion(UnqualT2, UnqualT1, ConvertedT2)) {
4907 Conv |= ReferenceConversions::Function;
4909 return Ref_Compatible;
4911 bool ConvertedReferent = Conv != 0;
4915 bool PreviousToQualsIncludeConst =
true;
4916 bool TopLevel =
true;
4922 Conv |= ReferenceConversions::Qualification;
4928 Conv |= ReferenceConversions::NestedQualification;
4936 bool ObjCLifetimeConversion =
false;
4938 PreviousToQualsIncludeConst,
4939 ObjCLifetimeConversion))
4945 if (ObjCLifetimeConversion)
4946 Conv |= ReferenceConversions::ObjCLifetime;
4965 bool AllowExplicit) {
4966 assert(T2->
isRecordType() &&
"Can only find conversions of record types.");
4971 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
4972 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
4975 if (isa<UsingShadowDecl>(
D))
4976 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
4979 = dyn_cast<FunctionTemplateDecl>(
D);
4984 Conv = cast<CXXConversionDecl>(
D);
4996 if (!ConvTemplate &&
5020 ConvTemplate, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5021 false, AllowExplicit);
5024 Conv, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5025 false, AllowExplicit);
5028 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5043 if (!Best->FinalConversion.DirectBinding)
5055 "Expected a direct reference binding!");
5061 Cand != CandidateSet.
end(); ++Cand)
5073 llvm_unreachable(
"Invalid OverloadResult!");
5081 bool SuppressUserConversions,
5082 bool AllowExplicit) {
5083 assert(DeclType->
isReferenceType() &&
"Reference init needs a reference");
5110 auto SetAsReferenceBinding = [&](
bool BindsDirectly) {
5115 ICS.
Standard.
Second = (RefConv & Sema::ReferenceConversions::DerivedToBase)
5117 : (RefConv & Sema::ReferenceConversions::ObjC)
5125 Sema::ReferenceConversions::NestedQualification)
5139 (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0;
5162 SetAsReferenceBinding(
true);
5211 SetAsReferenceBinding(S.
getLangOpts().CPlusPlus11 ||
5302 AllowedExplicit::None,
5327 if (isRValRef && LValRefType) {
5345 bool SuppressUserConversions,
5346 bool InOverloadResolution,
5347 bool AllowObjCWritebackConversion,
5348 bool AllowExplicit =
false);
5354 bool SuppressUserConversions,
5355 bool InOverloadResolution,
5356 bool AllowObjCWritebackConversion) {
5369 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT))
5371 InitTy = IAT->getElementType();
5397 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5403 SuppressUserConversions,
5404 InOverloadResolution,
5405 AllowObjCWritebackConversion);
5414 Result.Standard.setAsIdentityConversion();
5415 Result.Standard.setFromType(ToType);
5416 Result.Standard.setAllToTypes(ToType);
5441 bool IsUnbounded =
false;
5445 if (CT->getSize().ult(e)) {
5449 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5452 if (CT->getSize().ugt(e)) {
5458 S, &EmptyList, InitTy, SuppressUserConversions,
5459 InOverloadResolution, AllowObjCWritebackConversion);
5460 if (DfltElt.
isBad()) {
5464 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5469 assert(isa<IncompleteArrayType>(AT) &&
"Expected incomplete array");
5475 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5485 Result.Standard.setAsIdentityConversion();
5486 Result.Standard.setFromType(InitTy);
5487 Result.Standard.setAllToTypes(InitTy);
5488 for (
unsigned i = 0; i < e; ++i) {
5491 S,
Init, InitTy, SuppressUserConversions, InOverloadResolution,
5492 AllowObjCWritebackConversion);
5503 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5517 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5531 AllowedExplicit::None,
5532 InOverloadResolution,
false,
5533 AllowObjCWritebackConversion,
5552 Result.UserDefined.Before.setAsIdentityConversion();
5557 Result.UserDefined.After.setAsIdentityConversion();
5558 Result.UserDefined.After.setFromType(ToType);
5559 Result.UserDefined.After.setAllToTypes(ToType);
5560 Result.UserDefined.ConversionFunction =
nullptr;
5577 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5598 SuppressUserConversions,
5606 InOverloadResolution,
5607 AllowObjCWritebackConversion);
5610 assert(!
Result.isEllipsis() &&
5611 "Sub-initialization cannot result in ellipsis conversion.");
5617 Result.UserDefined.After;
5638 if (NumInits == 1 && !isa<InitListExpr>(From->
getInit(0)))
5640 SuppressUserConversions,
5641 InOverloadResolution,
5642 AllowObjCWritebackConversion);
5645 else if (NumInits == 0) {
5647 Result.Standard.setAsIdentityConversion();
5648 Result.Standard.setFromType(ToType);
5649 Result.Standard.setAllToTypes(ToType);
5668 bool SuppressUserConversions,
5669 bool InOverloadResolution,
5670 bool AllowObjCWritebackConversion,
5671 bool AllowExplicit) {
5672 if (
InitListExpr *FromInitList = dyn_cast<InitListExpr>(From))
5674 InOverloadResolution,AllowObjCWritebackConversion);
5679 SuppressUserConversions, AllowExplicit);
5682 SuppressUserConversions,
5683 AllowedExplicit::None,
5684 InOverloadResolution,
5686 AllowObjCWritebackConversion,
5699 return !ICS.
isBad();
5708 const CXXRecordDecl *ActingContext,
bool InOverloadResolution =
false,
5710 bool SuppressUserConversion =
false) {
5718 assert(FromClassification.
isLValue());
5730 if (ExplicitParameterType.isNull())
5733 ValueKindFromClassification(FromClassification));
5735 S, &TmpExpr, ExplicitParameterType, SuppressUserConversion,
5753 if (isa<CXXDestructorDecl>(Method) || Method->
isStatic()) {
5790 FromType, ImplicitParamType);
5799 FromType, ImplicitParamType);
5814 FromType, ImplicitParamType);
5834 if (!FromClassification.
isRValue()) {
5874 FromRecordType = From->
getType();
5875 DestType = ImplicitParamRecordType;
5876 FromClassification = From->
Classify(Context);
5880 From = CreateMaterializeTemporaryExpr(FromRecordType, From,
5899 << Method->
getDeclName() << FromRecordType << (CVR - 1)
5910 bool IsRValueQualified =
5914 << IsRValueQualified;
5926 llvm_unreachable(
"Lists are not objects");
5929 return Diag(From->
getBeginLoc(), diag::err_member_function_call_bad_type)
5930 << ImplicitParamRecordType << FromRecordType
5936 PerformObjectMemberConversion(From, Qualifier, FoundDecl, Method);
5939 From = FromRes.
get();
5948 CK = CK_AddressSpaceConversion;
5951 From = ImpCastExprToType(From, DestType, CK, From->
getValueKind()).get();
5973 AllowedExplicit::Conversions,
5986 return PerformImplicitConversion(From, Context.
BoolTy, ICS, AA_Converting);
5988 if (!DiagnoseMultipleUserDefinedConversion(From, Context.
BoolTy))
6053 llvm_unreachable(
"found a first conversion kind in Second");
6057 llvm_unreachable(
"found a third conversion kind in Second");
6063 llvm_unreachable(
"unknown conversion kind");
6075 "converted constant expression outside C++11");
6108 diag::err_typecheck_converted_constant_expression)
6114 llvm_unreachable(
"bad conversion in converted constant expression");
6120 diag::err_typecheck_converted_constant_expression_disallowed)
6126 diag::err_typecheck_converted_constant_expression_indirect)
6136 diag::err_reference_bind_to_bitfield_in_cce)
6146 "unexpected class type converted constant expr");
6149 T, cast<NonTypeTemplateParmDecl>(Dest)),
6166 bool ReturnPreNarrowingValue =
false;
6169 PreNarrowingType)) {
6182 PreNarrowingValue.
isInt()) {
6185 ReturnPreNarrowingValue =
true;
6197 << CCE << 0 << From->
getType() <<
T;
6200 if (!ReturnPreNarrowingValue)
6201 PreNarrowingValue = {};
6218 if (
Result.isInvalid() ||
Result.get()->isValueDependent()) {
6223 RequireInt, PreNarrowingValue);
6230 return ::BuildConvertedConstantExpression(*
this, From,
T, CCE, Dest,
6237 return ::CheckConvertedConstantExpression(*
this, From,
T,
Value, CCE,
false,
6242 llvm::APSInt &
Value,
6249 if (!R.isInvalid() && !R.get()->isValueDependent())
6257 const APValue &PreNarrowingValue) {
6267 Kind = ConstantExprKind::ClassTemplateArgument;
6269 Kind = ConstantExprKind::NonClassTemplateArgument;
6271 Kind = ConstantExprKind::Normal;
6274 (RequireInt && !Eval.
Val.
isInt())) {
6281 if (Notes.empty()) {
6284 if (
const auto *CE = dyn_cast<ConstantExpr>(
E)) {
6288 "ConstantExpr has no value associated with it");
6294 Value = std::move(PreNarrowingValue);
6300 if (Notes.size() == 1 &&
6301 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6302 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6303 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6304 diag::note_constexpr_invalid_template_arg) {
6305 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6306 for (
unsigned I = 0; I < Notes.size(); ++I)
6307 Diag(Notes[I].first, Notes[I].second);
6311 for (
unsigned I = 0; I < Notes.size(); ++I)
6312 Diag(Notes[I].first, Notes[I].second);
6339 AllowedExplicit::Conversions,
6373 return PerformImplicitConversion(From, Ty, ICS, AA_Converting);
6379 assert((isa<UnresolvedMemberExpr, MemberExpr>(MemExprE)) &&
6380 "expected a member expression");
6382 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6383 M && !M->isImplicitAccess())
6384 Base = M->getBase();
6385 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6386 M && !M->isImplicitAccess())
6387 Base = M->getBase();
6426 "Method is not an explicit member function");
6427 assert(NewArgs.empty() &&
"NewArgs should be empty");
6429 NewArgs.reserve(Args.size() + 1);
6431 NewArgs.push_back(This);
6432 NewArgs.append(Args.begin(), Args.end());
6435 Method, Object->getBeginLoc());
6454 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6456 cast<CXXConversionDecl>(ViableConversions[I]->getUnderlyingDecl());
6468 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6471 cast<CXXConversionDecl>(
Found->getUnderlyingDecl());
6476 std::string TypeStr;
6481 "static_cast<" + TypeStr +
">(")
6493 HadMultipleCandidates);
6500 From,
Result.get()->getType());
6513 cast<CXXConversionDecl>(
Found->getUnderlyingDecl());
6526 HadMultipleCandidates);
6531 CK_UserDefinedConversion,
Result.get(),
6532 nullptr,
Result.get()->getValueKind(),
6551 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6555 if (isa<UsingShadowDecl>(
D))
6556 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
6560 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(
D)))
6563 Conv = cast<CXXConversionDecl>(
D);
6567 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
6571 ToType, CandidateSet,
6603 ExprResult result = CheckPlaceholderExpr(From);
6606 From = result.
get();
6610 ExprResult Converted = DefaultLvalueConversion(From);
6621 if (!RecordTy || !getLangOpts().CPlusPlus) {
6633 : Converter(Converter), From(From) {}
6638 } IncompleteDiagnoser(Converter, From);
6641 : RequireCompleteType(
Loc,
T, IncompleteDiagnoser))
6648 const auto &Conversions =
6649 cast<CXXRecordDecl>(RecordTy->
getDecl())->getVisibleConversionFunctions();
6651 bool HadMultipleCandidates =
6652 (std::distance(Conversions.begin(), Conversions.end()) > 1);
6656 bool HasUniqueTargetType =
true;
6659 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
6669 Conversion = cast<CXXConversionDecl>(
D);
6671 assert((!ConvTemplate || getLangOpts().
CPlusPlus14) &&
6672 "Conversion operator templates are considered potentially "
6676 if (Converter.
match(CurToType) || ConvTemplate) {
6682 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
6687 else if (HasUniqueTargetType &&
6689 HasUniqueTargetType =
false;
6691 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
6709 HadMultipleCandidates,
6710 ExplicitConversions))
6716 if (!HasUniqueTargetType)
6735 HadMultipleCandidates,
Found))
6744 HadMultipleCandidates,
6745 ExplicitConversions))
6753 switch (ViableConversions.
size()) {
6756 HadMultipleCandidates,
6757 ExplicitConversions))
6767 HadMultipleCandidates,
Found))
6798 if (Proto->getNumParams() < 1)
6802 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
6807 if (Proto->getNumParams() < 2)
6811 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
6831 unsigned SeenAt = 0;
6833 bool HasDefault =
false;
6842 return HasDefault || SeenAt != 0;
6848 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
6853 assert(Proto &&
"Functions without a prototype cannot be overloaded");
6854 assert(!
Function->getDescribedFunctionTemplate() &&
6855 "Use AddTemplateOverloadCandidate for function templates");
6858 if (!isa<CXXConstructorDecl>(Method)) {
6868 CandidateSet, SuppressUserConversions,
6869 PartialOverloading, EarlyConversions, PO);
6883 if (Constructor && Constructor->isDefaulted() && Constructor->isDeleted() &&
6884 Constructor->isMoveConstructor())
6904 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
6917 Candidate.
Viable =
false;
6923 if (getLangOpts().CPlusPlusModules &&
Function->isInAnotherModuleUnit()) {
6930 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo())
6931 ND = SpecInfo->getTemplate();
6934 Candidate.
Viable =
false;
6941 Candidate.
Viable =
false;
6951 if (Args.size() == 1 && Constructor->isSpecializationCopyingObject() &&
6953 IsDerivedFrom(Args[0]->getBeginLoc(), Args[0]->getType(),
6955 Candidate.
Viable =
false;
6967 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.getDecl());
6968 if (Shadow && Args.size() == 1 && Constructor->getNumParams() >= 1 &&
6969 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
6970 QualType P = Constructor->getParamDecl(0)->getType()->getPointeeType();
6976 Candidate.
Viable =
false;
6985 Constructor->getMethodQualifiers().getAddressSpace(),
6987 Candidate.
Viable =
false;
7000 Candidate.
Viable =
false;
7010 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7011 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7012 !PartialOverloading) {
7014 Candidate.
Viable =
false;
7020 if (getLangOpts().
CUDA) {
7028 Candidate.
Viable =
false;
7034 if (
Function->getTrailingRequiresClause()) {
7036 if (CheckFunctionConstraints(
Function, Satisfaction, {},
7039 Candidate.
Viable =
false;
7047 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7050 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7053 }
else if (ArgIdx < NumParams) {
7060 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7063 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7065 Candidate.
Viable =
false;
7077 if (EnableIfAttr *FailedAttr =
7079 Candidate.
Viable =
false;
7089 if (Methods.size() <= 1)
7092 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7100 if (Args.size() < NumNamedArgs)
7103 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7105 if (Args[i]->isTypeDependent()) {
7111 Expr *argExpr = Args[i];
7112 assert(argExpr &&
"SelectBestMethod(): missing expression");
7117 !param->
hasAttr<CFConsumedAttr>())
7118 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7131 getLangOpts().ObjCAutoRefCount,
7135 if (ConversionState.
isBad() ||
7145 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7146 if (Args[i]->isTypeDependent()) {
7150 ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod,
7159 if (Args.size() != NumNamedArgs)
7161 else if (Match && NumNamedArgs == 0 && Methods.size() > 1) {
7164 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7165 QualType ReturnT = Methods[
b]->getReturnType();
7184 assert(!isa<CXXConstructorDecl>(Method) &&
7185 "Shouldn't have `this` for ctors!");
7186 assert(!Method->
isStatic() &&
"Shouldn't have `this` for static methods!");
7188 ThisArg,
nullptr, Method, Method);
7191 ConvertedThis = R.
get();
7193 if (
auto *MD = dyn_cast<CXXMethodDecl>(
Function)) {
7195 assert((MissingImplicitThis || MD->isStatic() ||
7196 isa<CXXConstructorDecl>(MD)) &&
7197 "Expected `this` for non-ctor instance methods");
7199 ConvertedThis =
nullptr;
7204 unsigned ArgSizeNoVarargs = std::min(
Function->param_size(), Args.size());
7207 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7216 ConvertedArgs.push_back(R.
get());
7224 for (
unsigned i = Args.size(), e =
Function->getNumParams(); i != e; ++i) {
7226 if (!
P->hasDefaultArg())
7231 ConvertedArgs.push_back(R.
get());
7243 bool MissingImplicitThis) {
7244 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7245 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7251 Expr *DiscardedThis;
7253 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7254 true, DiscardedThis, ConvertedArgs))
7255 return *EnableIfAttrs.begin();
7257 for (
auto *EIA : EnableIfAttrs) {
7261 if (EIA->getCond()->isValueDependent() ||
7262 !EIA->getCond()->EvaluateWithSubstitution(
7266 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7272template <
typename CheckFn>
7275 CheckFn &&IsSuccessful) {
7278 if (ArgDependent == DIA->getArgDependent())
7279 Attrs.push_back(DIA);
7286 auto WarningBegin = std::stable_partition(
7287 Attrs.begin(), Attrs.end(),
7288 [](
const DiagnoseIfAttr *DIA) { return DIA->isError(); });
7292 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7294 if (ErrAttr != WarningBegin) {
7295 const DiagnoseIfAttr *DIA = *ErrAttr;
7296 S.
Diag(
Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7297 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7298 << DIA->getParent() << DIA->getCond()->getSourceRange();
7302 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7303 if (IsSuccessful(DIA)) {
7304 S.
Diag(
Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7305 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7306 << DIA->getParent() << DIA->getCond()->getSourceRange();
7313 const Expr *ThisArg,
7318 [&](
const DiagnoseIfAttr *DIA) {
7323 if (!DIA->getCond()->EvaluateWithSubstitution(
7324 Result, Context, cast<FunctionDecl>(DIA->getParent()), Args, ThisArg))
7326 return Result.isInt() &&
Result.getInt().getBoolValue();
7333 *
this, ND,
false,
Loc,
7334 [&](
const DiagnoseIfAttr *DIA) {
7345 bool SuppressUserConversions,
7346 bool PartialOverloading,
7347 bool FirstArgumentIsBase) {
7349 NamedDecl *
D = F.getDecl()->getUnderlyingDecl();
7356 if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic()) {
7359 if (Args.size() > 0) {
7360 if (
Expr *
E = Args[0]) {
7368 ObjectClassification =
E->
Classify(Context);
7370 FunctionArgs = Args.slice(1);
7373 AddMethodTemplateCandidate(
7374 FunTmpl, F.getPair(),
7376 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7377 FunctionArgs, CandidateSet, SuppressUserConversions,
7378 PartialOverloading);
7380 AddMethodCandidate(cast<CXXMethodDecl>(FD), F.getPair(),
7381 cast<CXXMethodDecl>(FD)->getParent(), ObjectType,
7382 ObjectClassification, FunctionArgs, CandidateSet,
7383 SuppressUserConversions, PartialOverloading);
7390 if (Args.size() > 0 &&
7391 (!Args[0] || (FirstArgumentIsBase && isa<CXXMethodDecl>(FD) &&
7392 !isa<CXXConstructorDecl>(FD)))) {
7393 assert(cast<CXXMethodDecl>(FD)->isStatic());
7394 FunctionArgs = Args.slice(1);
7397 AddTemplateOverloadCandidate(FunTmpl, F.getPair(),
7398 ExplicitTemplateArgs, FunctionArgs,
7399 CandidateSet, SuppressUserConversions,
7400 PartialOverloading);
7402 AddOverloadCandidate(FD, F.getPair(), FunctionArgs, CandidateSet,
7403 SuppressUserConversions, PartialOverloading);
7413 bool SuppressUserConversions,
7418 if (isa<UsingShadowDecl>(
Decl))
7419 Decl = cast<UsingShadowDecl>(
Decl)->getTargetDecl();
7422 assert(isa<CXXMethodDecl>(TD->getTemplatedDecl()) &&
7423 "Expected a member function template");
7424 AddMethodTemplateCandidate(TD, FoundDecl, ActingContext,
7425 nullptr, ObjectType,
7426 ObjectClassification, Args, CandidateSet,
7427 SuppressUserConversions,
false, PO);
7429 AddMethodCandidate(cast<CXXMethodDecl>(
Decl), FoundDecl, ActingContext,
7430 ObjectType, ObjectClassification, Args, CandidateSet,
7431 SuppressUserConversions,
false, std::nullopt, PO);
7441 bool SuppressUserConversions,
7442 bool PartialOverloading,
7447 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7448 assert(!isa<CXXConstructorDecl>(Method) &&
7449 "Use AddOverloadCandidate for constructors");
7467 CandidateSet.
addCandidate(Args.size() + 1, EarlyConversions);
7476 bool IgnoreExplicitObject =
7480 bool ImplicitObjectMethodTreatedAsStatic =
7485 unsigned ExplicitOffset =
7488 unsigned NumParams = Method->
getNumParams() - ExplicitOffset +
7489 int(ImplicitObjectMethodTreatedAsStatic);
7497 Candidate.
Viable =
false;
7509 int(ImplicitObjectMethodTreatedAsStatic);
7511 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
7513 Candidate.
Viable =
false;
7533 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
7538 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
7539 Method, ActingContext,
true);
7540 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
7541 Candidate.
Viable =
false;
7548 if (getLangOpts().
CUDA)
7549 if (!
CUDA().IsAllowedCall(getCurFunctionDecl(
true),
7551 Candidate.
Viable =
false;
7558 if (CheckFunctionConstraints(Method, Satisfaction, {},
7561 Candidate.
Viable =
false;
7569 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7572 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7575 }
else if (ArgIdx < NumParams) {
7581 if (ImplicitObjectMethodTreatedAsStatic) {
7582 ParamType = ArgIdx == 0
7586 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
7590 SuppressUserConversions,
7593 getLangOpts().ObjCAutoRefCount);
7595 Candidate.
Viable =
false;
7607 if (EnableIfAttr *FailedAttr =
7608 CheckEnableIf(Method, CandidateSet.
getLocation(), Args,
true)) {
7609 Candidate.
Viable =
false;
7616 Candidate.
Viable =
false;
7645 PartialOverloading,
false, ObjectType,
7646 ObjectClassification,
7648 return CheckNonDependentConversions(
7649 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
7650 SuppressUserConversions, ActingContext, ObjectType,
7651 ObjectClassification, PO);
7655 CandidateSet.
addCandidate(Conversions.size(), Conversions);
7658 Candidate.
Viable =
false;
7663 cast<CXXMethodDecl>(Candidate.
Function)->isStatic() ||
7678 assert(
Specialization &&
"Missing member function template specialization?");
7680 "Specialization is not a member function?");
7681 AddMethodCandidate(cast<CXXMethodDecl>(
Specialization), FoundDecl,
7682 ActingContext, ObjectType, ObjectClassification, Args,
7683 CandidateSet, SuppressUserConversions, PartialOverloading,
7697 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
7709 Candidate.
Viable =
false;
7728 FunctionTemplate, ExplicitTemplateArgs, Args,
Specialization, Info,
7729 PartialOverloading, AggregateCandidateDeduction,
7733 return CheckNonDependentConversions(
7734 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
7735 SuppressUserConversions,
nullptr,
QualType(), {}, PO);
7739 CandidateSet.
addCandidate(Conversions.size(), Conversions);
7742 Candidate.
Viable =
false;
7750 isa<CXXMethodDecl>(Candidate.
Function) &&
7751 !isa<CXXConstructorDecl>(Candidate.
Function);
7765 assert(
Specialization &&
"Missing function template specialization?");
7766 AddOverloadCandidate(
7767 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
7768 PartialOverloading, AllowExplicit,
7769 false, IsADLCandidate, Conversions, PO,
7782 const bool AllowExplicit =
false;
7785 auto *Method = dyn_cast<CXXMethodDecl>(FD);
7786 bool HasThisConversion = Method && !isa<CXXConstructorDecl>(Method);
7787 unsigned ThisConversions = HasThisConversion ? 1 : 0;
7799 if (HasThisConversion && !cast<CXXMethodDecl>(FD)->isStatic() &&
7802 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
7803 !ParamTypes[0]->isDependentType()) {
7805 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
7806 Method, ActingContext,
true,
7807 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
7809 if (Conversions[ConvIdx].isBad())
7817 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
7819 QualType ParamType = ParamTypes[I + Offset];
7823 ConvIdx = Args.size() - 1 - I;
7824 assert(Args.size() + ThisConversions == 2 &&
7825 "number of args (including 'this') must be exactly 2 for "
7829 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
7832 ConvIdx = ThisConversions + I;
7834 Conversions[ConvIdx]
7836 SuppressUserConversions,
7839 getLangOpts().ObjCAutoRefCount,
7841 if (Conversions[ConvIdx].isBad())
7863 bool AllowObjCPointerConversion) {
7871 bool ObjCLifetimeConversion;
7873 ObjCLifetimeConversion))
7878 if (!AllowObjCPointerConversion)
7882 bool IncompatibleObjC =
false;
7892 bool AllowExplicit,
bool AllowResultConversion) {
7894 "Conversion function templates use AddTemplateConversionCandidate");
7902 if (DeduceReturnType(Conversion, From->
getExprLoc()))
7909 if (!AllowResultConversion &&
7921 AllowObjCConversionOnExplicit))
7941 if (!AllowExplicit && Conversion->
isExplicit()) {
7942 Candidate.
Viable =
false;
7957 const auto *ConversionContext =
7966 From->
Classify(Context), Conversion, ConversionContext,
7971 Candidate.
Viable =
false;
7978 if (CheckFunctionConstraints(Conversion, Satisfaction) ||
7980 Candidate.
Viable =
false;
7992 if (FromCanon == ToCanon ||
7993 IsDerivedFrom(CandidateSet.
getLocation(), FromCanon, ToCanon)) {
7994 Candidate.
Viable =
false;
8011 CK_FunctionToPointerDecay, &ConversionRef,
8015 if (!isCompleteType(From->
getBeginLoc(), ConversionType)) {
8016 Candidate.
Viable =
false;
8030 Buffer, &ConversionFn, CallResultType, VK, From->
getBeginLoc());
8048 Candidate.
Viable =
false;
8060 Candidate.
Viable =
false;
8067 Candidate.
Viable =
false;
8073 "Can only end up with a standard conversion sequence or failure");
8076 if (EnableIfAttr *FailedAttr =
8077 CheckEnableIf(Conversion, CandidateSet.
getLocation(), std::nullopt)) {
8078 Candidate.
Viable =
false;
8085 Candidate.
Viable =
false;
8094 bool AllowExplicit,
bool AllowResultConversion) {
8096 "Only conversion function templates permitted here");
8108 Candidate.
Viable =
false;
8119 FunctionTemplate, ObjectType, ObjectClassification, ToType,
8125 Candidate.
Viable =
false;
8135 assert(
Specialization &&
"Missing function template specialization?");
8136 AddConversionCandidate(
Specialization, FoundDecl, ActingDC, From, ToType,
8137 CandidateSet, AllowObjCConversionOnExplicit,
8138 AllowExplicit, AllowResultConversion);
8173 *
this, CandidateSet.
getLocation(), Object->getType(),
8174 Object->Classify(Context), Conversion, ActingContext);
8177 if (ObjectInit.
isBad()) {
8178 Candidate.
Viable =
false;
8189 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8190 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8191 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8192 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8195 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8203 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8204 Candidate.
Viable =
false;
8211 if (Args.size() < NumParams) {
8213 Candidate.
Viable =
false;
8220 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8221 if (ArgIdx < NumParams) {
8232 getLangOpts().ObjCAutoRefCount);
8234 Candidate.
Viable =
false;
8248 if (CheckFunctionConstraints(Conversion, Satisfaction, {},
8251 Candidate.
Viable =
false;
8257 if (EnableIfAttr *FailedAttr =
8258 CheckEnableIf(Conversion, CandidateSet.
getLocation(), std::nullopt)) {
8259 Candidate.
Viable =
false;
8271 NamedDecl *
D = F.getDecl()->getUnderlyingDecl();
8282 assert(!isa<CXXMethodDecl>(FD) &&
8283 "unqualified operator lookup found a member function");
8286 AddTemplateOverloadCandidate(FunTmpl, F.getPair(), ExplicitTemplateArgs,
8287 FunctionArgs, CandidateSet);
8289 AddTemplateOverloadCandidate(
8290 FunTmpl, F.getPair(), ExplicitTemplateArgs,
8291 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
false,
false,
8294 if (ExplicitTemplateArgs)
8296 AddOverloadCandidate(FD, F.getPair(), FunctionArgs, CandidateSet);
8298 AddOverloadCandidate(
8299 FD, F.getPair(), {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
8300 false,
false,
true,
false, ADLCallKind::NotADL, std::nullopt,
8329 if (!isCompleteType(OpLoc, T1) && !T1Rec->isBeingDefined())
8332 if (!T1Rec->getDecl()->getDefinition())
8335 LookupResult Operators(*
this, OpName, OpLoc, LookupOrdinaryName);
8336 LookupQualifiedName(Operators, T1Rec->getDecl());
8340 OperEnd = Operators.
end();
8341 Oper != OperEnd; ++Oper) {
8342 if (Oper->getAsFunction() &&
8345 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
8347 AddMethodCandidate(Oper.getPair(), Args[0]->getType(),
8348 Args[0]->Classify(Context), Args.slice(1),
8349 CandidateSet,
false, PO);
8356 bool IsAssignmentOperator,
8357 unsigned NumContextualBoolArguments) {
8372 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8385 if (ArgIdx < NumContextualBoolArguments) {
8386 assert(ParamTys[ArgIdx] == Context.
BoolTy &&
8387 "Contextual conversion to bool requires bool type");
8393 ArgIdx == 0 && IsAssignmentOperator,
8396 getLangOpts().ObjCAutoRefCount);
8399 Candidate.
Viable =
false;
8412class BuiltinCandidateTypeSet {
8418 TypeSet PointerTypes;
8422 TypeSet MemberPointerTypes;
8426 TypeSet EnumerationTypes;
8430 TypeSet VectorTypes;
8434 TypeSet MatrixTypes;
8437 TypeSet BitIntTypes;
8440 bool HasNonRecordTypes;
8444 bool HasArithmeticOrEnumeralTypes;
8448 bool HasNullPtrType;
8457 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
8459 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
8463 typedef TypeSet::iterator iterator;
8465 BuiltinCandidateTypeSet(
Sema &SemaRef)
8466 : HasNonRecordTypes(
false),
8467 HasArithmeticOrEnumeralTypes(
false),
8468 HasNullPtrType(
false),
8470 Context(SemaRef.Context) { }
8472 void AddTypesConvertedFrom(
QualType Ty,
8474 bool AllowUserConversions,
8475 bool AllowExplicitConversions,
8476 const Qualifiers &VisibleTypeConversionsQuals);
8478 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
8479 llvm::iterator_range<iterator> member_pointer_types() {
8480 return MemberPointerTypes;
8482 llvm::iterator_range<iterator> enumeration_types() {
8483 return EnumerationTypes;
8485 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
8486 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
8487 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
8489 bool containsMatrixType(
QualType Ty)
const {
return MatrixTypes.count(Ty); }
8490 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
8491 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
8492 bool hasNullPtrType()
const {
return HasNullPtrType; }
8507BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
8511 if (!PointerTypes.insert(Ty))
8516 bool buildObjCPtr =
false;
8520 buildObjCPtr =
true;
8532 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
8538 if ((CVR | BaseCVR) != CVR)
continue;
8560 PointerTypes.insert(QPointerTy);
8576BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
8579 if (!MemberPointerTypes.insert(Ty))
8583 assert(PointerTy &&
"type was not a member pointer type!");
8598 if ((CVR | BaseCVR) != CVR)
continue;
8601 MemberPointerTypes.insert(
8617BuiltinCandidateTypeSet::AddTypesConvertedFrom(
QualType Ty,
8619 bool AllowUserConversions,
8620 bool AllowExplicitConversions,
8632 Ty = SemaRef.Context.getArrayDecayedType(Ty);
8639 HasNonRecordTypes = HasNonRecordTypes || !TyRec;
8642 HasArithmeticOrEnumeralTypes =
8646 PointerTypes.insert(Ty);
8650 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
8654 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
8657 HasArithmeticOrEnumeralTypes =
true;
8658 EnumerationTypes.insert(Ty);
8660 HasArithmeticOrEnumeralTypes =
true;
8661 BitIntTypes.insert(Ty);
8665 HasArithmeticOrEnumeralTypes =
true;
8666 VectorTypes.insert(Ty);
8670 HasArithmeticOrEnumeralTypes =
true;
8671 MatrixTypes.insert(Ty);
8673 HasNullPtrType =
true;
8674 }
else if (AllowUserConversions && TyRec) {
8676 if (!SemaRef.isCompleteType(Loc, Ty))
8681 if (isa<UsingShadowDecl>(
D))
8682 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
8686 if (isa<FunctionTemplateDecl>(
D))
8690 if (AllowExplicitConversions || !Conv->
isExplicit()) {
8753 if (isa<UsingShadowDecl>(
D))
8754 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
8788 if (Available.hasAtomic()) {
8789 Available.removeAtomic();
8796 if (Available.hasVolatile()) {
8797 Available.removeVolatile();
8831class BuiltinOperatorOverloadBuilder {
8836 bool HasArithmeticOrEnumeralCandidateType;
8840 static constexpr int ArithmeticTypesCap = 26;
8846 unsigned FirstIntegralType,
8848 unsigned FirstPromotedIntegralType,
8849 LastPromotedIntegralType;
8850 unsigned FirstPromotedArithmeticType,
8851 LastPromotedArithmeticType;
8852 unsigned NumArithmeticTypes;
8854 void InitArithmeticTypes() {
8856 FirstPromotedArithmeticType = 0;
8866 FirstIntegralType = ArithmeticTypes.size();
8867 FirstPromotedIntegralType = ArithmeticTypes.size();
8890 llvm::for_each(CandidateTypes, [&BitIntCandidates](
8891 BuiltinCandidateTypeSet &Candidate) {
8892 for (
QualType BitTy : Candidate.bitint_types())
8895 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
8896 LastPromotedIntegralType = ArithmeticTypes.size();
8897 LastPromotedArithmeticType = ArithmeticTypes.size();
8911 LastIntegralType = ArithmeticTypes.size();
8912 NumArithmeticTypes = ArithmeticTypes.size();
8919 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
8920 ArithmeticTypesCap &&
8921 "Enough inline storage for all arithmetic types.");
8926 void addPlusPlusMinusMinusStyleOverloads(
QualType CandidateTy,
8975 BuiltinOperatorOverloadBuilder(
8978 bool HasArithmeticOrEnumeralCandidateType,
8982 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
8983 HasArithmeticOrEnumeralCandidateType(
8984 HasArithmeticOrEnumeralCandidateType),
8985 CandidateTypes(CandidateTypes),
8986 CandidateSet(CandidateSet) {
8988 InitArithmeticTypes();
9011 if (!HasArithmeticOrEnumeralCandidateType)
9014 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9015 const auto TypeOfT = ArithmeticTypes[Arith];
9017 if (Op == OO_MinusMinus)
9019 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9022 addPlusPlusMinusMinusStyleOverloads(
9039 void addPlusPlusMinusMinusPointerOverloads() {
9040 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9042 if (!PtrTy->getPointeeType()->isObjectType())
9045 addPlusPlusMinusMinusStyleOverloads(
9047 (!PtrTy.isVolatileQualified() &&
9049 (!PtrTy.isRestrictQualified() &&
9064 void addUnaryStarPointerOverloads() {
9065 for (
QualType ParamTy : CandidateTypes[0].pointer_types()) {
9071 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9084 void addUnaryPlusOrMinusArithmeticOverloads() {
9085 if (!HasArithmeticOrEnumeralCandidateType)
9088 for (
unsigned Arith = FirstPromotedArithmeticType;
9089 Arith < LastPromotedArithmeticType; ++Arith) {
9090 QualType ArithTy = ArithmeticTypes[Arith];
9095 for (
QualType VecTy : CandidateTypes[0].vector_types())
9104 void addUnaryPlusPointerOverloads() {
9105 for (
QualType ParamTy : CandidateTypes[0].pointer_types())
9114 void addUnaryTildePromotedIntegralOverloads() {
9115 if (!HasArithmeticOrEnumeralCandidateType)
9118 for (
unsigned Int = FirstPromotedIntegralType;
9119 Int < LastPromotedIntegralType; ++
Int) {
9125 for (
QualType VecTy : CandidateTypes[0].vector_types())
9135 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9139 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9140 for (
QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9145 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9149 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9151 if (AddedTypes.insert(NullPtrTy).second) {
9152 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9171 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9184 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9185 UserDefinedBinaryOperators;
9187 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9188 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9190 CEnd = CandidateSet.
end();
9192 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9195 if (
C->Function->isFunctionTemplateSpecialization())
9204 .getUnqualifiedType();
9207 .getUnqualifiedType();
9215 UserDefinedBinaryOperators.insert(
9225 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9226 for (
QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9230 if (IsSpaceship && PtrTy->isFunctionPointerType())
9233 QualType ParamTypes[2] = {PtrTy, PtrTy};
9236 for (
QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9241 if (!AddedTypes.insert(CanonType).second ||
9242 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9245 QualType ParamTypes[2] = {EnumTy, EnumTy};
9272 for (
int Arg = 0; Arg < 2; ++Arg) {
9273 QualType AsymmetricParamTypes[2] = {
9277 for (
QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9282 AsymmetricParamTypes[Arg] = PtrTy;
9283 if (Arg == 0 || Op == OO_Plus) {
9288 if (Op == OO_Minus) {
9293 QualType ParamTypes[2] = {PtrTy, PtrTy};
9329 void addGenericBinaryArithmeticOverloads() {
9330 if (!HasArithmeticOrEnumeralCandidateType)
9333 for (
unsigned Left = FirstPromotedArithmeticType;
9334 Left < LastPromotedArithmeticType; ++
Left) {
9335 for (
unsigned Right = FirstPromotedArithmeticType;
9336 Right < LastPromotedArithmeticType; ++
Right) {
9338 ArithmeticTypes[
Right] };
9345 for (
QualType Vec1Ty : CandidateTypes[0].vector_types())
9346 for (
QualType Vec2Ty : CandidateTypes[1].vector_types()) {
9347 QualType LandR[2] = {Vec1Ty, Vec2Ty};
9357 void addMatrixBinaryArithmeticOverloads() {
9358 if (!HasArithmeticOrEnumeralCandidateType)
9361 for (
QualType M1 : CandidateTypes[0].matrix_types()) {
9362 AddCandidate(M1, cast<MatrixType>(M1)->getElementType());
9363 AddCandidate(M1, M1);
9366 for (
QualType M2 : CandidateTypes[1].matrix_types()) {
9367 AddCandidate(cast<MatrixType>(M2)->getElementType(), M2);
9368 if (!CandidateTypes[0].containsMatrixType(M2))
9369 AddCandidate(M2, M2);
9404 void addThreeWayArithmeticOverloads() {
9405 addGenericBinaryArithmeticOverloads();
9422 void addBinaryBitwiseArithmeticOverloads() {
9423 if (!HasArithmeticOrEnumeralCandidateType)
9426 for (
unsigned Left = FirstPromotedIntegralType;
9427 Left < LastPromotedIntegralType; ++
Left) {
9428 for (
unsigned Right = FirstPromotedIntegralType;
9431 ArithmeticTypes[
Right] };
9444 void addAssignmentMemberPointerOrEnumeralOverloads() {
9448 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
9449 for (
QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9456 for (
QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9481 void addAssignmentPointerOverloads(
bool isEqualOp) {
9485 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9489 else if (!PtrTy->getPointeeType()->isObjectType())
9500 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
9510 if (!PtrTy.isRestrictQualified() &&
9530 for (
QualType PtrTy : CandidateTypes[1].pointer_types()) {
9544 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
9554 if (!PtrTy.isRestrictQualified() &&
9587 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
9588 if (!HasArithmeticOrEnumeralCandidateType)
9591 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
9592 for (
unsigned Right = FirstPromotedArithmeticType;
9593 Right < LastPromotedArithmeticType; ++
Right) {
9595 ParamTypes[1] = ArithmeticTypes[
Right];
9597 S, ArithmeticTypes[Left], Args[0]);
9610 for (
QualType Vec1Ty : CandidateTypes[0].vector_types())
9611 for (
QualType Vec2Ty : CandidateTypes[0].vector_types()) {
9613 ParamTypes[1] = Vec2Ty;
9641 void addAssignmentIntegralOverloads() {
9642 if (!HasArithmeticOrEnumeralCandidateType)
9645 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
9646 for (
unsigned Right = FirstPromotedIntegralType;
9649 ParamTypes[1] = ArithmeticTypes[
Right];
9651 S, ArithmeticTypes[Left], Args[0]);
9670 void addExclaimOverload() {
9676 void addAmpAmpOrPipePipeOverload() {
9693 void addSubscriptOverloads() {
9694 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9704 for (
QualType PtrTy : CandidateTypes[1].pointer_types()) {
9724 void addArrowStarOverloads() {
9725 for (
QualType PtrTy : CandidateTypes[0].pointer_types()) {
9730 if (!isa<RecordType>(C1))
9739 for (
QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
9745 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
9749 T.isVolatileQualified())
9752 T.isRestrictQualified())
9770 void addConditionalOperatorOverloads() {
9774 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
9775 for (
QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9779 QualType ParamTypes[2] = {PtrTy, PtrTy};
9783 for (
QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9787 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9792 for (
QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9799 QualType ParamTypes[2] = {EnumTy, EnumTy};
9818 VisibleTypeConversionsQuals.
addConst();
9819 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9821 if (Args[ArgIdx]->getType()->isAtomicType())
9822 VisibleTypeConversionsQuals.
addAtomic();
9825 bool HasNonRecordCandidateType =
false;
9826 bool HasArithmeticOrEnumeralCandidateType =
false;
9828 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9829 CandidateTypes.emplace_back(*
this);
9830 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->getType(),
9833 (Op == OO_Exclaim ||
9836 VisibleTypeConversionsQuals);
9837 HasNonRecordCandidateType = HasNonRecordCandidateType ||
9838 CandidateTypes[ArgIdx].hasNonRecordTypes();
9839 HasArithmeticOrEnumeralCandidateType =
9840 HasArithmeticOrEnumeralCandidateType ||
9841 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
9849 if (!HasNonRecordCandidateType &&
9850 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
9854 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
9855 VisibleTypeConversionsQuals,
9856 HasArithmeticOrEnumeralCandidateType,
9857 CandidateTypes, CandidateSet);
9863 llvm_unreachable(
"Expected an overloaded operator");
9868 case OO_Array_Delete:
9871 "Special operators don't use AddBuiltinOperatorCandidates");
9883 if (Args.size() == 1)
9884 OpBuilder.addUnaryPlusPointerOverloads();
9888 if (Args.size() == 1) {
9889 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
9891 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
9892 OpBuilder.addGenericBinaryArithmeticOverloads();
9893 OpBuilder.addMatrixBinaryArithmeticOverloads();
9898 if (Args.size() == 1)
9899 OpBuilder.addUnaryStarPointerOverloads();
9901 OpBuilder.addGenericBinaryArithmeticOverloads();
9902 OpBuilder.addMatrixBinaryArithmeticOverloads();
9907 OpBuilder.addGenericBinaryArithmeticOverloads();
9912 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
9913 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
9917 case OO_ExclaimEqual:
9918 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
9919 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
9920 OpBuilder.addGenericBinaryArithmeticOverloads();
9926 case OO_GreaterEqual:
9927 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
9928 OpBuilder.addGenericBinaryArithmeticOverloads();
9932 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
9933 OpBuilder.addThreeWayArithmeticOverloads();
9940 case OO_GreaterGreater:
9941 OpBuilder.addBinaryBitwiseArithmeticOverloads();
9945 if (Args.size() == 1)
9951 OpBuilder.addBinaryBitwiseArithmeticOverloads();
9955 OpBuilder.addUnaryTildePromotedIntegralOverloads();
9959 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
9964 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
9969 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
9972 case OO_PercentEqual:
9973 case OO_LessLessEqual:
9974 case OO_GreaterGreaterEqual:
9978 OpBuilder.addAssignmentIntegralOverloads();
9982 OpBuilder.addExclaimOverload();
9987 OpBuilder.addAmpAmpOrPipePipeOverload();
9991 if (Args.size() == 2)
9992 OpBuilder.addSubscriptOverloads();
9996 OpBuilder.addArrowStarOverloads();
9999 case OO_Conditional:
10000 OpBuilder.addConditionalOperatorOverloads();
10001 OpBuilder.addGenericBinaryArithmeticOverloads();
10012 bool PartialOverloading) {
10023 ArgumentDependentLookup(Name,
Loc, Args, Fns);
10027 CandEnd = CandidateSet.
end();
10028 Cand != CandEnd; ++Cand)
10029 if (Cand->Function) {
10033 Fns.
erase(FunTmpl);
10042 if (ExplicitTemplateArgs)
10045 AddOverloadCandidate(
10046 FD, FoundDecl, Args, CandidateSet,
false,
10047 PartialOverloading,
true,
10048 false, ADLCallKind::UsesADL);
10050 AddOverloadCandidate(
10051 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10052 false, PartialOverloading,
10054 ADLCallKind::UsesADL, std::nullopt,
10058 auto *FTD = cast<FunctionTemplateDecl>(*I);
10059 AddTemplateOverloadCandidate(
10060 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10061 false, PartialOverloading,
10062 true, ADLCallKind::UsesADL);
10064 *
this, Args, FTD->getTemplatedDecl())) {
10065 AddTemplateOverloadCandidate(
10066 FTD, FoundDecl, ExplicitTemplateArgs, {Args[1], Args[0]},
10067 CandidateSet,
false, PartialOverloading,
10068 true, ADLCallKind::UsesADL,
10076enum class Comparison {
Equal, Better, Worse };
10093 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10094 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10095 if (!Cand1Attr || !Cand2Attr) {
10096 if (Cand1Attr == Cand2Attr)
10097 return Comparison::Equal;
10098 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10104 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10105 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10106 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10107 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10112 return Comparison::Worse;
10114 return Comparison::Better;
10119 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10120 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10121 if (Cand1ID != Cand2ID)
10122 return Comparison::Worse;
10125 return Comparison::Equal;
10133 return Comparison::Equal;
10139 return Comparison::Equal;
10140 return Comparison::Worse;
10143 return Comparison::Better;
10149 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10150 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10152 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10153 return Comparison::Equal;
10155 if (Cand1CPUDisp && !Cand2CPUDisp)
10156 return Comparison::Better;
10157 if (Cand2CPUDisp && !Cand1CPUDisp)
10158 return Comparison::Worse;
10160 if (Cand1CPUSpec && Cand2CPUSpec) {
10161 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10162 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10163 ? Comparison::Better
10164 : Comparison::Worse;
10166 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10167 FirstDiff = std::mismatch(
10168 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10169 Cand2CPUSpec->cpus_begin(),
10171 return LHS->getName() == RHS->getName();
10174 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10175 "Two different cpu-specific versions should not have the same "
10176 "identifier list, otherwise they'd be the same decl!");
10177 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->
getName()
10178 ? Comparison::Better
10179 : Comparison::Worse;
10181 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10187static std::optional<QualType>
10189 if (!isa<CXXMethodDecl>(F) || isa<CXXConstructorDecl>(F))
10190 return std::nullopt;
10192 auto *M = cast<CXXMethodDecl>(F);
10196 return M->getFunctionObjectParameterReferenceType();
10210 PT2->getInstantiatedFromMemberTemplate()))
10221 assert(I < F->getNumParams());
10225 unsigned F1NumParams = F1->
getNumParams() + isa<CXXMethodDecl>(F1);
10226 unsigned F2NumParams = F2->
getNumParams() + isa<CXXMethodDecl>(F2);
10228 if (F1NumParams != F2NumParams)
10231 unsigned I1 = 0, I2 = 0;
10232 for (
unsigned I = 0; I != F1NumParams; ++I) {
10233 QualType T1 = NextParam(F1, I1, I == 0);
10234 QualType T2 = NextParam(F2, I2, I == 0);
10235 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10263 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10264 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10265 if (Mem1 && Mem2) {
10268 if (Mem1->getParent() != Mem2->getParent())
10272 if (Mem1->isInstance() && Mem2->isInstance() &&
10274 Mem1->getFunctionObjectParameterReferenceType(),
10275 Mem1->getFunctionObjectParameterReferenceType()))
10331 bool IsCand1ImplicitHD =
10333 bool IsCand2ImplicitHD =
10348 auto EmitThreshold =
10349 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
10350 (IsCand1ImplicitHD || IsCand2ImplicitHD))
10353 auto Cand1Emittable = P1 > EmitThreshold;
10354 auto Cand2Emittable = P2 > EmitThreshold;
10355 if (Cand1Emittable && !Cand2Emittable)
10357 if (!Cand1Emittable && Cand2Emittable)
10368 unsigned StartArg = 0;
10375 return ICS.isStandard() &&
10387 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
10388 bool HasBetterConversion =
false;
10389 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
10390 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
10391 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
10392 if (Cand1Bad != Cand2Bad) {
10395 HasBetterConversion =
true;
10399 if (HasBetterConversion)
10406 bool HasWorseConversion =
false;
10407 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
10413 HasBetterConversion =
true;
10432 HasWorseConversion =
true;
10447 if (HasBetterConversion && !HasWorseConversion)
10458 isa<CXXConversionDecl>(Cand1.
Function) &&
10459 isa<CXXConversionDecl>(Cand2.
Function)) {
10487 isa<CXXConstructorDecl>(Cand1.
Function) !=
10488 isa<CXXConstructorDecl>(Cand2.
Function))
10489 return isa<CXXConstructorDecl>(Cand1.
Function);
10493 bool Cand1IsSpecialization = Cand1.
Function &&
10495 bool Cand2IsSpecialization = Cand2.
Function &&
10497 if (Cand1IsSpecialization != Cand2IsSpecialization)
10498 return Cand2IsSpecialization;
10504 if (Cand1IsSpecialization && Cand2IsSpecialization) {
10505 const auto *Obj1Context =
10507 const auto *Obj2Context =
10515 Obj1Context ?
QualType(Obj1Context->getTypeForDecl(), 0)
10517 Obj2Context ?
QualType(Obj2Context->getTypeForDecl(), 0)
10526 if (!Cand1IsSpecialization && !Cand2IsSpecialization &&
10536 bool Cand1IsInherited =
10538 bool Cand2IsInherited =
10540 if (Cand1IsInherited != Cand2IsInherited)
10541 return Cand2IsInherited;
10542 else if (Cand1IsInherited) {
10543 assert(Cand2IsInherited);
10546 if (Cand1Class->isDerivedFrom(Cand2Class))
10548 if (Cand2Class->isDerivedFrom(Cand1Class))
10565 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
10566 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
10567 if (Guide1 && Guide2) {
10569 if (Guide1->isImplicit() != Guide2->isImplicit())
10570 return Guide2->isImplicit();
10580 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
10581 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
10582 if (Constructor1 && Constructor2) {
10583 bool isC1Templated = Constructor1->getTemplatedKind() !=
10585 bool isC2Templated = Constructor2->getTemplatedKind() !=
10587 if (isC1Templated != isC2Templated)
10588 return isC2Templated;
10596 if (Cmp != Comparison::Equal)
10597 return Cmp == Comparison::Better;
10600 bool HasPS1 = Cand1.
Function !=
nullptr &&
10602 bool HasPS2 = Cand2.
Function !=
nullptr &&
10604 if (HasPS1 != HasPS2 && HasPS1)
10608 if (MV == Comparison::Better)
10610 if (MV == Comparison::Worse)
10625 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
10626 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
10628 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
10629 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
10650 auto *VA = dyn_cast_or_null<ValueDecl>(A);
10651 auto *VB = dyn_cast_or_null<ValueDecl>(B);
10657 if (!VA->getDeclContext()->getRedeclContext()->Equals(
10658 VB->getDeclContext()->getRedeclContext()) ||
10659 getOwningModule(VA) == getOwningModule(VB) ||
10660 VA->isExternallyVisible() || VB->isExternallyVisible())
10668 if (Context.
hasSameType(VA->getType(), VB->getType()))
10673 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
10674 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
10677 auto *EnumA = cast<EnumDecl>(EA->getDeclContext());
10678 auto *EnumB = cast<EnumDecl>(EB->getDeclContext());
10679 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
10681 EnumB->getIntegerType()))
10684 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
10694 assert(
D &&
"Unknown declaration");
10695 Diag(
Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) <<
D;
10697 Module *M = getOwningModule(
D);
10701 for (
auto *
E : Equiv) {
10702 Module *M = getOwningModule(
E);
10703 Diag(
E->getLocation(), diag::note_equivalent_internal_linkage_decl)
10712 static_cast<CNSInfo *
>(DeductionFailure.Data)
10713 ->Satisfaction.ContainsErrors;
10730 std::transform(
begin(),
end(), std::back_inserter(Candidates),
10746 bool ContainsSameSideCandidate =
10750 S.
CUDA().IdentifyPreference(Caller, Cand->
Function) ==
10753 if (ContainsSameSideCandidate) {
10760 llvm::erase_if(Candidates, IsWrongSideCandidate);
10766 for (
auto *Cand : Candidates) {
10767 Cand->
Best =
false;
10769 if (Best ==
end() ||
10789 PendingBest.push_back(&*Best);
10794 while (!PendingBest.empty()) {
10795 auto *Curr = PendingBest.pop_back_val();
10796 for (
auto *Cand : Candidates) {
10799 PendingBest.push_back(Cand);
10804 EquivalentCands.push_back(Cand->
Function);
10816 if (Best->Function && Best->Function->isDeleted())
10819 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
10821 M->isImplicitObjectMemberFunction()) {
10825 if (!EquivalentCands.empty())
10834enum OverloadCandidateKind {
10837 oc_reversed_binary_operator,
10839 oc_implicit_default_constructor,
10840 oc_implicit_copy_constructor,
10841 oc_implicit_move_constructor,
10842 oc_implicit_copy_assignment,
10843 oc_implicit_move_assignment,
10844 oc_implicit_equality_comparison,
10845 oc_inherited_constructor
10848enum OverloadCandidateSelect {
10851 ocs_described_template,
10854static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
10858 std::string &Description) {
10864 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
10867 OverloadCandidateSelect Select = [&]() {
10868 if (!Description.empty())
10869 return ocs_described_template;
10870 return isTemplate ? ocs_template : ocs_non_template;
10873 OverloadCandidateKind Kind = [&]() {
10874 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
10875 return oc_implicit_equality_comparison;
10878 return oc_reversed_binary_operator;
10880 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
10881 if (!Ctor->isImplicit()) {
10882 if (isa<ConstructorUsingShadowDecl>(
Found))
10883 return oc_inherited_constructor;
10885 return oc_constructor;
10888 if (Ctor->isDefaultConstructor())
10889 return oc_implicit_default_constructor;
10891 if (Ctor->isMoveConstructor())
10892 return oc_implicit_move_constructor;
10894 assert(Ctor->isCopyConstructor() &&
10895 "unexpected sort of implicit constructor");
10896 return oc_implicit_copy_constructor;
10899 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
10902 if (!Meth->isImplicit())
10905 if (Meth->isMoveAssignmentOperator())
10906 return oc_implicit_move_assignment;
10908 if (Meth->isCopyAssignmentOperator())
10909 return oc_implicit_copy_assignment;
10911 assert(isa<CXXConversionDecl>(Meth) &&
"expected conversion");
10915 return oc_function;
10918 return std::make_pair(Kind, Select);
10921void MaybeEmitInheritedConstructorNote(
Sema &S,
const Decl *FoundDecl) {
10924 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
10926 diag::note_ovl_candidate_inherited_constructor)
10927 << Shadow->getNominatedBaseClass();
10936 if (EnableIf->getCond()->isValueDependent() ||
10937 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
10954 bool InOverloadResolution,
10958 if (InOverloadResolution)
10960 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
10962 S.
Diag(
Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
10973 if (InOverloadResolution) {
10976 TemplateArgString +=
" ";
10978 FunTmpl->getTemplateParameters(),
10983 diag::note_ovl_candidate_unsatisfied_constraints)
10984 << TemplateArgString;
10986 S.
Diag(
Loc, diag::err_addrof_function_constraints_not_satisfied)
10995 return P->hasAttr<PassObjectSizeAttr>();
11002 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11003 if (InOverloadResolution)
11005 diag::note_ovl_candidate_has_pass_object_size_params)
11008 S.
Diag(
Loc, diag::err_address_of_function_with_pass_object_size_params)
11024 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11032 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11036 const auto *RD = cast<CXXRecordDecl>(Fn->getParent());
11037 if (!RD->isLambda())
11047 return ConvToCC != CallOpCC;
11053 QualType DestType,
bool TakingAddress) {
11056 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11057 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11059 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11060 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11065 std::string FnDesc;
11066 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11067 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11069 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11072 HandleFunctionTypeMismatch(PD, Fn->getType(), DestType);
11073 Diag(Fn->getLocation(), PD);
11074 MaybeEmitInheritedConstructorNote(*
this,
Found);
11092 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11093 for (
auto I = Cands.begin(),
E = Cands.end(); I !=
E; ++I) {
11097 if (
auto *Template = I->Function->getPrimaryTemplate())
11098 Template->getAssociatedConstraints(AC);
11100 I->Function->getAssociatedConstraints(AC);
11103 if (FirstCand ==
nullptr) {
11104 FirstCand = I->Function;
11106 }
else if (SecondCand ==
nullptr) {
11107 SecondCand = I->Function;
11120 SecondCand, SecondAC))
11129 bool TakingAddress) {
11139 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
11140 NoteOverloadCandidate(*I, FunTmpl->getTemplatedDecl(),
CRK_None, DestType,
11143 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
11144 NoteOverloadCandidate(*I, Fun,
CRK_None, DestType, TakingAddress);
11156 S.
Diag(CaretLoc, PDiag)
11157 << Ambiguous.getFromType() << Ambiguous.getToType();
11158 unsigned CandsShown = 0;
11160 for (I = Ambiguous.begin(),
E = Ambiguous.end(); I !=
E; ++I) {
11172 unsigned I,
bool TakingCandidateAddress) {
11174 assert(Conv.
isBad());
11175 assert(Cand->
Function &&
"for now, candidate must be a function");
11181 bool isObjectArgument =
false;
11182 if (isa<CXXMethodDecl>(Fn) && !isa<CXXConstructorDecl>(Fn)) {
11184 isObjectArgument =
true;
11185 else if (!Fn->hasCXXExplicitFunctionObjectParameter())
11189 std::string FnDesc;
11190 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11201 bool HasParamPack =
11202 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
11203 return Parm->isParameterPack();
11205 if (!isObjectArgument && !HasParamPack)
11206 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
11209 assert(FromExpr &&
"overload set argument came from implicit argument?");
11211 if (isa<UnaryOperator>(
E))
11215 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
11216 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11217 << ToParamRange << ToTy << Name << I + 1;
11218 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11227 CToTy = RT->getPointeeType();
11232 CFromTy = FromPT->getPointeeType();
11233 CToTy = ToPT->getPointeeType();
11243 if (isObjectArgument)
11244 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
11245 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11248 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
11249 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11252 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11257 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
11258 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11261 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11266 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
11267 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11270 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11275 assert(CVR &&
"expected qualifiers mismatch");
11277 if (isObjectArgument) {
11278 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
11279 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11280 << FromTy << (CVR - 1);
11282 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
11283 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11284 << ToParamRange << FromTy << (CVR - 1) << I + 1;
11286 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11292 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
11293 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11294 << (
unsigned)isObjectArgument << I + 1
11297 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11303 if (FromExpr && isa<InitListExpr>(FromExpr)) {
11304 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
11305 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11306 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11311 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11323 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
11324 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11325 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11326 << (
unsigned)(Cand->
Fix.
Kind);
11328 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11333 unsigned BaseToDerivedConversion = 0;
11336 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
11337 FromPtrTy->getPointeeType()) &&
11338 !FromPtrTy->getPointeeType()->isIncompleteType() &&
11339 !ToPtrTy->getPointeeType()->isIncompleteType() &&
11341 FromPtrTy->getPointeeType()))
11342 BaseToDerivedConversion = 1;
11350 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
11351 FromPtrTy->getPointeeType()) &&
11352 FromIface->isSuperClassOf(ToIface))
11353 BaseToDerivedConversion = 2;
11355 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy) &&
11357 !ToRefTy->getPointeeType()->isIncompleteType() &&
11359 BaseToDerivedConversion = 3;
11363 if (BaseToDerivedConversion) {
11364 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
11365 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11366 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
11368 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11372 if (isa<ObjCObjectPointerType>(CFromTy) &&
11373 isa<PointerType>(CToTy)) {
11377 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
11378 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11379 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
11381 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11391 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11392 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
11393 << (
unsigned)(Cand->
Fix.
Kind);
11402 S.
Diag(Fn->getLocation(), FDiag);
11404 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11411 unsigned NumArgs,
bool IsAddressOf =
false) {
11412 assert(Cand->
Function &&
"Candidate is required to be a function.");
11414 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
11415 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
11422 if (Fn->isInvalidDecl() &&
11426 if (NumArgs < MinParams) {
11443 unsigned NumFormalArgs,
11444 bool IsAddressOf =
false) {
11445 assert(isa<FunctionDecl>(
D) &&
11446 "The templated declaration should at least be a function"
11447 " when diagnosing bad template argument deduction due to too many"
11448 " or too few arguments");
11454 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
11455 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
11458 bool HasExplicitObjectParam =
11459 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
11461 unsigned ParamCount =
11462 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
11463 unsigned mode, modeCount;
11465 if (NumFormalArgs < MinParams) {
11466 if (MinParams != ParamCount || FnTy->isVariadic() ||
11467 FnTy->isTemplateVariadic())
11471 modeCount = MinParams;
11473 if (MinParams != ParamCount)
11477 modeCount = ParamCount;
11480 std::string Description;
11481 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11482 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
11484 if (modeCount == 1 && !IsAddressOf &&
11485 Fn->getParamDecl(HasExplicitObjectParam ? 1 : 0)->getDeclName())
11486 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
11487 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11488 << Description << mode
11489 << Fn->getParamDecl(HasExplicitObjectParam ? 1 : 0) << NumFormalArgs
11490 << HasExplicitObjectParam << Fn->getParametersSourceRange();
11492 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
11493 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11494 << Description << mode << modeCount << NumFormalArgs
11495 << HasExplicitObjectParam << Fn->getParametersSourceRange();
11497 MaybeEmitInheritedConstructorNote(S,
Found);
11502 unsigned NumFormalArgs) {
11503 assert(Cand->
Function &&
"Candidate must be a function");
11513 llvm_unreachable(
"Unsupported: Getting the described template declaration"
11514 " for bad deduction diagnosis");
11521 bool TakingCandidateAddress) {
11527 switch (DeductionFailure.
getResult()) {
11530 "TemplateDeductionResult::Success while diagnosing bad deduction");
11532 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
11533 "while diagnosing bad deduction");
11539 assert(ParamD &&
"no parameter found for incomplete deduction result");
11541 diag::note_ovl_candidate_incomplete_deduction)
11543 MaybeEmitInheritedConstructorNote(S,
Found);
11548 assert(ParamD &&
"no parameter found for incomplete deduction result");
11550 diag::note_ovl_candidate_incomplete_deduction_pack)
11554 MaybeEmitInheritedConstructorNote(S,
Found);
11559 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
11577 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
11578 << ParamD->
getDeclName() << Arg << NonCanonParam;
11579 MaybeEmitInheritedConstructorNote(S,
Found);
11584 assert(ParamD &&
"no parameter found for inconsistent deduction result");
11586 if (isa<TemplateTypeParmDecl>(ParamD))
11588 else if (isa<NonTypeTemplateParmDecl>(ParamD)) {
11598 diag::note_ovl_candidate_inconsistent_deduction_types)
11601 MaybeEmitInheritedConstructorNote(S,
Found);
11621 diag::note_ovl_candidate_inconsistent_deduction)
11624 MaybeEmitInheritedConstructorNote(S,
Found);
11629 assert(ParamD &&
"no parameter found for invalid explicit arguments");
11632 diag::note_ovl_candidate_explicit_arg_mismatch_named)
11637 index = TTP->getIndex();
11639 = dyn_cast<NonTypeTemplateParmDecl>(ParamD))
11640 index = NTTP->getIndex();
11642 index = cast<TemplateTemplateParmDecl>(ParamD)->getIndex();
11644 diag::note_ovl_candidate_explicit_arg_mismatch_unnamed)
11647 MaybeEmitInheritedConstructorNote(S,
Found);
11654 TemplateArgString =
" ";
11657 if (TemplateArgString.size() == 1)
11658 TemplateArgString.clear();
11660 diag::note_ovl_candidate_unsatisfied_constraints)
11661 << TemplateArgString;
11664 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
11674 diag::note_ovl_candidate_instantiation_depth);
11675 MaybeEmitInheritedConstructorNote(S,
Found);
11683 TemplateArgString =
" ";
11686 if (TemplateArgString.size() == 1)
11687 TemplateArgString.clear();
11692 if (PDiag && PDiag->second.getDiagID() ==
11693 diag::err_typename_nested_not_found_enable_if) {
11696 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
11697 <<
"'enable_if'" << TemplateArgString;
11702 if (PDiag && PDiag->second.getDiagID() ==
11703 diag::err_typename_nested_not_found_requirement) {
11705 diag::note_ovl_candidate_disabled_by_requirement)
11706 << PDiag->second.getStringArg(0) << TemplateArgString;
11716 SFINAEArgString =
": ";
11718 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
11722 diag::note_ovl_candidate_substitution_failure)
11723 << TemplateArgString << SFINAEArgString << R;
11724 MaybeEmitInheritedConstructorNote(S,
Found);
11734 TemplateArgString =
" ";
11737 if (TemplateArgString.size() == 1)
11738 TemplateArgString.clear();
11741 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
11744 << TemplateArgString
11769 diag::note_ovl_candidate_non_deduced_mismatch_qualified)
11776 if (TakingCandidateAddress && isa<FunctionDecl>(Templated) &&
11785 diag::note_ovl_candidate_non_deduced_mismatch)
11786 << FirstTA << SecondTA;
11792 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
11793 MaybeEmitInheritedConstructorNote(S,
Found);
11797 diag::note_cuda_ovl_candidate_target_mismatch);
11805 bool TakingCandidateAddress) {
11806 assert(Cand->
Function &&
"Candidate must be a function");
11821 assert(Cand->
Function &&
"Candidate must be a Function.");
11827 std::string FnDesc;
11828 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11829 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
11832 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
11833 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
11835 << llvm::to_underlying(CalleeTarget) << llvm::to_underlying(CallerTarget);
11840 if (Meth !=
nullptr && Meth->
isImplicit()) {
11844 switch (FnKindPair.first) {
11847 case oc_implicit_default_constructor:
11850 case oc_implicit_copy_constructor:
11853 case oc_implicit_move_constructor:
11856 case oc_implicit_copy_assignment:
11859 case oc_implicit_move_assignment:
11864 bool ConstRHS =
false;
11868 ConstRHS = RT->getPointeeType().isConstQualified();
11879 assert(Cand->
Function &&
"Candidate must be a function");
11883 S.
Diag(Callee->getLocation(),
11884 diag::note_ovl_candidate_disabled_by_function_cond_attr)
11885 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
11889 assert(Cand->
Function &&
"Candidate must be a function");
11892 assert(ES.
isExplicit() &&
"not an explicit candidate");
11895 switch (Fn->getDeclKind()) {
11896 case Decl::Kind::CXXConstructor:
11899 case Decl::Kind::CXXConversion:
11902 case Decl::Kind::CXXDeductionGuide:
11903 Kind = Fn->isImplicit() ? 0 : 2;
11906 llvm_unreachable(
"invalid Decl");
11915 First = Pattern->getFirstDecl();
11918 diag::note_ovl_candidate_explicit)
11919 << Kind << (ES.
getExpr() ? 1 : 0)
11924 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
11931 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
11933 std::string FunctionProto;
11934 llvm::raw_string_ostream OS(FunctionProto);
11947 "Non-template implicit deduction guides are only possible for "
11950 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
11955 assert(Template &&
"Cannot find the associated function template of "
11956 "CXXDeductionGuideDecl?");
11958 Template->
print(OS);
11959 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
11980 bool TakingCandidateAddress,
11982 assert(Cand->
Function &&
"Candidate must be a function");
11990 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
11997 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12002 if (Fn->isDeleted()) {
12003 std::string FnDesc;
12004 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12005 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12008 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12009 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12010 << (Fn->isDeleted() ? (Fn->isDeletedAsWritten() ? 1 : 2) : 0);
12011 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12038 TakingCandidateAddress);
12041 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12042 << (Fn->getPrimaryTemplate() ? 1 : 0);
12043 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12050 S.
Diag(Fn->getLocation(),
12051 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12052 << QualsForPrinting;
12053 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12064 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
12085 if (cast<CXXConstructorDecl>(Fn)->isCopyOrMoveConstructor())
12087 S.
Diag(Fn->getLocation(),
12088 diag::note_ovl_candidate_inherited_constructor_slice)
12089 << (Fn->getPrimaryTemplate() ? 1 : 0)
12090 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
12091 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12097 assert(!Available);
12105 std::string FnDesc;
12106 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12107 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12110 S.
Diag(Fn->getLocation(),
12111 diag::note_ovl_candidate_constraints_not_satisfied)
12112 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12130 bool isLValueReference =
false;
12131 bool isRValueReference =
false;
12132 bool isPointer =
false;
12136 isLValueReference =
true;
12140 isRValueReference =
true;
12156 diag::note_ovl_surrogate_constraints_not_satisfied)
12170 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
12171 std::string TypeStr(
"operator");
12177 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
12182 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
12189 if (ICS.
isBad())
break;
12193 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
12210 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
12240 llvm_unreachable(
"Unhandled deduction result");
12245struct CompareOverloadCandidatesForDisplay {
12251 CompareOverloadCandidatesForDisplay(
12254 : S(S), NumArgs(NArgs), CSK(CSK) {}
12264 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
12266 if (NumArgs < C->
Function->getMinRequiredArguments())
12276 if (L == R)
return false;
12280 if (!R->
Viable)
return true;
12282 if (
int Ord = CompareConversions(*L, *R))
12302 if (LDist == RDist) {
12303 if (LFailureKind == RFailureKind)
12311 return LDist < RDist;
12329 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
12330 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
12331 if (numLFixes != numRFixes) {
12332 return numLFixes < numRFixes;
12336 if (
int Ord = CompareConversions(*L, *R))
12348 if (LRank != RRank)
12349 return LRank < RRank;
12375 struct ConversionSignals {
12376 unsigned KindRank = 0;
12380 ConversionSignals Sig;
12381 Sig.KindRank =
Seq.getKindRank();
12382 if (
Seq.isStandard())
12383 Sig.Rank =
Seq.Standard.getRank();
12384 else if (
Seq.isUserDefined())
12385 Sig.Rank =
Seq.UserDefined.After.getRank();
12391 static ConversionSignals ForObjectArgument() {
12407 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
12409 ? ConversionSignals::ForObjectArgument()
12410 : ConversionSignals::ForSequence(L.Conversions[I]);
12412 ? ConversionSignals::ForObjectArgument()
12413 : ConversionSignals::ForSequence(R.Conversions[I]);
12414 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
12415 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
12440 bool Unfixable =
false;
12448 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
12449 if (Cand->
Conversions[ConvIdx].isInitialized() &&
12458 bool SuppressUserConversions =
false;
12460 unsigned ConvIdx = 0;
12461 unsigned ArgIdx = 0;
12476 if (isa<CXXMethodDecl>(Cand->
Function) &&
12489 assert(ConvCount <= 3);
12495 ConvIdx != ConvCount;
12497 assert(ArgIdx < Args.size() &&
"no argument for this arg conversion");
12498 if (Cand->
Conversions[ConvIdx].isInitialized()) {
12500 }
else if (
ParamIdx < ParamTypes.size()) {
12501 if (ParamTypes[
ParamIdx]->isDependentType())
12502 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
12503 Args[ArgIdx]->getType());
12507 SuppressUserConversions,
12512 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
12528 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
12529 if (!Filter(*Cand))
12533 if (!Cand->Viable) {
12534 if (!Cand->Function && !Cand->IsSurrogate) {
12554 Cands.push_back(Cand);
12558 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
12565 bool DeferHint =
false;
12569 auto WrongSidedCands =
12571 return (Cand.Viable ==
false &&
12574 Cand.Function->template hasAttr<CUDAHostAttr>() &&
12575 Cand.Function->template hasAttr<CUDADeviceAttr>());
12577 DeferHint = !WrongSidedCands.empty();
12595 bool NoteCands =
true;
12596 for (
const Expr *Arg : Args) {
12597 if (Arg->getType()->isWebAssemblyTableType())
12611 bool ReportedAmbiguousConversions =
false;
12614 unsigned CandsShown = 0;
12615 auto I = Cands.begin(),
E = Cands.end();
12616 for (; I !=
E; ++I) {
12632 "Non-viable built-in candidates are not added to Cands.");
12639 if (!ReportedAmbiguousConversions) {
12641 ReportedAmbiguousConversions =
true;
12654 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates,
12666struct CompareTemplateSpecCandidatesForDisplay {
12668 CompareTemplateSpecCandidatesForDisplay(
Sema &S) : S(S) {}
12702 bool ForTakingAddress) {
12704 DeductionFailure, 0, ForTakingAddress);
12707void TemplateSpecCandidateSet::destroyCandidates() {
12709 i->DeductionFailure.Destroy();
12714 destroyCandidates();
12715 Candidates.clear();
12728 Cands.reserve(
size());
12729 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
12730 if (Cand->Specialization)
12731 Cands.push_back(Cand);
12736 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
12743 unsigned CandsShown = 0;
12744 for (I = Cands.begin(),
E = Cands.end(); I !=
E; ++I) {
12750 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
12755 "Non-matching built-in candidates are not added to Cands.");
12760 S.
Diag(
Loc, diag::note_ovl_too_many_candidates) <<
int(
E - I);
12770 QualType Ret = PossiblyAFunctionType;
12773 Ret = ToTypePtr->getPointeeType();
12776 Ret = ToTypeRef->getPointeeType();
12779 Ret = MemTypePtr->getPointeeType();
12786 bool Complain =
true) {
12803class AddressOfFunctionResolver {
12813 bool TargetTypeIsNonStaticMemberFunction;
12814 bool FoundNonTemplateFunction;
12815 bool StaticMemberFunctionFromBoundPointer;
12816 bool HasComplained;
12825 AddressOfFunctionResolver(
Sema &S,
Expr *SourceExpr,
12826 const QualType &TargetType,
bool Complain)
12827 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
12828 Complain(Complain), Context(S.getASTContext()),
12829 TargetTypeIsNonStaticMemberFunction(
12831 FoundNonTemplateFunction(
false),
12832 StaticMemberFunctionFromBoundPointer(
false),
12833 HasComplained(
false),
12836 FailedCandidates(OvlExpr->getNameLoc(),
true) {
12837 ExtractUnqualifiedFunctionTypeFromTargetType();
12841 if (!UME->isImplicitAccess() &&
12843 StaticMemberFunctionFromBoundPointer =
true;
12847 OvlExpr,
false, &dap)) {
12853 TargetTypeIsNonStaticMemberFunction =
true;
12861 Matches.push_back(std::make_pair(dap, Fn));
12869 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
12872 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
12873 if (FoundNonTemplateFunction)
12874 EliminateAllTemplateMatches();
12876 EliminateAllExceptMostSpecializedTemplate();
12881 EliminateSuboptimalCudaMatches();
12884 bool hasComplained()
const {
return HasComplained; }
12887 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
12899 return candidateHasExactlyCorrectType(A) &&
12900 (!candidateHasExactlyCorrectType(B) ||
12906 bool eliminiateSuboptimalOverloadCandidates() {
12909 auto Best = Matches.begin();
12910 for (
auto I = Matches.begin()+1,
E = Matches.end(); I !=
E; ++I)
12911 if (isBetterCandidate(I->second, Best->second))
12915 auto IsBestOrInferiorToBest = [
this, BestFn](
12916 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
12917 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
12922 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
12924 Matches[0] = *Best;
12929 bool isTargetTypeAFunction()
const {
12938 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
12949 bool CanConvertToFunctionPointer =
12951 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
12954 else if (TargetTypeIsNonStaticMemberFunction)
12966 FunctionTemplate, &OvlExplicitTemplateArgs, TargetFunctionType,
12968 Result != TemplateDeductionResult::Success) {
12986 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
12990 bool AddMatchingNonTemplateFunction(
NamedDecl* Fn,
12995 bool CanConvertToFunctionPointer =
12997 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13000 else if (TargetTypeIsNonStaticMemberFunction)
13003 if (
FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13010 if (FunDecl->isMultiVersion()) {
13011 const auto *TA = FunDecl->
getAttr<TargetAttr>();
13012 if (TA && !TA->isDefaultVersion())
13014 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13015 if (TVA && !TVA->isDefaultVersion())
13023 HasComplained |= Complain;
13032 candidateHasExactlyCorrectType(FunDecl)) {
13033 Matches.push_back(std::make_pair(
13034 CurAccessFunPair, cast<FunctionDecl>(FunDecl->getCanonicalDecl())));
13035 FoundNonTemplateFunction =
true;
13043 bool FindAllFunctionsThatMatchTargetTypeExactly() {
13048 if (IsInvalidFormOfPointerToMemberFunction())
13064 = dyn_cast<FunctionTemplateDecl>(Fn)) {
13065 if (AddMatchingTemplateFunction(FunctionTemplate, I.getPair()))
13070 AddMatchingNonTemplateFunction(Fn, I.getPair()))
13073 assert(Ret || Matches.empty());
13077 void EliminateAllExceptMostSpecializedTemplate() {
13090 for (
unsigned I = 0,
E = Matches.size(); I !=
E; ++I)
13091 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
13096 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
13098 S.
PDiag(diag::err_addr_ovl_ambiguous)
13099 << Matches[0].second->getDeclName(),
13100 S.
PDiag(diag::note_ovl_candidate)
13101 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
13102 Complain, TargetFunctionType);
13104 if (Result != MatchesCopy.
end()) {
13106 Matches[0].first = Matches[Result - MatchesCopy.
begin()].first;
13107 Matches[0].second = cast<FunctionDecl>(*Result);
13110 HasComplained |= Complain;
13113 void EliminateAllTemplateMatches() {
13116 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
13117 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
13120 Matches[I] = Matches[--N];
13126 void EliminateSuboptimalCudaMatches() {
13132 void ComplainNoMatchesFound()
const {
13133 assert(Matches.empty());
13135 << OvlExpr->
getName() << TargetFunctionType
13137 if (FailedCandidates.
empty())
13148 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
13156 bool IsInvalidFormOfPointerToMemberFunction()
const {
13157 return TargetTypeIsNonStaticMemberFunction &&
13161 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
13169 bool IsStaticMemberFunctionFromBoundPointer()
const {
13170 return StaticMemberFunctionFromBoundPointer;
13173 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
13175 diag::err_invalid_form_pointer_member_function)
13179 void ComplainOfInvalidConversion()
const {
13181 << OvlExpr->
getName() << TargetType;
13184 void ComplainMultipleMatchesFound()
const {
13185 assert(Matches.size() > 1);
13192 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
13194 int getNumMatches()
const {
return Matches.size(); }
13197 if (Matches.size() != 1)
return nullptr;
13198 return Matches[0].second;
13202 if (Matches.size() != 1)
return nullptr;
13203 return &Matches[0].first;
13213 bool *pHadMultipleCandidates) {
13216 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
13218 int NumMatches = Resolver.getNumMatches();
13220 bool ShouldComplain = Complain && !Resolver.hasComplained();
13221 if (NumMatches == 0 && ShouldComplain) {
13222 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
13223 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
13225 Resolver.ComplainNoMatchesFound();
13227 else if (NumMatches > 1 && ShouldComplain)
13228 Resolver.ComplainMultipleMatchesFound();
13229 else if (NumMatches == 1) {
13230 Fn = Resolver.getMatchingFunctionDecl();
13233 ResolveExceptionSpec(AddressOfExpr->
getExprLoc(), FPT);
13234 FoundResult = *Resolver.getMatchingFunctionAccessPair();
13236 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
13237 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
13239 CheckAddressOfMemberAccess(AddressOfExpr, FoundResult);
13243 if (pHadMultipleCandidates)
13244 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
13252 bool IsResultAmbiguous =
false;
13260 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
13261 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
13268 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
13276 auto FoundBetter = [&]() {
13277 IsResultAmbiguous =
false;
13288 if (getLangOpts().CUDA) {
13289 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
13291 if (PreferenceByCUDA != 0) {
13293 if (PreferenceByCUDA > 0)
13301 if (MoreConstrained != FD) {
13302 if (!MoreConstrained) {
13303 IsResultAmbiguous =
true;
13304 AmbiguousDecls.push_back(FD);
13313 if (IsResultAmbiguous)
13324 if (getLangOpts().
CUDA && CheckCUDAPreference(Skipped,
Result) != 0)
13326 if (!getMoreConstrainedFunction(Skipped,
Result))
13335 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
13341 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
13342 Found->isCPUSpecificMultiVersion())
13349 CheckAddressOfMemberAccess(
E, DAP);
13355 SrcExpr = DefaultFunctionArrayConversion(Fixed,
false);
13390 = cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
13419 NoteAllOverloadCandidates(ovl);
13425 if (FoundResult) *FoundResult = I.getPair();
13436 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
13438 unsigned DiagIDForComplaining) {
13445 if (
FunctionDecl *fn = ResolveSingleFunctionTemplateSpecialization(
13457 isa<CXXMethodDecl>(fn) &&
13458 cast<CXXMethodDecl>(fn)->isInstance()) {
13459 if (!complain)
return false;
13462 diag::err_bound_member_function)
13475 SingleFunctionExpression =
13476 FixOverloadedFunctionReference(SrcExpr.
get(), found, fn);
13479 if (doFunctionPointerConversion) {
13480 SingleFunctionExpression =
13481 DefaultFunctionArrayLvalueConversion(SingleFunctionExpression.
get());
13482 if (SingleFunctionExpression.
isInvalid()) {
13489 if (!SingleFunctionExpression.
isUsable()) {
13491 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
13493 << DestTypeForComplaining
13494 << OpRangeForComplaining
13496 NoteAllOverloadCandidates(SrcExpr.
get());
13505 SrcExpr = SingleFunctionExpression;
13515 bool PartialOverloading,
13517 NamedDecl *Callee = FoundDecl.getDecl();
13518 if (isa<UsingShadowDecl>(Callee))
13519 Callee = cast<UsingShadowDecl>(Callee)->getTargetDecl();
13522 if (ExplicitTemplateArgs) {
13523 assert(!KnownValid &&
"Explicit template arguments?");
13532 PartialOverloading);
13537 = dyn_cast<FunctionTemplateDecl>(Callee)) {
13539 ExplicitTemplateArgs, Args, CandidateSet,
13541 PartialOverloading);
13545 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
13551 bool PartialOverloading) {
13574 assert(!(*I)->getDeclContext()->isRecord());
13575 assert(isa<UsingShadowDecl>(*I) ||
13576 !(*I)->getDeclContext()->isFunctionOrMethod());
13577 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
13587 ExplicitTemplateArgs = &TABuffer;
13593 CandidateSet, PartialOverloading,
13598 Args, ExplicitTemplateArgs,
13599 CandidateSet, PartialOverloading);
13607 CandidateSet,
false,
false);
13613 switch (Name.getCXXOverloadedOperator()) {
13614 case OO_New:
case OO_Array_New:
13615 case OO_Delete:
case OO_Array_Delete:
13638 if (DC->isTransparentContext())
13654 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
13659 if (FoundInClass) {
13660 *FoundInClass = RD;
13663 R.
addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
13680 AssociatedNamespaces,
13681 AssociatedClasses);
13685 for (Sema::AssociatedNamespaceSet::iterator
13686 it = AssociatedNamespaces.begin(),
13687 end = AssociatedNamespaces.end(); it !=
end; ++it) {
13689 if (
Std &&
Std->Encloses(*it))
13699 SuggestedNamespaces.insert(*it);
13703 SemaRef.
Diag(R.
getNameLoc(), diag::err_not_found_by_two_phase_lookup)
13705 if (SuggestedNamespaces.empty()) {
13706 SemaRef.
Diag(Best->Function->getLocation(),
13707 diag::note_not_found_by_two_phase_lookup)
13709 }
else if (SuggestedNamespaces.size() == 1) {
13710 SemaRef.
Diag(Best->Function->getLocation(),
13711 diag::note_not_found_by_two_phase_lookup)
13717 SemaRef.
Diag(Best->Function->getLocation(),
13718 diag::note_not_found_by_two_phase_lookup)
13750class BuildRecoveryCallExprRAII {
13755 BuildRecoveryCallExprRAII(
Sema &S) : SemaRef(S), SatStack(S) {
13777 bool EmptyLookup,
bool AllowTypoCorrection) {
13785 BuildRecoveryCallExprRAII RCE(SemaRef);
13795 ExplicitTemplateArgs = &TABuffer;
13803 ExplicitTemplateArgs, Args, &FoundInClass)) {
13805 }
else if (EmptyLookup) {
13810 ExplicitTemplateArgs !=
nullptr,
13811 dyn_cast<MemberExpr>(Fn));
13813 AllowTypoCorrection
13819 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
13834 assert(!R.
empty() &&
"lookup results empty despite recovery");
13845 if ((*R.
begin())->isCXXClassMember())
13847 ExplicitTemplateArgs, S);
13848 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
13850 ExplicitTemplateArgs);
13874 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
13881 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
13883 llvm_unreachable(
"performing ADL for builtin");
13886 assert(getLangOpts().
CPlusPlus &&
"ADL enabled in C");
13890 UnbridgedCastsSet UnbridgedCasts;
13898 AddOverloadedCallCandidates(ULE, Args, *CandidateSet);
13900 if (getLangOpts().MSVCCompat &&
13901 CurContext->isDependentContext() && !isSFINAEContext() &&
13902 (isa<FunctionDecl>(CurContext) || isa<CXXRecordDecl>(CurContext))) {
13905 if (CandidateSet->
empty() ||
13914 RParenLoc, CurFPFeatureOverrides());
13921 if (CandidateSet->
empty())
13924 UnbridgedCasts.restore();
13931 std::optional<QualType>
Result;
13934 if (!Candidate.Function)
13936 if (Candidate.Function->isInvalidDecl())
13938 QualType T = Candidate.Function->getReturnType();
13951 if (Best && *Best != CS.
end())
13952 ConsiderCandidate(**Best);
13955 for (
const auto &
C : CS)
13957 ConsiderCandidate(
C);
13960 for (
const auto &
C : CS)
13961 ConsiderCandidate(
C);
13966 if (
Value.isNull() ||
Value->isUndeducedType())
13983 bool AllowTypoCorrection) {
13984 switch (OverloadResult) {
13995 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
13996 false, (*Best)->IsADLCandidate);
14000 if (*Best != CandidateSet->
end() &&
14004 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
14009 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
14019 CandidateSet->
empty(),
14020 AllowTypoCorrection);
14027 for (
const Expr *Arg : Args) {
14028 if (!Arg->getType()->isFunctionType())
14030 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
14031 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
14034 Arg->getExprLoc()))
14042 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
14043 << ULE->
getName() << Fn->getSourceRange()),
14051 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
14052 << ULE->
getName() << Fn->getSourceRange()),
14059 Fn->getSourceRange(), ULE->
getName(),
14060 *CandidateSet, FDecl, Args);
14069 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14070 false, (*Best)->IsADLCandidate);
14076 SubExprs.append(Args.begin(), Args.end());
14083 for (
auto I = CS.
begin(),
E = CS.
end(); I !=
E; ++I) {
14098 bool AllowTypoCorrection,
14099 bool CalleesAddressIsTaken) {
14101 Fn->getExprLoc(), CalleesAddressIsTaken
14106 if (buildOverloadedCallSet(S, Fn, ULE, Args, LParenLoc, &CandidateSet,
14112 if (CalleesAddressIsTaken)
14126 if (
const auto *TP =
14130 VK_PRValue, RParenLoc, CurFPFeatureOverrides());
14136 ExecConfig, &CandidateSet, &Best,
14137 OverloadResult, AllowTypoCorrection);
14146 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
14152 bool HadMultipleCandidates) {
14157 Exp = InitializeExplicitObjectArgument(*
this,
E, Method);
14159 Exp = PerformImplicitObjectArgumentInitialization(
E,
nullptr,
14160 FoundDecl, Method);
14169 auto *CE = dyn_cast<CastExpr>(SubE);
14170 if (CE && CE->getCastKind() == CK_NoOp)
14171 SubE = CE->getSubExpr();
14173 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
14174 SubE = BE->getSubExpr();
14175 if (isa<LambdaExpr>(SubE)) {
14181 PushExpressionEvaluationContext(
14182 ExpressionEvaluationContext::PotentiallyEvaluated);
14183 ExprResult BlockExp = BuildBlockForLambdaConversion(
14185 PopExpressionEvaluationContext();
14203 Expr *ObjectParam = Exp.
get();
14206 CurFPFeatureOverrides());
14216 Exp.
get()->getEndLoc(),
14217 CurFPFeatureOverrides());
14220 if (CheckFunctionCall(Method, CE,
14230 Expr *Input,
bool PerformADL) {
14232 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
14240 Expr *Args[2] = { Input,
nullptr };
14241 unsigned NumArgs = 1;
14246 if (Opc == UO_PostInc || Opc == UO_PostDec) {
14260 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
14266 CurFPFeatureOverrides());
14271 if (Fn.isInvalid())
14275 CurFPFeatureOverrides());
14282 AddNonMemberOperatorCandidates(Fns, ArgsArray, CandidateSet);
14285 AddMemberOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet);
14289 AddArgumentDependentLookupCandidates(OpName, OpLoc, ArgsArray,
14295 AddBuiltinOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet);
14297 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
14312 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FnDecl)) {
14313 CheckMemberOperatorAccess(OpLoc, Input,
nullptr, Best->FoundDecl);
14317 InputInit = InitializeExplicitObjectArgument(*
this, Input, Method);
14319 InputInit = PerformImplicitObjectArgumentInitialization(
14320 Input,
nullptr, Best->FoundDecl, Method);
14323 Base = Input = InputInit.
get();
14334 Input = InputInit.
get();
14339 Base, HadMultipleCandidates,
14351 Context, Op, FnExpr.
get(), ArgsArray, ResultTy, VK, OpLoc,
14352 CurFPFeatureOverrides(), Best->IsADLCandidate);
14354 if (CheckCallReturnType(FnDecl->
getReturnType(), OpLoc, TheCall, FnDecl))
14357 if (CheckFunctionCall(FnDecl, TheCall,
14360 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), FnDecl);
14365 ExprResult InputRes = PerformImplicitConversion(
14366 Input, Best->BuiltinParamTypes[0], Best->Conversions[0], AA_Passing,
14370 Input = InputRes.
get();
14390 PDiag(diag::err_ovl_ambiguous_oper_unary)
14407 << (Msg !=
nullptr)
14408 << (Msg ? Msg->
getString() : StringRef())
14419 return CreateBuiltinUnaryOp(OpLoc, Opc, Input);
14435 AddNonMemberOperatorCandidates(Fns, Args, CandidateSet);
14438 AddMemberOperatorCandidates(Op, OpLoc, Args, CandidateSet);
14440 AddMemberOperatorCandidates(Op, OpLoc, {Args[1], Args[0]}, CandidateSet,
14445 AddMemberOperatorCandidates(ExtraOp, OpLoc, Args, CandidateSet);
14447 AddMemberOperatorCandidates(ExtraOp, OpLoc, {Args[1], Args[0]},
14455 if (Op != OO_Equal && PerformADL) {
14457 AddArgumentDependentLookupCandidates(OpName, OpLoc, Args,
14463 AddArgumentDependentLookupCandidates(ExtraOpName, OpLoc, Args,
14482 AddBuiltinOperatorCandidates(Op, OpLoc, Args, CandidateSet);
14488 Expr *RHS,
bool PerformADL,
14489 bool AllowRewrittenCandidates,
14491 Expr *Args[2] = { LHS, RHS };
14495 AllowRewrittenCandidates =
false;
14501 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
14522 if (Fn.isInvalid())
14526 CurFPFeatureOverrides());
14531 if (Opc == BO_PtrMemD) {
14532 auto CheckPlaceholder = [&](
Expr *&Arg) {
14541 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
14543 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
14562 if (Opc == BO_Assign && !Args[0]->getType()->isOverloadableType())
14563 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
14568 Op, OpLoc, AllowRewrittenCandidates));
14570 CandidateSet.
exclude(DefaultedFn);
14571 LookupOverloadedBinOp(CandidateSet, Op, Fns, Args, PerformADL);
14573 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
14582 bool IsReversed = Best->isReversed();
14584 std::swap(Args[0], Args[1]);
14601 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
14605 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
14606 : diag::err_ovl_rewrite_equalequal_not_bool)
14614 if (AllowRewrittenCandidates && !IsReversed &&
14622 if (Cand.Viable && Cand.Function && Cand.isReversed() &&
14624 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
14626 *
this, OpLoc, Cand.Conversions[ArgIdx],
14627 Best->Conversions[ArgIdx]) ==
14629 AmbiguousWith.push_back(Cand.Function);
14636 if (!AmbiguousWith.empty()) {
14637 bool AmbiguousWithSelf =
14638 AmbiguousWith.size() == 1 &&
14640 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
14642 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
14644 if (AmbiguousWithSelf) {
14646 diag::note_ovl_ambiguous_oper_binary_reversed_self);
14651 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
14652 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
14654 !MD->hasCXXExplicitFunctionObjectParameter() &&
14656 MD->getFunctionObjectParameterType(),
14657 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
14659 MD->getFunctionObjectParameterType(),
14662 MD->getFunctionObjectParameterType(),
14665 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
14668 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
14669 for (
auto *F : AmbiguousWith)
14670 Diag(F->getLocation(),
14671 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
14679 if (Op == OO_Equal)
14680 diagnoseNullableToNonnullConversion(Args[0]->getType(),
14681 Args[1]->getType(), OpLoc);
14684 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FnDecl)) {
14686 CheckMemberOperatorAccess(OpLoc, Args[0], Args[1], Best->FoundDecl);
14691 Arg0 = InitializeExplicitObjectArgument(*
this, Args[0], FnDecl);
14694 Arg0 = PerformImplicitObjectArgumentInitialization(
14695 Args[0],
nullptr, Best->FoundDecl, Method);
14697 Arg1 = PerformCopyInitialization(
14708 ExprResult Arg0 = PerformCopyInitialization(
14716 PerformCopyInitialization(
14728 Best->FoundDecl,
Base,
14729 HadMultipleCandidates, OpLoc);
14740 const Expr *ImplicitThis =
nullptr;
14745 Context, ChosenOp, FnExpr.
get(), Args, ResultTy, VK, OpLoc,
14746 CurFPFeatureOverrides(), Best->IsADLCandidate);
14748 if (
const auto *Method = dyn_cast<CXXMethodDecl>(FnDecl);
14751 ImplicitThis = ArgsArray[0];
14752 ArgsArray = ArgsArray.slice(1);
14755 if (CheckCallReturnType(FnDecl->
getReturnType(), OpLoc, TheCall,
14759 if (Op == OO_Equal) {
14761 DiagnoseSelfMove(Args[0], Args[1], OpLoc);
14765 if (ImplicitThis) {
14768 cast<CXXMethodDecl>(FnDecl)->getFunctionObjectParameterType());
14770 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
14774 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
14776 VariadicDoesNotApply);
14778 ExprResult R = MaybeBindToTemporary(TheCall);
14782 R = CheckForImmediateInvocation(R, FnDecl);
14789 (Op == OO_Spaceship && IsReversed)) {
14790 if (Op == OO_ExclaimEqual) {
14791 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
14792 R = CreateBuiltinUnaryOp(OpLoc, UO_LNot, R.
get());
14794 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
14796 Expr *ZeroLiteral =
14802 pushCodeSynthesisContext(Ctx);
14804 R = CreateOverloadedBinOp(
14805 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.
get(),
14806 IsReversed ? R.
get() : ZeroLiteral,
true,
14809 popCodeSynthesisContext();
14814 assert(ChosenOp == Op &&
"unexpected operator name");
14818 if (Best->RewriteKind !=
CRK_None)
14826 ExprResult ArgsRes0 = PerformImplicitConversion(
14827 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
14831 Args[0] = ArgsRes0.
get();
14833 ExprResult ArgsRes1 = PerformImplicitConversion(
14834 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
14838 Args[1] = ArgsRes1.
get();
14848 if (Opc == BO_Comma)
14853 if (DefaultedFn && Opc == BO_Cmp) {
14854 ExprResult E = BuildSynthesizedThreeWayComparison(OpLoc, Fns, Args[0],
14855 Args[1], DefaultedFn);
14856 if (
E.isInvalid() ||
E.isUsable())
14870 Opc >= BO_Assign && Opc <= BO_OrAssign) {
14871 Diag(OpLoc, diag::err_ovl_no_viable_oper)
14874 if (Args[0]->getType()->isIncompleteType()) {
14875 Diag(OpLoc, diag::note_assign_lhs_incomplete)
14889 Result = CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
14891 assert(
Result.isInvalid() &&
14892 "C++ binary operator overloading is missing candidates!");
14901 << Args[0]->getType()
14902 << Args[1]->getType()
14903 << Args[0]->getSourceRange()
14904 << Args[1]->getSourceRange()),
14910 if (isImplicitlyDeleted(Best->Function)) {
14914 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
14919 Diag(OpLoc, diag::err_ovl_deleted_comparison)
14920 << Args[0]->
getType() << DeletedFD;
14925 NoteDeletedFunction(DeletedFD);
14933 PDiag(diag::err_ovl_deleted_oper)
14935 .getCXXOverloadedOperator())
14936 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
14937 << Args[0]->getSourceRange() << Args[1]->getSourceRange()),
14945 return CreateBuiltinBinOp(OpLoc, Opc, Args[0], Args[1]);
14961 "cannot use prvalue expressions more than once");
14962 Expr *OrigLHS = LHS;
14963 Expr *OrigRHS = RHS;
14967 LHS =
new (Context)
14970 RHS =
new (Context)
14974 ExprResult Eq = CreateOverloadedBinOp(OpLoc, BO_EQ, Fns, LHS, RHS,
true,
true,
14976 if (
Eq.isInvalid())
14979 ExprResult Less = CreateOverloadedBinOp(OpLoc, BO_LT, Fns, LHS, RHS,
true,
14980 true, DefaultedFn);
14981 if (
Less.isInvalid())
14986 Greater = CreateOverloadedBinOp(OpLoc, BO_LT, Fns, RHS, LHS,
true,
true,
14993 struct Comparison {
15008 for (; I >= 0; --I) {
15010 auto *VI = Info->lookupValueInfo(Comparisons[I].
Result);
15021 Result = ActOnConditionalOp(OpLoc, OpLoc, Comparisons[I].Cmp.get(),
15033 Context, OrigLHS, OrigRHS, BO_Cmp,
Result.get()->getType(),
15034 Result.get()->getValueKind(),
Result.get()->getObjectKind(), OpLoc,
15035 CurFPFeatureOverrides());
15036 Expr *SemanticForm[] = {LHS, RHS,
Result.get()};
15046 unsigned NumArgsSlots =
15047 MethodArgs.size() + std::max<unsigned>(Args.size(), NumParams);
15050 MethodArgs.reserve(MethodArgs.size() + NumArgsSlots);
15051 bool IsError =
false;
15054 for (
unsigned i = 0; i != NumParams; i++) {
15056 if (i < Args.size()) {
15074 MethodArgs.push_back(Arg);
15084 Args.push_back(
Base);
15085 for (
auto *e : ArgExpr) {
15094 ArgExpr.back()->getEndLoc());
15106 if (Fn.isInvalid())
15112 CurFPFeatureOverrides());
15116 UnbridgedCastsSet UnbridgedCasts;
15126 AddMemberOperatorCandidates(OO_Subscript, LLoc, Args, CandidateSet);
15129 if (Args.size() == 2)
15130 AddBuiltinOperatorCandidates(OO_Subscript, LLoc, Args, CandidateSet);
15132 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15145 CheckMemberOperatorAccess(LLoc, Args[0], ArgExpr, Best->FoundDecl);
15154 InitializeExplicitObjectArgument(*
this, Args[0], Method);
15157 Args[0] = Res.
get();
15160 ExprResult Arg0 = PerformImplicitObjectArgumentInitialization(
15161 Args[0],
nullptr, Best->FoundDecl, Method);
15165 MethodArgs.push_back(Arg0.
get());
15169 *
this, MethodArgs, Method, ArgExpr, LLoc);
15177 *
this, FnDecl, Best->FoundDecl,
Base, HadMultipleCandidates,
15188 Context, OO_Subscript, FnExpr.
get(), MethodArgs, ResultTy, VK, RLoc,
15189 CurFPFeatureOverrides());
15191 if (CheckCallReturnType(FnDecl->
getReturnType(), LLoc, TheCall, FnDecl))
15194 if (CheckFunctionCall(Method, TheCall,
15198 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall),
15204 ExprResult ArgsRes0 = PerformImplicitConversion(
15205 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15209 Args[0] = ArgsRes0.
get();
15211 ExprResult ArgsRes1 = PerformImplicitConversion(
15212 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15216 Args[1] = ArgsRes1.
get();
15224 CandidateSet.
empty()
15225 ? (PDiag(diag::err_ovl_no_oper)
15226 << Args[0]->getType() << 0
15227 << Args[0]->getSourceRange() <<
Range)
15228 : (PDiag(diag::err_ovl_no_viable_subscript)
15229 << Args[0]->getType() << Args[0]->getSourceRange() <<
Range);
15236 if (Args.size() == 2) {
15239 LLoc, PDiag(diag::err_ovl_ambiguous_oper_binary)
15240 <<
"[]" << Args[0]->getType() << Args[1]->getType()
15241 << Args[0]->getSourceRange() <<
Range),
15246 PDiag(diag::err_ovl_ambiguous_subscript_call)
15247 << Args[0]->getType()
15248 << Args[0]->getSourceRange() <<
Range),
15257 PDiag(diag::err_ovl_deleted_oper)
15258 <<
"[]" << (Msg !=
nullptr)
15259 << (Msg ? Msg->
getString() : StringRef())
15260 << Args[0]->getSourceRange() <<
Range),
15267 return CreateBuiltinArraySubscriptExpr(Args[0], LLoc, Args[1], RLoc);
15274 Expr *ExecConfig,
bool IsExecConfig,
15275 bool AllowRecovery) {
15284 if (
BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
15286 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
15299 QualType objectType = op->getLHS()->getType();
15300 if (op->getOpcode() == BO_PtrMemI)
15304 Qualifiers difference = objectQuals - funcQuals;
15308 std::string qualsString = difference.
getAsString();
15309 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
15312 << (qualsString.find(
' ') == std::string::npos ? 1 : 2);
15316 Context, MemExprE, Args, resultType, valueKind, RParenLoc,
15319 if (CheckCallReturnType(proto->
getReturnType(), op->getRHS()->getBeginLoc(),
15323 if (ConvertArgumentsForCall(call, op,
nullptr, proto, Args, RParenLoc))
15326 if (CheckOtherCall(call, proto))
15329 return MaybeBindToTemporary(call);
15336 if (!AllowRecovery)
15338 std::vector<Expr *> SubExprs = {MemExprE};
15339 llvm::append_range(SubExprs, Args);
15340 return CreateRecoveryExpr(MemExprE->
getBeginLoc(), RParenLoc, SubExprs,
15343 if (isa<CXXPseudoDestructorExpr>(NakedMemExpr))
15345 RParenLoc, CurFPFeatureOverrides());
15347 UnbridgedCastsSet UnbridgedCasts;
15353 bool HadMultipleCandidates =
false;
15356 if (isa<MemberExpr>(NakedMemExpr)) {
15357 MemExpr = cast<MemberExpr>(NakedMemExpr);
15361 UnbridgedCasts.restore();
15379 TemplateArgs = &TemplateArgsBuffer;
15385 QualType ExplicitObjectType = ObjectType;
15389 if (isa<UsingShadowDecl>(
Func))
15390 Func = cast<UsingShadowDecl>(
Func)->getTargetDecl();
15392 bool HasExplicitParameter =
false;
15393 if (
const auto *M = dyn_cast<FunctionDecl>(
Func);
15394 M && M->hasCXXExplicitFunctionObjectParameter())
15395 HasExplicitParameter =
true;
15396 else if (
const auto *M = dyn_cast<FunctionTemplateDecl>(
Func);
15398 M->getTemplatedDecl()->hasCXXExplicitFunctionObjectParameter())
15399 HasExplicitParameter =
true;
15401 if (HasExplicitParameter)
15405 if (getLangOpts().MicrosoftExt && isa<CXXConstructorDecl>(
Func)) {
15406 AddOverloadCandidate(cast<CXXConstructorDecl>(
Func), I.getPair(), Args,
15409 }
else if ((Method = dyn_cast<CXXMethodDecl>(
Func))) {
15415 AddMethodCandidate(Method, I.getPair(), ActingDC, ExplicitObjectType,
15416 ObjectClassification, Args, CandidateSet,
15419 AddMethodTemplateCandidate(cast<FunctionTemplateDecl>(
Func),
15420 I.getPair(), ActingDC, TemplateArgs,
15421 ExplicitObjectType, ObjectClassification,
15422 Args, CandidateSet,
15427 HadMultipleCandidates = (CandidateSet.
size() > 1);
15431 UnbridgedCasts.restore();
15434 bool Succeeded =
false;
15438 Method = cast<CXXMethodDecl>(Best->Function);
15439 FoundDecl = Best->FoundDecl;
15440 CheckUnresolvedMemberAccess(UnresExpr, Best->FoundDecl);
15441 if (DiagnoseUseOfOverloadedDecl(Best->FoundDecl, UnresExpr->
getNameLoc()))
15449 if (Method != FoundDecl.getDecl() &&
15450 DiagnoseUseOfOverloadedDecl(Method, UnresExpr->
getNameLoc()))
15459 PDiag(diag::err_ovl_no_viable_member_function_in_call)
15466 PDiag(diag::err_ovl_ambiguous_member_call)
15471 DiagnoseUseOfDeletedFunction(
15473 CandidateSet, Best->Function, Args,
true);
15481 FixOverloadedFunctionReference(MemExprE, FoundDecl, Method);
15484 MemExprE = Res.
get();
15489 return BuildResolvedCallExpr(MemExprE, Method, LParenLoc, Args, RParenLoc,
15490 ExecConfig, IsExecConfig);
15500 assert(Method &&
"Member call to something that isn't a method?");
15513 HadMultipleCandidates, MemExpr->
getExprLoc());
15519 CurFPFeatureOverrides(), Proto->getNumParams());
15524 ExprResult ObjectArg = PerformImplicitObjectArgumentInitialization(
15525 MemExpr->
getBase(), Qualifier, FoundDecl, Method);
15530 RParenLoc, CurFPFeatureOverrides(),
15531 Proto->getNumParams());
15537 return BuildRecoveryExpr(ResultType);
15540 if (ConvertArgumentsForCall(TheCall, MemExpr, Method, Proto, Args,
15542 return BuildRecoveryExpr(ResultType);
15544 DiagnoseSentinelCalls(Method, LParenLoc, Args);
15546 if (CheckFunctionCall(Method, TheCall, Proto))
15552 if (
auto *MemE = dyn_cast<MemberExpr>(NakedMemExpr)) {
15553 if (
const EnableIfAttr *
Attr =
15554 CheckEnableIf(Method, LParenLoc, Args,
true)) {
15555 Diag(MemE->getMemberLoc(),
15556 diag::err_ovl_no_viable_member_function_in_call)
15559 diag::note_ovl_candidate_disabled_by_function_cond_attr)
15560 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
15565 if (isa<CXXConstructorDecl, CXXDestructorDecl>(CurContext) &&
15566 TheCall->getDirectCallee()->isPureVirtual()) {
15572 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
15573 << MD->
getDeclName() << isa<CXXDestructorDecl>(CurContext)
15577 if (getLangOpts().AppleKext)
15583 if (
auto *DD = dyn_cast<CXXDestructorDecl>(TheCall->getDirectCallee())) {
15585 bool CallCanBeVirtual = !MemExpr->
hasQualifier() || getLangOpts().AppleKext;
15586 CheckVirtualDtorCall(DD, MemExpr->
getBeginLoc(),
false,
15587 CallCanBeVirtual,
true,
15591 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall),
15592 TheCall->getDirectCallee());
15604 UnbridgedCastsSet UnbridgedCasts;
15608 assert(Object.get()->getType()->isRecordType() &&
15609 "Requires object type argument");
15622 if (RequireCompleteType(LParenLoc, Object.get()->getType(),
15623 diag::err_incomplete_object_call, Object.get()))
15627 LookupResult R(*
this, OpName, LParenLoc, LookupOrdinaryName);
15628 LookupQualifiedName(R,
Record->getDecl());
15629 R.suppressAccessDiagnostics();
15632 Oper != OperEnd; ++Oper) {
15633 AddMethodCandidate(Oper.getPair(), Object.get()->getType(),
15634 Object.get()->Classify(Context), Args, CandidateSet,
15646 bool IgnoreSurrogateFunctions =
false;
15647 if (CandidateSet.
size() == 1 &&
Record->getAsCXXRecordDecl()->isLambda()) {
15649 if (!Candidate.
Viable &&
15651 IgnoreSurrogateFunctions =
true;
15671 const auto &Conversions =
15672 cast<CXXRecordDecl>(
Record->getDecl())->getVisibleConversionFunctions();
15673 for (
auto I = Conversions.begin(),
E = Conversions.end();
15674 !IgnoreSurrogateFunctions && I !=
E; ++I) {
15677 if (isa<UsingShadowDecl>(
D))
15678 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
15682 if (isa<FunctionTemplateDecl>(
D))
15695 AddSurrogateCandidate(Conv, I.getPair(), ActingContext, Proto,
15696 Object.get(), Args, CandidateSet);
15701 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15714 CandidateSet.
empty()
15715 ? (PDiag(diag::err_ovl_no_oper)
15716 << Object.get()->getType() << 1
15717 << Object.get()->getSourceRange())
15718 : (PDiag(diag::err_ovl_no_viable_object_call)
15719 << Object.get()->getType() << Object.get()->getSourceRange());
15726 if (!R.isAmbiguous())
15729 PDiag(diag::err_ovl_ambiguous_object_call)
15730 << Object.get()->getType()
15731 << Object.get()->getSourceRange()),
15742 PDiag(diag::err_ovl_deleted_object_call)
15743 << Object.get()->getType() << (Msg !=
nullptr)
15744 << (Msg ? Msg->
getString() : StringRef())
15745 << Object.get()->getSourceRange()),
15751 if (Best == CandidateSet.
end())
15754 UnbridgedCasts.restore();
15756 if (Best->Function ==
nullptr) {
15760 = cast<CXXConversionDecl>(
15761 Best->Conversions[0].UserDefined.ConversionFunction);
15763 CheckMemberOperatorAccess(LParenLoc, Object.get(),
nullptr,
15765 if (DiagnoseUseOfDecl(Best->FoundDecl, LParenLoc))
15767 assert(Conv == Best->FoundDecl.getDecl() &&
15768 "Found Decl & conversion-to-functionptr should be same, right?!");
15775 ExprResult Call = BuildCXXMemberCallExpr(Object.get(), Best->FoundDecl,
15776 Conv, HadMultipleCandidates);
15777 if (
Call.isInvalid())
15781 Context,
Call.get()->getType(), CK_UserDefinedConversion,
Call.get(),
15782 nullptr,
VK_PRValue, CurFPFeatureOverrides());
15784 return BuildCallExpr(S,
Call.get(), LParenLoc, Args, RParenLoc);
15787 CheckMemberOperatorAccess(LParenLoc, Object.get(),
nullptr, Best->FoundDecl);
15792 CXXMethodDecl *Method = cast<CXXMethodDecl>(Best->Function);
15805 Obj, HadMultipleCandidates,
15812 MethodArgs.reserve(NumParams + 1);
15814 bool IsError =
false;
15821 ExprResult ObjRes = PerformImplicitObjectArgumentInitialization(
15822 Object.get(),
nullptr, Best->FoundDecl, Method);
15827 MethodArgs.push_back(Object.get());
15831 *
this, MethodArgs, Method, Args, LParenLoc);
15834 if (Proto->isVariadic()) {
15836 for (
unsigned i = NumParams, e = Args.size(); i < e; i++) {
15837 ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod,
15840 MethodArgs.push_back(Arg.
get());
15847 DiagnoseSentinelCalls(Method, LParenLoc, Args);
15855 Context, OO_Call, NewFn.
get(), MethodArgs, ResultTy, VK, RParenLoc,
15856 CurFPFeatureOverrides());
15858 if (CheckCallReturnType(Method->
getReturnType(), LParenLoc, TheCall, Method))
15861 if (CheckFunctionCall(Method, TheCall, Proto))
15864 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), Method);
15869 bool *NoArrowOperatorFound) {
15870 assert(
Base->getType()->isRecordType() &&
15871 "left-hand side must have class type");
15888 if (RequireCompleteType(
Loc,
Base->getType(),
15889 diag::err_typecheck_incomplete_tag,
Base))
15892 LookupResult R(*
this, OpName, OpLoc, LookupOrdinaryName);
15897 Oper != OperEnd; ++Oper) {
15898 AddMethodCandidate(Oper.getPair(),
Base->getType(),
Base->Classify(Context),
15899 std::nullopt, CandidateSet,
15903 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15914 if (CandidateSet.
empty()) {
15916 if (NoArrowOperatorFound) {
15919 *NoArrowOperatorFound =
true;
15922 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
15923 << BaseType <<
Base->getSourceRange();
15925 Diag(OpLoc, diag::note_typecheck_member_reference_suggestion)
15929 Diag(OpLoc, diag::err_ovl_no_viable_oper)
15930 <<
"operator->" <<
Base->getSourceRange();
15938 <<
"->" <<
Base->getType()
15939 <<
Base->getSourceRange()),
15947 <<
"->" << (Msg !=
nullptr)
15948 << (Msg ? Msg->
getString() : StringRef())
15949 <<
Base->getSourceRange()),
15955 CheckMemberOperatorAccess(OpLoc,
Base,
nullptr, Best->FoundDecl);
15958 CXXMethodDecl *Method = cast<CXXMethodDecl>(Best->Function);
15961 ExprResult R = InitializeExplicitObjectArgument(*
this,
Base, Method);
15967 Base,
nullptr, Best->FoundDecl, Method);
15975 Base, HadMultipleCandidates, OpLoc);
15985 ResultTy, VK, OpLoc, CurFPFeatureOverrides());
15987 if (CheckCallReturnType(Method->
getReturnType(), OpLoc, TheCall, Method))
15990 if (CheckFunctionCall(Method, TheCall,
15994 return CheckForImmediateInvocation(MaybeBindToTemporary(TheCall), Method);
16006 AddNonMemberOperatorCandidates(R.
asUnresolvedSet(), Args, CandidateSet,
16009 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16022 PDiag(diag::err_ovl_no_viable_function_in_call)
16037 nullptr, HadMultipleCandidates,
16040 if (Fn.isInvalid())
16046 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
16047 ExprResult InputInit = PerformCopyInitialization(
16052 ConvArgs[ArgIdx] = InputInit.
get();
16060 Context, Fn.get(),
llvm::ArrayRef(ConvArgs, Args.size()), ResultTy, VK,
16061 LitEndLoc, UDSuffixLoc, CurFPFeatureOverrides());
16063 if (CheckCallReturnType(FD->
getReturnType(), UDSuffixLoc, UDL, FD))
16066 if (CheckFunctionCall(FD, UDL,
nullptr))
16069 return CheckForImmediateInvocation(MaybeBindToTemporary(UDL), FD);
16079 Scope *S =
nullptr;
16082 if (!MemberLookup.
empty()) {
16092 return FRS_DiagnosticIssued;
16095 BuildCallExpr(S, MemberRef.
get(),
Loc, std::nullopt,
Loc,
nullptr);
16098 return FRS_DiagnosticIssued;
16101 ExprResult FnR = CreateUnresolvedLookupExpr(
nullptr,
16105 return FRS_DiagnosticIssued;
16108 bool CandidateSetError = buildOverloadedCallSet(S, Fn, Fn,
Range,
Loc,
16110 if (CandidateSet->
empty() || CandidateSetError) {
16112 return FRS_NoViableFunction;
16120 return FRS_NoViableFunction;
16123 Loc,
nullptr, CandidateSet, &Best,
16128 return FRS_DiagnosticIssued;
16131 return FRS_Success;
16136 if (
ParenExpr *PE = dyn_cast<ParenExpr>(
E)) {
16138 FixOverloadedFunctionReference(PE->getSubExpr(),
Found, Fn);
16141 if (SubExpr.
get() == PE->getSubExpr())
16144 return new (Context)
16145 ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.
get());
16150 FixOverloadedFunctionReference(ICE->getSubExpr(),
Found, Fn);
16153 assert(Context.
hasSameType(ICE->getSubExpr()->getType(),
16155 "Implicit cast type cannot be determined from overload");
16156 assert(ICE->path_empty() &&
"fixing up hierarchy conversion?");
16157 if (SubExpr.
get() == ICE->getSubExpr())
16162 CurFPFeatureOverrides());
16165 if (
auto *GSE = dyn_cast<GenericSelectionExpr>(
E)) {
16166 if (!GSE->isResultDependent()) {
16168 FixOverloadedFunctionReference(GSE->getResultExpr(),
Found, Fn);
16171 if (SubExpr.
get() == GSE->getResultExpr())
16178 unsigned ResultIdx = GSE->getResultIndex();
16179 AssocExprs[ResultIdx] = SubExpr.
get();
16181 if (GSE->isExprPredicate())
16183 Context, GSE->getGenericLoc(), GSE->getControllingExpr(),
16184 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
16185 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
16188 Context, GSE->getGenericLoc(), GSE->getControllingType(),
16189 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
16190 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
16199 assert(UnOp->getOpcode() == UO_AddrOf &&
16200 "Can only take the address of an overloaded function");
16210 FixOverloadedFunctionReference(UnOp->getSubExpr(),
Found, Fn);
16213 if (SubExpr.
get() == UnOp->getSubExpr())
16216 if (CheckUseOfCXXMethodAsAddressOfOperand(UnOp->getBeginLoc(),
16217 SubExpr.
get(), Method))
16220 assert(isa<DeclRefExpr>(SubExpr.
get()) &&
16221 "fixed to something other than a decl ref");
16222 assert(cast<DeclRefExpr>(SubExpr.
get())->getQualifier() &&
16223 "fixed to a member ref with no nested name qualifier");
16234 (void)isCompleteType(UnOp->getOperatorLoc(), MemPtrType);
16238 UnOp->getOperatorLoc(),
false,
16239 CurFPFeatureOverrides());
16243 FixOverloadedFunctionReference(UnOp->getSubExpr(),
Found, Fn);
16246 if (SubExpr.
get() == UnOp->getSubExpr())
16249 return CreateBuiltinUnaryOp(UnOp->getOperatorLoc(), UO_AddrOf,
16256 if (ULE->hasExplicitTemplateArgs()) {
16257 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
16258 TemplateArgs = &TemplateArgsBuffer;
16263 getLangOpts().CPlusPlus && !Fn->hasCXXExplicitFunctionObjectParameter()
16268 if (
unsigned BID = Fn->getBuiltinID()) {
16276 Fn,
Type, ValueKind, ULE->getNameInfo(), ULE->getQualifierLoc(),
16277 Found.getDecl(), ULE->getTemplateKeywordLoc(), TemplateArgs);
16285 if (MemExpr->hasExplicitTemplateArgs()) {
16286 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
16287 TemplateArgs = &TemplateArgsBuffer;
16294 if (MemExpr->isImplicitAccess()) {
16295 if (cast<CXXMethodDecl>(Fn)->isStatic()) {
16297 Fn, Fn->getType(),
VK_LValue, MemExpr->getNameInfo(),
16298 MemExpr->getQualifierLoc(),
Found.getDecl(),
16299 MemExpr->getTemplateKeywordLoc(), TemplateArgs);
16304 if (MemExpr->getQualifier())
16305 Loc = MemExpr->getQualifierLoc().getBeginLoc();
16307 BuildCXXThisExpr(
Loc, MemExpr->getBaseType(),
true);
16310 Base = MemExpr->getBase();
16314 if (cast<CXXMethodDecl>(Fn)->isStatic()) {
16316 type = Fn->getType();
16322 return BuildMemberExpr(
16323 Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),
16324 MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn,
Found,
16325 true, MemExpr->getMemberNameInfo(),
16329 llvm_unreachable(
"Invalid reference to overloaded function");
16335 return FixOverloadedFunctionReference(
E.get(),
Found, Fn);
16340 if (!PartialOverloading || !
Function)
16344 if (
const auto *Proto =
16345 dyn_cast<FunctionProtoType>(
Function->getFunctionType()))
16346 if (Proto->isTemplateVariadic())
16348 if (
auto *Pattern =
Function->getTemplateInstantiationPattern())
16349 if (
const auto *Proto =
16350 dyn_cast<FunctionProtoType>(Pattern->getFunctionType()))
16351 if (Proto->isTemplateVariadic())
16364 << IsMember << Name << (Msg !=
nullptr)
16365 << (Msg ? Msg->
getString() : StringRef())
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines the Diagnostic-related interfaces.
static bool isBooleanType(QualType Ty)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
static bool EvaluateAsBooleanCondition(const Expr *E, bool &Result, EvalInfo &Info)
static const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
static std::string getName(const CallEvent &Call)
This file declares semantic analysis for CUDA constructs.
static void BuildBasePathArray(const CXXBasePath &Path, CXXCastPath &BasePathArray)
static bool isRecordType(QualType T)
static void TryUserDefinedConversion(Sema &S, QualType DestType, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt a user-defined conversion between two types (C++ [dcl.init]), which enumerates all conversion...
This file declares semantic analysis for Objective-C.
static ImplicitConversionSequence::CompareKind CompareStandardConversionSequences(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareStandardConversionSequences - Compare two standard conversion sequences to determine whether o...
static bool isNullPointerConstantForConversion(Expr *Expr, bool InOverloadResolution, ASTContext &Context)
static bool shouldSkipNotingLambdaConversionDecl(const FunctionDecl *Fn)
static const FunctionType * getConversionOpReturnTyAsFunction(CXXConversionDecl *Conv)
static bool functionHasPassObjectSizeParams(const FunctionDecl *FD)
static Comparison compareEnableIfAttrs(const Sema &S, const FunctionDecl *Cand1, const FunctionDecl *Cand2)
Compares the enable_if attributes of two FunctionDecls, for the purposes of overload resolution.
static Qualifiers CollectVRQualifiers(ASTContext &Context, Expr *ArgExpr)
CollectVRQualifiers - This routine returns Volatile/Restrict qualifiers, if any, found in visible typ...
@ ToPromotedUnderlyingType
static void AddOverloadedCallCandidate(Sema &S, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading, bool KnownValid)
Add a single candidate to the overload set.
static ExprResult FinishOverloadedCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, OverloadCandidateSet *CandidateSet, OverloadCandidateSet::iterator *Best, OverloadingResult OverloadResult, bool AllowTypoCorrection)
FinishOverloadedCallExpr - given an OverloadCandidateSet, builds and returns the completed call expre...
static 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 isQualificationConversionStep(QualType FromType, QualType ToType, bool CStyle, bool IsTopLevel, bool &PreviousToQualsIncludeConst, bool &ObjCLifetimeConversion)
Perform a single iteration of the loop for checking if a qualification conversion is valid.
static bool allowAmbiguity(ASTContext &Context, const FunctionDecl *F1, const FunctionDecl *F2)
static unsigned RankDeductionFailure(const DeductionFailureInfo &DFI)
static QualType BuildSimilarlyQualifiedPointerType(const Type *FromPtr, QualType ToPointee, QualType ToType, ASTContext &Context, bool StripObjCLifetime=false)
BuildSimilarlyQualifiedPointerType - In a pointer conversion from the pointer type FromPtr to a point...
static void forAllQualifierCombinations(QualifiersAndAtomic Quals, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static bool FindConversionForRefInit(Sema &S, ImplicitConversionSequence &ICS, QualType DeclType, SourceLocation DeclLoc, Expr *Init, QualType T2, bool AllowRvalues, bool AllowExplicit)
Look for a user-defined conversion to a value reference-compatible with DeclType.
static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static Expr * GetExplicitObjectExpr(Sema &S, Expr *Obj, const FunctionDecl *Fun)
static bool hasDeprecatedStringLiteralToCharPtrConversion(const ImplicitConversionSequence &ICS)
static ExprResult CheckConvertedConstantExpression(Sema &S, Expr *From, QualType T, APValue &Value, Sema::CCEKind CCE, bool RequireInt, NamedDecl *Dest)
CheckConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static void AddBuiltinAssignmentOperatorCandidates(Sema &S, QualType T, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
Helper function for AddBuiltinOperatorCandidates() that adds the volatile- and non-volatile-qualified...
static bool CheckConvertedConstantConversions(Sema &S, StandardConversionSequence &SCS)
Check that the specified conversion is permitted in a converted constant expression,...
static void NoteBuiltinOperatorCandidate(Sema &S, StringRef Opc, SourceLocation OpLoc, OverloadCandidate *Cand)
static ImplicitConversionSequence::CompareKind compareConversionFunctions(Sema &S, FunctionDecl *Function1, FunctionDecl *Function2)
Compare the user-defined conversion functions or constructors of two user-defined conversion sequence...
static void forAllQualifierCombinationsImpl(QualifiersAndAtomic Available, QualifiersAndAtomic Applied, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static const char * GetImplicitConversionName(ImplicitConversionKind Kind)
GetImplicitConversionName - Return the name of this kind of implicit conversion.
static bool checkAddressOfFunctionIsAvailable(Sema &S, const FunctionDecl *FD, bool Complain, bool InOverloadResolution, SourceLocation Loc)
Returns true if we can take the address of the function.
static ImplicitConversionSequence::CompareKind CompareDerivedToBaseConversions(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareDerivedToBaseConversions - Compares two standard conversion sequences to determine whether the...
static bool convertArgsForAvailabilityChecks(Sema &S, FunctionDecl *Function, Expr *ThisArg, SourceLocation CallLoc, ArrayRef< Expr * > Args, Sema::SFINAETrap &Trap, bool MissingImplicitThis, Expr *&ConvertedThis, SmallVectorImpl< Expr * > &ConvertedArgs)
static TemplateDecl * getDescribedTemplate(Decl *Templated)
static void CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand, ArrayRef< Expr * > Args, OverloadCandidateSet::CandidateSetKind CSK)
CompleteNonViableCandidate - Normally, overload resolution only computes up to the first bad conversi...
static QualType AdoptQualifiers(ASTContext &Context, QualType T, Qualifiers Qs)
Adopt the given qualifiers for the given type.
static void NoteAmbiguousUserConversions(Sema &S, SourceLocation OpLoc, OverloadCandidate *Cand)
static bool CheckArityMismatch(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool IsAddressOf=false)
Additional arity mismatch diagnosis specific to a function overload candidates.
static ImplicitConversionSequence::CompareKind compareStandardConversionSubsets(ASTContext &Context, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
static bool IsVectorConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, ImplicitConversionKind &ElConv, Expr *From, bool InOverloadResolution, bool CStyle)
Determine whether the conversion from FromType to ToType is a valid vector conversion.
static ImplicitConversionSequence TryContextuallyConvertToObjCPointer(Sema &S, Expr *From)
TryContextuallyConvertToObjCPointer - Attempt to contextually convert the expression From to an Objec...
static ExprResult CreateFunctionRefExpr(Sema &S, FunctionDecl *Fn, NamedDecl *FoundDecl, const Expr *Base, bool HadMultipleCandidates, SourceLocation Loc=SourceLocation(), const DeclarationNameLoc &LocInfo=DeclarationNameLoc())
A convenience routine for creating a decayed reference to a function.
static std::optional< QualType > getImplicitObjectParamType(ASTContext &Context, const FunctionDecl *F)
Compute the type of the implicit object parameter for the given function, if any.
static bool checkPlaceholderForOverload(Sema &S, Expr *&E, UnbridgedCastsSet *unbridgedCasts=nullptr)
checkPlaceholderForOverload - Do any interesting placeholder-like preprocessing on the given expressi...
static FixedEnumPromotion getFixedEnumPromtion(Sema &S, const StandardConversionSequence &SCS)
Returns kind of fixed enum promotion the SCS uses.
static bool isAllowableExplicitConversion(Sema &S, QualType ConvType, QualType ToType, bool AllowObjCPointerConversion)
Determine whether this is an allowable conversion from the result of an explicit conversion operator ...
static bool isNonViableMultiVersionOverload(FunctionDecl *FD)
static ExprResult BuildConvertedConstantExpression(Sema &S, Expr *From, QualType T, Sema::CCEKind CCE, NamedDecl *Dest, APValue &PreNarrowingValue)
BuildConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static bool FunctionsCorrespond(ASTContext &Ctx, const FunctionDecl *X, const FunctionDecl *Y)
static ImplicitConversionSequence TryImplicitConversion(Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion, bool AllowObjCConversionOnExplicit)
TryImplicitConversion - Attempt to perform an implicit conversion from the given expression (Expr) to...
static bool IsVectorElementConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, Expr *From)
static ImplicitConversionSequence TryListConversion(Sema &S, InitListExpr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion)
TryListConversion - Try to copy-initialize a value of type ToType from the initializer list From.
static bool IsOverloadOrOverrideImpl(Sema &SemaRef, FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs, bool UseOverrideRules=false)
static QualType withoutUnaligned(ASTContext &Ctx, QualType T)
static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand)
CUDA: diagnose an invalid call across targets.
static void MaybeDiagnoseAmbiguousConstraints(Sema &S, ArrayRef< OverloadCandidate > Cands)
static bool diagnoseNoViableConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, UnresolvedSetImpl &ExplicitConversions)
static ImplicitConversionSequence TryContextuallyConvertToBool(Sema &S, Expr *From)
TryContextuallyConvertToBool - Attempt to contextually convert the expression From to bool (C++0x [co...
static ImplicitConversionSequence TryObjectArgumentInitialization(Sema &S, SourceLocation Loc, QualType FromType, Expr::Classification FromClassification, CXXMethodDecl *Method, const CXXRecordDecl *ActingContext, bool InOverloadResolution=false, QualType ExplicitParameterType=QualType(), bool SuppressUserConversion=false)
TryObjectArgumentInitialization - Try to initialize the object parameter of the given member function...
static bool recordConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, DeclAccessPair &Found)
static ImplicitConversionSequence::CompareKind CompareImplicitConversionSequences(Sema &S, SourceLocation Loc, const ImplicitConversionSequence &ICS1, const ImplicitConversionSequence &ICS2)
CompareImplicitConversionSequences - Compare two implicit conversion sequences to determine whether o...
static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool TakingCandidateAddress, LangAS CtorDestAS=LangAS::Default)
Generates a 'note' diagnostic for an overload candidate.
static ImplicitConversionSequence TryCopyInitialization(Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion, bool AllowExplicit=false)
TryCopyInitialization - Try to copy-initialize a value of type ToType from the expression From.
static ExprResult diagnoseAmbiguousConversion(Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter, QualType T, UnresolvedSetImpl &ViableConversions)
static void markUnaddressableCandidatesUnviable(Sema &S, OverloadCandidateSet &CS)
static QualType GetExplicitObjectType(Sema &S, const Expr *MemExprE)
static bool sameFunctionParameterTypeLists(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2)
We're allowed to use constraints partial ordering only if the candidates have the same parameter type...
static QualType AdjustAddressSpaceForBuiltinOperandType(Sema &S, QualType T, Expr *Arg)
Helper function for adjusting address spaces for the pointer or reference operands of builtin operato...
static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand)
static bool DiagnoseTwoPhaseLookup(Sema &SemaRef, SourceLocation FnLoc, const CXXScopeSpec &SS, LookupResult &R, OverloadCandidateSet::CandidateSetKind CSK, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, CXXRecordDecl **FoundInClass=nullptr)
Attempt to recover from an ill-formed use of a non-dependent name in a template, where the non-depend...
static bool isBetterReferenceBindingKind(const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
Determine whether one of the given reference bindings is better than the other based on what kind of ...
static bool canBeDeclaredInNamespace(const DeclarationName &Name)
Determine whether a declaration with the specified name could be moved into a different namespace.
static ExprResult finishContextualImplicitConversion(Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter)
static bool IsStandardConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle, bool AllowObjCWritebackConversion)
IsStandardConversion - Determines whether there is a standard conversion sequence (C++ [conv],...
static bool DiagnoseTwoPhaseOperatorLookup(Sema &SemaRef, OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args)
Attempt to recover from ill-formed use of a non-dependent operator in a template, where the non-depen...
static bool isNonTrivialObjCLifetimeConversion(Qualifiers FromQuals, Qualifiers ToQuals)
Determine whether the lifetime conversion between the two given qualifiers sets is nontrivial.
static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, unsigned I, bool TakingCandidateAddress)
static bool completeFunctionType(Sema &S, FunctionDecl *FD, SourceLocation Loc, bool Complain=true)
static bool shouldAddReversedEqEq(Sema &S, SourceLocation OpLoc, Expr *FirstOperand, FunctionDecl *EqFD)
static bool isFunctionAlwaysEnabled(const ASTContext &Ctx, const FunctionDecl *FD)
static bool PrepareExplicitObjectArgument(Sema &S, CXXMethodDecl *Method, Expr *Object, MultiExprArg &Args, SmallVectorImpl< Expr * > &NewArgs)
static OverloadingResult IsInitializerListConstructorConversion(Sema &S, Expr *From, QualType ToType, CXXRecordDecl *To, UserDefinedConversionSequence &User, OverloadCandidateSet &CandidateSet, bool AllowExplicit)
static bool checkAddressOfCandidateIsAvailable(Sema &S, const FunctionDecl *FD)
static bool IsFloatingPointConversion(Sema &S, QualType FromType, QualType ToType)
Determine whether the conversion from FromType to ToType is a valid floating point conversion.
static bool isFirstArgumentCompatibleWithType(ASTContext &Context, CXXConstructorDecl *Constructor, QualType Type)
static Comparison isBetterMultiversionCandidate(const OverloadCandidate &Cand1, const OverloadCandidate &Cand2)
static void NoteImplicitDeductionGuide(Sema &S, FunctionDecl *Fn)
static void collectViableConversionCandidates(Sema &SemaRef, Expr *From, QualType ToType, UnresolvedSetImpl &ViableConversions, OverloadCandidateSet &CandidateSet)
static ImplicitConversionSequence TryReferenceInit(Sema &S, Expr *Init, QualType DeclType, SourceLocation DeclLoc, bool SuppressUserConversions, bool AllowExplicit)
Compute an implicit conversion sequence for reference initialization.
static bool isNonDependentlyExplicit(FunctionTemplateDecl *FTD)
Determine whether a given function template has a simple explicit specifier or a non-value-dependent ...
static bool checkArgPlaceholdersForOverload(Sema &S, MultiExprArg Args, UnbridgedCastsSet &unbridged)
checkArgPlaceholdersForOverload - Check a set of call operands for placeholders.
static QualType makeQualifiedLValueReferenceType(QualType Base, QualifiersAndAtomic Quals, Sema &S)
static QualType chooseRecoveryType(OverloadCandidateSet &CS, OverloadCandidateSet::iterator *Best)
static void NoteSurrogateCandidate(Sema &S, OverloadCandidate *Cand)
static ExprResult BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MutableArrayRef< Expr * > Args, SourceLocation RParenLoc, bool EmptyLookup, bool AllowTypoCorrection)
Attempts to recover from a call where no functions were found.
static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand)
static bool diagnoseDiagnoseIfAttrsWith(Sema &S, const NamedDecl *ND, bool ArgDependent, SourceLocation Loc, CheckFn &&IsSuccessful)
static OverloadingResult IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType, UserDefinedConversionSequence &User, OverloadCandidateSet &Conversions, AllowedExplicit AllowExplicit, bool AllowObjCConversionOnExplicit)
Determines whether there is a user-defined conversion sequence (C++ [over.ics.user]) that converts ex...
static bool IsAcceptableNonMemberOperatorCandidate(ASTContext &Context, FunctionDecl *Fn, ArrayRef< Expr * > Args)
IsAcceptableNonMemberOperatorCandidate - Determine whether Fn is an acceptable non-member overloaded ...
static void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, DeductionFailureInfo &DeductionFailure, unsigned NumArgs, bool TakingCandidateAddress)
Diagnose a failed template-argument deduction.
static bool IsTransparentUnionStandardConversion(Sema &S, Expr *From, QualType &ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static const FunctionProtoType * tryGetFunctionProtoType(QualType FromType)
Attempts to get the FunctionProtoType from a Type.
static bool PrepareArgumentsForCallToObjectOfClassType(Sema &S, SmallVectorImpl< Expr * > &MethodArgs, CXXMethodDecl *Method, MultiExprArg Args, SourceLocation LParenLoc)
static TemplateDeductionResult DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch, PackFold PackFold=PackFold::ParameterToArgument)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
Allows QualTypes to be sorted and hence used in maps and sets.
C Language Family Type Representation.
A class for storing results from argument-dependent lookup.
void erase(NamedDecl *D)
Removes any data associated with a given decl.
llvm::mapped_iterator< decltype(Decls)::iterator, select_second > iterator
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible SVE vector types, false otherwise.
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
unsigned getIntWidth(QualType T) const
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
bool hasSimilarType(QualType T1, QualType T2)
Determine if two types are similar, according to the C++ rules.
QualType getMemberPointerType(QualType T, const Type *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
DeclarationNameTable DeclarationNames
QualType getRecordType(const RecordDecl *Decl) const
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool mergeExtParameterInfo(const FunctionProtoType *FirstFnType, const FunctionProtoType *SecondFnType, bool &CanUseFirst, bool &CanUseSecond, SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &NewParamInfos)
This function merges the ExtParameterInfo lists of two functions.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod, bool IsBuiltin=false) const
Retrieves the default calling convention for the current target.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
Builtin::Context & BuiltinInfo
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
QualType removePtrSizeAddrSpace(QualType T) const
Remove the existing address space on the type if it is a pointer size address space and return the ty...
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
bool canBindObjCObjectType(QualType To, QualType From)
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
const TargetInfo * getAuxTargetInfo() const
CanQualType UnsignedLongTy
bool hasAnyFunctionEffects() const
QualType getRestrictType(QualType T) const
Return the uniqued reference to the type for a restrict qualified type.
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
CanQualType BoundMemberTy
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
QualType getObjCIdType() const
Represents the Objective-CC id type.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
bool isSameTemplateParameterList(const TemplateParameterList *X, const TemplateParameterList *Y) const
Determine whether two template parameter lists are similar enough that they may be used in declaratio...
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
QualType getVolatileType(QualType T) const
Return the uniqued reference to the type for a volatile qualified type.
CanQualType UnsignedLongLongTy
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
CanQualType UnsignedShortTy
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
bool UnwrapSimilarTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true)
Attempt to unwrap two types that may be similar (C++ [conv.qual]).
bool areCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an SVE builtin and a VectorType that is a fixed-length representat...
QualType getCVRQualifiedType(QualType T, unsigned CVR) const
Return a type with additional const, volatile, or restrict qualifiers.
bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)
Return true if the given vector types are of the same unqualified type or if they are equivalent to t...
const TargetInfo & getTargetInfo() const
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
Attr - This represents one attribute.
A builtin binary operation expression such as "x + y" or "x <= y".
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
StringRef getOpcodeStr() const
bool isCompoundAssignmentOp() const
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
This class is used for builtin types like 'int'.
bool isDirectlyAddressable(unsigned ID) const
Determines whether this builtin can have its address taken with no special action required.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
bool isExplicit() const
Return true if the declaration is already resolved to be explicit.
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Represents a call to a member function that may be written either with member call syntax (e....
static CXXMemberCallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this method.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
QualType getThisType() const
Return the type of the this pointer.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
Qualifiers getMethodQualifiers() const
QualType getFunctionObjectParameterType() const
static CXXOperatorCallExpr * Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation OperatorLoc, FPOptionsOverride FPFeatures, ADLCallKind UsesADL=NotADL)
Represents a C++ struct/union/class.
bool isLambda() const
Determine whether this class describes a lambda function object.
llvm::iterator_range< conversion_iterator > getVisibleConversionFunctions() const
Get all conversion functions visible in current class, including conversion function templates.
bool hasDefinition() const
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
A rewritten comparison expression that was originally written using operator syntax.
Represents a C++ nested-name-specifier or a global scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
void markDependentForPostponedNameLookup()
Used by Sema to implement MSVC-compatible delayed name lookup.
static CallExpr * CreateTemporary(void *Mem, Expr *Fn, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, ADLCallKind UsesADL=NotADL)
Create a temporary call expression with no arguments in the memory pointed to by Mem.
static CanQual< Type > CreateUnsafe(QualType Other)
Builds a canonical type from a QualType.
CanProxy< U > castAs() const
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.
bool isAtLeastAsQualifiedAs(CanQual< T > Other) const
Determines whether this canonical type is at least as qualified as the Other canonical type.
bool isVolatileQualified() const
const ComparisonCategoryInfo * lookupInfoForType(QualType Ty) const
bool isPartial() const
True iff the comparison is not totally ordered.
bool isStrong() const
True iff the comparison is "strong".
Complex values, per C99 6.2.5p11.
QualType getElementType() const
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
Represents the canonical version of C arrays with a specified constant size.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
A reference to a declared variable, function, enum, etc.
void setHadMultipleCandidates(bool V=true)
Sets the flag telling whether this expression refers to a function that was resolved from an overload...
Decl - This represents one declaration (or definition), e.g.
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
unsigned getTemplateDepth() const
Determine the number of levels of template parameter surrounding this declaration.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
specific_attr_iterator< T > specific_attr_end() const
specific_attr_iterator< T > specific_attr_begin() const
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
DeclarationNameLoc - Additional source/type location info for a declaration name.
The name of a declaration.
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
SourceLocation getBeginLoc() const LLVM_READONLY
Expr * getTrailingRequiresClause()
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void overloadCandidatesShown(unsigned N)
Call this after showing N overload candidates.
unsigned getNumOverloadCandidatesToShow() const
When a call or operator fails, print out up to this many candidate overloads as suggestions.
OverloadsShown getShowOverloads() const
RAII object that enters a new expression evaluation context.
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
EnumDecl * getDecl() const
Store information needed for an explicit specifier.
bool isExplicit() const
Determine whether this specifier is known to correspond to an explicit declaration.
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(FunctionDecl *Function)
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
The return type of classify().
static Classification makeSimpleLValue()
Create a simple, modifiable lvalue.
This represents one expression.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
bool isIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
ExtVectorType - Extended vector type.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
const ParmVarDecl * getParamDecl(unsigned i) const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
bool hasCXXExplicitFunctionObjectParameter() const
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
param_iterator param_begin()
bool isVariadic() const
Whether this function is variadic.
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
bool isDeleted() const
Whether this function has been deleted.
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
unsigned getNumNonObjectParams() const
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
bool isDefaulted() const
Whether this function is defaulted.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isTargetMultiVersionDefault() const
True if this function is the default version of a multiversioned dispatch function as a part of the t...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Represents a prototype with parameter type info, e.g.
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
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
CallingConv getCallConv() const
QualType getReturnType() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
One of these records is kept for each identifier that is lexed.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
void dump() const
dump - Print this implicit conversion sequence to standard error.
bool isUserDefined() const
@ StaticObjectArgumentConversion
StandardConversionSequence Standard
When ConversionKind == StandardConversion, provides the details of the standard conversion sequence.
void setBad(BadConversionSequence::FailureKind Failure, Expr *FromExpr, QualType ToType)
Sets this sequence as a bad conversion for an explicit argument.
UserDefinedConversionSequence UserDefined
When ConversionKind == UserDefinedConversion, provides the details of the user-defined conversion seq...
static ImplicitConversionSequence getNullptrToBool(QualType SourceType, QualType DestType, bool NeedLValToRVal)
Form an "implicit" conversion sequence from nullptr_t to bool, for a direct-initialization of a bool ...
AmbiguousConversionSequence Ambiguous
When ConversionKind == AmbiguousConversion, provides the details of the ambiguous conversion.
bool hasInitializerListContainerType() const
unsigned getKindRank() const
Return a ranking of the implicit conversion sequence kind, where smaller ranks represent better conve...
bool isInitializerListOfIncompleteArray() const
BadConversionSequence Bad
When ConversionKind == BadConversion, provides the details of the bad conversion.
QualType getInitializerListContainerType() const
void DiagnoseAmbiguousConversion(Sema &S, SourceLocation CaretLoc, const PartialDiagnostic &PDiag) const
Diagnoses an ambiguous conversion.
Describes an C or C++ initializer list.
bool hasDesignatedInit() const
Determine whether this initializer list contains a designated initializer.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
const Expr * getInit(unsigned Init) const
SourceLocation getEndLoc() const LLVM_READONLY
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeTemplateParameter(QualType T, NonTypeTemplateParmDecl *Param)
Create the initialization entity for a template parameter.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
An lvalue reference type, per C++11 [dcl.ref].
bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const
Represents the results of name lookup.
void addAllDecls(const LookupResult &Other)
Add all the declarations from another set of lookup results.
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
DeclClass * getAsSingle() const
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
bool empty() const
Return true if no decls were found.
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
SourceLocation getNameLoc() const
Gets the location of the identifier.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
void suppressAccessDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup due to access control violat...
const UnresolvedSetImpl & asUnresolvedSet() const
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
DeclarationName getLookupName() const
Gets the name to look up.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
SourceLocation getMemberLoc() const
getMemberLoc - Return the location of the "member", in X->F, it is the location of 'F'.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
bool hasQualifier() const
Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...
bool performsVirtualDispatch(const LangOptions &LO) const
Returns true if virtual dispatch is performed.
NestedNameSpecifier * getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getExprLoc() const LLVM_READONLY
DeclAccessPair getFoundDecl() const
Retrieves the declaration found by lookup.
A pointer to member type per C++ 8.3.3 - Pointers to members.
QualType getPointeeType() const
const Type * getClass() const
Describes a module or submodule.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
This represents a decl that may have a name.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents an ObjC class declaration.
Interfaces are the core concept in Objective-C for object oriented design.
ObjCMethodDecl - Represents an instance or class method declaration.
ArrayRef< ParmVarDecl * > parameters() const
unsigned param_size() const
Represents a pointer to an Objective C object.
bool isSpecialized() const
Whether this type is specialized, meaning that it has type arguments.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
void clear(CandidateSetKind CSK)
Clear out all of the candidates.
bool isNewCandidate(Decl *F, OverloadCandidateParamOrder PO=OverloadCandidateParamOrder::Normal)
Determine when this overload candidate will be new to the overload set.
ConversionSequenceList allocateConversionSequences(unsigned NumConversions)
Allocate storage for conversion sequences for NumConversions conversions.
OverloadCandidate & addCandidate(unsigned NumConversions=0, ConversionSequenceList Conversions=std::nullopt)
Add a new candidate with NumConversions conversion sequence slots to the overload set.
OperatorRewriteInfo getRewriteInfo() const
@ CSK_AddressOfOverloadSet
C++ [over.match.call.general] Resolve a call through the address of an overload set.
@ CSK_InitByConstructor
C++ [over.match.ctor], [over.match.list] Initialization of an object of class type by constructor,...
@ CSK_InitByUserDefinedConversion
C++ [over.match.copy]: Copy-initialization of an object of class type by user-defined conversion.
@ CSK_Normal
Normal lookup.
@ CSK_Operator
C++ [over.match.oper]: Lookup of operator function candidates in a call using operator syntax.
SmallVectorImpl< OverloadCandidate >::iterator iterator
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
bool shouldDeferDiags(Sema &S, ArrayRef< Expr * > Args, SourceLocation OpLoc)
Whether diagnostics should be deferred.
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
void exclude(Decl *F)
Exclude a function from being considered by overload resolution.
SourceLocation getLocation() const
CandidateSetKind getKind() const
SmallVector< OverloadCandidate *, 32 > CompleteCandidates(Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, SourceLocation OpLoc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
NestedNameSpecifier * getQualifier() const
Fetches the nested-name qualifier, if one was given.
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
SourceLocation getNameLoc() const
Gets the location of the name.
decls_iterator decls_begin() const
unsigned getNumDecls() const
Gets the number of declarations in the unresolved set.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
decls_iterator decls_end() const
DeclarationName getName() const
Gets the name looked up.
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
ParenExpr - This represents a parenthesized expression, e.g.
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
bool isAtLeastAsQualifiedAs(QualType Other) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
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
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)
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()
void removeAddressSpace()
void setAddressSpace(LangAS space)
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B)
Returns true if address space A is equal to or a superset of B.
bool hasObjCGCAttr() const
ObjCLifetime getObjCLifetime() const
std::string getAsString() const
bool compatiblyIncludes(Qualifiers other) const
Determines if these qualifiers compatibly include another set.
LangAS getAddressSpace() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
field_range fields() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Scope - A scope is a transient data structure that is used while parsing the program.
Smart pointer class that efficiently represents Objective-C method names.
unsigned getNumArgs() const
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
bool IsAllowedCall(const FunctionDecl *Caller, const FunctionDecl *Callee)
Determines whether Caller may invoke Callee, based on their CUDA host/device attributes.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
bool inferTargetForImplicitSpecialMember(CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, CXXMethodDecl *MemberDecl, bool ConstRHS, bool Diagnose)
Given a implicit special member, infer its CUDA target from the calls it needs to make to underlying ...
static bool isImplicitHostDeviceFunction(const FunctionDecl *D)
void EraseUnwantedMatches(const FunctionDecl *Caller, llvm::SmallVectorImpl< std::pair< DeclAccessPair, FunctionDecl * > > &Matches)
Finds a function in Matches with highest calling priority from Caller context and erases all function...
CUDAFunctionPreference IdentifyPreference(const FunctionDecl *Caller, const FunctionDecl *Callee)
Identifies relative preference of a given Caller/Callee combination, based on their host/device attri...
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
Expr * stripARCUnbridgedCast(Expr *e)
stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast type, remove the placeholder cast.
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
virtual SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for one of the candidate conversions.
virtual SemaDiagnosticBuilder diagnoseNoMatch(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic complaining that the expression does not have integral or enumeration type.
virtual SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for the explicit conversion function.
virtual SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when the only matching conversion function is explicit.
virtual SemaDiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when we picked a conversion function (for cases when we are not allowed to pick a ...
virtual SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when there are multiple possible conversion functions.
virtual bool match(QualType T)=0
Determine whether the specified type is a valid destination type for this conversion.
virtual SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when the expression has incomplete class type.
For a defaulted function, the kind of defaulted function that it is.
bool isSpecialMember() const
bool isComparison() const
CXXSpecialMemberKind asSpecialMember() const
RAII class to control scope of DeferDiags.
bool match(QualType T) override
Match an integral or (possibly scoped) enumeration type.
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Sema - This implements semantic analysis and AST building for C.
ExprResult PerformImplicitObjectArgumentInitialization(Expr *From, NestedNameSpecifier *Qualifier, NamedDecl *FoundDecl, CXXMethodDecl *Method)
PerformObjectArgumentInitialization - Perform initialization of the implicit object parameter for the...
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function, const Expr *ThisArg, ArrayRef< const Expr * > Args, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any non-ArgDependent DiagnoseIf...
ExprResult PerformContextuallyConvertToObjCPointer(Expr *From)
PerformContextuallyConvertToObjCPointer - Perform a contextual conversion of the expression From to a...
bool buildOverloadedCallSet(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, MultiExprArg Args, SourceLocation RParenLoc, OverloadCandidateSet *CandidateSet, ExprResult *Result)
Constructs and populates an OverloadedCandidateSet from the given function.
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args=std::nullopt, DeclContext *LookupCtx=nullptr, TypoExpr **Out=nullptr)
Diagnose an empty lookup.
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
ExprResult BuildLiteralOperatorCall(LookupResult &R, DeclarationNameInfo &SuffixInfo, ArrayRef< Expr * > Args, SourceLocation LitEndLoc, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to a literal operator descri...
bool IsStringInit(Expr *Init, const ArrayType *AT)
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
void AddConversionCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
AddConversionCandidate - Add a C++ conversion function as a candidate in the candidate set (C++ [over...
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
void AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
Adds a conversion function template specialization candidate to the overload set, using template argu...
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
void AddBuiltinCandidate(QualType *ParamTys, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool IsAssignmentOperator=false, unsigned NumContextualBoolArguments=0)
AddBuiltinCandidate - Add a candidate for a built-in operator.
void AddArgumentDependentLookupCandidates(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, TemplateArgumentListInfo *ExplicitTemplateArgs, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add function candidates found via argument-dependent lookup to the set of overloading candidates.
ExprResult EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue)
EvaluateConvertedConstantExpression - Evaluate an Expression That is a converted constant expression ...
FPOptionsOverride CurFPFeatureOverrides()
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
DiagnosticsEngine & getDiagnostics() const
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
bool isObjCPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType, bool &IncompatibleObjC)
isObjCPointerConversion - Determines whether this is an Objective-C pointer conversion.
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
bool FunctionParamTypesAreEqual(ArrayRef< QualType > Old, ArrayRef< QualType > New, unsigned *ArgPos=nullptr, bool Reversed=false)
FunctionParamTypesAreEqual - This routine checks two function proto types for equality of their param...
ASTContext & getASTContext() const
UnresolvedSetIterator getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd, TemplateSpecCandidateSet &FailedCandidates, SourceLocation Loc, const PartialDiagnostic &NoneDiag, const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag, bool Complain=true, QualType TargetType=QualType())
Retrieve the most specialized of the given function template specializations.
bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType)
IsIntegralPromotion - Determines whether the conversion from the expression From (whose potentially-a...
bool IsFloatingPointPromotion(QualType FromType, QualType ToType)
IsFloatingPointPromotion - Determines whether the conversion from FromType to ToType is a floating po...
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction, const FunctionDecl *NewFunction, unsigned *ArgPos=nullptr, bool Reversed=false)
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr, const SourceRange &, DeclAccessPair FoundDecl)
QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType)
bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType, bool &IncompatibleObjC)
IsPointerConversion - Determines whether the conversion of the expression From, which has the (possib...
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
void DiagnoseUseOfDeletedFunction(SourceLocation Loc, SourceRange Range, DeclarationName Name, OverloadCandidateSet &CandidateSet, FunctionDecl *Fn, MultiExprArg Args, bool IsMember=false)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool IsComplexPromotion(QualType FromType, QualType ToType)
Determine if a conversion is a complex promotion.
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
bool IsBlockPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc, ArrayRef< Expr * > Args, AssociatedNamespaceSet &AssociatedNamespaces, AssociatedClassSet &AssociatedClasses)
Find the associated classes and namespaces for argument-dependent lookup for a call with the given se...
void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, OverloadCandidateParamOrder PO={})
Add a C++ member function template as a candidate to the candidate set, using template argument deduc...
bool isSameOrCompatibleFunctionType(QualType Param, QualType Arg)
Compare types for equality with respect to possibly compatible function types (noreturn adjustment,...
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
bool CheckMemberPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess)
CheckMemberPointerConversion - Check the member pointer conversion from the expression From to the ty...
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
const LangOptions & getLangOpts() const
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A, const NamedDecl *B)
Determine if A and B are equivalent internal linkage declarations from different modules,...
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult BuildSynthesizedThreeWayComparison(SourceLocation OpLoc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, FunctionDecl *DefaultedFn)
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
const LangOptions & LangOpts
bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType)
IsMemberPointerConversion - Determines whether the conversion of the expression From,...
ExprResult BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef< Expr * > Arg, SourceLocation RParenLoc, Expr *Config=nullptr, bool IsExecConfig=false, ADLCallKind UsesADL=ADLCallKind::NotADL)
BuildResolvedCallExpr - Build a call to a resolved expression, i.e.
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any ArgDependent DiagnoseIfAttr...
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
bool AreConstraintExpressionsEqual(const NamedDecl *Old, const Expr *OldConstr, const TemplateCompareNewDeclInfo &New, const Expr *NewConstr)
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false)
Returns the more specialized function template according to the rules of function template partial or...
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add the overload candidates named by callee and/or found by argument dependent lookup to the given ov...
bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(NamedDecl *D1, ArrayRef< const Expr * > AC1, NamedDecl *D2, ArrayRef< const Expr * > AC2)
If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...
ExprResult DefaultLvalueConversion(Expr *E)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
void NoteOverloadCandidate(const NamedDecl *Found, const FunctionDecl *Fn, OverloadCandidateRewriteKind RewriteKind=OverloadCandidateRewriteKind(), QualType DestType=QualType(), bool TakingAddress=false)
bool DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType)
FunctionDecl * resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult)
Given an expression that refers to an overloaded function, try to resolve that function to a single f...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ Compatible
Compatible - the types are compatible according to the standard.
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
EnableIfAttr * CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc, ArrayRef< Expr * > Args, bool MissingImplicitThis=false)
Check the enable_if expressions on the given function.
ExprResult CreateUnresolvedLookupExpr(CXXRecordDecl *NamingClass, NestedNameSpecifierLoc NNSLoc, DeclarationNameInfo DNI, const UnresolvedSetImpl &Fns, bool PerformADL=true)
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversion=false, OverloadCandidateParamOrder PO={})
AddMethodCandidate - Adds a named decl (which is some kind of method) as a method candidate to the gi...
void diagnoseEquivalentInternalLinkageDeclarations(SourceLocation Loc, const NamedDecl *D, ArrayRef< const NamedDecl * > Equiv)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
bool resolveAndFixAddressOfSingleOverloadCandidate(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false)
Given an overloaded function, tries to turn it into a non-overloaded function reference using resolve...
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
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=std::nullopt, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
bool anyAltivecTypes(QualType srcType, QualType destType)
bool isLaxVectorConversion(QualType srcType, QualType destType)
Is this a legal conversion between two types, one of which is known to be a vector type?
ExprResult BuildOverloadedCallExpr(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, bool AllowTypoCorrection=true, bool CalleesAddressIsTaken=false)
BuildOverloadedCallExpr - Given the call expression that calls Fn (which eventually refers to the dec...
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
ExprResult BuildCallToObjectOfClassType(Scope *S, Expr *Object, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc)
BuildCallToObjectOfClassType - Build a call to an object of class type (C++ [over....
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
bool CanPerformAggregateInitializationForOverloadResolution(const InitializedEntity &Entity, InitListExpr *From)
Determine whether we can perform aggregate initialization for the purposes of overload resolution.
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
CCEKind
Contexts in which a converted constant expression is required.
@ CCEK_ExplicitBool
Condition in an explicit(bool) specifier.
@ CCEK_Noexcept
Condition in a noexcept(bool) specifier.
@ CCEK_ArrayBound
Array bound in array declarator or new-expression.
@ CCEK_TemplateArg
Value of a non-type template parameter.
void AddFunctionCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, bool SuppressUserConversions=false, bool PartialOverloading=false, bool FirstArgumentIsBase=false)
Add all of the function declarations in the given function set to the overload candidate set.
bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose=true)
CheckPointerConversion - Check the pointer conversion from the expression From to the type ToType.
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void AddNonMemberOperatorCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
Add all of the non-member operator function declarations in the given function set to the overload ca...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, ReferenceConversions *Conv=nullptr)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
SourceManager & SourceMgr
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
NamespaceDecl * getStdNamespace() const
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
void AddSurrogateCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, const FunctionProtoType *Proto, Expr *Object, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddSurrogateCandidate - Adds a "surrogate" candidate function that converts the given Object to a fun...
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base)
Determine whether the type Derived is a C++ class that is derived from the type Base.
ForRangeStatus BuildForRangeBeginEndCall(SourceLocation Loc, SourceLocation RangeLoc, const DeclarationNameInfo &NameInfo, LookupResult &MemberLookup, OverloadCandidateSet *CandidateSet, Expr *Range, ExprResult *CallExpr)
Build a call to 'begin' or 'end' for a C++11 for-range statement.
ExprResult InitializeExplicitObjectArgument(Sema &S, Expr *Obj, FunctionDecl *Fun)
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method, SourceLocation CallLoc)
Returns true if the explicit object parameter was invalid.
bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType)
Helper function to determine whether this is the (deprecated) C++ conversion from a string literal to...
bool CheckNonDependentConversions(FunctionTemplateDecl *FunctionTemplate, ArrayRef< QualType > ParamTypes, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, ConversionSequenceList &Conversions, bool SuppressUserConversions, CXXRecordDecl *ActingContext=nullptr, QualType ObjectType=QualType(), Expr::Classification ObjectClassification={}, OverloadCandidateParamOrder PO={})
Check that implicit conversion sequences can be formed for each argument whose corresponding paramete...
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
bool IsFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy)
Determine whether the conversion from FromType to ToType is a valid conversion that strips "noexcept"...
void AddMemberOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, OverloadCandidateParamOrder PO={})
Add overload candidates for overloaded operators that are member functions.
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
void dump() const
dump - Print this standard conversion sequence to standard error.
void setFromType(QualType T)
DeclAccessPair FoundCopyConstructor
bool isIdentityConversion() const
unsigned BindsToRvalue
Whether we're binding to an rvalue.
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
QualType getFromType() const
ImplicitConversionKind First
First – The first conversion can be an lvalue-to-rvalue conversion, array-to-pointer conversion,...
unsigned BindsImplicitObjectArgumentWithoutRefQualifier
Whether this binds an implicit object argument to a non-static member function without a ref-qualifie...
unsigned ReferenceBinding
ReferenceBinding - True when this is a reference binding (C++ [over.ics.ref]).
void setAsIdentityConversion()
StandardConversionSequence - Set the standard conversion sequence to the identity conversion.
unsigned DeprecatedStringLiteralToCharPtr
Whether this is the deprecated conversion of a string literal to a pointer to non-const character dat...
CXXConstructorDecl * CopyConstructor
CopyConstructor - The copy constructor that is used to perform this conversion, when the conversion i...
unsigned IncompatibleObjC
IncompatibleObjC - Whether this is an Objective-C conversion that we should warn about (if we actuall...
unsigned ObjCLifetimeConversionBinding
Whether this binds a reference to an object with a different Objective-C lifetime qualifier.
ImplicitConversionKind Third
Third - The third conversion can be a qualification conversion or a function conversion.
unsigned QualificationIncludesObjCLifetime
Whether the qualification conversion involves a change in the Objective-C lifetime (for automatic ref...
void setToType(unsigned Idx, QualType T)
bool isPointerConversionToBool() const
isPointerConversionToBool - Determines whether this conversion is a conversion of a pointer or pointe...
void * ToTypePtrs[3]
ToType - The types that this conversion is converting to in each step.
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
unsigned IsLvalueReference
Whether this is an lvalue reference binding (otherwise, it's an rvalue reference binding).
ImplicitConversionKind Dimension
Dimension - Between the second and third conversion a vector or matrix dimension conversion may occur...
unsigned BindsToFunctionLvalue
Whether we're binding to a function lvalue.
unsigned DirectBinding
DirectBinding - True when this is a reference binding that is a direct binding (C++ [dcl....
ImplicitConversionRank getRank() const
getRank - Retrieve the rank of this standard conversion sequence (C++ 13.3.3.1.1p3).
bool isPointerConversionToVoidPointer(ASTContext &Context) const
isPointerConversionToVoidPointer - Determines whether this conversion is a conversion of a pointer to...
void setAllToTypes(QualType T)
QualType getToType(unsigned Idx) const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
StringRef getString() const
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
virtual bool hasIbm128Type() const
Determine whether the __ibm128 type is supported on this target.
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
A convenient class for passing around template argument information.
A template argument list.
Represents a template argument.
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
QualType getAsType() const
Retrieve the type for a type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
@ Template
The template argument is a template name that was provided for a template template parameter.
@ Pack
The template argument is actually a parameter pack.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl() const
Retrieve the underlying template declaration that this template name refers to, if known.
@ Template
A single template declaration.
bool hasAssociatedConstraints() const
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
SmallVector< TemplateSpecCandidate, 16 >::iterator iterator
void NoteCandidates(Sema &S, SourceLocation Loc)
NoteCandidates - When no template specialization match is found, prints diagnostic messages containin...
void clear()
Clear out all of the candidates.
SourceLocation getLocation() const
TemplateSpecCandidate & addCandidate()
Add a new candidate with NumConversions conversion sequence slots to the overload set.
Represents a type template specialization; the template must be a class template, a type alias templa...
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
const Type * getTypeForDecl() const
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isBlockPointerType() const
bool isBooleanType() const
bool isObjCBuiltinType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
bool isIncompleteArrayType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isFloat16Type() const
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
bool isRValueReferenceType() const
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
bool isConvertibleToFixedPointType() const
Return true if this can be converted to (or from) a fixed point type.
bool isArithmeticType() const
bool isPointerType() const
bool isArrayParameterType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isObjCObjectOrInterfaceType() const
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isLValueReferenceType() const
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const BuiltinType * getAsPlaceholderType() const
bool isMemberPointerType() const
bool isObjCIdType() const
bool isMatrixType() const
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isObjectType() const
Determine whether this type is an object type.
bool isBFloat16Type() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isVectorType() const
bool isObjCClassType() const
bool isRealFloatingType() const
Floating point categories.
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given unary opcode.
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
DeclarationName getMemberName() const
Retrieve the name of the member that this expression refers to.
QualType getBaseType() const
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getMemberLoc() const
Retrieve the location of the name of the member that this expression refers to.
A set of unresolved declarations.
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)
Provides information about an attempted template argument deduction, whose success or failure was des...
TemplateArgumentList * takeSugared()
Take ownership of the deduced template argument lists.
TemplateArgument SecondArg
The second template argument to which the template argument deduction failure refers.
TemplateParameter Param
The template parameter to which a template argument deduction failure refers.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
bool AggregateDeductionCandidateHasMismatchedArity
TemplateArgument FirstArg
The first template argument to which the template argument deduction failure refers.
ConstraintSatisfaction AssociatedConstraintsSatisfaction
The constraint satisfaction details resulting from the associated constraints satisfaction tests.
void takeSFINAEDiagnostic(PartialDiagnosticAt &PD)
Take ownership of the SFINAE diagnostic.
unsigned CallArgIndex
The index of the function argument that caused a deduction failure.
specific_attr_iterator - Iterates over a subrange of an AttrVec, only providing attributes that are o...
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
bool Ret(InterpState &S, CodePtr &PC, APValue &Result)
void checkExprLifetime(Sema &SemaRef, const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for initializing the ent...
The JSON file list parser is used to communicate input to InstallAPI.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
ImplicitConversionRank GetDimensionConversionRank(ImplicitConversionRank Base, ImplicitConversionKind Dimension)
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ ovl_fail_final_conversion_not_exact
This conversion function template specialization candidate is not viable because the final conversion...
@ ovl_fail_enable_if
This candidate function was not viable because an enable_if attribute disabled it.
@ ovl_fail_illegal_constructor
This conversion candidate was not considered because it is an illegal instantiation of a constructor ...
@ ovl_fail_bad_final_conversion
This conversion candidate is not viable because its result type is not implicitly convertible to the ...
@ ovl_fail_module_mismatched
This candidate was not viable because it has internal linkage and is from a different module unit tha...
@ ovl_fail_too_few_arguments
@ ovl_fail_addr_not_available
This candidate was not viable because its address could not be taken.
@ ovl_fail_too_many_arguments
@ ovl_non_default_multiversion_function
This candidate was not viable because it is a non-default multiversioned function.
@ ovl_fail_constraints_not_satisfied
This candidate was not viable because its associated constraints were not satisfied.
@ ovl_fail_bad_conversion
@ ovl_fail_bad_target
(CUDA) This candidate was not viable because the callee was not accessible from the caller's target (...
@ ovl_fail_inhctor_slice
This inherited constructor is not viable because it would slice the argument.
@ ovl_fail_object_addrspace_mismatch
This constructor/conversion candidate fail due to an address space mismatch between the object being ...
@ ovl_fail_explicit
This candidate constructor or conversion function is explicit but the context doesn't permit explicit...
@ ovl_fail_trivial_conversion
This conversion candidate was not considered because it duplicates the work of a trivial or derived-t...
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
ImplicitConversionRank
ImplicitConversionRank - The rank of an implicit conversion kind.
@ ICR_Conversion
Conversion.
@ ICR_Writeback_Conversion
ObjC ARC writeback conversion.
@ ICR_HLSL_Dimension_Reduction
HLSL Matching Dimension Reduction.
@ ICR_HLSL_Dimension_Reduction_Conversion
HLSL Dimension reduction with conversion.
@ ICR_HLSL_Scalar_Widening
HLSL Scalar Widening.
@ ICR_C_Conversion
Conversion only allowed in the C standard (e.g. void* to char*).
@ ICR_OCL_Scalar_Widening
OpenCL Scalar Widening.
@ ICR_Complex_Real_Conversion
Complex <-> Real conversion.
@ ICR_HLSL_Scalar_Widening_Conversion
HLSL Scalar Widening with conversion.
@ ICR_HLSL_Dimension_Reduction_Promotion
HLSL Dimension reduction with promotion.
@ ICR_Promotion
Promotion.
@ ICR_Exact_Match
Exact Match.
@ ICR_C_Conversion_Extension
Conversion not allowed by the C standard, but that we accept as an extension anyway.
@ ICR_HLSL_Scalar_Widening_Promotion
HLSL Scalar Widening with promotion.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_ViableCandidates
Requests that only viable candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
OverloadsShown
Specifies which overload candidates to display when overload resolution fails.
@ Ovl_Best
Show just the "best" overload candidates.
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
OverloadCandidateRewriteKind
The kinds of rewrite we perform on overload candidates.
@ CRK_Reversed
Candidate is a rewritten candidate with a reversed order of parameters.
@ CRK_None
Candidate is not a rewritten candidate.
@ CRK_DifferentOperator
Candidate is a rewritten candidate with a different operator name.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Result
The result type of a method or function.
ImplicitConversionKind
ImplicitConversionKind - The kind of implicit conversion used to convert an argument to a parameter's...
@ ICK_Complex_Conversion
Complex conversions (C99 6.3.1.6)
@ ICK_Floating_Promotion
Floating point promotions (C++ [conv.fpprom])
@ ICK_Boolean_Conversion
Boolean conversions (C++ [conv.bool])
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
@ ICK_Fixed_Point_Conversion
Fixed point type conversions according to N1169.
@ ICK_Vector_Conversion
Vector conversions.
@ ICK_Block_Pointer_Conversion
Block Pointer conversions.
@ ICK_Pointer_Member
Pointer-to-member conversions (C++ [conv.mem])
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
@ ICK_HLSL_Array_RValue
HLSL non-decaying array rvalue cast.
@ ICK_SVE_Vector_Conversion
Arm SVE Vector conversions.
@ ICK_HLSL_Vector_Truncation
HLSL vector truncation.
@ ICK_Incompatible_Pointer_Conversion
C-only conversion between pointers with incompatible types.
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
@ ICK_RVV_Vector_Conversion
RISC-V RVV Vector conversions.
@ ICK_Complex_Promotion
Complex promotions (Clang extension)
@ ICK_Num_Conversion_Kinds
The number of conversion kinds.
@ ICK_Function_Conversion
Function pointer conversion (C++17 [conv.fctptr])
@ ICK_Vector_Splat
A vector splat from an arithmetic type.
@ ICK_Zero_Queue_Conversion
Zero constant to queue.
@ ICK_Identity
Identity conversion (no conversion)
@ ICK_Derived_To_Base
Derived-to-base (C++ [over.best.ics])
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
@ ICK_Qualification
Qualification conversions (C++ [conv.qual])
@ ICK_Pointer_Conversion
Pointer conversions (C++ [conv.ptr])
@ ICK_TransparentUnionConversion
Transparent Union Conversions.
@ ICK_Integral_Promotion
Integral promotions (C++ [conv.prom])
@ ICK_Floating_Conversion
Floating point conversions (C++ [conv.double].
@ ICK_Compatible_Conversion
Conversions between compatible types in C99.
@ ICK_C_Only_Conversion
Conversions allowed in C, but not C++.
@ ICK_Writeback_Conversion
Objective-C ARC writeback conversion.
@ ICK_Zero_Event_Conversion
Zero constant to event (OpenCL1.2 6.12.10)
@ ICK_Complex_Real
Complex-real conversions (C99 6.3.1.7)
@ ICK_Function_To_Pointer
Function-to-pointer (C++ [conv.array])
ActionResult< Expr * > ExprResult
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
CXXSpecialMemberKind
Kinds of C++ special members.
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool isBetterOverloadCandidate(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2, SourceLocation Loc, OverloadCandidateSet::CandidateSetKind Kind)
isBetterOverloadCandidate - Determines whether the first overload candidate is a better candidate tha...
const FunctionProtoType * T
bool shouldEnforceArgLimit(bool PartialOverloading, FunctionDecl *Function)
NarrowingKind
NarrowingKind - The kind of narrowing conversion being performed by a standard conversion sequence ac...
@ NK_Not_Narrowing
Not a narrowing conversion.
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
@ TPOC_Conversion
Partial ordering of function templates for a call to a conversion function.
@ TPOC_Call
Partial ordering of function templates for a function call.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
TemplateDeductionResult
Describes the result of template argument deduction.
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
@ CUDATargetMismatch
CUDA Target attributes do not match.
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ Invalid
The declaration was invalid; do nothing.
@ Success
Template argument deduction was successful.
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
@ AlreadyDiagnosed
Some error which was already diagnosed.
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
CallingConv
CallingConv - Specifies the calling convention that a function uses.
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
ConstructorInfo getConstructorInfo(NamedDecl *ND)
@ None
The alignment was not explicit in code.
ImplicitConversionRank GetConversionRank(ImplicitConversionKind Kind)
GetConversionRank - Retrieve the implicit conversion rank corresponding to the given implicit convers...
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ EST_None
no exception specification
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
__DEVICE__ _Tp abs(const std::complex< _Tp > &__c)
Represents an ambiguous user-defined conversion sequence.
ConversionSet::const_iterator const_iterator
ConversionSet & conversions()
void setFromType(QualType T)
void setToType(QualType T)
void addConversion(NamedDecl *Found, FunctionDecl *D)
SmallVector< std::pair< NamedDecl *, FunctionDecl * >, 4 > ConversionSet
void copyFrom(const AmbiguousConversionSequence &)
QualType getToType() const
QualType getFromType() const
OverloadFixItKind Kind
The type of fix applied.
unsigned NumConversionsFixed
The number of Conversions fixed.
void setConversionChecker(TypeComparisonFuncTy Foo)
Resets the default conversion checker method.
std::vector< FixItHint > Hints
The list of Hints generated so far.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
const DeclarationNameLoc & getInfo() const
SourceLocation getCXXLiteralOperatorNameLoc() const
getCXXLiteralOperatorNameLoc - Returns the location of the literal operator name (not the operator ke...
A structure used to record information about a failed template argument deduction,...
void * Data
Opaque pointer containing additional data about this deduction failure.
const TemplateArgument * getSecondArg()
Return the second template argument this deduction failure refers to, if any.
unsigned Result
A Sema::TemplateDeductionResult.
PartialDiagnosticAt * getSFINAEDiagnostic()
Retrieve the diagnostic which caused this deduction failure, if any.
std::optional< unsigned > getCallArgIndex()
Return the index of the call argument that this deduction failure refers to, if any.
unsigned HasDiagnostic
Indicates whether a diagnostic is stored in Diagnostic.
TemplateDeductionResult getResult() const
void Destroy()
Free any memory associated with this deduction failure.
char Diagnostic[sizeof(PartialDiagnosticAt)]
A diagnostic indicating why deduction failed.
TemplateParameter getTemplateParameter()
Retrieve the template parameter this deduction failure refers to, if any.
TemplateArgumentList * getTemplateArgumentList()
Retrieve the template argument list associated with this deduction failure, if any.
const TemplateArgument * getFirstArg()
Return the first template argument this deduction failure refers to, if any.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
Information about operator rewrites to consider when adding operator functions to a candidate set.
bool shouldAddReversed(Sema &S, ArrayRef< Expr * > OriginalArgs, FunctionDecl *FD)
Determine whether we should add a rewritten candidate for FD with reversed parameter order.
bool allowsReversed(OverloadedOperatorKind Op)
Determine whether reversing parameter order is allowed for operator Op.
bool AllowRewrittenCandidates
Whether we should include rewritten candidates in the overload set.
bool isReversible()
Determines whether this operator could be implemented by a function with reversed parameter order.
bool isAcceptableCandidate(const FunctionDecl *FD)
OverloadCandidateRewriteKind getRewriteKind(const FunctionDecl *FD, OverloadCandidateParamOrder PO)
Determine the kind of rewrite that should be performed for this candidate.
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
CallExpr::ADLCallKind IsADLCandidate
True if the candidate was found using ADL.
bool TryToFixBadConversion(unsigned Idx, Sema &S)
bool NotValidBecauseConstraintExprHasError() const
bool 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.
bool IgnoreObjectArgument
IgnoreObjectArgument - True to indicate that the first argument's conversion, which for this function...
DeclAccessPair FoundDecl
FoundDecl - The original declaration that was looked up / invented / otherwise found,...
FunctionDecl * Function
Function - The actual function that this candidate represents.
bool Viable
Viable - True to indicate that this overload candidate is viable.
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.
StandardConversionSequence FinalConversion
FinalConversion - For a conversion function (where Function is a CXXConversionDecl),...
unsigned getNumParams() const
unsigned ExplicitCallArguments
The number of call arguments that were explicitly provided, to be used while performing partial order...
unsigned char FailureKind
FailureKind - The reason why this candidate is not viable.
ConversionSequenceList Conversions
The conversion sequences used to convert the function arguments to the function parameters.
bool TookAddressOfOverload
DeductionFailureInfo DeductionFailure
bool Best
Whether this candidate is the best viable function, or tied for being the best viable function.
CXXConversionDecl * Surrogate
Surrogate - The conversion function for which this candidate is a surrogate, but only if IsSurrogate ...
OverloadCandidateRewriteKind getRewriteKind() const
Get RewriteKind value in OverloadCandidateRewriteKind type (This function is to workaround the spurio...
bool HasFormOfMemberPointer
OverloadExpr * Expression
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
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.
ReferenceConversions
The conversions that would be performed on an lvalue of type T2 when binding a reference of type T1 t...
Abstract class used to diagnose incomplete types.
TemplateSpecCandidate - This is a generalization of OverloadCandidate which keeps track of template a...
void NoteDeductionFailure(Sema &S, bool ForTakingAddress)
Diagnose a template argument deduction failure.
DeductionFailureInfo DeductionFailure
Template argument deduction info.
Decl * Specialization
Specialization - The actual specialization that this candidate represents.
void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)
UserDefinedConversionSequence - Represents a user-defined conversion sequence (C++ 13....
StandardConversionSequence Before
Represents the standard conversion that occurs before the actual user-defined conversion.
FunctionDecl * ConversionFunction
ConversionFunction - The function that will perform the user-defined conversion.
bool HadMultipleCandidates
HadMultipleCandidates - When this is true, it means that the conversion function was resolved from an...
StandardConversionSequence After
After - Represents the standard conversion that occurs after the actual user-defined conversion.
bool EllipsisConversion
EllipsisConversion - When this is true, it means user-defined conversion sequence starts with a ....
DeclAccessPair FoundConversionFunction
The declaration that we found via name lookup, which might be the same as ConversionFunction or it mi...
void dump() const
dump - Print this user-defined conversion sequence to standard error.
Describes an entity that is being assigned.