38#include "llvm/ADT/DenseSet.h"
39#include "llvm/ADT/STLExtras.h"
40#include "llvm/ADT/STLForwardCompat.h"
41#include "llvm/ADT/ScopeExit.h"
42#include "llvm/ADT/SmallPtrSet.h"
43#include "llvm/ADT/SmallVector.h"
57 return P->hasAttr<PassObjectSizeAttr>();
78 if (HadMultipleCandidates)
89 CK_FunctionToPointerDecay);
93 bool InOverloadResolution,
96 bool AllowObjCWritebackConversion);
100 bool InOverloadResolution,
108 bool AllowObjCConversionOnExplicit);
171 return Rank[(int)Kind];
196 static const char *
const Name[] = {
200 "Function-to-pointer",
201 "Function pointer conversion",
203 "Integral promotion",
204 "Floating point promotion",
206 "Integral conversion",
207 "Floating conversion",
208 "Complex conversion",
209 "Floating-integral conversion",
210 "Pointer conversion",
211 "Pointer-to-member conversion",
212 "Boolean conversion",
213 "Compatible-types conversion",
214 "Derived-to-base conversion",
216 "SVE Vector conversion",
217 "RVV Vector conversion",
219 "Complex-real conversion",
220 "Block Pointer conversion",
221 "Transparent Union Conversion",
222 "Writeback conversion",
223 "OpenCL Zero Event Conversion",
224 "OpenCL Zero Queue Conversion",
225 "C specific type conversion",
226 "Incompatible pointer conversion",
227 "Fixed point conversion",
228 "HLSL vector truncation",
229 "HLSL matrix truncation",
230 "Non-decaying array conversion",
308 FromType = Context.getArrayDecayedType(FromType);
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 = ED->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 llvm::APFloat::opStatus Status =
Result.convertToInteger(
420 ConvertedValue, llvm::APFloat::rmTowardZero, &ignored);
423 if (Status == llvm::APFloat::opInvalidOp ||
424 *IntConstantValue != ConvertedValue) {
425 ConstantValue =
APValue(*IntConstantValue);
452 Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue)) {
455 ConstantValue = R.
Val;
456 assert(ConstantValue.
isFloat());
457 llvm::APFloat FloatVal = ConstantValue.
getFloat();
460 llvm::APFloat Converted = FloatVal;
461 llvm::APFloat::opStatus ConvertStatus =
463 llvm::APFloat::rmNearestTiesToEven, &ignored);
465 llvm::APFloat::rmNearestTiesToEven, &ignored);
467 if (FloatVal.isNaN() && Converted.isNaN() &&
468 !FloatVal.isSignaling() && !Converted.isSignaling()) {
474 if (!Converted.bitwiseIsEqual(FloatVal)) {
481 if (ConvertStatus & llvm::APFloat::opOverflow) {
503 IntegralConversion: {
511 constexpr auto CanRepresentAll = [](
bool FromSigned,
unsigned FromWidth,
512 bool ToSigned,
unsigned ToWidth) {
513 return (FromWidth < ToWidth + (FromSigned == ToSigned)) &&
514 !(FromSigned && !ToSigned);
517 if (CanRepresentAll(FromSigned, FromWidth, ToSigned, ToWidth))
523 bool DependentBitField =
false;
525 if (BitField->getBitWidth()->isValueDependent())
526 DependentBitField =
true;
527 else if (
unsigned BitFieldWidth = BitField->getBitWidthValue();
528 BitFieldWidth < FromWidth) {
529 if (CanRepresentAll(FromSigned, BitFieldWidth, ToSigned, ToWidth))
533 FromWidth = BitFieldWidth;
541 std::optional<llvm::APSInt> OptInitializerValue =
543 if (!OptInitializerValue) {
547 if (DependentBitField && !(FromSigned && !ToSigned))
553 llvm::APSInt &InitializerValue = *OptInitializerValue;
554 bool Narrowing =
false;
555 if (FromWidth < ToWidth) {
558 if (InitializerValue.isSigned() && InitializerValue.isNegative())
564 InitializerValue.extend(InitializerValue.getBitWidth() + 1);
566 llvm::APSInt ConvertedValue = InitializerValue;
567 ConvertedValue = ConvertedValue.trunc(ToWidth);
568 ConvertedValue.setIsSigned(ToSigned);
569 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
570 ConvertedValue.setIsSigned(InitializerValue.isSigned());
572 if (ConvertedValue != InitializerValue)
577 ConstantValue =
APValue(InitializerValue);
593 ConstantValue = R.
Val;
594 assert(ConstantValue.
isFloat());
595 llvm::APFloat FloatVal = ConstantValue.
getFloat();
600 if (FloatVal.isNaN() && FloatVal.isSignaling()) {
616 raw_ostream &OS = llvm::errs();
617 bool PrintedSomething =
false;
620 PrintedSomething =
true;
624 if (PrintedSomething) {
630 OS <<
" (by copy constructor)";
632 OS <<
" (direct reference binding)";
634 OS <<
" (reference binding)";
636 PrintedSomething =
true;
640 if (PrintedSomething) {
644 PrintedSomething =
true;
647 if (!PrintedSomething) {
648 OS <<
"No conversions required";
655 raw_ostream &OS = llvm::errs();
663 OS <<
"aggregate initialization";
673 raw_ostream &OS = llvm::errs();
675 OS <<
"Worst list element conversion: ";
676 switch (ConversionKind) {
678 OS <<
"Standard conversion: ";
682 OS <<
"User-defined conversion: ";
686 OS <<
"Ellipsis conversion";
689 OS <<
"Ambiguous conversion";
692 OS <<
"Bad conversion";
717 struct DFIArguments {
723 struct DFIParamWithArguments : DFIArguments {
728 struct DFIDeducedMismatchArgs : DFIArguments {
729 TemplateArgumentList *TemplateArgs;
730 unsigned CallArgIndex;
735 TemplateArgumentList *TemplateArgs;
736 ConstraintSatisfaction Satisfaction;
747 Result.Result =
static_cast<unsigned>(TDK);
748 Result.HasDiagnostic =
false;
767 auto *Saved =
new (Context) DFIDeducedMismatchArgs;
778 DFIArguments *Saved =
new (Context) DFIArguments;
790 DFIParamWithArguments *Saved =
new (Context) DFIParamWithArguments;
791 Saved->Param = Info.
Param;
804 Result.HasDiagnostic =
true;
809 CNSInfo *Saved =
new (Context) CNSInfo;
819 llvm_unreachable(
"not a deduction failure");
852 Diag->~PartialDiagnosticAt();
859 static_cast<CNSInfo *
>(
Data)->Satisfaction.~ConstraintSatisfaction();
862 Diag->~PartialDiagnosticAt();
898 return TemplateParameter::getFromOpaqueValue(
Data);
903 return static_cast<DFIParamWithArguments*
>(
Data)->Param;
933 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->TemplateArgs;
939 return static_cast<CNSInfo*
>(
Data)->TemplateArgs;
971 return &
static_cast<DFIArguments*
>(
Data)->FirstArg;
1003 return &
static_cast<DFIArguments*
>(
Data)->SecondArg;
1018 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->CallArgIndex;
1021 return std::nullopt;
1034 for (
unsigned I = 0; I <
X->getNumParams(); ++I)
1038 if (
auto *FTX =
X->getDescribedFunctionTemplate()) {
1043 FTY->getTemplateParameters()))
1052 OverloadedOperatorKind::OO_EqualEqual);
1064 OverloadedOperatorKind::OO_ExclaimEqual);
1082 auto *NotEqFD = Op->getAsFunction();
1083 if (
auto *UD = dyn_cast<UsingShadowDecl>(Op))
1084 NotEqFD = UD->getUnderlyingDecl()->getAsFunction();
1097 return Op == OO_EqualEqual || Op == OO_Spaceship;
1105 if (Op == OverloadedOperatorKind::OO_EqualEqual) {
1106 assert(OriginalArgs.size() == 2);
1108 S,
OpLoc, OriginalArgs[1], FD))
1119void OverloadCandidateSet::destroyCandidates() {
1120 for (
iterator i = Candidates.begin(), e = Candidates.end(); i != e; ++i) {
1121 for (
auto &
C : i->Conversions)
1122 C.~ImplicitConversionSequence();
1124 i->DeductionFailure.Destroy();
1129 destroyCandidates();
1130 SlabAllocator.Reset();
1131 NumInlineBytesUsed = 0;
1135 FirstDeferredCandidate =
nullptr;
1136 DeferredCandidatesCount = 0;
1137 HasDeferredTemplateConstructors =
false;
1138 ResolutionByPerfectCandidateIsDisabled =
false;
1142 class UnbridgedCastsSet {
1152 Entry entry = { &E, E };
1153 Entries.push_back(entry);
1158 for (SmallVectorImpl<Entry>::iterator
1159 i = Entries.begin(), e = Entries.end(); i != e; ++i)
1160 *i->Addr = i->Saved;
1174 UnbridgedCastsSet *unbridgedCasts =
nullptr) {
1178 if (placeholder->getKind() == BuiltinType::Overload)
return false;
1182 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
1184 unbridgedCasts->save(S, E);
1204 UnbridgedCastsSet &unbridged) {
1205 for (
unsigned i = 0, e = Args.size(); i != e; ++i)
1214 bool NewIsUsingDecl) {
1219 bool OldIsUsingDecl =
false;
1221 OldIsUsingDecl =
true;
1225 if (NewIsUsingDecl)
continue;
1232 if ((OldIsUsingDecl || NewIsUsingDecl) && !
isVisible(*I))
1240 bool UseMemberUsingDeclRules =
1241 (OldIsUsingDecl || NewIsUsingDecl) &&
CurContext->isRecord() &&
1242 !
New->getFriendObjectKind();
1246 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
1252 !shouldLinkPossiblyHiddenDecl(*I,
New))
1271 }
else if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(OldD)) {
1278 if (UUD->getQualifier().isDependent() && !UUD->isCXXClassMember()) {
1306 if (
New->getFriendObjectKind() &&
New->getQualifier() &&
1307 !
New->getDescribedFunctionTemplate() &&
1308 !
New->getDependentSpecializationInfo() &&
1309 !
New->getType()->isDependentType()) {
1314 New->setInvalidDecl();
1326 assert(D &&
"function decl should not be null");
1327 if (
auto *A = D->
getAttr<AttrT>())
1328 return !A->isImplicit();
1334 bool UseMemberUsingDeclRules,
1335 bool ConsiderCudaAttrs,
1336 bool UseOverrideRules =
false) {
1342 if (
New->isMSVCRTEntryPoint())
1353 if ((OldTemplate ==
nullptr) != (NewTemplate ==
nullptr))
1376 if (OldQType != NewQType && OldType->isVariadic() != NewType->isVariadic())
1380 if ((
New->isMemberLikeConstrainedFriend() ||
1391 OldDecl = OldTemplate;
1392 NewDecl = NewTemplate;
1410 bool ConstraintsInTemplateHead =
1421 if (UseMemberUsingDeclRules && ConstraintsInTemplateHead &&
1422 !SameTemplateParameterList)
1424 if (!UseMemberUsingDeclRules &&
1425 (!SameTemplateParameterList || !SameReturnType))
1429 const auto *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1430 const auto *NewMethod = dyn_cast<CXXMethodDecl>(
New);
1432 int OldParamsOffset = 0;
1433 int NewParamsOffset = 0;
1441 if (ThisType.isConstQualified())
1461 BS.
Quals = NormalizeQualifiers(OldMethod, BS.
Quals);
1462 DS.Quals = NormalizeQualifiers(NewMethod, DS.Quals);
1464 if (OldMethod->isExplicitObjectMemberFunction()) {
1466 DS.Quals.removeVolatile();
1469 return BS.
Quals == DS.Quals;
1473 auto BS =
Base.getNonReferenceType().getCanonicalType().split();
1474 auto DS = D.getNonReferenceType().getCanonicalType().split();
1476 if (!AreQualifiersEqual(BS, DS))
1479 if (OldMethod->isImplicitObjectMemberFunction() &&
1480 OldMethod->getParent() != NewMethod->getParent()) {
1492 if (
Base->isLValueReferenceType())
1493 return D->isLValueReferenceType();
1494 return Base->isRValueReferenceType() == D->isRValueReferenceType();
1499 auto DiagnoseInconsistentRefQualifiers = [&]() {
1500 if (SemaRef.
LangOpts.CPlusPlus23 && !UseOverrideRules)
1502 if (OldMethod->getRefQualifier() == NewMethod->getRefQualifier())
1504 if (OldMethod->isExplicitObjectMemberFunction() ||
1505 NewMethod->isExplicitObjectMemberFunction())
1507 if (!UseMemberUsingDeclRules && (OldMethod->getRefQualifier() ==
RQ_None ||
1508 NewMethod->getRefQualifier() ==
RQ_None)) {
1509 SemaRef.
Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
1510 << NewMethod->getRefQualifier() << OldMethod->getRefQualifier();
1511 SemaRef.
Diag(OldMethod->getLocation(), diag::note_previous_declaration);
1517 if (OldMethod && OldMethod->isExplicitObjectMemberFunction())
1519 if (NewMethod && NewMethod->isExplicitObjectMemberFunction())
1522 if (OldType->getNumParams() - OldParamsOffset !=
1523 NewType->getNumParams() - NewParamsOffset ||
1525 {OldType->param_type_begin() + OldParamsOffset,
1526 OldType->param_type_end()},
1527 {NewType->param_type_begin() + NewParamsOffset,
1528 NewType->param_type_end()},
1533 if (OldMethod && NewMethod && !OldMethod->isStatic() &&
1534 !NewMethod->isStatic()) {
1535 bool HaveCorrespondingObjectParameters = [&](
const CXXMethodDecl *Old,
1537 auto NewObjectType =
New->getFunctionObjectParameterReferenceType();
1541 return F->getRefQualifier() ==
RQ_None &&
1542 !F->isExplicitObjectMemberFunction();
1545 if (IsImplicitWithNoRefQual(Old) != IsImplicitWithNoRefQual(
New) &&
1546 CompareType(OldObjectType.getNonReferenceType(),
1547 NewObjectType.getNonReferenceType()))
1549 return CompareType(OldObjectType, NewObjectType);
1550 }(OldMethod, NewMethod);
1552 if (!HaveCorrespondingObjectParameters) {
1553 if (DiagnoseInconsistentRefQualifiers())
1558 if (!UseOverrideRules || (!NewMethod->isExplicitObjectMemberFunction() &&
1559 !OldMethod->isExplicitObjectMemberFunction()))
1564 if (!UseOverrideRules &&
1568 if (!NewRC != !OldRC)
1578 if (NewMethod && OldMethod && OldMethod->isImplicitObjectMemberFunction() &&
1579 NewMethod->isImplicitObjectMemberFunction()) {
1580 if (DiagnoseInconsistentRefQualifiers())
1594 NewI =
New->specific_attr_begin<EnableIfAttr>(),
1595 NewE =
New->specific_attr_end<EnableIfAttr>(),
1598 NewI != NewE || OldI != OldE; ++NewI, ++OldI) {
1599 if (NewI == NewE || OldI == OldE)
1601 llvm::FoldingSetNodeID NewID, OldID;
1602 NewI->getCond()->Profile(NewID, SemaRef.
Context,
true);
1603 OldI->getCond()->Profile(OldID, SemaRef.
Context,
true);
1609 if (SemaRef.
getLangOpts().CUDA && ConsiderCudaAttrs) {
1617 "Unexpected invalid target.");
1621 if (NewTarget != OldTarget) {
1624 if (OldMethod && NewMethod && OldMethod->isVirtual() &&
1625 OldMethod->isConstexpr() && !NewMethod->isConstexpr() &&
1643 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1649 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1662 bool SuppressUserConversions,
1664 bool InOverloadResolution,
1666 bool AllowObjCWritebackConversion,
1667 bool AllowObjCConversionOnExplicit) {
1670 if (SuppressUserConversions) {
1681 Conversions, AllowExplicit,
1682 AllowObjCConversionOnExplicit)) {
1703 bool FromListInit =
false;
1704 if (
const auto *InitList = dyn_cast<InitListExpr>(From);
1705 InitList && InitList->getNumInits() == 1 &&
1707 const Expr *SingleInit = InitList->getInit(0);
1708 FromType = SingleInit->
getType();
1710 FromListInit =
true;
1719 if ((FromCanon == ToCanon ||
1731 if (ToCanon != FromCanon)
1742 Cand != Conversions.
end(); ++Cand)
1783static ImplicitConversionSequence
1785 bool SuppressUserConversions,
1787 bool InOverloadResolution,
1789 bool AllowObjCWritebackConversion,
1790 bool AllowObjCConversionOnExplicit) {
1793 ICS.
Standard, CStyle, AllowObjCWritebackConversion)){
1839 bool CanConvert =
false;
1845 FromResType->getWrappedType()) &&
1847 FromResType->getContainedType()) &&
1848 ToResType->getAttrs() == FromResType->getAttrs())
1850 }
else if (ToTy->isHLSLResourceType()) {
1864 AllowExplicit, InOverloadResolution, CStyle,
1865 AllowObjCWritebackConversion,
1866 AllowObjCConversionOnExplicit);
1869ImplicitConversionSequence
1871 bool SuppressUserConversions,
1873 bool InOverloadResolution,
1875 bool AllowObjCWritebackConversion) {
1876 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1877 AllowExplicit, InOverloadResolution, CStyle,
1878 AllowObjCWritebackConversion,
1884 bool AllowExplicit) {
1889 bool AllowObjCWritebackConversion =
1896 *
this, From, ToType,
1898 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1900 false, AllowObjCWritebackConversion,
1914 if (
Context.hasSameUnqualifiedType(FromType, ToType))
1927 if (TyClass != CanFrom->getTypeClass())
return false;
1928 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1929 if (TyClass == Type::Pointer) {
1932 }
else if (TyClass == Type::BlockPointer) {
1935 }
else if (TyClass == Type::MemberPointer) {
1942 CanTo = ToMPT->getPointeeType();
1948 TyClass = CanTo->getTypeClass();
1949 if (TyClass != CanFrom->getTypeClass())
return false;
1950 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1960 bool Changed =
false;
1968 const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn);
1969 const auto *ToFPT = dyn_cast<FunctionProtoType>(ToFn);
1971 if (FromFPT && ToFPT) {
1972 if (FromFPT->hasCFIUncheckedCallee() != ToFPT->hasCFIUncheckedCallee()) {
1974 FromFPT->getReturnType(), FromFPT->getParamTypes(),
1975 FromFPT->getExtProtoInfo().withCFIUncheckedCallee(
1976 ToFPT->hasCFIUncheckedCallee()));
1984 if (FromFPT && ToFPT) {
1985 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
1997 bool CanUseToFPT, CanUseFromFPT;
1998 if (
Context.mergeExtParameterInfo(ToFPT, FromFPT, CanUseToFPT,
1999 CanUseFromFPT, NewParamInfos) &&
2000 CanUseToFPT && !CanUseFromFPT) {
2003 NewParamInfos.empty() ?
nullptr : NewParamInfos.data();
2005 FromFPT->getParamTypes(), ExtInfo);
2010 if (
Context.hasAnyFunctionEffects()) {
2015 const auto FromFX = FromFPT->getFunctionEffects();
2016 const auto ToFX = ToFPT->getFunctionEffects();
2017 if (FromFX != ToFX) {
2021 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
2031 assert(
QualType(FromFn, 0).isCanonical());
2032 if (
QualType(FromFn, 0) != CanTo)
return false;
2059 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
2060 &ToSem == &llvm::APFloat::IEEEquad()) ||
2061 (&FromSem == &llvm::APFloat::IEEEquad() &&
2062 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2118 bool InOverloadResolution,
bool CStyle) {
2128 if (ToMatrixType && FromMatrixType) {
2130 unsigned ToCols = ToMatrixType->getNumColumns();
2131 if (FromCols < ToCols)
2134 unsigned FromRows = FromMatrixType->
getNumRows();
2135 unsigned ToRows = ToMatrixType->getNumRows();
2136 if (FromRows < ToRows)
2139 if (FromRows == ToRows && FromCols == ToCols)
2145 QualType ToElTy = ToMatrixType->getElementType();
2154 QualType ToElTy = ToMatrixType->getElementType();
2159 if (FromMatrixType && !ToMatrixType) {
2178 bool InOverloadResolution,
bool CStyle) {
2195 if (ToExtType && FromExtType) {
2197 unsigned ToElts = ToExtType->getNumElements();
2198 if (FromElts < ToElts)
2200 if (FromElts == ToElts)
2206 QualType ToElTy = ToExtType->getElementType();
2211 if (FromExtType && !ToExtType) {
2225 if (ToExtType->getNumElements() != FromExtType->getNumElements())
2230 FromExtType->getElementType()->isIntegerType()) {
2242 QualType ToElTy = ToExtType->getElementType();
2277 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
2282 !InOverloadResolution && !CStyle) {
2284 << FromType << ToType;
2295 bool InOverloadResolution,
2296 StandardConversionSequence &SCS,
2308 bool InOverloadResolution,
2311 bool AllowObjCWritebackConversion) {
2337 FromType = Fn->getType();
2357 if (Method && !Method->isStatic() &&
2358 !Method->isExplicitObjectMemberFunction()) {
2360 "Non-unary operator on non-static member address");
2363 "Non-address-of operator on non-static member address");
2365 FromType, std::nullopt, Method->getParent());
2369 "Non-address-of operator for overloaded function expression");
2415 FromType =
Atomic->getValueType();
2450 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2470 bool IncompatibleObjC =
false;
2525 }
else if (AllowObjCWritebackConversion &&
2529 FromType, IncompatibleObjC)) {
2535 InOverloadResolution, FromType)) {
2539 From, InOverloadResolution, CStyle)) {
2544 From, InOverloadResolution, CStyle)) {
2554 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2590 bool ObjCLifetimeConversion;
2596 ObjCLifetimeConversion)) {
2615 CanonFrom = CanonTo;
2620 if (CanonFrom == CanonTo)
2625 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2637 case AssignConvertType::
2638 CompatibleVoidPtrToNonVoidPtr:
2671 bool InOverloadResolution,
2679 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2680 if (!UD->
hasAttr<TransparentUnionAttr>())
2683 for (
const auto *it : UD->
fields()) {
2686 ToType = it->getType();
2712 return To->
getKind() == BuiltinType::Int;
2715 return To->
getKind() == BuiltinType::UInt;
2739 if (FromED->isScoped())
2746 if (FromED->isFixed()) {
2747 QualType Underlying = FromED->getIntegerType();
2748 return Context.hasSameUnqualifiedType(Underlying, ToType) ||
2755 return Context.hasSameUnqualifiedType(ToType, FromED->getPromotionType());
2780 uint64_t FromSize =
Context.getTypeSize(FromType);
2789 for (
int Idx = 0; Idx < 6; ++Idx) {
2790 uint64_t ToSize =
Context.getTypeSize(PromoteTypes[Idx]);
2791 if (FromSize < ToSize ||
2792 (FromSize == ToSize &&
2793 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2797 return Context.hasSameUnqualifiedType(ToType, PromoteTypes[Idx]);
2818 std::optional<llvm::APSInt> BitWidth;
2821 MemberDecl->getBitWidth()->getIntegerConstantExpr(
Context))) {
2822 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2823 ToSize =
Context.getTypeSize(ToType);
2826 if (*BitWidth < ToSize ||
2828 return To->
getKind() == BuiltinType::Int;
2834 return To->
getKind() == BuiltinType::UInt;
2852 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2862 if (FromBuiltin->getKind() == BuiltinType::Float &&
2863 ToBuiltin->getKind() == BuiltinType::Double)
2870 (FromBuiltin->getKind() == BuiltinType::Float ||
2871 FromBuiltin->getKind() == BuiltinType::Double) &&
2872 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2873 ToBuiltin->getKind() == BuiltinType::Float128 ||
2874 ToBuiltin->getKind() == BuiltinType::Ibm128))
2879 if (
getLangOpts().
HLSL && FromBuiltin->getKind() == BuiltinType::Half &&
2880 (ToBuiltin->getKind() == BuiltinType::Float ||
2881 ToBuiltin->getKind() == BuiltinType::Double))
2886 FromBuiltin->getKind() == BuiltinType::Half &&
2887 ToBuiltin->getKind() == BuiltinType::Float)
2919 bool StripObjCLifetime =
false) {
2922 "Invalid similarly-qualified pointer type");
2933 if (StripObjCLifetime)
2945 return Context.getObjCObjectPointerType(ToPointee);
2946 return Context.getPointerType(ToPointee);
2954 return Context.getObjCObjectPointerType(QualifiedCanonToPointee);
2955 return Context.getPointerType(QualifiedCanonToPointee);
2959 bool InOverloadResolution,
2965 return !InOverloadResolution;
2973 bool InOverloadResolution,
2975 bool &IncompatibleObjC) {
2976 IncompatibleObjC =
false;
2984 ConvertedType = ToType;
2991 ConvertedType = ToType;
2998 ConvertedType = ToType;
3006 ConvertedType = ToType;
3016 ConvertedType = ToType;
3038 if (
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType))
3065 Context.typesAreCompatible(FromPointeeType, ToPointeeType)) {
3087 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType) &&
3096 Context.areCompatibleVectorTypes(FromPointeeType, ToPointeeType)) {
3115 return Context.getQualifiedType(
T, Qs);
3117 return Context.getQualifiedType(
T.getUnqualifiedType(), Qs);
3122 bool &IncompatibleObjC) {
3135 if (ToObjCPtr && FromObjCPtr) {
3143 if (
Context.canAssignObjCInterfaces(ToObjCPtr, FromObjCPtr)) {
3157 if (
Context.canAssignObjCInterfaces(FromObjCPtr, ToObjCPtr)) {
3161 IncompatibleObjC =
true;
3177 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
3206 IncompatibleObjC)) {
3208 IncompatibleObjC =
true;
3209 ConvertedType =
Context.getPointerType(ConvertedType);
3218 IncompatibleObjC)) {
3220 ConvertedType =
Context.getPointerType(ConvertedType);
3233 if (FromFunctionType && ToFunctionType) {
3236 if (
Context.getCanonicalType(FromPointeeType)
3237 ==
Context.getCanonicalType(ToPointeeType))
3242 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3243 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
3244 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
3247 bool HasObjCConversion =
false;
3249 Context.getCanonicalType(ToFunctionType->getReturnType())) {
3252 ToFunctionType->getReturnType(),
3253 ConvertedType, IncompatibleObjC)) {
3255 HasObjCConversion =
true;
3262 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3263 ArgIdx != NumArgs; ++ArgIdx) {
3265 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3266 if (
Context.getCanonicalType(FromArgType)
3267 ==
Context.getCanonicalType(ToArgType)) {
3270 ConvertedType, IncompatibleObjC)) {
3272 HasObjCConversion =
true;
3279 if (HasObjCConversion) {
3283 IncompatibleObjC =
true;
3315 if (!FromFunctionType || !ToFunctionType)
3318 if (
Context.hasSameType(FromPointeeType, ToPointeeType))
3323 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3324 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3329 if (FromEInfo != ToEInfo)
3332 bool IncompatibleObjC =
false;
3334 ToFunctionType->getReturnType())) {
3338 QualType LHS = ToFunctionType->getReturnType();
3343 if (
Context.hasSameType(RHS,LHS)) {
3346 ConvertedType, IncompatibleObjC)) {
3347 if (IncompatibleObjC)
3356 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3357 ArgIdx != NumArgs; ++ArgIdx) {
3358 IncompatibleObjC =
false;
3360 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3361 if (
Context.hasSameType(FromArgType, ToArgType)) {
3364 ConvertedType, IncompatibleObjC)) {
3365 if (IncompatibleObjC)
3374 bool CanUseToFPT, CanUseFromFPT;
3375 if (!
Context.mergeExtParameterInfo(ToFunctionType, FromFunctionType,
3376 CanUseToFPT, CanUseFromFPT,
3380 ConvertedType = ToType;
3419 ToMember->getMostRecentCXXRecordDecl())) {
3421 if (ToMember->isSugared())
3423 ToMember->getMostRecentCXXRecordDecl());
3425 PDiag << ToMember->getQualifier();
3426 if (FromMember->isSugared())
3428 FromMember->getMostRecentCXXRecordDecl());
3430 PDiag << FromMember->getQualifier();
3448 !FromType->
getAs<TemplateSpecializationType>()) {
3454 if (
Context.hasSameType(FromType, ToType)) {
3463 if (!FromFunction || !ToFunction) {
3468 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3478 << ToFunction->getParamType(ArgPos)
3485 ToFunction->getReturnType())) {
3491 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3514 assert(llvm::size(Old) == llvm::size(
New) &&
3515 "Can't compare parameters of functions with different number of "
3518 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3520 size_t J =
Reversed ? (llvm::size(
New) - Idx - 1) : Idx;
3525 Context.removePtrSizeAddrSpace(
Type.getUnqualifiedType());
3527 Context.removePtrSizeAddrSpace((
New.begin() + J)->getUnqualifiedType());
3529 if (!
Context.hasSameType(OldType, NewType)) {
3554 unsigned OldIgnore =
3556 unsigned NewIgnore =
3563 NewPT->param_types().slice(NewIgnore),
3570 bool IgnoreBaseAccess,
3573 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3582 PDiag(diag::warn_impcast_bool_to_null_pointer)
3593 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3594 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {
3597 unsigned InaccessibleID = 0;
3598 unsigned AmbiguousID = 0;
3600 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3601 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3604 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3606 &BasePath, IgnoreBaseAccess))
3610 Kind = CK_DerivedToBase;
3613 if (
Diagnose && !IsCStyleOrFunctionalCast &&
3614 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3616 "this should only be possible with MSVCCompat!");
3628 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3631 Kind = CK_BlockPointerToObjCPointerCast;
3633 Kind = CK_CPointerToObjCPointerCast;
3637 Kind = CK_AnyPointerToBlockPointerCast;
3643 Kind = CK_NullToPointer;
3650 bool InOverloadResolution,
3660 ConvertedType = ToType;
3676 ConvertedType =
Context.getMemberPointerType(
3690 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
3698 Kind = CK_NullToMemberPointer;
3716 PD <<
Context.getCanonicalTagType(Cls);
3726 std::swap(
Base, Derived);
3735 PD <<
int(Direction);
3743 DiagFromTo(PD) <<
QualType(VBase, 0) << OpRange;
3751 ? CK_DerivedToBaseMemberPointer
3752 : CK_BaseToDerivedMemberPointer;
3754 if (!IgnoreBaseAccess)
3758 ? diag::err_upcast_to_inaccessible_base
3759 : diag::err_downcast_from_inaccessible_base,
3761 NestedNameSpecifier BaseQual = FromPtrType->getQualifier(),
3762 DerivedQual = ToPtrType->getQualifier();
3763 if (Direction == MemberPointerConversionDirection::Upcast)
3764 std::swap(BaseQual, DerivedQual);
3765 DiagCls(PD, DerivedQual, Derived);
3766 DiagCls(PD, BaseQual, Base);
3801 bool CStyle,
bool IsTopLevel,
3802 bool &PreviousToQualsIncludeConst,
3803 bool &ObjCLifetimeConversion,
3816 ObjCLifetimeConversion =
true;
3856 !PreviousToQualsIncludeConst)
3874 PreviousToQualsIncludeConst =
3875 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3881 bool CStyle,
bool &ObjCLifetimeConversion) {
3882 FromType =
Context.getCanonicalType(FromType);
3883 ToType =
Context.getCanonicalType(ToType);
3884 ObjCLifetimeConversion =
false;
3894 bool PreviousToQualsIncludeConst =
true;
3895 bool UnwrappedAnyPointer =
false;
3896 while (
Context.UnwrapSimilarTypes(FromType, ToType)) {
3898 !UnwrappedAnyPointer,
3899 PreviousToQualsIncludeConst,
3902 UnwrappedAnyPointer =
true;
3910 return UnwrappedAnyPointer &&
Context.hasSameUnqualifiedType(FromType,ToType);
3919 bool InOverloadResolution,
3928 InOverloadResolution, InnerSCS,
3945 if (CtorType->getNumParams() > 0) {
3946 QualType FirstArg = CtorType->getParamType(0);
3958 bool AllowExplicit) {
3965 bool Usable = !Info.Constructor->isInvalidDecl() &&
3968 bool SuppressUserConversions =
false;
3969 if (Info.ConstructorTmpl)
3972 CandidateSet, SuppressUserConversions,
3977 CandidateSet, SuppressUserConversions,
3978 false, AllowExplicit);
3982 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
3985 switch (
auto Result =
4009 llvm_unreachable(
"Invalid OverloadResult!");
4031 bool AllowObjCConversionOnExplicit) {
4032 assert(AllowExplicit != AllowedExplicit::None ||
4033 !AllowObjCConversionOnExplicit);
4037 bool ConstructorsOnly =
false;
4041 if (
const RecordType *ToRecordType = ToType->
getAsCanonical<RecordType>()) {
4053 ConstructorsOnly =
true;
4057 }
else if (
auto *ToRecordDecl =
4058 dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
4059 ToRecordDecl = ToRecordDecl->getDefinitionOrSelf();
4061 Expr **Args = &From;
4062 unsigned NumArgs = 1;
4063 bool ListInitializing =
false;
4064 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
4067 S, From, ToType, ToRecordDecl, User, CandidateSet,
4068 AllowExplicit == AllowedExplicit::All);
4077 Args = InitList->getInits();
4078 NumArgs = InitList->getNumInits();
4079 ListInitializing =
true;
4087 bool Usable = !Info.Constructor->isInvalidDecl();
4088 if (!ListInitializing)
4089 Usable = Usable && Info.Constructor->isConvertingConstructor(
4092 bool SuppressUserConversions = !ConstructorsOnly;
4100 if (SuppressUserConversions && ListInitializing) {
4101 SuppressUserConversions =
4106 if (Info.ConstructorTmpl)
4108 Info.ConstructorTmpl, Info.FoundDecl,
4110 CandidateSet, SuppressUserConversions,
4112 AllowExplicit == AllowedExplicit::All);
4118 SuppressUserConversions,
4120 AllowExplicit == AllowedExplicit::All);
4130 }
else if (
const RecordType *FromRecordType =
4132 if (
auto *FromRecordDecl =
4133 dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
4134 FromRecordDecl = FromRecordDecl->getDefinitionOrSelf();
4136 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
4137 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4146 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)))
4153 ConvTemplate, FoundDecl, ActingContext, From, ToType,
4154 CandidateSet, AllowObjCConversionOnExplicit,
4155 AllowExplicit != AllowedExplicit::None);
4158 CandidateSet, AllowObjCConversionOnExplicit,
4159 AllowExplicit != AllowedExplicit::None);
4164 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4167 switch (
auto Result =
4173 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
4185 if (Best->Conversions[0].isEllipsis())
4188 User.
Before = Best->Conversions[0].Standard;
4201 = dyn_cast<CXXConversionDecl>(Best->Function)) {
4203 assert(Best->HasFinalConversion);
4211 User.
Before = Best->Conversions[0].Standard;
4226 User.
After = Best->FinalConversion;
4229 llvm_unreachable(
"Not a constructor or conversion function?");
4238 llvm_unreachable(
"Invalid OverloadResult!");
4248 CandidateSet, AllowedExplicit::None,
false);
4263 diag::err_typecheck_nonviable_condition_incomplete,
4270 *
this, From, Cands);
4296 if (!Conv1 || !Conv2)
4311 if (Block1 != Block2)
4324 if (Conv1FuncRet && Conv2FuncRet &&
4333 CallOp->getType()->castAs<
FunctionType>()->getCallConv();
4335 CallOpProto->isVariadic(),
false);
4337 CallOpProto->isVariadic(),
true);
4339 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4434 if (!ICS1.
isBad()) {
4435 bool StdInit1 =
false, StdInit2 =
false;
4442 if (StdInit1 != StdInit2)
4453 CAT2->getElementType())) {
4455 if (CAT1->getSize() != CAT2->getSize())
4457 return CAT1->getSize().ult(CAT2->getSize())
4492 if (ConvFunc1 == ConvFunc2)
4594 if (!
Enum->isFixed())
4630 else if (Rank2 < Rank1)
4665 bool SCS1ConvertsToVoid
4667 bool SCS2ConvertsToVoid
4669 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4674 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4680 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4709 if (FromObjCPtr1 && FromObjCPtr2) {
4714 if (AssignLeft != AssignRight) {
4749 if (UnqualT1 == UnqualT2) {
4811 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4812 return SCS1IsCompatibleVectorConversion
4819 bool SCS1IsCompatibleSVEVectorConversion =
4821 bool SCS2IsCompatibleSVEVectorConversion =
4824 if (SCS1IsCompatibleSVEVectorConversion !=
4825 SCS2IsCompatibleSVEVectorConversion)
4826 return SCS1IsCompatibleSVEVectorConversion
4833 bool SCS1IsCompatibleRVVVectorConversion =
4835 bool SCS2IsCompatibleRVVVectorConversion =
4838 if (SCS1IsCompatibleRVVVectorConversion !=
4839 SCS2IsCompatibleRVVVectorConversion)
4840 return SCS1IsCompatibleRVVVectorConversion
4880 if (UnqualT1 == UnqualT2)
4898 bool ObjCLifetimeConversion;
4908 if (CanPick1 != CanPick2)
4962 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
4970 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
4987 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
4994 bool FromAssignRight
5003 if (ToPtr1->isObjCIdType() &&
5004 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
5006 if (ToPtr2->isObjCIdType() &&
5007 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
5012 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
5014 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
5019 if (ToPtr1->isObjCClassType() &&
5020 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
5022 if (ToPtr2->isObjCClassType() &&
5023 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
5028 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
5030 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
5036 (ToAssignLeft != ToAssignRight)) {
5047 }
else if (IsSecondSame)
5056 (FromAssignLeft != FromAssignRight))
5070 CXXRecordDecl *FromPointee1 = FromMemPointer1->getMostRecentCXXRecordDecl();
5075 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5082 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
5120 if (!
T.getQualifiers().hasUnaligned())
5134 "T1 must be the pointee type of the reference type");
5135 assert(!OrigT2->
isReferenceType() &&
"T2 cannot be a reference type");
5158 if (UnqualT1 == UnqualT2) {
5162 Conv |= ReferenceConversions::DerivedToBase;
5165 Context.canBindObjCObjectType(UnqualT1, UnqualT2))
5166 Conv |= ReferenceConversions::ObjC;
5169 Conv |= ReferenceConversions::Function;
5173 bool ConvertedReferent = Conv != 0;
5177 bool PreviousToQualsIncludeConst =
true;
5178 bool TopLevel =
true;
5184 Conv |= ReferenceConversions::Qualification;
5190 Conv |= ReferenceConversions::NestedQualification;
5198 bool ObjCLifetimeConversion =
false;
5200 PreviousToQualsIncludeConst,
5202 return (ConvertedReferent ||
Context.hasSimilarType(T1, T2))
5207 if (ObjCLifetimeConversion)
5208 Conv |= ReferenceConversions::ObjCLifetime;
5211 }
while (
Context.UnwrapSimilarTypes(T1, T2));
5216 return (ConvertedReferent ||
Context.hasSameUnqualifiedType(T1, T2))
5227 bool AllowExplicit) {
5228 assert(T2->
isRecordType() &&
"Can only find conversions of record types.");
5232 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5233 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5240 = dyn_cast<FunctionTemplateDecl>(D);
5257 if (!ConvTemplate &&
5281 ConvTemplate, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5282 false, AllowExplicit);
5285 Conv, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5286 false, AllowExplicit);
5289 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5295 assert(Best->HasFinalConversion);
5307 if (!Best->FinalConversion.DirectBinding)
5319 "Expected a direct reference binding!");
5325 Cand != CandidateSet.
end(); ++Cand)
5337 llvm_unreachable(
"Invalid OverloadResult!");
5342static ImplicitConversionSequence
5345 bool SuppressUserConversions,
5346 bool AllowExplicit) {
5347 assert(DeclType->
isReferenceType() &&
"Reference init needs a reference");
5374 auto SetAsReferenceBinding = [&](
bool BindsDirectly) {
5379 ICS.
Standard.
Second = (RefConv & Sema::ReferenceConversions::DerivedToBase)
5381 : (RefConv & Sema::ReferenceConversions::ObjC)
5389 Sema::ReferenceConversions::NestedQualification)
5403 (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0;
5427 SetAsReferenceBinding(
true);
5476 SetAsReferenceBinding(S.
getLangOpts().CPlusPlus11 ||
5567 AllowedExplicit::None,
5592 if (isRValRef && LValRefType) {
5609static ImplicitConversionSequence
5611 bool SuppressUserConversions,
5612 bool InOverloadResolution,
5613 bool AllowObjCWritebackConversion,
5614 bool AllowExplicit =
false);
5618static ImplicitConversionSequence
5620 bool SuppressUserConversions,
5621 bool InOverloadResolution,
5622 bool AllowObjCWritebackConversion) {
5635 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT))
5637 InitTy = IAT->getElementType();
5663 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5669 SuppressUserConversions,
5670 InOverloadResolution,
5671 AllowObjCWritebackConversion);
5679 Result.setStandard();
5680 Result.Standard.setAsIdentityConversion();
5681 Result.Standard.setFromType(ToType);
5682 Result.Standard.setAllToTypes(ToType);
5707 bool IsUnbounded =
false;
5711 if (CT->getSize().ult(e)) {
5715 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5718 if (CT->getSize().ugt(e)) {
5724 S, &EmptyList, InitTy, SuppressUserConversions,
5725 InOverloadResolution, AllowObjCWritebackConversion);
5726 if (DfltElt.
isBad()) {
5730 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5741 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5750 Result.setStandard();
5751 Result.Standard.setAsIdentityConversion();
5752 Result.Standard.setFromType(InitTy);
5753 Result.Standard.setAllToTypes(InitTy);
5754 for (
unsigned i = 0; i < e; ++i) {
5757 S,
Init, InitTy, SuppressUserConversions, InOverloadResolution,
5758 AllowObjCWritebackConversion);
5768 if (Result.isBad()) {
5769 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5779 S, From->
getEndLoc(), DfltElt, Result) ==
5797 AllowedExplicit::None,
5798 InOverloadResolution,
false,
5799 AllowObjCWritebackConversion,
5817 Result.setUserDefined();
5818 Result.UserDefined.Before.setAsIdentityConversion();
5820 Result.UserDefined.Before.setFromType(
QualType());
5821 Result.UserDefined.Before.setAllToTypes(
QualType());
5823 Result.UserDefined.After.setAsIdentityConversion();
5824 Result.UserDefined.After.setFromType(ToType);
5825 Result.UserDefined.After.setAllToTypes(ToType);
5826 Result.UserDefined.ConversionFunction =
nullptr;
5843 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5864 SuppressUserConversions,
5872 InOverloadResolution,
5873 AllowObjCWritebackConversion);
5874 if (Result.isFailure())
5876 assert(!Result.isEllipsis() &&
5877 "Sub-initialization cannot result in ellipsis conversion.");
5883 Result.UserDefined.After;
5911 S, From->
getInit(0), ToType, SuppressUserConversions,
5912 InOverloadResolution, AllowObjCWritebackConversion);
5913 if (Result.isStandard())
5914 Result.Standard.FromBracedInitList =
true;
5918 else if (NumInits == 0) {
5919 Result.setStandard();
5920 Result.Standard.setAsIdentityConversion();
5921 Result.Standard.setFromType(ToType);
5922 Result.Standard.setAllToTypes(ToType);
5939static ImplicitConversionSequence
5941 bool SuppressUserConversions,
5942 bool InOverloadResolution,
5943 bool AllowObjCWritebackConversion,
5944 bool AllowExplicit) {
5945 if (
InitListExpr *FromInitList = dyn_cast<InitListExpr>(From))
5947 InOverloadResolution,AllowObjCWritebackConversion);
5952 SuppressUserConversions, AllowExplicit);
5955 SuppressUserConversions,
5956 AllowedExplicit::None,
5957 InOverloadResolution,
5959 AllowObjCWritebackConversion,
5972 return !ICS.
isBad();
5981 const CXXRecordDecl *ActingContext,
bool InOverloadResolution =
false,
5983 bool SuppressUserConversion =
false) {
5991 assert(FromClassification.
isLValue());
6002 if (Method->isExplicitObjectMemberFunction()) {
6003 if (ExplicitParameterType.isNull())
6004 ExplicitParameterType = Method->getFunctionObjectParameterReferenceType();
6006 ValueKindFromClassification(FromClassification));
6008 S, &TmpExpr, ExplicitParameterType, SuppressUserConversion,
6025 Qualifiers Quals = Method->getMethodQualifiers();
6063 FromType, ImplicitParamType);
6073 FromType, ImplicitParamType);
6086 }
else if (!Method->isExplicitObjectMemberFunction()) {
6088 FromType, ImplicitParamType);
6093 switch (Method->getRefQualifier()) {
6108 if (!FromClassification.
isRValue()) {
6130 = (Method->getRefQualifier() ==
RQ_None);
6141 QualType ImplicitParamRecordType =
Method->getFunctionObjectParameterType();
6146 DestType =
Method->getThisType();
6149 FromRecordType = From->
getType();
6150 DestType = ImplicitParamRecordType;
6158 Method->getRefQualifier() !=
6176 <<
Method->getDeclName() << FromRecordType << (CVR - 1)
6178 Diag(
Method->getLocation(), diag::note_previous_decl)
6179 <<
Method->getDeclName();
6187 bool IsRValueQualified =
6191 << IsRValueQualified;
6192 Diag(
Method->getLocation(), diag::note_previous_decl)
6193 <<
Method->getDeclName();
6203 llvm_unreachable(
"Lists are not objects");
6206 return Diag(From->
getBeginLoc(), diag::err_member_function_call_bad_type)
6207 << ImplicitParamRecordType << FromRecordType
6216 From = FromRes.
get();
6225 CK = CK_AddressSpaceConversion;
6250 AllowedExplicit::Conversions,
6333 llvm_unreachable(
"found a first conversion kind in Second");
6337 llvm_unreachable(
"found a third conversion kind in Second");
6343 llvm_unreachable(
"unknown conversion kind");
6353 [[maybe_unused]]
bool isCCEAllowedPreCXX11 =
6355 assert((S.
getLangOpts().CPlusPlus11 || isCCEAllowedPreCXX11) &&
6356 "converted constant expression outside C++11 or TTP matching");
6380 if (
T->isRecordType())
6389 diag::err_typecheck_converted_constant_expression)
6395 llvm_unreachable(
"bad conversion in converted constant expression");
6401 diag::err_typecheck_converted_constant_expression_disallowed)
6407 diag::err_typecheck_converted_constant_expression_indirect)
6417 diag::err_reference_bind_to_bitfield_in_cce)
6425 bool IsTemplateArgument =
6427 if (
T->isRecordType()) {
6428 assert(IsTemplateArgument &&
6429 "unexpected class type converted constant expr");
6438 if (Result.isInvalid())
6445 IsTemplateArgument);
6446 if (Result.isInvalid())
6450 bool ReturnPreNarrowingValue =
false;
6453 PreNarrowingType)) {
6463 PreNarrowingValue.
isInt()) {
6466 ReturnPreNarrowingValue =
true;
6486 << CCE << 0 << From->
getType() <<
T;
6489 if (!ReturnPreNarrowingValue)
6490 PreNarrowingValue = {};
6506 if (Result.isInvalid() || Result.get()->isValueDependent()) {
6511 RequireInt, PreNarrowingValue);
6518 return ::BuildConvertedConstantExpression(*
this, From,
T, CCE, Dest,
6525 return ::CheckConvertedConstantExpression(*
this, From,
T,
Value, CCE,
false,
6530 llvm::APSInt &
Value,
6532 assert(
T->isIntegralOrEnumerationType() &&
"unexpected converted const type");
6537 if (!R.isInvalid() && !R.get()->isValueDependent())
6545 const APValue &PreNarrowingValue) {
6557 Kind = ConstantExprKind::ClassTemplateArgument;
6559 Kind = ConstantExprKind::NonClassTemplateArgument;
6561 Kind = ConstantExprKind::Normal;
6564 (RequireInt && !Eval.
Val.
isInt())) {
6571 if (Notes.empty()) {
6574 if (
const auto *CE = dyn_cast<ConstantExpr>(E)) {
6578 "ConstantExpr has no value associated with it");
6584 Value = std::move(PreNarrowingValue);
6590 if (Notes.size() == 1 &&
6591 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6592 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6593 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6594 diag::note_constexpr_invalid_template_arg) {
6595 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6596 for (
unsigned I = 0; I < Notes.size(); ++I)
6597 Diag(Notes[I].first, Notes[I].second);
6601 for (
unsigned I = 0; I < Notes.size(); ++I)
6602 Diag(Notes[I].first, Notes[I].second);
6621static ImplicitConversionSequence
6629 AllowedExplicit::Conversions,
6671 "expected a member expression");
6673 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6674 M && !M->isImplicitAccess())
6675 Base = M->getBase();
6676 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6677 M && !M->isImplicitAccess())
6678 Base = M->getBase();
6682 if (
T->isPointerType())
6683 T =
T->getPointeeType();
6711 assert(Method->isExplicitObjectMemberFunction() &&
6712 "Method is not an explicit member function");
6713 assert(NewArgs.empty() &&
"NewArgs should be empty");
6715 NewArgs.reserve(Args.size() + 1);
6717 NewArgs.push_back(
This);
6718 NewArgs.append(Args.begin(), Args.end());
6721 Method, Object->getBeginLoc());
6727 return AllowScopedEnumerations ?
T->isIntegralOrEnumerationType()
6728 :
T->isIntegralOrUnscopedEnumerationType();
6740 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6754 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6762 std::string TypeStr;
6767 "static_cast<" + TypeStr +
">(")
6779 HadMultipleCandidates);
6780 if (Result.isInvalid())
6786 From, Result.get()->
getType());
6787 if (Result.isInvalid())
6789 From = Result.get();
6812 HadMultipleCandidates);
6813 if (Result.isInvalid())
6817 CK_UserDefinedConversion, Result.get(),
6818 nullptr, Result.get()->getValueKind(),
6843 if (
auto *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)) {
6845 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
6851 Conv, FoundDecl, ActingContext, From, ToType, CandidateSet,
6885 From = result.
get();
6899 const RecordType *RecordTy =
T->getAsCanonical<RecordType>();
6912 : Converter(Converter), From(From) {}
6917 } IncompleteDiagnoser(Converter, From);
6928 ->getDefinitionOrSelf()
6929 ->getVisibleConversionFunctions();
6931 bool HadMultipleCandidates =
6936 bool HasUniqueTargetType =
true;
6952 "Conversion operator templates are considered potentially "
6956 if (Converter.
match(CurToType) || ConvTemplate) {
6962 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
6967 else if (HasUniqueTargetType &&
6969 HasUniqueTargetType =
false;
6971 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
6989 HadMultipleCandidates,
6990 ExplicitConversions))
6996 if (!HasUniqueTargetType)
7015 HadMultipleCandidates,
Found))
7024 HadMultipleCandidates,
7025 ExplicitConversions))
7033 switch (ViableConversions.
size()) {
7036 HadMultipleCandidates,
7037 ExplicitConversions))
7047 HadMultipleCandidates,
Found))
7078 if (Proto->getNumParams() < 1)
7082 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
7083 if (Context.hasSameUnqualifiedType(T1, ArgType))
7087 if (Proto->getNumParams() < 2)
7091 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
7092 if (Context.hasSameUnqualifiedType(T2, ArgType))
7111 unsigned SeenAt = 0;
7113 bool HasDefault =
false;
7122 return HasDefault || SeenAt != 0;
7128 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
7131 bool StrictPackMatch) {
7134 assert(Proto &&
"Functions without a prototype cannot be overloaded");
7135 assert(!
Function->getDescribedFunctionTemplate() &&
7136 "Use AddTemplateOverloadCandidate for function templates");
7149 CandidateSet, SuppressUserConversions,
7150 PartialOverloading, EarlyConversions, PO,
7186 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
7200 Candidate.
Viable =
false;
7213 bool IsImplicitlyInstantiated =
false;
7214 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo()) {
7215 ND = SpecInfo->getTemplate();
7216 IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() ==
7227 const bool IsInlineFunctionInGMF =
7229 (IsImplicitlyInstantiated ||
Function->isInlined());
7232 Candidate.
Viable =
false;
7239 Candidate.
Viable =
false;
7250 if (Args.size() == 1 &&
Constructor->isSpecializationCopyingObject() &&
7251 (
Context.hasSameUnqualifiedType(ClassType, Args[0]->getType()) ||
7254 Candidate.
Viable =
false;
7266 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.
getDecl());
7267 if (Shadow && Args.size() == 1 &&
Constructor->getNumParams() >= 1 &&
7268 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
7275 Candidate.
Viable =
false;
7284 Constructor->getMethodQualifiers().getAddressSpace(),
7286 Candidate.
Viable =
false;
7299 Candidate.
Viable =
false;
7309 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7310 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7311 !PartialOverloading) {
7313 Candidate.
Viable =
false;
7327 Candidate.
Viable =
false;
7333 if (
Function->getTrailingRequiresClause()) {
7338 Candidate.
Viable =
false;
7347 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7350 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7353 }
else if (ArgIdx < NumParams) {
7364 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7367 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7369 Candidate.
Viable =
false;
7381 if (EnableIfAttr *FailedAttr =
7383 Candidate.
Viable =
false;
7393 if (Methods.size() <= 1)
7396 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7402 if (
Method->param_size() > NumNamedArgs)
7403 NumNamedArgs =
Method->param_size();
7404 if (Args.size() < NumNamedArgs)
7407 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7409 if (Args[i]->isTypeDependent()) {
7415 Expr *argExpr = Args[i];
7416 assert(argExpr &&
"SelectBestMethod(): missing expression");
7421 !param->
hasAttr<CFConsumedAttr>())
7422 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7439 if (ConversionState.
isBad() ||
7449 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7450 if (Args[i]->isTypeDependent()) {
7463 if (Args.size() != NumNamedArgs)
7465 else if (
Match && NumNamedArgs == 0 && Methods.size() > 1) {
7468 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7469 QualType ReturnT = Methods[
b]->getReturnType();
7489 "Shouldn't have `this` for ctors!");
7490 assert(!Method->isStatic() &&
"Shouldn't have `this` for static methods!");
7492 ThisArg, std::nullopt, Method, Method);
7495 ConvertedThis = R.
get();
7497 if (
auto *MD = dyn_cast<CXXMethodDecl>(Function)) {
7499 assert((MissingImplicitThis || MD->isStatic() ||
7501 "Expected `this` for non-ctor instance methods");
7503 ConvertedThis =
nullptr;
7508 unsigned ArgSizeNoVarargs = std::min(Function->param_size(), Args.size());
7511 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7514 S.
Context, Function->getParamDecl(I)),
7520 ConvertedArgs.push_back(R.
get());
7527 if (!Function->isVariadic() && Args.size() < Function->getNumParams()) {
7528 for (
unsigned i = Args.size(), e = Function->getNumParams(); i != e; ++i) {
7535 ConvertedArgs.push_back(R.
get());
7547 bool MissingImplicitThis) {
7548 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7549 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7555 Expr *DiscardedThis;
7557 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7558 true, DiscardedThis, ConvertedArgs))
7559 return *EnableIfAttrs.begin();
7561 for (
auto *EIA : EnableIfAttrs) {
7565 if (EIA->getCond()->isValueDependent() ||
7566 !EIA->getCond()->EvaluateWithSubstitution(
7570 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7576template <
typename CheckFn>
7579 CheckFn &&IsSuccessful) {
7582 if (ArgDependent == DIA->getArgDependent())
7583 Attrs.push_back(DIA);
7590 auto WarningBegin = std::stable_partition(
7591 Attrs.begin(), Attrs.end(), [](
const DiagnoseIfAttr *DIA) {
7592 return DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_error &&
7593 DIA->getWarningGroup().empty();
7598 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7600 if (ErrAttr != WarningBegin) {
7601 const DiagnoseIfAttr *DIA = *ErrAttr;
7602 S.
Diag(Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7603 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7604 << DIA->getParent() << DIA->getCond()->getSourceRange();
7608 auto ToSeverity = [](DiagnoseIfAttr::DefaultSeverity Sev) {
7610 case DiagnoseIfAttr::DS_warning:
7612 case DiagnoseIfAttr::DS_error:
7615 llvm_unreachable(
"Fully covered switch above!");
7618 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7619 if (IsSuccessful(DIA)) {
7620 if (DIA->getWarningGroup().empty() &&
7621 DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_warning) {
7622 S.
Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7623 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7624 << DIA->getParent() << DIA->getCond()->getSourceRange();
7627 DIA->getWarningGroup());
7630 {ToSeverity(DIA->getDefaultSeverity()),
"%0",
7632 S.
Diag(Loc, DiagID) << DIA->getMessage();
7640 const Expr *ThisArg,
7645 [&](
const DiagnoseIfAttr *DIA) {
7650 if (!DIA->getCond()->EvaluateWithSubstitution(
7653 return Result.isInt() &&
Result.getInt().getBoolValue();
7660 *
this, ND,
false, Loc,
7661 [&](
const DiagnoseIfAttr *DIA) {
7663 return DIA->getCond()->EvaluateAsBooleanCondition(
Result,
Context) &&
7672 bool SuppressUserConversions,
7673 bool PartialOverloading,
7674 bool FirstArgumentIsBase) {
7686 if (Args.size() > 0) {
7687 if (
Expr *E = Args[0]) {
7697 FunctionArgs = Args.slice(1);
7701 FunTmpl, F.getPair(),
7703 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7704 FunctionArgs, CandidateSet, SuppressUserConversions,
7705 PartialOverloading);
7709 ObjectClassification, FunctionArgs, CandidateSet,
7710 SuppressUserConversions, PartialOverloading);
7717 if (Args.size() > 0 &&
7721 FunctionArgs = Args.slice(1);
7725 ExplicitTemplateArgs, FunctionArgs,
7726 CandidateSet, SuppressUserConversions,
7727 PartialOverloading);
7730 SuppressUserConversions, PartialOverloading);
7740 bool SuppressUserConversions,
7750 "Expected a member function template");
7752 nullptr, ObjectType,
7753 ObjectClassification, Args, CandidateSet,
7754 SuppressUserConversions,
false, PO);
7757 ObjectType, ObjectClassification, Args, CandidateSet,
7758 SuppressUserConversions,
false, {}, PO);
7771 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7773 "Use AddOverloadCandidate for constructors");
7782 Method->isMoveAssignmentOperator())
7789 bool IgnoreExplicitObject =
7790 (
Method->isExplicitObjectMemberFunction() &&
7793 bool ImplicitObjectMethodTreatedAsStatic =
7796 Method->isImplicitObjectMemberFunction();
7798 unsigned ExplicitOffset =
7799 !IgnoreExplicitObject &&
Method->isExplicitObjectMemberFunction() ? 1 : 0;
7801 unsigned NumParams =
Method->getNumParams() - ExplicitOffset +
7802 int(ImplicitObjectMethodTreatedAsStatic);
7804 unsigned ExtraArgs =
7811 CandidateSet.
addCandidate(Args.size() + ExtraArgs, EarlyConversions);
7827 Candidate.
Viable =
false;
7837 unsigned MinRequiredArgs =
Method->getMinRequiredArguments() -
7839 int(ImplicitObjectMethodTreatedAsStatic);
7841 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
7843 Candidate.
Viable =
false;
7851 if (!IgnoreExplicitObject) {
7854 else if (
Method->isStatic()) {
7864 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
7869 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
7870 Method, ActingContext,
true);
7871 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
7872 Candidate.
Viable =
false;
7883 Candidate.
Viable =
false;
7888 if (
Method->getTrailingRequiresClause()) {
7893 Candidate.
Viable =
false;
7901 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7904 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7907 }
else if (ArgIdx < NumParams) {
7913 if (ImplicitObjectMethodTreatedAsStatic) {
7914 ParamType = ArgIdx == 0
7915 ?
Method->getFunctionObjectParameterReferenceType()
7918 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
7922 SuppressUserConversions,
7927 Candidate.
Viable =
false;
7939 if (EnableIfAttr *FailedAttr =
7941 Candidate.
Viable =
false;
7948 Candidate.
Viable =
false;
7959 bool SuppressUserConversions,
bool PartialOverloading,
7977 PartialOverloading,
false,
7978 false, ObjectType, ObjectClassification,
7982 bool OnlyInitializeNonUserDefinedConversions) {
7983 return S.CheckNonDependentConversions(
7984 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
7985 Sema::CheckNonDependentConversionsFlag(
7986 SuppressUserConversions,
7987 OnlyInitializeNonUserDefinedConversions),
7988 ActingContext, ObjectType, ObjectClassification, PO);
7992 CandidateSet.
addCandidate(Conversions.size(), Conversions);
7995 Candidate.
Viable =
false;
8004 Method->isStatic() ||
8005 (!Method->isExplicitObjectMemberFunction() && ObjectType.
isNull());
8019 assert(
Specialization &&
"Missing member function template specialization?");
8021 "Specialization is not a member function?");
8024 ObjectClassification, Args, CandidateSet, SuppressUserConversions,
8038 if (ExplicitTemplateArgs ||
8041 *
this, CandidateSet, MethodTmpl, FoundDecl, ActingContext,
8042 ExplicitTemplateArgs, ObjectType, ObjectClassification, Args,
8043 SuppressUserConversions, PartialOverloading, PO);
8048 MethodTmpl, FoundDecl, ActingContext, ObjectType, ObjectClassification,
8049 Args, SuppressUserConversions, PartialOverloading, PO);
8067 bool SuppressUserConversions,
bool PartialOverloading,
bool AllowExplicit,
8069 bool AggregateCandidateDeduction) {
8078 Candidate.
Viable =
false;
8098 PartialOverloading, AggregateCandidateDeduction,
8105 bool OnlyInitializeNonUserDefinedConversions) {
8106 return S.CheckNonDependentConversions(
8107 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
8108 Sema::CheckNonDependentConversionsFlag(
8109 SuppressUserConversions,
8110 OnlyInitializeNonUserDefinedConversions),
8111 nullptr, QualType(), {}, PO);
8114 OverloadCandidate &Candidate =
8115 CandidateSet.addCandidate(Conversions.size(), Conversions);
8118 Candidate.
Viable =
false;
8120 CandidateSet.getRewriteInfo().getRewriteKind(Candidate.
Function, PO);
8126 CandidateSet.getKind() ==
8132 ->isExplicitObjectMemberFunction() &&
8148 assert(
Specialization &&
"Missing function template specialization?");
8150 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
8151 PartialOverloading, AllowExplicit,
8152 false, IsADLCandidate, Conversions, PO,
8153 Info.AggregateDeductionCandidateHasMismatchedArity,
8154 Info.hasStrictPackMatch());
8161 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
8168 if (ExplicitTemplateArgs ||
8171 DependentExplicitSpecifier)) {
8175 Args, SuppressUserConversions, PartialOverloading, AllowExplicit,
8176 IsADLCandidate, PO, AggregateCandidateDeduction);
8178 if (DependentExplicitSpecifier)
8185 PartialOverloading, AllowExplicit, IsADLCandidate, PO,
8186 AggregateCandidateDeduction);
8199 const bool AllowExplicit =
false;
8201 bool ForOverloadSetAddressResolution =
8204 auto *
Method = dyn_cast<CXXMethodDecl>(FD);
8205 bool HasThisConversion = !ForOverloadSetAddressResolution &&
Method &&
8207 unsigned ThisConversions = HasThisConversion ? 1 : 0;
8223 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
8224 !ParamTypes[0]->isDependentType()) {
8226 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8227 Method, ActingContext,
true,
8228 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
8238 auto MaybeInvolveUserDefinedConversion = [&](
QualType ParamType,
8262 if (
auto *RD =
ArgType->getAsCXXRecordDecl();
8263 RD && RD->hasDefinition() &&
8264 !RD->getVisibleConversionFunctions().empty())
8271 HasThisConversion &&
Method->hasCXXExplicitFunctionObjectParameter() ? 1
8274 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
8276 QualType ParamType = ParamTypes[I + Offset];
8280 ConvIdx = Args.size() - 1 - I;
8281 assert(Args.size() + ThisConversions == 2 &&
8282 "number of args (including 'this') must be exactly 2 for "
8286 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
8289 ConvIdx = ThisConversions + I;
8294 MaybeInvolveUserDefinedConversion(ParamType, Args[I]->
getType()))
8323 bool AllowObjCPointerConversion) {
8331 bool ObjCLifetimeConversion;
8333 ObjCLifetimeConversion))
8338 if (!AllowObjCPointerConversion)
8342 bool IncompatibleObjC =
false;
8352 bool AllowExplicit,
bool AllowResultConversion,
bool StrictPackMatch) {
8354 "Conversion function templates use AddTemplateConversionCandidate");
8369 if (!AllowResultConversion &&
8381 AllowObjCConversionOnExplicit))
8403 if (!AllowExplicit && Conversion->
isExplicit()) {
8404 Candidate.
Viable =
false;
8431 Candidate.
Viable =
false;
8440 Candidate.
Viable =
false;
8451 QualType ToCanon =
Context.getCanonicalType(ToType).getUnqualifiedType();
8452 if (FromCanon == ToCanon ||
8454 Candidate.
Viable =
false;
8471 CK_FunctionToPointerDecay, &ConversionRef,
8476 Candidate.
Viable =
false;
8506 Candidate.
Viable =
false;
8518 Candidate.
Viable =
false;
8525 Candidate.
Viable =
false;
8531 "Can only end up with a standard conversion sequence or failure");
8534 if (EnableIfAttr *FailedAttr =
8536 Candidate.
Viable =
false;
8543 Candidate.
Viable =
false;
8552 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
8553 bool AllowResultConversion) {
8562 Candidate.
Viable =
false;
8579 Candidate.
Viable =
false;
8589 assert(
Specialization &&
"Missing function template specialization?");
8591 ToType, CandidateSet, AllowObjCConversionOnExplicit,
8592 AllowExplicit, AllowResultConversion,
8600 bool AllowExplicit,
bool AllowResultConversion) {
8602 "Only conversion function templates permitted here");
8613 ToType, AllowObjCConversionOnExplicit, AllowExplicit,
8614 AllowResultConversion);
8622 AllowObjCConversionOnExplicit, AllowExplicit, AllowResultConversion);
8657 *
this, CandidateSet.
getLocation(), Object->getType(),
8658 Object->Classify(
Context), Conversion, ActingContext);
8661 if (ObjectInit.
isBad()) {
8662 Candidate.
Viable =
false;
8673 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8674 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8675 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8676 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8679 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8687 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8688 Candidate.
Viable =
false;
8695 if (Args.size() < NumParams) {
8697 Candidate.
Viable =
false;
8704 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8705 if (ArgIdx < NumParams) {
8718 Candidate.
Viable =
false;
8735 Candidate.
Viable =
false;
8741 if (EnableIfAttr *FailedAttr =
8743 Candidate.
Viable =
false;
8767 "unqualified operator lookup found a member function");
8771 FunctionArgs, CandidateSet);
8777 FunctionArgs[1], FunctionArgs[0]);
8779 Reversed, CandidateSet,
false,
false,
true,
8780 ADLCallKind::NotADL,
8784 if (ExplicitTemplateArgs)
8789 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
8790 false,
false,
true,
false, ADLCallKind::NotADL, {},
8822 if (!T1RD || (!IsComplete && !T1RD->isBeingDefined()))
8830 OperEnd = Operators.
end();
8831 Oper != OperEnd; ++Oper) {
8832 if (Oper->getAsFunction() &&
8835 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
8838 Args[0]->Classify(
Context), Args.slice(1),
8839 CandidateSet,
false, PO);
8846 bool IsAssignmentOperator,
8847 unsigned NumContextualBoolArguments) {
8862 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8875 if (ArgIdx < NumContextualBoolArguments) {
8876 assert(ParamTys[ArgIdx] ==
Context.BoolTy &&
8877 "Contextual conversion to bool requires bool type");
8883 ArgIdx == 0 && IsAssignmentOperator,
8889 Candidate.
Viable =
false;
8902class BuiltinCandidateTypeSet {
8908 TypeSet PointerTypes;
8912 TypeSet MemberPointerTypes;
8916 TypeSet EnumerationTypes;
8920 TypeSet VectorTypes;
8924 TypeSet MatrixTypes;
8927 TypeSet BitIntTypes;
8930 bool HasNonRecordTypes;
8934 bool HasArithmeticOrEnumeralTypes;
8938 bool HasNullPtrType;
8947 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
8949 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
8953 typedef TypeSet::iterator
iterator;
8955 BuiltinCandidateTypeSet(
Sema &SemaRef)
8956 : HasNonRecordTypes(
false),
8957 HasArithmeticOrEnumeralTypes(
false),
8958 HasNullPtrType(
false),
8960 Context(SemaRef.Context) { }
8962 void AddTypesConvertedFrom(
QualType Ty,
8964 bool AllowUserConversions,
8965 bool AllowExplicitConversions,
8966 const Qualifiers &VisibleTypeConversionsQuals);
8968 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
8969 llvm::iterator_range<iterator> member_pointer_types() {
8970 return MemberPointerTypes;
8972 llvm::iterator_range<iterator> enumeration_types() {
8973 return EnumerationTypes;
8975 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
8976 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
8977 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
8979 bool containsMatrixType(QualType Ty)
const {
return MatrixTypes.count(Ty); }
8980 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
8981 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
8982 bool hasNullPtrType()
const {
return HasNullPtrType; }
8997BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(QualType Ty,
8998 const Qualifiers &VisibleQuals) {
9001 if (!PointerTypes.insert(Ty))
9005 const PointerType *PointerTy = Ty->
getAs<PointerType>();
9006 bool buildObjCPtr =
false;
9008 const ObjCObjectPointerType *PTy = Ty->
castAs<ObjCObjectPointerType>();
9010 buildObjCPtr =
true;
9022 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
9028 if ((CVR | BaseCVR) != CVR)
continue;
9043 QualType QPointerTy;
9050 PointerTypes.insert(QPointerTy);
9066BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
9069 if (!MemberPointerTypes.insert(Ty))
9072 const MemberPointerType *PointerTy = Ty->
getAs<MemberPointerType>();
9073 assert(PointerTy &&
"type was not a member pointer type!");
9088 if ((CVR | BaseCVR) != CVR)
continue;
9092 QPointeeTy, std::nullopt, Cls));
9107BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty,
9109 bool AllowUserConversions,
9110 bool AllowExplicitConversions,
9111 const Qualifiers &VisibleQuals) {
9117 if (
const ReferenceType *RefTy = Ty->
getAs<ReferenceType>())
9122 Ty = SemaRef.Context.getArrayDecayedType(Ty);
9129 HasNonRecordTypes = HasNonRecordTypes || !TyIsRec;
9132 HasArithmeticOrEnumeralTypes =
9136 PointerTypes.insert(Ty);
9137 else if (Ty->
getAs<PointerType>() || Ty->
getAs<ObjCObjectPointerType>()) {
9140 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
9144 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
9147 HasArithmeticOrEnumeralTypes =
true;
9148 EnumerationTypes.insert(Ty);
9150 HasArithmeticOrEnumeralTypes =
true;
9151 BitIntTypes.insert(Ty);
9155 HasArithmeticOrEnumeralTypes =
true;
9156 VectorTypes.insert(Ty);
9160 HasArithmeticOrEnumeralTypes =
true;
9161 MatrixTypes.insert(Ty);
9163 HasNullPtrType =
true;
9164 }
else if (AllowUserConversions && TyIsRec) {
9166 if (!SemaRef.isCompleteType(Loc, Ty))
9170 for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) {
9180 if (AllowExplicitConversions || !Conv->
isExplicit()) {
9228 ClassDecl = RHSMPType->getMostRecentCXXRecordDecl();
9276 if (Available.hasAtomic()) {
9277 Available.removeAtomic();
9284 if (Available.hasVolatile()) {
9285 Available.removeVolatile();
9319class BuiltinOperatorOverloadBuilder {
9322 ArrayRef<Expr *> Args;
9323 QualifiersAndAtomic VisibleTypeConversionsQuals;
9324 bool HasArithmeticOrEnumeralCandidateType;
9325 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes;
9326 OverloadCandidateSet &CandidateSet;
9328 static constexpr int ArithmeticTypesCap = 26;
9329 SmallVector<CanQualType, ArithmeticTypesCap> ArithmeticTypes;
9334 unsigned FirstIntegralType,
9336 unsigned FirstPromotedIntegralType,
9337 LastPromotedIntegralType;
9338 unsigned FirstPromotedArithmeticType,
9339 LastPromotedArithmeticType;
9340 unsigned NumArithmeticTypes;
9342 void InitArithmeticTypes() {
9344 FirstPromotedArithmeticType = 0;
9354 FirstIntegralType = ArithmeticTypes.size();
9355 FirstPromotedIntegralType = ArithmeticTypes.size();
9377 llvm::SmallSetVector<CanQualType, 2> BitIntCandidates;
9378 for (BuiltinCandidateTypeSet &Candidate : CandidateTypes) {
9379 for (QualType BitTy : Candidate.bitint_types())
9382 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
9383 LastPromotedIntegralType = ArithmeticTypes.size();
9384 LastPromotedArithmeticType = ArithmeticTypes.size();
9398 LastIntegralType = ArithmeticTypes.size();
9399 NumArithmeticTypes = ArithmeticTypes.size();
9406 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
9407 ArithmeticTypesCap &&
9408 "Enough inline storage for all arithmetic types.");
9413 void addPlusPlusMinusMinusStyleOverloads(QualType CandidateTy,
9416 QualType ParamTypes[2] = {
9456 void AddCandidate(QualType L, QualType R) {
9457 QualType LandR[2] = {L, R};
9462 BuiltinOperatorOverloadBuilder(
9463 Sema &S, ArrayRef<Expr *> Args,
9464 QualifiersAndAtomic VisibleTypeConversionsQuals,
9465 bool HasArithmeticOrEnumeralCandidateType,
9466 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes,
9467 OverloadCandidateSet &CandidateSet)
9469 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
9470 HasArithmeticOrEnumeralCandidateType(
9471 HasArithmeticOrEnumeralCandidateType),
9472 CandidateTypes(CandidateTypes),
9473 CandidateSet(CandidateSet) {
9475 InitArithmeticTypes();
9498 if (!HasArithmeticOrEnumeralCandidateType)
9501 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9502 const auto TypeOfT = ArithmeticTypes[Arith];
9504 if (Op == OO_MinusMinus)
9506 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9509 addPlusPlusMinusMinusStyleOverloads(
9526 void addPlusPlusMinusMinusPointerOverloads() {
9527 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
9529 if (!PtrTy->getPointeeType()->isObjectType())
9532 addPlusPlusMinusMinusStyleOverloads(
9534 (!PtrTy.isVolatileQualified() &&
9536 (!PtrTy.isRestrictQualified() &&
9551 void addUnaryStarPointerOverloads() {
9552 for (QualType ParamTy : CandidateTypes[0].pointer_types()) {
9557 if (
const FunctionProtoType *Proto =PointeeTy->
getAs<FunctionProtoType>())
9558 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9571 void addUnaryPlusOrMinusArithmeticOverloads() {
9572 if (!HasArithmeticOrEnumeralCandidateType)
9575 for (
unsigned Arith = FirstPromotedArithmeticType;
9576 Arith < LastPromotedArithmeticType; ++Arith) {
9577 QualType ArithTy = ArithmeticTypes[Arith];
9582 for (QualType VecTy : CandidateTypes[0].vector_types())
9591 void addUnaryPlusPointerOverloads() {
9592 for (QualType ParamTy : CandidateTypes[0].pointer_types())
9601 void addUnaryTildePromotedIntegralOverloads() {
9602 if (!HasArithmeticOrEnumeralCandidateType)
9605 for (
unsigned Int = FirstPromotedIntegralType;
9606 Int < LastPromotedIntegralType; ++
Int) {
9607 QualType IntTy = ArithmeticTypes[
Int];
9612 for (QualType VecTy : CandidateTypes[0].vector_types())
9622 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9624 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9626 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9627 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9632 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9636 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9638 if (AddedTypes.insert(NullPtrTy).second) {
9639 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9658 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9671 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9672 UserDefinedBinaryOperators;
9674 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9675 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9677 CEnd = CandidateSet.
end();
9679 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9682 if (
C->Function->isFunctionTemplateSpecialization())
9689 QualType FirstParamType =
C->Function->getParamDecl(
Reversed ? 1 : 0)
9691 .getUnqualifiedType();
9692 QualType SecondParamType =
C->Function->getParamDecl(
Reversed ? 0 : 1)
9694 .getUnqualifiedType();
9702 UserDefinedBinaryOperators.insert(
9710 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9712 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9713 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9717 if (IsSpaceship && PtrTy->isFunctionPointerType())
9720 QualType ParamTypes[2] = {PtrTy, PtrTy};
9723 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9728 if (!AddedTypes.insert(CanonType).second ||
9729 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9732 QualType ParamTypes[2] = {EnumTy, EnumTy};
9757 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9759 for (
int Arg = 0; Arg < 2; ++Arg) {
9760 QualType AsymmetricParamTypes[2] = {
9764 for (QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9769 AsymmetricParamTypes[Arg] = PtrTy;
9770 if (Arg == 0 || Op == OO_Plus) {
9775 if (Op == OO_Minus) {
9780 QualType ParamTypes[2] = {PtrTy, PtrTy};
9816 void addGenericBinaryArithmeticOverloads() {
9817 if (!HasArithmeticOrEnumeralCandidateType)
9820 for (
unsigned Left = FirstPromotedArithmeticType;
9821 Left < LastPromotedArithmeticType; ++
Left) {
9822 for (
unsigned Right = FirstPromotedArithmeticType;
9823 Right < LastPromotedArithmeticType; ++
Right) {
9824 QualType LandR[2] = { ArithmeticTypes[
Left],
9825 ArithmeticTypes[
Right] };
9832 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
9833 for (QualType Vec2Ty : CandidateTypes[1].vector_types()) {
9834 QualType LandR[2] = {Vec1Ty, Vec2Ty};
9844 void addMatrixBinaryArithmeticOverloads() {
9845 if (!HasArithmeticOrEnumeralCandidateType)
9848 for (QualType M1 : CandidateTypes[0].matrix_types()) {
9850 AddCandidate(M1, M1);
9853 for (QualType M2 : CandidateTypes[1].matrix_types()) {
9855 if (!CandidateTypes[0].containsMatrixType(M2))
9856 AddCandidate(M2, M2);
9891 void addThreeWayArithmeticOverloads() {
9892 addGenericBinaryArithmeticOverloads();
9909 void addBinaryBitwiseArithmeticOverloads() {
9910 if (!HasArithmeticOrEnumeralCandidateType)
9913 for (
unsigned Left = FirstPromotedIntegralType;
9914 Left < LastPromotedIntegralType; ++
Left) {
9915 for (
unsigned Right = FirstPromotedIntegralType;
9917 QualType LandR[2] = { ArithmeticTypes[
Left],
9918 ArithmeticTypes[
Right] };
9931 void addAssignmentMemberPointerOrEnumeralOverloads() {
9933 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9935 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
9936 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9943 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9968 void addAssignmentPointerOverloads(
bool isEqualOp) {
9970 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9972 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
9976 else if (!PtrTy->getPointeeType()->isObjectType())
9980 QualType ParamTypes[2] = {
9987 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
9997 if (!PtrTy.isRestrictQualified() &&
10005 if (NeedVolatile) {
10017 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10022 QualType ParamTypes[2] = {
10031 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10033 if (NeedVolatile) {
10041 if (!PtrTy.isRestrictQualified() &&
10049 if (NeedVolatile) {
10074 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
10075 if (!HasArithmeticOrEnumeralCandidateType)
10078 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
10079 for (
unsigned Right = FirstPromotedArithmeticType;
10080 Right < LastPromotedArithmeticType; ++
Right) {
10081 QualType ParamTypes[2];
10082 ParamTypes[1] = ArithmeticTypes[
Right];
10084 S, ArithmeticTypes[Left], Args[0]);
10087 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10097 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10098 for (QualType Vec2Ty : CandidateTypes[0].vector_types()) {
10099 QualType ParamTypes[2];
10100 ParamTypes[1] = Vec2Ty;
10128 void addAssignmentIntegralOverloads() {
10129 if (!HasArithmeticOrEnumeralCandidateType)
10132 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
10133 for (
unsigned Right = FirstPromotedIntegralType;
10134 Right < LastPromotedIntegralType; ++
Right) {
10135 QualType ParamTypes[2];
10136 ParamTypes[1] = ArithmeticTypes[
Right];
10138 S, ArithmeticTypes[Left], Args[0]);
10141 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10157 void addExclaimOverload() {
10163 void addAmpAmpOrPipePipeOverload() {
10180 void addSubscriptOverloads() {
10181 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10191 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10211 void addArrowStarOverloads() {
10212 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10213 QualType C1Ty = PtrTy;
10215 QualifierCollector Q1;
10226 for (QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
10233 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
10236 if (!VisibleTypeConversionsQuals.
hasVolatile() &&
10237 T.isVolatileQualified())
10239 if (!VisibleTypeConversionsQuals.
hasRestrict() &&
10240 T.isRestrictQualified())
10258 void addConditionalOperatorOverloads() {
10260 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10262 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10263 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
10267 QualType ParamTypes[2] = {PtrTy, PtrTy};
10271 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10275 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
10280 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10281 if (!EnumTy->castAsCanonical<EnumType>()->getDecl()->isScoped())
10287 QualType ParamTypes[2] = {EnumTy, EnumTy};
10306 VisibleTypeConversionsQuals.
addConst();
10307 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10309 if (Args[ArgIdx]->
getType()->isAtomicType())
10310 VisibleTypeConversionsQuals.
addAtomic();
10313 bool HasNonRecordCandidateType =
false;
10314 bool HasArithmeticOrEnumeralCandidateType =
false;
10316 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10317 CandidateTypes.emplace_back(*
this);
10318 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->
getType(),
10321 (Op == OO_Exclaim ||
10323 Op == OO_PipePipe),
10324 VisibleTypeConversionsQuals);
10325 HasNonRecordCandidateType = HasNonRecordCandidateType ||
10326 CandidateTypes[ArgIdx].hasNonRecordTypes();
10327 HasArithmeticOrEnumeralCandidateType =
10328 HasArithmeticOrEnumeralCandidateType ||
10329 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
10337 if (!HasNonRecordCandidateType &&
10338 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
10342 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
10343 VisibleTypeConversionsQuals,
10344 HasArithmeticOrEnumeralCandidateType,
10345 CandidateTypes, CandidateSet);
10351 llvm_unreachable(
"Expected an overloaded operator");
10356 case OO_Array_Delete:
10359 "Special operators don't use AddBuiltinOperatorCandidates");
10371 if (Args.size() == 1)
10372 OpBuilder.addUnaryPlusPointerOverloads();
10376 if (Args.size() == 1) {
10377 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
10379 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
10380 OpBuilder.addGenericBinaryArithmeticOverloads();
10381 OpBuilder.addMatrixBinaryArithmeticOverloads();
10386 if (Args.size() == 1)
10387 OpBuilder.addUnaryStarPointerOverloads();
10389 OpBuilder.addGenericBinaryArithmeticOverloads();
10390 OpBuilder.addMatrixBinaryArithmeticOverloads();
10395 OpBuilder.addGenericBinaryArithmeticOverloads();
10399 case OO_MinusMinus:
10400 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
10401 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
10404 case OO_EqualEqual:
10405 case OO_ExclaimEqual:
10406 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
10407 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10408 OpBuilder.addGenericBinaryArithmeticOverloads();
10414 case OO_GreaterEqual:
10415 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10416 OpBuilder.addGenericBinaryArithmeticOverloads();
10420 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
10421 OpBuilder.addThreeWayArithmeticOverloads();
10428 case OO_GreaterGreater:
10429 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10433 if (Args.size() == 1)
10439 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10443 OpBuilder.addUnaryTildePromotedIntegralOverloads();
10447 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
10451 case OO_MinusEqual:
10452 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
10456 case OO_SlashEqual:
10457 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
10460 case OO_PercentEqual:
10461 case OO_LessLessEqual:
10462 case OO_GreaterGreaterEqual:
10464 case OO_CaretEqual:
10466 OpBuilder.addAssignmentIntegralOverloads();
10470 OpBuilder.addExclaimOverload();
10475 OpBuilder.addAmpAmpOrPipePipeOverload();
10479 if (Args.size() == 2)
10480 OpBuilder.addSubscriptOverloads();
10484 OpBuilder.addArrowStarOverloads();
10487 case OO_Conditional:
10488 OpBuilder.addConditionalOperatorOverloads();
10489 OpBuilder.addGenericBinaryArithmeticOverloads();
10500 bool PartialOverloading) {
10517 CandEnd = CandidateSet.
end();
10518 Cand != CandEnd; ++Cand)
10519 if (Cand->Function) {
10523 Fns.
erase(FunTmpl);
10532 if (ExplicitTemplateArgs)
10536 FD, FoundDecl, Args, CandidateSet,
false,
10537 PartialOverloading,
true,
10538 false, ADLCallKind::UsesADL);
10541 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10542 false, PartialOverloading,
10549 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10550 false, PartialOverloading,
10551 true, ADLCallKind::UsesADL);
10553 *
this, Args, FTD->getTemplatedDecl())) {
10557 if (ReversedArgs.empty())
10561 FTD, FoundDecl, ExplicitTemplateArgs, ReversedArgs, CandidateSet,
10562 false, PartialOverloading,
10563 true, ADLCallKind::UsesADL,
10588 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10589 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10590 if (!Cand1Attr || !Cand2Attr) {
10591 if (Cand1Attr == Cand2Attr)
10592 return Comparison::Equal;
10593 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10599 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10600 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10601 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10602 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10607 return Comparison::Worse;
10609 return Comparison::Better;
10614 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10615 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10616 if (Cand1ID != Cand2ID)
10617 return Comparison::Worse;
10620 return Comparison::Equal;
10628 return Comparison::Equal;
10634 return Comparison::Equal;
10635 return Comparison::Worse;
10638 return Comparison::Better;
10644 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10645 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10647 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10648 return Comparison::Equal;
10650 if (Cand1CPUDisp && !Cand2CPUDisp)
10651 return Comparison::Better;
10652 if (Cand2CPUDisp && !Cand1CPUDisp)
10653 return Comparison::Worse;
10655 if (Cand1CPUSpec && Cand2CPUSpec) {
10656 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10657 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10658 ? Comparison::Better
10659 : Comparison::Worse;
10661 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10662 FirstDiff = std::mismatch(
10663 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10664 Cand2CPUSpec->cpus_begin(),
10666 return LHS->getName() == RHS->getName();
10669 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10670 "Two different cpu-specific versions should not have the same "
10671 "identifier list, otherwise they'd be the same decl!");
10672 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->getName()
10673 ? Comparison::Better
10674 : Comparison::Worse;
10676 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10682static std::optional<QualType>
10685 return std::nullopt;
10691 return M->getFunctionObjectParameterReferenceType();
10705 PT2->getInstantiatedFromMemberTemplate()))
10716 assert(I < F->getNumParams());
10723 if (F1NumParams != F2NumParams)
10726 unsigned I1 = 0, I2 = 0;
10727 for (
unsigned I = 0; I != F1NumParams; ++I) {
10728 QualType T1 = NextParam(F1, I1, I == 0);
10729 QualType T2 = NextParam(F2, I2, I == 0);
10730 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10731 if (!Context.hasSameUnqualifiedType(T1, T2))
10744 bool IsFn1Reversed,
10745 bool IsFn2Reversed) {
10746 assert(Fn1 && Fn2);
10751 IsFn1Reversed ^ IsFn2Reversed))
10754 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10755 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10756 if (Mem1 && Mem2) {
10759 if (Mem1->getParent() != Mem2->getParent())
10763 if (Mem1->isInstance() && Mem2->isInstance() &&
10765 Mem1->getFunctionObjectParameterReferenceType(),
10766 Mem1->getFunctionObjectParameterReferenceType()))
10772static FunctionDecl *
10774 bool IsFn1Reversed,
bool IsFn2Reversed) {
10784 if (Cand1IsSpecialization || Cand2IsSpecialization)
10801 bool PartialOverloading) {
10847 bool IsCand1ImplicitHD =
10849 bool IsCand2ImplicitHD =
10864 auto EmitThreshold =
10865 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
10866 (IsCand1ImplicitHD || IsCand2ImplicitHD))
10869 auto Cand1Emittable = P1 > EmitThreshold;
10870 auto Cand2Emittable = P2 > EmitThreshold;
10871 if (Cand1Emittable && !Cand2Emittable)
10873 if (!Cand1Emittable && Cand2Emittable)
10884 unsigned StartArg = 0;
10892 return ICS.isStandard() &&
10904 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
10905 bool HasBetterConversion =
false;
10906 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
10907 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
10908 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
10909 if (Cand1Bad != Cand2Bad) {
10912 HasBetterConversion =
true;
10916 if (HasBetterConversion)
10923 bool HasWorseConversion =
false;
10924 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
10930 HasBetterConversion =
true;
10949 HasWorseConversion =
true;
10964 if (HasBetterConversion && !HasWorseConversion)
11015 bool Cand1IsSpecialization = Cand1.
Function &&
11017 bool Cand2IsSpecialization = Cand2.
Function &&
11019 if (Cand1IsSpecialization != Cand2IsSpecialization)
11020 return Cand2IsSpecialization;
11026 if (Cand1IsSpecialization && Cand2IsSpecialization) {
11027 const auto *Obj1Context =
11029 const auto *Obj2Context =
11058 bool Cand1IsInherited =
11060 bool Cand2IsInherited =
11062 if (Cand1IsInherited != Cand2IsInherited)
11063 return Cand2IsInherited;
11064 else if (Cand1IsInherited) {
11065 assert(Cand2IsInherited);
11068 if (Cand1Class->isDerivedFrom(Cand2Class))
11070 if (Cand2Class->isDerivedFrom(Cand1Class))
11087 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
11088 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
11089 if (Guide1 && Guide2) {
11091 if (Guide1->isImplicit() != Guide2->isImplicit())
11092 return Guide2->isImplicit();
11102 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
11103 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
11104 if (Constructor1 && Constructor2) {
11105 bool isC1Templated = Constructor1->getTemplatedKind() !=
11107 bool isC2Templated = Constructor2->getTemplatedKind() !=
11109 if (isC1Templated != isC2Templated)
11110 return isC2Templated;
11118 if (Cmp != Comparison::Equal)
11119 return Cmp == Comparison::Better;
11122 bool HasPS1 = Cand1.
Function !=
nullptr &&
11124 bool HasPS2 = Cand2.
Function !=
nullptr &&
11126 if (HasPS1 != HasPS2 && HasPS1)
11130 if (MV == Comparison::Better)
11132 if (MV == Comparison::Worse)
11147 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
11148 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
11150 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
11151 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
11172 auto *VA = dyn_cast_or_null<ValueDecl>(A);
11173 auto *VB = dyn_cast_or_null<ValueDecl>(B);
11179 if (!VA->getDeclContext()->getRedeclContext()->Equals(
11180 VB->getDeclContext()->getRedeclContext()) ||
11182 VA->isExternallyVisible() || VB->isExternallyVisible())
11190 if (
Context.hasSameType(VA->getType(), VB->getType()))
11195 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
11196 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
11201 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
11202 !
Context.hasSameType(EnumA->getIntegerType(),
11203 EnumB->getIntegerType()))
11206 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
11216 assert(D &&
"Unknown declaration");
11217 Diag(Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) << D;
11223 for (
auto *E : Equiv) {
11225 Diag(E->getLocation(), diag::note_equivalent_internal_linkage_decl)
11235 ->Satisfaction.ContainsErrors;
11241 bool PartialOverloading,
bool AllowExplicit,
11243 bool AggregateCandidateDeduction) {
11246 allocateDeferredCandidate<DeferredFunctionTemplateOverloadCandidate>();
11251 false, AllowExplicit, SuppressUserConversions,
11252 PartialOverloading, AggregateCandidateDeduction},
11259 HasDeferredTemplateConstructors |=
11267 bool SuppressUserConversions,
bool PartialOverloading,
11273 allocateDeferredCandidate<DeferredMethodTemplateOverloadCandidate>();
11279 false, SuppressUserConversions, PartialOverloading,
11285 ObjectClassification,
11293 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
11294 bool AllowResultConversion) {
11297 allocateDeferredCandidate<DeferredConversionTemplateOverloadCandidate>();
11301 AllowObjCConversionOnExplicit, AllowResultConversion,
11318 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
11319 nullptr,
C.ObjectType,
C.ObjectClassification,
11320 C.Args,
C.SuppressUserConversions,
C.PartialOverloading,
C.PO);
11327 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
11328 nullptr,
C.Args,
C.SuppressUserConversions,
11329 C.PartialOverloading,
C.AllowExplicit,
C.IsADLCandidate,
C.PO,
11330 C.AggregateCandidateDeduction);
11337 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
C.From,
11338 C.ToType,
C.AllowObjCConversionOnExplicit,
C.AllowExplicit,
11339 C.AllowResultConversion);
11343 Candidates.reserve(Candidates.size() + DeferredCandidatesCount);
11346 switch (Cand->
Kind) {
11365 FirstDeferredCandidate =
nullptr;
11366 DeferredCandidatesCount = 0;
11370OverloadCandidateSet::ResultForBestCandidate(
const iterator &Best) {
11372 if (Best->Function && Best->Function->isDeleted())
11377void OverloadCandidateSet::CudaExcludeWrongSideCandidates(
11394 bool ContainsSameSideCandidate =
11402 if (!ContainsSameSideCandidate)
11405 auto IsWrongSideCandidate = [&](
const OverloadCandidate *Cand) {
11411 llvm::erase_if(Candidates, IsWrongSideCandidate);
11429 DeferredCandidatesCount == 0) &&
11430 "Unexpected deferred template candidates");
11432 bool TwoPhaseResolution =
11433 DeferredCandidatesCount != 0 && !ResolutionByPerfectCandidateIsDisabled;
11435 if (TwoPhaseResolution) {
11437 if (Best !=
end() && Best->isPerfectMatch(S.
Context)) {
11438 if (!(HasDeferredTemplateConstructors &&
11439 isa_and_nonnull<CXXConversionDecl>(Best->Function)))
11445 return BestViableFunctionImpl(S, Loc, Best);
11452 Candidates.reserve(this->Candidates.size());
11453 std::transform(this->Candidates.begin(), this->Candidates.end(),
11454 std::back_inserter(Candidates),
11458 CudaExcludeWrongSideCandidates(S, Candidates);
11461 for (
auto *Cand : Candidates) {
11462 Cand->
Best =
false;
11464 if (Best ==
end() ||
11481 llvm::SmallVector<OverloadCandidate *, 4> PendingBest;
11482 llvm::SmallVector<const NamedDecl *, 4> EquivalentCands;
11483 PendingBest.push_back(&*Best);
11488 while (!PendingBest.empty()) {
11489 auto *Curr = PendingBest.pop_back_val();
11490 for (
auto *Cand : Candidates) {
11493 PendingBest.push_back(Cand);
11498 EquivalentCands.push_back(Cand->
Function);
11510 if (!EquivalentCands.empty())
11518enum OverloadCandidateKind {
11521 oc_reversed_binary_operator,
11523 oc_implicit_default_constructor,
11524 oc_implicit_copy_constructor,
11525 oc_implicit_move_constructor,
11526 oc_implicit_copy_assignment,
11527 oc_implicit_move_assignment,
11528 oc_implicit_equality_comparison,
11529 oc_inherited_constructor
11532enum OverloadCandidateSelect {
11535 ocs_described_template,
11538static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
11539ClassifyOverloadCandidate(Sema &S,
const NamedDecl *
Found,
11540 const FunctionDecl *Fn,
11542 std::string &Description) {
11545 if (FunctionTemplateDecl *FunTmpl =
Fn->getPrimaryTemplate()) {
11548 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
11551 OverloadCandidateSelect Select = [&]() {
11552 if (!Description.empty())
11553 return ocs_described_template;
11554 return isTemplate ? ocs_template : ocs_non_template;
11557 OverloadCandidateKind Kind = [&]() {
11558 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
11559 return oc_implicit_equality_comparison;
11562 return oc_reversed_binary_operator;
11564 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
11565 if (!Ctor->isImplicit()) {
11567 return oc_inherited_constructor;
11569 return oc_constructor;
11572 if (Ctor->isDefaultConstructor())
11573 return oc_implicit_default_constructor;
11575 if (Ctor->isMoveConstructor())
11576 return oc_implicit_move_constructor;
11578 assert(Ctor->isCopyConstructor() &&
11579 "unexpected sort of implicit constructor");
11580 return oc_implicit_copy_constructor;
11583 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
11586 if (!Meth->isImplicit())
11589 if (Meth->isMoveAssignmentOperator())
11590 return oc_implicit_move_assignment;
11592 if (Meth->isCopyAssignmentOperator())
11593 return oc_implicit_copy_assignment;
11599 return oc_function;
11602 return std::make_pair(Kind, Select);
11605void MaybeEmitInheritedConstructorNote(Sema &S,
const Decl *FoundDecl) {
11608 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
11610 diag::note_ovl_candidate_inherited_constructor)
11611 << Shadow->getNominatedBaseClass();
11620 if (EnableIf->getCond()->isValueDependent() ||
11621 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
11638 bool InOverloadResolution,
11642 if (InOverloadResolution)
11644 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
11646 S.
Diag(Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
11657 if (InOverloadResolution) {
11660 TemplateArgString +=
" ";
11662 FunTmpl->getTemplateParameters(),
11667 diag::note_ovl_candidate_unsatisfied_constraints)
11668 << TemplateArgString;
11670 S.
Diag(Loc, diag::err_addrof_function_constraints_not_satisfied)
11679 return P->hasAttr<PassObjectSizeAttr>();
11686 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11687 if (InOverloadResolution)
11689 diag::note_ovl_candidate_has_pass_object_size_params)
11692 S.
Diag(Loc, diag::err_address_of_function_with_pass_object_size_params)
11708 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11716 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11721 if (!RD->isLambda())
11726 CallOp->getType()->castAs<
FunctionType>()->getCallConv();
11731 return ConvToCC != CallOpCC;
11737 QualType DestType,
bool TakingAddress) {
11740 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11741 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11743 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11744 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11749 std::string FnDesc;
11750 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11751 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11753 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11757 Diag(Fn->getLocation(), PD);
11758 MaybeEmitInheritedConstructorNote(*
this,
Found);
11776 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11777 for (
auto I = Cands.begin(), E = Cands.end(); I != E; ++I) {
11781 if (
auto *
Template = I->Function->getPrimaryTemplate())
11782 Template->getAssociatedConstraints(AC);
11784 I->Function->getAssociatedConstraints(AC);
11787 if (FirstCand ==
nullptr) {
11788 FirstCand = I->Function;
11790 }
else if (SecondCand ==
nullptr) {
11791 SecondCand = I->Function;
11804 SecondCand, SecondAC))
11813 bool TakingAddress) {
11823 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
11827 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
11840 S.
Diag(CaretLoc, PDiag)
11842 unsigned CandsShown = 0;
11856 unsigned I,
bool TakingCandidateAddress) {
11858 assert(Conv.
isBad());
11859 assert(Cand->
Function &&
"for now, candidate must be a function");
11865 bool isObjectArgument =
false;
11869 isObjectArgument =
true;
11870 else if (!Fn->hasCXXExplicitFunctionObjectParameter())
11874 std::string FnDesc;
11875 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
11886 bool HasParamPack =
11887 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
11888 return Parm->isParameterPack();
11890 if (!isObjectArgument && !HasParamPack)
11891 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
11894 assert(FromExpr &&
"overload set argument came from implicit argument?");
11900 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
11901 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11902 << ToParamRange << ToTy << Name << I + 1;
11903 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11912 CToTy = RT->getPointeeType();
11917 CFromTy = FromPT->getPointeeType();
11918 CToTy = ToPT->getPointeeType();
11928 if (isObjectArgument)
11929 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
11930 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11933 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
11934 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
11937 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11942 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
11943 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11946 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11951 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
11952 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11955 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11960 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ptrauth)
11961 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11966 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11971 assert(CVR &&
"expected qualifiers mismatch");
11973 if (isObjectArgument) {
11974 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
11975 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11976 << FromTy << (CVR - 1);
11978 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
11979 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11980 << ToParamRange << FromTy << (CVR - 1) << I + 1;
11982 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
11988 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
11989 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
11990 << (
unsigned)isObjectArgument << I + 1
11993 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12000 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
12001 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12002 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12007 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12019 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
12020 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12021 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12022 << (
unsigned)(Cand->
Fix.
Kind);
12024 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12029 unsigned BaseToDerivedConversion = 0;
12032 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12034 !FromPtrTy->getPointeeType()->isIncompleteType() &&
12035 !ToPtrTy->getPointeeType()->isIncompleteType() &&
12037 FromPtrTy->getPointeeType()))
12038 BaseToDerivedConversion = 1;
12046 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12048 FromIface->isSuperClassOf(ToIface))
12049 BaseToDerivedConversion = 2;
12051 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy,
12054 !ToRefTy->getPointeeType()->isIncompleteType() &&
12056 BaseToDerivedConversion = 3;
12060 if (BaseToDerivedConversion) {
12061 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
12062 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12063 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
12065 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12074 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
12075 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12076 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
12078 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12088 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12089 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12090 << (
unsigned)(Cand->
Fix.
Kind);
12099 S.
Diag(Fn->getLocation(), FDiag);
12101 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12108 unsigned NumArgs,
bool IsAddressOf =
false) {
12109 assert(Cand->
Function &&
"Candidate is required to be a function.");
12111 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12112 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12119 if (Fn->isInvalidDecl() &&
12123 if (NumArgs < MinParams) {
12140 unsigned NumFormalArgs,
12141 bool IsAddressOf =
false) {
12143 "The templated declaration should at least be a function"
12144 " when diagnosing bad template argument deduction due to too many"
12145 " or too few arguments");
12151 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12152 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12155 bool HasExplicitObjectParam =
12156 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
12158 unsigned ParamCount =
12159 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12160 unsigned mode, modeCount;
12162 if (NumFormalArgs < MinParams) {
12163 if (MinParams != ParamCount || FnTy->isVariadic() ||
12164 FnTy->isTemplateVariadic())
12168 modeCount = MinParams;
12170 if (MinParams != ParamCount)
12174 modeCount = ParamCount;
12177 std::string Description;
12178 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12179 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
12181 if (modeCount == 1 && !IsAddressOf &&
12182 Fn->getParamDecl(HasExplicitObjectParam ? 1 : 0)->getDeclName())
12183 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
12184 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12185 << Description << mode
12186 << Fn->getParamDecl(HasExplicitObjectParam ? 1 : 0) << NumFormalArgs
12187 << HasExplicitObjectParam << Fn->getParametersSourceRange();
12189 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
12190 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12191 << Description << mode << modeCount << NumFormalArgs
12192 << HasExplicitObjectParam << Fn->getParametersSourceRange();
12194 MaybeEmitInheritedConstructorNote(S,
Found);
12199 unsigned NumFormalArgs) {
12200 assert(Cand->
Function &&
"Candidate must be a function");
12210 llvm_unreachable(
"Unsupported: Getting the described template declaration"
12211 " for bad deduction diagnosis");
12218 bool TakingCandidateAddress) {
12224 switch (DeductionFailure.
getResult()) {
12227 "TemplateDeductionResult::Success while diagnosing bad deduction");
12229 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
12230 "while diagnosing bad deduction");
12236 assert(ParamD &&
"no parameter found for incomplete deduction result");
12238 diag::note_ovl_candidate_incomplete_deduction)
12240 MaybeEmitInheritedConstructorNote(S,
Found);
12245 assert(ParamD &&
"no parameter found for incomplete deduction result");
12247 diag::note_ovl_candidate_incomplete_deduction_pack)
12249 << (DeductionFailure.
getFirstArg()->pack_size() + 1)
12251 MaybeEmitInheritedConstructorNote(S,
Found);
12256 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
12274 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
12275 << ParamD->
getDeclName() << Arg << NonCanonParam;
12276 MaybeEmitInheritedConstructorNote(S,
Found);
12281 assert(ParamD &&
"no parameter found for inconsistent deduction result");
12295 diag::note_ovl_candidate_inconsistent_deduction_types)
12298 MaybeEmitInheritedConstructorNote(S,
Found);
12318 diag::note_ovl_candidate_inconsistent_deduction)
12321 MaybeEmitInheritedConstructorNote(S,
Found);
12326 assert(ParamD &&
"no parameter found for invalid explicit arguments");
12329 diag::note_ovl_candidate_explicit_arg_mismatch_named)
12334 index = TTP->getIndex();
12336 = dyn_cast<NonTypeTemplateParmDecl>(ParamD))
12337 index = NTTP->getIndex();
12341 diag::note_ovl_candidate_explicit_arg_mismatch_unnamed)
12344 MaybeEmitInheritedConstructorNote(S,
Found);
12351 TemplateArgString =
" ";
12354 if (TemplateArgString.size() == 1)
12355 TemplateArgString.clear();
12357 diag::note_ovl_candidate_unsatisfied_constraints)
12358 << TemplateArgString;
12361 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
12371 diag::note_ovl_candidate_instantiation_depth);
12372 MaybeEmitInheritedConstructorNote(S,
Found);
12380 TemplateArgString =
" ";
12383 if (TemplateArgString.size() == 1)
12384 TemplateArgString.clear();
12389 if (PDiag && PDiag->second.getDiagID() ==
12390 diag::err_typename_nested_not_found_enable_if) {
12393 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
12394 <<
"'enable_if'" << TemplateArgString;
12399 if (PDiag && PDiag->second.getDiagID() ==
12400 diag::err_typename_nested_not_found_requirement) {
12402 diag::note_ovl_candidate_disabled_by_requirement)
12403 << PDiag->second.getStringArg(0) << TemplateArgString;
12413 SFINAEArgString =
": ";
12415 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
12419 diag::note_ovl_candidate_substitution_failure)
12420 << TemplateArgString << SFINAEArgString << R;
12421 MaybeEmitInheritedConstructorNote(S,
Found);
12431 TemplateArgString =
" ";
12434 if (TemplateArgString.size() == 1)
12435 TemplateArgString.clear();
12438 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
12441 << TemplateArgString
12466 diag::note_ovl_candidate_non_deduced_mismatch_qualified)
12482 diag::note_ovl_candidate_non_deduced_mismatch)
12483 << FirstTA << SecondTA;
12489 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
12490 MaybeEmitInheritedConstructorNote(S,
Found);
12494 diag::note_cuda_ovl_candidate_target_mismatch);
12502 bool TakingCandidateAddress) {
12503 assert(Cand->
Function &&
"Candidate must be a function");
12518 assert(Cand->
Function &&
"Candidate must be a Function.");
12524 std::string FnDesc;
12525 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12526 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
12529 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
12530 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12532 << CalleeTarget << CallerTarget;
12537 if (Meth !=
nullptr && Meth->
isImplicit()) {
12541 switch (FnKindPair.first) {
12544 case oc_implicit_default_constructor:
12547 case oc_implicit_copy_constructor:
12550 case oc_implicit_move_constructor:
12553 case oc_implicit_copy_assignment:
12556 case oc_implicit_move_assignment:
12561 bool ConstRHS =
false;
12565 ConstRHS = RT->getPointeeType().isConstQualified();
12576 assert(Cand->
Function &&
"Candidate must be a function");
12580 S.
Diag(Callee->getLocation(),
12581 diag::note_ovl_candidate_disabled_by_function_cond_attr)
12582 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
12586 assert(Cand->
Function &&
"Candidate must be a function");
12589 assert(ES.
isExplicit() &&
"not an explicit candidate");
12592 switch (Fn->getDeclKind()) {
12593 case Decl::Kind::CXXConstructor:
12596 case Decl::Kind::CXXConversion:
12599 case Decl::Kind::CXXDeductionGuide:
12600 Kind = Fn->isImplicit() ? 0 : 2;
12603 llvm_unreachable(
"invalid Decl");
12612 First = Pattern->getFirstDecl();
12615 diag::note_ovl_candidate_explicit)
12616 << Kind << (ES.
getExpr() ? 1 : 0)
12621 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
12628 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
12630 std::string FunctionProto;
12631 llvm::raw_string_ostream OS(FunctionProto);
12644 "Non-template implicit deduction guides are only possible for "
12647 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12652 assert(
Template &&
"Cannot find the associated function template of "
12653 "CXXDeductionGuideDecl?");
12656 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12677 bool TakingCandidateAddress,
12679 assert(Cand->
Function &&
"Candidate must be a function");
12687 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
12694 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12699 if (Fn->isDeleted()) {
12700 std::string FnDesc;
12701 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12702 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12705 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12706 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12707 << (Fn->isDeleted() ? (Fn->isDeletedAsWritten() ? 1 : 2) : 0);
12708 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12735 TakingCandidateAddress);
12738 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12739 << (Fn->getPrimaryTemplate() ? 1 : 0);
12740 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12747 S.
Diag(Fn->getLocation(),
12748 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12749 << QualsForPrinting;
12750 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12761 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
12784 S.
Diag(Fn->getLocation(),
12785 diag::note_ovl_candidate_inherited_constructor_slice)
12786 << (Fn->getPrimaryTemplate() ? 1 : 0)
12787 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
12788 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12794 assert(!Available);
12802 std::string FnDesc;
12803 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12804 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12807 S.
Diag(Fn->getLocation(),
12808 diag::note_ovl_candidate_constraints_not_satisfied)
12809 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12828 bool isLValueReference =
false;
12829 bool isRValueReference =
false;
12830 bool isPointer =
false;
12834 isLValueReference =
true;
12838 isRValueReference =
true;
12854 diag::note_ovl_surrogate_constraints_not_satisfied)
12868 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
12869 std::string TypeStr(
"operator");
12875 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
12880 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
12887 if (ICS.
isBad())
break;
12891 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
12908 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
12938 llvm_unreachable(
"Unhandled deduction result");
12943struct CompareOverloadCandidatesForDisplay {
12945 SourceLocation Loc;
12949 CompareOverloadCandidatesForDisplay(
12950 Sema &S, SourceLocation Loc,
size_t NArgs,
12952 : S(S), NumArgs(NArgs), CSK(CSK) {}
12962 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
12964 if (NumArgs < C->
Function->getMinRequiredArguments())
12971 bool operator()(
const OverloadCandidate *L,
12972 const OverloadCandidate *R) {
12974 if (L == R)
return false;
12978 if (!R->
Viable)
return true;
12980 if (
int Ord = CompareConversions(*L, *R))
13000 if (LDist == RDist) {
13001 if (LFailureKind == RFailureKind)
13009 return LDist < RDist;
13027 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
13028 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
13029 if (numLFixes != numRFixes) {
13030 return numLFixes < numRFixes;
13034 if (
int Ord = CompareConversions(*L, *R))
13046 if (LRank != RRank)
13047 return LRank < RRank;
13073 struct ConversionSignals {
13074 unsigned KindRank = 0;
13077 static ConversionSignals ForSequence(ImplicitConversionSequence &
Seq) {
13078 ConversionSignals Sig;
13079 Sig.KindRank =
Seq.getKindRank();
13080 if (
Seq.isStandard())
13081 Sig.Rank =
Seq.Standard.getRank();
13082 else if (
Seq.isUserDefined())
13083 Sig.Rank =
Seq.UserDefined.After.getRank();
13089 static ConversionSignals ForObjectArgument() {
13099 int CompareConversions(
const OverloadCandidate &L,
13100 const OverloadCandidate &R) {
13105 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
13107 ? ConversionSignals::ForObjectArgument()
13108 : ConversionSignals::ForSequence(L.Conversions[I]);
13110 ? ConversionSignals::ForObjectArgument()
13111 : ConversionSignals::ForSequence(R.Conversions[I]);
13112 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
13113 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
13138 bool Unfixable =
false;
13144 for (
unsigned ConvIdx =
13148 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
13149 if (Cand->
Conversions[ConvIdx].isInitialized() &&
13158 bool SuppressUserConversions =
false;
13160 unsigned ConvIdx = 0;
13161 unsigned ArgIdx = 0;
13190 assert(ConvCount <= 3);
13196 ConvIdx != ConvCount && ArgIdx < Args.size();
13198 if (Cand->
Conversions[ConvIdx].isInitialized()) {
13200 }
else if (
ParamIdx < ParamTypes.size()) {
13201 if (ParamTypes[
ParamIdx]->isDependentType())
13202 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
13207 SuppressUserConversions,
13212 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
13231 for (
iterator Cand = Candidates.begin(), LastCand = Candidates.end();
13232 Cand != LastCand; ++Cand) {
13233 if (!Filter(*Cand))
13258 Cands.push_back(Cand);
13262 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
13269 bool DeferHint =
false;
13273 auto WrongSidedCands =
13275 return (Cand.
Viable ==
false &&
13281 DeferHint = !WrongSidedCands.empty();
13297 S.
Diag(PD.first, PD.second);
13302 bool NoteCands =
true;
13303 for (
const Expr *Arg : Args) {
13304 if (Arg->getType()->isWebAssemblyTableType())
13313 {Candidates.begin(), Candidates.end()});
13319 bool ReportedAmbiguousConversions =
false;
13322 unsigned CandsShown = 0;
13323 auto I = Cands.begin(), E = Cands.end();
13324 for (; I != E; ++I) {
13340 "Non-viable built-in candidates are not added to Cands.");
13347 if (!ReportedAmbiguousConversions) {
13349 ReportedAmbiguousConversions =
true;
13363 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13374struct CompareTemplateSpecCandidatesForDisplay {
13376 CompareTemplateSpecCandidatesForDisplay(Sema &S) : S(S) {}
13378 bool operator()(
const TemplateSpecCandidate *L,
13379 const TemplateSpecCandidate *R) {
13410 bool ForTakingAddress) {
13415void TemplateSpecCandidateSet::destroyCandidates() {
13417 i->DeductionFailure.Destroy();
13422 destroyCandidates();
13423 Candidates.clear();
13436 Cands.reserve(
size());
13437 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
13438 if (Cand->Specialization)
13439 Cands.push_back(Cand);
13444 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
13451 unsigned CandsShown = 0;
13452 for (I = Cands.begin(), E = Cands.end(); I != E; ++I) {
13458 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
13463 "Non-matching built-in candidates are not added to Cands.");
13468 S.
Diag(Loc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13478 QualType Ret = PossiblyAFunctionType;
13481 Ret = ToTypePtr->getPointeeType();
13484 Ret = ToTypeRef->getPointeeType();
13487 Ret = MemTypePtr->getPointeeType();
13489 Context.getCanonicalType(Ret).getUnqualifiedType();
13494 bool Complain =
true) {
13511class AddressOfFunctionResolver {
13514 const QualType& TargetType;
13515 QualType TargetFunctionType;
13519 ASTContext& Context;
13521 bool TargetTypeIsNonStaticMemberFunction;
13522 bool FoundNonTemplateFunction;
13523 bool StaticMemberFunctionFromBoundPointer;
13524 bool HasComplained;
13526 OverloadExpr::FindResult OvlExprInfo;
13527 OverloadExpr *OvlExpr;
13528 TemplateArgumentListInfo OvlExplicitTemplateArgs;
13529 SmallVector<std::pair<DeclAccessPair, FunctionDecl*>, 4> Matches;
13530 TemplateSpecCandidateSet FailedCandidates;
13533 AddressOfFunctionResolver(Sema &S, Expr *SourceExpr,
13534 const QualType &TargetType,
bool Complain)
13535 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
13536 Complain(Complain), Context(S.getASTContext()),
13537 TargetTypeIsNonStaticMemberFunction(
13538 !!TargetType->getAs<MemberPointerType>()),
13539 FoundNonTemplateFunction(
false),
13540 StaticMemberFunctionFromBoundPointer(
false),
13541 HasComplained(
false),
13542 OvlExprInfo(OverloadExpr::find(SourceExpr)),
13544 FailedCandidates(OvlExpr->getNameLoc(),
true) {
13545 ExtractUnqualifiedFunctionTypeFromTargetType();
13548 if (UnresolvedMemberExpr *UME = dyn_cast<UnresolvedMemberExpr>(OvlExpr))
13549 if (!UME->isImplicitAccess() &&
13551 StaticMemberFunctionFromBoundPointer =
true;
13553 DeclAccessPair dap;
13555 OvlExpr,
false, &dap)) {
13556 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn))
13557 if (!
Method->isStatic()) {
13561 TargetTypeIsNonStaticMemberFunction =
true;
13569 Matches.push_back(std::make_pair(dap, Fn));
13577 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
13580 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
13581 if (FoundNonTemplateFunction) {
13582 EliminateAllTemplateMatches();
13583 EliminateLessPartialOrderingConstrainedMatches();
13585 EliminateAllExceptMostSpecializedTemplate();
13590 EliminateSuboptimalCudaMatches();
13593 bool hasComplained()
const {
return HasComplained; }
13596 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
13603 bool isBetterCandidate(
const FunctionDecl *A,
const FunctionDecl *B) {
13607 return candidateHasExactlyCorrectType(A) &&
13608 (!candidateHasExactlyCorrectType(B) ||
13614 bool eliminiateSuboptimalOverloadCandidates() {
13617 auto Best = Matches.begin();
13618 for (
auto I = Matches.begin()+1, E = Matches.end(); I != E; ++I)
13619 if (isBetterCandidate(I->second, Best->second))
13622 const FunctionDecl *BestFn = Best->second;
13623 auto IsBestOrInferiorToBest = [
this, BestFn](
13624 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
13625 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
13630 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
13632 Matches[0] = *Best;
13637 bool isTargetTypeAFunction()
const {
13646 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
13652 const DeclAccessPair& CurAccessFunPair) {
13653 if (CXXMethodDecl *
Method
13657 bool CanConvertToFunctionPointer =
13658 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13659 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13662 else if (TargetTypeIsNonStaticMemberFunction)
13672 TemplateDeductionInfo Info(FailedCandidates.
getLocation());
13676 Result != TemplateDeductionResult::Success) {
13694 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
13698 bool AddMatchingNonTemplateFunction(NamedDecl* Fn,
13699 const DeclAccessPair& CurAccessFunPair) {
13700 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn)) {
13703 bool CanConvertToFunctionPointer =
13704 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13705 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13708 else if (TargetTypeIsNonStaticMemberFunction)
13711 if (FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13718 if (FunDecl->isMultiVersion()) {
13719 const auto *TA = FunDecl->getAttr<TargetAttr>();
13720 if (TA && !TA->isDefaultVersion())
13722 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13723 if (TVA && !TVA->isDefaultVersion())
13731 HasComplained |= Complain;
13740 candidateHasExactlyCorrectType(FunDecl)) {
13741 Matches.push_back(std::make_pair(
13743 FoundNonTemplateFunction =
true;
13751 bool FindAllFunctionsThatMatchTargetTypeExactly() {
13756 if (IsInvalidFormOfPointerToMemberFunction())
13759 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
13763 NamedDecl *
Fn = (*I)->getUnderlyingDecl();
13772 = dyn_cast<FunctionTemplateDecl>(Fn)) {
13778 AddMatchingNonTemplateFunction(Fn, I.getPair()))
13781 assert(Ret || Matches.empty());
13785 void EliminateAllExceptMostSpecializedTemplate() {
13797 UnresolvedSet<4> MatchesCopy;
13798 for (
unsigned I = 0, E = Matches.size(); I != E; ++I)
13799 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
13804 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
13806 S.
PDiag(diag::err_addr_ovl_ambiguous)
13807 << Matches[0].second->getDeclName(),
13808 S.
PDiag(diag::note_ovl_candidate)
13809 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
13810 Complain, TargetFunctionType);
13814 Matches[0].first = Matches[
Result - MatchesCopy.
begin()].first;
13818 HasComplained |= Complain;
13821 void EliminateAllTemplateMatches() {
13824 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
13825 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
13828 Matches[I] = Matches[--N];
13834 void EliminateLessPartialOrderingConstrainedMatches() {
13839 assert(Matches[0].second->getPrimaryTemplate() ==
nullptr &&
13840 "Call EliminateAllTemplateMatches() first");
13841 SmallVector<std::pair<DeclAccessPair, FunctionDecl *>, 4> Results;
13842 Results.push_back(Matches[0]);
13843 for (
unsigned I = 1, N = Matches.size(); I < N; ++I) {
13844 assert(Matches[I].second->getPrimaryTemplate() ==
nullptr);
13846 S, Matches[I].second, Results[0].second,
13850 Results.push_back(Matches[I]);
13853 if (F == Matches[I].second) {
13855 Results.push_back(Matches[I]);
13858 std::swap(Matches, Results);
13861 void EliminateSuboptimalCudaMatches() {
13867 void ComplainNoMatchesFound()
const {
13868 assert(Matches.empty());
13870 << OvlExpr->
getName() << TargetFunctionType
13872 if (FailedCandidates.
empty())
13879 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
13882 if (FunctionDecl *Fun =
13883 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
13891 bool IsInvalidFormOfPointerToMemberFunction()
const {
13892 return TargetTypeIsNonStaticMemberFunction &&
13896 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
13904 bool IsStaticMemberFunctionFromBoundPointer()
const {
13905 return StaticMemberFunctionFromBoundPointer;
13908 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
13910 diag::err_invalid_form_pointer_member_function)
13914 void ComplainOfInvalidConversion()
const {
13916 << OvlExpr->
getName() << TargetType;
13919 void ComplainMultipleMatchesFound()
const {
13920 assert(Matches.size() > 1);
13927 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
13929 int getNumMatches()
const {
return Matches.size(); }
13931 FunctionDecl* getMatchingFunctionDecl()
const {
13932 if (Matches.size() != 1)
return nullptr;
13933 return Matches[0].second;
13936 const DeclAccessPair* getMatchingFunctionAccessPair()
const {
13937 if (Matches.size() != 1)
return nullptr;
13938 return &Matches[0].first;
13948 bool *pHadMultipleCandidates) {
13951 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
13953 int NumMatches = Resolver.getNumMatches();
13955 bool ShouldComplain = Complain && !Resolver.hasComplained();
13956 if (NumMatches == 0 && ShouldComplain) {
13957 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
13958 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
13960 Resolver.ComplainNoMatchesFound();
13962 else if (NumMatches > 1 && ShouldComplain)
13963 Resolver.ComplainMultipleMatchesFound();
13964 else if (NumMatches == 1) {
13965 Fn = Resolver.getMatchingFunctionDecl();
13969 FoundResult = *Resolver.getMatchingFunctionAccessPair();
13971 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
13972 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
13978 if (pHadMultipleCandidates)
13979 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
13987 bool IsResultAmbiguous =
false;
13995 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
13996 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
14003 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
14011 auto FoundBetter = [&]() {
14012 IsResultAmbiguous =
false;
14024 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
14026 if (PreferenceByCUDA != 0) {
14028 if (PreferenceByCUDA > 0)
14044 if (MoreConstrained != FD) {
14045 if (!MoreConstrained) {
14046 IsResultAmbiguous =
true;
14047 AmbiguousDecls.push_back(FD);
14056 if (IsResultAmbiguous)
14077 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
14079 assert(E->
getType() ==
Context.OverloadTy &&
"SrcExpr must be an overload");
14083 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
14084 Found->isCPUSpecificMultiVersion())
14132 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
14163 if (ForTypeDeduction &&
14177 if (FoundResult) *FoundResult = I.getPair();
14188 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
14190 unsigned DiagIDForComplaining) {
14211 if (!complain)
return false;
14214 diag::err_bound_member_function)
14227 SingleFunctionExpression =
14231 if (doFunctionPointerConversion) {
14232 SingleFunctionExpression =
14234 if (SingleFunctionExpression.
isInvalid()) {
14241 if (!SingleFunctionExpression.
isUsable()) {
14243 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
14245 << DestTypeForComplaining
14246 << OpRangeForComplaining
14257 SrcExpr = SingleFunctionExpression;
14267 bool PartialOverloading,
14274 if (ExplicitTemplateArgs) {
14275 assert(!KnownValid &&
"Explicit template arguments?");
14284 PartialOverloading);
14289 = dyn_cast<FunctionTemplateDecl>(Callee)) {
14291 ExplicitTemplateArgs, Args, CandidateSet,
14293 PartialOverloading);
14297 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
14303 bool PartialOverloading) {
14326 assert(!(*I)->getDeclContext()->isRecord());
14328 !(*I)->getDeclContext()->isFunctionOrMethod());
14329 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
14339 ExplicitTemplateArgs = &TABuffer;
14345 CandidateSet, PartialOverloading,
14350 Args, ExplicitTemplateArgs,
14351 CandidateSet, PartialOverloading);
14359 CandidateSet,
false,
false);
14366 case OO_New:
case OO_Array_New:
14367 case OO_Delete:
case OO_Array_Delete:
14390 if (DC->isTransparentContext())
14406 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
14411 if (FoundInClass) {
14412 *FoundInClass = RD;
14415 R.
addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
14432 AssociatedNamespaces,
14433 AssociatedClasses);
14437 for (Sema::AssociatedNamespaceSet::iterator
14438 it = AssociatedNamespaces.begin(),
14439 end = AssociatedNamespaces.end(); it !=
end; ++it) {
14451 SuggestedNamespaces.insert(*it);
14455 SemaRef.
Diag(R.
getNameLoc(), diag::err_not_found_by_two_phase_lookup)
14457 if (SuggestedNamespaces.empty()) {
14458 SemaRef.
Diag(Best->Function->getLocation(),
14459 diag::note_not_found_by_two_phase_lookup)
14461 }
else if (SuggestedNamespaces.size() == 1) {
14462 SemaRef.
Diag(Best->Function->getLocation(),
14463 diag::note_not_found_by_two_phase_lookup)
14469 SemaRef.
Diag(Best->Function->getLocation(),
14470 diag::note_not_found_by_two_phase_lookup)
14502class BuildRecoveryCallExprRAII {
14504 Sema::SatisfactionStackResetRAII SatStack;
14507 BuildRecoveryCallExprRAII(Sema &S) : SemaRef(S), SatStack(S) {
14529 bool EmptyLookup,
bool AllowTypoCorrection) {
14537 BuildRecoveryCallExprRAII RCE(SemaRef);
14547 ExplicitTemplateArgs = &TABuffer;
14555 ExplicitTemplateArgs, Args, &FoundInClass)) {
14557 }
else if (EmptyLookup) {
14562 ExplicitTemplateArgs !=
nullptr,
14563 dyn_cast<MemberExpr>(Fn));
14565 AllowTypoCorrection
14571 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
14586 assert(!R.
empty() &&
"lookup results empty despite recovery");
14597 if ((*R.
begin())->isCXXClassMember())
14599 ExplicitTemplateArgs, S);
14600 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
14602 ExplicitTemplateArgs);
14626 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
14633 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
14635 llvm_unreachable(
"performing ADL for builtin");
14642 UnbridgedCastsSet UnbridgedCasts;
14657 if (CandidateSet->
empty() ||
14673 if (CandidateSet->
empty())
14676 UnbridgedCasts.restore();
14683 std::optional<QualType> Result;
14695 else if (Result !=
T)
14703 if (Best && *Best != CS.
end())
14704 ConsiderCandidate(**Best);
14707 for (
const auto &
C : CS)
14709 ConsiderCandidate(
C);
14712 for (
const auto &
C : CS)
14713 ConsiderCandidate(
C);
14717 auto Value = *Result;
14718 if (
Value.isNull() ||
Value->isUndeducedType())
14735 bool AllowTypoCorrection) {
14736 switch (OverloadResult) {
14747 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14753 if (*Best != CandidateSet->
end() &&
14757 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
14762 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
14772 CandidateSet->
empty(),
14773 AllowTypoCorrection);
14780 for (
const Expr *Arg : Args) {
14781 if (!Arg->getType()->isFunctionType())
14783 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
14784 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
14787 Arg->getExprLoc()))
14795 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
14796 << ULE->
getName() << Fn->getSourceRange()),
14804 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
14805 << ULE->
getName() << Fn->getSourceRange()),
14812 Fn->getSourceRange(), ULE->
getName(),
14813 *CandidateSet, FDecl, Args);
14822 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14830 SubExprs.append(Args.begin(), Args.end());
14837 for (
auto I = CS.
begin(), E = CS.
end(); I != E; ++I) {
14852 bool AllowTypoCorrection,
14853 bool CalleesAddressIsTaken) {
14868 if (CalleesAddressIsTaken)
14879 Best != CandidateSet.
end()) {
14880 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
14881 M && M->isImplicitObjectMemberFunction()) {
14892 CUDA().recordPotentialODRUsedVariable(Args, CandidateSet);
14910 if (
const auto *TP =
14920 ExecConfig, &CandidateSet, &Best,
14921 OverloadResult, AllowTypoCorrection);
14930 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
14936 bool HadMultipleCandidates) {
14946 if (
Method->isExplicitObjectMemberFunction())
14950 E, std::nullopt, FoundDecl,
Method);
14954 if (
Method->getParent()->isLambda() &&
14955 Method->getConversionType()->isBlockPointerType()) {
14959 auto *CE = dyn_cast<CastExpr>(SubE);
14960 if (CE && CE->getCastKind() == CK_NoOp)
14961 SubE = CE->getSubExpr();
14963 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
14964 SubE = BE->getSubExpr();
14987 if (
Method->isExplicitObjectMemberFunction()) {
14993 Expr *ObjectParam = Exp.
get();
15007 Exp.
get()->getEndLoc(),
15021 Expr *Input,
bool PerformADL) {
15023 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15031 Expr *Args[2] = { Input,
nullptr };
15032 unsigned NumArgs = 1;
15037 if (Opc == UO_PostInc || Opc == UO_PostDec) {
15051 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
15062 if (Fn.isInvalid())
15088 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15107 if (
Method->isExplicitObjectMemberFunction())
15111 Input, std::nullopt, Best->FoundDecl,
Method);
15114 Base = Input = InputInit.
get();
15125 Input = InputInit.
get();
15130 Base, HadMultipleCandidates,
15142 Context, Op, FnExpr.
get(), ArgsArray, ResultTy,
VK, OpLoc,
15158 Input, Best->BuiltinParamTypes[0], Best->Conversions[0],
15163 Input = InputRes.
get();
15183 PDiag(diag::err_ovl_ambiguous_oper_unary)
15200 << (Msg !=
nullptr)
15201 << (Msg ? Msg->
getString() : StringRef())
15254 if (Op != OO_Equal && PerformADL) {
15261 Context.DeclarationNames.getCXXOperatorName(ExtraOp);
15287 Expr *RHS,
bool PerformADL,
15288 bool AllowRewrittenCandidates,
15290 Expr *Args[2] = { LHS, RHS };
15294 AllowRewrittenCandidates =
false;
15300 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
15321 if (Fn.isInvalid())
15330 if (Opc == BO_PtrMemD) {
15331 auto CheckPlaceholder = [&](
Expr *&Arg) {
15340 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
15361 if (Opc == BO_Assign && !Args[0]->
getType()->isOverloadableType())
15367 Op, OpLoc, AllowRewrittenCandidates));
15369 CandidateSet.
exclude(DefaultedFn);
15372 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15381 bool IsReversed = Best->isReversed();
15383 std::swap(Args[0], Args[1]);
15400 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
15404 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
15405 : diag::err_ovl_rewrite_equalequal_not_bool)
15413 if (AllowRewrittenCandidates && !IsReversed &&
15423 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
15426 Best->Conversions[ArgIdx]) ==
15428 AmbiguousWith.push_back(Cand.
Function);
15435 if (!AmbiguousWith.empty()) {
15436 bool AmbiguousWithSelf =
15437 AmbiguousWith.size() == 1 &&
15439 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
15441 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
15443 if (AmbiguousWithSelf) {
15445 diag::note_ovl_ambiguous_oper_binary_reversed_self);
15450 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
15451 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
15453 !MD->hasCXXExplicitFunctionObjectParameter() &&
15454 Context.hasSameUnqualifiedType(
15455 MD->getFunctionObjectParameterType(),
15456 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
15457 Context.hasSameUnqualifiedType(
15458 MD->getFunctionObjectParameterType(),
15460 Context.hasSameUnqualifiedType(
15461 MD->getFunctionObjectParameterType(),
15464 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
15467 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
15468 for (
auto *F : AmbiguousWith)
15470 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
15478 if (Op == OO_Equal)
15489 if (
Method->isExplicitObjectMemberFunction()) {
15494 Args[0], std::nullopt, Best->FoundDecl,
Method);
15527 Best->FoundDecl,
Base,
15528 HadMultipleCandidates, OpLoc);
15539 const Expr *ImplicitThis =
nullptr;
15544 Context, ChosenOp, FnExpr.
get(), Args, ResultTy,
VK, OpLoc,
15548 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(FnDecl);
15551 ImplicitThis = ArgsArray[0];
15552 ArgsArray = ArgsArray.slice(1);
15559 if (Op == OO_Equal) {
15564 *
this,
AssignedEntity{Args[0], dyn_cast<CXXMethodDecl>(FnDecl)},
15567 if (ImplicitThis) {
15572 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
15576 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
15591 (Op == OO_Spaceship && IsReversed)) {
15592 if (Op == OO_ExclaimEqual) {
15593 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
15596 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
15598 Expr *ZeroLiteral =
15607 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.
get(),
15608 IsReversed ? R.
get() : ZeroLiteral,
true,
15616 assert(ChosenOp == Op &&
"unexpected operator name");
15620 if (Best->RewriteKind !=
CRK_None)
15629 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15634 Args[0] = ArgsRes0.
get();
15637 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15642 Args[1] = ArgsRes1.
get();
15652 if (Opc == BO_Comma)
15657 if (DefaultedFn && Opc == BO_Cmp) {
15659 Args[1], DefaultedFn);
15674 Opc >= BO_Assign && Opc <= BO_OrAssign) {
15675 Diag(OpLoc, diag::err_ovl_no_viable_oper)
15678 if (Args[0]->
getType()->isIncompleteType()) {
15679 Diag(OpLoc, diag::note_assign_lhs_incomplete)
15695 assert(
Result.isInvalid() &&
15696 "C++ binary operator overloading is missing candidates!");
15707 << Args[0]->getSourceRange()
15708 << Args[1]->getSourceRange()),
15718 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
15722 Diag(OpLoc, diag::err_ovl_deleted_comparison)
15723 << Args[0]->
getType() << DeletedFD;
15736 PDiag(diag::err_ovl_deleted_oper)
15738 .getCXXOverloadedOperator())
15739 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
15740 << Args[0]->getSourceRange() << Args[1]->getSourceRange()),
15764 "cannot use prvalue expressions more than once");
15765 Expr *OrigLHS = LHS;
15766 Expr *OrigRHS = RHS;
15783 true, DefaultedFn);
15784 if (
Less.isInvalid())
15811 for (; I >= 0; --I) {
15813 auto *VI = Info->lookupValueInfo(Comparisons[I].
Result);
15836 Context, OrigLHS, OrigRHS, BO_Cmp,
Result.get()->getType(),
15837 Result.get()->getValueKind(),
Result.get()->getObjectKind(), OpLoc,
15839 Expr *SemanticForm[] = {LHS, RHS,
Result.get()};
15849 unsigned NumArgsSlots =
15850 MethodArgs.size() + std::max<unsigned>(Args.size(), NumParams);
15853 MethodArgs.reserve(MethodArgs.size() + NumArgsSlots);
15854 bool IsError =
false;
15857 for (
unsigned i = 0; i != NumParams; i++) {
15859 if (i < Args.size()) {
15863 S.
Context, Method->getParamDecl(i)),
15877 MethodArgs.push_back(Arg);
15887 Args.push_back(
Base);
15888 for (
auto *e : ArgExpr) {
15892 Context.DeclarationNames.getCXXOperatorName(OO_Subscript);
15897 ArgExpr.back()->getEndLoc());
15909 if (Fn.isInvalid())
15919 UnbridgedCastsSet UnbridgedCasts;
15932 if (Args.size() == 2)
15935 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15955 if (
Method->isExplicitObjectMemberFunction()) {
15960 Args[0] = Res.
get();
15964 Args[0], std::nullopt, Best->FoundDecl,
Method);
15968 MethodArgs.push_back(Arg0.
get());
15972 *
this, MethodArgs,
Method, ArgExpr, LLoc);
15980 *
this, FnDecl, Best->FoundDecl,
Base, HadMultipleCandidates,
15991 Context, OO_Subscript, FnExpr.
get(), MethodArgs, ResultTy,
VK, RLoc,
16008 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
16013 Args[0] = ArgsRes0.
get();
16016 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
16021 Args[1] = ArgsRes1.
get();
16029 CandidateSet.
empty()
16030 ? (
PDiag(diag::err_ovl_no_oper)
16031 << Args[0]->getType() << 0
16032 << Args[0]->getSourceRange() << Range)
16033 : (
PDiag(diag::err_ovl_no_viable_subscript)
16034 << Args[0]->getType() << Args[0]->getSourceRange() << Range);
16041 if (Args.size() == 2) {
16044 LLoc,
PDiag(diag::err_ovl_ambiguous_oper_binary)
16046 << Args[0]->getSourceRange() << Range),
16051 PDiag(diag::err_ovl_ambiguous_subscript_call)
16053 << Args[0]->getSourceRange() << Range),
16062 PDiag(diag::err_ovl_deleted_oper)
16063 <<
"[]" << (Msg !=
nullptr)
16064 << (Msg ? Msg->
getString() : StringRef())
16065 << Args[0]->getSourceRange() << Range),
16079 Expr *ExecConfig,
bool IsExecConfig,
16080 bool AllowRecovery) {
16089 if (
BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
16090 assert(op->getType() ==
Context.BoundMemberTy);
16091 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
16104 QualType objectType = op->getLHS()->getType();
16105 if (op->getOpcode() == BO_PtrMemI)
16109 Qualifiers difference = objectQuals - funcQuals;
16113 std::string qualsString = difference.
getAsString();
16114 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
16117 << (qualsString.find(
' ') == std::string::npos ? 1 : 2);
16121 Context, MemExprE, Args, resultType, valueKind, RParenLoc,
16131 if (CheckOtherCall(call, proto))
16141 if (!AllowRecovery)
16143 std::vector<Expr *> SubExprs = {MemExprE};
16144 llvm::append_range(SubExprs, Args);
16152 UnbridgedCastsSet UnbridgedCasts;
16158 bool HadMultipleCandidates =
false;
16166 UnbridgedCasts.restore();
16184 TemplateArgs = &TemplateArgsBuffer;
16188 E = UnresExpr->
decls_end(); I != E; ++I) {
16190 QualType ExplicitObjectType = ObjectType;
16197 bool HasExplicitParameter =
false;
16198 if (
const auto *M = dyn_cast<FunctionDecl>(
Func);
16199 M && M->hasCXXExplicitFunctionObjectParameter())
16200 HasExplicitParameter =
true;
16201 else if (
const auto *M = dyn_cast<FunctionTemplateDecl>(
Func);
16203 M->getTemplatedDecl()->hasCXXExplicitFunctionObjectParameter())
16204 HasExplicitParameter =
true;
16206 if (HasExplicitParameter)
16214 }
else if ((
Method = dyn_cast<CXXMethodDecl>(
Func))) {
16221 ObjectClassification, Args, CandidateSet,
16225 I.getPair(), ActingDC, TemplateArgs,
16226 ExplicitObjectType, ObjectClassification,
16227 Args, CandidateSet,
16232 HadMultipleCandidates = (CandidateSet.
size() > 1);
16236 UnbridgedCasts.restore();
16239 bool Succeeded =
false;
16244 FoundDecl = Best->FoundDecl;
16264 PDiag(diag::err_ovl_no_viable_member_function_in_call)
16271 PDiag(diag::err_ovl_ambiguous_member_call)
16278 CandidateSet, Best->Function, Args,
true);
16289 MemExprE = Res.
get();
16293 if (
Method->isStatic()) {
16295 ExecConfig, IsExecConfig);
16305 assert(
Method &&
"Member call to something that isn't a method?");
16310 if (
Method->isExplicitObjectMemberFunction()) {
16318 HadMultipleCandidates, MemExpr->
getExprLoc());
16325 TheCall->setUsesMemberSyntax(
true);
16335 Proto->getNumParams());
16341 return BuildRecoveryExpr(ResultType);
16346 return BuildRecoveryExpr(ResultType);
16356 if (
auto *MemE = dyn_cast<MemberExpr>(NakedMemExpr)) {
16357 if (
const EnableIfAttr *
Attr =
16359 Diag(MemE->getMemberLoc(),
16360 diag::err_ovl_no_viable_member_function_in_call)
16363 diag::note_ovl_candidate_disabled_by_function_cond_attr)
16364 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
16370 TheCall->getDirectCallee()->isPureVirtual()) {
16376 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
16387 if (
auto *DD = dyn_cast<CXXDestructorDecl>(TheCall->getDirectCallee())) {
16391 CallCanBeVirtual,
true,
16396 TheCall->getDirectCallee());
16408 UnbridgedCastsSet UnbridgedCasts;
16412 assert(Object.get()->getType()->isRecordType() &&
16413 "Requires object type argument");
16427 diag::err_incomplete_object_call, Object.get()))
16430 auto *
Record = Object.get()->getType()->castAsCXXRecordDecl();
16436 Oper != OperEnd; ++Oper) {
16438 Object.get()->Classify(
Context), Args, CandidateSet,
16450 bool IgnoreSurrogateFunctions =
false;
16453 if (!Candidate.
Viable &&
16455 IgnoreSurrogateFunctions =
true;
16477 !IgnoreSurrogateFunctions && I != E; ++I) {
16499 Object.get(), Args, CandidateSet);
16504 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16517 CandidateSet.
empty()
16518 ? (
PDiag(diag::err_ovl_no_oper)
16519 << Object.get()->getType() << 1
16520 << Object.get()->getSourceRange())
16521 : (
PDiag(diag::err_ovl_no_viable_object_call)
16522 << Object.get()->getType() << Object.get()->getSourceRange());
16532 PDiag(diag::err_ovl_ambiguous_object_call)
16533 << Object.get()->getType()
16534 << Object.get()->getSourceRange()),
16545 PDiag(diag::err_ovl_deleted_object_call)
16546 << Object.get()->getType() << (Msg !=
nullptr)
16547 << (Msg ? Msg->
getString() : StringRef())
16548 << Object.get()->getSourceRange()),
16554 if (Best == CandidateSet.
end())
16557 UnbridgedCasts.restore();
16559 if (Best->Function ==
nullptr) {
16564 Best->Conversions[0].UserDefined.ConversionFunction);
16570 assert(Conv == Best->FoundDecl.getDecl() &&
16571 "Found Decl & conversion-to-functionptr should be same, right?!");
16579 Conv, HadMultipleCandidates);
16580 if (
Call.isInvalid())
16584 Context,
Call.get()->getType(), CK_UserDefinedConversion,
Call.get(),
16598 if (
Method->isInvalidDecl())
16605 Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc);
16608 Obj, HadMultipleCandidates,
16615 MethodArgs.reserve(NumParams + 1);
16617 bool IsError =
false;
16621 if (
Method->isExplicitObjectMemberFunction()) {
16625 Object.get(), std::nullopt, Best->FoundDecl,
Method);
16630 MethodArgs.push_back(Object.get());
16634 *
this, MethodArgs,
Method, Args, LParenLoc);
16637 if (Proto->isVariadic()) {
16639 for (
unsigned i = NumParams, e = Args.size(); i < e; i++) {
16643 MethodArgs.push_back(Arg.
get());
16658 Context, OO_Call, NewFn.
get(), MethodArgs, ResultTy,
VK, RParenLoc,
16672 bool *NoArrowOperatorFound) {
16673 assert(
Base->getType()->isRecordType() &&
16674 "left-hand side must have class type");
16688 Context.DeclarationNames.getCXXOperatorName(OO_Arrow);
16692 diag::err_typecheck_incomplete_tag,
Base))
16700 Oper != OperEnd; ++Oper) {
16706 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16717 if (CandidateSet.
empty()) {
16719 if (NoArrowOperatorFound) {
16722 *NoArrowOperatorFound =
true;
16725 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
16726 << BaseType <<
Base->getSourceRange();
16727 if (BaseType->isRecordType() && !BaseType->isPointerType()) {
16728 Diag(OpLoc, diag::note_typecheck_member_reference_suggestion)
16732 Diag(OpLoc, diag::err_ovl_no_viable_oper)
16733 <<
"operator->" <<
Base->getSourceRange();
16741 <<
"->" <<
Base->getType()
16742 <<
Base->getSourceRange()),
16750 <<
"->" << (Msg !=
nullptr)
16751 << (Msg ? Msg->
getString() : StringRef())
16752 <<
Base->getSourceRange()),
16763 if (
Method->isExplicitObjectMemberFunction()) {
16770 Base, std::nullopt, Best->FoundDecl,
Method);
16778 Base, HadMultipleCandidates, OpLoc);
16812 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16825 PDiag(diag::err_ovl_no_viable_function_in_call)
16840 nullptr, HadMultipleCandidates,
16843 if (Fn.isInvalid())
16849 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
16855 ConvArgs[ArgIdx] = InputInit.
get();
16882 Scope *S =
nullptr;
16885 if (!MemberLookup.
empty()) {
16912 if (CandidateSet->
empty() || CandidateSetError) {
16925 Loc,
nullptr, CandidateSet, &Best,
16938 if (
ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
16943 if (SubExpr.
get() == PE->getSubExpr())
16947 ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.
get());
16955 assert(
Context.hasSameType(ICE->getSubExpr()->getType(),
16957 "Implicit cast type cannot be determined from overload");
16958 assert(ICE->path_empty() &&
"fixing up hierarchy conversion?");
16959 if (SubExpr.
get() == ICE->getSubExpr())
16967 if (
auto *GSE = dyn_cast<GenericSelectionExpr>(E)) {
16968 if (!GSE->isResultDependent()) {
16973 if (SubExpr.
get() == GSE->getResultExpr())
16980 unsigned ResultIdx = GSE->getResultIndex();
16981 AssocExprs[ResultIdx] = SubExpr.
get();
16983 if (GSE->isExprPredicate())
16985 Context, GSE->getGenericLoc(), GSE->getControllingExpr(),
16986 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
16987 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
16990 Context, GSE->getGenericLoc(), GSE->getControllingType(),
16991 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
16992 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17001 assert(UnOp->getOpcode() == UO_AddrOf &&
17002 "Can only take the address of an overloaded function");
17004 if (!
Method->isImplicitObjectMemberFunction()) {
17015 if (SubExpr.
get() == UnOp->getSubExpr())
17023 "fixed to something other than a decl ref");
17026 assert(Qualifier &&
17027 "fixed to a member ref with no nested name qualifier");
17033 Fn->getType(), Qualifier,
17036 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
17041 UnOp->getOperatorLoc(),
false,
17049 if (SubExpr.
get() == UnOp->getSubExpr())
17062 if (ULE->hasExplicitTemplateArgs()) {
17063 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
17064 TemplateArgs = &TemplateArgsBuffer;
17069 getLangOpts().CPlusPlus && !Fn->hasCXXExplicitFunctionObjectParameter()
17074 if (
unsigned BID = Fn->getBuiltinID()) {
17075 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
17082 Fn,
Type, ValueKind, ULE->getNameInfo(), ULE->getQualifierLoc(),
17083 Found.getDecl(), ULE->getTemplateKeywordLoc(), TemplateArgs);
17091 if (MemExpr->hasExplicitTemplateArgs()) {
17092 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
17093 TemplateArgs = &TemplateArgsBuffer;
17100 if (MemExpr->isImplicitAccess()) {
17103 Fn, Fn->getType(),
VK_LValue, MemExpr->getNameInfo(),
17104 MemExpr->getQualifierLoc(),
Found.getDecl(),
17105 MemExpr->getTemplateKeywordLoc(), TemplateArgs);
17110 if (MemExpr->getQualifier())
17111 Loc = MemExpr->getQualifierLoc().getBeginLoc();
17116 Base = MemExpr->getBase();
17122 type = Fn->getType();
17129 Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),
17130 MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn,
Found,
17131 true, MemExpr->getMemberNameInfo(),
17135 llvm_unreachable(
"Invalid reference to overloaded function");
17146 if (!PartialOverloading || !
Function)
17150 if (
const auto *Proto =
17151 dyn_cast<FunctionProtoType>(
Function->getFunctionType()))
17152 if (Proto->isTemplateVariadic())
17154 if (
auto *Pattern =
Function->getTemplateInstantiationPattern())
17155 if (
const auto *Proto =
17156 dyn_cast<FunctionProtoType>(Pattern->getFunctionType()))
17157 if (Proto->isTemplateVariadic())
17170 << IsMember << Name << (Msg !=
nullptr)
17171 << (Msg ? Msg->
getString() : StringRef())
Defines the clang::ASTContext interface.
Defines the Diagnostic-related interfaces.
static bool isBooleanType(QualType Ty)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
static const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
This file declares semantic analysis functions specific to ARM.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static bool hasExplicitAttr(const VarDecl *D)
This file declares semantic analysis for CUDA constructs.
static void BuildBasePathArray(const CXXBasePath &Path, CXXCastPath &BasePathArray)
static bool isRecordType(QualType T)
static void TryUserDefinedConversion(Sema &S, QualType DestType, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt a user-defined conversion between two types (C++ [dcl.init]), which enumerates all conversion...
This file declares semantic analysis for Objective-C.
static ImplicitConversionSequence::CompareKind CompareStandardConversionSequences(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareStandardConversionSequences - Compare two standard conversion sequences to determine whether o...
static bool sameFunctionParameterTypeLists(Sema &S, FunctionDecl *Fn1, FunctionDecl *Fn2, bool IsFn1Reversed, bool IsFn2Reversed)
We're allowed to use constraints partial ordering only if the candidates have the same parameter type...
static bool isNullPointerConstantForConversion(Expr *Expr, bool InOverloadResolution, ASTContext &Context)
static bool shouldSkipNotingLambdaConversionDecl(const FunctionDecl *Fn)
static const FunctionType * getConversionOpReturnTyAsFunction(CXXConversionDecl *Conv)
static bool functionHasPassObjectSizeParams(const FunctionDecl *FD)
static Comparison compareEnableIfAttrs(const Sema &S, const FunctionDecl *Cand1, const FunctionDecl *Cand2)
Compares the enable_if attributes of two FunctionDecls, for the purposes of overload resolution.
static Qualifiers CollectVRQualifiers(ASTContext &Context, Expr *ArgExpr)
CollectVRQualifiers - This routine returns Volatile/Restrict qualifiers, if any, found in visible typ...
@ ToPromotedUnderlyingType
static void AddOverloadedCallCandidate(Sema &S, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading, bool KnownValid)
Add a single candidate to the overload set.
static void AddTemplateOverloadCandidateImmediately(Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, bool AllowExplicit, Sema::ADLCallKind IsADLCandidate, OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction)
static bool IsVectorOrMatrixElementConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, Expr *From)
static ExprResult FinishOverloadedCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, OverloadCandidateSet *CandidateSet, OverloadCandidateSet::iterator *Best, OverloadingResult OverloadResult, bool AllowTypoCorrection)
FinishOverloadedCallExpr - given an OverloadCandidateSet, builds and returns the completed call expre...
static bool isQualificationConversionStep(QualType FromType, QualType ToType, bool CStyle, bool IsTopLevel, bool &PreviousToQualsIncludeConst, bool &ObjCLifetimeConversion, const ASTContext &Ctx)
Perform a single iteration of the loop for checking if a qualification conversion is valid.
static ImplicitConversionSequence::CompareKind CompareQualificationConversions(Sema &S, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareQualificationConversions - Compares two standard conversion sequences to determine whether the...
static void dropPointerConversion(StandardConversionSequence &SCS)
dropPointerConversions - If the given standard conversion sequence involves any pointer conversions,...
static SourceLocation GetLocationForCandidate(const OverloadCandidate *Cand)
static void DiagnoseArityMismatch(Sema &S, NamedDecl *Found, Decl *D, unsigned NumFormalArgs, bool IsAddressOf=false)
General arity mismatch diagnosis over a candidate in a candidate set.
static const Expr * IgnoreNarrowingConversion(ASTContext &Ctx, const Expr *Converted)
Skip any implicit casts which could be either part of a narrowing conversion or after one in an impli...
static bool allowAmbiguity(ASTContext &Context, const FunctionDecl *F1, const FunctionDecl *F2)
static unsigned RankDeductionFailure(const DeductionFailureInfo &DFI)
static QualType BuildSimilarlyQualifiedPointerType(const Type *FromPtr, QualType ToPointee, QualType ToType, ASTContext &Context, bool StripObjCLifetime=false)
BuildSimilarlyQualifiedPointerType - In a pointer conversion from the pointer type FromPtr to a point...
static void forAllQualifierCombinations(QualifiersAndAtomic Quals, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static bool FindConversionForRefInit(Sema &S, ImplicitConversionSequence &ICS, QualType DeclType, SourceLocation DeclLoc, Expr *Init, QualType T2, bool AllowRvalues, bool AllowExplicit)
Look for a user-defined conversion to a value reference-compatible with DeclType.
static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static Expr * GetExplicitObjectExpr(Sema &S, Expr *Obj, const FunctionDecl *Fun)
static bool hasDeprecatedStringLiteralToCharPtrConversion(const ImplicitConversionSequence &ICS)
static void AddBuiltinAssignmentOperatorCandidates(Sema &S, QualType T, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
Helper function for AddBuiltinOperatorCandidates() that adds the volatile- and non-volatile-qualified...
static bool CheckConvertedConstantConversions(Sema &S, StandardConversionSequence &SCS)
Check that the specified conversion is permitted in a converted constant expression,...
static void NoteBuiltinOperatorCandidate(Sema &S, StringRef Opc, SourceLocation OpLoc, OverloadCandidate *Cand)
static ImplicitConversionSequence::CompareKind compareConversionFunctions(Sema &S, FunctionDecl *Function1, FunctionDecl *Function2)
Compare the user-defined conversion functions or constructors of two user-defined conversion sequence...
static void forAllQualifierCombinationsImpl(QualifiersAndAtomic Available, QualifiersAndAtomic Applied, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static const char * GetImplicitConversionName(ImplicitConversionKind Kind)
GetImplicitConversionName - Return the name of this kind of implicit conversion.
static bool checkAddressOfFunctionIsAvailable(Sema &S, const FunctionDecl *FD, bool Complain, bool InOverloadResolution, SourceLocation Loc)
Returns true if we can take the address of the function.
static ImplicitConversionSequence::CompareKind CompareDerivedToBaseConversions(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareDerivedToBaseConversions - Compares two standard conversion sequences to determine whether the...
static bool convertArgsForAvailabilityChecks(Sema &S, FunctionDecl *Function, Expr *ThisArg, SourceLocation CallLoc, ArrayRef< Expr * > Args, Sema::SFINAETrap &Trap, bool MissingImplicitThis, Expr *&ConvertedThis, SmallVectorImpl< Expr * > &ConvertedArgs)
static TemplateDecl * getDescribedTemplate(Decl *Templated)
static void CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand, ArrayRef< Expr * > Args, OverloadCandidateSet::CandidateSetKind CSK)
CompleteNonViableCandidate - Normally, overload resolution only computes up to the first bad conversi...
static QualType AdoptQualifiers(ASTContext &Context, QualType T, Qualifiers Qs)
Adopt the given qualifiers for the given type.
static void NoteAmbiguousUserConversions(Sema &S, SourceLocation OpLoc, OverloadCandidate *Cand)
static bool CheckArityMismatch(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool IsAddressOf=false)
Additional arity mismatch diagnosis specific to a function overload candidates.
static ImplicitConversionSequence::CompareKind compareStandardConversionSubsets(ASTContext &Context, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
static bool hasDependentExplicit(FunctionTemplateDecl *FTD)
static bool IsVectorConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, ImplicitConversionKind &ElConv, Expr *From, bool InOverloadResolution, bool CStyle)
Determine whether the conversion from FromType to ToType is a valid vector conversion.
static ImplicitConversionSequence TryContextuallyConvertToObjCPointer(Sema &S, Expr *From)
TryContextuallyConvertToObjCPointer - Attempt to contextually convert the expression From to an Objec...
static ExprResult CheckConvertedConstantExpression(Sema &S, Expr *From, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, NamedDecl *Dest)
CheckConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static ExprResult CreateFunctionRefExpr(Sema &S, FunctionDecl *Fn, NamedDecl *FoundDecl, const Expr *Base, bool HadMultipleCandidates, SourceLocation Loc=SourceLocation(), const DeclarationNameLoc &LocInfo=DeclarationNameLoc())
A convenience routine for creating a decayed reference to a function.
static std::optional< QualType > getImplicitObjectParamType(ASTContext &Context, const FunctionDecl *F)
Compute the type of the implicit object parameter for the given function, if any.
static bool checkPlaceholderForOverload(Sema &S, Expr *&E, UnbridgedCastsSet *unbridgedCasts=nullptr)
checkPlaceholderForOverload - Do any interesting placeholder-like preprocessing on the given expressi...
static FixedEnumPromotion getFixedEnumPromtion(Sema &S, const StandardConversionSequence &SCS)
Returns kind of fixed enum promotion the SCS uses.
static bool isAllowableExplicitConversion(Sema &S, QualType ConvType, QualType ToType, bool AllowObjCPointerConversion)
Determine whether this is an allowable conversion from the result of an explicit conversion operator ...
static bool isNonViableMultiVersionOverload(FunctionDecl *FD)
static bool FunctionsCorrespond(ASTContext &Ctx, const FunctionDecl *X, const FunctionDecl *Y)
static ImplicitConversionSequence TryImplicitConversion(Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion, bool AllowObjCConversionOnExplicit)
TryImplicitConversion - Attempt to perform an implicit conversion from the given expression (Expr) to...
static ExprResult BuildConvertedConstantExpression(Sema &S, Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest, APValue &PreNarrowingValue)
BuildConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static ImplicitConversionSequence TryListConversion(Sema &S, InitListExpr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion)
TryListConversion - Try to copy-initialize a value of type ToType from the initializer list From.
static bool IsOverloadOrOverrideImpl(Sema &SemaRef, FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs, bool UseOverrideRules=false)
static QualType withoutUnaligned(ASTContext &Ctx, QualType T)
static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand)
CUDA: diagnose an invalid call across targets.
static void MaybeDiagnoseAmbiguousConstraints(Sema &S, ArrayRef< OverloadCandidate > Cands)
static bool diagnoseNoViableConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, UnresolvedSetImpl &ExplicitConversions)
static void AddMethodTemplateCandidateImmediately(Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, OverloadCandidateParamOrder PO)
static void AddTemplateConversionCandidateImmediately(Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion)
static ImplicitConversionSequence TryContextuallyConvertToBool(Sema &S, Expr *From)
TryContextuallyConvertToBool - Attempt to contextually convert the expression From to bool (C++0x [co...
static ImplicitConversionSequence TryObjectArgumentInitialization(Sema &S, SourceLocation Loc, QualType FromType, Expr::Classification FromClassification, CXXMethodDecl *Method, const CXXRecordDecl *ActingContext, bool InOverloadResolution=false, QualType ExplicitParameterType=QualType(), bool SuppressUserConversion=false)
TryObjectArgumentInitialization - Try to initialize the object parameter of the given member function...
static bool recordConversion(Sema &SemaRef, SourceLocation Loc, Expr *&From, Sema::ContextualImplicitConverter &Converter, QualType T, bool HadMultipleCandidates, DeclAccessPair &Found)
static ImplicitConversionSequence::CompareKind CompareImplicitConversionSequences(Sema &S, SourceLocation Loc, const ImplicitConversionSequence &ICS1, const ImplicitConversionSequence &ICS2)
CompareImplicitConversionSequences - Compare two implicit conversion sequences to determine whether o...
static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand, unsigned NumArgs, bool TakingCandidateAddress, LangAS CtorDestAS=LangAS::Default)
Generates a 'note' diagnostic for an overload candidate.
static ImplicitConversionSequence TryCopyInitialization(Sema &S, Expr *From, QualType ToType, bool SuppressUserConversions, bool InOverloadResolution, bool AllowObjCWritebackConversion, bool AllowExplicit=false)
TryCopyInitialization - Try to copy-initialize a value of type ToType from the expression From.
static ExprResult diagnoseAmbiguousConversion(Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter, QualType T, UnresolvedSetImpl &ViableConversions)
static void markUnaddressableCandidatesUnviable(Sema &S, OverloadCandidateSet &CS)
static QualType GetExplicitObjectType(Sema &S, const Expr *MemExprE)
Sema::AllowedExplicit AllowedExplicit
static QualType AdjustAddressSpaceForBuiltinOperandType(Sema &S, QualType T, Expr *Arg)
Helper function for adjusting address spaces for the pointer or reference operands of builtin operato...
static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand)
static bool DiagnoseTwoPhaseLookup(Sema &SemaRef, SourceLocation FnLoc, const CXXScopeSpec &SS, LookupResult &R, OverloadCandidateSet::CandidateSetKind CSK, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, CXXRecordDecl **FoundInClass=nullptr)
Attempt to recover from an ill-formed use of a non-dependent name in a template, where the non-depend...
static bool isBetterReferenceBindingKind(const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
Determine whether one of the given reference bindings is better than the other based on what kind of ...
static bool canBeDeclaredInNamespace(const DeclarationName &Name)
Determine whether a declaration with the specified name could be moved into a different namespace.
static ExprResult finishContextualImplicitConversion(Sema &SemaRef, SourceLocation Loc, Expr *From, Sema::ContextualImplicitConverter &Converter)
static bool IsStandardConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle, bool AllowObjCWritebackConversion)
IsStandardConversion - Determines whether there is a standard conversion sequence (C++ [conv],...
static bool DiagnoseTwoPhaseOperatorLookup(Sema &SemaRef, OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args)
Attempt to recover from ill-formed use of a non-dependent operator in a template, where the non-depen...
static bool isNonTrivialObjCLifetimeConversion(Qualifiers FromQuals, Qualifiers ToQuals)
Determine whether the lifetime conversion between the two given qualifiers sets is nontrivial.
static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, unsigned I, bool TakingCandidateAddress)
static bool completeFunctionType(Sema &S, FunctionDecl *FD, SourceLocation Loc, bool Complain=true)
static bool shouldAddReversedEqEq(Sema &S, SourceLocation OpLoc, Expr *FirstOperand, FunctionDecl *EqFD)
static bool isFunctionAlwaysEnabled(const ASTContext &Ctx, const FunctionDecl *FD)
static bool PrepareExplicitObjectArgument(Sema &S, CXXMethodDecl *Method, Expr *Object, MultiExprArg &Args, SmallVectorImpl< Expr * > &NewArgs)
static OverloadingResult IsInitializerListConstructorConversion(Sema &S, Expr *From, QualType ToType, CXXRecordDecl *To, UserDefinedConversionSequence &User, OverloadCandidateSet &CandidateSet, bool AllowExplicit)
static bool IsMatrixConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, ImplicitConversionKind &ElConv, Expr *From, bool InOverloadResolution, bool CStyle)
Determine whether the conversion from FromType to ToType is a valid matrix conversion.
static bool checkAddressOfCandidateIsAvailable(Sema &S, const FunctionDecl *FD)
static bool IsFloatingPointConversion(Sema &S, QualType FromType, QualType ToType)
Determine whether the conversion from FromType to ToType is a valid floating point conversion.
static bool isFirstArgumentCompatibleWithType(ASTContext &Context, CXXConstructorDecl *Constructor, QualType Type)
static Comparison isBetterMultiversionCandidate(const OverloadCandidate &Cand1, const OverloadCandidate &Cand2)
static void NoteImplicitDeductionGuide(Sema &S, FunctionDecl *Fn)
static void collectViableConversionCandidates(Sema &SemaRef, Expr *From, QualType ToType, UnresolvedSetImpl &ViableConversions, OverloadCandidateSet &CandidateSet)
static ImplicitConversionSequence TryReferenceInit(Sema &S, Expr *Init, QualType DeclType, SourceLocation DeclLoc, bool SuppressUserConversions, bool AllowExplicit)
Compute an implicit conversion sequence for reference initialization.
static bool isNonDependentlyExplicit(FunctionTemplateDecl *FTD)
Determine whether a given function template has a simple explicit specifier or a non-value-dependent ...
static bool checkArgPlaceholdersForOverload(Sema &S, MultiExprArg Args, UnbridgedCastsSet &unbridged)
checkArgPlaceholdersForOverload - Check a set of call operands for placeholders.
static QualType makeQualifiedLValueReferenceType(QualType Base, QualifiersAndAtomic Quals, Sema &S)
static QualType chooseRecoveryType(OverloadCandidateSet &CS, OverloadCandidateSet::iterator *Best)
static void AddTemplateOverloadCandidate(Sema &S, OverloadCandidateSet &CandidateSet, DeferredMethodTemplateOverloadCandidate &C)
static void NoteSurrogateCandidate(Sema &S, OverloadCandidate *Cand)
static ExprResult BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MutableArrayRef< Expr * > Args, SourceLocation RParenLoc, bool EmptyLookup, bool AllowTypoCorrection)
Attempts to recover from a call where no functions were found.
static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand)
static bool diagnoseDiagnoseIfAttrsWith(Sema &S, const NamedDecl *ND, bool ArgDependent, SourceLocation Loc, CheckFn &&IsSuccessful)
static OverloadingResult IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType, UserDefinedConversionSequence &User, OverloadCandidateSet &Conversions, AllowedExplicit AllowExplicit, bool AllowObjCConversionOnExplicit)
Determines whether there is a user-defined conversion sequence (C++ [over.ics.user]) that converts ex...
static bool IsAcceptableNonMemberOperatorCandidate(ASTContext &Context, FunctionDecl *Fn, ArrayRef< Expr * > Args)
IsAcceptableNonMemberOperatorCandidate - Determine whether Fn is an acceptable non-member overloaded ...
static FunctionDecl * getMorePartialOrderingConstrained(Sema &S, FunctionDecl *Fn1, FunctionDecl *Fn2, bool IsFn1Reversed, bool IsFn2Reversed)
static void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, DeductionFailureInfo &DeductionFailure, unsigned NumArgs, bool TakingCandidateAddress)
Diagnose a failed template-argument deduction.
static bool IsTransparentUnionStandardConversion(Sema &S, Expr *From, QualType &ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static const FunctionProtoType * tryGetFunctionProtoType(QualType FromType)
Attempts to get the FunctionProtoType from a Type.
static bool PrepareArgumentsForCallToObjectOfClassType(Sema &S, SmallVectorImpl< Expr * > &MethodArgs, CXXMethodDecl *Method, MultiExprArg Args, SourceLocation LParenLoc)
static TemplateDeductionResult DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch, bool PartialOrdering, PackFold PackFold, bool *HasDeducedAnyParam)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
a trap message and trap category.
A class for storing results from argument-dependent lookup.
void erase(NamedDecl *D)
Removes any data associated with a given decl.
llvm::mapped_iterator< decltype(Decls)::iterator, select_second > iterator
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
unsigned getIntWidth(QualType T) const
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
const TargetInfo * getAuxTargetInfo() const
CanQualType UnsignedLongTy
QualType getRestrictType(QualType T) const
Return the uniqued reference to the type for a restrict qualified type.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
QualType getObjCIdType() const
Represents the Objective-CC id type.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
bool isSameTemplateParameterList(const TemplateParameterList *X, const TemplateParameterList *Y) const
Determine whether two template parameter lists are similar enough that they may be used in declaratio...
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
QualType getVolatileType(QualType T) const
Return the uniqued reference to the type for a volatile qualified type.
CanQualType UnsignedLongLongTy
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
CanQualType UnsignedShortTy
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
QualType getCVRQualifiedType(QualType T, unsigned CVR) const
Return a type with additional const, volatile, or restrict qualifiers.
bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)
Return true if the given vector types are of the same unqualified type or if they are equivalent to t...
const TargetInfo & getTargetInfo() const
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
QualType getConstantArrayType(const ASTContext &Ctx) const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
Attr - This represents one attribute.
A builtin binary operation expression such as "x + y" or "x <= y".
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
StringRef getOpcodeStr() const
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
static bool isCompoundAssignmentOp(Opcode Opc)
This class is used for builtin types like 'int'.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
const RecordType * getDetectedVirtual() const
The virtual base discovered on the path (if we are merely detecting virtuals).
bool isAmbiguous(CanQualType BaseType) const
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
Represents a C++ constructor within a class.
bool isCopyOrMoveConstructor(unsigned &TypeQuals) const
Determine whether this is a copy or move constructor.
bool isConvertingConstructor(bool AllowExplicit) const
Whether this constructor is a converting constructor (C++ [class.conv.ctor]), which can be used for u...
Represents a C++ conversion function within a class.
bool isExplicit() const
Return true if the declaration is already resolved to be explicit.
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Represents a call to a member function that may be written either with member call syntax (e....
static CXXMemberCallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
static CXXOperatorCallExpr * Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation OperatorLoc, FPOptionsOverride FPFeatures, ADLCallKind UsesADL=NotADL)
Represents a C++ struct/union/class.
bool isLambda() const
Determine whether this class describes a lambda function object.
llvm::iterator_range< conversion_iterator > getVisibleConversionFunctions() const
Get all conversion functions visible in current class, including conversion function templates.
bool hasDefinition() const
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
A rewritten comparison expression that was originally written using operator syntax.
Represents a C++ nested-name-specifier or a global scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
void setUsesMemberSyntax(bool V=true)
void markDependentForPostponedNameLookup()
Used by Sema to implement MSVC-compatible delayed name lookup.
Represents a canonical, potentially-qualified type.
bool isAtLeastAsQualifiedAs(CanQual< T > Other, const ASTContext &Ctx) const
Determines whether this canonical type is at least as qualified as the Other canonical type.
static CanQual< Type > CreateUnsafe(QualType Other)
CanProxy< U > castAs() const
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.
bool isVolatileQualified() const
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
bool isPartial() const
True iff the comparison is not totally ordered.
bool isStrong() const
True iff the comparison is "strong".
Complex values, per C99 6.2.5p11.
QualType getElementType() const
static CompoundAssignOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures, QualType CompLHSType=QualType(), QualType CompResultType=QualType())
Represents the canonical version of C arrays with a specified constant size.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
A reference to a declared variable, function, enum, etc.
void setHadMultipleCandidates(bool V=true)
Sets the flag telling whether this expression refers to a function that was resolved from an overload...
Decl - This represents one declaration (or definition), e.g.
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
const FunctionType * getFunctionType(bool BlocksToo=true) const
Looks through the Decl's underlying type to extract a FunctionType when possible.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
specific_attr_iterator< T > specific_attr_end() const
specific_attr_iterator< T > specific_attr_begin() const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
DeclarationNameLoc - Additional source/type location info for a declaration name.
The name of a declaration.
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void overloadCandidatesShown(unsigned N)
Call this after showing N overload candidates.
unsigned getNumOverloadCandidatesToShow() const
When a call or operator fails, print out up to this many candidate overloads as suggestions.
OverloadsShown getShowOverloads() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
RAII object that enters a new expression evaluation context.
Store information needed for an explicit specifier.
bool isExplicit() const
Determine whether this specifier is known to correspond to an explicit declaration.
ExplicitSpecKind getKind() const
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(FunctionDecl *Function)
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
The return type of classify().
static Classification makeSimpleLValue()
Create a simple, modifiable lvalue.
This represents one expression.
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
bool EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx, ConstantExprKind Kind=ConstantExprKind::Normal) const
Evaluate an expression that is required to be a constant expression.
@ NPCK_ZeroExpression
Expression is a Null pointer constant built from a zero integer expression that is not a simple,...
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
ExtVectorType - Extended vector type.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
const ParmVarDecl * getParamDecl(unsigned i) const
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
bool hasCXXExplicitFunctionObjectParameter() const
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
bool isVariadic() const
Whether this function is variadic.
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
unsigned getNumNonObjectParams() const
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isTargetMultiVersionDefault() const
True if this function is the default version of a multiversioned dispatch function as a part of the t...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
unsigned getNumParams() const
Qualifiers getMethodQuals() const
QualType getParamType(unsigned i) const
bool isVariadic() const
Whether this function prototype is variadic.
ArrayRef< QualType > param_types() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
A class which abstracts out some details necessary for making a call.
ExtInfo withNoReturn(bool noReturn) const
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
CallingConv getCallConv() const
QualType getReturnType() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
One of these records is kept for each identifier that is lexed.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
void dump() const
dump - Print this implicit conversion sequence to standard error.
bool isUserDefined() const
@ StaticObjectArgumentConversion
StandardConversionSequence Standard
When ConversionKind == StandardConversion, provides the details of the standard conversion sequence.
void setBad(BadConversionSequence::FailureKind Failure, Expr *FromExpr, QualType ToType)
Sets this sequence as a bad conversion for an explicit argument.
UserDefinedConversionSequence UserDefined
When ConversionKind == UserDefinedConversion, provides the details of the user-defined conversion seq...
static ImplicitConversionSequence getNullptrToBool(QualType SourceType, QualType DestType, bool NeedLValToRVal)
Form an "implicit" conversion sequence from nullptr_t to bool, for a direct-initialization of a bool ...
AmbiguousConversionSequence Ambiguous
When ConversionKind == AmbiguousConversion, provides the details of the ambiguous conversion.
void setInitializerListContainerType(QualType T, bool IA)
bool hasInitializerListContainerType() const
unsigned getKindRank() const
Return a ranking of the implicit conversion sequence kind, where smaller ranks represent better conve...
bool isInitializerListOfIncompleteArray() const
BadConversionSequence Bad
When ConversionKind == BadConversion, provides the details of the bad conversion.
QualType getInitializerListContainerType() const
void DiagnoseAmbiguousConversion(Sema &S, SourceLocation CaretLoc, const PartialDiagnostic &PDiag) const
Diagnoses an ambiguous conversion.
Describes an C or C++ initializer list.
bool hasDesignatedInit() const
Determine whether this initializer list contains a designated initializer.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
const Expr * getInit(unsigned Init) const
SourceLocation getEndLoc() const LLVM_READONLY
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeTemplateParameter(QualType T, NamedDecl *Param)
Create the initialization entity for a template parameter.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
An lvalue reference type, per C++11 [dcl.ref].
bool isCompatibleWithMSVC() const
Represents the results of name lookup.
void addAllDecls(const LookupResult &Other)
Add all the declarations from another set of lookup results.
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
DeclClass * getAsSingle() const
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
bool empty() const
Return true if no decls were found.
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
SourceLocation getNameLoc() const
Gets the location of the identifier.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
void suppressAccessDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup due to access control violat...
const UnresolvedSetImpl & asUnresolvedSet() const
UnresolvedSetImpl::iterator iterator
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
DeclarationName getLookupName() const
Gets the name to look up.
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
SourceLocation getMemberLoc() const
getMemberLoc - Return the location of the "member", in X->F, it is the location of 'F'.
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
bool hasQualifier() const
Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...
bool performsVirtualDispatch(const LangOptions &LO) const
Returns true if virtual dispatch is performed.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getExprLoc() const LLVM_READONLY
DeclAccessPair getFoundDecl() const
Retrieves the declaration found by lookup.
A pointer to member type per C++ 8.3.3 - Pointers to members.
NestedNameSpecifier getQualifier() const
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
QualType getPointeeType() const
Describes a module or submodule.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents an ObjC class declaration.
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCMethodDecl - Represents an instance or class method declaration.
Represents a pointer to an Objective C object.
bool isSpecialized() const
Whether this type is specialized, meaning that it has type arguments.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
void clear(CandidateSetKind CSK)
Clear out all of the candidates.
void AddDeferredTemplateCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, bool AllowExplicit, CallExpr::ADLCallKind IsADLCandidate, OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction)
bool isNewCandidate(Decl *F, OverloadCandidateParamOrder PO=OverloadCandidateParamOrder::Normal)
Determine when this overload candidate will be new to the overload set.
void AddDeferredConversionTemplateCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion)
void AddDeferredMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, OverloadCandidateParamOrder PO)
void DisableResolutionByPerfectCandidate()
ConversionSequenceList allocateConversionSequences(unsigned NumConversions)
Allocate storage for conversion sequences for NumConversions conversions.
llvm::MutableArrayRef< Expr * > getPersistentArgsArray(unsigned N)
Provide storage for any Expr* arg that must be preserved until deferred template candidates are deduc...
OperatorRewriteInfo getRewriteInfo() const
bool shouldDeferTemplateArgumentDeduction(const LangOptions &Opts) const
@ CSK_AddressOfOverloadSet
C++ [over.match.call.general] Resolve a call through the address of an overload set.
@ CSK_InitByConstructor
C++ [over.match.ctor], [over.match.list] Initialization of an object of class type by constructor,...
@ CSK_InitByUserDefinedConversion
C++ [over.match.copy]: Copy-initialization of an object of class type by user-defined conversion.
@ CSK_Normal
Normal lookup.
@ CSK_Operator
C++ [over.match.oper]: Lookup of operator function candidates in a call using operator syntax.
SmallVectorImpl< OverloadCandidate >::iterator iterator
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
bool shouldDeferDiags(Sema &S, ArrayRef< Expr * > Args, SourceLocation OpLoc)
Whether diagnostics should be deferred.
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
void exclude(Decl *F)
Exclude a function from being considered by overload resolution.
SourceLocation getLocation() const
OverloadCandidate & addCandidate(unsigned NumConversions=0, ConversionSequenceList Conversions={})
Add a new candidate with NumConversions conversion sequence slots to the overload set.
void InjectNonDeducedTemplateCandidates(Sema &S)
CandidateSetKind getKind() const
size_t nonDeferredCandidatesCount() const
SmallVector< OverloadCandidate *, 32 > CompleteCandidates(Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, SourceLocation OpLoc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
NestedNameSpecifier getQualifier() const
Fetches the nested-name qualifier, if one was given.
SourceLocation getNameLoc() const
Gets the location of the name.
UnresolvedSetImpl::iterator decls_iterator
decls_iterator decls_begin() const
unsigned getNumDecls() const
Gets the number of declarations in the unresolved set.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
decls_iterator decls_end() const
DeclarationName getName() const
Gets the name looked up.
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
ParenExpr - This represents a parenthesized expression, e.g.
Represents a parameter to a function.
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
bool isEquivalent(PointerAuthQualifier Other) const
std::string getAsString() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
bool isMoreQualifiedThan(QualType Other, const ASTContext &Ctx) const
Determine whether this type is more qualified than the other given type, requiring exact equality for...
bool isConstQualified() const
Determine whether this type is const-qualified.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualType apply(const ASTContext &Context, QualType QT) const
Apply the collected qualifiers to the given type.
QualifiersAndAtomic withVolatile()
QualifiersAndAtomic withAtomic()
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
bool hasOnlyConst() const
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
void removeObjCLifetime()
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
void removeAddressSpace()
void setAddressSpace(LangAS space)
PointerAuthQualifier getPointerAuth() const
bool hasObjCGCAttr() const
ObjCLifetime getObjCLifetime() const
std::string getAsString() const
LangAS getAddressSpace() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
field_range fields() const
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Scope - A scope is a transient data structure that is used while parsing the program.
Smart pointer class that efficiently represents Objective-C method names.
unsigned getNumArgs() const
bool areCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an SVE builtin and a VectorType that is a fixed-length representat...
bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible SVE vector types, false otherwise.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
bool IsAllowedCall(const FunctionDecl *Caller, const FunctionDecl *Callee)
Determines whether Caller may invoke Callee, based on their CUDA host/device attributes.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
bool inferTargetForImplicitSpecialMember(CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, CXXMethodDecl *MemberDecl, bool ConstRHS, bool Diagnose)
Given a implicit special member, infer its CUDA target from the calls it needs to make to underlying ...
static bool isImplicitHostDeviceFunction(const FunctionDecl *D)
void EraseUnwantedMatches(const FunctionDecl *Caller, llvm::SmallVectorImpl< std::pair< DeclAccessPair, FunctionDecl * > > &Matches)
Finds a function in Matches with highest calling priority from Caller context and erases all function...
CUDAFunctionPreference IdentifyPreference(const FunctionDecl *Caller, const FunctionDecl *Callee)
Identifies relative preference of a given Caller/Callee combination, based on their host/device attri...
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
Expr * stripARCUnbridgedCast(Expr *e)
stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast type, remove the placeholder cast.
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
virtual SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for one of the candidate conversions.
virtual SemaDiagnosticBuilder diagnoseNoMatch(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic complaining that the expression does not have integral or enumeration type.
virtual SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for the explicit conversion function.
virtual SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when the only matching conversion function is explicit.
virtual SemaDiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when we picked a conversion function (for cases when we are not allowed to pick a ...
virtual SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when there are multiple possible conversion functions.
virtual bool match(QualType T)=0
Determine whether the specified type is a valid destination type for this conversion.
virtual SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when the expression has incomplete class type.
For a defaulted function, the kind of defaulted function that it is.
bool isSpecialMember() const
bool isComparison() const
CXXSpecialMemberKind asSpecialMember() const
RAII class to control scope of DeferDiags.
bool match(QualType T) override
Match an integral or (possibly scoped) enumeration type.
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Sema - This implements semantic analysis and AST building for C.
bool TryFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy) const
Same as IsFunctionConversion, but if this would return true, it sets ResultTy to ToType.
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
bool diagnoseArgDependentDiagnoseIfAttrs(const FunctionDecl *Function, const Expr *ThisArg, ArrayRef< const Expr * > Args, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any non-ArgDependent DiagnoseIf...
ExprResult PerformContextuallyConvertToObjCPointer(Expr *From)
PerformContextuallyConvertToObjCPointer - Perform a contextual conversion of the expression From to a...
bool buildOverloadedCallSet(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, MultiExprArg Args, SourceLocation RParenLoc, OverloadCandidateSet *CandidateSet, ExprResult *Result)
Constructs and populates an OverloadedCandidateSet from the given function.
void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow)
Hides a using shadow declaration.
bool IsBuildingRecoveryCallExpr
Flag indicating if Sema is building a recovery call expression.
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
ExprResult BuildLiteralOperatorCall(LookupResult &R, DeclarationNameInfo &SuffixInfo, ArrayRef< Expr * > Args, SourceLocation LitEndLoc, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to a literal operator descri...
bool IsStringInit(Expr *Init, const ArrayType *AT)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
void AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
Adds a conversion function template specialization candidate to the overload set, using template argu...
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
void AddBuiltinCandidate(QualType *ParamTys, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool IsAssignmentOperator=false, unsigned NumContextualBoolArguments=0)
AddBuiltinCandidate - Add a candidate for a built-in operator.
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void AddArgumentDependentLookupCandidates(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, TemplateArgumentListInfo *ExplicitTemplateArgs, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add function candidates found via argument-dependent lookup to the set of overloading candidates.
ExprResult EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue)
EvaluateConvertedConstantExpression - Evaluate an Expression That is a converted constant expression ...
FPOptionsOverride CurFPFeatureOverrides()
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
DiagnosticsEngine & getDiagnostics() const
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
bool CheckNonDependentConversions(FunctionTemplateDecl *FunctionTemplate, ArrayRef< QualType > ParamTypes, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, ConversionSequenceList &Conversions, CheckNonDependentConversionsFlag UserConversionFlag, CXXRecordDecl *ActingContext=nullptr, QualType ObjectType=QualType(), Expr::Classification ObjectClassification={}, OverloadCandidateParamOrder PO={})
Check that implicit conversion sequences can be formed for each argument whose corresponding paramete...
bool isObjCPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType, bool &IncompatibleObjC)
isObjCPointerConversion - Determines whether this is an Objective-C pointer conversion.
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
bool FunctionParamTypesAreEqual(ArrayRef< QualType > Old, ArrayRef< QualType > New, unsigned *ArgPos=nullptr, bool Reversed=false)
FunctionParamTypesAreEqual - This routine checks two function proto types for equality of their param...
ExprResult PerformImplicitObjectArgumentInitialization(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, CXXMethodDecl *Method)
PerformObjectArgumentInitialization - Perform initialization of the implicit object parameter for the...
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
ASTContext & getASTContext() const
UnresolvedSetIterator getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd, TemplateSpecCandidateSet &FailedCandidates, SourceLocation Loc, const PartialDiagnostic &NoneDiag, const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag, bool Complain=true, QualType TargetType=QualType())
Retrieve the most specialized of the given function template specializations.
bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType)
IsIntegralPromotion - Determines whether the conversion from the expression From (whose potentially-a...
bool IsFloatingPointPromotion(QualType FromType, QualType ToType)
IsFloatingPointPromotion - Determines whether the conversion from FromType to ToType is a floating po...
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
void PopExpressionEvaluationContext()
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool FunctionNonObjectParamTypesAreEqual(const FunctionDecl *OldFunction, const FunctionDecl *NewFunction, unsigned *ArgPos=nullptr, bool Reversed=false)
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
llvm::SmallSetVector< CXXRecordDecl *, 16 > AssociatedClassSet
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr, const SourceRange &, DeclAccessPair FoundDecl)
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
QualType ExtractUnqualifiedFunctionType(QualType PossiblyAFunctionType)
bool IsPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType, bool &IncompatibleObjC)
IsPointerConversion - Determines whether the conversion of the expression From, which has the (possib...
@ Conversions
Allow explicit conversion functions but not explicit constructors.
void DiagnoseUseOfDeletedFunction(SourceLocation Loc, SourceRange Range, DeclarationName Name, OverloadCandidateSet &CandidateSet, FunctionDecl *Fn, MultiExprArg Args, bool IsMember=false)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool IsComplexPromotion(QualType FromType, QualType ToType)
Determine if a conversion is a complex promotion.
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
Module * getOwningModule(const Decl *Entity)
Get the module owning an entity.
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
void AddConversionCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true, bool StrictPackMatch=false)
AddConversionCandidate - Add a C++ conversion function as a candidate in the candidate set (C++ [over...
bool IsBlockPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
void FindAssociatedClassesAndNamespaces(SourceLocation InstantiationLoc, ArrayRef< Expr * > Args, AssociatedNamespaceSet &AssociatedNamespaces, AssociatedClassSet &AssociatedClasses)
Find the associated classes and namespaces for argument-dependent lookup for a call with the given se...
void AddMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, OverloadCandidateParamOrder PO={})
Add a C++ member function template as a candidate to the candidate set, using template argument deduc...
void DiagnoseSelfMove(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation OpLoc)
DiagnoseSelfMove - Emits a warning if a value is moved to itself.
bool isSameOrCompatibleFunctionType(QualType Param, QualType Arg)
Compare types for equality with respect to possibly compatible function types (noreturn adjustment,...
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
const LangOptions & getLangOpts() const
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A, const NamedDecl *B)
Determine if A and B are equivalent internal linkage declarations from different modules,...
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr)
Diagnose an empty lookup.
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult BuildSynthesizedThreeWayComparison(SourceLocation OpLoc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, FunctionDecl *DefaultedFn)
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
bool CheckUseOfCXXMethodAsAddressOfOperand(SourceLocation OpLoc, const Expr *Op, const CXXMethodDecl *MD)
AccessResult CheckUnresolvedMemberAccess(UnresolvedMemberExpr *E, DeclAccessPair FoundDecl)
Perform access-control checking on a previously-unresolved member access which has now been resolved ...
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
const LangOptions & LangOpts
bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType, bool InOverloadResolution, QualType &ConvertedType)
IsMemberPointerConversion - Determines whether the conversion of the expression From,...
ExprResult BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef< Expr * > Arg, SourceLocation RParenLoc, Expr *Config=nullptr, bool IsExecConfig=false, ADLCallKind UsesADL=ADLCallKind::NotADL)
BuildResolvedCallExpr - Build a call to a resolved expression, i.e.
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
llvm::SmallSetVector< DeclContext *, 16 > AssociatedNamespaceSet
MemberPointerConversionDirection
bool diagnoseArgIndependentDiagnoseIfAttrs(const NamedDecl *ND, SourceLocation Loc)
Emit diagnostics for the diagnose_if attributes on Function, ignoring any ArgDependent DiagnoseIfAttr...
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
void popCodeSynthesisContext()
bool AreConstraintExpressionsEqual(const NamedDecl *Old, const Expr *OldConstr, const TemplateCompareNewDeclInfo &New, const Expr *NewConstr)
ReferenceConversionsScope::ReferenceConversions ReferenceConversions
MemberPointerConversionResult CheckMemberPointerConversion(QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind, CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange, bool IgnoreBaseAccess, MemberPointerConversionDirection Direction)
CheckMemberPointerConversion - Check the member pointer conversion from the expression From to the ty...
Expr * BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit)
Build a CXXThisExpr and mark it referenced in the current context.
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add the overload candidates named by callee and/or found by argument dependent lookup to the given ov...
ExprResult DefaultLvalueConversion(Expr *E)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
void NoteOverloadCandidate(const NamedDecl *Found, const FunctionDecl *Fn, OverloadCandidateRewriteKind RewriteKind=OverloadCandidateRewriteKind(), QualType DestType=QualType(), bool TakingAddress=false)
bool DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType)
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
void ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, ADLResult &Functions)
FunctionDecl * resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult)
Given an expression that refers to an overloaded function, try to resolve that function to a single f...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, SourceLocation Loc={}, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
ObjCMethodDecl * SelectBestMethod(Selector Sel, MultiExprArg Args, bool IsInstance, SmallVectorImpl< ObjCMethodDecl * > &Methods)
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
AccessResult CheckAddressOfMemberAccess(Expr *OvlExpr, DeclAccessPair FoundDecl)
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
EnableIfAttr * CheckEnableIf(FunctionDecl *Function, SourceLocation CallLoc, ArrayRef< Expr * > Args, bool MissingImplicitThis=false)
Check the enable_if expressions on the given function.
ExprResult CreateUnresolvedLookupExpr(CXXRecordDecl *NamingClass, NestedNameSpecifierLoc NNSLoc, DeclarationNameInfo DNI, const UnresolvedSetImpl &Fns, bool PerformADL=true)
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversion=false, OverloadCandidateParamOrder PO={})
AddMethodCandidate - Adds a named decl (which is some kind of method) as a method candidate to the gi...
void diagnoseEquivalentInternalLinkageDeclarations(SourceLocation Loc, const NamedDecl *D, ArrayRef< const NamedDecl * > Equiv)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
ExprResult ActOnConditionalOp(SourceLocation QuestionLoc, SourceLocation ColonLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr)
ActOnConditionalOp - Parse a ?
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
bool resolveAndFixAddressOfSingleOverloadCandidate(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false)
Given an overloaded function, tries to turn it into a non-overloaded function reference using resolve...
CallExpr::ADLCallKind ADLCallKind
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
bool anyAltivecTypes(QualType srcType, QualType destType)
bool isLaxVectorConversion(QualType srcType, QualType destType)
Is this a legal conversion between two types, one of which is known to be a vector type?
ExprResult BuildOverloadedCallExpr(Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, bool AllowTypoCorrection=true, bool CalleesAddressIsTaken=false)
BuildOverloadedCallExpr - Given the call expression that calls Fn (which eventually refers to the dec...
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
bool isSFINAEContext() const
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
ExprResult BuildCallToObjectOfClassType(Scope *S, Expr *Object, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc)
BuildCallToObjectOfClassType - Build a call to an object of class type (C++ [over....
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
bool CanPerformAggregateInitializationForOverloadResolution(const InitializedEntity &Entity, InitListExpr *From)
Determine whether we can perform aggregate initialization for the purposes of overload resolution.
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
void AddFunctionCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, bool SuppressUserConversions=false, bool PartialOverloading=false, bool FirstArgumentIsBase=false)
Add all of the function declarations in the given function set to the overload candidate set.
bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose=true)
CheckPointerConversion - Check the pointer conversion from the expression From to the type ToType.
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
void NoteAllOverloadCandidates(Expr *E, QualType DestType=QualType(), bool TakingAddress=false)
AccessResult CheckUnresolvedLookupAccess(UnresolvedLookupExpr *E, DeclAccessPair FoundDecl)
void AddNonMemberOperatorCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
Add all of the non-member operator function declarations in the given function set to the overload ca...
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc, CallExpr *CE, FunctionDecl *FD)
CheckCallReturnType - Checks that a call expression's return type is complete.
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, ReferenceConversions *Conv=nullptr)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
MemberPointerConversionResult
SourceManager & SourceMgr
bool DiagnoseDependentMemberLookup(const LookupResult &R)
Diagnose a lookup that found results in an enclosing class during error recovery.
DiagnosticsEngine & Diags
NamespaceDecl * getStdNamespace() const
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
bool ResolveAndFixSingleFunctionTemplateSpecialization(ExprResult &SrcExpr, bool DoFunctionPointerConversion=false, bool Complain=false, SourceRange OpRangeForComplaining=SourceRange(), QualType DestTypeForComplaining=QualType(), unsigned DiagIDForComplaining=0)
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
void AddSurrogateCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, const FunctionProtoType *Proto, Expr *Object, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddSurrogateCandidate - Adds a "surrogate" candidate function that converts the given Object to a fun...
MemberExpr * BuildMemberExpr(Expr *Base, bool IsArrow, SourceLocation OpLoc, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, bool HadMultipleCandidates, const DeclarationNameInfo &MemberNameInfo, QualType Ty, ExprValueKind VK, ExprObjectKind OK, const TemplateArgumentListInfo *TemplateArgs=nullptr)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
bool IsFunctionConversion(QualType FromType, QualType ToType) const
Determine whether the conversion from FromType to ToType is a valid conversion of ExtInfo/ExtProtoInf...
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(const NamedDecl *D1, ArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, ArrayRef< AssociatedConstraint > AC2)
If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...
ForRangeStatus BuildForRangeBeginEndCall(SourceLocation Loc, SourceLocation RangeLoc, const DeclarationNameInfo &NameInfo, LookupResult &MemberLookup, OverloadCandidateSet *CandidateSet, Expr *Range, ExprResult *CallExpr)
Build a call to 'begin' or 'end' for a C++11 for-range statement.
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
ExprResult InitializeExplicitObjectArgument(Sema &S, Expr *Obj, FunctionDecl *Fun)
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method, SourceLocation CallLoc)
Returns true if the explicit object parameter was invalid.
bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType)
Helper function to determine whether this is the (deprecated) C++ conversion from a string literal to...
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
bool ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool ExecConfig=false)
ConvertArgumentsForCall - Converts the arguments specified in Args/NumArgs to the parameter types of ...
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false, bool PartialOverloading=false)
Returns the more specialized function template according to the rules of function template partial or...
bool CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall, const FunctionProtoType *Proto)
CheckFunctionCall - Check a direct function call for various correctness and safety properties not st...
void AddMemberOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, OverloadCandidateParamOrder PO={})
Add overload candidates for overloaded operators that are member functions.
void CheckVirtualDtorCall(CXXDestructorDecl *dtor, SourceLocation Loc, bool IsDelete, bool CallCanBeVirtual, bool WarnOnNonAbstractTypes, SourceLocation DtorLoc)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto, const Expr *ThisArg, ArrayRef< const Expr * > Args, bool IsMemberFunction, SourceLocation Loc, SourceRange Range, VariadicCallType CallType)
Handles the checks for format strings, non-POD arguments to vararg functions, NULL arguments passed t...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
void dump() const
dump - Print this standard conversion sequence to standard error.
void setFromType(QualType T)
DeclAccessPair FoundCopyConstructor
bool isIdentityConversion() const
unsigned BindsToRvalue
Whether we're binding to an rvalue.
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
QualType getFromType() const
ImplicitConversionKind First
First – The first conversion can be an lvalue-to-rvalue conversion, array-to-pointer conversion,...
unsigned BindsImplicitObjectArgumentWithoutRefQualifier
Whether this binds an implicit object argument to a non-static member function without a ref-qualifie...
unsigned ReferenceBinding
ReferenceBinding - True when this is a reference binding (C++ [over.ics.ref]).
void setAsIdentityConversion()
StandardConversionSequence - Set the standard conversion sequence to the identity conversion.
unsigned DeprecatedStringLiteralToCharPtr
Whether this is the deprecated conversion of a string literal to a pointer to non-const character dat...
CXXConstructorDecl * CopyConstructor
CopyConstructor - The copy constructor that is used to perform this conversion, when the conversion i...
unsigned IncompatibleObjC
IncompatibleObjC - Whether this is an Objective-C conversion that we should warn about (if we actuall...
unsigned ObjCLifetimeConversionBinding
Whether this binds a reference to an object with a different Objective-C lifetime qualifier.
ImplicitConversionKind Third
Third - The third conversion can be a qualification conversion or a function conversion.
unsigned QualificationIncludesObjCLifetime
Whether the qualification conversion involves a change in the Objective-C lifetime (for automatic ref...
void setToType(unsigned Idx, QualType T)
bool isPointerConversionToBool() const
isPointerConversionToBool - Determines whether this conversion is a conversion of a pointer or pointe...
void * ToTypePtrs[3]
ToType - The types that this conversion is converting to in each step.
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
unsigned IsLvalueReference
Whether this is an lvalue reference binding (otherwise, it's an rvalue reference binding).
ImplicitConversionKind Dimension
Dimension - Between the second and third conversion a vector or matrix dimension conversion may occur...
unsigned BindsToFunctionLvalue
Whether we're binding to a function lvalue.
unsigned DirectBinding
DirectBinding - True when this is a reference binding that is a direct binding (C++ [dcl....
ImplicitConversionRank getRank() const
getRank - Retrieve the rank of this standard conversion sequence (C++ 13.3.3.1.1p3).
bool isPointerConversionToVoidPointer(ASTContext &Context) const
isPointerConversionToVoidPointer - Determines whether this conversion is a conversion of a pointer to...
void setAllToTypes(QualType T)
unsigned FromBracedInitList
Whether the source expression was originally a single element braced-init-list.
QualType getToType(unsigned Idx) const
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
StringRef getString() const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
virtual bool hasIbm128Type() const
Determine whether the __ibm128 type is supported on this target.
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
A convenient class for passing around template argument information.
A template argument list.
Represents a template argument.
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
QualType getAsType() const
Retrieve the type for a type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
@ Template
The template argument is a template name that was provided for a template template parameter.
@ Pack
The template argument is actually a parameter pack.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
@ Template
A single template declaration.
bool hasAssociatedConstraints() const
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
SmallVector< TemplateSpecCandidate, 16 >::iterator iterator
void NoteCandidates(Sema &S, SourceLocation Loc)
NoteCandidates - When no template specialization match is found, prints diagnostic messages containin...
void clear()
Clear out all of the candidates.
SourceLocation getLocation() const
TemplateSpecCandidate & addCandidate()
Add a new candidate with NumConversions conversion sequence slots to the overload set.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
const Type * getTypeForDecl() const
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isBlockPointerType() const
bool isBooleanType() const
bool isObjCBuiltinType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
bool isIncompleteArrayType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isFloat16Type() const
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
bool isRValueReferenceType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
bool isConvertibleToFixedPointType() const
Return true if this can be converted to (or from) a fixed point type.
CXXRecordDecl * castAsCXXRecordDecl() const
bool isArithmeticType() const
bool isPointerType() const
bool isArrayParameterType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isExtVectorBoolType() const
bool isObjCObjectOrInterfaceType() const
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isLValueReferenceType() const
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const BuiltinType * getAsPlaceholderType() const
bool isMemberPointerType() const
bool isObjCIdType() const
bool isMatrixType() const
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isObjectType() const
Determine whether this type is an object type.
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isBFloat16Type() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isVectorType() const
bool isObjCClassType() const
bool isRealFloatingType() const
Floating point categories.
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isHLSLAttributedResourceType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given unary opcode.
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
DeclarationName getMemberName() const
Retrieve the name of the member that this expression refers to.
QualType getBaseType() const
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getMemberLoc() const
Retrieve the location of the name of the member that this expression refers to.
A set of unresolved declarations.
ArrayRef< DeclAccessPair > pairs() const
void addDecl(NamedDecl *D)
The iterator over UnresolvedSets.
A set of unresolved declarations.
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
static UserDefinedLiteral * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation LitEndLoc, SourceLocation SuffixLoc, FPOptionsOverride FPFeatures)
unsigned getNumElements() const
QualType getElementType() const
Provides information about an attempted template argument deduction, whose success or failure was des...
TemplateArgumentList * takeSugared()
Take ownership of the deduced template argument lists.
TemplateArgument SecondArg
The second template argument to which the template argument deduction failure refers.
TemplateParameter Param
The template parameter to which a template argument deduction failure refers.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
TemplateArgument FirstArg
The first template argument to which the template argument deduction failure refers.
ConstraintSatisfaction AssociatedConstraintsSatisfaction
The constraint satisfaction details resulting from the associated constraints satisfaction tests.
void takeSFINAEDiagnostic(PartialDiagnosticAt &PD)
Take ownership of the SFINAE diagnostic.
unsigned CallArgIndex
The index of the function argument that caused a deduction failure.
bool hasStrictPackMatch() const
specific_attr_iterator - Iterates over a subrange of an AttrVec, only providing attributes that are o...
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
bool Ret(InterpState &S, CodePtr &PC)
void checkAssignmentLifetime(Sema &SemaRef, const AssignedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for assigning to the ent...
The JSON file list parser is used to communicate input to InstallAPI.
ImplicitConversionRank GetDimensionConversionRank(ImplicitConversionRank Base, ImplicitConversionKind Dimension)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
bool isBetterOverloadCandidate(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2, SourceLocation Loc, OverloadCandidateSet::CandidateSetKind Kind, bool PartialOverloading=false)
isBetterOverloadCandidate - Determines whether the first overload candidate is a better candidate tha...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ ovl_fail_final_conversion_not_exact
This conversion function template specialization candidate is not viable because the final conversion...
@ ovl_fail_enable_if
This candidate function was not viable because an enable_if attribute disabled it.
@ ovl_fail_illegal_constructor
This conversion candidate was not considered because it is an illegal instantiation of a constructor ...
@ ovl_fail_bad_final_conversion
This conversion candidate is not viable because its result type is not implicitly convertible to the ...
@ ovl_fail_module_mismatched
This candidate was not viable because it has internal linkage and is from a different module unit tha...
@ ovl_fail_too_few_arguments
@ ovl_fail_addr_not_available
This candidate was not viable because its address could not be taken.
@ ovl_fail_too_many_arguments
@ ovl_non_default_multiversion_function
This candidate was not viable because it is a non-default multiversioned function.
@ ovl_fail_constraints_not_satisfied
This candidate was not viable because its associated constraints were not satisfied.
@ ovl_fail_bad_conversion
@ ovl_fail_bad_target
(CUDA) This candidate was not viable because the callee was not accessible from the caller's target (...
@ ovl_fail_inhctor_slice
This inherited constructor is not viable because it would slice the argument.
@ ovl_fail_object_addrspace_mismatch
This constructor/conversion candidate fail due to an address space mismatch between the object being ...
@ ovl_fail_explicit
This candidate constructor or conversion function is explicit but the context doesn't permit explicit...
@ ovl_fail_trivial_conversion
This conversion candidate was not considered because it duplicates the work of a trivial or derived-t...
@ Comparison
A comparison.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
ImplicitConversionRank
ImplicitConversionRank - The rank of an implicit conversion kind.
@ ICR_Conversion
Conversion.
@ ICR_Writeback_Conversion
ObjC ARC writeback conversion.
@ ICR_HLSL_Dimension_Reduction
HLSL Matching Dimension Reduction.
@ ICR_HLSL_Dimension_Reduction_Conversion
HLSL Dimension reduction with conversion.
@ ICR_HLSL_Scalar_Widening
HLSL Scalar Widening.
@ ICR_C_Conversion
Conversion only allowed in the C standard (e.g. void* to char*).
@ ICR_OCL_Scalar_Widening
OpenCL Scalar Widening.
@ ICR_Complex_Real_Conversion
Complex <-> Real conversion.
@ ICR_HLSL_Scalar_Widening_Conversion
HLSL Scalar Widening with conversion.
@ ICR_HLSL_Dimension_Reduction_Promotion
HLSL Dimension reduction with promotion.
@ ICR_Promotion
Promotion.
@ ICR_Exact_Match
Exact Match.
@ ICR_C_Conversion_Extension
Conversion not allowed by the C standard, but that we accept as an extension anyway.
@ ICR_HLSL_Scalar_Widening_Promotion
HLSL Scalar Widening with promotion.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_ViableCandidates
Requests that only viable candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
Expr::ConstantExprKind ConstantExprKind
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OverloadsShown
Specifies which overload candidates to display when overload resolution fails.
@ Ovl_Best
Show just the "best" overload candidates.
llvm::MutableArrayRef< ImplicitConversionSequence > ConversionSequenceList
A list of implicit conversion sequences for the arguments of an OverloadCandidate.
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
OverloadCandidateRewriteKind
The kinds of rewrite we perform on overload candidates.
@ CRK_Reversed
Candidate is a rewritten candidate with a reversed order of parameters.
@ CRK_None
Candidate is not a rewritten candidate.
@ CRK_DifferentOperator
Candidate is a rewritten candidate with a different operator name.
MutableArrayRef< Expr * > MultiExprArg
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Result
The result type of a method or function.
const FunctionProtoType * T
ImplicitConversionKind
ImplicitConversionKind - The kind of implicit conversion used to convert an argument to a parameter's...
@ ICK_Complex_Conversion
Complex conversions (C99 6.3.1.6)
@ ICK_Floating_Promotion
Floating point promotions (C++ [conv.fpprom])
@ ICK_Boolean_Conversion
Boolean conversions (C++ [conv.bool])
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
@ ICK_Fixed_Point_Conversion
Fixed point type conversions according to N1169.
@ ICK_Vector_Conversion
Vector conversions.
@ ICK_Block_Pointer_Conversion
Block Pointer conversions.
@ ICK_Pointer_Member
Pointer-to-member conversions (C++ [conv.mem])
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
@ ICK_HLSL_Array_RValue
HLSL non-decaying array rvalue cast.
@ ICK_SVE_Vector_Conversion
Arm SVE Vector conversions.
@ ICK_HLSL_Vector_Truncation
HLSL vector truncation.
@ ICK_Incompatible_Pointer_Conversion
C-only conversion between pointers with incompatible types.
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
@ ICK_RVV_Vector_Conversion
RISC-V RVV Vector conversions.
@ ICK_Complex_Promotion
Complex promotions (Clang extension)
@ ICK_Num_Conversion_Kinds
The number of conversion kinds.
@ ICK_HLSL_Matrix_Splat
HLSL matrix splat from scalar or boolean type.
@ ICK_Function_Conversion
Function pointer conversion (C++17 [conv.fctptr])
@ ICK_Vector_Splat
A vector splat from an arithmetic type.
@ ICK_Zero_Queue_Conversion
Zero constant to queue.
@ ICK_Identity
Identity conversion (no conversion)
@ ICK_Derived_To_Base
Derived-to-base (C++ [over.best.ics])
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
@ ICK_Qualification
Qualification conversions (C++ [conv.qual])
@ ICK_Pointer_Conversion
Pointer conversions (C++ [conv.ptr])
@ ICK_TransparentUnionConversion
Transparent Union Conversions.
@ ICK_Integral_Promotion
Integral promotions (C++ [conv.prom])
@ ICK_HLSL_Matrix_Truncation
HLSL Matrix truncation.
@ ICK_Floating_Conversion
Floating point conversions (C++ [conv.double].
@ ICK_Compatible_Conversion
Conversions between compatible types in C99.
@ ICK_C_Only_Conversion
Conversions allowed in C, but not C++.
@ ICK_Writeback_Conversion
Objective-C ARC writeback conversion.
@ ICK_Zero_Event_Conversion
Zero constant to event (OpenCL1.2 6.12.10)
@ ICK_Complex_Real
Complex-real conversions (C99 6.3.1.7)
@ ICK_Function_To_Pointer
Function-to-pointer (C++ [conv.array])
@ Template
We are parsing a template declaration.
ActionResult< CXXBaseSpecifier * > BaseResult
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
@ Compatible
Compatible - the types are compatible according to the standard.
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
@ FunctionTemplate
The name was classified as a function template name.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
CXXSpecialMemberKind
Kinds of C++ special members.
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool shouldEnforceArgLimit(bool PartialOverloading, FunctionDecl *Function)
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
NarrowingKind
NarrowingKind - The kind of narrowing conversion being performed by a standard conversion sequence ac...
@ NK_Not_Narrowing
Not a narrowing conversion.
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
@ TPOC_Conversion
Partial ordering of function templates for a call to a conversion function.
@ TPOC_Call
Partial ordering of function templates for a function call.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateDeductionResult
Describes the result of template argument deduction.
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
@ CUDATargetMismatch
CUDA Target attributes do not match.
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ Invalid
The declaration was invalid; do nothing.
@ Success
Template argument deduction was successful.
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
@ AlreadyDiagnosed
Some error which was already diagnosed.
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
U cast(CodeGen::Address addr)
ConstructorInfo getConstructorInfo(NamedDecl *ND)
@ None
The alignment was not explicit in code.
CCEKind
Contexts in which a converted constant expression is required.
@ TemplateArg
Value of a non-type template parameter.
@ Noexcept
Condition in a noexcept(bool) specifier.
@ ArrayBound
Array bound in array declarator or new-expression.
@ TempArgStrict
As above, but applies strict template checking rules.
@ ExplicitBool
Condition in an explicit(bool) specifier.
ImplicitConversionRank GetConversionRank(ImplicitConversionKind Kind)
GetConversionRank - Retrieve the implicit conversion rank corresponding to the given implicit convers...
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
@ EST_None
no exception specification
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
__DEVICE__ _Tp abs(const std::complex< _Tp > &__c)
Represents an ambiguous user-defined conversion sequence.
ConversionSet::const_iterator const_iterator
ConversionSet & conversions()
SmallVector< std::pair< NamedDecl *, FunctionDecl * >, 4 > ConversionSet
void setFromType(QualType T)
void setToType(QualType T)
void addConversion(NamedDecl *Found, FunctionDecl *D)
void copyFrom(const AmbiguousConversionSequence &)
const Expr * ConstraintExpr
UnsignedOrNone ArgPackSubstIndex
QualType getToType() const
QualType getFromType() const
OverloadFixItKind Kind
The type of fix applied.
unsigned NumConversionsFixed
The number of Conversions fixed.
void setConversionChecker(TypeComparisonFuncTy Foo)
Resets the default conversion checker method.
std::vector< FixItHint > Hints
The list of Hints generated so far.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
const DeclarationNameLoc & getInfo() const
SourceLocation getCXXLiteralOperatorNameLoc() const
getCXXLiteralOperatorNameLoc - Returns the location of the literal operator name (not the operator ke...
A structure used to record information about a failed template argument deduction,...
void * Data
Opaque pointer containing additional data about this deduction failure.
const TemplateArgument * getSecondArg()
Return the second template argument this deduction failure refers to, if any.
unsigned Result
A Sema::TemplateDeductionResult.
PartialDiagnosticAt * getSFINAEDiagnostic()
Retrieve the diagnostic which caused this deduction failure, if any.
unsigned HasDiagnostic
Indicates whether a diagnostic is stored in Diagnostic.
TemplateDeductionResult getResult() const
void Destroy()
Free any memory associated with this deduction failure.
char Diagnostic[sizeof(PartialDiagnosticAt)]
A diagnostic indicating why deduction failed.
UnsignedOrNone getCallArgIndex()
Return the index of the call argument that this deduction failure refers to, if any.
TemplateParameter getTemplateParameter()
Retrieve the template parameter this deduction failure refers to, if any.
TemplateArgumentList * getTemplateArgumentList()
Retrieve the template argument list associated with this deduction failure, if any.
const TemplateArgument * getFirstArg()
Return the first template argument this deduction failure refers to, if any.
DeferredTemplateOverloadCandidate * Next
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
Information about operator rewrites to consider when adding operator functions to a candidate set.
bool allowsReversed(OverloadedOperatorKind Op) const
Determine whether reversing parameter order is allowed for operator Op.
bool shouldAddReversed(Sema &S, ArrayRef< Expr * > OriginalArgs, FunctionDecl *FD) const
Determine whether we should add a rewritten candidate for FD with reversed parameter order.
bool isAcceptableCandidate(const FunctionDecl *FD) const
bool isReversible() const
Determines whether this operator could be implemented by a function with reversed parameter order.
SourceLocation OpLoc
The source location of the operator.
bool AllowRewrittenCandidates
Whether we should include rewritten candidates in the overload set.
OverloadCandidateRewriteKind getRewriteKind(const FunctionDecl *FD, OverloadCandidateParamOrder PO)
Determine the kind of rewrite that should be performed for this candidate.
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
unsigned StrictPackMatch
Have we matched any packs on the parameter side, versus any non-packs on the argument side,...
unsigned IgnoreObjectArgument
IgnoreObjectArgument - True to indicate that the first argument's conversion, which for this function...
bool TryToFixBadConversion(unsigned Idx, Sema &S)
bool NotValidBecauseConstraintExprHasError() const
unsigned IsADLCandidate
True if the candidate was found using ADL.
unsigned IsSurrogate
IsSurrogate - True to indicate that this candidate is a surrogate for a conversion to a function poin...
QualType BuiltinParamTypes[3]
BuiltinParamTypes - Provides the parameter types of a built-in overload candidate.
DeclAccessPair FoundDecl
FoundDecl - The original declaration that was looked up / invented / otherwise found,...
FunctionDecl * Function
Function - The actual function that this candidate represents.
unsigned RewriteKind
Whether this is a rewritten candidate, and if so, of what kind?
ConversionFixItGenerator Fix
The FixIt hints which can be used to fix the Bad candidate.
unsigned Best
Whether this candidate is the best viable function, or tied for being the best viable function.
StandardConversionSequence FinalConversion
FinalConversion - For a conversion function (where Function is a CXXConversionDecl),...
unsigned getNumParams() const
unsigned HasFinalConversion
Whether FinalConversion has been set.
unsigned TookAddressOfOverload
unsigned FailureKind
FailureKind - The reason why this candidate is not viable.
unsigned ExplicitCallArguments
The number of call arguments that were explicitly provided, to be used while performing partial order...
ConversionSequenceList Conversions
The conversion sequences used to convert the function arguments to the function parameters.
DeductionFailureInfo DeductionFailure
unsigned Viable
Viable - True to indicate that this overload candidate is viable.
CXXConversionDecl * Surrogate
Surrogate - The conversion function for which this candidate is a surrogate, but only if IsSurrogate ...
OverloadCandidateRewriteKind getRewriteKind() const
Get RewriteKind value in OverloadCandidateRewriteKind type (This function is to workaround the spurio...
bool HasFormOfMemberPointer
OverloadExpr * Expression
bool SuppressUserConversions
Do not consider any user-defined conversions when constructing the initializing sequence.
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Decl * Entity
The entity that is being synthesized.
Abstract class used to diagnose incomplete types.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
TemplateSpecCandidate - This is a generalization of OverloadCandidate which keeps track of template a...
void NoteDeductionFailure(Sema &S, bool ForTakingAddress)
Diagnose a template argument deduction failure.
DeductionFailureInfo DeductionFailure
Template argument deduction info.
Decl * Specialization
Specialization - The actual specialization that this candidate represents.
DeclAccessPair FoundDecl
The declaration that was looked up, together with its access.
void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)
UserDefinedConversionSequence - Represents a user-defined conversion sequence (C++ 13....
StandardConversionSequence Before
Represents the standard conversion that occurs before the actual user-defined conversion.
FunctionDecl * ConversionFunction
ConversionFunction - The function that will perform the user-defined conversion.
bool HadMultipleCandidates
HadMultipleCandidates - When this is true, it means that the conversion function was resolved from an...
StandardConversionSequence After
After - Represents the standard conversion that occurs after the actual user-defined conversion.
bool EllipsisConversion
EllipsisConversion - When this is true, it means user-defined conversion sequence starts with a ....
DeclAccessPair FoundConversionFunction
The declaration that we found via name lookup, which might be the same as ConversionFunction or it mi...
void dump() const
dump - Print this user-defined conversion sequence to standard error.
Describes an entity that is being assigned.