41#include "llvm/ADT/DenseSet.h"
42#include "llvm/ADT/STLExtras.h"
43#include "llvm/ADT/STLForwardCompat.h"
44#include "llvm/ADT/ScopeExit.h"
45#include "llvm/ADT/SmallPtrSet.h"
46#include "llvm/ADT/SmallVector.h"
60 return P->hasAttr<PassObjectSizeAttr>();
81 if (HadMultipleCandidates)
92 CK_FunctionToPointerDecay);
96 bool InOverloadResolution,
99 bool AllowObjCWritebackConversion);
103 bool InOverloadResolution,
111 bool AllowObjCConversionOnExplicit);
179 return Rank[(int)Kind];
204 static const char *
const Name[] = {
208 "Function-to-pointer",
209 "Function pointer conversion",
211 "Integral promotion",
212 "Floating point promotion",
214 "Integral conversion",
215 "Floating conversion",
216 "Complex conversion",
217 "Floating-integral conversion",
218 "Pointer conversion",
219 "Pointer-to-member conversion",
220 "Boolean conversion",
221 "Compatible-types conversion",
222 "Derived-to-base conversion",
224 "SVE Vector conversion",
225 "RVV Vector conversion",
227 "Complex-real conversion",
228 "Block Pointer conversion",
229 "Transparent Union Conversion",
230 "Writeback conversion",
231 "OpenCL Zero Event Conversion",
232 "OpenCL Zero Queue Conversion",
233 "C specific type conversion",
234 "Incompatible pointer conversion",
235 "Fixed point conversion",
236 "HLSL vector truncation",
237 "HLSL matrix truncation",
238 "Non-decaying array conversion",
316 FromType = Context.getArrayDecayedType(FromType);
328 const Expr *Converted) {
331 if (
auto *EWC = dyn_cast<ExprWithCleanups>(Converted)) {
338 while (
auto *ICE = dyn_cast<ImplicitCastExpr>(Converted)) {
339 switch (ICE->getCastKind()) {
341 case CK_IntegralCast:
342 case CK_IntegralToBoolean:
343 case CK_IntegralToFloating:
344 case CK_BooleanToSignedIntegral:
345 case CK_FloatingToIntegral:
346 case CK_FloatingToBoolean:
347 case CK_FloatingCast:
348 Converted = ICE->getSubExpr();
374 QualType &ConstantType,
bool IgnoreFloatToIntegralConversion,
375 bool AllowRelaxedEval)
const {
377 "narrowing check outside C++");
388 ToType = ED->getIntegerType();
394 goto FloatingIntegralConversion;
396 goto IntegralConversion;
407 FloatingIntegralConversion:
412 if (IgnoreFloatToIntegralConversion)
415 assert(
Initializer &&
"Unknown conversion expression");
421 if (std::optional<llvm::APSInt> IntConstantValue =
425 Result.convertFromAPInt(*IntConstantValue, IntConstantValue->isSigned(),
426 llvm::APFloat::rmNearestTiesToEven);
428 llvm::APSInt ConvertedValue = *IntConstantValue;
430 llvm::APFloat::opStatus Status =
Result.convertToInteger(
431 ConvertedValue, llvm::APFloat::rmTowardZero, &ignored);
434 if (Status == llvm::APFloat::opInvalidOp ||
435 *IntConstantValue != ConvertedValue) {
436 ConstantValue =
APValue(*IntConstantValue);
464 Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue,
465 AllowRelaxedEval)))) {
468 ConstantValue = R.Val;
469 assert(ConstantValue.
isFloat());
470 llvm::APFloat FloatVal = ConstantValue.
getFloat();
473 llvm::APFloat Converted = FloatVal;
474 llvm::APFloat::opStatus ConvertStatus =
476 llvm::APFloat::rmNearestTiesToEven, &ignored);
478 llvm::APFloat::rmNearestTiesToEven, &ignored);
480 if (FloatVal.isNaN() && Converted.isNaN() &&
481 !FloatVal.isSignaling() && !Converted.isSignaling()) {
487 if (!Converted.bitwiseIsEqual(FloatVal)) {
494 if (ConvertStatus & llvm::APFloat::opOverflow) {
516 IntegralConversion: {
524 constexpr auto CanRepresentAll = [](
bool FromSigned,
unsigned FromWidth,
525 bool ToSigned,
unsigned ToWidth) {
526 return (FromWidth < ToWidth + (FromSigned == ToSigned)) &&
527 !(FromSigned && !ToSigned);
530 if (CanRepresentAll(FromSigned, FromWidth, ToSigned, ToWidth))
536 bool DependentBitField =
false;
538 if (BitField->getBitWidth()->isValueDependent())
539 DependentBitField =
true;
540 else if (
unsigned BitFieldWidth = BitField->getBitWidthValue();
541 BitFieldWidth < FromWidth) {
542 if (CanRepresentAll(FromSigned, BitFieldWidth, ToSigned, ToWidth))
546 FromWidth = BitFieldWidth;
554 std::optional<llvm::APSInt> OptInitializerValue =
555 Initializer->getIntegerConstantExpr(Ctx, AllowRelaxedEval);
556 if (!OptInitializerValue) {
560 if (DependentBitField && !(FromSigned && !ToSigned))
566 llvm::APSInt &InitializerValue = *OptInitializerValue;
567 bool Narrowing =
false;
568 if (FromWidth < ToWidth) {
571 if (InitializerValue.isSigned() && InitializerValue.isNegative())
577 InitializerValue.extend(InitializerValue.getBitWidth() + 1);
579 llvm::APSInt ConvertedValue = InitializerValue;
580 ConvertedValue = ConvertedValue.trunc(ToWidth);
581 ConvertedValue.setIsSigned(ToSigned);
582 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
583 ConvertedValue.setIsSigned(InitializerValue.isSigned());
585 if (ConvertedValue != InitializerValue)
590 ConstantValue =
APValue(InitializerValue);
606 ConstantValue = R.Val;
607 assert(ConstantValue.
isFloat());
608 llvm::APFloat FloatVal = ConstantValue.
getFloat();
613 if (FloatVal.isNaN() && FloatVal.isSignaling()) {
629 raw_ostream &OS = llvm::errs();
630 bool PrintedSomething =
false;
633 PrintedSomething =
true;
637 if (PrintedSomething) {
643 OS <<
" (by copy constructor)";
645 OS <<
" (direct reference binding)";
647 OS <<
" (reference binding)";
649 PrintedSomething =
true;
653 if (PrintedSomething) {
657 PrintedSomething =
true;
660 if (!PrintedSomething) {
661 OS <<
"No conversions required";
668 raw_ostream &OS = llvm::errs();
676 OS <<
"aggregate initialization";
686 raw_ostream &OS = llvm::errs();
688 OS <<
"Worst list element conversion: ";
689 switch (ConversionKind) {
691 OS <<
"Standard conversion: ";
695 OS <<
"User-defined conversion: ";
699 OS <<
"Ellipsis conversion";
702 OS <<
"Ambiguous conversion";
705 OS <<
"Bad conversion";
730 struct DFIArguments {
736 struct DFIParamWithArguments : DFIArguments {
741 struct DFIDeducedMismatchArgs : DFIArguments {
742 TemplateArgumentList *TemplateArgs;
743 unsigned CallArgIndex;
748 TemplateArgumentList *TemplateArgs;
749 ConstraintSatisfaction Satisfaction;
760 Result.Result =
static_cast<unsigned>(TDK);
761 Result.HasDiagnostic =
false;
781 Result.HasDiagnostic =
true;
788 auto *Saved =
new (Context) DFIDeducedMismatchArgs;
799 DFIArguments *Saved =
new (Context) DFIArguments;
811 DFIParamWithArguments *Saved =
new (Context) DFIParamWithArguments;
812 Saved->Param = Info.
Param;
825 Result.HasDiagnostic =
true;
830 CNSInfo *Saved =
new (Context) CNSInfo;
840 llvm_unreachable(
"not a deduction failure");
873 Diag->~PartialDiagnosticAt();
880 static_cast<CNSInfo *
>(
Data)->Satisfaction.~ConstraintSatisfaction();
883 Diag->~PartialDiagnosticAt();
919 return TemplateParameter::getFromOpaqueValue(
Data);
924 return static_cast<DFIParamWithArguments*
>(
Data)->Param;
954 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->TemplateArgs;
960 return static_cast<CNSInfo*
>(
Data)->TemplateArgs;
992 return &
static_cast<DFIArguments*
>(
Data)->FirstArg;
1024 return &
static_cast<DFIArguments*
>(
Data)->SecondArg;
1039 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->CallArgIndex;
1042 return std::nullopt;
1055 for (
unsigned I = 0; I <
X->getNumParams(); ++I)
1059 if (
auto *FTX =
X->getDescribedFunctionTemplate()) {
1064 FTY->getTemplateParameters()))
1073 OverloadedOperatorKind::OO_EqualEqual);
1085 OverloadedOperatorKind::OO_ExclaimEqual);
1103 auto *NotEqFD = Op->getAsFunction();
1104 if (
auto *UD = dyn_cast<UsingShadowDecl>(Op))
1105 NotEqFD = UD->getUnderlyingDecl()->getAsFunction();
1118 return Op == OO_EqualEqual || Op == OO_Spaceship;
1126 if (Op == OverloadedOperatorKind::OO_EqualEqual) {
1127 assert(OriginalArgs.size() == 2);
1129 S,
OpLoc, OriginalArgs[1], FD))
1140void OverloadCandidateSet::destroyCandidates() {
1141 for (
iterator i = Candidates.begin(), e = Candidates.end(); i != e; ++i) {
1142 for (
auto &
C : i->Conversions)
1143 C.~ImplicitConversionSequence();
1145 i->DeductionFailure.Destroy();
1150 destroyCandidates();
1151 SlabAllocator.Reset();
1152 NumInlineBytesUsed = 0;
1156 FirstDeferredCandidate =
nullptr;
1157 DeferredCandidatesCount = 0;
1158 HasDeferredTemplateConstructors =
false;
1159 ResolutionByPerfectCandidateIsDisabled =
false;
1163 class UnbridgedCastsSet {
1173 Entry entry = { &E, E };
1174 Entries.push_back(entry);
1179 for (SmallVectorImpl<Entry>::iterator
1180 i = Entries.begin(), e = Entries.end(); i != e; ++i)
1181 *i->Addr = i->Saved;
1195 UnbridgedCastsSet *unbridgedCasts =
nullptr) {
1199 if (placeholder->getKind() == BuiltinType::Overload)
return false;
1203 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
1205 unbridgedCasts->save(S, E);
1225 UnbridgedCastsSet &unbridged) {
1226 for (
unsigned i = 0, e = Args.size(); i != e; ++i)
1235 bool NewIsUsingDecl) {
1240 bool OldIsUsingDecl =
false;
1242 OldIsUsingDecl =
true;
1246 if (NewIsUsingDecl)
continue;
1253 if ((OldIsUsingDecl || NewIsUsingDecl) && !
isVisible(*I))
1261 bool UseMemberUsingDeclRules =
1262 (OldIsUsingDecl || NewIsUsingDecl) &&
CurContext->isRecord() &&
1263 !
New->getFriendObjectKind();
1267 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
1273 !shouldLinkPossiblyHiddenDecl(*I,
New))
1292 }
else if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(OldD)) {
1299 if (UUD->getQualifier().isDependent() && !UUD->isCXXClassMember()) {
1327 if (
New->getFriendObjectKind() &&
New->getQualifier() &&
1328 !
New->getDescribedFunctionTemplate() &&
1329 !
New->getDependentSpecializationInfo() &&
1330 !
New->getType()->isDependentType()) {
1335 New->setInvalidDecl();
1347 assert(D &&
"function decl should not be null");
1348 if (
auto *A = D->
getAttr<AttrT>())
1349 return !A->isImplicit();
1355 bool UseMemberUsingDeclRules,
1356 bool ConsiderCudaAttrs,
1357 bool UseOverrideRules =
false) {
1363 if (
New->isMSVCRTEntryPoint())
1374 if ((OldTemplate ==
nullptr) != (NewTemplate ==
nullptr))
1397 if (OldQType != NewQType && OldType->isVariadic() != NewType->isVariadic())
1401 if ((
New->isMemberLikeConstrainedFriend() ||
1412 OldDecl = OldTemplate;
1413 NewDecl = NewTemplate;
1431 bool ConstraintsInTemplateHead =
1442 if (UseMemberUsingDeclRules && ConstraintsInTemplateHead &&
1443 !SameTemplateParameterList)
1445 if (!UseMemberUsingDeclRules &&
1446 (!SameTemplateParameterList || !SameReturnType))
1450 const auto *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1451 const auto *NewMethod = dyn_cast<CXXMethodDecl>(
New);
1453 int OldParamsOffset = 0;
1454 int NewParamsOffset = 0;
1462 if (ThisType.isConstQualified())
1482 BS.
Quals = NormalizeQualifiers(OldMethod, BS.
Quals);
1483 DS.Quals = NormalizeQualifiers(NewMethod, DS.Quals);
1485 if (OldMethod->isExplicitObjectMemberFunction()) {
1487 DS.Quals.removeVolatile();
1490 return BS.
Quals == DS.Quals;
1494 auto BS =
Base.getNonReferenceType().getCanonicalType().split();
1495 auto DS = D.getNonReferenceType().getCanonicalType().split();
1497 if (!AreQualifiersEqual(BS, DS))
1500 if (OldMethod->isImplicitObjectMemberFunction() &&
1501 OldMethod->getParent() != NewMethod->getParent()) {
1513 if (
Base->isLValueReferenceType())
1514 return D->isLValueReferenceType();
1515 return Base->isRValueReferenceType() == D->isRValueReferenceType();
1520 auto DiagnoseInconsistentRefQualifiers = [&]() {
1521 if (SemaRef.
LangOpts.CPlusPlus23 && !UseOverrideRules)
1523 if (OldMethod->getRefQualifier() == NewMethod->getRefQualifier())
1525 if (OldMethod->isExplicitObjectMemberFunction() ||
1526 NewMethod->isExplicitObjectMemberFunction())
1528 if (!UseMemberUsingDeclRules && (OldMethod->getRefQualifier() ==
RQ_None ||
1529 NewMethod->getRefQualifier() ==
RQ_None)) {
1530 SemaRef.
Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
1531 << NewMethod->getRefQualifier() << OldMethod->getRefQualifier();
1532 SemaRef.
Diag(OldMethod->getLocation(), diag::note_previous_declaration);
1541 bool ShouldDiagnoseInconsistentRefQualifiers =
false;
1542 bool HaveInconsistentQualifiers =
false;
1544 if (OldMethod && OldMethod->isExplicitObjectMemberFunction())
1546 if (NewMethod && NewMethod->isExplicitObjectMemberFunction())
1549 if (OldType->getNumParams() - OldParamsOffset !=
1550 NewType->getNumParams() - NewParamsOffset ||
1552 {OldType->param_type_begin() + OldParamsOffset,
1553 OldType->param_type_end()},
1554 {NewType->param_type_begin() + NewParamsOffset,
1555 NewType->param_type_end()},
1560 if (OldMethod && NewMethod && !OldMethod->isStatic() &&
1561 !NewMethod->isStatic()) {
1562 bool HaveCorrespondingObjectParameters = [&](
const CXXMethodDecl *Old,
1564 auto NewObjectType =
New->getFunctionObjectParameterReferenceType();
1568 return F->getRefQualifier() ==
RQ_None &&
1569 !F->isExplicitObjectMemberFunction();
1572 if (IsImplicitWithNoRefQual(Old) != IsImplicitWithNoRefQual(
New) &&
1573 CompareType(OldObjectType.getNonReferenceType(),
1574 NewObjectType.getNonReferenceType()))
1576 return CompareType(OldObjectType, NewObjectType);
1577 }(OldMethod, NewMethod);
1579 if (!HaveCorrespondingObjectParameters) {
1580 ShouldDiagnoseInconsistentRefQualifiers =
true;
1584 if (!UseOverrideRules || (!NewMethod->isExplicitObjectMemberFunction() &&
1585 !OldMethod->isExplicitObjectMemberFunction()))
1586 HaveInconsistentQualifiers =
true;
1590 if (NewMethod && OldMethod && OldMethod->isImplicitObjectMemberFunction() &&
1591 NewMethod->isImplicitObjectMemberFunction())
1592 ShouldDiagnoseInconsistentRefQualifiers =
true;
1594 if (!UseOverrideRules &&
1598 if (!NewRC != !OldRC)
1618 NewI =
New->specific_attr_begin<EnableIfAttr>(),
1619 NewE =
New->specific_attr_end<EnableIfAttr>(),
1622 NewI != NewE || OldI != OldE; ++NewI, ++OldI) {
1623 if (NewI == NewE || OldI == OldE)
1625 llvm::FoldingSetNodeID NewID, OldID;
1626 NewI->getCond()->Profile(NewID, SemaRef.
Context,
true);
1627 OldI->getCond()->Profile(OldID, SemaRef.
Context,
true);
1632 if ((ShouldDiagnoseInconsistentRefQualifiers &&
1633 DiagnoseInconsistentRefQualifiers()) ||
1634 HaveInconsistentQualifiers)
1638 if (SemaRef.
getLangOpts().CUDA && ConsiderCudaAttrs) {
1646 "Unexpected invalid target.");
1650 if (NewTarget != OldTarget) {
1653 if (OldMethod && NewMethod && OldMethod->isVirtual() &&
1654 OldMethod->isConstexpr() && !NewMethod->isConstexpr() &&
1672 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1678 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1691 bool SuppressUserConversions,
1693 bool InOverloadResolution,
1695 bool AllowObjCWritebackConversion,
1696 bool AllowObjCConversionOnExplicit) {
1699 if (SuppressUserConversions) {
1710 Conversions, AllowExplicit,
1711 AllowObjCConversionOnExplicit)) {
1732 bool FromListInit =
false;
1733 if (
const auto *InitList = dyn_cast<InitListExpr>(From);
1734 InitList && InitList->getNumInits() == 1 &&
1736 const Expr *SingleInit = InitList->getInit(0);
1737 FromType = SingleInit->
getType();
1739 FromListInit =
true;
1748 if ((FromCanon == ToCanon ||
1760 if (ToCanon != FromCanon)
1771 Cand != Conversions.
end(); ++Cand)
1812static ImplicitConversionSequence
1814 bool SuppressUserConversions,
1816 bool InOverloadResolution,
1818 bool AllowObjCWritebackConversion,
1819 bool AllowObjCConversionOnExplicit) {
1822 ICS.
Standard, CStyle, AllowObjCWritebackConversion)){
1873 bool CanConvert =
false;
1879 FromResType->getWrappedType()) &&
1881 FromResType->getContainedType()) &&
1882 ToResType->getAttrs() == FromResType->getAttrs())
1884 }
else if (ToTy->isHLSLResourceType()) {
1898 AllowExplicit, InOverloadResolution, CStyle,
1899 AllowObjCWritebackConversion,
1900 AllowObjCConversionOnExplicit);
1903ImplicitConversionSequence
1905 bool SuppressUserConversions,
1907 bool InOverloadResolution,
1909 bool AllowObjCWritebackConversion) {
1910 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1911 AllowExplicit, InOverloadResolution, CStyle,
1912 AllowObjCWritebackConversion,
1918 bool AllowExplicit) {
1923 bool AllowObjCWritebackConversion =
1930 *
this, From, ToType,
1932 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1934 false, AllowObjCWritebackConversion,
1948 if (
Context.hasSameUnqualifiedType(FromType, ToType))
1961 if (TyClass != CanFrom->getTypeClass())
return false;
1962 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1963 if (TyClass == Type::Pointer) {
1966 }
else if (TyClass == Type::BlockPointer) {
1969 }
else if (TyClass == Type::MemberPointer) {
1976 CanTo = ToMPT->getPointeeType();
1982 TyClass = CanTo->getTypeClass();
1983 if (TyClass != CanFrom->getTypeClass())
return false;
1984 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1994 bool Changed =
false;
2002 const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn);
2003 const auto *ToFPT = dyn_cast<FunctionProtoType>(ToFn);
2005 if (FromFPT && ToFPT) {
2006 if (FromFPT->hasCFIUncheckedCallee() != ToFPT->hasCFIUncheckedCallee()) {
2008 FromFPT->getReturnType(), FromFPT->getParamTypes(),
2009 FromFPT->getExtProtoInfo().withCFIUncheckedCallee(
2010 ToFPT->hasCFIUncheckedCallee()));
2018 if (FromFPT && ToFPT) {
2019 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
2031 bool CanUseToFPT, CanUseFromFPT;
2032 if (
Context.mergeExtParameterInfo(ToFPT, FromFPT, CanUseToFPT,
2033 CanUseFromFPT, NewParamInfos) &&
2034 CanUseToFPT && !CanUseFromFPT) {
2037 NewParamInfos.empty() ?
nullptr : NewParamInfos.data();
2039 FromFPT->getParamTypes(), ExtInfo);
2044 if (
Context.hasAnyFunctionEffects()) {
2049 const auto FromFX = FromFPT->getFunctionEffects();
2050 const auto ToFX = ToFPT->getFunctionEffects();
2051 if (FromFX != ToFX) {
2055 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
2065 assert(
QualType(FromFn, 0).isCanonical());
2066 if (
QualType(FromFn, 0) != CanTo)
return false;
2093 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
2094 &ToSem == &llvm::APFloat::IEEEquad()) ||
2095 (&FromSem == &llvm::APFloat::IEEEquad() &&
2096 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2152 bool InOverloadResolution,
bool CStyle) {
2162 if (ToMatrixType && FromMatrixType) {
2164 unsigned ToCols = ToMatrixType->getNumColumns();
2165 if (FromCols < ToCols)
2168 unsigned FromRows = FromMatrixType->
getNumRows();
2169 unsigned ToRows = ToMatrixType->getNumRows();
2170 if (FromRows < ToRows)
2173 if (FromRows == ToRows && FromCols == ToCols)
2179 QualType ToElTy = ToMatrixType->getElementType();
2188 QualType ToElTy = ToMatrixType->getElementType();
2191 if (FromMatrixType && !ToMatrixType) {
2210 bool InOverloadResolution,
bool CStyle) {
2227 if (ToExtType && FromExtType) {
2229 unsigned ToElts = ToExtType->getNumElements();
2230 if (FromElts < ToElts)
2232 if (FromElts == ToElts)
2238 QualType ToElTy = ToExtType->getElementType();
2243 if (FromExtType && !ToExtType) {
2257 if (ToExtType->getNumElements() != FromExtType->getNumElements())
2262 FromExtType->getElementType()->isIntegerType()) {
2274 QualType ToElTy = ToExtType->getElementType();
2309 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
2314 !InOverloadResolution && !CStyle) {
2316 << FromType << ToType;
2327 bool InOverloadResolution,
2328 StandardConversionSequence &SCS,
2333 bool InOverloadResolution,
2334 StandardConversionSequence &SCS,
2346 bool InOverloadResolution,
2349 bool AllowObjCWritebackConversion) {
2375 FromType = Fn->getType();
2395 if (Method && !Method->isStatic() &&
2396 !Method->isExplicitObjectMemberFunction()) {
2398 "Non-unary operator on non-static member address");
2401 "Non-address-of operator on non-static member address");
2403 FromType, std::nullopt, Method->getParent());
2407 "Non-address-of operator for overloaded function expression");
2453 FromType =
Atomic->getValueType();
2488 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2508 bool IncompatibleObjC =
false;
2570 }
else if (AllowObjCWritebackConversion &&
2574 FromType, IncompatibleObjC)) {
2580 InOverloadResolution, FromType)) {
2584 From, InOverloadResolution, CStyle)) {
2589 From, InOverloadResolution, CStyle)) {
2599 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2608 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2638 bool ObjCLifetimeConversion;
2644 ObjCLifetimeConversion)) {
2663 CanonFrom = CanonTo;
2668 if (CanonFrom == CanonTo)
2673 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2685 case AssignConvertType::
2686 CompatibleVoidPtrToNonVoidPtr:
2719 bool InOverloadResolution,
2728 if (!UD->
hasAttr<TransparentUnionAttr>())
2731 for (
const auto *it : UD->
fields()) {
2734 ToType = it->getType();
2760 return To->
getKind() == BuiltinType::Int;
2763 return To->
getKind() == BuiltinType::UInt;
2787 if (FromED->isScoped())
2794 if (FromED->isFixed()) {
2795 QualType Underlying = FromED->getIntegerType();
2796 return Context.hasSameUnqualifiedType(Underlying, ToType) ||
2803 return Context.hasSameUnqualifiedType(ToType, FromED->getPromotionType());
2828 uint64_t FromSize =
Context.getTypeSize(FromType);
2837 for (
int Idx = 0; Idx < 6; ++Idx) {
2838 uint64_t ToSize =
Context.getTypeSize(PromoteTypes[Idx]);
2839 if (FromSize < ToSize ||
2840 (FromSize == ToSize &&
2841 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2845 return Context.hasSameUnqualifiedType(ToType, PromoteTypes[Idx]);
2866 std::optional<llvm::APSInt> BitWidth;
2869 MemberDecl->getBitWidth()->getIntegerConstantExpr(
Context))) {
2870 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2871 ToSize =
Context.getTypeSize(ToType);
2874 if (*BitWidth < ToSize ||
2876 return To->
getKind() == BuiltinType::Int;
2882 return To->
getKind() == BuiltinType::UInt;
2900 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2910 if (FromBuiltin->getKind() == BuiltinType::Float &&
2911 ToBuiltin->getKind() == BuiltinType::Double)
2918 (FromBuiltin->getKind() == BuiltinType::Float ||
2919 FromBuiltin->getKind() == BuiltinType::Double) &&
2920 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2921 ToBuiltin->getKind() == BuiltinType::Float128 ||
2922 ToBuiltin->getKind() == BuiltinType::Ibm128))
2927 if (
getLangOpts().
HLSL && FromBuiltin->getKind() == BuiltinType::Half &&
2928 (ToBuiltin->getKind() == BuiltinType::Float ||
2929 ToBuiltin->getKind() == BuiltinType::Double))
2934 FromBuiltin->getKind() == BuiltinType::Half &&
2935 ToBuiltin->getKind() == BuiltinType::Float)
2964 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2976 if (
const EnumType *ToEnumType = ToType->
getAs<EnumType>()) {
2988 return Context.getTypeSize(FromType) >
Context.getTypeSize(ToType);
3003 bool StripObjCLifetime =
false) {
3006 "Invalid similarly-qualified pointer type");
3017 if (StripObjCLifetime)
3029 return Context.getObjCObjectPointerType(ToPointee);
3030 return Context.getPointerType(ToPointee);
3038 return Context.getObjCObjectPointerType(QualifiedCanonToPointee);
3039 return Context.getPointerType(QualifiedCanonToPointee);
3043 bool InOverloadResolution,
3049 return !InOverloadResolution;
3057 bool InOverloadResolution,
3059 bool &IncompatibleObjC) {
3060 IncompatibleObjC =
false;
3068 ConvertedType = ToType;
3075 ConvertedType = ToType;
3082 ConvertedType = ToType;
3090 ConvertedType = ToType;
3100 ConvertedType = ToType;
3122 if (
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType))
3149 Context.typesAreCompatible(FromPointeeType, ToPointeeType)) {
3171 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType) &&
3180 Context.areCompatibleVectorTypes(FromPointeeType, ToPointeeType)) {
3199 return Context.getQualifiedType(
T, Qs);
3201 return Context.getQualifiedType(
T.getUnqualifiedType(), Qs);
3206 bool &IncompatibleObjC) {
3219 if (ToObjCPtr && FromObjCPtr) {
3227 if (
Context.canAssignObjCInterfaces(ToObjCPtr, FromObjCPtr)) {
3241 if (
Context.canAssignObjCInterfaces(FromObjCPtr, ToObjCPtr)) {
3245 IncompatibleObjC =
true;
3261 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
3290 IncompatibleObjC)) {
3292 IncompatibleObjC =
true;
3293 ConvertedType =
Context.getPointerType(ConvertedType);
3302 IncompatibleObjC)) {
3304 ConvertedType =
Context.getPointerType(ConvertedType);
3317 if (FromFunctionType && ToFunctionType) {
3320 if (
Context.getCanonicalType(FromPointeeType)
3321 ==
Context.getCanonicalType(ToPointeeType))
3326 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3327 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
3328 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
3331 bool HasObjCConversion =
false;
3333 Context.getCanonicalType(ToFunctionType->getReturnType())) {
3336 ToFunctionType->getReturnType(),
3337 ConvertedType, IncompatibleObjC)) {
3339 HasObjCConversion =
true;
3346 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3347 ArgIdx != NumArgs; ++ArgIdx) {
3349 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3350 if (
Context.getCanonicalType(FromArgType)
3351 ==
Context.getCanonicalType(ToArgType)) {
3354 ConvertedType, IncompatibleObjC)) {
3356 HasObjCConversion =
true;
3363 if (HasObjCConversion) {
3367 IncompatibleObjC =
true;
3399 if (!FromFunctionType || !ToFunctionType)
3402 if (
Context.hasSameType(FromPointeeType, ToPointeeType))
3407 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3408 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3413 if (FromEInfo != ToEInfo)
3416 bool IncompatibleObjC =
false;
3418 ToFunctionType->getReturnType())) {
3422 QualType LHS = ToFunctionType->getReturnType();
3427 if (
Context.hasSameType(RHS,LHS)) {
3430 ConvertedType, IncompatibleObjC)) {
3431 if (IncompatibleObjC)
3440 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3441 ArgIdx != NumArgs; ++ArgIdx) {
3442 IncompatibleObjC =
false;
3444 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3445 if (
Context.hasSameType(FromArgType, ToArgType)) {
3448 ConvertedType, IncompatibleObjC)) {
3449 if (IncompatibleObjC)
3458 bool CanUseToFPT, CanUseFromFPT;
3459 if (!
Context.mergeExtParameterInfo(ToFunctionType, FromFunctionType,
3460 CanUseToFPT, CanUseFromFPT,
3464 ConvertedType = ToType;
3503 ToMember->getMostRecentCXXRecordDecl())) {
3505 if (ToMember->isSugared())
3507 ToMember->getMostRecentCXXRecordDecl());
3509 PDiag << ToMember->getQualifier();
3510 if (FromMember->isSugared())
3512 FromMember->getMostRecentCXXRecordDecl());
3514 PDiag << FromMember->getQualifier();
3532 !FromType->
getAs<TemplateSpecializationType>()) {
3538 if (
Context.hasSameType(FromType, ToType)) {
3547 if (!FromFunction || !ToFunction) {
3552 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3562 << ToFunction->getParamType(ArgPos)
3569 ToFunction->getReturnType())) {
3575 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3598 assert(llvm::size(Old) == llvm::size(
New) &&
3599 "Can't compare parameters of functions with different number of "
3602 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3604 size_t J =
Reversed ? (llvm::size(
New) - Idx - 1) : Idx;
3609 Context.removePtrSizeAddrSpace(
Type.getUnqualifiedType());
3611 Context.removePtrSizeAddrSpace((
New.begin() + J)->getUnqualifiedType());
3613 if (!
Context.hasSameType(OldType, NewType)) {
3638 unsigned OldIgnore =
3640 unsigned NewIgnore =
3647 NewPT->param_types().slice(NewIgnore),
3654 bool IgnoreBaseAccess,
3657 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3666 PDiag(diag::warn_impcast_bool_to_null_pointer)
3677 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3678 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {
3681 unsigned InaccessibleID = 0;
3682 unsigned AmbiguousID = 0;
3684 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3685 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3688 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3690 &BasePath, IgnoreBaseAccess))
3694 Kind = CK_DerivedToBase;
3697 if (
Diagnose && !IsCStyleOrFunctionalCast &&
3698 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3700 "this should only be possible with MSVCCompat!");
3712 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3715 Kind = CK_BlockPointerToObjCPointerCast;
3717 Kind = CK_CPointerToObjCPointerCast;
3721 Kind = CK_AnyPointerToBlockPointerCast;
3727 Kind = CK_NullToPointer;
3734 bool InOverloadResolution,
3744 ConvertedType = ToType;
3760 ConvertedType =
Context.getMemberPointerType(
3774 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
3782 Kind = CK_NullToMemberPointer;
3800 PD <<
Context.getCanonicalTagType(Cls);
3810 std::swap(
Base, Derived);
3819 PD <<
int(Direction);
3827 DiagFromTo(PD) <<
QualType(VBase, 0) << OpRange;
3835 ? CK_DerivedToBaseMemberPointer
3836 : CK_BaseToDerivedMemberPointer;
3838 if (!IgnoreBaseAccess)
3842 ? diag::err_upcast_to_inaccessible_base
3843 : diag::err_downcast_from_inaccessible_base,
3845 NestedNameSpecifier BaseQual = FromPtrType->getQualifier(),
3846 DerivedQual = ToPtrType->getQualifier();
3847 if (Direction == MemberPointerConversionDirection::Upcast)
3848 std::swap(BaseQual, DerivedQual);
3849 DiagCls(PD, DerivedQual, Derived);
3850 DiagCls(PD, BaseQual, Base);
3885 bool CStyle,
bool IsTopLevel,
3886 bool &PreviousToQualsIncludeConst,
3887 bool &ObjCLifetimeConversion,
3900 ObjCLifetimeConversion =
true;
3940 !PreviousToQualsIncludeConst)
3958 PreviousToQualsIncludeConst =
3959 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3965 bool CStyle,
bool &ObjCLifetimeConversion) {
3966 FromType =
Context.getCanonicalType(FromType);
3967 ToType =
Context.getCanonicalType(ToType);
3968 ObjCLifetimeConversion =
false;
3978 bool PreviousToQualsIncludeConst =
true;
3979 bool UnwrappedAnyPointer =
false;
3980 while (
Context.UnwrapSimilarTypes(FromType, ToType)) {
3982 !UnwrappedAnyPointer,
3983 PreviousToQualsIncludeConst,
3986 UnwrappedAnyPointer =
true;
3994 return UnwrappedAnyPointer &&
Context.hasSameUnqualifiedType(FromType,ToType);
4003 bool InOverloadResolution,
4012 InOverloadResolution, InnerSCS,
4027 bool InOverloadResolution,
4030 const OverflowBehaviorType *ToOBT = ToType->
getAs<OverflowBehaviorType>();
4041 InOverloadResolution, InnerSCS, CStyle,
4058 if (CtorType->getNumParams() > 0) {
4059 QualType FirstArg = CtorType->getParamType(0);
4071 bool AllowExplicit) {
4078 bool Usable = !Info.Constructor->isInvalidDecl() &&
4081 bool SuppressUserConversions =
false;
4082 if (Info.ConstructorTmpl)
4085 CandidateSet, SuppressUserConversions,
4090 CandidateSet, SuppressUserConversions,
4091 false, AllowExplicit);
4095 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4122 llvm_unreachable(
"Invalid OverloadResult!");
4144 bool AllowObjCConversionOnExplicit) {
4145 assert(AllowExplicit != AllowedExplicit::None ||
4146 !AllowObjCConversionOnExplicit);
4150 bool ConstructorsOnly =
false;
4154 if (
const RecordType *ToRecordType = ToType->
getAsCanonical<RecordType>()) {
4166 ConstructorsOnly =
true;
4170 }
else if (
auto *ToRecordDecl =
4171 dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
4172 ToRecordDecl = ToRecordDecl->getDefinitionOrSelf();
4174 Expr **Args = &From;
4175 unsigned NumArgs = 1;
4176 bool ListInitializing =
false;
4177 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
4180 S, From, ToType, ToRecordDecl, User, CandidateSet,
4181 AllowExplicit == AllowedExplicit::All);
4190 Args = InitList->getInits();
4191 NumArgs = InitList->getNumInits();
4192 ListInitializing =
true;
4200 bool Usable = !Info.Constructor->isInvalidDecl();
4201 if (!ListInitializing)
4202 Usable = Usable && Info.Constructor->isConvertingConstructor(
4205 bool SuppressUserConversions = !ConstructorsOnly;
4213 if (SuppressUserConversions && ListInitializing) {
4214 SuppressUserConversions =
4219 if (Info.ConstructorTmpl)
4221 Info.ConstructorTmpl, Info.FoundDecl,
4223 CandidateSet, SuppressUserConversions,
4225 AllowExplicit == AllowedExplicit::All);
4231 SuppressUserConversions,
4233 AllowExplicit == AllowedExplicit::All);
4243 }
else if (
const RecordType *FromRecordType =
4245 if (
auto *FromRecordDecl =
4246 dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
4247 FromRecordDecl = FromRecordDecl->getDefinitionOrSelf();
4249 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
4250 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4259 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)))
4266 ConvTemplate, FoundDecl, ActingContext, From, ToType,
4267 CandidateSet, AllowObjCConversionOnExplicit,
4268 AllowExplicit != AllowedExplicit::None);
4271 CandidateSet, AllowObjCConversionOnExplicit,
4272 AllowExplicit != AllowedExplicit::None);
4277 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4286 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
4298 if (Best->Conversions[0].isEllipsis())
4301 User.
Before = Best->Conversions[0].Standard;
4314 = dyn_cast<CXXConversionDecl>(Best->Function)) {
4316 assert(Best->HasFinalConversion);
4324 User.
Before = Best->Conversions[0].Standard;
4339 User.
After = Best->FinalConversion;
4342 llvm_unreachable(
"Not a constructor or conversion function?");
4351 llvm_unreachable(
"Invalid OverloadResult!");
4361 CandidateSet, AllowedExplicit::None,
false);
4376 diag::err_typecheck_nonviable_condition_incomplete,
4383 *
this, From, Cands);
4409 if (!Conv1 || !Conv2)
4424 if (Block1 != Block2)
4437 if (Conv1FuncRet && Conv2FuncRet &&
4448 CallOpProto->isVariadic(),
false);
4450 CallOpProto->isVariadic(),
true);
4452 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4547 if (!ICS1.
isBad()) {
4548 bool StdInit1 =
false, StdInit2 =
false;
4555 if (StdInit1 != StdInit2)
4566 CAT2->getElementType())) {
4568 if (CAT1->getSize() != CAT2->getSize())
4570 return CAT1->getSize().ult(CAT2->getSize())
4605 if (ConvFunc1 == ConvFunc2)
4707 if (!
Enum->isFixed())
4743 else if (Rank2 < Rank1)
4778 bool SCS1ConvertsToVoid
4780 bool SCS2ConvertsToVoid
4782 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4787 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4793 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4822 if (FromObjCPtr1 && FromObjCPtr2) {
4827 if (AssignLeft != AssignRight) {
4866 if (UnqualT1 == UnqualT2) {
4928 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4929 return SCS1IsCompatibleVectorConversion
4936 bool SCS1IsCompatibleSVEVectorConversion =
4938 bool SCS2IsCompatibleSVEVectorConversion =
4941 if (SCS1IsCompatibleSVEVectorConversion !=
4942 SCS2IsCompatibleSVEVectorConversion)
4943 return SCS1IsCompatibleSVEVectorConversion
4950 bool SCS1IsCompatibleRVVVectorConversion =
4952 bool SCS2IsCompatibleRVVVectorConversion =
4955 if (SCS1IsCompatibleRVVVectorConversion !=
4956 SCS2IsCompatibleRVVVectorConversion)
4957 return SCS1IsCompatibleRVVVectorConversion
5016 if (UnqualT1 == UnqualT2)
5034 bool ObjCLifetimeConversion;
5044 if (CanPick1 != CanPick2)
5098 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5106 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
5123 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
5130 bool FromAssignRight
5139 if (ToPtr1->isObjCIdType() &&
5140 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
5142 if (ToPtr2->isObjCIdType() &&
5143 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
5148 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
5150 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
5155 if (ToPtr1->isObjCClassType() &&
5156 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
5158 if (ToPtr2->isObjCClassType() &&
5159 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
5164 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
5166 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
5172 (ToAssignLeft != ToAssignRight)) {
5183 }
else if (IsSecondSame)
5192 (FromAssignLeft != FromAssignRight))
5206 CXXRecordDecl *FromPointee1 = FromMemPointer1->getMostRecentCXXRecordDecl();
5211 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5218 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
5256 if (!
T.getQualifiers().hasUnaligned())
5270 "T1 must be the pointee type of the reference type");
5271 assert(!OrigT2->
isReferenceType() &&
"T2 cannot be a reference type");
5294 if (UnqualT1 == UnqualT2) {
5298 Conv |= ReferenceConversions::DerivedToBase;
5301 Context.canBindObjCObjectType(UnqualT1, UnqualT2))
5302 Conv |= ReferenceConversions::ObjC;
5305 Conv |= ReferenceConversions::Function;
5309 bool ConvertedReferent = Conv != 0;
5313 bool PreviousToQualsIncludeConst =
true;
5314 bool TopLevel =
true;
5320 Conv |= ReferenceConversions::Qualification;
5326 Conv |= ReferenceConversions::NestedQualification;
5334 bool ObjCLifetimeConversion =
false;
5336 PreviousToQualsIncludeConst,
5338 return (ConvertedReferent ||
Context.hasSimilarType(T1, T2))
5343 if (ObjCLifetimeConversion)
5344 Conv |= ReferenceConversions::ObjCLifetime;
5347 }
while (
Context.UnwrapSimilarTypes(T1, T2));
5352 return (ConvertedReferent ||
Context.hasSameUnqualifiedType(T1, T2))
5363 bool AllowExplicit) {
5364 assert(T2->
isRecordType() &&
"Can only find conversions of record types.");
5368 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5369 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5376 = dyn_cast<FunctionTemplateDecl>(D);
5393 if (!ConvTemplate &&
5417 ConvTemplate, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5418 false, AllowExplicit);
5421 Conv, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5422 false, AllowExplicit);
5425 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5431 assert(Best->HasFinalConversion);
5443 if (!Best->FinalConversion.DirectBinding)
5455 "Expected a direct reference binding!");
5461 Cand != CandidateSet.
end(); ++Cand)
5473 llvm_unreachable(
"Invalid OverloadResult!");
5478static ImplicitConversionSequence
5481 bool SuppressUserConversions,
5482 bool AllowExplicit) {
5483 assert(DeclType->
isReferenceType() &&
"Reference init needs a reference");
5510 auto SetAsReferenceBinding = [&](
bool BindsDirectly) {
5515 ICS.
Standard.
Second = (RefConv & Sema::ReferenceConversions::DerivedToBase)
5517 : (RefConv & Sema::ReferenceConversions::ObjC)
5525 Sema::ReferenceConversions::NestedQualification)
5539 (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0;
5563 SetAsReferenceBinding(
true);
5612 SetAsReferenceBinding(S.
getLangOpts().CPlusPlus11 ||
5703 AllowedExplicit::None,
5728 if (isRValRef && LValRefType) {
5745static ImplicitConversionSequence
5747 bool SuppressUserConversions,
5748 bool InOverloadResolution,
5749 bool AllowObjCWritebackConversion,
5750 bool AllowExplicit =
false);
5754static ImplicitConversionSequence
5756 bool SuppressUserConversions,
5757 bool InOverloadResolution,
5758 bool AllowObjCWritebackConversion) {
5771 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT))
5773 InitTy = IAT->getElementType();
5799 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5805 SuppressUserConversions,
5806 InOverloadResolution,
5807 AllowObjCWritebackConversion);
5816 Result.Standard.setAsIdentityConversion();
5817 Result.Standard.setFromType(ToType);
5818 Result.Standard.setAllToTypes(ToType);
5843 bool IsUnbounded =
false;
5847 if (CT->getSize().ult(e)) {
5851 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5854 if (CT->getSize().ugt(e)) {
5860 S, &EmptyList, InitTy, SuppressUserConversions,
5861 InOverloadResolution, AllowObjCWritebackConversion);
5862 if (DfltElt.
isBad()) {
5866 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5877 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5887 Result.Standard.setAsIdentityConversion();
5888 Result.Standard.setFromType(InitTy);
5889 Result.Standard.setAllToTypes(InitTy);
5890 for (
unsigned i = 0; i < e; ++i) {
5893 S,
Init, InitTy, SuppressUserConversions, InOverloadResolution,
5894 AllowObjCWritebackConversion);
5905 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5919 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5933 AllowedExplicit::None,
5934 InOverloadResolution,
false,
5935 AllowObjCWritebackConversion,
5954 Result.UserDefined.Before.setAsIdentityConversion();
5959 Result.UserDefined.After.setAsIdentityConversion();
5960 Result.UserDefined.After.setFromType(ToType);
5961 Result.UserDefined.After.setAllToTypes(ToType);
5962 Result.UserDefined.ConversionFunction =
nullptr;
5979 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
6000 SuppressUserConversions,
6008 InOverloadResolution,
6009 AllowObjCWritebackConversion);
6012 assert(!
Result.isEllipsis() &&
6013 "Sub-initialization cannot result in ellipsis conversion.");
6019 Result.UserDefined.After;
6047 S, From->
getInit(0), ToType, SuppressUserConversions,
6048 InOverloadResolution, AllowObjCWritebackConversion);
6050 Result.Standard.FromBracedInitList =
true;
6054 else if (NumInits == 0) {
6056 Result.Standard.setAsIdentityConversion();
6057 Result.Standard.setFromType(ToType);
6058 Result.Standard.setAllToTypes(ToType);
6075static ImplicitConversionSequence
6077 bool SuppressUserConversions,
6078 bool InOverloadResolution,
6079 bool AllowObjCWritebackConversion,
6080 bool AllowExplicit) {
6081 if (
InitListExpr *FromInitList = dyn_cast<InitListExpr>(From))
6083 InOverloadResolution,AllowObjCWritebackConversion);
6088 SuppressUserConversions, AllowExplicit);
6091 SuppressUserConversions,
6092 AllowedExplicit::None,
6093 InOverloadResolution,
6095 AllowObjCWritebackConversion,
6108 return !ICS.
isBad();
6117 const CXXRecordDecl *ActingContext,
bool InOverloadResolution =
false,
6119 bool SuppressUserConversion =
false) {
6127 assert(FromClassification.
isLValue());
6138 if (Method->isExplicitObjectMemberFunction()) {
6139 if (ExplicitParameterType.isNull())
6140 ExplicitParameterType = Method->getFunctionObjectParameterReferenceType();
6142 ValueKindFromClassification(FromClassification));
6144 S, &TmpExpr, ExplicitParameterType, SuppressUserConversion,
6161 Qualifiers Quals = Method->getMethodQualifiers();
6199 FromType, ImplicitParamType);
6209 FromType, ImplicitParamType);
6222 }
else if (!Method->isExplicitObjectMemberFunction()) {
6224 FromType, ImplicitParamType);
6229 switch (Method->getRefQualifier()) {
6244 if (!FromClassification.
isRValue()) {
6266 = (Method->getRefQualifier() ==
RQ_None);
6277 QualType ImplicitParamRecordType =
Method->getFunctionObjectParameterType();
6290 DestType =
Method->getThisType();
6293 FromRecordType = From->
getType();
6294 DestType = ImplicitParamRecordType;
6302 Method->getRefQualifier() !=
6320 <<
Method->getDeclName() << FromRecordType << (CVR - 1)
6322 Diag(
Method->getLocation(), diag::note_previous_decl)
6323 <<
Method->getDeclName();
6331 bool IsRValueQualified =
6335 << IsRValueQualified;
6336 Diag(
Method->getLocation(), diag::note_previous_decl)
6337 <<
Method->getDeclName();
6347 llvm_unreachable(
"Lists are not objects");
6350 return Diag(From->
getBeginLoc(), diag::err_member_function_call_bad_type)
6351 << ImplicitParamRecordType << FromRecordType
6360 From = FromRes.
get();
6369 CK = CK_AddressSpaceConversion;
6394 AllowedExplicit::Conversions,
6405 return AMDGPU().ExpandAMDGPUPredicateBuiltIn(From);
6478 llvm_unreachable(
"found a first conversion kind in Second");
6482 llvm_unreachable(
"found a third conversion kind in Second");
6488 llvm_unreachable(
"unknown conversion kind");
6498 [[maybe_unused]]
bool isCCEAllowedPreCXX11 =
6500 assert((S.
getLangOpts().CPlusPlus11 || isCCEAllowedPreCXX11) &&
6501 "converted constant expression outside C++11 or TTP matching");
6536 if (
T->isRecordType())
6545 diag::err_typecheck_converted_constant_expression)
6551 llvm_unreachable(
"bad conversion in converted constant expression");
6557 diag::err_typecheck_converted_constant_expression_disallowed)
6563 diag::err_typecheck_converted_constant_expression_indirect)
6573 diag::err_reference_bind_to_bitfield_in_cce)
6581 bool IsTemplateArgument =
6583 if (
T->isRecordType()) {
6584 assert(IsTemplateArgument &&
6585 "unexpected class type converted constant expr");
6601 IsTemplateArgument);
6608 bool ReturnPreNarrowingValue =
false;
6611 S.
Context,
Result.get(), PreNarrowingValue, PreNarrowingType,
6612 false, AllowRelaxedEval)) {
6622 PreNarrowingValue.
isInt()) {
6625 ReturnPreNarrowingValue =
true;
6651 << CCE << 0 << From->
getType() <<
T;
6656 if (!ReturnPreNarrowingValue)
6657 PreNarrowingValue = {};
6673 if (
Result.isInvalid() ||
Result.get()->isValueDependent()) {
6678 RequireInt, PreNarrowingValue);
6685 return ::BuildConvertedConstantExpression(*
this, From,
T, CCE, Dest,
6692 return ::CheckConvertedConstantExpression(*
this, From,
T,
Value, CCE,
false,
6697 llvm::APSInt &
Value,
6699 assert(
T->isIntegralOrEnumerationType() &&
"unexpected converted const type");
6704 if (!R.isInvalid() && !R.get()->isValueDependent())
6712 const APValue &PreNarrowingValue) {
6726 Kind = ConstantExprKind::ClassTemplateArgument;
6728 Kind = ConstantExprKind::NonClassTemplateArgument;
6730 Kind = ConstantExprKind::Normal;
6733 (RequireInt && !Eval.
Val.
isInt())) {
6742 if (Notes.empty() && !CantFold) {
6743 for (
auto &Info : MSWarning)
6744 Diag(Info.first, Info.second);
6747 if (
const auto *CE = dyn_cast<ConstantExpr>(E)) {
6751 "ConstantExpr has no value associated with it");
6757 Value = std::move(PreNarrowingValue);
6763 if (Notes.size() == 1 &&
6764 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6765 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6766 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6767 diag::note_constexpr_invalid_template_arg) {
6768 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6769 for (
unsigned I = 0; I < Notes.size(); ++I)
6770 Diag(Notes[I].first, Notes[I].second);
6774 for (
unsigned I = 0; I < Notes.size(); ++I)
6775 Diag(Notes[I].first, Notes[I].second);
6794static ImplicitConversionSequence
6802 AllowedExplicit::Conversions,
6844 "expected a member expression");
6846 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6847 M && !M->isImplicitAccess())
6848 Base = M->getBase();
6849 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6850 M && !M->isImplicitAccess())
6851 Base = M->getBase();
6855 if (
T->isPointerType())
6856 T =
T->getPointeeType();
6884 assert(Method->isExplicitObjectMemberFunction() &&
6885 "Method is not an explicit member function");
6886 assert(NewArgs.empty() &&
"NewArgs should be empty");
6888 NewArgs.reserve(Args.size() + 1);
6890 NewArgs.push_back(
This);
6891 NewArgs.append(Args.begin(), Args.end());
6894 Method,
Object->getBeginLoc());
6900 return AllowScopedEnumerations ?
T->isIntegralOrEnumerationType()
6901 :
T->isIntegralOrUnscopedEnumerationType();
6913 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6927 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6935 std::string TypeStr;
6940 "static_cast<" + TypeStr +
">(")
6952 HadMultipleCandidates);
6959 From,
Result.get()->getType());
6985 HadMultipleCandidates);
6990 CK_UserDefinedConversion,
Result.get(),
6991 nullptr,
Result.get()->getValueKind(),
7016 if (
auto *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)) {
7018 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
7024 Conv, FoundDecl, ActingContext, From, ToType, CandidateSet,
7058 From = result.
get();
7064 From = Converted.
isUsable() ? Converted.
get() :
nullptr;
7073 const RecordType *RecordTy =
T->getAsCanonical<RecordType>();
7086 : Converter(Converter), From(From) {}
7091 } IncompleteDiagnoser(Converter, From);
7102 ->getDefinitionOrSelf()
7103 ->getVisibleConversionFunctions();
7105 bool HadMultipleCandidates =
7110 bool HasUniqueTargetType =
true;
7126 "Conversion operator templates are considered potentially "
7130 if (Converter.
match(CurToType) || ConvTemplate) {
7136 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
7141 else if (HasUniqueTargetType &&
7143 HasUniqueTargetType =
false;
7145 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
7163 HadMultipleCandidates,
7164 ExplicitConversions))
7170 if (!HasUniqueTargetType)
7189 HadMultipleCandidates,
Found))
7198 HadMultipleCandidates,
7199 ExplicitConversions))
7207 switch (ViableConversions.
size()) {
7210 HadMultipleCandidates,
7211 ExplicitConversions))
7221 HadMultipleCandidates,
Found))
7252 if (Proto->getNumParams() < 1)
7256 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
7257 if (Context.hasSameUnqualifiedType(T1, ArgType))
7261 if (Proto->getNumParams() < 2)
7265 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
7266 if (Context.hasSameUnqualifiedType(T2, ArgType))
7285 unsigned SeenAt = 0;
7287 bool HasDefault =
false;
7296 return HasDefault || SeenAt != 0;
7302 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
7305 bool StrictPackMatch) {
7308 assert(Proto &&
"Functions without a prototype cannot be overloaded");
7309 assert(!
Function->getDescribedFunctionTemplate() &&
7310 "Use AddTemplateOverloadCandidate for function templates");
7323 CandidateSet, SuppressUserConversions,
7324 PartialOverloading, EarlyConversions, PO,
7360 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
7374 Candidate.
Viable =
false;
7387 bool IsImplicitlyInstantiated =
false;
7388 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo()) {
7389 ND = SpecInfo->getTemplate();
7390 IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() ==
7401 const bool IsInlineFunctionInGMF =
7403 (IsImplicitlyInstantiated ||
Function->isInlined());
7408 const bool IsCurrentUnitGMFDecl =
7409 Function->isFromGlobalModule() && CurrentModule &&
7410 Function->getOwningModule()->getTopLevelModule() ==
7414 !IsCurrentUnitGMFDecl) {
7415 Candidate.
Viable =
false;
7422 Candidate.
Viable =
false;
7433 if (Args.size() == 1 &&
Constructor->isSpecializationCopyingObject() &&
7434 (
Context.hasSameUnqualifiedType(ClassType, Args[0]->getType()) ||
7437 Candidate.
Viable =
false;
7449 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.
getDecl());
7450 if (Shadow && Args.size() == 1 &&
Constructor->getNumParams() >= 1 &&
7451 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
7458 Candidate.
Viable =
false;
7467 Constructor->getMethodQualifiers().getAddressSpace(),
7469 Candidate.
Viable =
false;
7482 Candidate.
Viable =
false;
7492 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7493 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7494 !PartialOverloading) {
7496 Candidate.
Viable =
false;
7510 Candidate.
Viable =
false;
7516 if (
Function->getTrailingRequiresClause()) {
7521 Candidate.
Viable =
false;
7530 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7533 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7536 }
else if (ArgIdx < NumParams) {
7547 Args[ArgIdx]->
getType().getAddressSpace() ==
7549 Diag(Args[ArgIdx]->getBeginLoc(), diag::warn_hlsl_groupshared_inout);
7552 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7555 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7557 Candidate.
Viable =
false;
7569 if (EnableIfAttr *FailedAttr =
7571 Candidate.
Viable =
false;
7581 if (Methods.size() <= 1)
7584 for (
unsigned b = 0, e = Methods.size(); b < e; b++) {
7590 if (
Method->param_size() > NumNamedArgs)
7591 NumNamedArgs =
Method->param_size();
7592 if (Args.size() < NumNamedArgs)
7595 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7597 if (Args[i]->isTypeDependent()) {
7603 Expr *argExpr = Args[i];
7604 assert(argExpr &&
"SelectBestMethod(): missing expression");
7609 !param->
hasAttr<CFConsumedAttr>())
7610 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7627 if (ConversionState.
isBad() ||
7637 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7638 if (Args[i]->isTypeDependent()) {
7651 if (Args.size() != NumNamedArgs)
7653 else if (
Match && NumNamedArgs == 0 && Methods.size() > 1) {
7656 for (
unsigned b = 0, e = Methods.size(); b < e; b++) {
7657 QualType ReturnT = Methods[b]->getReturnType();
7677 "Shouldn't have `this` for ctors!");
7678 assert(!Method->isStatic() &&
"Shouldn't have `this` for static methods!");
7680 ThisArg, std::nullopt, Method, Method);
7683 ConvertedThis = R.get();
7685 if (
auto *MD = dyn_cast<CXXMethodDecl>(Function)) {
7687 assert((MissingImplicitThis || MD->isStatic() ||
7689 "Expected `this` for non-ctor instance methods");
7691 ConvertedThis =
nullptr;
7696 unsigned ArgSizeNoVarargs = std::min(Function->param_size(), Args.size());
7699 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7702 S.
Context, Function->getParamDecl(I)),
7708 ConvertedArgs.push_back(R.get());
7715 if (!Function->isVariadic() && Args.size() < Function->getNumParams()) {
7716 for (
unsigned i = Args.size(), e = Function->getNumParams(); i != e; ++i) {
7723 ConvertedArgs.push_back(R.get());
7735 bool MissingImplicitThis) {
7736 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7737 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7743 llvm::scope_exit UndelayDiags(
7745 DelayedDiagnostics.popUndelayed(CurrentState);
7749 Expr *DiscardedThis;
7751 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7752 true, DiscardedThis, ConvertedArgs))
7753 return *EnableIfAttrs.begin();
7755 for (
auto *EIA : EnableIfAttrs) {
7759 if (EIA->getCond()->isValueDependent() ||
7760 !EIA->getCond()->EvaluateWithSubstitution(
7764 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7770template <
typename CheckFn>
7773 CheckFn &&IsSuccessful) {
7776 if (ArgDependent == DIA->getArgDependent())
7777 Attrs.push_back(DIA);
7784 auto WarningBegin = std::stable_partition(
7785 Attrs.begin(), Attrs.end(), [](
const DiagnoseIfAttr *DIA) {
7786 return DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_error &&
7787 DIA->getWarningGroup().empty();
7792 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7794 if (ErrAttr != WarningBegin) {
7795 const DiagnoseIfAttr *DIA = *ErrAttr;
7796 S.
Diag(Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7797 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7798 << DIA->getParent() << DIA->getCond()->getSourceRange();
7802 auto ToSeverity = [](DiagnoseIfAttr::DefaultSeverity Sev) {
7804 case DiagnoseIfAttr::DS_warning:
7806 case DiagnoseIfAttr::DS_error:
7809 llvm_unreachable(
"Fully covered switch above!");
7812 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7813 if (IsSuccessful(DIA)) {
7814 if (DIA->getWarningGroup().empty() &&
7815 DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_warning) {
7816 S.
Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7817 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7818 << DIA->getParent() << DIA->getCond()->getSourceRange();
7821 DIA->getWarningGroup());
7824 {ToSeverity(DIA->getDefaultSeverity()),
"%0",
7826 S.
Diag(Loc, DiagID) << DIA->getMessage();
7834 const Expr *ThisArg,
7839 [&](
const DiagnoseIfAttr *DIA) {
7844 if (!DIA->getCond()->EvaluateWithSubstitution(
7847 return Result.isInt() &&
Result.getInt().getBoolValue();
7854 *
this, ND,
false, Loc,
7855 [&](
const DiagnoseIfAttr *DIA) {
7857 return DIA->getCond()->EvaluateAsBooleanCondition(
Result,
Context) &&
7866 bool SuppressUserConversions,
7867 bool PartialOverloading,
7868 bool FirstArgumentIsBase) {
7880 if (Args.size() > 0) {
7881 if (
Expr *E = Args[0]) {
7891 FunctionArgs = Args.slice(1);
7895 FunTmpl, F.getPair(),
7897 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7898 FunctionArgs, CandidateSet, SuppressUserConversions,
7899 PartialOverloading);
7903 ObjectClassification, FunctionArgs, CandidateSet,
7904 SuppressUserConversions, PartialOverloading);
7911 if (Args.size() > 0 &&
7915 FunctionArgs = Args.slice(1);
7919 ExplicitTemplateArgs, FunctionArgs,
7920 CandidateSet, SuppressUserConversions,
7921 PartialOverloading);
7924 SuppressUserConversions, PartialOverloading);
7934 bool SuppressUserConversions,
7944 "Expected a member function template");
7946 nullptr, ObjectType,
7947 ObjectClassification, Args, CandidateSet,
7948 SuppressUserConversions,
false, PO);
7951 ObjectType, ObjectClassification, Args, CandidateSet,
7952 SuppressUserConversions,
false, {}, PO);
7965 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7967 "Use AddOverloadCandidate for constructors");
7976 Method->isMoveAssignmentOperator())
7983 bool IgnoreExplicitObject =
7984 (
Method->isExplicitObjectMemberFunction() &&
7987 bool ImplicitObjectMethodTreatedAsStatic =
7990 Method->isImplicitObjectMemberFunction();
7992 unsigned ExplicitOffset =
7993 !IgnoreExplicitObject &&
Method->isExplicitObjectMemberFunction() ? 1 : 0;
7995 unsigned NumParams =
Method->getNumParams() - ExplicitOffset +
7996 int(ImplicitObjectMethodTreatedAsStatic);
7998 unsigned ExtraArgs =
8005 CandidateSet.
addCandidate(Args.size() + ExtraArgs, EarlyConversions);
8021 Candidate.
Viable =
false;
8031 unsigned MinRequiredArgs =
Method->getMinRequiredArguments() -
8033 int(ImplicitObjectMethodTreatedAsStatic);
8035 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
8037 Candidate.
Viable =
false;
8045 if (!IgnoreExplicitObject) {
8048 else if (
Method->isStatic()) {
8058 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
8063 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8064 Method, ActingContext,
true);
8065 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
8066 Candidate.
Viable =
false;
8077 Candidate.
Viable =
false;
8082 if (
Method->getTrailingRequiresClause()) {
8087 Candidate.
Viable =
false;
8095 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
8098 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
8101 }
else if (ArgIdx < NumParams) {
8107 if (ImplicitObjectMethodTreatedAsStatic) {
8108 ParamType = ArgIdx == 0
8109 ?
Method->getFunctionObjectParameterReferenceType()
8112 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
8116 SuppressUserConversions,
8121 Candidate.
Viable =
false;
8133 if (EnableIfAttr *FailedAttr =
8135 Candidate.
Viable =
false;
8142 Candidate.
Viable =
false;
8153 bool SuppressUserConversions,
bool PartialOverloading,
8171 PartialOverloading,
false,
8172 false, ObjectType, ObjectClassification,
8176 bool OnlyInitializeNonUserDefinedConversions) {
8177 return S.CheckNonDependentConversions(
8178 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
8179 Sema::CheckNonDependentConversionsFlag(
8180 SuppressUserConversions,
8181 OnlyInitializeNonUserDefinedConversions),
8182 ActingContext, ObjectType, ObjectClassification, PO);
8186 CandidateSet.
addCandidate(Conversions.size(), Conversions);
8189 Candidate.
Viable =
false;
8198 Method->isStatic() ||
8199 (!Method->isExplicitObjectMemberFunction() && ObjectType.
isNull());
8213 assert(
Specialization &&
"Missing member function template specialization?");
8215 "Specialization is not a member function?");
8218 ObjectClassification, Args, CandidateSet, SuppressUserConversions,
8232 if (ExplicitTemplateArgs ||
8235 *
this, CandidateSet, MethodTmpl, FoundDecl, ActingContext,
8236 ExplicitTemplateArgs, ObjectType, ObjectClassification, Args,
8237 SuppressUserConversions, PartialOverloading, PO);
8242 MethodTmpl, FoundDecl, ActingContext, ObjectType, ObjectClassification,
8243 Args, SuppressUserConversions, PartialOverloading, PO);
8261 bool SuppressUserConversions,
bool PartialOverloading,
bool AllowExplicit,
8263 bool AggregateCandidateDeduction) {
8272 Candidate.
Viable =
false;
8292 PartialOverloading, AggregateCandidateDeduction,
8299 bool OnlyInitializeNonUserDefinedConversions) {
8300 return S.CheckNonDependentConversions(
8301 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
8302 Sema::CheckNonDependentConversionsFlag(
8303 SuppressUserConversions,
8304 OnlyInitializeNonUserDefinedConversions),
8305 nullptr, QualType(), {}, PO);
8308 OverloadCandidate &Candidate =
8309 CandidateSet.addCandidate(Conversions.size(), Conversions);
8312 Candidate.
Viable =
false;
8314 CandidateSet.getRewriteInfo().getRewriteKind(Candidate.
Function, PO);
8320 CandidateSet.getKind() ==
8326 ->isExplicitObjectMemberFunction() &&
8342 assert(
Specialization &&
"Missing function template specialization?");
8344 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
8345 PartialOverloading, AllowExplicit,
8346 false, IsADLCandidate, Conversions, PO,
8347 Info.AggregateDeductionCandidateHasMismatchedArity,
8348 Info.hasStrictPackMatch());
8355 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
8362 if (ExplicitTemplateArgs ||
8365 DependentExplicitSpecifier)) {
8369 Args, SuppressUserConversions, PartialOverloading, AllowExplicit,
8370 IsADLCandidate, PO, AggregateCandidateDeduction);
8372 if (DependentExplicitSpecifier)
8379 PartialOverloading, AllowExplicit, IsADLCandidate, PO,
8380 AggregateCandidateDeduction);
8393 const bool AllowExplicit =
false;
8395 bool ForOverloadSetAddressResolution =
8398 auto *
Method = dyn_cast<CXXMethodDecl>(FD);
8399 bool HasThisConversion = !ForOverloadSetAddressResolution &&
Method &&
8401 unsigned ThisConversions = HasThisConversion ? 1 : 0;
8417 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
8418 !ParamTypes[0]->isDependentType()) {
8420 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8421 Method, ActingContext,
true,
8422 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
8432 auto MaybeInvolveUserDefinedConversion = [&](
QualType ParamType,
8456 if (
auto *RD =
ArgType->getAsCXXRecordDecl();
8457 RD && RD->hasDefinition() &&
8458 !RD->getVisibleConversionFunctions().empty())
8465 HasThisConversion &&
Method->hasCXXExplicitFunctionObjectParameter() ? 1
8468 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
8470 QualType ParamType = ParamTypes[I + Offset];
8474 ConvIdx = Args.size() - 1 - I;
8475 assert(Args.size() + ThisConversions == 2 &&
8476 "number of args (including 'this') must be exactly 2 for "
8480 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
8483 ConvIdx = ThisConversions + I;
8488 MaybeInvolveUserDefinedConversion(ParamType, Args[I]->
getType()))
8517 bool AllowObjCPointerConversion) {
8525 bool ObjCLifetimeConversion;
8527 ObjCLifetimeConversion))
8532 if (!AllowObjCPointerConversion)
8536 bool IncompatibleObjC =
false;
8546 bool AllowExplicit,
bool AllowResultConversion,
bool StrictPackMatch) {
8548 "Conversion function templates use AddTemplateConversionCandidate");
8563 if (!AllowResultConversion &&
8575 AllowObjCConversionOnExplicit))
8597 if (!AllowExplicit && Conversion->
isExplicit()) {
8598 Candidate.
Viable =
false;
8625 Candidate.
Viable =
false;
8634 Candidate.
Viable =
false;
8645 QualType ToCanon =
Context.getCanonicalType(ToType).getUnqualifiedType();
8646 if (FromCanon == ToCanon ||
8648 Candidate.
Viable =
false;
8665 CK_FunctionToPointerDecay, &ConversionRef,
8670 Candidate.
Viable =
false;
8700 Candidate.
Viable =
false;
8712 Candidate.
Viable =
false;
8719 Candidate.
Viable =
false;
8725 "Can only end up with a standard conversion sequence or failure");
8728 if (EnableIfAttr *FailedAttr =
8730 Candidate.
Viable =
false;
8737 Candidate.
Viable =
false;
8746 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
8747 bool AllowResultConversion) {
8756 Candidate.
Viable =
false;
8773 Candidate.
Viable =
false;
8783 assert(
Specialization &&
"Missing function template specialization?");
8785 ToType, CandidateSet, AllowObjCConversionOnExplicit,
8786 AllowExplicit, AllowResultConversion,
8794 bool AllowExplicit,
bool AllowResultConversion) {
8796 "Only conversion function templates permitted here");
8807 ToType, AllowObjCConversionOnExplicit, AllowExplicit,
8808 AllowResultConversion);
8816 AllowObjCConversionOnExplicit, AllowExplicit, AllowResultConversion);
8855 if (ObjectInit.
isBad()) {
8856 Candidate.
Viable =
false;
8867 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8868 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8869 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8870 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8873 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8881 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8882 Candidate.
Viable =
false;
8889 if (Args.size() < NumParams) {
8891 Candidate.
Viable =
false;
8898 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8899 if (ArgIdx < NumParams) {
8912 Candidate.
Viable =
false;
8929 Candidate.
Viable =
false;
8935 if (EnableIfAttr *FailedAttr =
8937 Candidate.
Viable =
false;
8961 "unqualified operator lookup found a member function");
8965 FunctionArgs, CandidateSet);
8971 FunctionArgs[1], FunctionArgs[0]);
8973 Reversed, CandidateSet,
false,
false,
true,
8974 ADLCallKind::NotADL,
8978 if (ExplicitTemplateArgs)
8983 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
8984 false,
false,
true,
false, ADLCallKind::NotADL, {},
9016 if (!T1RD || (!IsComplete && !T1RD->isBeingDefined()))
9024 OperEnd = Operators.
end();
9025 Oper != OperEnd; ++Oper) {
9026 if (Oper->getAsFunction() &&
9029 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
9032 Args[0]->Classify(
Context), Args.slice(1),
9033 CandidateSet,
false, PO);
9040 bool IsAssignmentOperator,
9041 unsigned NumContextualBoolArguments) {
9056 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9069 if (ArgIdx < NumContextualBoolArguments) {
9070 assert(ParamTys[ArgIdx] ==
Context.BoolTy &&
9071 "Contextual conversion to bool requires bool type");
9077 ArgIdx == 0 && IsAssignmentOperator,
9083 Candidate.
Viable =
false;
9096class BuiltinCandidateTypeSet {
9102 TypeSet PointerTypes;
9106 TypeSet MemberPointerTypes;
9110 TypeSet EnumerationTypes;
9114 TypeSet VectorTypes;
9118 TypeSet MatrixTypes;
9121 TypeSet BitIntTypes;
9124 bool HasNonRecordTypes;
9128 bool HasArithmeticOrEnumeralTypes;
9132 bool HasNullPtrType;
9141 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
9143 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
9147 typedef TypeSet::iterator
iterator;
9149 BuiltinCandidateTypeSet(
Sema &SemaRef)
9150 : HasNonRecordTypes(
false),
9151 HasArithmeticOrEnumeralTypes(
false),
9152 HasNullPtrType(
false),
9154 Context(SemaRef.Context) { }
9156 void AddTypesConvertedFrom(
QualType Ty,
9158 bool AllowUserConversions,
9159 bool AllowExplicitConversions,
9160 const Qualifiers &VisibleTypeConversionsQuals);
9162 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
9163 llvm::iterator_range<iterator> member_pointer_types() {
9164 return MemberPointerTypes;
9166 llvm::iterator_range<iterator> enumeration_types() {
9167 return EnumerationTypes;
9169 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
9170 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
9171 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
9173 bool containsMatrixType(QualType Ty)
const {
return MatrixTypes.count(Ty); }
9174 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
9175 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
9176 bool hasNullPtrType()
const {
return HasNullPtrType; }
9191BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(QualType Ty,
9192 const Qualifiers &VisibleQuals) {
9195 if (!PointerTypes.insert(Ty))
9199 const PointerType *PointerTy = Ty->
getAs<PointerType>();
9200 bool buildObjCPtr =
false;
9202 const ObjCObjectPointerType *PTy = Ty->
castAs<ObjCObjectPointerType>();
9204 buildObjCPtr =
true;
9216 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
9222 if ((CVR | BaseCVR) != CVR)
continue;
9237 QualType QPointerTy;
9244 PointerTypes.insert(QPointerTy);
9260BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
9263 if (!MemberPointerTypes.insert(Ty))
9266 const MemberPointerType *PointerTy = Ty->
getAs<MemberPointerType>();
9267 assert(PointerTy &&
"type was not a member pointer type!");
9282 if ((CVR | BaseCVR) != CVR)
continue;
9286 QPointeeTy, std::nullopt, Cls));
9301BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty,
9303 bool AllowUserConversions,
9304 bool AllowExplicitConversions,
9305 const Qualifiers &VisibleQuals) {
9311 if (
const ReferenceType *RefTy = Ty->
getAs<ReferenceType>())
9316 Ty = SemaRef.Context.getArrayDecayedType(Ty);
9323 HasNonRecordTypes = HasNonRecordTypes || !TyIsRec;
9326 HasArithmeticOrEnumeralTypes =
9330 PointerTypes.insert(Ty);
9331 else if (Ty->
getAs<PointerType>() || Ty->
getAs<ObjCObjectPointerType>()) {
9334 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
9338 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
9341 HasArithmeticOrEnumeralTypes =
true;
9342 EnumerationTypes.insert(Ty);
9344 HasArithmeticOrEnumeralTypes =
true;
9345 BitIntTypes.insert(Ty);
9349 HasArithmeticOrEnumeralTypes =
true;
9350 VectorTypes.insert(Ty);
9354 HasArithmeticOrEnumeralTypes =
true;
9355 MatrixTypes.insert(Ty);
9357 HasNullPtrType =
true;
9358 }
else if (AllowUserConversions && TyIsRec) {
9360 if (!SemaRef.isCompleteType(Loc, Ty))
9364 for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) {
9374 if (AllowExplicitConversions || !Conv->
isExplicit()) {
9422 ClassDecl = RHSMPType->getMostRecentCXXRecordDecl();
9470 if (Available.hasAtomic()) {
9471 Available.removeAtomic();
9478 if (Available.hasVolatile()) {
9479 Available.removeVolatile();
9513class BuiltinOperatorOverloadBuilder {
9516 ArrayRef<Expr *> Args;
9517 QualifiersAndAtomic VisibleTypeConversionsQuals;
9518 bool HasArithmeticOrEnumeralCandidateType;
9519 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes;
9520 OverloadCandidateSet &CandidateSet;
9522 static constexpr int ArithmeticTypesCap = 26;
9523 SmallVector<CanQualType, ArithmeticTypesCap> ArithmeticTypes;
9528 unsigned FirstIntegralType,
9530 unsigned FirstPromotedIntegralType,
9531 LastPromotedIntegralType;
9532 unsigned FirstPromotedArithmeticType,
9533 LastPromotedArithmeticType;
9534 unsigned NumArithmeticTypes;
9536 void InitArithmeticTypes() {
9538 FirstPromotedArithmeticType = 0;
9548 FirstIntegralType = ArithmeticTypes.size();
9549 FirstPromotedIntegralType = ArithmeticTypes.size();
9571 llvm::SmallSetVector<CanQualType, 2> BitIntCandidates;
9572 for (BuiltinCandidateTypeSet &Candidate : CandidateTypes) {
9573 for (QualType BitTy : Candidate.bitint_types())
9576 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
9577 LastPromotedIntegralType = ArithmeticTypes.size();
9578 LastPromotedArithmeticType = ArithmeticTypes.size();
9592 LastIntegralType = ArithmeticTypes.size();
9593 NumArithmeticTypes = ArithmeticTypes.size();
9600 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
9601 ArithmeticTypesCap &&
9602 "Enough inline storage for all arithmetic types.");
9607 void addPlusPlusMinusMinusStyleOverloads(QualType CandidateTy,
9610 QualType ParamTypes[2] = {
9650 void AddCandidate(QualType L, QualType R) {
9651 QualType LandR[2] = {L,
R};
9656 BuiltinOperatorOverloadBuilder(
9657 Sema &S, ArrayRef<Expr *> Args,
9658 QualifiersAndAtomic VisibleTypeConversionsQuals,
9659 bool HasArithmeticOrEnumeralCandidateType,
9660 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes,
9661 OverloadCandidateSet &CandidateSet)
9663 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
9664 HasArithmeticOrEnumeralCandidateType(
9665 HasArithmeticOrEnumeralCandidateType),
9666 CandidateTypes(CandidateTypes),
9667 CandidateSet(CandidateSet) {
9669 InitArithmeticTypes();
9692 if (!HasArithmeticOrEnumeralCandidateType)
9695 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9696 const auto TypeOfT = ArithmeticTypes[Arith];
9698 if (Op == OO_MinusMinus)
9700 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9703 addPlusPlusMinusMinusStyleOverloads(
9720 void addPlusPlusMinusMinusPointerOverloads() {
9721 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
9723 if (!PtrTy->getPointeeType()->isObjectType())
9726 addPlusPlusMinusMinusStyleOverloads(
9728 (!PtrTy.isVolatileQualified() &&
9730 (!PtrTy.isRestrictQualified() &&
9745 void addUnaryStarPointerOverloads() {
9746 for (QualType ParamTy : CandidateTypes[0].pointer_types()) {
9751 if (
const FunctionProtoType *Proto =PointeeTy->
getAs<FunctionProtoType>())
9752 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9765 void addUnaryPlusOrMinusArithmeticOverloads() {
9766 if (!HasArithmeticOrEnumeralCandidateType)
9769 for (
unsigned Arith = FirstPromotedArithmeticType;
9770 Arith < LastPromotedArithmeticType; ++Arith) {
9771 QualType ArithTy = ArithmeticTypes[Arith];
9776 for (QualType VecTy : CandidateTypes[0].vector_types())
9785 void addUnaryPlusPointerOverloads() {
9786 for (QualType ParamTy : CandidateTypes[0].pointer_types())
9795 void addUnaryTildePromotedIntegralOverloads() {
9796 if (!HasArithmeticOrEnumeralCandidateType)
9799 for (
unsigned Int = FirstPromotedIntegralType;
9800 Int < LastPromotedIntegralType; ++
Int) {
9801 QualType IntTy = ArithmeticTypes[
Int];
9806 for (QualType VecTy : CandidateTypes[0].vector_types())
9816 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9818 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9820 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9821 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9826 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9830 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9832 if (AddedTypes.insert(NullPtrTy).second) {
9833 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9852 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9865 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9866 UserDefinedBinaryOperators;
9868 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9869 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9871 CEnd = CandidateSet.
end();
9873 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9876 if (
C->Function->isFunctionTemplateSpecialization())
9883 QualType FirstParamType =
C->Function->getParamDecl(
Reversed ? 1 : 0)
9885 .getUnqualifiedType();
9886 QualType SecondParamType =
C->Function->getParamDecl(
Reversed ? 0 : 1)
9888 .getUnqualifiedType();
9896 UserDefinedBinaryOperators.insert(
9904 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9906 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9907 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9911 if (IsSpaceship && PtrTy->isFunctionPointerType())
9914 QualType ParamTypes[2] = {PtrTy, PtrTy};
9917 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9922 if (!AddedTypes.insert(CanonType).second ||
9923 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9926 QualType ParamTypes[2] = {EnumTy, EnumTy};
9951 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9953 for (
int Arg = 0; Arg < 2; ++Arg) {
9954 QualType AsymmetricParamTypes[2] = {
9958 for (QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9963 AsymmetricParamTypes[Arg] = PtrTy;
9964 if (Arg == 0 || Op == OO_Plus) {
9969 if (Op == OO_Minus) {
9974 QualType ParamTypes[2] = {PtrTy, PtrTy};
10010 void addGenericBinaryArithmeticOverloads() {
10011 if (!HasArithmeticOrEnumeralCandidateType)
10014 for (
unsigned Left = FirstPromotedArithmeticType;
10015 Left < LastPromotedArithmeticType; ++
Left) {
10016 for (
unsigned Right = FirstPromotedArithmeticType;
10017 Right < LastPromotedArithmeticType; ++
Right) {
10018 QualType LandR[2] = { ArithmeticTypes[
Left],
10019 ArithmeticTypes[
Right] };
10026 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10027 for (QualType Vec2Ty : CandidateTypes[1].vector_types()) {
10028 QualType LandR[2] = {Vec1Ty, Vec2Ty};
10038 void addMatrixBinaryArithmeticOverloads() {
10039 if (!HasArithmeticOrEnumeralCandidateType)
10042 for (QualType M1 : CandidateTypes[0].matrix_types()) {
10044 AddCandidate(M1, M1);
10047 for (QualType M2 : CandidateTypes[1].matrix_types()) {
10049 if (!CandidateTypes[0].containsMatrixType(M2))
10050 AddCandidate(M2, M2);
10085 void addThreeWayArithmeticOverloads() {
10086 addGenericBinaryArithmeticOverloads();
10103 void addBinaryBitwiseArithmeticOverloads() {
10104 if (!HasArithmeticOrEnumeralCandidateType)
10107 for (
unsigned Left = FirstPromotedIntegralType;
10108 Left < LastPromotedIntegralType; ++
Left) {
10109 for (
unsigned Right = FirstPromotedIntegralType;
10110 Right < LastPromotedIntegralType; ++
Right) {
10111 QualType LandR[2] = { ArithmeticTypes[
Left],
10112 ArithmeticTypes[
Right] };
10125 void addAssignmentMemberPointerOrEnumeralOverloads() {
10127 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10129 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10130 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10137 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10162 void addAssignmentPointerOverloads(
bool isEqualOp) {
10164 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10166 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10170 else if (!PtrTy->getPointeeType()->isObjectType())
10174 QualType ParamTypes[2] = {
10181 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10183 if (NeedVolatile) {
10191 if (!PtrTy.isRestrictQualified() &&
10199 if (NeedVolatile) {
10211 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10216 QualType ParamTypes[2] = {
10225 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10227 if (NeedVolatile) {
10235 if (!PtrTy.isRestrictQualified() &&
10243 if (NeedVolatile) {
10268 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
10269 if (!HasArithmeticOrEnumeralCandidateType)
10272 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
10273 for (
unsigned Right = FirstPromotedArithmeticType;
10274 Right < LastPromotedArithmeticType; ++
Right) {
10275 QualType ParamTypes[2];
10276 ParamTypes[1] = ArithmeticTypes[
Right];
10278 S, ArithmeticTypes[Left], Args[0]);
10281 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10291 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10292 for (QualType Vec2Ty : CandidateTypes[0].vector_types()) {
10293 QualType ParamTypes[2];
10294 ParamTypes[1] = Vec2Ty;
10322 void addAssignmentIntegralOverloads() {
10323 if (!HasArithmeticOrEnumeralCandidateType)
10326 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
10327 for (
unsigned Right = FirstPromotedIntegralType;
10328 Right < LastPromotedIntegralType; ++
Right) {
10329 QualType ParamTypes[2];
10330 ParamTypes[1] = ArithmeticTypes[
Right];
10332 S, ArithmeticTypes[Left], Args[0]);
10335 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10351 void addExclaimOverload() {
10357 void addAmpAmpOrPipePipeOverload() {
10374 void addSubscriptOverloads() {
10375 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10385 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10405 void addArrowStarOverloads() {
10406 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10407 QualType C1Ty = PtrTy;
10409 QualifierCollector Q1;
10420 for (QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
10427 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
10430 if (!VisibleTypeConversionsQuals.
hasVolatile() &&
10431 T.isVolatileQualified())
10433 if (!VisibleTypeConversionsQuals.
hasRestrict() &&
10434 T.isRestrictQualified())
10452 void addConditionalOperatorOverloads() {
10454 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10456 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10457 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
10461 QualType ParamTypes[2] = {PtrTy, PtrTy};
10465 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10469 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
10474 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10475 if (!EnumTy->castAsCanonical<EnumType>()->getDecl()->isScoped())
10481 QualType ParamTypes[2] = {EnumTy, EnumTy};
10500 VisibleTypeConversionsQuals.
addConst();
10501 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10503 if (Args[ArgIdx]->
getType()->isAtomicType())
10504 VisibleTypeConversionsQuals.
addAtomic();
10507 bool HasNonRecordCandidateType =
false;
10508 bool HasArithmeticOrEnumeralCandidateType =
false;
10510 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10511 CandidateTypes.emplace_back(*
this);
10512 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->
getType(),
10515 (Op == OO_Exclaim ||
10517 Op == OO_PipePipe),
10518 VisibleTypeConversionsQuals);
10519 HasNonRecordCandidateType = HasNonRecordCandidateType ||
10520 CandidateTypes[ArgIdx].hasNonRecordTypes();
10521 HasArithmeticOrEnumeralCandidateType =
10522 HasArithmeticOrEnumeralCandidateType ||
10523 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
10531 if (!HasNonRecordCandidateType &&
10532 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
10536 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
10537 VisibleTypeConversionsQuals,
10538 HasArithmeticOrEnumeralCandidateType,
10539 CandidateTypes, CandidateSet);
10545 llvm_unreachable(
"Expected an overloaded operator");
10550 case OO_Array_Delete:
10553 "Special operators don't use AddBuiltinOperatorCandidates");
10565 if (Args.size() == 1)
10566 OpBuilder.addUnaryPlusPointerOverloads();
10570 if (Args.size() == 1) {
10571 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
10573 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
10574 OpBuilder.addGenericBinaryArithmeticOverloads();
10575 OpBuilder.addMatrixBinaryArithmeticOverloads();
10580 if (Args.size() == 1)
10581 OpBuilder.addUnaryStarPointerOverloads();
10583 OpBuilder.addGenericBinaryArithmeticOverloads();
10584 OpBuilder.addMatrixBinaryArithmeticOverloads();
10589 OpBuilder.addGenericBinaryArithmeticOverloads();
10593 case OO_MinusMinus:
10594 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
10595 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
10598 case OO_EqualEqual:
10599 case OO_ExclaimEqual:
10600 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
10601 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10602 OpBuilder.addGenericBinaryArithmeticOverloads();
10608 case OO_GreaterEqual:
10609 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10610 OpBuilder.addGenericBinaryArithmeticOverloads();
10614 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
10615 OpBuilder.addThreeWayArithmeticOverloads();
10622 case OO_GreaterGreater:
10623 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10627 if (Args.size() == 1)
10633 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10637 OpBuilder.addUnaryTildePromotedIntegralOverloads();
10641 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
10645 case OO_MinusEqual:
10646 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
10650 case OO_SlashEqual:
10651 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
10654 case OO_PercentEqual:
10655 case OO_LessLessEqual:
10656 case OO_GreaterGreaterEqual:
10658 case OO_CaretEqual:
10660 OpBuilder.addAssignmentIntegralOverloads();
10664 OpBuilder.addExclaimOverload();
10669 OpBuilder.addAmpAmpOrPipePipeOverload();
10673 if (Args.size() == 2)
10674 OpBuilder.addSubscriptOverloads();
10678 OpBuilder.addArrowStarOverloads();
10681 case OO_Conditional:
10682 OpBuilder.addConditionalOperatorOverloads();
10683 OpBuilder.addGenericBinaryArithmeticOverloads();
10694 bool PartialOverloading) {
10711 CandEnd = CandidateSet.
end();
10712 Cand != CandEnd; ++Cand)
10713 if (Cand->Function) {
10717 Fns.
erase(FunTmpl);
10726 if (ExplicitTemplateArgs)
10730 FD, FoundDecl, Args, CandidateSet,
false,
10731 PartialOverloading,
true,
10732 false, ADLCallKind::UsesADL);
10735 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10736 false, PartialOverloading,
10743 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10744 false, PartialOverloading,
10745 true, ADLCallKind::UsesADL);
10747 *
this, Args, FTD->getTemplatedDecl())) {
10751 if (ReversedArgs.empty())
10755 FTD, FoundDecl, ExplicitTemplateArgs, ReversedArgs, CandidateSet,
10756 false, PartialOverloading,
10757 true, ADLCallKind::UsesADL,
10782 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10783 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10784 if (!Cand1Attr || !Cand2Attr) {
10785 if (Cand1Attr == Cand2Attr)
10786 return Comparison::Equal;
10787 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10793 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10794 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10795 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10796 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10801 return Comparison::Worse;
10803 return Comparison::Better;
10808 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10809 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10810 if (Cand1ID != Cand2ID)
10811 return Comparison::Worse;
10814 return Comparison::Equal;
10822 return Comparison::Equal;
10828 return Comparison::Equal;
10829 return Comparison::Worse;
10832 return Comparison::Better;
10838 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10839 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10841 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10842 return Comparison::Equal;
10844 if (Cand1CPUDisp && !Cand2CPUDisp)
10845 return Comparison::Better;
10846 if (Cand2CPUDisp && !Cand1CPUDisp)
10847 return Comparison::Worse;
10849 if (Cand1CPUSpec && Cand2CPUSpec) {
10850 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10851 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10852 ? Comparison::Better
10853 : Comparison::Worse;
10855 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10856 FirstDiff = std::mismatch(
10857 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10858 Cand2CPUSpec->cpus_begin(),
10860 return LHS->getName() == RHS->getName();
10863 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10864 "Two different cpu-specific versions should not have the same "
10865 "identifier list, otherwise they'd be the same decl!");
10866 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->getName()
10867 ? Comparison::Better
10868 : Comparison::Worse;
10870 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10876static std::optional<QualType>
10879 return std::nullopt;
10885 return M->getFunctionObjectParameterReferenceType();
10899 PT2->getInstantiatedFromMemberTemplate()))
10910 assert(I < F->getNumParams());
10917 if (F1NumParams != F2NumParams)
10920 unsigned I1 = 0, I2 = 0;
10921 for (
unsigned I = 0; I != F1NumParams; ++I) {
10922 QualType T1 = NextParam(F1, I1, I == 0);
10923 QualType T2 = NextParam(F2, I2, I == 0);
10924 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10925 if (!Context.hasSameUnqualifiedType(T1, T2))
10938 bool IsFn1Reversed,
10939 bool IsFn2Reversed) {
10940 assert(Fn1 && Fn2);
10945 IsFn1Reversed ^ IsFn2Reversed))
10948 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10949 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10950 if (Mem1 && Mem2) {
10953 if (Mem1->getParent() != Mem2->getParent())
10957 if (Mem1->isInstance() && Mem2->isInstance() &&
10959 Mem1->getFunctionObjectParameterReferenceType(),
10960 Mem1->getFunctionObjectParameterReferenceType()))
10966static FunctionDecl *
10968 bool IsFn1Reversed,
bool IsFn2Reversed) {
10978 if (Cand1IsSpecialization || Cand2IsSpecialization)
10995 bool PartialOverloading) {
11041 bool IsCand1ImplicitHD =
11043 bool IsCand2ImplicitHD =
11058 auto EmitThreshold =
11059 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
11060 (IsCand1ImplicitHD || IsCand2ImplicitHD))
11063 auto Cand1Emittable = P1 > EmitThreshold;
11064 auto Cand2Emittable = P2 > EmitThreshold;
11065 if (Cand1Emittable && !Cand2Emittable)
11067 if (!Cand1Emittable && Cand2Emittable)
11078 unsigned StartArg = 0;
11086 return ICS.isStandard() &&
11098 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
11099 bool HasBetterConversion =
false;
11100 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11101 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
11102 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
11103 if (Cand1Bad != Cand2Bad) {
11106 HasBetterConversion =
true;
11110 if (HasBetterConversion)
11117 bool HasWorseConversion =
false;
11118 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11124 HasBetterConversion =
true;
11143 HasWorseConversion =
true;
11158 if (HasBetterConversion && !HasWorseConversion)
11209 bool Cand1IsSpecialization = Cand1.
Function &&
11211 bool Cand2IsSpecialization = Cand2.
Function &&
11213 if (Cand1IsSpecialization != Cand2IsSpecialization)
11214 return Cand2IsSpecialization;
11220 if (Cand1IsSpecialization && Cand2IsSpecialization) {
11221 const auto *Obj1Context =
11223 const auto *Obj2Context =
11252 bool Cand1IsInherited =
11254 bool Cand2IsInherited =
11256 if (Cand1IsInherited != Cand2IsInherited)
11257 return Cand2IsInherited;
11258 else if (Cand1IsInherited) {
11259 assert(Cand2IsInherited);
11262 if (Cand1Class->isDerivedFrom(Cand2Class))
11264 if (Cand2Class->isDerivedFrom(Cand1Class))
11281 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
11282 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
11283 if (Guide1 && Guide2) {
11285 if (Guide1->isImplicit() != Guide2->isImplicit())
11286 return Guide2->isImplicit();
11296 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
11297 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
11298 if (Constructor1 && Constructor2) {
11299 bool isC1Templated = Constructor1->getTemplatedKind() !=
11301 bool isC2Templated = Constructor2->getTemplatedKind() !=
11303 if (isC1Templated != isC2Templated)
11304 return isC2Templated;
11312 if (
Cmp != Comparison::Equal)
11313 return Cmp == Comparison::Better;
11316 bool HasPS1 = Cand1.
Function !=
nullptr &&
11318 bool HasPS2 = Cand2.
Function !=
nullptr &&
11320 if (HasPS1 != HasPS2 && HasPS1)
11324 if (MV == Comparison::Better)
11326 if (MV == Comparison::Worse)
11341 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
11342 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
11344 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
11345 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
11366 auto *VA = dyn_cast_or_null<ValueDecl>(A);
11367 auto *VB = dyn_cast_or_null<ValueDecl>(B);
11373 if (!VA->getDeclContext()->getRedeclContext()->Equals(
11374 VB->getDeclContext()->getRedeclContext()) ||
11376 VA->isExternallyVisible() || VB->isExternallyVisible())
11384 if (
Context.hasSameType(VA->getType(), VB->getType()))
11389 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
11390 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
11395 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
11396 !
Context.hasSameType(EnumA->getIntegerType(),
11397 EnumB->getIntegerType()))
11400 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
11410 assert(D &&
"Unknown declaration");
11411 Diag(Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) << D;
11417 for (
auto *E : Equiv) {
11419 Diag(E->getLocation(), diag::note_equivalent_internal_linkage_decl)
11429 ->Satisfaction.ContainsErrors;
11435 bool PartialOverloading,
bool AllowExplicit,
11437 bool AggregateCandidateDeduction) {
11440 allocateDeferredCandidate<DeferredFunctionTemplateOverloadCandidate>();
11445 false, AllowExplicit, SuppressUserConversions,
11446 PartialOverloading, AggregateCandidateDeduction},
11453 HasDeferredTemplateConstructors |=
11461 bool SuppressUserConversions,
bool PartialOverloading,
11467 allocateDeferredCandidate<DeferredMethodTemplateOverloadCandidate>();
11473 false, SuppressUserConversions, PartialOverloading,
11479 ObjectClassification,
11487 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
11488 bool AllowResultConversion) {
11491 allocateDeferredCandidate<DeferredConversionTemplateOverloadCandidate>();
11495 AllowObjCConversionOnExplicit, AllowResultConversion,
11512 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
11513 nullptr,
C.ObjectType,
C.ObjectClassification,
11514 C.Args,
C.SuppressUserConversions,
C.PartialOverloading,
C.PO);
11521 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
11522 nullptr,
C.Args,
C.SuppressUserConversions,
11523 C.PartialOverloading,
C.AllowExplicit,
C.IsADLCandidate,
C.PO,
11524 C.AggregateCandidateDeduction);
11531 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
C.From,
11532 C.ToType,
C.AllowObjCConversionOnExplicit,
C.AllowExplicit,
11533 C.AllowResultConversion);
11537 Candidates.reserve(Candidates.size() + DeferredCandidatesCount);
11540 switch (Cand->
Kind) {
11559 FirstDeferredCandidate =
nullptr;
11560 DeferredCandidatesCount = 0;
11564OverloadCandidateSet::ResultForBestCandidate(
const iterator &Best) {
11566 if (Best->Function && Best->Function->isDeleted())
11571void OverloadCandidateSet::CudaExcludeWrongSideCandidates(
11588 bool ContainsSameSideCandidate =
11596 if (!ContainsSameSideCandidate)
11599 auto IsWrongSideCandidate = [&](
const OverloadCandidate *Cand) {
11605 llvm::erase_if(Candidates, IsWrongSideCandidate);
11623 DeferredCandidatesCount == 0) &&
11624 "Unexpected deferred template candidates");
11626 bool TwoPhaseResolution =
11627 DeferredCandidatesCount != 0 && !ResolutionByPerfectCandidateIsDisabled;
11629 if (TwoPhaseResolution) {
11631 if (Best !=
end() && Best->isPerfectMatch(S.
Context)) {
11632 if (!(HasDeferredTemplateConstructors &&
11633 isa_and_nonnull<CXXConversionDecl>(Best->Function)))
11639 return BestViableFunctionImpl(S, Loc, Best);
11646 Candidates.reserve(this->Candidates.size());
11647 std::transform(this->Candidates.begin(), this->Candidates.end(),
11648 std::back_inserter(Candidates),
11652 CudaExcludeWrongSideCandidates(S, Candidates);
11655 for (
auto *Cand : Candidates) {
11656 Cand->
Best =
false;
11658 if (Best ==
end() ||
11675 llvm::SmallVector<OverloadCandidate *, 4> PendingBest;
11676 llvm::SmallVector<const NamedDecl *, 4> EquivalentCands;
11677 PendingBest.push_back(&*Best);
11682 while (!PendingBest.empty()) {
11683 auto *Curr = PendingBest.pop_back_val();
11684 for (
auto *Cand : Candidates) {
11687 PendingBest.push_back(Cand);
11692 EquivalentCands.push_back(Cand->
Function);
11704 if (!EquivalentCands.empty())
11712enum OverloadCandidateKind {
11715 oc_reversed_binary_operator,
11717 oc_implicit_default_constructor,
11718 oc_implicit_copy_constructor,
11719 oc_implicit_move_constructor,
11720 oc_implicit_copy_assignment,
11721 oc_implicit_move_assignment,
11722 oc_implicit_equality_comparison,
11723 oc_inherited_constructor
11726enum OverloadCandidateSelect {
11729 ocs_described_template,
11732static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
11733ClassifyOverloadCandidate(Sema &S,
const NamedDecl *
Found,
11734 const FunctionDecl *Fn,
11736 std::string &Description) {
11739 if (FunctionTemplateDecl *FunTmpl =
Fn->getPrimaryTemplate()) {
11742 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
11745 OverloadCandidateSelect Select = [&]() {
11746 if (!Description.empty())
11747 return ocs_described_template;
11748 return isTemplate ? ocs_template : ocs_non_template;
11751 OverloadCandidateKind Kind = [&]() {
11752 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
11753 return oc_implicit_equality_comparison;
11756 return oc_reversed_binary_operator;
11758 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
11759 if (!Ctor->isImplicit()) {
11761 return oc_inherited_constructor;
11763 return oc_constructor;
11766 if (Ctor->isDefaultConstructor())
11767 return oc_implicit_default_constructor;
11769 if (Ctor->isMoveConstructor())
11770 return oc_implicit_move_constructor;
11772 assert(Ctor->isCopyConstructor() &&
11773 "unexpected sort of implicit constructor");
11774 return oc_implicit_copy_constructor;
11777 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
11780 if (!Meth->isImplicit())
11783 if (Meth->isMoveAssignmentOperator())
11784 return oc_implicit_move_assignment;
11786 if (Meth->isCopyAssignmentOperator())
11787 return oc_implicit_copy_assignment;
11793 return oc_function;
11796 return std::make_pair(Kind, Select);
11799void MaybeEmitInheritedConstructorNote(Sema &S,
const Decl *FoundDecl) {
11802 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
11804 diag::note_ovl_candidate_inherited_constructor)
11805 << Shadow->getNominatedBaseClass();
11814 if (EnableIf->getCond()->isValueDependent() ||
11815 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
11832 bool InOverloadResolution,
11836 if (InOverloadResolution)
11838 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
11840 S.
Diag(Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
11851 if (InOverloadResolution) {
11854 TemplateArgString +=
" ";
11856 FunTmpl->getTemplateParameters(),
11861 diag::note_ovl_candidate_unsatisfied_constraints)
11862 << TemplateArgString;
11864 S.
Diag(Loc, diag::err_addrof_function_constraints_not_satisfied)
11873 return P->hasAttr<PassObjectSizeAttr>();
11880 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11881 if (InOverloadResolution)
11883 diag::note_ovl_candidate_has_pass_object_size_params)
11886 S.
Diag(Loc, diag::err_address_of_function_with_pass_object_size_params)
11902 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11910 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11915 if (!RD->isLambda())
11925 return ConvToCC != CallOpCC;
11931 QualType DestType,
bool TakingAddress) {
11934 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11935 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11937 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11938 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11943 std::string FnDesc;
11944 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11945 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11947 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11951 Diag(Fn->getLocation(), PD);
11952 MaybeEmitInheritedConstructorNote(*
this,
Found);
11970 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11971 for (
auto I = Cands.begin(), E = Cands.end(); I != E; ++I) {
11975 if (
auto *
Template = I->Function->getPrimaryTemplate())
11976 Template->getAssociatedConstraints(AC);
11978 I->Function->getAssociatedConstraints(AC);
11981 if (FirstCand ==
nullptr) {
11982 FirstCand = I->Function;
11984 }
else if (SecondCand ==
nullptr) {
11985 SecondCand = I->Function;
11998 SecondCand, SecondAC))
12007 bool TakingAddress) {
12017 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
12021 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
12034 S.
Diag(CaretLoc, PDiag)
12036 unsigned CandsShown = 0;
12050 unsigned I,
bool TakingCandidateAddress) {
12052 assert(Conv.
isBad());
12053 assert(Cand->
Function &&
"for now, candidate must be a function");
12059 bool isObjectArgument =
false;
12063 isObjectArgument =
true;
12068 std::string FnDesc;
12069 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12080 bool HasParamPack =
12081 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
12082 return Parm->isParameterPack();
12084 if (!isObjectArgument && !HasParamPack && I < Fn->getNumParams())
12085 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
12088 assert(FromExpr &&
"overload set argument came from implicit argument?");
12094 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
12095 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12096 << ToParamRange << ToTy << Name << I + 1;
12097 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12106 CToTy = RT->getPointeeType();
12111 CFromTy = FromPT->getPointeeType();
12112 CToTy = ToPT->getPointeeType();
12122 if (isObjectArgument)
12123 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
12124 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12127 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
12128 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12131 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12136 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
12137 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12140 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12145 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
12146 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12149 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12154 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ptrauth)
12155 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12160 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12165 assert(CVR &&
"expected qualifiers mismatch");
12167 if (isObjectArgument) {
12168 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
12169 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12170 << FromTy << (CVR - 1);
12172 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
12173 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12174 << ToParamRange << FromTy << (CVR - 1) << I + 1;
12176 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12182 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
12183 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12184 << (
unsigned)isObjectArgument << I + 1
12187 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12194 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
12195 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12196 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12201 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12213 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
12214 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12215 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12216 << (
unsigned)(Cand->
Fix.
Kind);
12218 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12223 unsigned BaseToDerivedConversion = 0;
12226 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12228 !FromPtrTy->getPointeeType()->isIncompleteType() &&
12229 !ToPtrTy->getPointeeType()->isIncompleteType() &&
12231 FromPtrTy->getPointeeType()))
12232 BaseToDerivedConversion = 1;
12240 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12242 FromIface->isSuperClassOf(ToIface))
12243 BaseToDerivedConversion = 2;
12245 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy,
12248 !ToRefTy->getPointeeType()->isIncompleteType() &&
12250 BaseToDerivedConversion = 3;
12254 if (BaseToDerivedConversion) {
12255 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
12256 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12257 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
12259 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12268 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
12269 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12270 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
12272 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12282 if (FromTy == S.
Context.AMDGPUFeaturePredicateTy &&
12285 diag::err_amdgcn_predicate_type_needs_explicit_bool_cast)
12292 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12293 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12294 << (
unsigned)(Cand->
Fix.
Kind);
12303 S.
Diag(Fn->getLocation(), FDiag);
12305 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12312 unsigned NumArgs,
bool IsAddressOf =
false) {
12313 assert(Cand->
Function &&
"Candidate is required to be a function.");
12315 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12316 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12323 if (Fn->isInvalidDecl() &&
12327 if (NumArgs < MinParams) {
12344 unsigned NumFormalArgs,
12345 bool IsAddressOf =
false) {
12347 "The templated declaration should at least be a function"
12348 " when diagnosing bad template argument deduction due to too many"
12349 " or too few arguments");
12355 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12356 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12359 bool HasExplicitObjectParam =
12360 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
12362 unsigned ParamCount =
12363 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12364 unsigned mode, modeCount;
12366 if (NumFormalArgs < MinParams) {
12367 if (MinParams != ParamCount || FnTy->isVariadic() ||
12368 FnTy->isTemplateVariadic())
12372 modeCount = MinParams;
12374 if (MinParams != ParamCount)
12378 modeCount = ParamCount;
12381 std::string Description;
12382 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12383 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
12385 unsigned FirstNonObjectParamIdx = HasExplicitObjectParam ? 1 : 0;
12386 if (modeCount == 1 && !IsAddressOf &&
12387 FirstNonObjectParamIdx < Fn->getNumParams() &&
12388 Fn->getParamDecl(FirstNonObjectParamIdx)->getDeclName())
12389 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
12390 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12391 << Description << mode << Fn->getParamDecl(FirstNonObjectParamIdx)
12392 << NumFormalArgs << HasExplicitObjectParam
12393 << Fn->getParametersSourceRange();
12395 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
12396 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12397 << Description << mode << modeCount << NumFormalArgs
12398 << HasExplicitObjectParam << Fn->getParametersSourceRange();
12400 MaybeEmitInheritedConstructorNote(S,
Found);
12405 unsigned NumFormalArgs) {
12406 assert(Cand->
Function &&
"Candidate must be a function");
12416 llvm_unreachable(
"Unsupported: Getting the described template declaration"
12417 " for bad deduction diagnosis");
12423 unsigned NumArgs,
bool TakingCandidateAddress,
12431 switch (DeductionFailure.
getResult()) {
12434 "TemplateDeductionResult::Success while diagnosing bad deduction");
12436 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
12437 "while diagnosing bad deduction");
12443 assert(ParamD &&
"no parameter found for incomplete deduction result");
12445 diag::note_ovl_candidate_incomplete_deduction)
12447 MaybeEmitInheritedConstructorNote(S,
Found);
12452 assert(ParamD &&
"no parameter found for incomplete deduction result");
12454 diag::note_ovl_candidate_incomplete_deduction_pack)
12456 << (DeductionFailure.
getFirstArg()->pack_size() + 1)
12458 MaybeEmitInheritedConstructorNote(S,
Found);
12463 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
12481 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
12482 << ParamD->
getDeclName() << Arg << NonCanonParam;
12483 MaybeEmitInheritedConstructorNote(S,
Found);
12488 assert(ParamD &&
"no parameter found for inconsistent deduction result");
12502 diag::note_ovl_candidate_inconsistent_deduction_types)
12505 MaybeEmitInheritedConstructorNote(S,
Found);
12525 diag::note_ovl_candidate_inconsistent_deduction)
12528 MaybeEmitInheritedConstructorNote(S,
Found);
12533 assert(ParamD &&
"no parameter found for invalid explicit arguments");
12536 diag::note_ovl_candidate_explicit_arg_mismatch);
12538 Diag << diag::ExplicitArgMismatchNameKind::Named << ParamD->
getDeclName();
12540 Diag << diag::ExplicitArgMismatchNameKind::Unnamed
12545 Diag << diag::ExplicitArgMismatchReasonKind::Detailed << DiagContent;
12547 Diag << diag::ExplicitArgMismatchReasonKind::Vague;
12550 MaybeEmitInheritedConstructorNote(S,
Found);
12557 TemplateArgString =
" ";
12560 if (TemplateArgString.size() == 1)
12561 TemplateArgString.clear();
12563 diag::note_ovl_candidate_unsatisfied_constraints)
12564 << TemplateArgString;
12567 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
12577 diag::note_ovl_candidate_instantiation_depth);
12578 MaybeEmitInheritedConstructorNote(S,
Found);
12586 TemplateArgString =
" ";
12589 if (TemplateArgString.size() == 1)
12590 TemplateArgString.clear();
12595 if (PDiag && PDiag->second.getDiagID() ==
12596 diag::err_typename_nested_not_found_enable_if) {
12599 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
12600 <<
"'enable_if'" << TemplateArgString;
12605 if (PDiag && PDiag->second.getDiagID() ==
12606 diag::err_typename_nested_not_found_requirement) {
12608 diag::note_ovl_candidate_disabled_by_requirement)
12609 << PDiag->second.getStringArg(0) << TemplateArgString;
12619 SFINAEArgString =
": ";
12621 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
12625 diag::note_ovl_candidate_substitution_failure)
12626 << TemplateArgString << SFINAEArgString << R;
12627 MaybeEmitInheritedConstructorNote(S,
Found);
12637 TemplateArgString =
" ";
12640 if (TemplateArgString.size() == 1)
12641 TemplateArgString.clear();
12644 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
12647 << TemplateArgString
12672 CandidateSetKind ==
12674 ? diag::note_friend_template_non_deduced_mismatch_qualified
12675 : diag::note_ovl_candidate_non_deduced_mismatch_qualified)
12692 ? diag::note_friend_template_non_deduced_mismatch
12693 : diag::note_ovl_candidate_non_deduced_mismatch)
12694 << FirstTA << SecondTA;
12700 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
12701 MaybeEmitInheritedConstructorNote(S,
Found);
12705 diag::note_cuda_ovl_candidate_target_mismatch);
12713 bool TakingCandidateAddress) {
12714 assert(Cand->
Function &&
"Candidate must be a function");
12729 assert(Cand->
Function &&
"Candidate must be a Function.");
12735 std::string FnDesc;
12736 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12737 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
12740 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
12741 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12743 << CalleeTarget << CallerTarget;
12748 if (Meth !=
nullptr && Meth->
isImplicit()) {
12752 switch (FnKindPair.first) {
12755 case oc_implicit_default_constructor:
12758 case oc_implicit_copy_constructor:
12761 case oc_implicit_move_constructor:
12764 case oc_implicit_copy_assignment:
12767 case oc_implicit_move_assignment:
12772 bool ConstRHS =
false;
12776 ConstRHS = RT->getPointeeType().isConstQualified();
12787 assert(Cand->
Function &&
"Candidate must be a function");
12791 S.
Diag(Callee->getLocation(),
12792 diag::note_ovl_candidate_disabled_by_function_cond_attr)
12793 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
12797 assert(Cand->
Function &&
"Candidate must be a function");
12800 assert(ES.
isExplicit() &&
"not an explicit candidate");
12803 switch (Fn->getDeclKind()) {
12804 case Decl::Kind::CXXConstructor:
12807 case Decl::Kind::CXXConversion:
12810 case Decl::Kind::CXXDeductionGuide:
12811 Kind = Fn->isImplicit() ? 0 : 2;
12814 llvm_unreachable(
"invalid Decl");
12823 First = Pattern->getFirstDecl();
12826 diag::note_ovl_candidate_explicit)
12827 << Kind << (ES.
getExpr() ? 1 : 0)
12832 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
12839 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
12841 std::string FunctionProto;
12842 llvm::raw_string_ostream OS(FunctionProto);
12855 "Non-template implicit deduction guides are only possible for "
12858 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12863 assert(
Template &&
"Cannot find the associated function template of "
12864 "CXXDeductionGuideDecl?");
12867 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12888 bool TakingCandidateAddress,
12890 assert(Cand->
Function &&
"Candidate must be a function");
12898 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
12905 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12910 if (Fn->isDeleted()) {
12911 std::string FnDesc;
12912 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12913 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12916 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12917 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12918 << (Fn->isDeleted()
12919 ? (Fn->getCanonicalDecl()->isDeletedAsWritten() ? 1 : 2)
12921 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12948 TakingCandidateAddress);
12951 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12952 << (Fn->getPrimaryTemplate() ? 1 : 0);
12953 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12960 S.
Diag(Fn->getLocation(),
12961 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12962 << QualsForPrinting;
12963 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12974 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
12997 S.
Diag(Fn->getLocation(),
12998 diag::note_ovl_candidate_inherited_constructor_slice)
12999 << (Fn->getPrimaryTemplate() ? 1 : 0)
13000 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
13001 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
13007 assert(!Available);
13015 std::string FnDesc;
13016 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
13017 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
13020 S.
Diag(Fn->getLocation(),
13021 diag::note_ovl_candidate_constraints_not_satisfied)
13022 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
13041 bool isLValueReference =
false;
13042 bool isRValueReference =
false;
13043 bool isPointer =
false;
13047 isLValueReference =
true;
13051 isRValueReference =
true;
13067 diag::note_ovl_surrogate_constraints_not_satisfied)
13081 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
13082 std::string TypeStr(
"operator");
13088 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13093 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13100 if (ICS.
isBad())
break;
13104 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
13121 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
13151 llvm_unreachable(
"Unhandled deduction result");
13156struct CompareOverloadCandidatesForDisplay {
13158 SourceLocation Loc;
13162 CompareOverloadCandidatesForDisplay(
13163 Sema &S, SourceLocation Loc,
size_t NArgs,
13165 : S(S), NumArgs(NArgs), CSK(CSK) {}
13175 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
13177 if (NumArgs < C->
Function->getMinRequiredArguments())
13184 bool operator()(
const OverloadCandidate *L,
13185 const OverloadCandidate *R) {
13187 if (L == R)
return false;
13191 if (!
R->Viable)
return true;
13193 if (
int Ord = CompareConversions(*L, *R))
13196 }
else if (
R->Viable)
13199 assert(L->
Viable ==
R->Viable);
13212 int RDist =
std::abs((
int)
R->getNumParams() - (
int)NumArgs);
13213 if (LDist == RDist) {
13214 if (LFailureKind == RFailureKind)
13222 return LDist < RDist;
13239 unsigned numRFixes =
R->Fix.NumConversionsFixed;
13240 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
13241 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
13242 if (numLFixes != numRFixes) {
13243 return numLFixes < numRFixes;
13247 if (
int Ord = CompareConversions(*L, *R))
13259 if (LRank != RRank)
13260 return LRank < RRank;
13286 struct ConversionSignals {
13287 unsigned KindRank = 0;
13290 static ConversionSignals ForSequence(ImplicitConversionSequence &
Seq) {
13291 ConversionSignals Sig;
13292 Sig.KindRank =
Seq.getKindRank();
13293 if (
Seq.isStandard())
13294 Sig.Rank =
Seq.Standard.getRank();
13295 else if (
Seq.isUserDefined())
13296 Sig.Rank =
Seq.UserDefined.After.getRank();
13302 static ConversionSignals ForObjectArgument() {
13312 int CompareConversions(
const OverloadCandidate &L,
13313 const OverloadCandidate &R) {
13318 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
13320 ? ConversionSignals::ForObjectArgument()
13321 : ConversionSignals::ForSequence(L.Conversions[I]);
13322 auto RS =
R.IgnoreObjectArgument
13323 ? ConversionSignals::ForObjectArgument()
13324 : ConversionSignals::ForSequence(
R.Conversions[I]);
13325 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
13326 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
13351 bool Unfixable =
false;
13357 for (
unsigned ConvIdx =
13361 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
13362 if (Cand->
Conversions[ConvIdx].isInitialized() &&
13371 bool SuppressUserConversions =
false;
13373 unsigned ConvIdx = 0;
13374 unsigned ArgIdx = 0;
13403 assert(ConvCount <= 3);
13409 ConvIdx != ConvCount && ArgIdx < Args.size();
13411 if (Cand->
Conversions[ConvIdx].isInitialized()) {
13413 }
else if (
ParamIdx < ParamTypes.size()) {
13414 if (ParamTypes[
ParamIdx]->isDependentType())
13415 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
13420 SuppressUserConversions,
13425 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
13444 for (
iterator Cand = Candidates.begin(), LastCand = Candidates.end();
13445 Cand != LastCand; ++Cand) {
13446 if (!Filter(*Cand))
13471 Cands.push_back(Cand);
13475 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
13482 bool DeferHint =
false;
13486 auto WrongSidedCands =
13488 return (Cand.
Viable ==
false &&
13494 DeferHint = !WrongSidedCands.empty();
13510 S.
Diag(PD.first, PD.second);
13515 bool NoteCands =
true;
13516 for (
const Expr *Arg : Args) {
13517 if (Arg->getType()->isWebAssemblyTableType())
13526 {Candidates.begin(), Candidates.end()});
13532 bool ReportedAmbiguousConversions =
false;
13535 unsigned CandsShown = 0;
13536 auto I = Cands.begin(), E = Cands.end();
13537 for (; I != E; ++I) {
13553 "Non-viable built-in candidates are not added to Cands.");
13560 if (!ReportedAmbiguousConversions) {
13562 ReportedAmbiguousConversions =
true;
13576 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13581 const Sema &S)
const {
13587 if (Caller && Caller->
hasAttr<CUDAHostAttr>() &&
13588 Caller->
hasAttr<CUDADeviceAttr>())
13609struct CompareTemplateSpecCandidatesForDisplay {
13611 CompareTemplateSpecCandidatesForDisplay(Sema &S) : S(S) {}
13613 bool operator()(
const TemplateSpecCandidate *L,
13614 const TemplateSpecCandidate *R) {
13645 Sema &S,
bool ForTakingAddress,
13652void TemplateSpecCandidateSet::destroyCandidates() {
13654 i->DeductionFailure.Destroy();
13659 destroyCandidates();
13660 Candidates.clear();
13673 Cands.reserve(
size());
13674 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
13675 if (Cand->Specialization)
13676 Cands.push_back(Cand);
13681 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
13688 unsigned CandsShown = 0;
13689 for (I = Cands.begin(), E = Cands.end(); I != E; ++I) {
13695 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
13700 "Non-matching built-in candidates are not added to Cands.");
13705 S.
Diag(Loc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13715 QualType Ret = PossiblyAFunctionType;
13718 Ret = ToTypePtr->getPointeeType();
13721 Ret = ToTypeRef->getPointeeType();
13724 Ret = MemTypePtr->getPointeeType();
13726 Context.getCanonicalType(Ret).getUnqualifiedType();
13731 bool Complain =
true) {
13748class AddressOfFunctionResolver {
13751 const QualType& TargetType;
13752 QualType TargetFunctionType;
13756 ASTContext& Context;
13758 bool TargetTypeIsNonStaticMemberFunction;
13759 bool FoundNonTemplateFunction;
13760 bool StaticMemberFunctionFromBoundPointer;
13761 bool HasComplained;
13763 OverloadExpr::FindResult OvlExprInfo;
13764 OverloadExpr *OvlExpr;
13765 TemplateArgumentListInfo OvlExplicitTemplateArgs;
13766 SmallVector<std::pair<DeclAccessPair, FunctionDecl*>, 4> Matches;
13767 TemplateSpecCandidateSet FailedCandidates;
13770 AddressOfFunctionResolver(Sema &S, Expr *SourceExpr,
13771 const QualType &TargetType,
bool Complain)
13772 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
13773 Complain(Complain), Context(S.getASTContext()),
13774 TargetTypeIsNonStaticMemberFunction(
13775 !!TargetType->getAs<MemberPointerType>()),
13776 FoundNonTemplateFunction(
false),
13777 StaticMemberFunctionFromBoundPointer(
false),
13778 HasComplained(
false),
13779 OvlExprInfo(OverloadExpr::find(SourceExpr)),
13781 FailedCandidates(OvlExpr->getNameLoc(),
true) {
13782 ExtractUnqualifiedFunctionTypeFromTargetType();
13785 if (UnresolvedMemberExpr *UME = dyn_cast<UnresolvedMemberExpr>(OvlExpr))
13786 if (!UME->isImplicitAccess() &&
13788 StaticMemberFunctionFromBoundPointer =
true;
13790 DeclAccessPair dap;
13792 OvlExpr,
false, &dap)) {
13793 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn))
13794 if (!
Method->isStatic()) {
13798 TargetTypeIsNonStaticMemberFunction =
true;
13806 Matches.push_back(std::make_pair(dap, Fn));
13814 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
13816 EliminateSuboptimalCudaMatches();
13820 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
13821 if (FoundNonTemplateFunction) {
13822 EliminateAllTemplateMatches();
13823 EliminateLessPartialOrderingConstrainedMatches();
13825 EliminateAllExceptMostSpecializedTemplate();
13830 bool hasComplained()
const {
return HasComplained; }
13833 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
13840 bool isBetterCandidate(
const FunctionDecl *A,
const FunctionDecl *B) {
13844 return candidateHasExactlyCorrectType(A) &&
13845 (!candidateHasExactlyCorrectType(B) ||
13851 bool eliminiateSuboptimalOverloadCandidates() {
13854 auto Best = Matches.begin();
13855 for (
auto I = Matches.begin()+1, E = Matches.end(); I != E; ++I)
13856 if (isBetterCandidate(I->second, Best->second))
13859 const FunctionDecl *BestFn = Best->second;
13860 auto IsBestOrInferiorToBest = [
this, BestFn](
13861 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
13862 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
13867 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
13869 Matches[0] = *Best;
13874 bool isTargetTypeAFunction()
const {
13883 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
13889 const DeclAccessPair& CurAccessFunPair) {
13890 if (CXXMethodDecl *
Method
13894 bool CanConvertToFunctionPointer =
13895 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13896 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13899 else if (TargetTypeIsNonStaticMemberFunction)
13909 TemplateDeductionInfo Info(FailedCandidates.
getLocation());
13913 Result != TemplateDeductionResult::Success) {
13931 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
13935 bool AddMatchingNonTemplateFunction(NamedDecl* Fn,
13936 const DeclAccessPair& CurAccessFunPair) {
13937 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn)) {
13940 bool CanConvertToFunctionPointer =
13941 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13942 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13945 else if (TargetTypeIsNonStaticMemberFunction)
13948 if (FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13955 if (FunDecl->isMultiVersion()) {
13956 const auto *TA = FunDecl->getAttr<TargetAttr>();
13957 if (TA && !TA->isDefaultVersion())
13959 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13960 if (TVA && !TVA->isDefaultVersion())
13968 HasComplained |= Complain;
13977 candidateHasExactlyCorrectType(FunDecl)) {
13978 Matches.push_back(std::make_pair(
13980 FoundNonTemplateFunction =
true;
13988 bool FindAllFunctionsThatMatchTargetTypeExactly() {
13993 if (IsInvalidFormOfPointerToMemberFunction())
13996 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
14000 NamedDecl *
Fn = (*I)->getUnderlyingDecl();
14009 = dyn_cast<FunctionTemplateDecl>(Fn)) {
14015 AddMatchingNonTemplateFunction(Fn, I.getPair()))
14018 assert(Ret || Matches.empty());
14022 void EliminateAllExceptMostSpecializedTemplate() {
14034 UnresolvedSet<4> MatchesCopy;
14035 for (
unsigned I = 0, E = Matches.size(); I != E; ++I)
14036 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
14041 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
14043 S.
PDiag(diag::err_addr_ovl_ambiguous)
14044 << Matches[0].second->getDeclName(),
14045 S.
PDiag(diag::note_ovl_candidate)
14046 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
14047 Complain, TargetFunctionType);
14051 Matches[0].first = Matches[
Result - MatchesCopy.
begin()].first;
14055 HasComplained |= Complain;
14058 void EliminateAllTemplateMatches() {
14061 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
14062 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
14065 Matches[I] = Matches[--N];
14071 void EliminateLessPartialOrderingConstrainedMatches() {
14076 assert(Matches[0].second->getPrimaryTemplate() ==
nullptr &&
14077 "Call EliminateAllTemplateMatches() first");
14078 SmallVector<std::pair<DeclAccessPair, FunctionDecl *>, 4> Results;
14079 Results.push_back(Matches[0]);
14080 for (
unsigned I = 1, N = Matches.size(); I < N; ++I) {
14081 assert(Matches[I].second->getPrimaryTemplate() ==
nullptr);
14083 S, Matches[I].second, Results[0].second,
14087 Results.push_back(Matches[I]);
14090 if (F == Matches[I].second) {
14092 Results.push_back(Matches[I]);
14095 std::swap(Matches, Results);
14098 void EliminateSuboptimalCudaMatches() {
14104 void ComplainNoMatchesFound()
const {
14105 assert(Matches.empty());
14107 << OvlExpr->
getName() << TargetFunctionType
14109 if (FailedCandidates.
empty())
14116 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
14119 if (FunctionDecl *Fun =
14120 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
14128 bool IsInvalidFormOfPointerToMemberFunction()
const {
14129 return TargetTypeIsNonStaticMemberFunction &&
14133 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
14141 bool IsStaticMemberFunctionFromBoundPointer()
const {
14142 return StaticMemberFunctionFromBoundPointer;
14145 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
14147 diag::err_invalid_form_pointer_member_function)
14151 void ComplainOfInvalidConversion()
const {
14153 << OvlExpr->
getName() << TargetType;
14156 void ComplainMultipleMatchesFound()
const {
14157 assert(Matches.size() > 1);
14164 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
14166 int getNumMatches()
const {
return Matches.size(); }
14168 FunctionDecl* getMatchingFunctionDecl()
const {
14169 if (Matches.size() != 1)
return nullptr;
14170 return Matches[0].second;
14173 const DeclAccessPair* getMatchingFunctionAccessPair()
const {
14174 if (Matches.size() != 1)
return nullptr;
14175 return &Matches[0].first;
14185 bool *pHadMultipleCandidates) {
14188 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
14190 int NumMatches = Resolver.getNumMatches();
14192 bool ShouldComplain = Complain && !Resolver.hasComplained();
14193 if (NumMatches == 0 && ShouldComplain) {
14194 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
14195 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
14197 Resolver.ComplainNoMatchesFound();
14199 else if (NumMatches > 1 && ShouldComplain)
14200 Resolver.ComplainMultipleMatchesFound();
14201 else if (NumMatches == 1) {
14202 Fn = Resolver.getMatchingFunctionDecl();
14206 FoundResult = *Resolver.getMatchingFunctionAccessPair();
14208 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
14209 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
14215 if (pHadMultipleCandidates)
14216 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
14224 bool IsResultAmbiguous =
false;
14232 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
14233 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
14240 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
14248 auto FoundBetter = [&]() {
14249 IsResultAmbiguous =
false;
14261 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
14263 if (PreferenceByCUDA != 0) {
14265 if (PreferenceByCUDA > 0)
14281 if (MoreConstrained != FD) {
14282 if (!MoreConstrained) {
14283 IsResultAmbiguous =
true;
14284 AmbiguousDecls.push_back(FD);
14293 if (IsResultAmbiguous)
14314 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
14316 assert(E->
getType() ==
Context.OverloadTy &&
"SrcExpr must be an overload");
14320 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
14321 Found->isCPUSpecificMultiVersion())
14369 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
14400 if (ForTypeDeduction &&
14414 if (FoundResult) *FoundResult = I.getPair();
14425 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
14427 unsigned DiagIDForComplaining) {
14448 if (!complain)
return false;
14451 diag::err_bound_member_function)
14464 SingleFunctionExpression =
14468 if (doFunctionPointerConversion) {
14469 SingleFunctionExpression =
14471 if (SingleFunctionExpression.
isInvalid()) {
14478 if (!SingleFunctionExpression.
isUsable()) {
14480 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
14482 << DestTypeForComplaining
14483 << OpRangeForComplaining
14494 SrcExpr = SingleFunctionExpression;
14504 bool PartialOverloading,
14511 if (ExplicitTemplateArgs) {
14512 assert(!KnownValid &&
"Explicit template arguments?");
14521 PartialOverloading);
14526 = dyn_cast<FunctionTemplateDecl>(Callee)) {
14528 ExplicitTemplateArgs, Args, CandidateSet,
14530 PartialOverloading);
14534 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
14540 bool PartialOverloading) {
14563 assert(!(*I)->getDeclContext()->isRecord());
14565 !(*I)->getDeclContext()->isFunctionOrMethod());
14566 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
14576 ExplicitTemplateArgs = &TABuffer;
14582 CandidateSet, PartialOverloading,
14587 Args, ExplicitTemplateArgs,
14588 CandidateSet, PartialOverloading);
14596 CandidateSet,
false,
false);
14603 case OO_New:
case OO_Array_New:
14604 case OO_Delete:
case OO_Array_Delete:
14627 if (DC->isTransparentContext())
14633 R.suppressDiagnostics();
14643 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
14648 if (FoundInClass) {
14649 *FoundInClass = RD;
14652 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
14669 AssociatedNamespaces,
14670 AssociatedClasses);
14674 for (Sema::AssociatedNamespaceSet::iterator
14675 it = AssociatedNamespaces.begin(),
14676 end = AssociatedNamespaces.end(); it !=
end; ++it) {
14688 SuggestedNamespaces.insert(*it);
14692 SemaRef.
Diag(R.getNameLoc(), diag::err_not_found_by_two_phase_lookup)
14693 << R.getLookupName();
14694 if (SuggestedNamespaces.empty()) {
14695 SemaRef.
Diag(Best->Function->getLocation(),
14696 diag::note_not_found_by_two_phase_lookup)
14697 << R.getLookupName() << 0;
14698 }
else if (SuggestedNamespaces.size() == 1) {
14699 SemaRef.
Diag(Best->Function->getLocation(),
14700 diag::note_not_found_by_two_phase_lookup)
14701 << R.getLookupName() << 1 << *SuggestedNamespaces.begin();
14706 SemaRef.
Diag(Best->Function->getLocation(),
14707 diag::note_not_found_by_two_phase_lookup)
14708 << R.getLookupName() << 2;
14739class BuildRecoveryCallExprRAII {
14741 Sema::SatisfactionStackResetRAII SatStack;
14744 BuildRecoveryCallExprRAII(Sema &S) : SemaRef(S), SatStack(S) {
14766 bool EmptyLookup,
bool AllowTypoCorrection) {
14774 BuildRecoveryCallExprRAII RCE(SemaRef);
14784 ExplicitTemplateArgs = &TABuffer;
14792 ExplicitTemplateArgs, Args, &FoundInClass)) {
14794 }
else if (EmptyLookup) {
14799 ExplicitTemplateArgs !=
nullptr,
14800 dyn_cast<MemberExpr>(Fn));
14802 AllowTypoCorrection
14808 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
14823 assert(!R.empty() &&
"lookup results empty despite recovery");
14826 if (R.isAmbiguous()) {
14827 R.suppressDiagnostics();
14834 if ((*R.begin())->isCXXClassMember())
14836 ExplicitTemplateArgs, S);
14837 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
14839 ExplicitTemplateArgs);
14863 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
14870 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
14872 llvm_unreachable(
"performing ADL for builtin");
14879 UnbridgedCastsSet UnbridgedCasts;
14894 if (CandidateSet->
empty() ||
14910 if (CandidateSet->
empty())
14913 UnbridgedCasts.restore();
14920 std::optional<QualType>
Result;
14940 if (Best && *Best != CS.
end())
14941 ConsiderCandidate(**Best);
14944 for (
const auto &
C : CS)
14946 ConsiderCandidate(
C);
14949 for (
const auto &
C : CS)
14950 ConsiderCandidate(
C);
14955 if (
Value.isNull() ||
Value->isUndeducedType())
14972 bool AllowTypoCorrection) {
14973 switch (OverloadResult) {
14984 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14990 if (*Best != CandidateSet->
end() &&
14994 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
14999 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
15009 CandidateSet->
empty(),
15010 AllowTypoCorrection);
15017 for (
const Expr *Arg : Args) {
15018 if (!Arg->getType()->isFunctionType())
15020 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
15021 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
15024 Arg->getExprLoc()))
15032 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
15033 << ULE->
getName() << Fn->getSourceRange()),
15041 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
15042 << ULE->
getName() << Fn->getSourceRange()),
15049 Fn->getSourceRange(), ULE->
getName(),
15050 *CandidateSet, FDecl, Args);
15059 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
15067 SubExprs.append(Args.begin(), Args.end());
15074 for (
auto I = CS.
begin(), E = CS.
end(); I != E; ++I) {
15089 bool AllowTypoCorrection,
15090 bool CalleesAddressIsTaken) {
15105 if (CalleesAddressIsTaken)
15116 Best != CandidateSet.
end()) {
15117 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
15118 M && M->isImplicitObjectMemberFunction()) {
15129 CUDA().recordPotentialODRUsedVariable(Args, CandidateSet);
15147 if (
const auto *TP =
15157 ExecConfig, &CandidateSet, &Best,
15158 OverloadResult, AllowTypoCorrection);
15167 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
15173 bool HadMultipleCandidates) {
15183 if (
Method->isExplicitObjectMemberFunction())
15187 E, std::nullopt, FoundDecl,
Method);
15191 if (
Method->getParent()->isLambda() &&
15192 Method->getConversionType()->isBlockPointerType()) {
15196 auto *CE = dyn_cast<CastExpr>(SubE);
15197 if (CE && CE->getCastKind() == CK_NoOp)
15198 SubE = CE->getSubExpr();
15200 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
15201 SubE = BE->getSubExpr();
15224 if (
Method->isExplicitObjectMemberFunction()) {
15230 Expr *ObjectParam = Exp.
get();
15244 Exp.
get()->getEndLoc(),
15259 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15276 Expr *Input,
bool PerformADL) {
15278 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15286 Expr *Args[2] = { Input,
nullptr };
15287 unsigned NumArgs = 1;
15292 if (Opc == UO_PostInc || Opc == UO_PostDec) {
15306 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
15317 if (Fn.isInvalid())
15328 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15347 if (
Method->isExplicitObjectMemberFunction())
15351 Input, std::nullopt, Best->FoundDecl,
Method);
15354 Base = Input = InputInit.
get();
15365 Input = InputInit.
get();
15370 Base, HadMultipleCandidates,
15382 Context, Op, FnExpr.
get(), ArgsArray, ResultTy,
VK, OpLoc,
15398 Input, Best->BuiltinParamTypes[0], Best->Conversions[0],
15403 Input = InputRes.
get();
15423 PDiag(diag::err_ovl_ambiguous_oper_unary)
15440 << (Msg !=
nullptr)
15441 << (Msg ? Msg->
getString() : StringRef())
15494 if (Op != OO_Equal && PerformADL) {
15501 Context.DeclarationNames.getCXXOperatorName(ExtraOp);
15527 Expr *RHS,
bool PerformADL,
15528 bool AllowRewrittenCandidates,
15530 Expr *Args[2] = { LHS, RHS };
15534 AllowRewrittenCandidates =
false;
15540 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
15561 if (Fn.isInvalid())
15570 if (Opc == BO_PtrMemD) {
15571 auto CheckPlaceholder = [&](
Expr *&Arg) {
15580 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
15604 if (Opc == BO_Assign &&
15613 Op, OpLoc, AllowRewrittenCandidates));
15615 CandidateSet.
exclude(DefaultedFn);
15618 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15627 bool IsReversed = Best->isReversed();
15629 std::swap(Args[0], Args[1]);
15646 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
15650 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
15651 : diag::err_ovl_rewrite_equalequal_not_bool)
15659 if (AllowRewrittenCandidates && !IsReversed &&
15669 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
15672 Best->Conversions[ArgIdx]) ==
15674 AmbiguousWith.push_back(Cand.
Function);
15681 if (!AmbiguousWith.empty()) {
15682 bool AmbiguousWithSelf =
15683 AmbiguousWith.size() == 1 &&
15685 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
15687 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
15689 if (AmbiguousWithSelf) {
15691 diag::note_ovl_ambiguous_oper_binary_reversed_self);
15696 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
15697 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
15699 !MD->hasCXXExplicitFunctionObjectParameter() &&
15700 Context.hasSameUnqualifiedType(
15701 MD->getFunctionObjectParameterType(),
15702 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
15703 Context.hasSameUnqualifiedType(
15704 MD->getFunctionObjectParameterType(),
15706 Context.hasSameUnqualifiedType(
15707 MD->getFunctionObjectParameterType(),
15710 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
15713 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
15714 for (
auto *F : AmbiguousWith)
15716 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
15724 if (Op == OO_Equal)
15735 if (
Method->isExplicitObjectMemberFunction()) {
15740 Args[0], std::nullopt, Best->FoundDecl,
Method);
15773 Best->FoundDecl,
Base,
15774 HadMultipleCandidates, OpLoc);
15785 const Expr *ImplicitThis =
nullptr;
15790 Context, ChosenOp, FnExpr.
get(), Args, ResultTy,
VK, OpLoc,
15795 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(FnDecl);
15798 ImplicitThis = ArgsArray[0];
15799 ArgsArray = ArgsArray.slice(1);
15806 if (Op == OO_Equal) {
15811 *
this,
AssignedEntity{Args[0], dyn_cast<CXXMethodDecl>(FnDecl)},
15814 if (ImplicitThis) {
15819 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
15823 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
15838 (Op == OO_Spaceship && IsReversed)) {
15839 if (Op == OO_ExclaimEqual) {
15840 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
15843 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
15845 Expr *ZeroLiteral =
15854 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.get(),
15855 IsReversed ? R.get() : ZeroLiteral,
true,
15863 assert(ChosenOp == Op &&
"unexpected operator name");
15867 if (Best->RewriteKind !=
CRK_None)
15876 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15881 Args[0] = ArgsRes0.
get();
15884 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15889 Args[1] = ArgsRes1.
get();
15899 if (Opc == BO_Comma)
15904 if (DefaultedFn && Opc == BO_Cmp) {
15906 Args[1], DefaultedFn);
15921 Opc >= BO_Assign && Opc <= BO_OrAssign) {
15922 Diag(OpLoc, diag::err_ovl_no_viable_oper)
15925 if (Args[0]->
getType()->isIncompleteType()) {
15926 Diag(OpLoc, diag::note_assign_lhs_incomplete)
15942 assert(
Result.isInvalid() &&
15943 "C++ binary operator overloading is missing candidates!");
15954 << Args[0]->getSourceRange()
15955 << Args[1]->getSourceRange()),
15966 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
15970 Diag(OpLoc, diag::err_ovl_deleted_comparison)
15971 << Args[0]->
getType() << DeletedFD;
15984 PDiag(diag::err_ovl_deleted_oper)
15986 .getCXXOverloadedOperator())
15987 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
15988 << Args[0]->getSourceRange() << Args[1]->getSourceRange()),
16012 "cannot use prvalue expressions more than once");
16013 Expr *OrigLHS = LHS;
16014 Expr *OrigRHS = RHS;
16031 true, DefaultedFn);
16032 if (
Less.isInvalid())
16059 for (; I >= 0; --I) {
16061 auto *VI = Info->lookupValueInfo(Comparisons[I].
Result);
16084 Context, OrigLHS, OrigRHS, BO_Cmp,
Result.get()->getType(),
16085 Result.get()->getValueKind(),
Result.get()->getObjectKind(), OpLoc,
16087 Expr *SemanticForm[] = {LHS, RHS,
Result.get()};
16097 unsigned NumArgsSlots =
16098 MethodArgs.size() + std::max<unsigned>(Args.size(), NumParams);
16101 MethodArgs.reserve(MethodArgs.size() + NumArgsSlots);
16102 bool IsError =
false;
16105 for (
unsigned i = 0; i != NumParams; i++) {
16107 if (i < Args.size()) {
16111 S.
Context, Method->getParamDecl(i)),
16125 MethodArgs.push_back(Arg);
16135 Args.push_back(
Base);
16136 for (
auto *e : ArgExpr) {
16140 Context.DeclarationNames.getCXXOperatorName(OO_Subscript);
16145 ArgExpr.back()->getEndLoc());
16157 if (Fn.isInvalid())
16167 UnbridgedCastsSet UnbridgedCasts;
16180 if (Args.size() == 2)
16183 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16203 if (
Method->isExplicitObjectMemberFunction()) {
16208 Args[0] = Res.
get();
16212 Args[0], std::nullopt, Best->FoundDecl,
Method);
16216 MethodArgs.push_back(Arg0.
get());
16220 *
this, MethodArgs,
Method, ArgExpr, LLoc);
16228 *
this, FnDecl, Best->FoundDecl,
Base, HadMultipleCandidates,
16239 Context, OO_Subscript, FnExpr.
get(), MethodArgs, ResultTy,
VK, RLoc,
16256 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
16261 Args[0] = ArgsRes0.
get();
16264 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
16269 Args[1] = ArgsRes1.
get();
16277 CandidateSet.
empty()
16278 ? (
PDiag(diag::err_ovl_no_oper)
16279 << Args[0]->getType() << 0
16280 << Args[0]->getSourceRange() << Range)
16281 : (
PDiag(diag::err_ovl_no_viable_subscript)
16282 << Args[0]->getType() << Args[0]->getSourceRange() << Range);
16289 if (Args.size() == 2) {
16292 LLoc,
PDiag(diag::err_ovl_ambiguous_oper_binary)
16294 << Args[0]->getSourceRange() << Range),
16299 PDiag(diag::err_ovl_ambiguous_subscript_call)
16301 << Args[0]->getSourceRange() << Range),
16310 PDiag(diag::err_ovl_deleted_oper)
16311 <<
"[]" << (Msg !=
nullptr)
16312 << (Msg ? Msg->
getString() : StringRef())
16313 << Args[0]->getSourceRange() << Range),
16327 Expr *ExecConfig,
bool IsExecConfig,
16328 bool AllowRecovery) {
16337 if (
BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
16338 assert(op->getType() ==
Context.BoundMemberTy);
16339 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
16352 QualType objectType = op->getLHS()->getType();
16353 if (op->getOpcode() == BO_PtrMemI)
16357 Qualifiers difference = objectQuals - funcQuals;
16361 std::string qualsString = difference.
getAsString();
16362 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
16365 << (qualsString.find(
' ') == std::string::npos ? 1 : 2);
16369 Context, MemExprE, Args, resultType, valueKind, RParenLoc,
16379 if (CheckOtherCall(call, proto))
16389 if (!AllowRecovery)
16391 std::vector<Expr *> SubExprs = {MemExprE};
16392 llvm::append_range(SubExprs, Args);
16400 UnbridgedCastsSet UnbridgedCasts;
16406 bool HadMultipleCandidates =
false;
16414 UnbridgedCasts.restore();
16432 TemplateArgs = &TemplateArgsBuffer;
16436 E = UnresExpr->
decls_end(); I != E; ++I) {
16438 QualType ExplicitObjectType = ObjectType;
16445 bool HasExplicitParameter =
false;
16446 if (
const auto *M = dyn_cast<FunctionDecl>(
Func);
16447 M && M->hasCXXExplicitFunctionObjectParameter())
16448 HasExplicitParameter =
true;
16449 else if (
const auto *M = dyn_cast<FunctionTemplateDecl>(
Func);
16451 M->getTemplatedDecl()->hasCXXExplicitFunctionObjectParameter())
16452 HasExplicitParameter =
true;
16454 if (HasExplicitParameter)
16462 }
else if ((
Method = dyn_cast<CXXMethodDecl>(
Func))) {
16469 ObjectClassification, Args, CandidateSet,
16473 I.getPair(), ActingDC, TemplateArgs,
16474 ExplicitObjectType, ObjectClassification,
16475 Args, CandidateSet,
16480 HadMultipleCandidates = (CandidateSet.
size() > 1);
16484 UnbridgedCasts.restore();
16487 bool Succeeded =
false;
16492 FoundDecl = Best->FoundDecl;
16512 PDiag(diag::err_ovl_no_viable_member_function_in_call)
16519 PDiag(diag::err_ovl_ambiguous_member_call)
16526 CandidateSet, Best->Function, Args,
true);
16537 MemExprE = Res.
get();
16541 if (
Method->isStatic()) {
16543 ExecConfig, IsExecConfig);
16553 assert(
Method &&
"Member call to something that isn't a method?");
16558 if (
Method->isExplicitObjectMemberFunction()) {
16566 HadMultipleCandidates, MemExpr->
getExprLoc());
16573 TheCall->setUsesMemberSyntax(
true);
16583 Proto->getNumParams());
16589 return BuildRecoveryExpr(ResultType);
16594 return BuildRecoveryExpr(ResultType);
16604 if (
auto *MemE = dyn_cast<MemberExpr>(NakedMemExpr)) {
16605 if (
const EnableIfAttr *
Attr =
16607 Diag(MemE->getMemberLoc(),
16608 diag::err_ovl_no_viable_member_function_in_call)
16611 diag::note_ovl_candidate_disabled_by_function_cond_attr)
16612 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
16618 TheCall->getDirectCallee()->isPureVirtual()) {
16624 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
16635 if (
auto *DD = dyn_cast<CXXDestructorDecl>(TheCall->getDirectCallee())) {
16639 CallCanBeVirtual,
true,
16644 TheCall->getDirectCallee());
16656 UnbridgedCastsSet UnbridgedCasts;
16660 assert(
Object.get()->getType()->isRecordType() &&
16661 "Requires object type argument");
16675 diag::err_incomplete_object_call,
Object.get()))
16678 auto *
Record =
Object.get()->getType()->castAsCXXRecordDecl();
16681 R.suppressAccessDiagnostics();
16684 Oper != OperEnd; ++Oper) {
16698 bool IgnoreSurrogateFunctions =
false;
16701 if (!Candidate.
Viable &&
16703 IgnoreSurrogateFunctions =
true;
16725 !IgnoreSurrogateFunctions && I != E; ++I) {
16747 Object.get(), Args, CandidateSet);
16752 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16765 CandidateSet.
empty()
16766 ? (
PDiag(diag::err_ovl_no_oper)
16767 <<
Object.get()->getType() << 1
16768 <<
Object.get()->getSourceRange())
16769 : (
PDiag(diag::err_ovl_no_viable_object_call)
16770 <<
Object.get()->getType() <<
Object.get()->getSourceRange());
16777 if (!R.isAmbiguous())
16780 PDiag(diag::err_ovl_ambiguous_object_call)
16781 <<
Object.get()->getType()
16782 <<
Object.get()->getSourceRange()),
16793 PDiag(diag::err_ovl_deleted_object_call)
16794 <<
Object.get()->getType() << (Msg !=
nullptr)
16795 << (Msg ? Msg->
getString() : StringRef())
16796 <<
Object.get()->getSourceRange()),
16802 if (Best == CandidateSet.
end())
16805 UnbridgedCasts.restore();
16807 if (Best->Function ==
nullptr) {
16812 Best->Conversions[0].UserDefined.ConversionFunction);
16818 assert(Conv == Best->FoundDecl.getDecl() &&
16819 "Found Decl & conversion-to-functionptr should be same, right?!");
16827 Conv, HadMultipleCandidates);
16828 if (
Call.isInvalid())
16832 Context,
Call.get()->getType(), CK_UserDefinedConversion,
Call.get(),
16846 if (
Method->isInvalidDecl())
16853 Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc);
16856 Obj, HadMultipleCandidates,
16863 MethodArgs.reserve(NumParams + 1);
16865 bool IsError =
false;
16869 if (
Method->isExplicitObjectMemberFunction()) {
16878 MethodArgs.push_back(
Object.get());
16882 *
this, MethodArgs,
Method, Args, LParenLoc);
16885 if (Proto->isVariadic()) {
16887 for (
unsigned i = NumParams, e = Args.size(); i < e; i++) {
16891 MethodArgs.push_back(Arg.
get());
16906 Context, OO_Call, NewFn.
get(), MethodArgs, ResultTy,
VK, RParenLoc,
16920 bool *NoArrowOperatorFound) {
16921 assert(
Base->getType()->isRecordType() &&
16922 "left-hand side must have class type");
16936 Context.DeclarationNames.getCXXOperatorName(OO_Arrow);
16940 diag::err_typecheck_incomplete_tag,
Base))
16945 R.suppressAccessDiagnostics();
16948 Oper != OperEnd; ++Oper) {
16954 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16965 if (CandidateSet.
empty()) {
16967 if (NoArrowOperatorFound) {
16970 *NoArrowOperatorFound =
true;
16973 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
16974 << BaseType <<
Base->getSourceRange();
16975 if (BaseType->isRecordType() && !BaseType->isPointerType()) {
16976 Diag(OpLoc, diag::note_typecheck_member_reference_suggestion)
16980 Diag(OpLoc, diag::err_ovl_no_viable_oper)
16981 <<
"operator->" <<
Base->getSourceRange();
16986 if (!R.isAmbiguous())
16989 <<
"->" <<
Base->getType()
16990 <<
Base->getSourceRange()),
16998 <<
"->" << (Msg !=
nullptr)
16999 << (Msg ? Msg->
getString() : StringRef())
17000 <<
Base->getSourceRange()),
17011 if (
Method->isExplicitObjectMemberFunction()) {
17018 Base, std::nullopt, Best->FoundDecl,
Method);
17026 Base, HadMultipleCandidates, OpLoc);
17060 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
17073 PDiag(diag::err_ovl_no_viable_function_in_call)
17074 << R.getLookupName()),
17081 << R.getLookupName()),
17088 nullptr, HadMultipleCandidates,
17091 if (Fn.isInvalid())
17097 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
17103 ConvArgs[ArgIdx] = InputInit.
get();
17130 Scope *S =
nullptr;
17133 if (!MemberLookup.
empty()) {
17160 if (CandidateSet->
empty() || CandidateSetError) {
17173 Loc,
nullptr, CandidateSet, &Best,
17186 if (
ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
17191 if (SubExpr.
get() == PE->getSubExpr())
17195 ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.
get());
17203 assert(
Context.hasSameType(ICE->getSubExpr()->getType(),
17205 "Implicit cast type cannot be determined from overload");
17206 assert(ICE->path_empty() &&
"fixing up hierarchy conversion?");
17207 if (SubExpr.
get() == ICE->getSubExpr())
17215 if (
auto *GSE = dyn_cast<GenericSelectionExpr>(E)) {
17216 if (!GSE->isResultDependent()) {
17221 if (SubExpr.
get() == GSE->getResultExpr())
17228 unsigned ResultIdx = GSE->getResultIndex();
17229 AssocExprs[ResultIdx] = SubExpr.
get();
17231 if (GSE->isExprPredicate())
17233 Context, GSE->getGenericLoc(), GSE->getControllingExpr(),
17234 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17235 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17238 Context, GSE->getGenericLoc(), GSE->getControllingType(),
17239 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17240 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17249 assert(UnOp->getOpcode() == UO_AddrOf &&
17250 "Can only take the address of an overloaded function");
17252 if (!
Method->isImplicitObjectMemberFunction()) {
17263 if (SubExpr.
get() == UnOp->getSubExpr())
17271 "fixed to something other than a decl ref");
17274 assert(Qualifier &&
17275 "fixed to a member ref with no nested name qualifier");
17281 Fn->getType(), Qualifier,
17284 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
17289 UnOp->getOperatorLoc(),
false,
17297 if (SubExpr.
get() == UnOp->getSubExpr())
17310 if (ULE->hasExplicitTemplateArgs()) {
17311 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
17312 TemplateArgs = &TemplateArgsBuffer;
17317 getLangOpts().CPlusPlus && !Fn->hasCXXExplicitFunctionObjectParameter()
17322 if (
unsigned BID = Fn->getBuiltinID()) {
17323 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
17330 Fn,
Type, ValueKind, ULE->getNameInfo(), ULE->getQualifierLoc(),
17331 Found.getDecl(), ULE->getTemplateKeywordLoc(), TemplateArgs);
17339 if (MemExpr->hasExplicitTemplateArgs()) {
17340 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
17341 TemplateArgs = &TemplateArgsBuffer;
17348 if (MemExpr->isImplicitAccess()) {
17351 Fn, Fn->getType(),
VK_LValue, MemExpr->getNameInfo(),
17352 MemExpr->getQualifierLoc(),
Found.getDecl(),
17353 MemExpr->getTemplateKeywordLoc(), TemplateArgs);
17358 if (MemExpr->getQualifier())
17359 Loc = MemExpr->getQualifierLoc().getBeginLoc();
17364 Base = MemExpr->getBase();
17370 type = Fn->getType();
17377 Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),
17378 MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn,
Found,
17379 true, MemExpr->getMemberNameInfo(),
17383 llvm_unreachable(
"Invalid reference to overloaded function");
17394 if (!PartialOverloading || !
Function)
17398 if (
const auto *Proto =
17399 dyn_cast<FunctionProtoType>(
Function->getFunctionType()))
17400 if (Proto->isTemplateVariadic())
17402 if (
auto *Pattern =
Function->getTemplateInstantiationPattern())
17403 if (
const auto *Proto =
17404 dyn_cast<FunctionProtoType>(Pattern->getFunctionType()))
17405 if (Proto->isTemplateVariadic())
17418 << IsMember << Name << (Msg !=
nullptr)
17419 << (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.
Result
Implement __builtin_bit_cast and related operations.
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 AMDGPU.
This file declares semantic analysis functions specific to ARM.
static AccessResult DeduceTemplateArguments(Sema &S, FriendTemplateDecl *FTD, DeclContext *DC, const TemplateSpecializationType *TST, ArrayRef< TemplateParameterList * > TPLs, TemplateSpecCandidateSet *FailedTSC, MultiLevelTemplateArgumentList &DeducedArgs)
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 void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, DeductionFailureInfo &DeductionFailure, unsigned NumArgs, bool TakingCandidateAddress, TemplateSpecCandidateSetKind CandidateSetKind=TemplateSpecCandidateSetKind::Normal)
Diagnose a failed template-argument deduction.
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 bool tryOverflowBehaviorTypeConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
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 ImplicitConversionSequence::CompareKind CompareOverflowBehaviorConversions(Sema &S, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareOverflowBehaviorConversions - Compares two standard conversion sequences to determine whether ...
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 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)
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
CanQualType getLogicalOperationType() const
The result type of logical operations, '<', '>', '!=', etc.
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.
bool areCompatibleOverflowBehaviorTypes(QualType LHS, QualType RHS)
Return true if two OverflowBehaviorTypes are compatible for assignment.
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, bool IsReversed=false)
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 isHLSLBuiltinRecord() const
Returns true if the class is a built-in HLSL record.
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.
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
EnumDecl * getDefinitionOrSelf() const
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(const 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.
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
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.
For a defaulted function, the kind of defaulted function that it is.
CXXSpecialMemberKind asSpecialMember() const
bool isComparison() const
bool isSpecialMember() const
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.
DefaultedFunctionKind getDefaultedFunctionKind() const
Determine the kind of defaulting that would be done for a given function.
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isTargetMultiVersionDefault() const
True if this function is the default version of a multiversioned dispatch function as a part of the t...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
unsigned getNumParams() const
Qualifiers getMethodQuals() const
QualType getParamType(unsigned i) const
bool isVariadic() const
Whether this function prototype is variadic.
ArrayRef< QualType > param_types() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
A class which abstracts out some details necessary for making a call.
ExtInfo withNoReturn(bool noReturn) const
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
CallingConv getCallConv() const
QualType getReturnType() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
One of these records is kept for each identifier that is lexed.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
void dump() const
dump - Print this implicit conversion sequence to standard error.
bool isUserDefined() const
@ StaticObjectArgumentConversion
StandardConversionSequence Standard
When ConversionKind == StandardConversion, provides the details of the standard conversion sequence.
void setBad(BadConversionSequence::FailureKind Failure, Expr *FromExpr, QualType ToType)
Sets this sequence as a bad conversion for an explicit argument.
UserDefinedConversionSequence UserDefined
When ConversionKind == UserDefinedConversion, provides the details of the user-defined conversion seq...
static ImplicitConversionSequence getNullptrToBool(QualType SourceType, QualType DestType, bool NeedLValToRVal)
Form an "implicit" conversion sequence from nullptr_t to bool, for a direct-initialization of a bool ...
AmbiguousConversionSequence Ambiguous
When ConversionKind == AmbiguousConversion, provides the details of the ambiguous conversion.
bool hasInitializerListContainerType() const
unsigned getKindRank() const
Return a ranking of the implicit conversion sequence kind, where smaller ranks represent better conve...
bool isInitializerListOfIncompleteArray() const
BadConversionSequence Bad
When ConversionKind == BadConversion, provides the details of the bad conversion.
QualType getInitializerListContainerType() const
void DiagnoseAmbiguousConversion(Sema &S, SourceLocation CaretLoc, const PartialDiagnostic &PDiag) const
Diagnoses an ambiguous conversion.
Describes an C or C++ initializer list.
bool hasDesignatedInit() const
Determine whether this initializer list contains a designated initializer.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
const Expr * getInit(unsigned Init) const
SourceLocation getEndLoc() const LLVM_READONLY
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeTemplateParameter(QualType T, 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.
DeclClass * getAsSingle() const
bool empty() const
Return true if no decls were found.
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...
UnresolvedSetImpl::iterator iterator
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.
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this 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.
bool shouldDeferTemplateArgumentDeduction(const Sema &S) const
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
@ 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.
@ CSK_CodeCompletion
When doing overload resolution during code completion, we want to show all viable candidates,...
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 withConst() const
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
RecordDecl * getDefinitionOrSelf() 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.
RAII class to control scope of DeferDiags.
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
DelayedDiagnosticsState pushUndelayed()
Enter a new scope where access and deprecation diagnostics are not delayed.
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.
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.
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
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....
void LookupOverloadedUnaryOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded unary operator.
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.
bool IsOverflowBehaviorTypeConversion(QualType FromType, QualType ToType)
IsOverflowBehaviorTypeConversion - Determines whether the conversion from FromType to ToType necessar...
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)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
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)
bool IsOverflowBehaviorTypePromotion(QualType FromType, QualType ToType)
IsOverflowBehaviorTypePromotion - Determines whether the conversion from FromType to ToType involves ...
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
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.
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false, bool AllowRelaxedEval=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
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.
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 isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isObjCIdType() const
bool isMatrixType() const
bool isOverflowBehaviorType() 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.
PRESERVE_NONE bool Ret(InterpState &S)
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...
Top level wrappers for InstallAPI frontend operations.
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.
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
OptionalUnsigned< unsigned > UnsignedOrNone
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.
TemplateSpecCandidateSetKind
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...
SmallVectorImpl< PartialDiagnosticAt > * ExtendedDiag
Location where we spot ptr to int cast or null subobject while evaluating constant expression in MS c...
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...
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)
void NoteDeductionFailure(Sema &S, bool ForTakingAddress, TemplateSpecCandidateSetKind CandidateSetKind)
Diagnose a template argument deduction failure.
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.