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 << OldMethod->getRefQualifier() << NewMethod->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 =
6501 assert((S.
getLangOpts().CPlusPlus11 || isCCEAllowedPreCXX11) &&
6502 "converted constant expression outside C++11 or TTP matching");
6537 if (
T->isRecordType())
6546 diag::err_typecheck_converted_constant_expression)
6552 llvm_unreachable(
"bad conversion in converted constant expression");
6558 diag::err_typecheck_converted_constant_expression_disallowed)
6564 diag::err_typecheck_converted_constant_expression_indirect)
6574 diag::err_reference_bind_to_bitfield_in_cce)
6582 bool IsTemplateArgument =
6584 if (
T->isRecordType()) {
6585 assert(IsTemplateArgument &&
6586 "unexpected class type converted constant expr");
6602 IsTemplateArgument);
6609 bool ReturnPreNarrowingValue =
false;
6612 S.
Context,
Result.get(), PreNarrowingValue, PreNarrowingType,
6613 false, AllowRelaxedEval)) {
6623 PreNarrowingValue.
isInt()) {
6626 ReturnPreNarrowingValue =
true;
6652 << CCE << 0 << From->
getType() <<
T;
6657 if (!ReturnPreNarrowingValue)
6658 PreNarrowingValue = {};
6674 if (
Result.isInvalid() ||
Result.get()->isValueDependent()) {
6679 RequireInt, PreNarrowingValue);
6686 return ::BuildConvertedConstantExpression(*
this, From,
T, CCE, Dest,
6693 return ::CheckConvertedConstantExpression(*
this, From,
T,
Value, CCE,
false,
6698 llvm::APSInt &
Value,
6700 assert(
T->isIntegralOrEnumerationType() &&
"unexpected converted const type");
6705 if (!R.isInvalid() && !R.get()->isValueDependent())
6713 const APValue &PreNarrowingValue) {
6727 Kind = ConstantExprKind::ClassTemplateArgument;
6729 Kind = ConstantExprKind::NonClassTemplateArgument;
6731 Kind = ConstantExprKind::Normal;
6734 (RequireInt && !Eval.
Val.
isInt())) {
6743 if (Notes.empty() && !CantFold) {
6744 for (
auto &Info : MSWarning)
6745 Diag(Info.first, Info.second);
6748 if (
const auto *CE = dyn_cast<ConstantExpr>(E)) {
6752 "ConstantExpr has no value associated with it");
6758 Value = std::move(PreNarrowingValue);
6764 if (Notes.size() == 1 &&
6765 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6766 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6767 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6768 diag::note_constexpr_invalid_template_arg) {
6769 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6770 for (
unsigned I = 0; I < Notes.size(); ++I)
6771 Diag(Notes[I].first, Notes[I].second);
6775 for (
unsigned I = 0; I < Notes.size(); ++I)
6776 Diag(Notes[I].first, Notes[I].second);
6795static ImplicitConversionSequence
6803 AllowedExplicit::Conversions,
6845 "expected a member expression");
6847 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6848 M && !M->isImplicitAccess())
6849 Base = M->getBase();
6850 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6851 M && !M->isImplicitAccess())
6852 Base = M->getBase();
6856 if (
T->isPointerType())
6857 T =
T->getPointeeType();
6885 assert(Method->isExplicitObjectMemberFunction() &&
6886 "Method is not an explicit member function");
6887 assert(NewArgs.empty() &&
"NewArgs should be empty");
6889 NewArgs.reserve(Args.size() + 1);
6891 NewArgs.push_back(
This);
6892 NewArgs.append(Args.begin(), Args.end());
6895 Method,
Object->getBeginLoc());
6901 return AllowScopedEnumerations ?
T->isIntegralOrEnumerationType()
6902 :
T->isIntegralOrUnscopedEnumerationType();
6914 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6928 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6936 std::string TypeStr;
6941 "static_cast<" + TypeStr +
">(")
6953 HadMultipleCandidates);
6960 From,
Result.get()->getType());
6986 HadMultipleCandidates);
6991 CK_UserDefinedConversion,
Result.get(),
6992 nullptr,
Result.get()->getValueKind(),
7017 if (
auto *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)) {
7019 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
7025 Conv, FoundDecl, ActingContext, From, ToType, CandidateSet,
7059 From = result.
get();
7065 From = Converted.
isUsable() ? Converted.
get() :
nullptr;
7074 const RecordType *RecordTy =
T->getAsCanonical<RecordType>();
7087 : Converter(Converter), From(From) {}
7092 } IncompleteDiagnoser(Converter, From);
7103 ->getDefinitionOrSelf()
7104 ->getVisibleConversionFunctions();
7106 bool HadMultipleCandidates =
7111 bool HasUniqueTargetType =
true;
7127 "Conversion operator templates are considered potentially "
7131 if (Converter.
match(CurToType) || ConvTemplate) {
7137 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
7142 else if (HasUniqueTargetType &&
7144 HasUniqueTargetType =
false;
7146 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
7164 HadMultipleCandidates,
7165 ExplicitConversions))
7171 if (!HasUniqueTargetType)
7190 HadMultipleCandidates,
Found))
7199 HadMultipleCandidates,
7200 ExplicitConversions))
7208 switch (ViableConversions.
size()) {
7211 HadMultipleCandidates,
7212 ExplicitConversions))
7222 HadMultipleCandidates,
Found))
7253 if (Proto->getNumParams() < 1)
7257 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
7258 if (Context.hasSameUnqualifiedType(T1, ArgType))
7262 if (Proto->getNumParams() < 2)
7266 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
7267 if (Context.hasSameUnqualifiedType(T2, ArgType))
7286 unsigned SeenAt = 0;
7288 bool HasDefault =
false;
7297 return HasDefault || SeenAt != 0;
7303 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
7306 bool StrictPackMatch) {
7309 assert(Proto &&
"Functions without a prototype cannot be overloaded");
7310 assert(!
Function->getDescribedFunctionTemplate() &&
7311 "Use AddTemplateOverloadCandidate for function templates");
7324 CandidateSet, SuppressUserConversions,
7325 PartialOverloading, EarlyConversions, PO,
7361 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
7375 Candidate.
Viable =
false;
7388 bool IsImplicitlyInstantiated =
false;
7389 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo()) {
7390 ND = SpecInfo->getTemplate();
7391 IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() ==
7402 const bool IsInlineFunctionInGMF =
7404 (IsImplicitlyInstantiated ||
Function->isInlined());
7409 const bool IsCurrentUnitGMFDecl =
7410 Function->isFromGlobalModule() && CurrentModule &&
7411 Function->getOwningModule()->getTopLevelModule() ==
7415 !IsCurrentUnitGMFDecl) {
7416 Candidate.
Viable =
false;
7423 Candidate.
Viable =
false;
7434 if (Args.size() == 1 &&
Constructor->isSpecializationCopyingObject() &&
7435 (
Context.hasSameUnqualifiedType(ClassType, Args[0]->getType()) ||
7438 Candidate.
Viable =
false;
7450 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.
getDecl());
7451 if (Shadow && Args.size() == 1 &&
Constructor->getNumParams() >= 1 &&
7452 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
7459 Candidate.
Viable =
false;
7468 Constructor->getMethodQualifiers().getAddressSpace(),
7470 Candidate.
Viable =
false;
7483 Candidate.
Viable =
false;
7493 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7494 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7495 !PartialOverloading) {
7497 Candidate.
Viable =
false;
7511 Candidate.
Viable =
false;
7517 if (
Function->getTrailingRequiresClause()) {
7522 Candidate.
Viable =
false;
7531 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7534 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7537 }
else if (ArgIdx < NumParams) {
7548 Args[ArgIdx]->
getType().getAddressSpace() ==
7550 Diag(Args[ArgIdx]->getBeginLoc(), diag::warn_hlsl_groupshared_inout);
7553 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7556 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7558 Candidate.
Viable =
false;
7570 if (EnableIfAttr *FailedAttr =
7572 Candidate.
Viable =
false;
7582 if (Methods.size() <= 1)
7585 for (
unsigned b = 0, e = Methods.size(); b < e; b++) {
7591 if (
Method->param_size() > NumNamedArgs)
7592 NumNamedArgs =
Method->param_size();
7593 if (Args.size() < NumNamedArgs)
7596 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7598 if (Args[i]->isTypeDependent()) {
7604 Expr *argExpr = Args[i];
7605 assert(argExpr &&
"SelectBestMethod(): missing expression");
7610 !param->
hasAttr<CFConsumedAttr>())
7611 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7628 if (ConversionState.
isBad() ||
7638 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7639 if (Args[i]->isTypeDependent()) {
7652 if (Args.size() != NumNamedArgs)
7654 else if (
Match && NumNamedArgs == 0 && Methods.size() > 1) {
7657 for (
unsigned b = 0, e = Methods.size(); b < e; b++) {
7658 QualType ReturnT = Methods[b]->getReturnType();
7678 "Shouldn't have `this` for ctors!");
7679 assert(!Method->isStatic() &&
"Shouldn't have `this` for static methods!");
7681 ThisArg, std::nullopt, Method, Method);
7684 ConvertedThis = R.get();
7686 if (
auto *MD = dyn_cast<CXXMethodDecl>(Function)) {
7688 assert((MissingImplicitThis || MD->isStatic() ||
7690 "Expected `this` for non-ctor instance methods");
7692 ConvertedThis =
nullptr;
7697 unsigned ArgSizeNoVarargs = std::min(Function->param_size(), Args.size());
7700 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7703 S.
Context, Function->getParamDecl(I)),
7709 ConvertedArgs.push_back(R.get());
7716 if (!Function->isVariadic() && Args.size() < Function->getNumParams()) {
7717 for (
unsigned i = Args.size(), e = Function->getNumParams(); i != e; ++i) {
7724 ConvertedArgs.push_back(R.get());
7736 bool MissingImplicitThis) {
7737 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7738 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7744 llvm::scope_exit UndelayDiags(
7746 DelayedDiagnostics.popUndelayed(CurrentState);
7750 Expr *DiscardedThis;
7752 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7753 true, DiscardedThis, ConvertedArgs))
7754 return *EnableIfAttrs.begin();
7756 for (
auto *EIA : EnableIfAttrs) {
7760 if (EIA->getCond()->isValueDependent() ||
7761 !EIA->getCond()->EvaluateWithSubstitution(
7765 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7771template <
typename CheckFn>
7774 CheckFn &&IsSuccessful) {
7777 if (ArgDependent == DIA->getArgDependent())
7778 Attrs.push_back(DIA);
7785 auto WarningBegin = std::stable_partition(
7786 Attrs.begin(), Attrs.end(), [](
const DiagnoseIfAttr *DIA) {
7787 return DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_error &&
7788 DIA->getWarningGroup().empty();
7793 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7795 if (ErrAttr != WarningBegin) {
7796 const DiagnoseIfAttr *DIA = *ErrAttr;
7797 S.
Diag(Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7798 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7799 << DIA->getParent() << DIA->getCond()->getSourceRange();
7803 auto ToSeverity = [](DiagnoseIfAttr::DefaultSeverity Sev) {
7805 case DiagnoseIfAttr::DS_warning:
7807 case DiagnoseIfAttr::DS_error:
7810 llvm_unreachable(
"Fully covered switch above!");
7813 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7814 if (IsSuccessful(DIA)) {
7815 if (DIA->getWarningGroup().empty() &&
7816 DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_warning) {
7817 S.
Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7818 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7819 << DIA->getParent() << DIA->getCond()->getSourceRange();
7822 DIA->getWarningGroup());
7825 {ToSeverity(DIA->getDefaultSeverity()),
"%0",
7827 S.
Diag(Loc, DiagID) << DIA->getMessage();
7835 const Expr *ThisArg,
7840 [&](
const DiagnoseIfAttr *DIA) {
7845 if (!DIA->getCond()->EvaluateWithSubstitution(
7848 return Result.isInt() &&
Result.getInt().getBoolValue();
7855 *
this, ND,
false, Loc,
7856 [&](
const DiagnoseIfAttr *DIA) {
7858 return DIA->getCond()->EvaluateAsBooleanCondition(
Result,
Context) &&
7867 bool SuppressUserConversions,
7868 bool PartialOverloading,
7869 bool FirstArgumentIsBase) {
7881 if (Args.size() > 0) {
7882 if (
Expr *E = Args[0]) {
7892 FunctionArgs = Args.slice(1);
7896 FunTmpl, F.getPair(),
7898 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7899 FunctionArgs, CandidateSet, SuppressUserConversions,
7900 PartialOverloading);
7904 ObjectClassification, FunctionArgs, CandidateSet,
7905 SuppressUserConversions, PartialOverloading);
7912 if (Args.size() > 0 &&
7916 FunctionArgs = Args.slice(1);
7920 ExplicitTemplateArgs, FunctionArgs,
7921 CandidateSet, SuppressUserConversions,
7922 PartialOverloading);
7925 SuppressUserConversions, PartialOverloading);
7935 bool SuppressUserConversions,
7945 "Expected a member function template");
7947 nullptr, ObjectType,
7948 ObjectClassification, Args, CandidateSet,
7949 SuppressUserConversions,
false, PO);
7952 ObjectType, ObjectClassification, Args, CandidateSet,
7953 SuppressUserConversions,
false, {}, PO);
7966 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7968 "Use AddOverloadCandidate for constructors");
7977 Method->isMoveAssignmentOperator())
7984 bool IgnoreExplicitObject =
7985 (
Method->isExplicitObjectMemberFunction() &&
7988 bool ImplicitObjectMethodTreatedAsStatic =
7991 Method->isImplicitObjectMemberFunction();
7993 unsigned ExplicitOffset =
7994 !IgnoreExplicitObject &&
Method->isExplicitObjectMemberFunction() ? 1 : 0;
7996 unsigned NumParams =
Method->getNumParams() - ExplicitOffset +
7997 int(ImplicitObjectMethodTreatedAsStatic);
7999 unsigned ExtraArgs =
8006 CandidateSet.
addCandidate(Args.size() + ExtraArgs, EarlyConversions);
8022 Candidate.
Viable =
false;
8032 unsigned MinRequiredArgs =
Method->getMinRequiredArguments() -
8034 int(ImplicitObjectMethodTreatedAsStatic);
8036 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
8038 Candidate.
Viable =
false;
8046 if (!IgnoreExplicitObject) {
8049 else if (
Method->isStatic()) {
8059 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
8064 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8065 Method, ActingContext,
true);
8066 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
8067 Candidate.
Viable =
false;
8078 Candidate.
Viable =
false;
8083 if (
Method->getTrailingRequiresClause()) {
8088 Candidate.
Viable =
false;
8096 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
8099 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
8102 }
else if (ArgIdx < NumParams) {
8108 if (ImplicitObjectMethodTreatedAsStatic) {
8109 ParamType = ArgIdx == 0
8110 ?
Method->getFunctionObjectParameterReferenceType()
8113 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
8117 SuppressUserConversions,
8122 Candidate.
Viable =
false;
8134 if (EnableIfAttr *FailedAttr =
8136 Candidate.
Viable =
false;
8143 Candidate.
Viable =
false;
8154 bool SuppressUserConversions,
bool PartialOverloading,
8172 PartialOverloading,
false,
8173 false, ObjectType, ObjectClassification,
8177 bool OnlyInitializeNonUserDefinedConversions) {
8178 return S.CheckNonDependentConversions(
8179 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
8180 Sema::CheckNonDependentConversionsFlag(
8181 SuppressUserConversions,
8182 OnlyInitializeNonUserDefinedConversions),
8183 ActingContext, ObjectType, ObjectClassification, PO);
8187 CandidateSet.
addCandidate(Conversions.size(), Conversions);
8190 Candidate.
Viable =
false;
8199 Method->isStatic() ||
8200 (!Method->isExplicitObjectMemberFunction() && ObjectType.
isNull());
8214 assert(
Specialization &&
"Missing member function template specialization?");
8216 "Specialization is not a member function?");
8219 ObjectClassification, Args, CandidateSet, SuppressUserConversions,
8233 if (ExplicitTemplateArgs ||
8236 *
this, CandidateSet, MethodTmpl, FoundDecl, ActingContext,
8237 ExplicitTemplateArgs, ObjectType, ObjectClassification, Args,
8238 SuppressUserConversions, PartialOverloading, PO);
8243 MethodTmpl, FoundDecl, ActingContext, ObjectType, ObjectClassification,
8244 Args, SuppressUserConversions, PartialOverloading, PO);
8262 bool SuppressUserConversions,
bool PartialOverloading,
bool AllowExplicit,
8264 bool AggregateCandidateDeduction) {
8273 Candidate.
Viable =
false;
8293 PartialOverloading, AggregateCandidateDeduction,
8300 bool OnlyInitializeNonUserDefinedConversions) {
8301 return S.CheckNonDependentConversions(
8302 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
8303 Sema::CheckNonDependentConversionsFlag(
8304 SuppressUserConversions,
8305 OnlyInitializeNonUserDefinedConversions),
8306 nullptr, QualType(), {}, PO);
8309 OverloadCandidate &Candidate =
8310 CandidateSet.addCandidate(Conversions.size(), Conversions);
8313 Candidate.
Viable =
false;
8315 CandidateSet.getRewriteInfo().getRewriteKind(Candidate.
Function, PO);
8321 CandidateSet.getKind() ==
8327 ->isExplicitObjectMemberFunction() &&
8343 assert(
Specialization &&
"Missing function template specialization?");
8345 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
8346 PartialOverloading, AllowExplicit,
8347 false, IsADLCandidate, Conversions, PO,
8348 Info.AggregateDeductionCandidateHasMismatchedArity,
8349 Info.hasStrictPackMatch());
8356 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
8363 if (ExplicitTemplateArgs ||
8366 DependentExplicitSpecifier)) {
8370 Args, SuppressUserConversions, PartialOverloading, AllowExplicit,
8371 IsADLCandidate, PO, AggregateCandidateDeduction);
8373 if (DependentExplicitSpecifier)
8380 PartialOverloading, AllowExplicit, IsADLCandidate, PO,
8381 AggregateCandidateDeduction);
8394 const bool AllowExplicit =
false;
8396 bool ForOverloadSetAddressResolution =
8399 auto *
Method = dyn_cast<CXXMethodDecl>(FD);
8400 bool HasThisConversion = !ForOverloadSetAddressResolution &&
Method &&
8402 unsigned ThisConversions = HasThisConversion ? 1 : 0;
8418 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
8419 !ParamTypes[0]->isDependentType()) {
8421 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8422 Method, ActingContext,
true,
8423 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
8433 auto MaybeInvolveUserDefinedConversion = [&](
QualType ParamType,
8457 if (
auto *RD =
ArgType->getAsCXXRecordDecl();
8458 RD && RD->hasDefinition() &&
8459 !RD->getVisibleConversionFunctions().empty())
8466 HasThisConversion &&
Method->hasCXXExplicitFunctionObjectParameter() ? 1
8469 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
8471 QualType ParamType = ParamTypes[I + Offset];
8475 ConvIdx = Args.size() - 1 - I;
8476 assert(Args.size() + ThisConversions == 2 &&
8477 "number of args (including 'this') must be exactly 2 for "
8481 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
8484 ConvIdx = ThisConversions + I;
8489 MaybeInvolveUserDefinedConversion(ParamType, Args[I]->
getType()))
8518 bool AllowObjCPointerConversion) {
8526 bool ObjCLifetimeConversion;
8528 ObjCLifetimeConversion))
8533 if (!AllowObjCPointerConversion)
8537 bool IncompatibleObjC =
false;
8547 bool AllowExplicit,
bool AllowResultConversion,
bool StrictPackMatch) {
8549 "Conversion function templates use AddTemplateConversionCandidate");
8564 if (!AllowResultConversion &&
8576 AllowObjCConversionOnExplicit))
8598 if (!AllowExplicit && Conversion->
isExplicit()) {
8599 Candidate.
Viable =
false;
8626 Candidate.
Viable =
false;
8635 Candidate.
Viable =
false;
8646 QualType ToCanon =
Context.getCanonicalType(ToType).getUnqualifiedType();
8647 if (FromCanon == ToCanon ||
8649 Candidate.
Viable =
false;
8666 CK_FunctionToPointerDecay, &ConversionRef,
8671 Candidate.
Viable =
false;
8701 Candidate.
Viable =
false;
8713 Candidate.
Viable =
false;
8720 Candidate.
Viable =
false;
8726 "Can only end up with a standard conversion sequence or failure");
8729 if (EnableIfAttr *FailedAttr =
8731 Candidate.
Viable =
false;
8738 Candidate.
Viable =
false;
8747 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
8748 bool AllowResultConversion) {
8757 Candidate.
Viable =
false;
8774 Candidate.
Viable =
false;
8784 assert(
Specialization &&
"Missing function template specialization?");
8786 ToType, CandidateSet, AllowObjCConversionOnExplicit,
8787 AllowExplicit, AllowResultConversion,
8795 bool AllowExplicit,
bool AllowResultConversion) {
8797 "Only conversion function templates permitted here");
8808 ToType, AllowObjCConversionOnExplicit, AllowExplicit,
8809 AllowResultConversion);
8817 AllowObjCConversionOnExplicit, AllowExplicit, AllowResultConversion);
8856 if (ObjectInit.
isBad()) {
8857 Candidate.
Viable =
false;
8868 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8869 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8870 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8871 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8874 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8882 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8883 Candidate.
Viable =
false;
8890 if (Args.size() < NumParams) {
8892 Candidate.
Viable =
false;
8899 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8900 if (ArgIdx < NumParams) {
8913 Candidate.
Viable =
false;
8930 Candidate.
Viable =
false;
8936 if (EnableIfAttr *FailedAttr =
8938 Candidate.
Viable =
false;
8962 "unqualified operator lookup found a member function");
8966 FunctionArgs, CandidateSet);
8972 FunctionArgs[1], FunctionArgs[0]);
8974 Reversed, CandidateSet,
false,
false,
true,
8975 ADLCallKind::NotADL,
8979 if (ExplicitTemplateArgs)
8984 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
8985 false,
false,
true,
false, ADLCallKind::NotADL, {},
9017 if (!T1RD || (!IsComplete && !T1RD->isBeingDefined()))
9025 OperEnd = Operators.
end();
9026 Oper != OperEnd; ++Oper) {
9027 if (Oper->getAsFunction() &&
9030 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
9033 Args[0]->Classify(
Context), Args.slice(1),
9034 CandidateSet,
false, PO);
9041 bool IsAssignmentOperator,
9042 unsigned NumContextualBoolArguments) {
9057 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9070 if (ArgIdx < NumContextualBoolArguments) {
9071 assert(ParamTys[ArgIdx] ==
Context.BoolTy &&
9072 "Contextual conversion to bool requires bool type");
9078 ArgIdx == 0 && IsAssignmentOperator,
9084 Candidate.
Viable =
false;
9097class BuiltinCandidateTypeSet {
9103 TypeSet PointerTypes;
9107 TypeSet MemberPointerTypes;
9111 TypeSet EnumerationTypes;
9115 TypeSet VectorTypes;
9119 TypeSet MatrixTypes;
9122 TypeSet BitIntTypes;
9125 bool HasNonRecordTypes;
9129 bool HasArithmeticOrEnumeralTypes;
9133 bool HasNullPtrType;
9142 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
9144 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
9148 typedef TypeSet::iterator
iterator;
9150 BuiltinCandidateTypeSet(
Sema &SemaRef)
9151 : HasNonRecordTypes(
false),
9152 HasArithmeticOrEnumeralTypes(
false),
9153 HasNullPtrType(
false),
9155 Context(SemaRef.Context) { }
9157 void AddTypesConvertedFrom(
QualType Ty,
9159 bool AllowUserConversions,
9160 bool AllowExplicitConversions,
9161 const Qualifiers &VisibleTypeConversionsQuals);
9163 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
9164 llvm::iterator_range<iterator> member_pointer_types() {
9165 return MemberPointerTypes;
9167 llvm::iterator_range<iterator> enumeration_types() {
9168 return EnumerationTypes;
9170 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
9171 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
9172 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
9174 bool containsMatrixType(QualType Ty)
const {
return MatrixTypes.count(Ty); }
9175 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
9176 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
9177 bool hasNullPtrType()
const {
return HasNullPtrType; }
9192BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(QualType Ty,
9193 const Qualifiers &VisibleQuals) {
9196 if (!PointerTypes.insert(Ty))
9200 const PointerType *PointerTy = Ty->
getAs<PointerType>();
9201 bool buildObjCPtr =
false;
9203 const ObjCObjectPointerType *PTy = Ty->
castAs<ObjCObjectPointerType>();
9205 buildObjCPtr =
true;
9217 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
9223 if ((CVR | BaseCVR) != CVR)
continue;
9238 QualType QPointerTy;
9245 PointerTypes.insert(QPointerTy);
9261BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
9264 if (!MemberPointerTypes.insert(Ty))
9267 const MemberPointerType *PointerTy = Ty->
getAs<MemberPointerType>();
9268 assert(PointerTy &&
"type was not a member pointer type!");
9283 if ((CVR | BaseCVR) != CVR)
continue;
9287 QPointeeTy, std::nullopt, Cls));
9302BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty,
9304 bool AllowUserConversions,
9305 bool AllowExplicitConversions,
9306 const Qualifiers &VisibleQuals) {
9312 if (
const ReferenceType *RefTy = Ty->
getAs<ReferenceType>())
9317 Ty = SemaRef.Context.getArrayDecayedType(Ty);
9324 HasNonRecordTypes = HasNonRecordTypes || !TyIsRec;
9327 HasArithmeticOrEnumeralTypes =
9331 PointerTypes.insert(Ty);
9332 else if (Ty->
getAs<PointerType>() || Ty->
getAs<ObjCObjectPointerType>()) {
9335 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
9339 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
9342 HasArithmeticOrEnumeralTypes =
true;
9343 EnumerationTypes.insert(Ty);
9345 HasArithmeticOrEnumeralTypes =
true;
9346 BitIntTypes.insert(Ty);
9350 HasArithmeticOrEnumeralTypes =
true;
9351 VectorTypes.insert(Ty);
9355 HasArithmeticOrEnumeralTypes =
true;
9356 MatrixTypes.insert(Ty);
9358 HasNullPtrType =
true;
9359 }
else if (AllowUserConversions && TyIsRec) {
9361 if (!SemaRef.isCompleteType(Loc, Ty))
9365 for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) {
9375 if (AllowExplicitConversions || !Conv->
isExplicit()) {
9423 ClassDecl = RHSMPType->getMostRecentCXXRecordDecl();
9471 if (Available.hasAtomic()) {
9472 Available.removeAtomic();
9479 if (Available.hasVolatile()) {
9480 Available.removeVolatile();
9514class BuiltinOperatorOverloadBuilder {
9517 ArrayRef<Expr *> Args;
9518 QualifiersAndAtomic VisibleTypeConversionsQuals;
9519 bool HasArithmeticOrEnumeralCandidateType;
9520 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes;
9521 OverloadCandidateSet &CandidateSet;
9523 static constexpr int ArithmeticTypesCap = 26;
9524 SmallVector<CanQualType, ArithmeticTypesCap> ArithmeticTypes;
9529 unsigned FirstIntegralType,
9531 unsigned FirstPromotedIntegralType,
9532 LastPromotedIntegralType;
9533 unsigned FirstPromotedArithmeticType,
9534 LastPromotedArithmeticType;
9535 unsigned NumArithmeticTypes;
9537 void InitArithmeticTypes() {
9539 FirstPromotedArithmeticType = 0;
9549 FirstIntegralType = ArithmeticTypes.size();
9550 FirstPromotedIntegralType = ArithmeticTypes.size();
9572 llvm::SmallSetVector<CanQualType, 2> BitIntCandidates;
9573 for (BuiltinCandidateTypeSet &Candidate : CandidateTypes) {
9574 for (QualType BitTy : Candidate.bitint_types())
9577 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
9578 LastPromotedIntegralType = ArithmeticTypes.size();
9579 LastPromotedArithmeticType = ArithmeticTypes.size();
9593 LastIntegralType = ArithmeticTypes.size();
9594 NumArithmeticTypes = ArithmeticTypes.size();
9601 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
9602 ArithmeticTypesCap &&
9603 "Enough inline storage for all arithmetic types.");
9608 void addPlusPlusMinusMinusStyleOverloads(QualType CandidateTy,
9611 QualType ParamTypes[2] = {
9651 void AddCandidate(QualType L, QualType R) {
9652 QualType LandR[2] = {L,
R};
9657 BuiltinOperatorOverloadBuilder(
9658 Sema &S, ArrayRef<Expr *> Args,
9659 QualifiersAndAtomic VisibleTypeConversionsQuals,
9660 bool HasArithmeticOrEnumeralCandidateType,
9661 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes,
9662 OverloadCandidateSet &CandidateSet)
9664 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
9665 HasArithmeticOrEnumeralCandidateType(
9666 HasArithmeticOrEnumeralCandidateType),
9667 CandidateTypes(CandidateTypes),
9668 CandidateSet(CandidateSet) {
9670 InitArithmeticTypes();
9693 if (!HasArithmeticOrEnumeralCandidateType)
9696 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9697 const auto TypeOfT = ArithmeticTypes[Arith];
9699 if (Op == OO_MinusMinus)
9701 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9704 addPlusPlusMinusMinusStyleOverloads(
9721 void addPlusPlusMinusMinusPointerOverloads() {
9722 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
9724 if (!PtrTy->getPointeeType()->isObjectType())
9727 addPlusPlusMinusMinusStyleOverloads(
9729 (!PtrTy.isVolatileQualified() &&
9731 (!PtrTy.isRestrictQualified() &&
9746 void addUnaryStarPointerOverloads() {
9747 for (QualType ParamTy : CandidateTypes[0].pointer_types()) {
9752 if (
const FunctionProtoType *Proto =PointeeTy->
getAs<FunctionProtoType>())
9753 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9766 void addUnaryPlusOrMinusArithmeticOverloads() {
9767 if (!HasArithmeticOrEnumeralCandidateType)
9770 for (
unsigned Arith = FirstPromotedArithmeticType;
9771 Arith < LastPromotedArithmeticType; ++Arith) {
9772 QualType ArithTy = ArithmeticTypes[Arith];
9777 for (QualType VecTy : CandidateTypes[0].vector_types())
9786 void addUnaryPlusPointerOverloads() {
9787 for (QualType ParamTy : CandidateTypes[0].pointer_types())
9796 void addUnaryTildePromotedIntegralOverloads() {
9797 if (!HasArithmeticOrEnumeralCandidateType)
9800 for (
unsigned Int = FirstPromotedIntegralType;
9801 Int < LastPromotedIntegralType; ++
Int) {
9802 QualType IntTy = ArithmeticTypes[
Int];
9807 for (QualType VecTy : CandidateTypes[0].vector_types())
9817 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9819 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9821 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9822 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9827 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9831 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9833 if (AddedTypes.insert(NullPtrTy).second) {
9834 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9853 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9866 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9867 UserDefinedBinaryOperators;
9869 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9870 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9872 CEnd = CandidateSet.
end();
9874 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9877 if (
C->Function->isFunctionTemplateSpecialization())
9884 QualType FirstParamType =
C->Function->getParamDecl(
Reversed ? 1 : 0)
9886 .getUnqualifiedType();
9887 QualType SecondParamType =
C->Function->getParamDecl(
Reversed ? 0 : 1)
9889 .getUnqualifiedType();
9897 UserDefinedBinaryOperators.insert(
9905 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9907 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9908 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9912 if (IsSpaceship && PtrTy->isFunctionPointerType())
9915 QualType ParamTypes[2] = {PtrTy, PtrTy};
9918 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9923 if (!AddedTypes.insert(CanonType).second ||
9924 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9927 QualType ParamTypes[2] = {EnumTy, EnumTy};
9952 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9954 for (
int Arg = 0; Arg < 2; ++Arg) {
9955 QualType AsymmetricParamTypes[2] = {
9959 for (QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9964 AsymmetricParamTypes[Arg] = PtrTy;
9965 if (Arg == 0 || Op == OO_Plus) {
9970 if (Op == OO_Minus) {
9975 QualType ParamTypes[2] = {PtrTy, PtrTy};
10011 void addGenericBinaryArithmeticOverloads() {
10012 if (!HasArithmeticOrEnumeralCandidateType)
10015 for (
unsigned Left = FirstPromotedArithmeticType;
10016 Left < LastPromotedArithmeticType; ++
Left) {
10017 for (
unsigned Right = FirstPromotedArithmeticType;
10018 Right < LastPromotedArithmeticType; ++
Right) {
10019 QualType LandR[2] = { ArithmeticTypes[
Left],
10020 ArithmeticTypes[
Right] };
10027 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10028 for (QualType Vec2Ty : CandidateTypes[1].vector_types()) {
10029 QualType LandR[2] = {Vec1Ty, Vec2Ty};
10039 void addMatrixBinaryArithmeticOverloads() {
10040 if (!HasArithmeticOrEnumeralCandidateType)
10043 for (QualType M1 : CandidateTypes[0].matrix_types()) {
10045 AddCandidate(M1, M1);
10048 for (QualType M2 : CandidateTypes[1].matrix_types()) {
10050 if (!CandidateTypes[0].containsMatrixType(M2))
10051 AddCandidate(M2, M2);
10086 void addThreeWayArithmeticOverloads() {
10087 addGenericBinaryArithmeticOverloads();
10104 void addBinaryBitwiseArithmeticOverloads() {
10105 if (!HasArithmeticOrEnumeralCandidateType)
10108 for (
unsigned Left = FirstPromotedIntegralType;
10109 Left < LastPromotedIntegralType; ++
Left) {
10110 for (
unsigned Right = FirstPromotedIntegralType;
10111 Right < LastPromotedIntegralType; ++
Right) {
10112 QualType LandR[2] = { ArithmeticTypes[
Left],
10113 ArithmeticTypes[
Right] };
10126 void addAssignmentMemberPointerOrEnumeralOverloads() {
10128 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10130 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10131 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10138 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10163 void addAssignmentPointerOverloads(
bool isEqualOp) {
10165 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10167 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10171 else if (!PtrTy->getPointeeType()->isObjectType())
10175 QualType ParamTypes[2] = {
10182 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10184 if (NeedVolatile) {
10192 if (!PtrTy.isRestrictQualified() &&
10200 if (NeedVolatile) {
10212 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10217 QualType ParamTypes[2] = {
10226 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10228 if (NeedVolatile) {
10236 if (!PtrTy.isRestrictQualified() &&
10244 if (NeedVolatile) {
10269 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
10270 if (!HasArithmeticOrEnumeralCandidateType)
10273 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
10274 for (
unsigned Right = FirstPromotedArithmeticType;
10275 Right < LastPromotedArithmeticType; ++
Right) {
10276 QualType ParamTypes[2];
10277 ParamTypes[1] = ArithmeticTypes[
Right];
10279 S, ArithmeticTypes[Left], Args[0]);
10282 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10292 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10293 for (QualType Vec2Ty : CandidateTypes[0].vector_types()) {
10294 QualType ParamTypes[2];
10295 ParamTypes[1] = Vec2Ty;
10323 void addAssignmentIntegralOverloads() {
10324 if (!HasArithmeticOrEnumeralCandidateType)
10327 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
10328 for (
unsigned Right = FirstPromotedIntegralType;
10329 Right < LastPromotedIntegralType; ++
Right) {
10330 QualType ParamTypes[2];
10331 ParamTypes[1] = ArithmeticTypes[
Right];
10333 S, ArithmeticTypes[Left], Args[0]);
10336 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10352 void addExclaimOverload() {
10358 void addAmpAmpOrPipePipeOverload() {
10375 void addSubscriptOverloads() {
10376 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10386 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10406 void addArrowStarOverloads() {
10407 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10408 QualType C1Ty = PtrTy;
10410 QualifierCollector Q1;
10421 for (QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
10428 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
10431 if (!VisibleTypeConversionsQuals.
hasVolatile() &&
10432 T.isVolatileQualified())
10434 if (!VisibleTypeConversionsQuals.
hasRestrict() &&
10435 T.isRestrictQualified())
10453 void addConditionalOperatorOverloads() {
10455 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10457 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10458 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
10462 QualType ParamTypes[2] = {PtrTy, PtrTy};
10466 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10470 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
10475 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10476 if (!EnumTy->castAsCanonical<EnumType>()->getDecl()->isScoped())
10482 QualType ParamTypes[2] = {EnumTy, EnumTy};
10501 VisibleTypeConversionsQuals.
addConst();
10502 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10504 if (Args[ArgIdx]->
getType()->isAtomicType())
10505 VisibleTypeConversionsQuals.
addAtomic();
10508 bool HasNonRecordCandidateType =
false;
10509 bool HasArithmeticOrEnumeralCandidateType =
false;
10511 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10512 CandidateTypes.emplace_back(*
this);
10513 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->
getType(),
10516 (Op == OO_Exclaim ||
10518 Op == OO_PipePipe),
10519 VisibleTypeConversionsQuals);
10520 HasNonRecordCandidateType = HasNonRecordCandidateType ||
10521 CandidateTypes[ArgIdx].hasNonRecordTypes();
10522 HasArithmeticOrEnumeralCandidateType =
10523 HasArithmeticOrEnumeralCandidateType ||
10524 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
10532 if (!HasNonRecordCandidateType &&
10533 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
10537 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
10538 VisibleTypeConversionsQuals,
10539 HasArithmeticOrEnumeralCandidateType,
10540 CandidateTypes, CandidateSet);
10546 llvm_unreachable(
"Expected an overloaded operator");
10551 case OO_Array_Delete:
10554 "Special operators don't use AddBuiltinOperatorCandidates");
10566 if (Args.size() == 1)
10567 OpBuilder.addUnaryPlusPointerOverloads();
10571 if (Args.size() == 1) {
10572 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
10574 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
10575 OpBuilder.addGenericBinaryArithmeticOverloads();
10576 OpBuilder.addMatrixBinaryArithmeticOverloads();
10581 if (Args.size() == 1)
10582 OpBuilder.addUnaryStarPointerOverloads();
10584 OpBuilder.addGenericBinaryArithmeticOverloads();
10585 OpBuilder.addMatrixBinaryArithmeticOverloads();
10590 OpBuilder.addGenericBinaryArithmeticOverloads();
10594 case OO_MinusMinus:
10595 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
10596 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
10599 case OO_EqualEqual:
10600 case OO_ExclaimEqual:
10601 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
10602 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10603 OpBuilder.addGenericBinaryArithmeticOverloads();
10609 case OO_GreaterEqual:
10610 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10611 OpBuilder.addGenericBinaryArithmeticOverloads();
10615 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
10616 OpBuilder.addThreeWayArithmeticOverloads();
10623 case OO_GreaterGreater:
10624 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10628 if (Args.size() == 1)
10634 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10638 OpBuilder.addUnaryTildePromotedIntegralOverloads();
10642 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
10646 case OO_MinusEqual:
10647 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
10651 case OO_SlashEqual:
10652 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
10655 case OO_PercentEqual:
10656 case OO_LessLessEqual:
10657 case OO_GreaterGreaterEqual:
10659 case OO_CaretEqual:
10661 OpBuilder.addAssignmentIntegralOverloads();
10665 OpBuilder.addExclaimOverload();
10670 OpBuilder.addAmpAmpOrPipePipeOverload();
10674 if (Args.size() == 2)
10675 OpBuilder.addSubscriptOverloads();
10679 OpBuilder.addArrowStarOverloads();
10682 case OO_Conditional:
10683 OpBuilder.addConditionalOperatorOverloads();
10684 OpBuilder.addGenericBinaryArithmeticOverloads();
10695 bool PartialOverloading) {
10712 CandEnd = CandidateSet.
end();
10713 Cand != CandEnd; ++Cand)
10714 if (Cand->Function) {
10718 Fns.
erase(FunTmpl);
10727 if (ExplicitTemplateArgs)
10731 FD, FoundDecl, Args, CandidateSet,
false,
10732 PartialOverloading,
true,
10733 false, ADLCallKind::UsesADL);
10736 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10737 false, PartialOverloading,
10744 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10745 false, PartialOverloading,
10746 true, ADLCallKind::UsesADL);
10748 *
this, Args, FTD->getTemplatedDecl())) {
10752 if (ReversedArgs.empty())
10756 FTD, FoundDecl, ExplicitTemplateArgs, ReversedArgs, CandidateSet,
10757 false, PartialOverloading,
10758 true, ADLCallKind::UsesADL,
10783 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10784 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10785 if (!Cand1Attr || !Cand2Attr) {
10786 if (Cand1Attr == Cand2Attr)
10787 return Comparison::Equal;
10788 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10794 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10795 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10796 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10797 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10802 return Comparison::Worse;
10804 return Comparison::Better;
10809 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10810 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10811 if (Cand1ID != Cand2ID)
10812 return Comparison::Worse;
10815 return Comparison::Equal;
10823 return Comparison::Equal;
10829 return Comparison::Equal;
10830 return Comparison::Worse;
10833 return Comparison::Better;
10839 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10840 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10842 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10843 return Comparison::Equal;
10845 if (Cand1CPUDisp && !Cand2CPUDisp)
10846 return Comparison::Better;
10847 if (Cand2CPUDisp && !Cand1CPUDisp)
10848 return Comparison::Worse;
10850 if (Cand1CPUSpec && Cand2CPUSpec) {
10851 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10852 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10853 ? Comparison::Better
10854 : Comparison::Worse;
10856 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10857 FirstDiff = std::mismatch(
10858 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10859 Cand2CPUSpec->cpus_begin(),
10861 return LHS->getName() == RHS->getName();
10864 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10865 "Two different cpu-specific versions should not have the same "
10866 "identifier list, otherwise they'd be the same decl!");
10867 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->getName()
10868 ? Comparison::Better
10869 : Comparison::Worse;
10871 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10877static std::optional<QualType>
10880 return std::nullopt;
10886 return M->getFunctionObjectParameterReferenceType();
10900 PT2->getInstantiatedFromMemberTemplate()))
10911 assert(I < F->getNumParams());
10918 if (F1NumParams != F2NumParams)
10921 unsigned I1 = 0, I2 = 0;
10922 for (
unsigned I = 0; I != F1NumParams; ++I) {
10923 QualType T1 = NextParam(F1, I1, I == 0);
10924 QualType T2 = NextParam(F2, I2, I == 0);
10925 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10926 if (!Context.hasSameUnqualifiedType(T1, T2))
10939 bool IsFn1Reversed,
10940 bool IsFn2Reversed) {
10941 assert(Fn1 && Fn2);
10946 IsFn1Reversed ^ IsFn2Reversed))
10949 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10950 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10951 if (Mem1 && Mem2) {
10954 if (Mem1->getParent() != Mem2->getParent())
10958 if (Mem1->isInstance() && Mem2->isInstance() &&
10960 Mem1->getFunctionObjectParameterReferenceType(),
10961 Mem1->getFunctionObjectParameterReferenceType()))
10967static FunctionDecl *
10969 bool IsFn1Reversed,
bool IsFn2Reversed) {
10979 if (Cand1IsSpecialization || Cand2IsSpecialization)
10996 bool PartialOverloading) {
11042 bool IsCand1ImplicitHD =
11044 bool IsCand2ImplicitHD =
11059 auto EmitThreshold =
11060 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
11061 (IsCand1ImplicitHD || IsCand2ImplicitHD))
11064 auto Cand1Emittable = P1 > EmitThreshold;
11065 auto Cand2Emittable = P2 > EmitThreshold;
11066 if (Cand1Emittable && !Cand2Emittable)
11068 if (!Cand1Emittable && Cand2Emittable)
11079 unsigned StartArg = 0;
11087 return ICS.isStandard() &&
11099 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
11100 bool HasBetterConversion =
false;
11101 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11102 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
11103 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
11104 if (Cand1Bad != Cand2Bad) {
11107 HasBetterConversion =
true;
11111 if (HasBetterConversion)
11118 bool HasWorseConversion =
false;
11119 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11125 HasBetterConversion =
true;
11144 HasWorseConversion =
true;
11159 if (HasBetterConversion && !HasWorseConversion)
11210 bool Cand1IsSpecialization = Cand1.
Function &&
11212 bool Cand2IsSpecialization = Cand2.
Function &&
11214 if (Cand1IsSpecialization != Cand2IsSpecialization)
11215 return Cand2IsSpecialization;
11221 if (Cand1IsSpecialization && Cand2IsSpecialization) {
11222 const auto *Obj1Context =
11224 const auto *Obj2Context =
11253 bool Cand1IsInherited =
11255 bool Cand2IsInherited =
11257 if (Cand1IsInherited != Cand2IsInherited)
11258 return Cand2IsInherited;
11259 else if (Cand1IsInherited) {
11260 assert(Cand2IsInherited);
11263 if (Cand1Class->isDerivedFrom(Cand2Class))
11265 if (Cand2Class->isDerivedFrom(Cand1Class))
11282 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
11283 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
11284 if (Guide1 && Guide2) {
11286 if (Guide1->isImplicit() != Guide2->isImplicit())
11287 return Guide2->isImplicit();
11297 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
11298 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
11299 if (Constructor1 && Constructor2) {
11300 bool isC1Templated = Constructor1->getTemplatedKind() !=
11302 bool isC2Templated = Constructor2->getTemplatedKind() !=
11304 if (isC1Templated != isC2Templated)
11305 return isC2Templated;
11313 if (
Cmp != Comparison::Equal)
11314 return Cmp == Comparison::Better;
11317 bool HasPS1 = Cand1.
Function !=
nullptr &&
11319 bool HasPS2 = Cand2.
Function !=
nullptr &&
11321 if (HasPS1 != HasPS2 && HasPS1)
11325 if (MV == Comparison::Better)
11327 if (MV == Comparison::Worse)
11342 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
11343 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
11345 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
11346 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
11367 auto *VA = dyn_cast_or_null<ValueDecl>(A);
11368 auto *VB = dyn_cast_or_null<ValueDecl>(B);
11374 if (!VA->getDeclContext()->getRedeclContext()->Equals(
11375 VB->getDeclContext()->getRedeclContext()) ||
11377 VA->isExternallyVisible() || VB->isExternallyVisible())
11385 if (
Context.hasSameType(VA->getType(), VB->getType()))
11390 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
11391 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
11396 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
11397 !
Context.hasSameType(EnumA->getIntegerType(),
11398 EnumB->getIntegerType()))
11401 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
11411 assert(D &&
"Unknown declaration");
11412 Diag(Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) << D;
11418 for (
auto *E : Equiv) {
11420 Diag(E->getLocation(), diag::note_equivalent_internal_linkage_decl)
11430 ->Satisfaction.ContainsErrors;
11436 bool PartialOverloading,
bool AllowExplicit,
11438 bool AggregateCandidateDeduction) {
11441 allocateDeferredCandidate<DeferredFunctionTemplateOverloadCandidate>();
11446 false, AllowExplicit, SuppressUserConversions,
11447 PartialOverloading, AggregateCandidateDeduction},
11454 HasDeferredTemplateConstructors |=
11462 bool SuppressUserConversions,
bool PartialOverloading,
11468 allocateDeferredCandidate<DeferredMethodTemplateOverloadCandidate>();
11474 false, SuppressUserConversions, PartialOverloading,
11480 ObjectClassification,
11488 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
11489 bool AllowResultConversion) {
11492 allocateDeferredCandidate<DeferredConversionTemplateOverloadCandidate>();
11496 AllowObjCConversionOnExplicit, AllowResultConversion,
11513 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
11514 nullptr,
C.ObjectType,
C.ObjectClassification,
11515 C.Args,
C.SuppressUserConversions,
C.PartialOverloading,
C.PO);
11522 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
11523 nullptr,
C.Args,
C.SuppressUserConversions,
11524 C.PartialOverloading,
C.AllowExplicit,
C.IsADLCandidate,
C.PO,
11525 C.AggregateCandidateDeduction);
11532 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
C.From,
11533 C.ToType,
C.AllowObjCConversionOnExplicit,
C.AllowExplicit,
11534 C.AllowResultConversion);
11538 Candidates.reserve(Candidates.size() + DeferredCandidatesCount);
11541 switch (Cand->
Kind) {
11560 FirstDeferredCandidate =
nullptr;
11561 DeferredCandidatesCount = 0;
11565OverloadCandidateSet::ResultForBestCandidate(
const iterator &Best) {
11567 if (Best->Function && Best->Function->isDeleted())
11572void OverloadCandidateSet::CudaExcludeWrongSideCandidates(
11589 bool ContainsSameSideCandidate =
11597 if (!ContainsSameSideCandidate)
11600 auto IsWrongSideCandidate = [&](
const OverloadCandidate *Cand) {
11606 llvm::erase_if(Candidates, IsWrongSideCandidate);
11624 DeferredCandidatesCount == 0) &&
11625 "Unexpected deferred template candidates");
11627 bool TwoPhaseResolution =
11628 DeferredCandidatesCount != 0 && !ResolutionByPerfectCandidateIsDisabled;
11630 if (TwoPhaseResolution) {
11632 if (Best !=
end() && Best->isPerfectMatch(S.
Context)) {
11633 if (!(HasDeferredTemplateConstructors &&
11634 isa_and_nonnull<CXXConversionDecl>(Best->Function)))
11640 return BestViableFunctionImpl(S, Loc, Best);
11647 Candidates.reserve(this->Candidates.size());
11648 std::transform(this->Candidates.begin(), this->Candidates.end(),
11649 std::back_inserter(Candidates),
11653 CudaExcludeWrongSideCandidates(S, Candidates);
11656 for (
auto *Cand : Candidates) {
11657 Cand->
Best =
false;
11659 if (Best ==
end() ||
11676 llvm::SmallVector<OverloadCandidate *, 4> PendingBest;
11677 llvm::SmallVector<const NamedDecl *, 4> EquivalentCands;
11678 PendingBest.push_back(&*Best);
11683 while (!PendingBest.empty()) {
11684 auto *Curr = PendingBest.pop_back_val();
11685 for (
auto *Cand : Candidates) {
11688 PendingBest.push_back(Cand);
11693 EquivalentCands.push_back(Cand->
Function);
11705 if (!EquivalentCands.empty())
11713enum OverloadCandidateKind {
11716 oc_reversed_binary_operator,
11718 oc_implicit_default_constructor,
11719 oc_implicit_copy_constructor,
11720 oc_implicit_move_constructor,
11721 oc_implicit_copy_assignment,
11722 oc_implicit_move_assignment,
11723 oc_implicit_equality_comparison,
11724 oc_inherited_constructor
11727enum OverloadCandidateSelect {
11730 ocs_described_template,
11733static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
11734ClassifyOverloadCandidate(Sema &S,
const NamedDecl *
Found,
11735 const FunctionDecl *Fn,
11737 std::string &Description) {
11740 if (FunctionTemplateDecl *FunTmpl =
Fn->getPrimaryTemplate()) {
11743 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
11746 OverloadCandidateSelect Select = [&]() {
11747 if (!Description.empty())
11748 return ocs_described_template;
11749 return isTemplate ? ocs_template : ocs_non_template;
11752 OverloadCandidateKind Kind = [&]() {
11753 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
11754 return oc_implicit_equality_comparison;
11757 return oc_reversed_binary_operator;
11759 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
11760 if (!Ctor->isImplicit()) {
11762 return oc_inherited_constructor;
11764 return oc_constructor;
11767 if (Ctor->isDefaultConstructor())
11768 return oc_implicit_default_constructor;
11770 if (Ctor->isMoveConstructor())
11771 return oc_implicit_move_constructor;
11773 assert(Ctor->isCopyConstructor() &&
11774 "unexpected sort of implicit constructor");
11775 return oc_implicit_copy_constructor;
11778 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
11781 if (!Meth->isImplicit())
11784 if (Meth->isMoveAssignmentOperator())
11785 return oc_implicit_move_assignment;
11787 if (Meth->isCopyAssignmentOperator())
11788 return oc_implicit_copy_assignment;
11794 return oc_function;
11797 return std::make_pair(Kind, Select);
11800void MaybeEmitInheritedConstructorNote(Sema &S,
const Decl *FoundDecl) {
11803 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
11805 diag::note_ovl_candidate_inherited_constructor)
11806 << Shadow->getNominatedBaseClass();
11815 if (EnableIf->getCond()->isValueDependent() ||
11816 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
11833 bool InOverloadResolution,
11837 if (InOverloadResolution)
11839 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
11841 S.
Diag(Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
11852 if (InOverloadResolution) {
11855 TemplateArgString +=
" ";
11857 FunTmpl->getTemplateParameters(),
11862 diag::note_ovl_candidate_unsatisfied_constraints)
11863 << TemplateArgString;
11865 S.
Diag(Loc, diag::err_addrof_function_constraints_not_satisfied)
11874 return P->hasAttr<PassObjectSizeAttr>();
11881 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11882 if (InOverloadResolution)
11884 diag::note_ovl_candidate_has_pass_object_size_params)
11887 S.
Diag(Loc, diag::err_address_of_function_with_pass_object_size_params)
11903 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11911 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11916 if (!RD->isLambda())
11926 return ConvToCC != CallOpCC;
11932 QualType DestType,
bool TakingAddress) {
11935 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11936 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11938 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11939 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11944 std::string FnDesc;
11945 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11946 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11948 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11952 Diag(Fn->getLocation(), PD);
11953 MaybeEmitInheritedConstructorNote(*
this,
Found);
11971 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11972 for (
auto I = Cands.begin(), E = Cands.end(); I != E; ++I) {
11976 if (
auto *
Template = I->Function->getPrimaryTemplate())
11977 Template->getAssociatedConstraints(AC);
11979 I->Function->getAssociatedConstraints(AC);
11982 if (FirstCand ==
nullptr) {
11983 FirstCand = I->Function;
11985 }
else if (SecondCand ==
nullptr) {
11986 SecondCand = I->Function;
11999 SecondCand, SecondAC))
12008 bool TakingAddress) {
12018 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
12022 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
12035 S.
Diag(CaretLoc, PDiag)
12037 unsigned CandsShown = 0;
12051 unsigned I,
bool TakingCandidateAddress) {
12053 assert(Conv.
isBad());
12054 assert(Cand->
Function &&
"for now, candidate must be a function");
12060 bool isObjectArgument =
false;
12064 isObjectArgument =
true;
12069 std::string FnDesc;
12070 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12081 bool HasParamPack =
12082 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
12083 return Parm->isParameterPack();
12085 if (!isObjectArgument && !HasParamPack && I < Fn->getNumParams())
12086 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
12089 assert(FromExpr &&
"overload set argument came from implicit argument?");
12095 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
12096 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12097 << ToParamRange << ToTy << Name << I + 1;
12098 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12107 CToTy = RT->getPointeeType();
12112 CFromTy = FromPT->getPointeeType();
12113 CToTy = ToPT->getPointeeType();
12123 if (isObjectArgument)
12124 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
12125 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12128 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
12129 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12132 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12137 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
12138 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12141 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12146 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
12147 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12150 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12155 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ptrauth)
12156 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12161 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12166 assert(CVR &&
"expected qualifiers mismatch");
12168 if (isObjectArgument) {
12169 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
12170 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12171 << FromTy << (CVR - 1);
12173 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
12174 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12175 << ToParamRange << FromTy << (CVR - 1) << I + 1;
12177 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12183 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
12184 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12185 << (
unsigned)isObjectArgument << I + 1
12188 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12195 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
12196 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12197 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12202 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12214 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
12215 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12216 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12217 << (
unsigned)(Cand->
Fix.
Kind);
12219 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12224 unsigned BaseToDerivedConversion = 0;
12227 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12229 !FromPtrTy->getPointeeType()->isIncompleteType() &&
12230 !ToPtrTy->getPointeeType()->isIncompleteType() &&
12232 FromPtrTy->getPointeeType()))
12233 BaseToDerivedConversion = 1;
12241 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12243 FromIface->isSuperClassOf(ToIface))
12244 BaseToDerivedConversion = 2;
12246 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy,
12249 !ToRefTy->getPointeeType()->isIncompleteType() &&
12251 BaseToDerivedConversion = 3;
12255 if (BaseToDerivedConversion) {
12256 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
12257 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12258 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
12260 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12269 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
12270 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12271 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
12273 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12283 if (FromTy == S.
Context.AMDGPUFeaturePredicateTy &&
12286 diag::err_amdgcn_predicate_type_needs_explicit_bool_cast)
12293 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12294 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12295 << (
unsigned)(Cand->
Fix.
Kind);
12304 S.
Diag(Fn->getLocation(), FDiag);
12306 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12313 unsigned NumArgs,
bool IsAddressOf =
false) {
12314 assert(Cand->
Function &&
"Candidate is required to be a function.");
12316 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12317 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12324 if (Fn->isInvalidDecl() &&
12328 if (NumArgs < MinParams) {
12345 unsigned NumFormalArgs,
12346 bool IsAddressOf =
false) {
12348 "The templated declaration should at least be a function"
12349 " when diagnosing bad template argument deduction due to too many"
12350 " or too few arguments");
12356 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12357 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12360 bool HasExplicitObjectParam =
12361 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
12363 unsigned ParamCount =
12364 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12365 unsigned mode, modeCount;
12367 if (NumFormalArgs < MinParams) {
12368 if (MinParams != ParamCount || FnTy->isVariadic() ||
12369 FnTy->isTemplateVariadic())
12373 modeCount = MinParams;
12375 if (MinParams != ParamCount)
12379 modeCount = ParamCount;
12382 std::string Description;
12383 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12384 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
12386 unsigned FirstNonObjectParamIdx = HasExplicitObjectParam ? 1 : 0;
12387 if (modeCount == 1 && !IsAddressOf &&
12388 FirstNonObjectParamIdx < Fn->getNumParams() &&
12389 Fn->getParamDecl(FirstNonObjectParamIdx)->getDeclName())
12390 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
12391 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12392 << Description << mode << Fn->getParamDecl(FirstNonObjectParamIdx)
12393 << NumFormalArgs << HasExplicitObjectParam
12394 << Fn->getParametersSourceRange();
12396 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
12397 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12398 << Description << mode << modeCount << NumFormalArgs
12399 << HasExplicitObjectParam << Fn->getParametersSourceRange();
12401 MaybeEmitInheritedConstructorNote(S,
Found);
12406 unsigned NumFormalArgs) {
12407 assert(Cand->
Function &&
"Candidate must be a function");
12417 llvm_unreachable(
"Unsupported: Getting the described template declaration"
12418 " for bad deduction diagnosis");
12424 unsigned NumArgs,
bool TakingCandidateAddress,
12432 switch (DeductionFailure.
getResult()) {
12435 "TemplateDeductionResult::Success while diagnosing bad deduction");
12437 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
12438 "while diagnosing bad deduction");
12444 assert(ParamD &&
"no parameter found for incomplete deduction result");
12446 diag::note_ovl_candidate_incomplete_deduction)
12448 MaybeEmitInheritedConstructorNote(S,
Found);
12453 assert(ParamD &&
"no parameter found for incomplete deduction result");
12455 diag::note_ovl_candidate_incomplete_deduction_pack)
12457 << (DeductionFailure.
getFirstArg()->pack_size() + 1)
12459 MaybeEmitInheritedConstructorNote(S,
Found);
12464 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
12482 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
12483 << ParamD->
getDeclName() << Arg << NonCanonParam;
12484 MaybeEmitInheritedConstructorNote(S,
Found);
12489 assert(ParamD &&
"no parameter found for inconsistent deduction result");
12503 diag::note_ovl_candidate_inconsistent_deduction_types)
12506 MaybeEmitInheritedConstructorNote(S,
Found);
12526 diag::note_ovl_candidate_inconsistent_deduction)
12529 MaybeEmitInheritedConstructorNote(S,
Found);
12534 assert(ParamD &&
"no parameter found for invalid explicit arguments");
12537 diag::note_ovl_candidate_explicit_arg_mismatch);
12539 Diag << diag::ExplicitArgMismatchNameKind::Named << ParamD->
getDeclName();
12541 Diag << diag::ExplicitArgMismatchNameKind::Unnamed
12546 Diag << diag::ExplicitArgMismatchReasonKind::Detailed << DiagContent;
12548 Diag << diag::ExplicitArgMismatchReasonKind::Vague;
12551 MaybeEmitInheritedConstructorNote(S,
Found);
12558 TemplateArgString =
" ";
12561 if (TemplateArgString.size() == 1)
12562 TemplateArgString.clear();
12564 diag::note_ovl_candidate_unsatisfied_constraints)
12565 << TemplateArgString;
12568 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
12578 diag::note_ovl_candidate_instantiation_depth);
12579 MaybeEmitInheritedConstructorNote(S,
Found);
12587 TemplateArgString =
" ";
12590 if (TemplateArgString.size() == 1)
12591 TemplateArgString.clear();
12596 if (PDiag && PDiag->second.getDiagID() ==
12597 diag::err_typename_nested_not_found_enable_if) {
12600 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
12601 <<
"'enable_if'" << TemplateArgString;
12606 if (PDiag && PDiag->second.getDiagID() ==
12607 diag::err_typename_nested_not_found_requirement) {
12609 diag::note_ovl_candidate_disabled_by_requirement)
12610 << PDiag->second.getStringArg(0) << TemplateArgString;
12620 SFINAEArgString =
": ";
12622 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
12626 diag::note_ovl_candidate_substitution_failure)
12627 << TemplateArgString << SFINAEArgString << R;
12628 MaybeEmitInheritedConstructorNote(S,
Found);
12638 TemplateArgString =
" ";
12641 if (TemplateArgString.size() == 1)
12642 TemplateArgString.clear();
12645 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
12648 << TemplateArgString
12673 CandidateSetKind ==
12675 ? diag::note_friend_template_non_deduced_mismatch_qualified
12676 : diag::note_ovl_candidate_non_deduced_mismatch_qualified)
12693 ? diag::note_friend_template_non_deduced_mismatch
12694 : diag::note_ovl_candidate_non_deduced_mismatch)
12695 << FirstTA << SecondTA;
12701 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
12702 MaybeEmitInheritedConstructorNote(S,
Found);
12706 diag::note_cuda_ovl_candidate_target_mismatch);
12714 bool TakingCandidateAddress) {
12715 assert(Cand->
Function &&
"Candidate must be a function");
12730 assert(Cand->
Function &&
"Candidate must be a Function.");
12736 std::string FnDesc;
12737 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12738 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
12741 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
12742 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12744 << CalleeTarget << CallerTarget;
12749 if (Meth !=
nullptr && Meth->
isImplicit()) {
12753 switch (FnKindPair.first) {
12756 case oc_implicit_default_constructor:
12759 case oc_implicit_copy_constructor:
12762 case oc_implicit_move_constructor:
12765 case oc_implicit_copy_assignment:
12768 case oc_implicit_move_assignment:
12773 bool ConstRHS =
false;
12777 ConstRHS = RT->getPointeeType().isConstQualified();
12788 assert(Cand->
Function &&
"Candidate must be a function");
12792 S.
Diag(Callee->getLocation(),
12793 diag::note_ovl_candidate_disabled_by_function_cond_attr)
12794 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
12798 assert(Cand->
Function &&
"Candidate must be a function");
12801 assert(ES.
isExplicit() &&
"not an explicit candidate");
12804 switch (Fn->getDeclKind()) {
12805 case Decl::Kind::CXXConstructor:
12808 case Decl::Kind::CXXConversion:
12811 case Decl::Kind::CXXDeductionGuide:
12812 Kind = Fn->isImplicit() ? 0 : 2;
12815 llvm_unreachable(
"invalid Decl");
12824 First = Pattern->getFirstDecl();
12827 diag::note_ovl_candidate_explicit)
12828 << Kind << (ES.
getExpr() ? 1 : 0)
12833 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
12840 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
12842 std::string FunctionProto;
12843 llvm::raw_string_ostream OS(FunctionProto);
12856 "Non-template implicit deduction guides are only possible for "
12859 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12864 assert(
Template &&
"Cannot find the associated function template of "
12865 "CXXDeductionGuideDecl?");
12868 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12889 bool TakingCandidateAddress,
12891 assert(Cand->
Function &&
"Candidate must be a function");
12899 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
12906 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12911 if (Fn->isDeleted()) {
12912 std::string FnDesc;
12913 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12914 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12917 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12918 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12919 << (Fn->isDeleted()
12920 ? (Fn->getCanonicalDecl()->isDeletedAsWritten() ? 1 : 2)
12922 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12949 TakingCandidateAddress);
12952 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12953 << (Fn->getPrimaryTemplate() ? 1 : 0);
12954 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12961 S.
Diag(Fn->getLocation(),
12962 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12963 << QualsForPrinting;
12964 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12975 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
12998 S.
Diag(Fn->getLocation(),
12999 diag::note_ovl_candidate_inherited_constructor_slice)
13000 << (Fn->getPrimaryTemplate() ? 1 : 0)
13001 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
13002 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
13008 assert(!Available);
13016 std::string FnDesc;
13017 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
13018 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
13021 S.
Diag(Fn->getLocation(),
13022 diag::note_ovl_candidate_constraints_not_satisfied)
13023 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
13042 bool isLValueReference =
false;
13043 bool isRValueReference =
false;
13044 bool isPointer =
false;
13048 isLValueReference =
true;
13052 isRValueReference =
true;
13068 diag::note_ovl_surrogate_constraints_not_satisfied)
13082 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
13083 std::string TypeStr(
"operator");
13089 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13094 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13101 if (ICS.
isBad())
break;
13105 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
13122 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
13152 llvm_unreachable(
"Unhandled deduction result");
13157struct CompareOverloadCandidatesForDisplay {
13159 SourceLocation Loc;
13163 CompareOverloadCandidatesForDisplay(
13164 Sema &S, SourceLocation Loc,
size_t NArgs,
13166 : S(S), NumArgs(NArgs), CSK(CSK) {}
13176 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
13178 if (NumArgs < C->
Function->getMinRequiredArguments())
13185 bool operator()(
const OverloadCandidate *L,
13186 const OverloadCandidate *R) {
13188 if (L == R)
return false;
13192 if (!
R->Viable)
return true;
13194 if (
int Ord = CompareConversions(*L, *R))
13197 }
else if (
R->Viable)
13200 assert(L->
Viable ==
R->Viable);
13213 int RDist =
std::abs((
int)
R->getNumParams() - (
int)NumArgs);
13214 if (LDist == RDist) {
13215 if (LFailureKind == RFailureKind)
13223 return LDist < RDist;
13240 unsigned numRFixes =
R->Fix.NumConversionsFixed;
13241 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
13242 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
13243 if (numLFixes != numRFixes) {
13244 return numLFixes < numRFixes;
13248 if (
int Ord = CompareConversions(*L, *R))
13260 if (LRank != RRank)
13261 return LRank < RRank;
13287 struct ConversionSignals {
13288 unsigned KindRank = 0;
13291 static ConversionSignals ForSequence(ImplicitConversionSequence &
Seq) {
13292 ConversionSignals Sig;
13293 Sig.KindRank =
Seq.getKindRank();
13294 if (
Seq.isStandard())
13295 Sig.Rank =
Seq.Standard.getRank();
13296 else if (
Seq.isUserDefined())
13297 Sig.Rank =
Seq.UserDefined.After.getRank();
13303 static ConversionSignals ForObjectArgument() {
13313 int CompareConversions(
const OverloadCandidate &L,
13314 const OverloadCandidate &R) {
13319 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
13321 ? ConversionSignals::ForObjectArgument()
13322 : ConversionSignals::ForSequence(L.Conversions[I]);
13323 auto RS =
R.IgnoreObjectArgument
13324 ? ConversionSignals::ForObjectArgument()
13325 : ConversionSignals::ForSequence(
R.Conversions[I]);
13326 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
13327 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
13352 bool Unfixable =
false;
13358 for (
unsigned ConvIdx =
13362 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
13363 if (Cand->
Conversions[ConvIdx].isInitialized() &&
13372 bool SuppressUserConversions =
false;
13374 unsigned ConvIdx = 0;
13375 unsigned ArgIdx = 0;
13404 assert(ConvCount <= 3);
13410 ConvIdx != ConvCount && ArgIdx < Args.size();
13412 if (Cand->
Conversions[ConvIdx].isInitialized()) {
13414 }
else if (
ParamIdx < ParamTypes.size()) {
13415 if (ParamTypes[
ParamIdx]->isDependentType())
13416 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
13421 SuppressUserConversions,
13426 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
13445 for (
iterator Cand = Candidates.begin(), LastCand = Candidates.end();
13446 Cand != LastCand; ++Cand) {
13447 if (!Filter(*Cand))
13472 Cands.push_back(Cand);
13476 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
13483 bool DeferHint =
false;
13487 auto WrongSidedCands =
13489 return (Cand.
Viable ==
false &&
13495 DeferHint = !WrongSidedCands.empty();
13511 S.
Diag(PD.first, PD.second);
13516 bool NoteCands =
true;
13517 for (
const Expr *Arg : Args) {
13518 if (Arg->getType()->isWebAssemblyTableType())
13527 {Candidates.begin(), Candidates.end()});
13533 bool ReportedAmbiguousConversions =
false;
13536 unsigned CandsShown = 0;
13537 auto I = Cands.begin(), E = Cands.end();
13538 for (; I != E; ++I) {
13554 "Non-viable built-in candidates are not added to Cands.");
13561 if (!ReportedAmbiguousConversions) {
13563 ReportedAmbiguousConversions =
true;
13577 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13582 const Sema &S)
const {
13588 if (Caller && Caller->
hasAttr<CUDAHostAttr>() &&
13589 Caller->
hasAttr<CUDADeviceAttr>())
13610struct CompareTemplateSpecCandidatesForDisplay {
13612 CompareTemplateSpecCandidatesForDisplay(Sema &S) : S(S) {}
13614 bool operator()(
const TemplateSpecCandidate *L,
13615 const TemplateSpecCandidate *R) {
13646 Sema &S,
bool ForTakingAddress,
13653void TemplateSpecCandidateSet::destroyCandidates() {
13655 i->DeductionFailure.Destroy();
13660 destroyCandidates();
13661 Candidates.clear();
13674 Cands.reserve(
size());
13675 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
13676 if (Cand->Specialization)
13677 Cands.push_back(Cand);
13682 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
13689 unsigned CandsShown = 0;
13690 for (I = Cands.begin(), E = Cands.end(); I != E; ++I) {
13696 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
13701 "Non-matching built-in candidates are not added to Cands.");
13706 S.
Diag(Loc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13716 QualType Ret = PossiblyAFunctionType;
13719 Ret = ToTypePtr->getPointeeType();
13722 Ret = ToTypeRef->getPointeeType();
13725 Ret = MemTypePtr->getPointeeType();
13727 Context.getCanonicalType(Ret).getUnqualifiedType();
13732 bool Complain =
true) {
13749class AddressOfFunctionResolver {
13752 const QualType& TargetType;
13753 QualType TargetFunctionType;
13757 ASTContext& Context;
13759 bool TargetTypeIsNonStaticMemberFunction;
13760 bool FoundNonTemplateFunction;
13761 bool StaticMemberFunctionFromBoundPointer;
13762 bool HasComplained;
13764 OverloadExpr::FindResult OvlExprInfo;
13765 OverloadExpr *OvlExpr;
13766 TemplateArgumentListInfo OvlExplicitTemplateArgs;
13767 SmallVector<std::pair<DeclAccessPair, FunctionDecl*>, 4> Matches;
13768 TemplateSpecCandidateSet FailedCandidates;
13771 AddressOfFunctionResolver(Sema &S, Expr *SourceExpr,
13772 const QualType &TargetType,
bool Complain)
13773 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
13774 Complain(Complain), Context(S.getASTContext()),
13775 TargetTypeIsNonStaticMemberFunction(
13776 !!TargetType->getAs<MemberPointerType>()),
13777 FoundNonTemplateFunction(
false),
13778 StaticMemberFunctionFromBoundPointer(
false),
13779 HasComplained(
false),
13780 OvlExprInfo(OverloadExpr::find(SourceExpr)),
13782 FailedCandidates(OvlExpr->getNameLoc(),
true) {
13783 ExtractUnqualifiedFunctionTypeFromTargetType();
13786 if (UnresolvedMemberExpr *UME = dyn_cast<UnresolvedMemberExpr>(OvlExpr))
13787 if (!UME->isImplicitAccess() &&
13789 StaticMemberFunctionFromBoundPointer =
true;
13791 DeclAccessPair dap;
13793 OvlExpr,
false, &dap)) {
13794 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn))
13795 if (!
Method->isStatic()) {
13799 TargetTypeIsNonStaticMemberFunction =
true;
13807 Matches.push_back(std::make_pair(dap, Fn));
13815 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
13817 EliminateSuboptimalCudaMatches();
13821 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
13822 if (FoundNonTemplateFunction) {
13823 EliminateAllTemplateMatches();
13824 EliminateLessPartialOrderingConstrainedMatches();
13826 EliminateAllExceptMostSpecializedTemplate();
13831 bool hasComplained()
const {
return HasComplained; }
13834 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
13841 bool isBetterCandidate(
const FunctionDecl *A,
const FunctionDecl *B) {
13845 return candidateHasExactlyCorrectType(A) &&
13846 (!candidateHasExactlyCorrectType(B) ||
13852 bool eliminiateSuboptimalOverloadCandidates() {
13855 auto Best = Matches.begin();
13856 for (
auto I = Matches.begin()+1, E = Matches.end(); I != E; ++I)
13857 if (isBetterCandidate(I->second, Best->second))
13860 const FunctionDecl *BestFn = Best->second;
13861 auto IsBestOrInferiorToBest = [
this, BestFn](
13862 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
13863 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
13868 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
13870 Matches[0] = *Best;
13875 bool isTargetTypeAFunction()
const {
13884 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
13890 const DeclAccessPair& CurAccessFunPair) {
13891 if (CXXMethodDecl *
Method
13895 bool CanConvertToFunctionPointer =
13896 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13897 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13900 else if (TargetTypeIsNonStaticMemberFunction)
13910 TemplateDeductionInfo Info(FailedCandidates.
getLocation());
13914 Result != TemplateDeductionResult::Success) {
13932 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
13936 bool AddMatchingNonTemplateFunction(NamedDecl* Fn,
13937 const DeclAccessPair& CurAccessFunPair) {
13938 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn)) {
13941 bool CanConvertToFunctionPointer =
13942 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13943 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13946 else if (TargetTypeIsNonStaticMemberFunction)
13949 if (FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13956 if (FunDecl->isMultiVersion()) {
13957 const auto *TA = FunDecl->getAttr<TargetAttr>();
13958 if (TA && !TA->isDefaultVersion())
13960 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13961 if (TVA && !TVA->isDefaultVersion())
13969 HasComplained |= Complain;
13978 candidateHasExactlyCorrectType(FunDecl)) {
13979 Matches.push_back(std::make_pair(
13981 FoundNonTemplateFunction =
true;
13989 bool FindAllFunctionsThatMatchTargetTypeExactly() {
13994 if (IsInvalidFormOfPointerToMemberFunction())
13997 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
14001 NamedDecl *
Fn = (*I)->getUnderlyingDecl();
14010 = dyn_cast<FunctionTemplateDecl>(Fn)) {
14016 AddMatchingNonTemplateFunction(Fn, I.getPair()))
14019 assert(Ret || Matches.empty());
14023 void EliminateAllExceptMostSpecializedTemplate() {
14035 UnresolvedSet<4> MatchesCopy;
14036 for (
unsigned I = 0, E = Matches.size(); I != E; ++I)
14037 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
14042 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
14044 S.
PDiag(diag::err_addr_ovl_ambiguous)
14045 << Matches[0].second->getDeclName(),
14046 S.
PDiag(diag::note_ovl_candidate)
14047 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
14048 Complain, TargetFunctionType);
14052 Matches[0].first = Matches[
Result - MatchesCopy.
begin()].first;
14056 HasComplained |= Complain;
14059 void EliminateAllTemplateMatches() {
14062 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
14063 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
14066 Matches[I] = Matches[--N];
14072 void EliminateLessPartialOrderingConstrainedMatches() {
14077 assert(Matches[0].second->getPrimaryTemplate() ==
nullptr &&
14078 "Call EliminateAllTemplateMatches() first");
14079 SmallVector<std::pair<DeclAccessPair, FunctionDecl *>, 4> Results;
14080 Results.push_back(Matches[0]);
14081 for (
unsigned I = 1, N = Matches.size(); I < N; ++I) {
14082 assert(Matches[I].second->getPrimaryTemplate() ==
nullptr);
14084 S, Matches[I].second, Results[0].second,
14088 Results.push_back(Matches[I]);
14091 if (F == Matches[I].second) {
14093 Results.push_back(Matches[I]);
14096 std::swap(Matches, Results);
14099 void EliminateSuboptimalCudaMatches() {
14105 void ComplainNoMatchesFound()
const {
14106 assert(Matches.empty());
14108 << OvlExpr->
getName() << TargetFunctionType
14110 if (FailedCandidates.
empty())
14117 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
14120 if (FunctionDecl *Fun =
14121 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
14129 bool IsInvalidFormOfPointerToMemberFunction()
const {
14130 return TargetTypeIsNonStaticMemberFunction &&
14134 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
14142 bool IsStaticMemberFunctionFromBoundPointer()
const {
14143 return StaticMemberFunctionFromBoundPointer;
14146 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
14148 diag::err_invalid_form_pointer_member_function)
14152 void ComplainOfInvalidConversion()
const {
14154 << OvlExpr->
getName() << TargetType;
14157 void ComplainMultipleMatchesFound()
const {
14158 assert(Matches.size() > 1);
14165 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
14167 int getNumMatches()
const {
return Matches.size(); }
14169 FunctionDecl* getMatchingFunctionDecl()
const {
14170 if (Matches.size() != 1)
return nullptr;
14171 return Matches[0].second;
14174 const DeclAccessPair* getMatchingFunctionAccessPair()
const {
14175 if (Matches.size() != 1)
return nullptr;
14176 return &Matches[0].first;
14186 bool *pHadMultipleCandidates) {
14189 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
14191 int NumMatches = Resolver.getNumMatches();
14193 bool ShouldComplain = Complain && !Resolver.hasComplained();
14194 if (NumMatches == 0 && ShouldComplain) {
14195 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
14196 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
14198 Resolver.ComplainNoMatchesFound();
14200 else if (NumMatches > 1 && ShouldComplain)
14201 Resolver.ComplainMultipleMatchesFound();
14202 else if (NumMatches == 1) {
14203 Fn = Resolver.getMatchingFunctionDecl();
14207 FoundResult = *Resolver.getMatchingFunctionAccessPair();
14209 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
14210 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
14216 if (pHadMultipleCandidates)
14217 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
14225 bool IsResultAmbiguous =
false;
14233 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
14234 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
14241 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
14249 auto FoundBetter = [&]() {
14250 IsResultAmbiguous =
false;
14262 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
14264 if (PreferenceByCUDA != 0) {
14266 if (PreferenceByCUDA > 0)
14282 if (MoreConstrained != FD) {
14283 if (!MoreConstrained) {
14284 IsResultAmbiguous =
true;
14285 AmbiguousDecls.push_back(FD);
14294 if (IsResultAmbiguous)
14315 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
14317 assert(E->
getType() ==
Context.OverloadTy &&
"SrcExpr must be an overload");
14321 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
14322 Found->isCPUSpecificMultiVersion())
14370 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
14401 if (ForTypeDeduction &&
14415 if (FoundResult) *FoundResult = I.getPair();
14426 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
14428 unsigned DiagIDForComplaining) {
14449 if (!complain)
return false;
14452 diag::err_bound_member_function)
14465 SingleFunctionExpression =
14469 if (doFunctionPointerConversion) {
14470 SingleFunctionExpression =
14472 if (SingleFunctionExpression.
isInvalid()) {
14479 if (!SingleFunctionExpression.
isUsable()) {
14481 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
14483 << DestTypeForComplaining
14484 << OpRangeForComplaining
14495 SrcExpr = SingleFunctionExpression;
14505 bool PartialOverloading,
14512 if (ExplicitTemplateArgs) {
14513 assert(!KnownValid &&
"Explicit template arguments?");
14522 PartialOverloading);
14527 = dyn_cast<FunctionTemplateDecl>(Callee)) {
14529 ExplicitTemplateArgs, Args, CandidateSet,
14531 PartialOverloading);
14535 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
14541 bool PartialOverloading) {
14564 assert(!(*I)->getDeclContext()->isRecord());
14566 !(*I)->getDeclContext()->isFunctionOrMethod());
14567 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
14577 ExplicitTemplateArgs = &TABuffer;
14583 CandidateSet, PartialOverloading,
14588 Args, ExplicitTemplateArgs,
14589 CandidateSet, PartialOverloading);
14597 CandidateSet,
false,
false);
14604 case OO_New:
case OO_Array_New:
14605 case OO_Delete:
case OO_Array_Delete:
14628 if (DC->isTransparentContext())
14634 R.suppressDiagnostics();
14644 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
14649 if (FoundInClass) {
14650 *FoundInClass = RD;
14653 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
14670 AssociatedNamespaces,
14671 AssociatedClasses);
14675 for (Sema::AssociatedNamespaceSet::iterator
14676 it = AssociatedNamespaces.begin(),
14677 end = AssociatedNamespaces.end(); it !=
end; ++it) {
14689 SuggestedNamespaces.insert(*it);
14693 SemaRef.
Diag(R.getNameLoc(), diag::err_not_found_by_two_phase_lookup)
14694 << R.getLookupName();
14695 if (SuggestedNamespaces.empty()) {
14696 SemaRef.
Diag(Best->Function->getLocation(),
14697 diag::note_not_found_by_two_phase_lookup)
14698 << R.getLookupName() << 0;
14699 }
else if (SuggestedNamespaces.size() == 1) {
14700 SemaRef.
Diag(Best->Function->getLocation(),
14701 diag::note_not_found_by_two_phase_lookup)
14702 << R.getLookupName() << 1 << *SuggestedNamespaces.begin();
14707 SemaRef.
Diag(Best->Function->getLocation(),
14708 diag::note_not_found_by_two_phase_lookup)
14709 << R.getLookupName() << 2;
14740class BuildRecoveryCallExprRAII {
14742 Sema::SatisfactionStackResetRAII SatStack;
14745 BuildRecoveryCallExprRAII(Sema &S) : SemaRef(S), SatStack(S) {
14767 bool EmptyLookup,
bool AllowTypoCorrection) {
14775 BuildRecoveryCallExprRAII RCE(SemaRef);
14785 ExplicitTemplateArgs = &TABuffer;
14793 ExplicitTemplateArgs, Args, &FoundInClass)) {
14795 }
else if (EmptyLookup) {
14800 ExplicitTemplateArgs !=
nullptr,
14801 dyn_cast<MemberExpr>(Fn));
14803 AllowTypoCorrection
14809 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
14824 assert(!R.empty() &&
"lookup results empty despite recovery");
14827 if (R.isAmbiguous()) {
14828 R.suppressDiagnostics();
14835 if ((*R.begin())->isCXXClassMember())
14837 ExplicitTemplateArgs, S);
14838 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
14840 ExplicitTemplateArgs);
14864 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
14871 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
14873 llvm_unreachable(
"performing ADL for builtin");
14880 UnbridgedCastsSet UnbridgedCasts;
14895 if (CandidateSet->
empty() ||
14911 if (CandidateSet->
empty())
14914 UnbridgedCasts.restore();
14921 std::optional<QualType>
Result;
14941 if (Best && *Best != CS.
end())
14942 ConsiderCandidate(**Best);
14945 for (
const auto &
C : CS)
14947 ConsiderCandidate(
C);
14950 for (
const auto &
C : CS)
14951 ConsiderCandidate(
C);
14956 if (
Value.isNull() ||
Value->isUndeducedType())
14973 bool AllowTypoCorrection) {
14974 switch (OverloadResult) {
14985 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14991 if (*Best != CandidateSet->
end() &&
14995 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
15000 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
15010 CandidateSet->
empty(),
15011 AllowTypoCorrection);
15018 for (
const Expr *Arg : Args) {
15019 if (!Arg->getType()->isFunctionType())
15021 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
15022 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
15025 Arg->getExprLoc()))
15033 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
15034 << ULE->
getName() << Fn->getSourceRange()),
15042 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
15043 << ULE->
getName() << Fn->getSourceRange()),
15050 Fn->getSourceRange(), ULE->
getName(),
15051 *CandidateSet, FDecl, Args);
15060 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
15068 SubExprs.append(Args.begin(), Args.end());
15075 for (
auto I = CS.
begin(), E = CS.
end(); I != E; ++I) {
15090 bool AllowTypoCorrection,
15091 bool CalleesAddressIsTaken) {
15106 if (CalleesAddressIsTaken)
15117 Best != CandidateSet.
end()) {
15118 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
15119 M && M->isImplicitObjectMemberFunction()) {
15130 CUDA().recordPotentialODRUsedVariable(Args, CandidateSet);
15148 if (
const auto *TP =
15158 ExecConfig, &CandidateSet, &Best,
15159 OverloadResult, AllowTypoCorrection);
15168 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
15174 bool HadMultipleCandidates) {
15184 if (
Method->isExplicitObjectMemberFunction())
15188 E, std::nullopt, FoundDecl,
Method);
15192 if (
Method->getParent()->isLambda() &&
15193 Method->getConversionType()->isBlockPointerType()) {
15197 auto *CE = dyn_cast<CastExpr>(SubE);
15198 if (CE && CE->getCastKind() == CK_NoOp)
15199 SubE = CE->getSubExpr();
15201 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
15202 SubE = BE->getSubExpr();
15225 if (
Method->isExplicitObjectMemberFunction()) {
15231 Expr *ObjectParam = Exp.
get();
15245 Exp.
get()->getEndLoc(),
15260 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15277 Expr *Input,
bool PerformADL) {
15279 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15287 Expr *Args[2] = { Input,
nullptr };
15288 unsigned NumArgs = 1;
15293 if (Opc == UO_PostInc || Opc == UO_PostDec) {
15307 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
15318 if (Fn.isInvalid())
15329 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15348 if (
Method->isExplicitObjectMemberFunction())
15352 Input, std::nullopt, Best->FoundDecl,
Method);
15355 Base = Input = InputInit.
get();
15366 Input = InputInit.
get();
15371 Base, HadMultipleCandidates,
15383 Context, Op, FnExpr.
get(), ArgsArray, ResultTy,
VK, OpLoc,
15399 Input, Best->BuiltinParamTypes[0], Best->Conversions[0],
15404 Input = InputRes.
get();
15424 PDiag(diag::err_ovl_ambiguous_oper_unary)
15441 << (Msg !=
nullptr)
15442 << (Msg ? Msg->
getString() : StringRef())
15495 if (Op != OO_Equal && PerformADL) {
15502 Context.DeclarationNames.getCXXOperatorName(ExtraOp);
15528 Expr *RHS,
bool PerformADL,
15529 bool AllowRewrittenCandidates,
15531 Expr *Args[2] = { LHS, RHS };
15535 AllowRewrittenCandidates =
false;
15541 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
15562 if (Fn.isInvalid())
15571 if (Opc == BO_PtrMemD) {
15572 auto CheckPlaceholder = [&](
Expr *&Arg) {
15581 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
15605 if (Opc == BO_Assign &&
15614 Op, OpLoc, AllowRewrittenCandidates));
15616 CandidateSet.
exclude(DefaultedFn);
15619 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15628 bool IsReversed = Best->isReversed();
15630 std::swap(Args[0], Args[1]);
15647 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
15651 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
15652 : diag::err_ovl_rewrite_equalequal_not_bool)
15660 if (AllowRewrittenCandidates && !IsReversed &&
15670 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
15673 Best->Conversions[ArgIdx]) ==
15675 AmbiguousWith.push_back(Cand.
Function);
15682 if (!AmbiguousWith.empty()) {
15683 bool AmbiguousWithSelf =
15684 AmbiguousWith.size() == 1 &&
15686 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
15688 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
15690 if (AmbiguousWithSelf) {
15692 diag::note_ovl_ambiguous_oper_binary_reversed_self);
15697 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
15698 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
15700 !MD->hasCXXExplicitFunctionObjectParameter() &&
15701 Context.hasSameUnqualifiedType(
15702 MD->getFunctionObjectParameterType(),
15703 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
15704 Context.hasSameUnqualifiedType(
15705 MD->getFunctionObjectParameterType(),
15707 Context.hasSameUnqualifiedType(
15708 MD->getFunctionObjectParameterType(),
15711 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
15714 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
15715 for (
auto *F : AmbiguousWith)
15717 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
15725 if (Op == OO_Equal)
15736 if (
Method->isExplicitObjectMemberFunction()) {
15741 Args[0], std::nullopt, Best->FoundDecl,
Method);
15774 Best->FoundDecl,
Base,
15775 HadMultipleCandidates, OpLoc);
15786 const Expr *ImplicitThis =
nullptr;
15791 Context, ChosenOp, FnExpr.
get(), Args, ResultTy,
VK, OpLoc,
15796 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(FnDecl);
15799 ImplicitThis = ArgsArray[0];
15800 ArgsArray = ArgsArray.slice(1);
15807 if (Op == OO_Equal) {
15812 *
this,
AssignedEntity{Args[0], dyn_cast<CXXMethodDecl>(FnDecl)},
15815 if (ImplicitThis) {
15820 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
15824 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
15839 (Op == OO_Spaceship && IsReversed)) {
15840 if (Op == OO_ExclaimEqual) {
15841 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
15844 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
15846 Expr *ZeroLiteral =
15855 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.get(),
15856 IsReversed ? R.get() : ZeroLiteral,
true,
15864 assert(ChosenOp == Op &&
"unexpected operator name");
15868 if (Best->RewriteKind !=
CRK_None)
15877 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15882 Args[0] = ArgsRes0.
get();
15885 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15890 Args[1] = ArgsRes1.
get();
15900 if (Opc == BO_Comma)
15905 if (DefaultedFn && Opc == BO_Cmp) {
15907 Args[1], DefaultedFn);
15922 Opc >= BO_Assign && Opc <= BO_OrAssign) {
15923 Diag(OpLoc, diag::err_ovl_no_viable_oper)
15926 if (Args[0]->
getType()->isIncompleteType()) {
15927 Diag(OpLoc, diag::note_assign_lhs_incomplete)
15943 assert(
Result.isInvalid() &&
15944 "C++ binary operator overloading is missing candidates!");
15955 << Args[0]->getSourceRange()
15956 << Args[1]->getSourceRange()),
15967 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
15971 Diag(OpLoc, diag::err_ovl_deleted_comparison)
15972 << Args[0]->
getType() << DeletedFD;
15985 PDiag(diag::err_ovl_deleted_oper)
15987 .getCXXOverloadedOperator())
15988 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
15989 << Args[0]->getSourceRange() << Args[1]->getSourceRange()),
16013 "cannot use prvalue expressions more than once");
16014 Expr *OrigLHS = LHS;
16015 Expr *OrigRHS = RHS;
16032 true, DefaultedFn);
16033 if (
Less.isInvalid())
16060 for (; I >= 0; --I) {
16062 auto *VI = Info->lookupValueInfo(Comparisons[I].
Result);
16085 Context, OrigLHS, OrigRHS, BO_Cmp,
Result.get()->getType(),
16086 Result.get()->getValueKind(),
Result.get()->getObjectKind(), OpLoc,
16088 Expr *SemanticForm[] = {LHS, RHS,
Result.get()};
16098 unsigned NumArgsSlots =
16099 MethodArgs.size() + std::max<unsigned>(Args.size(), NumParams);
16102 MethodArgs.reserve(MethodArgs.size() + NumArgsSlots);
16103 bool IsError =
false;
16106 for (
unsigned i = 0; i != NumParams; i++) {
16108 if (i < Args.size()) {
16112 S.
Context, Method->getParamDecl(i)),
16126 MethodArgs.push_back(Arg);
16136 Args.push_back(
Base);
16137 for (
auto *e : ArgExpr) {
16141 Context.DeclarationNames.getCXXOperatorName(OO_Subscript);
16146 ArgExpr.back()->getEndLoc());
16158 if (Fn.isInvalid())
16168 UnbridgedCastsSet UnbridgedCasts;
16181 if (Args.size() == 2)
16184 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16204 if (
Method->isExplicitObjectMemberFunction()) {
16209 Args[0] = Res.
get();
16213 Args[0], std::nullopt, Best->FoundDecl,
Method);
16217 MethodArgs.push_back(Arg0.
get());
16221 *
this, MethodArgs,
Method, ArgExpr, LLoc);
16229 *
this, FnDecl, Best->FoundDecl,
Base, HadMultipleCandidates,
16240 Context, OO_Subscript, FnExpr.
get(), MethodArgs, ResultTy,
VK, RLoc,
16257 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
16262 Args[0] = ArgsRes0.
get();
16265 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
16270 Args[1] = ArgsRes1.
get();
16278 CandidateSet.
empty()
16279 ? (
PDiag(diag::err_ovl_no_oper)
16280 << Args[0]->getType() << 0
16281 << Args[0]->getSourceRange() << Range)
16282 : (
PDiag(diag::err_ovl_no_viable_subscript)
16283 << Args[0]->getType() << Args[0]->getSourceRange() << Range);
16290 if (Args.size() == 2) {
16293 LLoc,
PDiag(diag::err_ovl_ambiguous_oper_binary)
16295 << Args[0]->getSourceRange() << Range),
16300 PDiag(diag::err_ovl_ambiguous_subscript_call)
16302 << Args[0]->getSourceRange() << Range),
16311 PDiag(diag::err_ovl_deleted_oper)
16312 <<
"[]" << (Msg !=
nullptr)
16313 << (Msg ? Msg->
getString() : StringRef())
16314 << Args[0]->getSourceRange() << Range),
16328 Expr *ExecConfig,
bool IsExecConfig,
16329 bool AllowRecovery) {
16338 if (
BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
16339 assert(op->getType() ==
Context.BoundMemberTy);
16340 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
16353 QualType objectType = op->getLHS()->getType();
16354 if (op->getOpcode() == BO_PtrMemI)
16358 Qualifiers difference = objectQuals - funcQuals;
16362 std::string qualsString = difference.
getAsString();
16363 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
16366 << (qualsString.find(
' ') == std::string::npos ? 1 : 2);
16370 Context, MemExprE, Args, resultType, valueKind, RParenLoc,
16380 if (CheckOtherCall(call, proto))
16390 if (!AllowRecovery)
16392 std::vector<Expr *> SubExprs = {MemExprE};
16393 llvm::append_range(SubExprs, Args);
16401 UnbridgedCastsSet UnbridgedCasts;
16407 bool HadMultipleCandidates =
false;
16415 UnbridgedCasts.restore();
16433 TemplateArgs = &TemplateArgsBuffer;
16437 E = UnresExpr->
decls_end(); I != E; ++I) {
16439 QualType ExplicitObjectType = ObjectType;
16446 bool HasExplicitParameter =
false;
16447 if (
const auto *M = dyn_cast<FunctionDecl>(
Func);
16448 M && M->hasCXXExplicitFunctionObjectParameter())
16449 HasExplicitParameter =
true;
16450 else if (
const auto *M = dyn_cast<FunctionTemplateDecl>(
Func);
16452 M->getTemplatedDecl()->hasCXXExplicitFunctionObjectParameter())
16453 HasExplicitParameter =
true;
16455 if (HasExplicitParameter)
16463 }
else if ((
Method = dyn_cast<CXXMethodDecl>(
Func))) {
16470 ObjectClassification, Args, CandidateSet,
16474 I.getPair(), ActingDC, TemplateArgs,
16475 ExplicitObjectType, ObjectClassification,
16476 Args, CandidateSet,
16481 HadMultipleCandidates = (CandidateSet.
size() > 1);
16485 UnbridgedCasts.restore();
16488 bool Succeeded =
false;
16493 FoundDecl = Best->FoundDecl;
16513 PDiag(diag::err_ovl_no_viable_member_function_in_call)
16520 PDiag(diag::err_ovl_ambiguous_member_call)
16527 CandidateSet, Best->Function, Args,
true);
16538 MemExprE = Res.
get();
16542 if (
Method->isStatic()) {
16544 ExecConfig, IsExecConfig);
16554 assert(
Method &&
"Member call to something that isn't a method?");
16559 if (
Method->isExplicitObjectMemberFunction()) {
16567 HadMultipleCandidates, MemExpr->
getExprLoc());
16574 TheCall->setUsesMemberSyntax(
true);
16584 Proto->getNumParams());
16590 return BuildRecoveryExpr(ResultType);
16595 return BuildRecoveryExpr(ResultType);
16605 if (
auto *MemE = dyn_cast<MemberExpr>(NakedMemExpr)) {
16606 if (
const EnableIfAttr *
Attr =
16608 Diag(MemE->getMemberLoc(),
16609 diag::err_ovl_no_viable_member_function_in_call)
16612 diag::note_ovl_candidate_disabled_by_function_cond_attr)
16613 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
16619 TheCall->getDirectCallee()->isPureVirtual()) {
16625 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
16636 if (
auto *DD = dyn_cast<CXXDestructorDecl>(TheCall->getDirectCallee())) {
16640 CallCanBeVirtual,
true,
16645 TheCall->getDirectCallee());
16657 UnbridgedCastsSet UnbridgedCasts;
16661 assert(
Object.get()->getType()->isRecordType() &&
16662 "Requires object type argument");
16676 diag::err_incomplete_object_call,
Object.get()))
16679 auto *
Record =
Object.get()->getType()->castAsCXXRecordDecl();
16682 R.suppressAccessDiagnostics();
16685 Oper != OperEnd; ++Oper) {
16699 bool IgnoreSurrogateFunctions =
false;
16702 if (!Candidate.
Viable &&
16704 IgnoreSurrogateFunctions =
true;
16726 !IgnoreSurrogateFunctions && I != E; ++I) {
16748 Object.get(), Args, CandidateSet);
16753 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16766 CandidateSet.
empty()
16767 ? (
PDiag(diag::err_ovl_no_oper)
16768 <<
Object.get()->getType() << 1
16769 <<
Object.get()->getSourceRange())
16770 : (
PDiag(diag::err_ovl_no_viable_object_call)
16771 <<
Object.get()->getType() <<
Object.get()->getSourceRange());
16778 if (!R.isAmbiguous())
16781 PDiag(diag::err_ovl_ambiguous_object_call)
16782 <<
Object.get()->getType()
16783 <<
Object.get()->getSourceRange()),
16794 PDiag(diag::err_ovl_deleted_object_call)
16795 <<
Object.get()->getType() << (Msg !=
nullptr)
16796 << (Msg ? Msg->
getString() : StringRef())
16797 <<
Object.get()->getSourceRange()),
16803 if (Best == CandidateSet.
end())
16806 UnbridgedCasts.restore();
16808 if (Best->Function ==
nullptr) {
16813 Best->Conversions[0].UserDefined.ConversionFunction);
16819 assert(Conv == Best->FoundDecl.getDecl() &&
16820 "Found Decl & conversion-to-functionptr should be same, right?!");
16828 Conv, HadMultipleCandidates);
16829 if (
Call.isInvalid())
16833 Context,
Call.get()->getType(), CK_UserDefinedConversion,
Call.get(),
16847 if (
Method->isInvalidDecl())
16854 Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc);
16857 Obj, HadMultipleCandidates,
16864 MethodArgs.reserve(NumParams + 1);
16866 bool IsError =
false;
16870 if (
Method->isExplicitObjectMemberFunction()) {
16879 MethodArgs.push_back(
Object.get());
16883 *
this, MethodArgs,
Method, Args, LParenLoc);
16886 if (Proto->isVariadic()) {
16888 for (
unsigned i = NumParams, e = Args.size(); i < e; i++) {
16892 MethodArgs.push_back(Arg.
get());
16907 Context, OO_Call, NewFn.
get(), MethodArgs, ResultTy,
VK, RParenLoc,
16921 bool *NoArrowOperatorFound) {
16922 assert(
Base->getType()->isRecordType() &&
16923 "left-hand side must have class type");
16937 Context.DeclarationNames.getCXXOperatorName(OO_Arrow);
16941 diag::err_typecheck_incomplete_tag,
Base))
16946 R.suppressAccessDiagnostics();
16949 Oper != OperEnd; ++Oper) {
16955 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16966 if (CandidateSet.
empty()) {
16968 if (NoArrowOperatorFound) {
16971 *NoArrowOperatorFound =
true;
16974 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
16975 << BaseType <<
Base->getSourceRange();
16976 if (BaseType->isRecordType() && !BaseType->isPointerType()) {
16977 Diag(OpLoc, diag::note_typecheck_member_reference_suggestion)
16981 Diag(OpLoc, diag::err_ovl_no_viable_oper)
16982 <<
"operator->" <<
Base->getSourceRange();
16987 if (!R.isAmbiguous())
16990 <<
"->" <<
Base->getType()
16991 <<
Base->getSourceRange()),
16999 <<
"->" << (Msg !=
nullptr)
17000 << (Msg ? Msg->
getString() : StringRef())
17001 <<
Base->getSourceRange()),
17012 if (
Method->isExplicitObjectMemberFunction()) {
17019 Base, std::nullopt, Best->FoundDecl,
Method);
17027 Base, HadMultipleCandidates, OpLoc);
17061 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
17074 PDiag(diag::err_ovl_no_viable_function_in_call)
17075 << R.getLookupName()),
17082 << R.getLookupName()),
17089 nullptr, HadMultipleCandidates,
17092 if (Fn.isInvalid())
17098 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
17104 ConvArgs[ArgIdx] = InputInit.
get();
17131 Scope *S =
nullptr;
17134 if (!MemberLookup.
empty()) {
17161 if (CandidateSet->
empty() || CandidateSetError) {
17174 Loc,
nullptr, CandidateSet, &Best,
17187 if (
ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
17192 if (SubExpr.
get() == PE->getSubExpr())
17196 ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.
get());
17204 assert(
Context.hasSameType(ICE->getSubExpr()->getType(),
17206 "Implicit cast type cannot be determined from overload");
17207 assert(ICE->path_empty() &&
"fixing up hierarchy conversion?");
17208 if (SubExpr.
get() == ICE->getSubExpr())
17216 if (
auto *GSE = dyn_cast<GenericSelectionExpr>(E)) {
17217 if (!GSE->isResultDependent()) {
17222 if (SubExpr.
get() == GSE->getResultExpr())
17229 unsigned ResultIdx = GSE->getResultIndex();
17230 AssocExprs[ResultIdx] = SubExpr.
get();
17232 if (GSE->isExprPredicate())
17234 Context, GSE->getGenericLoc(), GSE->getControllingExpr(),
17235 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17236 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17239 Context, GSE->getGenericLoc(), GSE->getControllingType(),
17240 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17241 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17250 assert(UnOp->getOpcode() == UO_AddrOf &&
17251 "Can only take the address of an overloaded function");
17253 if (!
Method->isImplicitObjectMemberFunction()) {
17264 if (SubExpr.
get() == UnOp->getSubExpr())
17272 "fixed to something other than a decl ref");
17275 assert(Qualifier &&
17276 "fixed to a member ref with no nested name qualifier");
17282 Fn->getType(), Qualifier,
17285 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
17290 UnOp->getOperatorLoc(),
false,
17298 if (SubExpr.
get() == UnOp->getSubExpr())
17311 if (ULE->hasExplicitTemplateArgs()) {
17312 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
17313 TemplateArgs = &TemplateArgsBuffer;
17318 getLangOpts().CPlusPlus && !Fn->hasCXXExplicitFunctionObjectParameter()
17323 if (
unsigned BID = Fn->getBuiltinID()) {
17324 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
17331 Fn,
Type, ValueKind, ULE->getNameInfo(), ULE->getQualifierLoc(),
17332 Found.getDecl(), ULE->getTemplateKeywordLoc(), TemplateArgs);
17340 if (MemExpr->hasExplicitTemplateArgs()) {
17341 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
17342 TemplateArgs = &TemplateArgsBuffer;
17349 if (MemExpr->isImplicitAccess()) {
17352 Fn, Fn->getType(),
VK_LValue, MemExpr->getNameInfo(),
17353 MemExpr->getQualifierLoc(),
Found.getDecl(),
17354 MemExpr->getTemplateKeywordLoc(), TemplateArgs);
17359 if (MemExpr->getQualifier())
17360 Loc = MemExpr->getQualifierLoc().getBeginLoc();
17365 Base = MemExpr->getBase();
17371 type = Fn->getType();
17378 Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),
17379 MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn,
Found,
17380 true, MemExpr->getMemberNameInfo(),
17384 llvm_unreachable(
"Invalid reference to overloaded function");
17395 if (!PartialOverloading || !
Function)
17399 if (
const auto *Proto =
17400 dyn_cast<FunctionProtoType>(
Function->getFunctionType()))
17401 if (Proto->isTemplateVariadic())
17403 if (
auto *Pattern =
Function->getTemplateInstantiationPattern())
17404 if (
const auto *Proto =
17405 dyn_cast<FunctionProtoType>(Pattern->getFunctionType()))
17406 if (Proto->isTemplateVariadic())
17419 << IsMember << Name << (Msg !=
nullptr)
17420 << (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.
@ PackIndex
Index of a pack indexing expression or specifier.
@ 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.