40#include "llvm/ADT/DenseSet.h"
41#include "llvm/ADT/STLExtras.h"
42#include "llvm/ADT/STLForwardCompat.h"
43#include "llvm/ADT/ScopeExit.h"
44#include "llvm/ADT/SmallPtrSet.h"
45#include "llvm/ADT/SmallVector.h"
59 return P->hasAttr<PassObjectSizeAttr>();
80 if (HadMultipleCandidates)
91 CK_FunctionToPointerDecay);
95 bool InOverloadResolution,
98 bool AllowObjCWritebackConversion);
102 bool InOverloadResolution,
110 bool AllowObjCConversionOnExplicit);
178 return Rank[(int)Kind];
203 static const char *
const Name[] = {
207 "Function-to-pointer",
208 "Function pointer conversion",
210 "Integral promotion",
211 "Floating point promotion",
213 "Integral conversion",
214 "Floating conversion",
215 "Complex conversion",
216 "Floating-integral conversion",
217 "Pointer conversion",
218 "Pointer-to-member conversion",
219 "Boolean conversion",
220 "Compatible-types conversion",
221 "Derived-to-base conversion",
223 "SVE Vector conversion",
224 "RVV Vector conversion",
226 "Complex-real conversion",
227 "Block Pointer conversion",
228 "Transparent Union Conversion",
229 "Writeback conversion",
230 "OpenCL Zero Event Conversion",
231 "OpenCL Zero Queue Conversion",
232 "C specific type conversion",
233 "Incompatible pointer conversion",
234 "Fixed point conversion",
235 "HLSL vector truncation",
236 "HLSL matrix truncation",
237 "Non-decaying array conversion",
315 FromType = Context.getArrayDecayedType(FromType);
327 const Expr *Converted) {
330 if (
auto *EWC = dyn_cast<ExprWithCleanups>(Converted)) {
337 while (
auto *ICE = dyn_cast<ImplicitCastExpr>(Converted)) {
338 switch (ICE->getCastKind()) {
340 case CK_IntegralCast:
341 case CK_IntegralToBoolean:
342 case CK_IntegralToFloating:
343 case CK_BooleanToSignedIntegral:
344 case CK_FloatingToIntegral:
345 case CK_FloatingToBoolean:
346 case CK_FloatingCast:
347 Converted = ICE->getSubExpr();
371 QualType &ConstantType,
bool IgnoreFloatToIntegralConversion)
const {
373 "narrowing check outside C++");
384 ToType = ED->getIntegerType();
390 goto FloatingIntegralConversion;
392 goto IntegralConversion;
403 FloatingIntegralConversion:
408 if (IgnoreFloatToIntegralConversion)
411 assert(
Initializer &&
"Unknown conversion expression");
417 if (std::optional<llvm::APSInt> IntConstantValue =
421 Result.convertFromAPInt(*IntConstantValue, IntConstantValue->isSigned(),
422 llvm::APFloat::rmNearestTiesToEven);
424 llvm::APSInt ConvertedValue = *IntConstantValue;
426 llvm::APFloat::opStatus Status =
Result.convertToInteger(
427 ConvertedValue, llvm::APFloat::rmTowardZero, &ignored);
430 if (Status == llvm::APFloat::opInvalidOp ||
431 *IntConstantValue != ConvertedValue) {
432 ConstantValue =
APValue(*IntConstantValue);
460 Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue)))) {
463 ConstantValue = R.Val;
464 assert(ConstantValue.
isFloat());
465 llvm::APFloat FloatVal = ConstantValue.
getFloat();
468 llvm::APFloat Converted = FloatVal;
469 llvm::APFloat::opStatus ConvertStatus =
471 llvm::APFloat::rmNearestTiesToEven, &ignored);
473 llvm::APFloat::rmNearestTiesToEven, &ignored);
475 if (FloatVal.isNaN() && Converted.isNaN() &&
476 !FloatVal.isSignaling() && !Converted.isSignaling()) {
482 if (!Converted.bitwiseIsEqual(FloatVal)) {
489 if (ConvertStatus & llvm::APFloat::opOverflow) {
511 IntegralConversion: {
519 constexpr auto CanRepresentAll = [](
bool FromSigned,
unsigned FromWidth,
520 bool ToSigned,
unsigned ToWidth) {
521 return (FromWidth < ToWidth + (FromSigned == ToSigned)) &&
522 !(FromSigned && !ToSigned);
525 if (CanRepresentAll(FromSigned, FromWidth, ToSigned, ToWidth))
531 bool DependentBitField =
false;
533 if (BitField->getBitWidth()->isValueDependent())
534 DependentBitField =
true;
535 else if (
unsigned BitFieldWidth = BitField->getBitWidthValue();
536 BitFieldWidth < FromWidth) {
537 if (CanRepresentAll(FromSigned, BitFieldWidth, ToSigned, ToWidth))
541 FromWidth = BitFieldWidth;
549 std::optional<llvm::APSInt> OptInitializerValue =
551 if (!OptInitializerValue) {
555 if (DependentBitField && !(FromSigned && !ToSigned))
561 llvm::APSInt &InitializerValue = *OptInitializerValue;
562 bool Narrowing =
false;
563 if (FromWidth < ToWidth) {
566 if (InitializerValue.isSigned() && InitializerValue.isNegative())
572 InitializerValue.extend(InitializerValue.getBitWidth() + 1);
574 llvm::APSInt ConvertedValue = InitializerValue;
575 ConvertedValue = ConvertedValue.trunc(ToWidth);
576 ConvertedValue.setIsSigned(ToSigned);
577 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
578 ConvertedValue.setIsSigned(InitializerValue.isSigned());
580 if (ConvertedValue != InitializerValue)
585 ConstantValue =
APValue(InitializerValue);
601 ConstantValue = R.Val;
602 assert(ConstantValue.
isFloat());
603 llvm::APFloat FloatVal = ConstantValue.
getFloat();
608 if (FloatVal.isNaN() && FloatVal.isSignaling()) {
624 raw_ostream &OS = llvm::errs();
625 bool PrintedSomething =
false;
628 PrintedSomething =
true;
632 if (PrintedSomething) {
638 OS <<
" (by copy constructor)";
640 OS <<
" (direct reference binding)";
642 OS <<
" (reference binding)";
644 PrintedSomething =
true;
648 if (PrintedSomething) {
652 PrintedSomething =
true;
655 if (!PrintedSomething) {
656 OS <<
"No conversions required";
663 raw_ostream &OS = llvm::errs();
671 OS <<
"aggregate initialization";
681 raw_ostream &OS = llvm::errs();
683 OS <<
"Worst list element conversion: ";
684 switch (ConversionKind) {
686 OS <<
"Standard conversion: ";
690 OS <<
"User-defined conversion: ";
694 OS <<
"Ellipsis conversion";
697 OS <<
"Ambiguous conversion";
700 OS <<
"Bad conversion";
725 struct DFIArguments {
731 struct DFIParamWithArguments : DFIArguments {
736 struct DFIDeducedMismatchArgs : DFIArguments {
737 TemplateArgumentList *TemplateArgs;
738 unsigned CallArgIndex;
743 TemplateArgumentList *TemplateArgs;
744 ConstraintSatisfaction Satisfaction;
755 Result.Result =
static_cast<unsigned>(TDK);
756 Result.HasDiagnostic =
false;
776 Result.HasDiagnostic =
true;
783 auto *Saved =
new (Context) DFIDeducedMismatchArgs;
794 DFIArguments *Saved =
new (Context) DFIArguments;
806 DFIParamWithArguments *Saved =
new (Context) DFIParamWithArguments;
807 Saved->Param = Info.
Param;
820 Result.HasDiagnostic =
true;
825 CNSInfo *Saved =
new (Context) CNSInfo;
835 llvm_unreachable(
"not a deduction failure");
868 Diag->~PartialDiagnosticAt();
875 static_cast<CNSInfo *
>(
Data)->Satisfaction.~ConstraintSatisfaction();
878 Diag->~PartialDiagnosticAt();
914 return TemplateParameter::getFromOpaqueValue(
Data);
919 return static_cast<DFIParamWithArguments*
>(
Data)->Param;
949 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->TemplateArgs;
955 return static_cast<CNSInfo*
>(
Data)->TemplateArgs;
987 return &
static_cast<DFIArguments*
>(
Data)->FirstArg;
1019 return &
static_cast<DFIArguments*
>(
Data)->SecondArg;
1034 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->CallArgIndex;
1037 return std::nullopt;
1050 for (
unsigned I = 0; I <
X->getNumParams(); ++I)
1054 if (
auto *FTX =
X->getDescribedFunctionTemplate()) {
1059 FTY->getTemplateParameters()))
1068 OverloadedOperatorKind::OO_EqualEqual);
1080 OverloadedOperatorKind::OO_ExclaimEqual);
1098 auto *NotEqFD = Op->getAsFunction();
1099 if (
auto *UD = dyn_cast<UsingShadowDecl>(Op))
1100 NotEqFD = UD->getUnderlyingDecl()->getAsFunction();
1113 return Op == OO_EqualEqual || Op == OO_Spaceship;
1121 if (Op == OverloadedOperatorKind::OO_EqualEqual) {
1122 assert(OriginalArgs.size() == 2);
1124 S,
OpLoc, OriginalArgs[1], FD))
1135void OverloadCandidateSet::destroyCandidates() {
1136 for (
iterator i = Candidates.begin(), e = Candidates.end(); i != e; ++i) {
1137 for (
auto &
C : i->Conversions)
1138 C.~ImplicitConversionSequence();
1140 i->DeductionFailure.Destroy();
1145 destroyCandidates();
1146 SlabAllocator.Reset();
1147 NumInlineBytesUsed = 0;
1151 FirstDeferredCandidate =
nullptr;
1152 DeferredCandidatesCount = 0;
1153 HasDeferredTemplateConstructors =
false;
1154 ResolutionByPerfectCandidateIsDisabled =
false;
1158 class UnbridgedCastsSet {
1168 Entry entry = { &E, E };
1169 Entries.push_back(entry);
1174 for (SmallVectorImpl<Entry>::iterator
1175 i = Entries.begin(), e = Entries.end(); i != e; ++i)
1176 *i->Addr = i->Saved;
1190 UnbridgedCastsSet *unbridgedCasts =
nullptr) {
1194 if (placeholder->getKind() == BuiltinType::Overload)
return false;
1198 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
1200 unbridgedCasts->save(S, E);
1220 UnbridgedCastsSet &unbridged) {
1221 for (
unsigned i = 0, e = Args.size(); i != e; ++i)
1230 bool NewIsUsingDecl) {
1235 bool OldIsUsingDecl =
false;
1237 OldIsUsingDecl =
true;
1241 if (NewIsUsingDecl)
continue;
1248 if ((OldIsUsingDecl || NewIsUsingDecl) && !
isVisible(*I))
1256 bool UseMemberUsingDeclRules =
1257 (OldIsUsingDecl || NewIsUsingDecl) &&
CurContext->isRecord() &&
1258 !
New->getFriendObjectKind();
1262 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
1268 !shouldLinkPossiblyHiddenDecl(*I,
New))
1287 }
else if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(OldD)) {
1294 if (UUD->getQualifier().isDependent() && !UUD->isCXXClassMember()) {
1322 if (
New->getFriendObjectKind() &&
New->getQualifier() &&
1323 !
New->getDescribedFunctionTemplate() &&
1324 !
New->getDependentSpecializationInfo() &&
1325 !
New->getType()->isDependentType()) {
1330 New->setInvalidDecl();
1342 assert(D &&
"function decl should not be null");
1343 if (
auto *A = D->
getAttr<AttrT>())
1344 return !A->isImplicit();
1350 bool UseMemberUsingDeclRules,
1351 bool ConsiderCudaAttrs,
1352 bool UseOverrideRules =
false) {
1358 if (
New->isMSVCRTEntryPoint())
1369 if ((OldTemplate ==
nullptr) != (NewTemplate ==
nullptr))
1392 if (OldQType != NewQType && OldType->isVariadic() != NewType->isVariadic())
1396 if ((
New->isMemberLikeConstrainedFriend() ||
1407 OldDecl = OldTemplate;
1408 NewDecl = NewTemplate;
1426 bool ConstraintsInTemplateHead =
1437 if (UseMemberUsingDeclRules && ConstraintsInTemplateHead &&
1438 !SameTemplateParameterList)
1440 if (!UseMemberUsingDeclRules &&
1441 (!SameTemplateParameterList || !SameReturnType))
1445 const auto *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1446 const auto *NewMethod = dyn_cast<CXXMethodDecl>(
New);
1448 int OldParamsOffset = 0;
1449 int NewParamsOffset = 0;
1457 if (ThisType.isConstQualified())
1477 BS.
Quals = NormalizeQualifiers(OldMethod, BS.
Quals);
1478 DS.Quals = NormalizeQualifiers(NewMethod, DS.Quals);
1480 if (OldMethod->isExplicitObjectMemberFunction()) {
1482 DS.Quals.removeVolatile();
1485 return BS.
Quals == DS.Quals;
1489 auto BS =
Base.getNonReferenceType().getCanonicalType().split();
1490 auto DS = D.getNonReferenceType().getCanonicalType().split();
1492 if (!AreQualifiersEqual(BS, DS))
1495 if (OldMethod->isImplicitObjectMemberFunction() &&
1496 OldMethod->getParent() != NewMethod->getParent()) {
1508 if (
Base->isLValueReferenceType())
1509 return D->isLValueReferenceType();
1510 return Base->isRValueReferenceType() == D->isRValueReferenceType();
1515 auto DiagnoseInconsistentRefQualifiers = [&]() {
1516 if (SemaRef.
LangOpts.CPlusPlus23 && !UseOverrideRules)
1518 if (OldMethod->getRefQualifier() == NewMethod->getRefQualifier())
1520 if (OldMethod->isExplicitObjectMemberFunction() ||
1521 NewMethod->isExplicitObjectMemberFunction())
1523 if (!UseMemberUsingDeclRules && (OldMethod->getRefQualifier() ==
RQ_None ||
1524 NewMethod->getRefQualifier() ==
RQ_None)) {
1525 SemaRef.
Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
1526 << NewMethod->getRefQualifier() << OldMethod->getRefQualifier();
1527 SemaRef.
Diag(OldMethod->getLocation(), diag::note_previous_declaration);
1536 bool ShouldDiagnoseInconsistentRefQualifiers =
false;
1537 bool HaveInconsistentQualifiers =
false;
1539 if (OldMethod && OldMethod->isExplicitObjectMemberFunction())
1541 if (NewMethod && NewMethod->isExplicitObjectMemberFunction())
1544 if (OldType->getNumParams() - OldParamsOffset !=
1545 NewType->getNumParams() - NewParamsOffset ||
1547 {OldType->param_type_begin() + OldParamsOffset,
1548 OldType->param_type_end()},
1549 {NewType->param_type_begin() + NewParamsOffset,
1550 NewType->param_type_end()},
1555 if (OldMethod && NewMethod && !OldMethod->isStatic() &&
1556 !NewMethod->isStatic()) {
1557 bool HaveCorrespondingObjectParameters = [&](
const CXXMethodDecl *Old,
1559 auto NewObjectType =
New->getFunctionObjectParameterReferenceType();
1563 return F->getRefQualifier() ==
RQ_None &&
1564 !F->isExplicitObjectMemberFunction();
1567 if (IsImplicitWithNoRefQual(Old) != IsImplicitWithNoRefQual(
New) &&
1568 CompareType(OldObjectType.getNonReferenceType(),
1569 NewObjectType.getNonReferenceType()))
1571 return CompareType(OldObjectType, NewObjectType);
1572 }(OldMethod, NewMethod);
1574 if (!HaveCorrespondingObjectParameters) {
1575 ShouldDiagnoseInconsistentRefQualifiers =
true;
1579 if (!UseOverrideRules || (!NewMethod->isExplicitObjectMemberFunction() &&
1580 !OldMethod->isExplicitObjectMemberFunction()))
1581 HaveInconsistentQualifiers =
true;
1585 if (NewMethod && OldMethod && OldMethod->isImplicitObjectMemberFunction() &&
1586 NewMethod->isImplicitObjectMemberFunction())
1587 ShouldDiagnoseInconsistentRefQualifiers =
true;
1589 if (!UseOverrideRules &&
1593 if (!NewRC != !OldRC)
1613 NewI =
New->specific_attr_begin<EnableIfAttr>(),
1614 NewE =
New->specific_attr_end<EnableIfAttr>(),
1617 NewI != NewE || OldI != OldE; ++NewI, ++OldI) {
1618 if (NewI == NewE || OldI == OldE)
1620 llvm::FoldingSetNodeID NewID, OldID;
1621 NewI->getCond()->Profile(NewID, SemaRef.
Context,
true);
1622 OldI->getCond()->Profile(OldID, SemaRef.
Context,
true);
1627 if ((ShouldDiagnoseInconsistentRefQualifiers &&
1628 DiagnoseInconsistentRefQualifiers()) ||
1629 HaveInconsistentQualifiers)
1633 if (SemaRef.
getLangOpts().CUDA && ConsiderCudaAttrs) {
1641 "Unexpected invalid target.");
1645 if (NewTarget != OldTarget) {
1648 if (OldMethod && NewMethod && OldMethod->isVirtual() &&
1649 OldMethod->isConstexpr() && !NewMethod->isConstexpr() &&
1667 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1673 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1686 bool SuppressUserConversions,
1688 bool InOverloadResolution,
1690 bool AllowObjCWritebackConversion,
1691 bool AllowObjCConversionOnExplicit) {
1694 if (SuppressUserConversions) {
1705 Conversions, AllowExplicit,
1706 AllowObjCConversionOnExplicit)) {
1727 bool FromListInit =
false;
1728 if (
const auto *InitList = dyn_cast<InitListExpr>(From);
1729 InitList && InitList->getNumInits() == 1 &&
1731 const Expr *SingleInit = InitList->getInit(0);
1732 FromType = SingleInit->
getType();
1734 FromListInit =
true;
1743 if ((FromCanon == ToCanon ||
1755 if (ToCanon != FromCanon)
1766 Cand != Conversions.
end(); ++Cand)
1807static ImplicitConversionSequence
1809 bool SuppressUserConversions,
1811 bool InOverloadResolution,
1813 bool AllowObjCWritebackConversion,
1814 bool AllowObjCConversionOnExplicit) {
1817 ICS.
Standard, CStyle, AllowObjCWritebackConversion)){
1868 bool CanConvert =
false;
1874 FromResType->getWrappedType()) &&
1876 FromResType->getContainedType()) &&
1877 ToResType->getAttrs() == FromResType->getAttrs())
1879 }
else if (ToTy->isHLSLResourceType()) {
1893 AllowExplicit, InOverloadResolution, CStyle,
1894 AllowObjCWritebackConversion,
1895 AllowObjCConversionOnExplicit);
1898ImplicitConversionSequence
1900 bool SuppressUserConversions,
1902 bool InOverloadResolution,
1904 bool AllowObjCWritebackConversion) {
1905 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1906 AllowExplicit, InOverloadResolution, CStyle,
1907 AllowObjCWritebackConversion,
1913 bool AllowExplicit) {
1918 bool AllowObjCWritebackConversion =
1925 *
this, From, ToType,
1927 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1929 false, AllowObjCWritebackConversion,
1943 if (
Context.hasSameUnqualifiedType(FromType, ToType))
1956 if (TyClass != CanFrom->getTypeClass())
return false;
1957 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1958 if (TyClass == Type::Pointer) {
1961 }
else if (TyClass == Type::BlockPointer) {
1964 }
else if (TyClass == Type::MemberPointer) {
1971 CanTo = ToMPT->getPointeeType();
1977 TyClass = CanTo->getTypeClass();
1978 if (TyClass != CanFrom->getTypeClass())
return false;
1979 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1989 bool Changed =
false;
1997 const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn);
1998 const auto *ToFPT = dyn_cast<FunctionProtoType>(ToFn);
2000 if (FromFPT && ToFPT) {
2001 if (FromFPT->hasCFIUncheckedCallee() != ToFPT->hasCFIUncheckedCallee()) {
2003 FromFPT->getReturnType(), FromFPT->getParamTypes(),
2004 FromFPT->getExtProtoInfo().withCFIUncheckedCallee(
2005 ToFPT->hasCFIUncheckedCallee()));
2013 if (FromFPT && ToFPT) {
2014 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
2026 bool CanUseToFPT, CanUseFromFPT;
2027 if (
Context.mergeExtParameterInfo(ToFPT, FromFPT, CanUseToFPT,
2028 CanUseFromFPT, NewParamInfos) &&
2029 CanUseToFPT && !CanUseFromFPT) {
2032 NewParamInfos.empty() ?
nullptr : NewParamInfos.data();
2034 FromFPT->getParamTypes(), ExtInfo);
2039 if (
Context.hasAnyFunctionEffects()) {
2044 const auto FromFX = FromFPT->getFunctionEffects();
2045 const auto ToFX = ToFPT->getFunctionEffects();
2046 if (FromFX != ToFX) {
2050 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
2060 assert(
QualType(FromFn, 0).isCanonical());
2061 if (
QualType(FromFn, 0) != CanTo)
return false;
2088 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
2089 &ToSem == &llvm::APFloat::IEEEquad()) ||
2090 (&FromSem == &llvm::APFloat::IEEEquad() &&
2091 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2147 bool InOverloadResolution,
bool CStyle) {
2157 if (ToMatrixType && FromMatrixType) {
2159 unsigned ToCols = ToMatrixType->getNumColumns();
2160 if (FromCols < ToCols)
2163 unsigned FromRows = FromMatrixType->
getNumRows();
2164 unsigned ToRows = ToMatrixType->getNumRows();
2165 if (FromRows < ToRows)
2168 if (FromRows == ToRows && FromCols == ToCols)
2174 QualType ToElTy = ToMatrixType->getElementType();
2183 QualType ToElTy = ToMatrixType->getElementType();
2186 if (FromMatrixType && !ToMatrixType) {
2205 bool InOverloadResolution,
bool CStyle) {
2222 if (ToExtType && FromExtType) {
2224 unsigned ToElts = ToExtType->getNumElements();
2225 if (FromElts < ToElts)
2227 if (FromElts == ToElts)
2233 QualType ToElTy = ToExtType->getElementType();
2238 if (FromExtType && !ToExtType) {
2252 if (ToExtType->getNumElements() != FromExtType->getNumElements())
2257 FromExtType->getElementType()->isIntegerType()) {
2269 QualType ToElTy = ToExtType->getElementType();
2304 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
2309 !InOverloadResolution && !CStyle) {
2311 << FromType << ToType;
2322 bool InOverloadResolution,
2323 StandardConversionSequence &SCS,
2328 bool InOverloadResolution,
2329 StandardConversionSequence &SCS,
2341 bool InOverloadResolution,
2344 bool AllowObjCWritebackConversion) {
2370 FromType = Fn->getType();
2390 if (Method && !Method->isStatic() &&
2391 !Method->isExplicitObjectMemberFunction()) {
2393 "Non-unary operator on non-static member address");
2396 "Non-address-of operator on non-static member address");
2398 FromType, std::nullopt, Method->getParent());
2402 "Non-address-of operator for overloaded function expression");
2448 FromType =
Atomic->getValueType();
2483 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2503 bool IncompatibleObjC =
false;
2565 }
else if (AllowObjCWritebackConversion &&
2569 FromType, IncompatibleObjC)) {
2575 InOverloadResolution, FromType)) {
2579 From, InOverloadResolution, CStyle)) {
2584 From, InOverloadResolution, CStyle)) {
2594 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2603 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2633 bool ObjCLifetimeConversion;
2639 ObjCLifetimeConversion)) {
2658 CanonFrom = CanonTo;
2663 if (CanonFrom == CanonTo)
2668 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2680 case AssignConvertType::
2681 CompatibleVoidPtrToNonVoidPtr:
2714 bool InOverloadResolution,
2723 if (!UD->
hasAttr<TransparentUnionAttr>())
2726 for (
const auto *it : UD->
fields()) {
2729 ToType = it->getType();
2755 return To->
getKind() == BuiltinType::Int;
2758 return To->
getKind() == BuiltinType::UInt;
2782 if (FromED->isScoped())
2789 if (FromED->isFixed()) {
2790 QualType Underlying = FromED->getIntegerType();
2791 return Context.hasSameUnqualifiedType(Underlying, ToType) ||
2798 return Context.hasSameUnqualifiedType(ToType, FromED->getPromotionType());
2823 uint64_t FromSize =
Context.getTypeSize(FromType);
2832 for (
int Idx = 0; Idx < 6; ++Idx) {
2833 uint64_t ToSize =
Context.getTypeSize(PromoteTypes[Idx]);
2834 if (FromSize < ToSize ||
2835 (FromSize == ToSize &&
2836 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2840 return Context.hasSameUnqualifiedType(ToType, PromoteTypes[Idx]);
2861 std::optional<llvm::APSInt> BitWidth;
2864 MemberDecl->getBitWidth()->getIntegerConstantExpr(
Context))) {
2865 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2866 ToSize =
Context.getTypeSize(ToType);
2869 if (*BitWidth < ToSize ||
2871 return To->
getKind() == BuiltinType::Int;
2877 return To->
getKind() == BuiltinType::UInt;
2895 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2905 if (FromBuiltin->getKind() == BuiltinType::Float &&
2906 ToBuiltin->getKind() == BuiltinType::Double)
2913 (FromBuiltin->getKind() == BuiltinType::Float ||
2914 FromBuiltin->getKind() == BuiltinType::Double) &&
2915 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2916 ToBuiltin->getKind() == BuiltinType::Float128 ||
2917 ToBuiltin->getKind() == BuiltinType::Ibm128))
2922 if (
getLangOpts().
HLSL && FromBuiltin->getKind() == BuiltinType::Half &&
2923 (ToBuiltin->getKind() == BuiltinType::Float ||
2924 ToBuiltin->getKind() == BuiltinType::Double))
2929 FromBuiltin->getKind() == BuiltinType::Half &&
2930 ToBuiltin->getKind() == BuiltinType::Float)
2959 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2971 if (
const EnumType *ToEnumType = ToType->
getAs<EnumType>()) {
2983 return Context.getTypeSize(FromType) >
Context.getTypeSize(ToType);
2998 bool StripObjCLifetime =
false) {
3001 "Invalid similarly-qualified pointer type");
3012 if (StripObjCLifetime)
3024 return Context.getObjCObjectPointerType(ToPointee);
3025 return Context.getPointerType(ToPointee);
3033 return Context.getObjCObjectPointerType(QualifiedCanonToPointee);
3034 return Context.getPointerType(QualifiedCanonToPointee);
3038 bool InOverloadResolution,
3044 return !InOverloadResolution;
3052 bool InOverloadResolution,
3054 bool &IncompatibleObjC) {
3055 IncompatibleObjC =
false;
3063 ConvertedType = ToType;
3070 ConvertedType = ToType;
3077 ConvertedType = ToType;
3085 ConvertedType = ToType;
3095 ConvertedType = ToType;
3117 if (
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType))
3144 Context.typesAreCompatible(FromPointeeType, ToPointeeType)) {
3166 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType) &&
3175 Context.areCompatibleVectorTypes(FromPointeeType, ToPointeeType)) {
3194 return Context.getQualifiedType(
T, Qs);
3196 return Context.getQualifiedType(
T.getUnqualifiedType(), Qs);
3201 bool &IncompatibleObjC) {
3214 if (ToObjCPtr && FromObjCPtr) {
3222 if (
Context.canAssignObjCInterfaces(ToObjCPtr, FromObjCPtr)) {
3236 if (
Context.canAssignObjCInterfaces(FromObjCPtr, ToObjCPtr)) {
3240 IncompatibleObjC =
true;
3256 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
3285 IncompatibleObjC)) {
3287 IncompatibleObjC =
true;
3288 ConvertedType =
Context.getPointerType(ConvertedType);
3297 IncompatibleObjC)) {
3299 ConvertedType =
Context.getPointerType(ConvertedType);
3312 if (FromFunctionType && ToFunctionType) {
3315 if (
Context.getCanonicalType(FromPointeeType)
3316 ==
Context.getCanonicalType(ToPointeeType))
3321 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3322 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
3323 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
3326 bool HasObjCConversion =
false;
3328 Context.getCanonicalType(ToFunctionType->getReturnType())) {
3331 ToFunctionType->getReturnType(),
3332 ConvertedType, IncompatibleObjC)) {
3334 HasObjCConversion =
true;
3341 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3342 ArgIdx != NumArgs; ++ArgIdx) {
3344 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3345 if (
Context.getCanonicalType(FromArgType)
3346 ==
Context.getCanonicalType(ToArgType)) {
3349 ConvertedType, IncompatibleObjC)) {
3351 HasObjCConversion =
true;
3358 if (HasObjCConversion) {
3362 IncompatibleObjC =
true;
3394 if (!FromFunctionType || !ToFunctionType)
3397 if (
Context.hasSameType(FromPointeeType, ToPointeeType))
3402 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3403 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3408 if (FromEInfo != ToEInfo)
3411 bool IncompatibleObjC =
false;
3413 ToFunctionType->getReturnType())) {
3417 QualType LHS = ToFunctionType->getReturnType();
3422 if (
Context.hasSameType(RHS,LHS)) {
3425 ConvertedType, IncompatibleObjC)) {
3426 if (IncompatibleObjC)
3435 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3436 ArgIdx != NumArgs; ++ArgIdx) {
3437 IncompatibleObjC =
false;
3439 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3440 if (
Context.hasSameType(FromArgType, ToArgType)) {
3443 ConvertedType, IncompatibleObjC)) {
3444 if (IncompatibleObjC)
3453 bool CanUseToFPT, CanUseFromFPT;
3454 if (!
Context.mergeExtParameterInfo(ToFunctionType, FromFunctionType,
3455 CanUseToFPT, CanUseFromFPT,
3459 ConvertedType = ToType;
3498 ToMember->getMostRecentCXXRecordDecl())) {
3500 if (ToMember->isSugared())
3502 ToMember->getMostRecentCXXRecordDecl());
3504 PDiag << ToMember->getQualifier();
3505 if (FromMember->isSugared())
3507 FromMember->getMostRecentCXXRecordDecl());
3509 PDiag << FromMember->getQualifier();
3527 !FromType->
getAs<TemplateSpecializationType>()) {
3533 if (
Context.hasSameType(FromType, ToType)) {
3542 if (!FromFunction || !ToFunction) {
3547 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3557 << ToFunction->getParamType(ArgPos)
3564 ToFunction->getReturnType())) {
3570 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3593 assert(llvm::size(Old) == llvm::size(
New) &&
3594 "Can't compare parameters of functions with different number of "
3597 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3599 size_t J =
Reversed ? (llvm::size(
New) - Idx - 1) : Idx;
3604 Context.removePtrSizeAddrSpace(
Type.getUnqualifiedType());
3606 Context.removePtrSizeAddrSpace((
New.begin() + J)->getUnqualifiedType());
3608 if (!
Context.hasSameType(OldType, NewType)) {
3633 unsigned OldIgnore =
3635 unsigned NewIgnore =
3642 NewPT->param_types().slice(NewIgnore),
3649 bool IgnoreBaseAccess,
3652 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3661 PDiag(diag::warn_impcast_bool_to_null_pointer)
3672 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3673 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {
3676 unsigned InaccessibleID = 0;
3677 unsigned AmbiguousID = 0;
3679 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3680 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3683 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3685 &BasePath, IgnoreBaseAccess))
3689 Kind = CK_DerivedToBase;
3692 if (
Diagnose && !IsCStyleOrFunctionalCast &&
3693 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3695 "this should only be possible with MSVCCompat!");
3707 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3710 Kind = CK_BlockPointerToObjCPointerCast;
3712 Kind = CK_CPointerToObjCPointerCast;
3716 Kind = CK_AnyPointerToBlockPointerCast;
3722 Kind = CK_NullToPointer;
3729 bool InOverloadResolution,
3739 ConvertedType = ToType;
3755 ConvertedType =
Context.getMemberPointerType(
3769 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
3777 Kind = CK_NullToMemberPointer;
3795 PD <<
Context.getCanonicalTagType(Cls);
3805 std::swap(
Base, Derived);
3814 PD <<
int(Direction);
3822 DiagFromTo(PD) <<
QualType(VBase, 0) << OpRange;
3830 ? CK_DerivedToBaseMemberPointer
3831 : CK_BaseToDerivedMemberPointer;
3833 if (!IgnoreBaseAccess)
3837 ? diag::err_upcast_to_inaccessible_base
3838 : diag::err_downcast_from_inaccessible_base,
3840 NestedNameSpecifier BaseQual = FromPtrType->getQualifier(),
3841 DerivedQual = ToPtrType->getQualifier();
3842 if (Direction == MemberPointerConversionDirection::Upcast)
3843 std::swap(BaseQual, DerivedQual);
3844 DiagCls(PD, DerivedQual, Derived);
3845 DiagCls(PD, BaseQual, Base);
3880 bool CStyle,
bool IsTopLevel,
3881 bool &PreviousToQualsIncludeConst,
3882 bool &ObjCLifetimeConversion,
3895 ObjCLifetimeConversion =
true;
3935 !PreviousToQualsIncludeConst)
3953 PreviousToQualsIncludeConst =
3954 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3960 bool CStyle,
bool &ObjCLifetimeConversion) {
3961 FromType =
Context.getCanonicalType(FromType);
3962 ToType =
Context.getCanonicalType(ToType);
3963 ObjCLifetimeConversion =
false;
3973 bool PreviousToQualsIncludeConst =
true;
3974 bool UnwrappedAnyPointer =
false;
3975 while (
Context.UnwrapSimilarTypes(FromType, ToType)) {
3977 !UnwrappedAnyPointer,
3978 PreviousToQualsIncludeConst,
3981 UnwrappedAnyPointer =
true;
3989 return UnwrappedAnyPointer &&
Context.hasSameUnqualifiedType(FromType,ToType);
3998 bool InOverloadResolution,
4007 InOverloadResolution, InnerSCS,
4022 bool InOverloadResolution,
4025 const OverflowBehaviorType *ToOBT = ToType->
getAs<OverflowBehaviorType>();
4036 InOverloadResolution, InnerSCS, CStyle,
4053 if (CtorType->getNumParams() > 0) {
4054 QualType FirstArg = CtorType->getParamType(0);
4066 bool AllowExplicit) {
4073 bool Usable = !Info.Constructor->isInvalidDecl() &&
4076 bool SuppressUserConversions =
false;
4077 if (Info.ConstructorTmpl)
4080 CandidateSet, SuppressUserConversions,
4085 CandidateSet, SuppressUserConversions,
4086 false, AllowExplicit);
4090 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4117 llvm_unreachable(
"Invalid OverloadResult!");
4139 bool AllowObjCConversionOnExplicit) {
4140 assert(AllowExplicit != AllowedExplicit::None ||
4141 !AllowObjCConversionOnExplicit);
4145 bool ConstructorsOnly =
false;
4149 if (
const RecordType *ToRecordType = ToType->
getAsCanonical<RecordType>()) {
4161 ConstructorsOnly =
true;
4165 }
else if (
auto *ToRecordDecl =
4166 dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
4167 ToRecordDecl = ToRecordDecl->getDefinitionOrSelf();
4169 Expr **Args = &From;
4170 unsigned NumArgs = 1;
4171 bool ListInitializing =
false;
4172 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
4175 S, From, ToType, ToRecordDecl, User, CandidateSet,
4176 AllowExplicit == AllowedExplicit::All);
4185 Args = InitList->getInits();
4186 NumArgs = InitList->getNumInits();
4187 ListInitializing =
true;
4195 bool Usable = !Info.Constructor->isInvalidDecl();
4196 if (!ListInitializing)
4197 Usable = Usable && Info.Constructor->isConvertingConstructor(
4200 bool SuppressUserConversions = !ConstructorsOnly;
4208 if (SuppressUserConversions && ListInitializing) {
4209 SuppressUserConversions =
4214 if (Info.ConstructorTmpl)
4216 Info.ConstructorTmpl, Info.FoundDecl,
4218 CandidateSet, SuppressUserConversions,
4220 AllowExplicit == AllowedExplicit::All);
4226 SuppressUserConversions,
4228 AllowExplicit == AllowedExplicit::All);
4238 }
else if (
const RecordType *FromRecordType =
4240 if (
auto *FromRecordDecl =
4241 dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
4242 FromRecordDecl = FromRecordDecl->getDefinitionOrSelf();
4244 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
4245 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4254 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)))
4261 ConvTemplate, FoundDecl, ActingContext, From, ToType,
4262 CandidateSet, AllowObjCConversionOnExplicit,
4263 AllowExplicit != AllowedExplicit::None);
4266 CandidateSet, AllowObjCConversionOnExplicit,
4267 AllowExplicit != AllowedExplicit::None);
4272 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4281 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
4293 if (Best->Conversions[0].isEllipsis())
4296 User.
Before = Best->Conversions[0].Standard;
4309 = dyn_cast<CXXConversionDecl>(Best->Function)) {
4311 assert(Best->HasFinalConversion);
4319 User.
Before = Best->Conversions[0].Standard;
4334 User.
After = Best->FinalConversion;
4337 llvm_unreachable(
"Not a constructor or conversion function?");
4346 llvm_unreachable(
"Invalid OverloadResult!");
4356 CandidateSet, AllowedExplicit::None,
false);
4371 diag::err_typecheck_nonviable_condition_incomplete,
4378 *
this, From, Cands);
4404 if (!Conv1 || !Conv2)
4419 if (Block1 != Block2)
4432 if (Conv1FuncRet && Conv2FuncRet &&
4441 CallOp->getType()->castAs<
FunctionType>()->getCallConv();
4443 CallOpProto->isVariadic(),
false);
4445 CallOpProto->isVariadic(),
true);
4447 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4542 if (!ICS1.
isBad()) {
4543 bool StdInit1 =
false, StdInit2 =
false;
4550 if (StdInit1 != StdInit2)
4561 CAT2->getElementType())) {
4563 if (CAT1->getSize() != CAT2->getSize())
4565 return CAT1->getSize().ult(CAT2->getSize())
4600 if (ConvFunc1 == ConvFunc2)
4702 if (!
Enum->isFixed())
4738 else if (Rank2 < Rank1)
4773 bool SCS1ConvertsToVoid
4775 bool SCS2ConvertsToVoid
4777 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4782 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4788 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4817 if (FromObjCPtr1 && FromObjCPtr2) {
4822 if (AssignLeft != AssignRight) {
4861 if (UnqualT1 == UnqualT2) {
4923 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4924 return SCS1IsCompatibleVectorConversion
4931 bool SCS1IsCompatibleSVEVectorConversion =
4933 bool SCS2IsCompatibleSVEVectorConversion =
4936 if (SCS1IsCompatibleSVEVectorConversion !=
4937 SCS2IsCompatibleSVEVectorConversion)
4938 return SCS1IsCompatibleSVEVectorConversion
4945 bool SCS1IsCompatibleRVVVectorConversion =
4947 bool SCS2IsCompatibleRVVVectorConversion =
4950 if (SCS1IsCompatibleRVVVectorConversion !=
4951 SCS2IsCompatibleRVVVectorConversion)
4952 return SCS1IsCompatibleRVVVectorConversion
5011 if (UnqualT1 == UnqualT2)
5029 bool ObjCLifetimeConversion;
5039 if (CanPick1 != CanPick2)
5093 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5101 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
5118 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
5125 bool FromAssignRight
5134 if (ToPtr1->isObjCIdType() &&
5135 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
5137 if (ToPtr2->isObjCIdType() &&
5138 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
5143 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
5145 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
5150 if (ToPtr1->isObjCClassType() &&
5151 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
5153 if (ToPtr2->isObjCClassType() &&
5154 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
5159 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
5161 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
5167 (ToAssignLeft != ToAssignRight)) {
5178 }
else if (IsSecondSame)
5187 (FromAssignLeft != FromAssignRight))
5201 CXXRecordDecl *FromPointee1 = FromMemPointer1->getMostRecentCXXRecordDecl();
5206 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5213 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
5251 if (!
T.getQualifiers().hasUnaligned())
5265 "T1 must be the pointee type of the reference type");
5266 assert(!OrigT2->
isReferenceType() &&
"T2 cannot be a reference type");
5289 if (UnqualT1 == UnqualT2) {
5293 Conv |= ReferenceConversions::DerivedToBase;
5296 Context.canBindObjCObjectType(UnqualT1, UnqualT2))
5297 Conv |= ReferenceConversions::ObjC;
5300 Conv |= ReferenceConversions::Function;
5304 bool ConvertedReferent = Conv != 0;
5308 bool PreviousToQualsIncludeConst =
true;
5309 bool TopLevel =
true;
5315 Conv |= ReferenceConversions::Qualification;
5321 Conv |= ReferenceConversions::NestedQualification;
5329 bool ObjCLifetimeConversion =
false;
5331 PreviousToQualsIncludeConst,
5333 return (ConvertedReferent ||
Context.hasSimilarType(T1, T2))
5338 if (ObjCLifetimeConversion)
5339 Conv |= ReferenceConversions::ObjCLifetime;
5342 }
while (
Context.UnwrapSimilarTypes(T1, T2));
5347 return (ConvertedReferent ||
Context.hasSameUnqualifiedType(T1, T2))
5358 bool AllowExplicit) {
5359 assert(T2->
isRecordType() &&
"Can only find conversions of record types.");
5363 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5364 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5371 = dyn_cast<FunctionTemplateDecl>(D);
5388 if (!ConvTemplate &&
5412 ConvTemplate, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5413 false, AllowExplicit);
5416 Conv, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5417 false, AllowExplicit);
5420 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5426 assert(Best->HasFinalConversion);
5438 if (!Best->FinalConversion.DirectBinding)
5450 "Expected a direct reference binding!");
5456 Cand != CandidateSet.
end(); ++Cand)
5468 llvm_unreachable(
"Invalid OverloadResult!");
5473static ImplicitConversionSequence
5476 bool SuppressUserConversions,
5477 bool AllowExplicit) {
5478 assert(DeclType->
isReferenceType() &&
"Reference init needs a reference");
5505 auto SetAsReferenceBinding = [&](
bool BindsDirectly) {
5510 ICS.
Standard.
Second = (RefConv & Sema::ReferenceConversions::DerivedToBase)
5512 : (RefConv & Sema::ReferenceConversions::ObjC)
5520 Sema::ReferenceConversions::NestedQualification)
5534 (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0;
5558 SetAsReferenceBinding(
true);
5607 SetAsReferenceBinding(S.
getLangOpts().CPlusPlus11 ||
5698 AllowedExplicit::None,
5723 if (isRValRef && LValRefType) {
5740static ImplicitConversionSequence
5742 bool SuppressUserConversions,
5743 bool InOverloadResolution,
5744 bool AllowObjCWritebackConversion,
5745 bool AllowExplicit =
false);
5749static ImplicitConversionSequence
5751 bool SuppressUserConversions,
5752 bool InOverloadResolution,
5753 bool AllowObjCWritebackConversion) {
5766 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT))
5768 InitTy = IAT->getElementType();
5794 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5800 SuppressUserConversions,
5801 InOverloadResolution,
5802 AllowObjCWritebackConversion);
5811 Result.Standard.setAsIdentityConversion();
5812 Result.Standard.setFromType(ToType);
5813 Result.Standard.setAllToTypes(ToType);
5838 bool IsUnbounded =
false;
5842 if (CT->getSize().ult(e)) {
5846 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5849 if (CT->getSize().ugt(e)) {
5855 S, &EmptyList, InitTy, SuppressUserConversions,
5856 InOverloadResolution, AllowObjCWritebackConversion);
5857 if (DfltElt.
isBad()) {
5861 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5872 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5882 Result.Standard.setAsIdentityConversion();
5883 Result.Standard.setFromType(InitTy);
5884 Result.Standard.setAllToTypes(InitTy);
5885 for (
unsigned i = 0; i < e; ++i) {
5888 S,
Init, InitTy, SuppressUserConversions, InOverloadResolution,
5889 AllowObjCWritebackConversion);
5900 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5914 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5928 AllowedExplicit::None,
5929 InOverloadResolution,
false,
5930 AllowObjCWritebackConversion,
5949 Result.UserDefined.Before.setAsIdentityConversion();
5954 Result.UserDefined.After.setAsIdentityConversion();
5955 Result.UserDefined.After.setFromType(ToType);
5956 Result.UserDefined.After.setAllToTypes(ToType);
5957 Result.UserDefined.ConversionFunction =
nullptr;
5974 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5995 SuppressUserConversions,
6003 InOverloadResolution,
6004 AllowObjCWritebackConversion);
6007 assert(!
Result.isEllipsis() &&
6008 "Sub-initialization cannot result in ellipsis conversion.");
6014 Result.UserDefined.After;
6042 S, From->
getInit(0), ToType, SuppressUserConversions,
6043 InOverloadResolution, AllowObjCWritebackConversion);
6045 Result.Standard.FromBracedInitList =
true;
6049 else if (NumInits == 0) {
6051 Result.Standard.setAsIdentityConversion();
6052 Result.Standard.setFromType(ToType);
6053 Result.Standard.setAllToTypes(ToType);
6070static ImplicitConversionSequence
6072 bool SuppressUserConversions,
6073 bool InOverloadResolution,
6074 bool AllowObjCWritebackConversion,
6075 bool AllowExplicit) {
6076 if (
InitListExpr *FromInitList = dyn_cast<InitListExpr>(From))
6078 InOverloadResolution,AllowObjCWritebackConversion);
6083 SuppressUserConversions, AllowExplicit);
6086 SuppressUserConversions,
6087 AllowedExplicit::None,
6088 InOverloadResolution,
6090 AllowObjCWritebackConversion,
6103 return !ICS.
isBad();
6112 const CXXRecordDecl *ActingContext,
bool InOverloadResolution =
false,
6114 bool SuppressUserConversion =
false) {
6122 assert(FromClassification.
isLValue());
6133 if (Method->isExplicitObjectMemberFunction()) {
6134 if (ExplicitParameterType.isNull())
6135 ExplicitParameterType = Method->getFunctionObjectParameterReferenceType();
6137 ValueKindFromClassification(FromClassification));
6139 S, &TmpExpr, ExplicitParameterType, SuppressUserConversion,
6156 Qualifiers Quals = Method->getMethodQualifiers();
6194 FromType, ImplicitParamType);
6204 FromType, ImplicitParamType);
6217 }
else if (!Method->isExplicitObjectMemberFunction()) {
6219 FromType, ImplicitParamType);
6224 switch (Method->getRefQualifier()) {
6239 if (!FromClassification.
isRValue()) {
6261 = (Method->getRefQualifier() ==
RQ_None);
6272 QualType ImplicitParamRecordType =
Method->getFunctionObjectParameterType();
6285 DestType =
Method->getThisType();
6288 FromRecordType = From->
getType();
6289 DestType = ImplicitParamRecordType;
6297 Method->getRefQualifier() !=
6315 <<
Method->getDeclName() << FromRecordType << (CVR - 1)
6317 Diag(
Method->getLocation(), diag::note_previous_decl)
6318 <<
Method->getDeclName();
6326 bool IsRValueQualified =
6330 << IsRValueQualified;
6331 Diag(
Method->getLocation(), diag::note_previous_decl)
6332 <<
Method->getDeclName();
6342 llvm_unreachable(
"Lists are not objects");
6345 return Diag(From->
getBeginLoc(), diag::err_member_function_call_bad_type)
6346 << ImplicitParamRecordType << FromRecordType
6355 From = FromRes.
get();
6364 CK = CK_AddressSpaceConversion;
6389 AllowedExplicit::Conversions,
6400 return AMDGPU().ExpandAMDGPUPredicateBuiltIn(From);
6473 llvm_unreachable(
"found a first conversion kind in Second");
6477 llvm_unreachable(
"found a third conversion kind in Second");
6483 llvm_unreachable(
"unknown conversion kind");
6493 [[maybe_unused]]
bool isCCEAllowedPreCXX11 =
6495 assert((S.
getLangOpts().CPlusPlus11 || isCCEAllowedPreCXX11) &&
6496 "converted constant expression outside C++11 or TTP matching");
6531 if (
T->isRecordType())
6540 diag::err_typecheck_converted_constant_expression)
6546 llvm_unreachable(
"bad conversion in converted constant expression");
6552 diag::err_typecheck_converted_constant_expression_disallowed)
6558 diag::err_typecheck_converted_constant_expression_indirect)
6568 diag::err_reference_bind_to_bitfield_in_cce)
6576 bool IsTemplateArgument =
6578 if (
T->isRecordType()) {
6579 assert(IsTemplateArgument &&
6580 "unexpected class type converted constant expr");
6596 IsTemplateArgument);
6601 bool ReturnPreNarrowingValue =
false;
6604 PreNarrowingType)) {
6614 PreNarrowingValue.
isInt()) {
6617 ReturnPreNarrowingValue =
true;
6643 << CCE << 0 << From->
getType() <<
T;
6648 if (!ReturnPreNarrowingValue)
6649 PreNarrowingValue = {};
6665 if (
Result.isInvalid() ||
Result.get()->isValueDependent()) {
6670 RequireInt, PreNarrowingValue);
6677 return ::BuildConvertedConstantExpression(*
this, From,
T, CCE, Dest,
6684 return ::CheckConvertedConstantExpression(*
this, From,
T,
Value, CCE,
false,
6689 llvm::APSInt &
Value,
6691 assert(
T->isIntegralOrEnumerationType() &&
"unexpected converted const type");
6696 if (!R.isInvalid() && !R.get()->isValueDependent())
6704 const APValue &PreNarrowingValue) {
6716 Kind = ConstantExprKind::ClassTemplateArgument;
6718 Kind = ConstantExprKind::NonClassTemplateArgument;
6720 Kind = ConstantExprKind::Normal;
6723 (RequireInt && !Eval.
Val.
isInt())) {
6730 if (Notes.empty()) {
6733 if (
const auto *CE = dyn_cast<ConstantExpr>(E)) {
6737 "ConstantExpr has no value associated with it");
6743 Value = std::move(PreNarrowingValue);
6749 if (Notes.size() == 1 &&
6750 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6751 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6752 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6753 diag::note_constexpr_invalid_template_arg) {
6754 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6755 for (
unsigned I = 0; I < Notes.size(); ++I)
6756 Diag(Notes[I].first, Notes[I].second);
6760 for (
unsigned I = 0; I < Notes.size(); ++I)
6761 Diag(Notes[I].first, Notes[I].second);
6780static ImplicitConversionSequence
6788 AllowedExplicit::Conversions,
6830 "expected a member expression");
6832 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6833 M && !M->isImplicitAccess())
6834 Base = M->getBase();
6835 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6836 M && !M->isImplicitAccess())
6837 Base = M->getBase();
6841 if (
T->isPointerType())
6842 T =
T->getPointeeType();
6870 assert(Method->isExplicitObjectMemberFunction() &&
6871 "Method is not an explicit member function");
6872 assert(NewArgs.empty() &&
"NewArgs should be empty");
6874 NewArgs.reserve(Args.size() + 1);
6876 NewArgs.push_back(
This);
6877 NewArgs.append(Args.begin(), Args.end());
6880 Method,
Object->getBeginLoc());
6886 return AllowScopedEnumerations ?
T->isIntegralOrEnumerationType()
6887 :
T->isIntegralOrUnscopedEnumerationType();
6899 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6913 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6921 std::string TypeStr;
6926 "static_cast<" + TypeStr +
">(")
6938 HadMultipleCandidates);
6945 From,
Result.get()->getType());
6971 HadMultipleCandidates);
6976 CK_UserDefinedConversion,
Result.get(),
6977 nullptr,
Result.get()->getValueKind(),
7002 if (
auto *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)) {
7004 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
7010 Conv, FoundDecl, ActingContext, From, ToType, CandidateSet,
7044 From = result.
get();
7050 From = Converted.
isUsable() ? Converted.
get() :
nullptr;
7059 const RecordType *RecordTy =
T->getAsCanonical<RecordType>();
7072 : Converter(Converter), From(From) {}
7077 } IncompleteDiagnoser(Converter, From);
7088 ->getDefinitionOrSelf()
7089 ->getVisibleConversionFunctions();
7091 bool HadMultipleCandidates =
7096 bool HasUniqueTargetType =
true;
7112 "Conversion operator templates are considered potentially "
7116 if (Converter.
match(CurToType) || ConvTemplate) {
7122 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
7127 else if (HasUniqueTargetType &&
7129 HasUniqueTargetType =
false;
7131 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
7149 HadMultipleCandidates,
7150 ExplicitConversions))
7156 if (!HasUniqueTargetType)
7175 HadMultipleCandidates,
Found))
7184 HadMultipleCandidates,
7185 ExplicitConversions))
7193 switch (ViableConversions.
size()) {
7196 HadMultipleCandidates,
7197 ExplicitConversions))
7207 HadMultipleCandidates,
Found))
7238 if (Proto->getNumParams() < 1)
7242 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
7243 if (Context.hasSameUnqualifiedType(T1, ArgType))
7247 if (Proto->getNumParams() < 2)
7251 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
7252 if (Context.hasSameUnqualifiedType(T2, ArgType))
7271 unsigned SeenAt = 0;
7273 bool HasDefault =
false;
7282 return HasDefault || SeenAt != 0;
7288 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
7291 bool StrictPackMatch) {
7294 assert(Proto &&
"Functions without a prototype cannot be overloaded");
7295 assert(!
Function->getDescribedFunctionTemplate() &&
7296 "Use AddTemplateOverloadCandidate for function templates");
7309 CandidateSet, SuppressUserConversions,
7310 PartialOverloading, EarlyConversions, PO,
7346 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
7360 Candidate.
Viable =
false;
7373 bool IsImplicitlyInstantiated =
false;
7374 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo()) {
7375 ND = SpecInfo->getTemplate();
7376 IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() ==
7387 const bool IsInlineFunctionInGMF =
7389 (IsImplicitlyInstantiated ||
Function->isInlined());
7394 const bool IsCurrentUnitGMFDecl =
7395 Function->isFromGlobalModule() && CurrentModule &&
7396 Function->getOwningModule()->getTopLevelModule() ==
7400 !IsCurrentUnitGMFDecl) {
7401 Candidate.
Viable =
false;
7408 Candidate.
Viable =
false;
7419 if (Args.size() == 1 &&
Constructor->isSpecializationCopyingObject() &&
7420 (
Context.hasSameUnqualifiedType(ClassType, Args[0]->getType()) ||
7423 Candidate.
Viable =
false;
7435 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.
getDecl());
7436 if (Shadow && Args.size() == 1 &&
Constructor->getNumParams() >= 1 &&
7437 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
7444 Candidate.
Viable =
false;
7453 Constructor->getMethodQualifiers().getAddressSpace(),
7455 Candidate.
Viable =
false;
7468 Candidate.
Viable =
false;
7478 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7479 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7480 !PartialOverloading) {
7482 Candidate.
Viable =
false;
7496 Candidate.
Viable =
false;
7502 if (
Function->getTrailingRequiresClause()) {
7507 Candidate.
Viable =
false;
7516 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7519 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7522 }
else if (ArgIdx < NumParams) {
7533 Args[ArgIdx]->
getType().getAddressSpace() ==
7535 Diag(Args[ArgIdx]->getBeginLoc(), diag::warn_hlsl_groupshared_inout);
7538 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7541 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7543 Candidate.
Viable =
false;
7555 if (EnableIfAttr *FailedAttr =
7557 Candidate.
Viable =
false;
7567 if (Methods.size() <= 1)
7570 for (
unsigned b = 0, e = Methods.size(); b < e; b++) {
7576 if (
Method->param_size() > NumNamedArgs)
7577 NumNamedArgs =
Method->param_size();
7578 if (Args.size() < NumNamedArgs)
7581 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7583 if (Args[i]->isTypeDependent()) {
7589 Expr *argExpr = Args[i];
7590 assert(argExpr &&
"SelectBestMethod(): missing expression");
7595 !param->
hasAttr<CFConsumedAttr>())
7596 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7613 if (ConversionState.
isBad() ||
7623 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7624 if (Args[i]->isTypeDependent()) {
7637 if (Args.size() != NumNamedArgs)
7639 else if (
Match && NumNamedArgs == 0 && Methods.size() > 1) {
7642 for (
unsigned b = 0, e = Methods.size(); b < e; b++) {
7643 QualType ReturnT = Methods[b]->getReturnType();
7663 "Shouldn't have `this` for ctors!");
7664 assert(!Method->isStatic() &&
"Shouldn't have `this` for static methods!");
7666 ThisArg, std::nullopt, Method, Method);
7669 ConvertedThis = R.get();
7671 if (
auto *MD = dyn_cast<CXXMethodDecl>(Function)) {
7673 assert((MissingImplicitThis || MD->isStatic() ||
7675 "Expected `this` for non-ctor instance methods");
7677 ConvertedThis =
nullptr;
7682 unsigned ArgSizeNoVarargs = std::min(Function->param_size(), Args.size());
7685 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7688 S.
Context, Function->getParamDecl(I)),
7694 ConvertedArgs.push_back(R.get());
7701 if (!Function->isVariadic() && Args.size() < Function->getNumParams()) {
7702 for (
unsigned i = Args.size(), e = Function->getNumParams(); i != e; ++i) {
7709 ConvertedArgs.push_back(R.get());
7721 bool MissingImplicitThis) {
7722 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7723 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7729 llvm::scope_exit UndelayDiags(
7731 DelayedDiagnostics.popUndelayed(CurrentState);
7735 Expr *DiscardedThis;
7737 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7738 true, DiscardedThis, ConvertedArgs))
7739 return *EnableIfAttrs.begin();
7741 for (
auto *EIA : EnableIfAttrs) {
7745 if (EIA->getCond()->isValueDependent() ||
7746 !EIA->getCond()->EvaluateWithSubstitution(
7750 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7756template <
typename CheckFn>
7759 CheckFn &&IsSuccessful) {
7762 if (ArgDependent == DIA->getArgDependent())
7763 Attrs.push_back(DIA);
7770 auto WarningBegin = std::stable_partition(
7771 Attrs.begin(), Attrs.end(), [](
const DiagnoseIfAttr *DIA) {
7772 return DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_error &&
7773 DIA->getWarningGroup().empty();
7778 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7780 if (ErrAttr != WarningBegin) {
7781 const DiagnoseIfAttr *DIA = *ErrAttr;
7782 S.
Diag(Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7783 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7784 << DIA->getParent() << DIA->getCond()->getSourceRange();
7788 auto ToSeverity = [](DiagnoseIfAttr::DefaultSeverity Sev) {
7790 case DiagnoseIfAttr::DS_warning:
7792 case DiagnoseIfAttr::DS_error:
7795 llvm_unreachable(
"Fully covered switch above!");
7798 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7799 if (IsSuccessful(DIA)) {
7800 if (DIA->getWarningGroup().empty() &&
7801 DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_warning) {
7802 S.
Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7803 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7804 << DIA->getParent() << DIA->getCond()->getSourceRange();
7807 DIA->getWarningGroup());
7810 {ToSeverity(DIA->getDefaultSeverity()),
"%0",
7812 S.
Diag(Loc, DiagID) << DIA->getMessage();
7820 const Expr *ThisArg,
7825 [&](
const DiagnoseIfAttr *DIA) {
7830 if (!DIA->getCond()->EvaluateWithSubstitution(
7833 return Result.isInt() &&
Result.getInt().getBoolValue();
7840 *
this, ND,
false, Loc,
7841 [&](
const DiagnoseIfAttr *DIA) {
7843 return DIA->getCond()->EvaluateAsBooleanCondition(
Result,
Context) &&
7852 bool SuppressUserConversions,
7853 bool PartialOverloading,
7854 bool FirstArgumentIsBase) {
7866 if (Args.size() > 0) {
7867 if (
Expr *E = Args[0]) {
7877 FunctionArgs = Args.slice(1);
7881 FunTmpl, F.getPair(),
7883 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7884 FunctionArgs, CandidateSet, SuppressUserConversions,
7885 PartialOverloading);
7889 ObjectClassification, FunctionArgs, CandidateSet,
7890 SuppressUserConversions, PartialOverloading);
7897 if (Args.size() > 0 &&
7901 FunctionArgs = Args.slice(1);
7905 ExplicitTemplateArgs, FunctionArgs,
7906 CandidateSet, SuppressUserConversions,
7907 PartialOverloading);
7910 SuppressUserConversions, PartialOverloading);
7920 bool SuppressUserConversions,
7930 "Expected a member function template");
7932 nullptr, ObjectType,
7933 ObjectClassification, Args, CandidateSet,
7934 SuppressUserConversions,
false, PO);
7937 ObjectType, ObjectClassification, Args, CandidateSet,
7938 SuppressUserConversions,
false, {}, PO);
7951 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7953 "Use AddOverloadCandidate for constructors");
7962 Method->isMoveAssignmentOperator())
7969 bool IgnoreExplicitObject =
7970 (
Method->isExplicitObjectMemberFunction() &&
7973 bool ImplicitObjectMethodTreatedAsStatic =
7976 Method->isImplicitObjectMemberFunction();
7978 unsigned ExplicitOffset =
7979 !IgnoreExplicitObject &&
Method->isExplicitObjectMemberFunction() ? 1 : 0;
7981 unsigned NumParams =
Method->getNumParams() - ExplicitOffset +
7982 int(ImplicitObjectMethodTreatedAsStatic);
7984 unsigned ExtraArgs =
7991 CandidateSet.
addCandidate(Args.size() + ExtraArgs, EarlyConversions);
8007 Candidate.
Viable =
false;
8017 unsigned MinRequiredArgs =
Method->getMinRequiredArguments() -
8019 int(ImplicitObjectMethodTreatedAsStatic);
8021 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
8023 Candidate.
Viable =
false;
8031 if (!IgnoreExplicitObject) {
8034 else if (
Method->isStatic()) {
8044 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
8049 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8050 Method, ActingContext,
true);
8051 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
8052 Candidate.
Viable =
false;
8063 Candidate.
Viable =
false;
8068 if (
Method->getTrailingRequiresClause()) {
8073 Candidate.
Viable =
false;
8081 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
8084 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
8087 }
else if (ArgIdx < NumParams) {
8093 if (ImplicitObjectMethodTreatedAsStatic) {
8094 ParamType = ArgIdx == 0
8095 ?
Method->getFunctionObjectParameterReferenceType()
8098 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
8102 SuppressUserConversions,
8107 Candidate.
Viable =
false;
8119 if (EnableIfAttr *FailedAttr =
8121 Candidate.
Viable =
false;
8128 Candidate.
Viable =
false;
8139 bool SuppressUserConversions,
bool PartialOverloading,
8157 PartialOverloading,
false,
8158 false, ObjectType, ObjectClassification,
8162 bool OnlyInitializeNonUserDefinedConversions) {
8163 return S.CheckNonDependentConversions(
8164 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
8165 Sema::CheckNonDependentConversionsFlag(
8166 SuppressUserConversions,
8167 OnlyInitializeNonUserDefinedConversions),
8168 ActingContext, ObjectType, ObjectClassification, PO);
8172 CandidateSet.
addCandidate(Conversions.size(), Conversions);
8175 Candidate.
Viable =
false;
8184 Method->isStatic() ||
8185 (!Method->isExplicitObjectMemberFunction() && ObjectType.
isNull());
8199 assert(
Specialization &&
"Missing member function template specialization?");
8201 "Specialization is not a member function?");
8204 ObjectClassification, Args, CandidateSet, SuppressUserConversions,
8218 if (ExplicitTemplateArgs ||
8221 *
this, CandidateSet, MethodTmpl, FoundDecl, ActingContext,
8222 ExplicitTemplateArgs, ObjectType, ObjectClassification, Args,
8223 SuppressUserConversions, PartialOverloading, PO);
8228 MethodTmpl, FoundDecl, ActingContext, ObjectType, ObjectClassification,
8229 Args, SuppressUserConversions, PartialOverloading, PO);
8247 bool SuppressUserConversions,
bool PartialOverloading,
bool AllowExplicit,
8249 bool AggregateCandidateDeduction) {
8258 Candidate.
Viable =
false;
8278 PartialOverloading, AggregateCandidateDeduction,
8285 bool OnlyInitializeNonUserDefinedConversions) {
8286 return S.CheckNonDependentConversions(
8287 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
8288 Sema::CheckNonDependentConversionsFlag(
8289 SuppressUserConversions,
8290 OnlyInitializeNonUserDefinedConversions),
8291 nullptr, QualType(), {}, PO);
8294 OverloadCandidate &Candidate =
8295 CandidateSet.addCandidate(Conversions.size(), Conversions);
8298 Candidate.
Viable =
false;
8300 CandidateSet.getRewriteInfo().getRewriteKind(Candidate.
Function, PO);
8306 CandidateSet.getKind() ==
8312 ->isExplicitObjectMemberFunction() &&
8328 assert(
Specialization &&
"Missing function template specialization?");
8330 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
8331 PartialOverloading, AllowExplicit,
8332 false, IsADLCandidate, Conversions, PO,
8333 Info.AggregateDeductionCandidateHasMismatchedArity,
8334 Info.hasStrictPackMatch());
8341 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
8348 if (ExplicitTemplateArgs ||
8351 DependentExplicitSpecifier)) {
8355 Args, SuppressUserConversions, PartialOverloading, AllowExplicit,
8356 IsADLCandidate, PO, AggregateCandidateDeduction);
8358 if (DependentExplicitSpecifier)
8365 PartialOverloading, AllowExplicit, IsADLCandidate, PO,
8366 AggregateCandidateDeduction);
8379 const bool AllowExplicit =
false;
8381 bool ForOverloadSetAddressResolution =
8384 auto *
Method = dyn_cast<CXXMethodDecl>(FD);
8385 bool HasThisConversion = !ForOverloadSetAddressResolution &&
Method &&
8387 unsigned ThisConversions = HasThisConversion ? 1 : 0;
8403 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
8404 !ParamTypes[0]->isDependentType()) {
8406 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8407 Method, ActingContext,
true,
8408 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
8418 auto MaybeInvolveUserDefinedConversion = [&](
QualType ParamType,
8442 if (
auto *RD =
ArgType->getAsCXXRecordDecl();
8443 RD && RD->hasDefinition() &&
8444 !RD->getVisibleConversionFunctions().empty())
8451 HasThisConversion &&
Method->hasCXXExplicitFunctionObjectParameter() ? 1
8454 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
8456 QualType ParamType = ParamTypes[I + Offset];
8460 ConvIdx = Args.size() - 1 - I;
8461 assert(Args.size() + ThisConversions == 2 &&
8462 "number of args (including 'this') must be exactly 2 for "
8466 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
8469 ConvIdx = ThisConversions + I;
8474 MaybeInvolveUserDefinedConversion(ParamType, Args[I]->
getType()))
8503 bool AllowObjCPointerConversion) {
8511 bool ObjCLifetimeConversion;
8513 ObjCLifetimeConversion))
8518 if (!AllowObjCPointerConversion)
8522 bool IncompatibleObjC =
false;
8532 bool AllowExplicit,
bool AllowResultConversion,
bool StrictPackMatch) {
8534 "Conversion function templates use AddTemplateConversionCandidate");
8549 if (!AllowResultConversion &&
8561 AllowObjCConversionOnExplicit))
8583 if (!AllowExplicit && Conversion->
isExplicit()) {
8584 Candidate.
Viable =
false;
8611 Candidate.
Viable =
false;
8620 Candidate.
Viable =
false;
8631 QualType ToCanon =
Context.getCanonicalType(ToType).getUnqualifiedType();
8632 if (FromCanon == ToCanon ||
8634 Candidate.
Viable =
false;
8651 CK_FunctionToPointerDecay, &ConversionRef,
8656 Candidate.
Viable =
false;
8686 Candidate.
Viable =
false;
8698 Candidate.
Viable =
false;
8705 Candidate.
Viable =
false;
8711 "Can only end up with a standard conversion sequence or failure");
8714 if (EnableIfAttr *FailedAttr =
8716 Candidate.
Viable =
false;
8723 Candidate.
Viable =
false;
8732 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
8733 bool AllowResultConversion) {
8742 Candidate.
Viable =
false;
8759 Candidate.
Viable =
false;
8769 assert(
Specialization &&
"Missing function template specialization?");
8771 ToType, CandidateSet, AllowObjCConversionOnExplicit,
8772 AllowExplicit, AllowResultConversion,
8780 bool AllowExplicit,
bool AllowResultConversion) {
8782 "Only conversion function templates permitted here");
8793 ToType, AllowObjCConversionOnExplicit, AllowExplicit,
8794 AllowResultConversion);
8802 AllowObjCConversionOnExplicit, AllowExplicit, AllowResultConversion);
8841 if (ObjectInit.
isBad()) {
8842 Candidate.
Viable =
false;
8853 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8854 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8855 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8856 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8859 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8867 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8868 Candidate.
Viable =
false;
8875 if (Args.size() < NumParams) {
8877 Candidate.
Viable =
false;
8884 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8885 if (ArgIdx < NumParams) {
8898 Candidate.
Viable =
false;
8915 Candidate.
Viable =
false;
8921 if (EnableIfAttr *FailedAttr =
8923 Candidate.
Viable =
false;
8947 "unqualified operator lookup found a member function");
8951 FunctionArgs, CandidateSet);
8957 FunctionArgs[1], FunctionArgs[0]);
8959 Reversed, CandidateSet,
false,
false,
true,
8960 ADLCallKind::NotADL,
8964 if (ExplicitTemplateArgs)
8969 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
8970 false,
false,
true,
false, ADLCallKind::NotADL, {},
9002 if (!T1RD || (!IsComplete && !T1RD->isBeingDefined()))
9010 OperEnd = Operators.
end();
9011 Oper != OperEnd; ++Oper) {
9012 if (Oper->getAsFunction() &&
9015 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
9018 Args[0]->Classify(
Context), Args.slice(1),
9019 CandidateSet,
false, PO);
9026 bool IsAssignmentOperator,
9027 unsigned NumContextualBoolArguments) {
9042 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9055 if (ArgIdx < NumContextualBoolArguments) {
9056 assert(ParamTys[ArgIdx] ==
Context.BoolTy &&
9057 "Contextual conversion to bool requires bool type");
9063 ArgIdx == 0 && IsAssignmentOperator,
9069 Candidate.
Viable =
false;
9082class BuiltinCandidateTypeSet {
9088 TypeSet PointerTypes;
9092 TypeSet MemberPointerTypes;
9096 TypeSet EnumerationTypes;
9100 TypeSet VectorTypes;
9104 TypeSet MatrixTypes;
9107 TypeSet BitIntTypes;
9110 bool HasNonRecordTypes;
9114 bool HasArithmeticOrEnumeralTypes;
9118 bool HasNullPtrType;
9127 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
9129 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
9133 typedef TypeSet::iterator
iterator;
9135 BuiltinCandidateTypeSet(
Sema &SemaRef)
9136 : HasNonRecordTypes(
false),
9137 HasArithmeticOrEnumeralTypes(
false),
9138 HasNullPtrType(
false),
9140 Context(SemaRef.Context) { }
9142 void AddTypesConvertedFrom(
QualType Ty,
9144 bool AllowUserConversions,
9145 bool AllowExplicitConversions,
9146 const Qualifiers &VisibleTypeConversionsQuals);
9148 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
9149 llvm::iterator_range<iterator> member_pointer_types() {
9150 return MemberPointerTypes;
9152 llvm::iterator_range<iterator> enumeration_types() {
9153 return EnumerationTypes;
9155 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
9156 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
9157 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
9159 bool containsMatrixType(QualType Ty)
const {
return MatrixTypes.count(Ty); }
9160 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
9161 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
9162 bool hasNullPtrType()
const {
return HasNullPtrType; }
9177BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(QualType Ty,
9178 const Qualifiers &VisibleQuals) {
9181 if (!PointerTypes.insert(Ty))
9185 const PointerType *PointerTy = Ty->
getAs<PointerType>();
9186 bool buildObjCPtr =
false;
9188 const ObjCObjectPointerType *PTy = Ty->
castAs<ObjCObjectPointerType>();
9190 buildObjCPtr =
true;
9202 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
9208 if ((CVR | BaseCVR) != CVR)
continue;
9223 QualType QPointerTy;
9230 PointerTypes.insert(QPointerTy);
9246BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
9249 if (!MemberPointerTypes.insert(Ty))
9252 const MemberPointerType *PointerTy = Ty->
getAs<MemberPointerType>();
9253 assert(PointerTy &&
"type was not a member pointer type!");
9268 if ((CVR | BaseCVR) != CVR)
continue;
9272 QPointeeTy, std::nullopt, Cls));
9287BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty,
9289 bool AllowUserConversions,
9290 bool AllowExplicitConversions,
9291 const Qualifiers &VisibleQuals) {
9297 if (
const ReferenceType *RefTy = Ty->
getAs<ReferenceType>())
9302 Ty = SemaRef.Context.getArrayDecayedType(Ty);
9309 HasNonRecordTypes = HasNonRecordTypes || !TyIsRec;
9312 HasArithmeticOrEnumeralTypes =
9316 PointerTypes.insert(Ty);
9317 else if (Ty->
getAs<PointerType>() || Ty->
getAs<ObjCObjectPointerType>()) {
9320 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
9324 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
9327 HasArithmeticOrEnumeralTypes =
true;
9328 EnumerationTypes.insert(Ty);
9330 HasArithmeticOrEnumeralTypes =
true;
9331 BitIntTypes.insert(Ty);
9335 HasArithmeticOrEnumeralTypes =
true;
9336 VectorTypes.insert(Ty);
9340 HasArithmeticOrEnumeralTypes =
true;
9341 MatrixTypes.insert(Ty);
9343 HasNullPtrType =
true;
9344 }
else if (AllowUserConversions && TyIsRec) {
9346 if (!SemaRef.isCompleteType(Loc, Ty))
9350 for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) {
9360 if (AllowExplicitConversions || !Conv->
isExplicit()) {
9408 ClassDecl = RHSMPType->getMostRecentCXXRecordDecl();
9456 if (Available.hasAtomic()) {
9457 Available.removeAtomic();
9464 if (Available.hasVolatile()) {
9465 Available.removeVolatile();
9499class BuiltinOperatorOverloadBuilder {
9502 ArrayRef<Expr *> Args;
9503 QualifiersAndAtomic VisibleTypeConversionsQuals;
9504 bool HasArithmeticOrEnumeralCandidateType;
9505 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes;
9506 OverloadCandidateSet &CandidateSet;
9508 static constexpr int ArithmeticTypesCap = 26;
9509 SmallVector<CanQualType, ArithmeticTypesCap> ArithmeticTypes;
9514 unsigned FirstIntegralType,
9516 unsigned FirstPromotedIntegralType,
9517 LastPromotedIntegralType;
9518 unsigned FirstPromotedArithmeticType,
9519 LastPromotedArithmeticType;
9520 unsigned NumArithmeticTypes;
9522 void InitArithmeticTypes() {
9524 FirstPromotedArithmeticType = 0;
9534 FirstIntegralType = ArithmeticTypes.size();
9535 FirstPromotedIntegralType = ArithmeticTypes.size();
9557 llvm::SmallSetVector<CanQualType, 2> BitIntCandidates;
9558 for (BuiltinCandidateTypeSet &Candidate : CandidateTypes) {
9559 for (QualType BitTy : Candidate.bitint_types())
9562 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
9563 LastPromotedIntegralType = ArithmeticTypes.size();
9564 LastPromotedArithmeticType = ArithmeticTypes.size();
9578 LastIntegralType = ArithmeticTypes.size();
9579 NumArithmeticTypes = ArithmeticTypes.size();
9586 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
9587 ArithmeticTypesCap &&
9588 "Enough inline storage for all arithmetic types.");
9593 void addPlusPlusMinusMinusStyleOverloads(QualType CandidateTy,
9596 QualType ParamTypes[2] = {
9636 void AddCandidate(QualType L, QualType R) {
9637 QualType LandR[2] = {L,
R};
9642 BuiltinOperatorOverloadBuilder(
9643 Sema &S, ArrayRef<Expr *> Args,
9644 QualifiersAndAtomic VisibleTypeConversionsQuals,
9645 bool HasArithmeticOrEnumeralCandidateType,
9646 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes,
9647 OverloadCandidateSet &CandidateSet)
9649 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
9650 HasArithmeticOrEnumeralCandidateType(
9651 HasArithmeticOrEnumeralCandidateType),
9652 CandidateTypes(CandidateTypes),
9653 CandidateSet(CandidateSet) {
9655 InitArithmeticTypes();
9678 if (!HasArithmeticOrEnumeralCandidateType)
9681 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9682 const auto TypeOfT = ArithmeticTypes[Arith];
9684 if (Op == OO_MinusMinus)
9686 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9689 addPlusPlusMinusMinusStyleOverloads(
9706 void addPlusPlusMinusMinusPointerOverloads() {
9707 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
9709 if (!PtrTy->getPointeeType()->isObjectType())
9712 addPlusPlusMinusMinusStyleOverloads(
9714 (!PtrTy.isVolatileQualified() &&
9716 (!PtrTy.isRestrictQualified() &&
9731 void addUnaryStarPointerOverloads() {
9732 for (QualType ParamTy : CandidateTypes[0].pointer_types()) {
9737 if (
const FunctionProtoType *Proto =PointeeTy->
getAs<FunctionProtoType>())
9738 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9751 void addUnaryPlusOrMinusArithmeticOverloads() {
9752 if (!HasArithmeticOrEnumeralCandidateType)
9755 for (
unsigned Arith = FirstPromotedArithmeticType;
9756 Arith < LastPromotedArithmeticType; ++Arith) {
9757 QualType ArithTy = ArithmeticTypes[Arith];
9762 for (QualType VecTy : CandidateTypes[0].vector_types())
9771 void addUnaryPlusPointerOverloads() {
9772 for (QualType ParamTy : CandidateTypes[0].pointer_types())
9781 void addUnaryTildePromotedIntegralOverloads() {
9782 if (!HasArithmeticOrEnumeralCandidateType)
9785 for (
unsigned Int = FirstPromotedIntegralType;
9786 Int < LastPromotedIntegralType; ++
Int) {
9787 QualType IntTy = ArithmeticTypes[
Int];
9792 for (QualType VecTy : CandidateTypes[0].vector_types())
9802 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9804 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9806 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9807 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9812 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9816 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9818 if (AddedTypes.insert(NullPtrTy).second) {
9819 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9838 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9851 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9852 UserDefinedBinaryOperators;
9854 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9855 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9857 CEnd = CandidateSet.
end();
9859 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9862 if (
C->Function->isFunctionTemplateSpecialization())
9869 QualType FirstParamType =
C->Function->getParamDecl(
Reversed ? 1 : 0)
9871 .getUnqualifiedType();
9872 QualType SecondParamType =
C->Function->getParamDecl(
Reversed ? 0 : 1)
9874 .getUnqualifiedType();
9882 UserDefinedBinaryOperators.insert(
9890 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9892 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9893 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9897 if (IsSpaceship && PtrTy->isFunctionPointerType())
9900 QualType ParamTypes[2] = {PtrTy, PtrTy};
9903 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9908 if (!AddedTypes.insert(CanonType).second ||
9909 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9912 QualType ParamTypes[2] = {EnumTy, EnumTy};
9937 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9939 for (
int Arg = 0; Arg < 2; ++Arg) {
9940 QualType AsymmetricParamTypes[2] = {
9944 for (QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9949 AsymmetricParamTypes[Arg] = PtrTy;
9950 if (Arg == 0 || Op == OO_Plus) {
9955 if (Op == OO_Minus) {
9960 QualType ParamTypes[2] = {PtrTy, PtrTy};
9996 void addGenericBinaryArithmeticOverloads() {
9997 if (!HasArithmeticOrEnumeralCandidateType)
10000 for (
unsigned Left = FirstPromotedArithmeticType;
10001 Left < LastPromotedArithmeticType; ++
Left) {
10002 for (
unsigned Right = FirstPromotedArithmeticType;
10003 Right < LastPromotedArithmeticType; ++
Right) {
10004 QualType LandR[2] = { ArithmeticTypes[
Left],
10005 ArithmeticTypes[
Right] };
10012 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10013 for (QualType Vec2Ty : CandidateTypes[1].vector_types()) {
10014 QualType LandR[2] = {Vec1Ty, Vec2Ty};
10024 void addMatrixBinaryArithmeticOverloads() {
10025 if (!HasArithmeticOrEnumeralCandidateType)
10028 for (QualType M1 : CandidateTypes[0].matrix_types()) {
10030 AddCandidate(M1, M1);
10033 for (QualType M2 : CandidateTypes[1].matrix_types()) {
10035 if (!CandidateTypes[0].containsMatrixType(M2))
10036 AddCandidate(M2, M2);
10071 void addThreeWayArithmeticOverloads() {
10072 addGenericBinaryArithmeticOverloads();
10089 void addBinaryBitwiseArithmeticOverloads() {
10090 if (!HasArithmeticOrEnumeralCandidateType)
10093 for (
unsigned Left = FirstPromotedIntegralType;
10094 Left < LastPromotedIntegralType; ++
Left) {
10095 for (
unsigned Right = FirstPromotedIntegralType;
10096 Right < LastPromotedIntegralType; ++
Right) {
10097 QualType LandR[2] = { ArithmeticTypes[
Left],
10098 ArithmeticTypes[
Right] };
10111 void addAssignmentMemberPointerOrEnumeralOverloads() {
10113 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10115 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10116 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10123 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10148 void addAssignmentPointerOverloads(
bool isEqualOp) {
10150 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10152 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10156 else if (!PtrTy->getPointeeType()->isObjectType())
10160 QualType ParamTypes[2] = {
10167 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10169 if (NeedVolatile) {
10177 if (!PtrTy.isRestrictQualified() &&
10185 if (NeedVolatile) {
10197 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10202 QualType ParamTypes[2] = {
10211 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10213 if (NeedVolatile) {
10221 if (!PtrTy.isRestrictQualified() &&
10229 if (NeedVolatile) {
10254 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
10255 if (!HasArithmeticOrEnumeralCandidateType)
10258 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
10259 for (
unsigned Right = FirstPromotedArithmeticType;
10260 Right < LastPromotedArithmeticType; ++
Right) {
10261 QualType ParamTypes[2];
10262 ParamTypes[1] = ArithmeticTypes[
Right];
10264 S, ArithmeticTypes[Left], Args[0]);
10267 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10277 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10278 for (QualType Vec2Ty : CandidateTypes[0].vector_types()) {
10279 QualType ParamTypes[2];
10280 ParamTypes[1] = Vec2Ty;
10308 void addAssignmentIntegralOverloads() {
10309 if (!HasArithmeticOrEnumeralCandidateType)
10312 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
10313 for (
unsigned Right = FirstPromotedIntegralType;
10314 Right < LastPromotedIntegralType; ++
Right) {
10315 QualType ParamTypes[2];
10316 ParamTypes[1] = ArithmeticTypes[
Right];
10318 S, ArithmeticTypes[Left], Args[0]);
10321 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10337 void addExclaimOverload() {
10343 void addAmpAmpOrPipePipeOverload() {
10360 void addSubscriptOverloads() {
10361 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10371 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10391 void addArrowStarOverloads() {
10392 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10393 QualType C1Ty = PtrTy;
10395 QualifierCollector Q1;
10406 for (QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
10413 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
10416 if (!VisibleTypeConversionsQuals.
hasVolatile() &&
10417 T.isVolatileQualified())
10419 if (!VisibleTypeConversionsQuals.
hasRestrict() &&
10420 T.isRestrictQualified())
10438 void addConditionalOperatorOverloads() {
10440 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10442 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10443 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
10447 QualType ParamTypes[2] = {PtrTy, PtrTy};
10451 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10455 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
10460 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10461 if (!EnumTy->castAsCanonical<EnumType>()->getDecl()->isScoped())
10467 QualType ParamTypes[2] = {EnumTy, EnumTy};
10486 VisibleTypeConversionsQuals.
addConst();
10487 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10489 if (Args[ArgIdx]->
getType()->isAtomicType())
10490 VisibleTypeConversionsQuals.
addAtomic();
10493 bool HasNonRecordCandidateType =
false;
10494 bool HasArithmeticOrEnumeralCandidateType =
false;
10496 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10497 CandidateTypes.emplace_back(*
this);
10498 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->
getType(),
10501 (Op == OO_Exclaim ||
10503 Op == OO_PipePipe),
10504 VisibleTypeConversionsQuals);
10505 HasNonRecordCandidateType = HasNonRecordCandidateType ||
10506 CandidateTypes[ArgIdx].hasNonRecordTypes();
10507 HasArithmeticOrEnumeralCandidateType =
10508 HasArithmeticOrEnumeralCandidateType ||
10509 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
10517 if (!HasNonRecordCandidateType &&
10518 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
10522 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
10523 VisibleTypeConversionsQuals,
10524 HasArithmeticOrEnumeralCandidateType,
10525 CandidateTypes, CandidateSet);
10531 llvm_unreachable(
"Expected an overloaded operator");
10536 case OO_Array_Delete:
10539 "Special operators don't use AddBuiltinOperatorCandidates");
10551 if (Args.size() == 1)
10552 OpBuilder.addUnaryPlusPointerOverloads();
10556 if (Args.size() == 1) {
10557 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
10559 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
10560 OpBuilder.addGenericBinaryArithmeticOverloads();
10561 OpBuilder.addMatrixBinaryArithmeticOverloads();
10566 if (Args.size() == 1)
10567 OpBuilder.addUnaryStarPointerOverloads();
10569 OpBuilder.addGenericBinaryArithmeticOverloads();
10570 OpBuilder.addMatrixBinaryArithmeticOverloads();
10575 OpBuilder.addGenericBinaryArithmeticOverloads();
10579 case OO_MinusMinus:
10580 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
10581 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
10584 case OO_EqualEqual:
10585 case OO_ExclaimEqual:
10586 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
10587 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10588 OpBuilder.addGenericBinaryArithmeticOverloads();
10594 case OO_GreaterEqual:
10595 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10596 OpBuilder.addGenericBinaryArithmeticOverloads();
10600 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
10601 OpBuilder.addThreeWayArithmeticOverloads();
10608 case OO_GreaterGreater:
10609 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10613 if (Args.size() == 1)
10619 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10623 OpBuilder.addUnaryTildePromotedIntegralOverloads();
10627 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
10631 case OO_MinusEqual:
10632 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
10636 case OO_SlashEqual:
10637 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
10640 case OO_PercentEqual:
10641 case OO_LessLessEqual:
10642 case OO_GreaterGreaterEqual:
10644 case OO_CaretEqual:
10646 OpBuilder.addAssignmentIntegralOverloads();
10650 OpBuilder.addExclaimOverload();
10655 OpBuilder.addAmpAmpOrPipePipeOverload();
10659 if (Args.size() == 2)
10660 OpBuilder.addSubscriptOverloads();
10664 OpBuilder.addArrowStarOverloads();
10667 case OO_Conditional:
10668 OpBuilder.addConditionalOperatorOverloads();
10669 OpBuilder.addGenericBinaryArithmeticOverloads();
10680 bool PartialOverloading) {
10697 CandEnd = CandidateSet.
end();
10698 Cand != CandEnd; ++Cand)
10699 if (Cand->Function) {
10703 Fns.
erase(FunTmpl);
10712 if (ExplicitTemplateArgs)
10716 FD, FoundDecl, Args, CandidateSet,
false,
10717 PartialOverloading,
true,
10718 false, ADLCallKind::UsesADL);
10721 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10722 false, PartialOverloading,
10729 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10730 false, PartialOverloading,
10731 true, ADLCallKind::UsesADL);
10733 *
this, Args, FTD->getTemplatedDecl())) {
10737 if (ReversedArgs.empty())
10741 FTD, FoundDecl, ExplicitTemplateArgs, ReversedArgs, CandidateSet,
10742 false, PartialOverloading,
10743 true, ADLCallKind::UsesADL,
10768 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10769 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10770 if (!Cand1Attr || !Cand2Attr) {
10771 if (Cand1Attr == Cand2Attr)
10772 return Comparison::Equal;
10773 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10779 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10780 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10781 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10782 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10787 return Comparison::Worse;
10789 return Comparison::Better;
10794 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10795 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10796 if (Cand1ID != Cand2ID)
10797 return Comparison::Worse;
10800 return Comparison::Equal;
10808 return Comparison::Equal;
10814 return Comparison::Equal;
10815 return Comparison::Worse;
10818 return Comparison::Better;
10824 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10825 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10827 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10828 return Comparison::Equal;
10830 if (Cand1CPUDisp && !Cand2CPUDisp)
10831 return Comparison::Better;
10832 if (Cand2CPUDisp && !Cand1CPUDisp)
10833 return Comparison::Worse;
10835 if (Cand1CPUSpec && Cand2CPUSpec) {
10836 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10837 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10838 ? Comparison::Better
10839 : Comparison::Worse;
10841 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10842 FirstDiff = std::mismatch(
10843 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10844 Cand2CPUSpec->cpus_begin(),
10846 return LHS->getName() == RHS->getName();
10849 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10850 "Two different cpu-specific versions should not have the same "
10851 "identifier list, otherwise they'd be the same decl!");
10852 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->getName()
10853 ? Comparison::Better
10854 : Comparison::Worse;
10856 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10862static std::optional<QualType>
10865 return std::nullopt;
10871 return M->getFunctionObjectParameterReferenceType();
10885 PT2->getInstantiatedFromMemberTemplate()))
10896 assert(I < F->getNumParams());
10903 if (F1NumParams != F2NumParams)
10906 unsigned I1 = 0, I2 = 0;
10907 for (
unsigned I = 0; I != F1NumParams; ++I) {
10908 QualType T1 = NextParam(F1, I1, I == 0);
10909 QualType T2 = NextParam(F2, I2, I == 0);
10910 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10911 if (!Context.hasSameUnqualifiedType(T1, T2))
10924 bool IsFn1Reversed,
10925 bool IsFn2Reversed) {
10926 assert(Fn1 && Fn2);
10931 IsFn1Reversed ^ IsFn2Reversed))
10934 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10935 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10936 if (Mem1 && Mem2) {
10939 if (Mem1->getParent() != Mem2->getParent())
10943 if (Mem1->isInstance() && Mem2->isInstance() &&
10945 Mem1->getFunctionObjectParameterReferenceType(),
10946 Mem1->getFunctionObjectParameterReferenceType()))
10952static FunctionDecl *
10954 bool IsFn1Reversed,
bool IsFn2Reversed) {
10964 if (Cand1IsSpecialization || Cand2IsSpecialization)
10981 bool PartialOverloading) {
11027 bool IsCand1ImplicitHD =
11029 bool IsCand2ImplicitHD =
11044 auto EmitThreshold =
11045 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
11046 (IsCand1ImplicitHD || IsCand2ImplicitHD))
11049 auto Cand1Emittable = P1 > EmitThreshold;
11050 auto Cand2Emittable = P2 > EmitThreshold;
11051 if (Cand1Emittable && !Cand2Emittable)
11053 if (!Cand1Emittable && Cand2Emittable)
11064 unsigned StartArg = 0;
11072 return ICS.isStandard() &&
11084 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
11085 bool HasBetterConversion =
false;
11086 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11087 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
11088 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
11089 if (Cand1Bad != Cand2Bad) {
11092 HasBetterConversion =
true;
11096 if (HasBetterConversion)
11103 bool HasWorseConversion =
false;
11104 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11110 HasBetterConversion =
true;
11129 HasWorseConversion =
true;
11144 if (HasBetterConversion && !HasWorseConversion)
11195 bool Cand1IsSpecialization = Cand1.
Function &&
11197 bool Cand2IsSpecialization = Cand2.
Function &&
11199 if (Cand1IsSpecialization != Cand2IsSpecialization)
11200 return Cand2IsSpecialization;
11206 if (Cand1IsSpecialization && Cand2IsSpecialization) {
11207 const auto *Obj1Context =
11209 const auto *Obj2Context =
11238 bool Cand1IsInherited =
11240 bool Cand2IsInherited =
11242 if (Cand1IsInherited != Cand2IsInherited)
11243 return Cand2IsInherited;
11244 else if (Cand1IsInherited) {
11245 assert(Cand2IsInherited);
11248 if (Cand1Class->isDerivedFrom(Cand2Class))
11250 if (Cand2Class->isDerivedFrom(Cand1Class))
11267 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
11268 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
11269 if (Guide1 && Guide2) {
11271 if (Guide1->isImplicit() != Guide2->isImplicit())
11272 return Guide2->isImplicit();
11282 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
11283 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
11284 if (Constructor1 && Constructor2) {
11285 bool isC1Templated = Constructor1->getTemplatedKind() !=
11287 bool isC2Templated = Constructor2->getTemplatedKind() !=
11289 if (isC1Templated != isC2Templated)
11290 return isC2Templated;
11298 if (
Cmp != Comparison::Equal)
11299 return Cmp == Comparison::Better;
11302 bool HasPS1 = Cand1.
Function !=
nullptr &&
11304 bool HasPS2 = Cand2.
Function !=
nullptr &&
11306 if (HasPS1 != HasPS2 && HasPS1)
11310 if (MV == Comparison::Better)
11312 if (MV == Comparison::Worse)
11327 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
11328 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
11330 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
11331 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
11352 auto *VA = dyn_cast_or_null<ValueDecl>(A);
11353 auto *VB = dyn_cast_or_null<ValueDecl>(B);
11359 if (!VA->getDeclContext()->getRedeclContext()->Equals(
11360 VB->getDeclContext()->getRedeclContext()) ||
11362 VA->isExternallyVisible() || VB->isExternallyVisible())
11370 if (
Context.hasSameType(VA->getType(), VB->getType()))
11375 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
11376 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
11381 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
11382 !
Context.hasSameType(EnumA->getIntegerType(),
11383 EnumB->getIntegerType()))
11386 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
11396 assert(D &&
"Unknown declaration");
11397 Diag(Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) << D;
11403 for (
auto *E : Equiv) {
11405 Diag(E->getLocation(), diag::note_equivalent_internal_linkage_decl)
11415 ->Satisfaction.ContainsErrors;
11421 bool PartialOverloading,
bool AllowExplicit,
11423 bool AggregateCandidateDeduction) {
11426 allocateDeferredCandidate<DeferredFunctionTemplateOverloadCandidate>();
11431 false, AllowExplicit, SuppressUserConversions,
11432 PartialOverloading, AggregateCandidateDeduction},
11439 HasDeferredTemplateConstructors |=
11447 bool SuppressUserConversions,
bool PartialOverloading,
11453 allocateDeferredCandidate<DeferredMethodTemplateOverloadCandidate>();
11459 false, SuppressUserConversions, PartialOverloading,
11465 ObjectClassification,
11473 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
11474 bool AllowResultConversion) {
11477 allocateDeferredCandidate<DeferredConversionTemplateOverloadCandidate>();
11481 AllowObjCConversionOnExplicit, AllowResultConversion,
11498 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
11499 nullptr,
C.ObjectType,
C.ObjectClassification,
11500 C.Args,
C.SuppressUserConversions,
C.PartialOverloading,
C.PO);
11507 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
11508 nullptr,
C.Args,
C.SuppressUserConversions,
11509 C.PartialOverloading,
C.AllowExplicit,
C.IsADLCandidate,
C.PO,
11510 C.AggregateCandidateDeduction);
11517 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
C.From,
11518 C.ToType,
C.AllowObjCConversionOnExplicit,
C.AllowExplicit,
11519 C.AllowResultConversion);
11523 Candidates.reserve(Candidates.size() + DeferredCandidatesCount);
11526 switch (Cand->
Kind) {
11545 FirstDeferredCandidate =
nullptr;
11546 DeferredCandidatesCount = 0;
11550OverloadCandidateSet::ResultForBestCandidate(
const iterator &Best) {
11552 if (Best->Function && Best->Function->isDeleted())
11557void OverloadCandidateSet::CudaExcludeWrongSideCandidates(
11574 bool ContainsSameSideCandidate =
11582 if (!ContainsSameSideCandidate)
11585 auto IsWrongSideCandidate = [&](
const OverloadCandidate *Cand) {
11591 llvm::erase_if(Candidates, IsWrongSideCandidate);
11609 DeferredCandidatesCount == 0) &&
11610 "Unexpected deferred template candidates");
11612 bool TwoPhaseResolution =
11613 DeferredCandidatesCount != 0 && !ResolutionByPerfectCandidateIsDisabled;
11615 if (TwoPhaseResolution) {
11617 if (Best !=
end() && Best->isPerfectMatch(S.
Context)) {
11618 if (!(HasDeferredTemplateConstructors &&
11619 isa_and_nonnull<CXXConversionDecl>(Best->Function)))
11625 return BestViableFunctionImpl(S, Loc, Best);
11632 Candidates.reserve(this->Candidates.size());
11633 std::transform(this->Candidates.begin(), this->Candidates.end(),
11634 std::back_inserter(Candidates),
11638 CudaExcludeWrongSideCandidates(S, Candidates);
11641 for (
auto *Cand : Candidates) {
11642 Cand->
Best =
false;
11644 if (Best ==
end() ||
11661 llvm::SmallVector<OverloadCandidate *, 4> PendingBest;
11662 llvm::SmallVector<const NamedDecl *, 4> EquivalentCands;
11663 PendingBest.push_back(&*Best);
11668 while (!PendingBest.empty()) {
11669 auto *Curr = PendingBest.pop_back_val();
11670 for (
auto *Cand : Candidates) {
11673 PendingBest.push_back(Cand);
11678 EquivalentCands.push_back(Cand->
Function);
11690 if (!EquivalentCands.empty())
11698enum OverloadCandidateKind {
11701 oc_reversed_binary_operator,
11703 oc_implicit_default_constructor,
11704 oc_implicit_copy_constructor,
11705 oc_implicit_move_constructor,
11706 oc_implicit_copy_assignment,
11707 oc_implicit_move_assignment,
11708 oc_implicit_equality_comparison,
11709 oc_inherited_constructor
11712enum OverloadCandidateSelect {
11715 ocs_described_template,
11718static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
11719ClassifyOverloadCandidate(Sema &S,
const NamedDecl *
Found,
11720 const FunctionDecl *Fn,
11722 std::string &Description) {
11725 if (FunctionTemplateDecl *FunTmpl =
Fn->getPrimaryTemplate()) {
11728 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
11731 OverloadCandidateSelect Select = [&]() {
11732 if (!Description.empty())
11733 return ocs_described_template;
11734 return isTemplate ? ocs_template : ocs_non_template;
11737 OverloadCandidateKind Kind = [&]() {
11738 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
11739 return oc_implicit_equality_comparison;
11742 return oc_reversed_binary_operator;
11744 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
11745 if (!Ctor->isImplicit()) {
11747 return oc_inherited_constructor;
11749 return oc_constructor;
11752 if (Ctor->isDefaultConstructor())
11753 return oc_implicit_default_constructor;
11755 if (Ctor->isMoveConstructor())
11756 return oc_implicit_move_constructor;
11758 assert(Ctor->isCopyConstructor() &&
11759 "unexpected sort of implicit constructor");
11760 return oc_implicit_copy_constructor;
11763 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
11766 if (!Meth->isImplicit())
11769 if (Meth->isMoveAssignmentOperator())
11770 return oc_implicit_move_assignment;
11772 if (Meth->isCopyAssignmentOperator())
11773 return oc_implicit_copy_assignment;
11779 return oc_function;
11782 return std::make_pair(Kind, Select);
11785void MaybeEmitInheritedConstructorNote(Sema &S,
const Decl *FoundDecl) {
11788 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
11790 diag::note_ovl_candidate_inherited_constructor)
11791 << Shadow->getNominatedBaseClass();
11800 if (EnableIf->getCond()->isValueDependent() ||
11801 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
11818 bool InOverloadResolution,
11822 if (InOverloadResolution)
11824 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
11826 S.
Diag(Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
11837 if (InOverloadResolution) {
11840 TemplateArgString +=
" ";
11842 FunTmpl->getTemplateParameters(),
11847 diag::note_ovl_candidate_unsatisfied_constraints)
11848 << TemplateArgString;
11850 S.
Diag(Loc, diag::err_addrof_function_constraints_not_satisfied)
11859 return P->hasAttr<PassObjectSizeAttr>();
11866 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11867 if (InOverloadResolution)
11869 diag::note_ovl_candidate_has_pass_object_size_params)
11872 S.
Diag(Loc, diag::err_address_of_function_with_pass_object_size_params)
11888 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11896 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11901 if (!RD->isLambda())
11906 CallOp->getType()->castAs<
FunctionType>()->getCallConv();
11911 return ConvToCC != CallOpCC;
11917 QualType DestType,
bool TakingAddress) {
11920 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11921 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11923 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11924 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11929 std::string FnDesc;
11930 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11931 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11933 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11937 Diag(Fn->getLocation(), PD);
11938 MaybeEmitInheritedConstructorNote(*
this,
Found);
11956 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11957 for (
auto I = Cands.begin(), E = Cands.end(); I != E; ++I) {
11961 if (
auto *
Template = I->Function->getPrimaryTemplate())
11962 Template->getAssociatedConstraints(AC);
11964 I->Function->getAssociatedConstraints(AC);
11967 if (FirstCand ==
nullptr) {
11968 FirstCand = I->Function;
11970 }
else if (SecondCand ==
nullptr) {
11971 SecondCand = I->Function;
11984 SecondCand, SecondAC))
11993 bool TakingAddress) {
12003 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
12007 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
12020 S.
Diag(CaretLoc, PDiag)
12022 unsigned CandsShown = 0;
12036 unsigned I,
bool TakingCandidateAddress) {
12038 assert(Conv.
isBad());
12039 assert(Cand->
Function &&
"for now, candidate must be a function");
12045 bool isObjectArgument =
false;
12049 isObjectArgument =
true;
12054 std::string FnDesc;
12055 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12066 bool HasParamPack =
12067 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
12068 return Parm->isParameterPack();
12070 if (!isObjectArgument && !HasParamPack && I < Fn->getNumParams())
12071 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
12074 assert(FromExpr &&
"overload set argument came from implicit argument?");
12080 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
12081 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12082 << ToParamRange << ToTy << Name << I + 1;
12083 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12092 CToTy = RT->getPointeeType();
12097 CFromTy = FromPT->getPointeeType();
12098 CToTy = ToPT->getPointeeType();
12108 if (isObjectArgument)
12109 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
12110 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12113 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
12114 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12117 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12122 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
12123 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12126 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12131 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
12132 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12135 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12140 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ptrauth)
12141 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12146 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12151 assert(CVR &&
"expected qualifiers mismatch");
12153 if (isObjectArgument) {
12154 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
12155 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12156 << FromTy << (CVR - 1);
12158 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
12159 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12160 << ToParamRange << FromTy << (CVR - 1) << I + 1;
12162 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12168 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
12169 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12170 << (
unsigned)isObjectArgument << I + 1
12173 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12180 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
12181 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12182 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12187 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12199 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
12200 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12201 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12202 << (
unsigned)(Cand->
Fix.
Kind);
12204 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12209 unsigned BaseToDerivedConversion = 0;
12212 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12214 !FromPtrTy->getPointeeType()->isIncompleteType() &&
12215 !ToPtrTy->getPointeeType()->isIncompleteType() &&
12217 FromPtrTy->getPointeeType()))
12218 BaseToDerivedConversion = 1;
12226 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12228 FromIface->isSuperClassOf(ToIface))
12229 BaseToDerivedConversion = 2;
12231 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy,
12234 !ToRefTy->getPointeeType()->isIncompleteType() &&
12236 BaseToDerivedConversion = 3;
12240 if (BaseToDerivedConversion) {
12241 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
12242 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12243 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
12245 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12254 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
12255 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12256 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
12258 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12268 if (FromTy == S.
Context.AMDGPUFeaturePredicateTy &&
12271 diag::err_amdgcn_predicate_type_needs_explicit_bool_cast)
12278 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12279 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12280 << (
unsigned)(Cand->
Fix.
Kind);
12289 S.
Diag(Fn->getLocation(), FDiag);
12291 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12298 unsigned NumArgs,
bool IsAddressOf =
false) {
12299 assert(Cand->
Function &&
"Candidate is required to be a function.");
12301 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12302 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12309 if (Fn->isInvalidDecl() &&
12313 if (NumArgs < MinParams) {
12330 unsigned NumFormalArgs,
12331 bool IsAddressOf =
false) {
12333 "The templated declaration should at least be a function"
12334 " when diagnosing bad template argument deduction due to too many"
12335 " or too few arguments");
12341 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12342 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12345 bool HasExplicitObjectParam =
12346 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
12348 unsigned ParamCount =
12349 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12350 unsigned mode, modeCount;
12352 if (NumFormalArgs < MinParams) {
12353 if (MinParams != ParamCount || FnTy->isVariadic() ||
12354 FnTy->isTemplateVariadic())
12358 modeCount = MinParams;
12360 if (MinParams != ParamCount)
12364 modeCount = ParamCount;
12367 std::string Description;
12368 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12369 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
12371 unsigned FirstNonObjectParamIdx = HasExplicitObjectParam ? 1 : 0;
12372 if (modeCount == 1 && !IsAddressOf &&
12373 FirstNonObjectParamIdx < Fn->getNumParams() &&
12374 Fn->getParamDecl(FirstNonObjectParamIdx)->getDeclName())
12375 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
12376 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12377 << Description << mode << Fn->getParamDecl(FirstNonObjectParamIdx)
12378 << NumFormalArgs << HasExplicitObjectParam
12379 << Fn->getParametersSourceRange();
12381 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
12382 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12383 << Description << mode << modeCount << NumFormalArgs
12384 << HasExplicitObjectParam << Fn->getParametersSourceRange();
12386 MaybeEmitInheritedConstructorNote(S,
Found);
12391 unsigned NumFormalArgs) {
12392 assert(Cand->
Function &&
"Candidate must be a function");
12402 llvm_unreachable(
"Unsupported: Getting the described template declaration"
12403 " for bad deduction diagnosis");
12410 bool TakingCandidateAddress) {
12416 switch (DeductionFailure.
getResult()) {
12419 "TemplateDeductionResult::Success while diagnosing bad deduction");
12421 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
12422 "while diagnosing bad deduction");
12428 assert(ParamD &&
"no parameter found for incomplete deduction result");
12430 diag::note_ovl_candidate_incomplete_deduction)
12432 MaybeEmitInheritedConstructorNote(S,
Found);
12437 assert(ParamD &&
"no parameter found for incomplete deduction result");
12439 diag::note_ovl_candidate_incomplete_deduction_pack)
12441 << (DeductionFailure.
getFirstArg()->pack_size() + 1)
12443 MaybeEmitInheritedConstructorNote(S,
Found);
12448 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
12466 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
12467 << ParamD->
getDeclName() << Arg << NonCanonParam;
12468 MaybeEmitInheritedConstructorNote(S,
Found);
12473 assert(ParamD &&
"no parameter found for inconsistent deduction result");
12487 diag::note_ovl_candidate_inconsistent_deduction_types)
12490 MaybeEmitInheritedConstructorNote(S,
Found);
12510 diag::note_ovl_candidate_inconsistent_deduction)
12513 MaybeEmitInheritedConstructorNote(S,
Found);
12518 assert(ParamD &&
"no parameter found for invalid explicit arguments");
12521 diag::note_ovl_candidate_explicit_arg_mismatch);
12523 Diag << diag::ExplicitArgMismatchNameKind::Named << ParamD->
getDeclName();
12525 Diag << diag::ExplicitArgMismatchNameKind::Unnamed
12530 Diag << diag::ExplicitArgMismatchReasonKind::Detailed << DiagContent;
12532 Diag << diag::ExplicitArgMismatchReasonKind::Vague;
12535 MaybeEmitInheritedConstructorNote(S,
Found);
12542 TemplateArgString =
" ";
12545 if (TemplateArgString.size() == 1)
12546 TemplateArgString.clear();
12548 diag::note_ovl_candidate_unsatisfied_constraints)
12549 << TemplateArgString;
12552 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
12562 diag::note_ovl_candidate_instantiation_depth);
12563 MaybeEmitInheritedConstructorNote(S,
Found);
12571 TemplateArgString =
" ";
12574 if (TemplateArgString.size() == 1)
12575 TemplateArgString.clear();
12580 if (PDiag && PDiag->second.getDiagID() ==
12581 diag::err_typename_nested_not_found_enable_if) {
12584 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
12585 <<
"'enable_if'" << TemplateArgString;
12590 if (PDiag && PDiag->second.getDiagID() ==
12591 diag::err_typename_nested_not_found_requirement) {
12593 diag::note_ovl_candidate_disabled_by_requirement)
12594 << PDiag->second.getStringArg(0) << TemplateArgString;
12604 SFINAEArgString =
": ";
12606 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
12610 diag::note_ovl_candidate_substitution_failure)
12611 << TemplateArgString << SFINAEArgString << R;
12612 MaybeEmitInheritedConstructorNote(S,
Found);
12622 TemplateArgString =
" ";
12625 if (TemplateArgString.size() == 1)
12626 TemplateArgString.clear();
12629 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
12632 << TemplateArgString
12657 diag::note_ovl_candidate_non_deduced_mismatch_qualified)
12673 diag::note_ovl_candidate_non_deduced_mismatch)
12674 << FirstTA << SecondTA;
12680 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
12681 MaybeEmitInheritedConstructorNote(S,
Found);
12685 diag::note_cuda_ovl_candidate_target_mismatch);
12693 bool TakingCandidateAddress) {
12694 assert(Cand->
Function &&
"Candidate must be a function");
12709 assert(Cand->
Function &&
"Candidate must be a Function.");
12715 std::string FnDesc;
12716 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12717 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
12720 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
12721 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12723 << CalleeTarget << CallerTarget;
12728 if (Meth !=
nullptr && Meth->
isImplicit()) {
12732 switch (FnKindPair.first) {
12735 case oc_implicit_default_constructor:
12738 case oc_implicit_copy_constructor:
12741 case oc_implicit_move_constructor:
12744 case oc_implicit_copy_assignment:
12747 case oc_implicit_move_assignment:
12752 bool ConstRHS =
false;
12756 ConstRHS = RT->getPointeeType().isConstQualified();
12767 assert(Cand->
Function &&
"Candidate must be a function");
12771 S.
Diag(Callee->getLocation(),
12772 diag::note_ovl_candidate_disabled_by_function_cond_attr)
12773 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
12777 assert(Cand->
Function &&
"Candidate must be a function");
12780 assert(ES.
isExplicit() &&
"not an explicit candidate");
12783 switch (Fn->getDeclKind()) {
12784 case Decl::Kind::CXXConstructor:
12787 case Decl::Kind::CXXConversion:
12790 case Decl::Kind::CXXDeductionGuide:
12791 Kind = Fn->isImplicit() ? 0 : 2;
12794 llvm_unreachable(
"invalid Decl");
12803 First = Pattern->getFirstDecl();
12806 diag::note_ovl_candidate_explicit)
12807 << Kind << (ES.
getExpr() ? 1 : 0)
12812 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
12819 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
12821 std::string FunctionProto;
12822 llvm::raw_string_ostream OS(FunctionProto);
12835 "Non-template implicit deduction guides are only possible for "
12838 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12843 assert(
Template &&
"Cannot find the associated function template of "
12844 "CXXDeductionGuideDecl?");
12847 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12868 bool TakingCandidateAddress,
12870 assert(Cand->
Function &&
"Candidate must be a function");
12878 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
12885 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12890 if (Fn->isDeleted()) {
12891 std::string FnDesc;
12892 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12893 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12896 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12897 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12898 << (Fn->isDeleted()
12899 ? (Fn->getCanonicalDecl()->isDeletedAsWritten() ? 1 : 2)
12901 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12928 TakingCandidateAddress);
12931 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12932 << (Fn->getPrimaryTemplate() ? 1 : 0);
12933 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12940 S.
Diag(Fn->getLocation(),
12941 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12942 << QualsForPrinting;
12943 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12954 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
12977 S.
Diag(Fn->getLocation(),
12978 diag::note_ovl_candidate_inherited_constructor_slice)
12979 << (Fn->getPrimaryTemplate() ? 1 : 0)
12980 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
12981 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12987 assert(!Available);
12995 std::string FnDesc;
12996 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12997 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
13000 S.
Diag(Fn->getLocation(),
13001 diag::note_ovl_candidate_constraints_not_satisfied)
13002 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
13021 bool isLValueReference =
false;
13022 bool isRValueReference =
false;
13023 bool isPointer =
false;
13027 isLValueReference =
true;
13031 isRValueReference =
true;
13047 diag::note_ovl_surrogate_constraints_not_satisfied)
13061 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
13062 std::string TypeStr(
"operator");
13068 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13073 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13080 if (ICS.
isBad())
break;
13084 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
13101 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
13131 llvm_unreachable(
"Unhandled deduction result");
13136struct CompareOverloadCandidatesForDisplay {
13138 SourceLocation Loc;
13142 CompareOverloadCandidatesForDisplay(
13143 Sema &S, SourceLocation Loc,
size_t NArgs,
13145 : S(S), NumArgs(NArgs), CSK(CSK) {}
13155 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
13157 if (NumArgs < C->
Function->getMinRequiredArguments())
13164 bool operator()(
const OverloadCandidate *L,
13165 const OverloadCandidate *R) {
13167 if (L == R)
return false;
13171 if (!
R->Viable)
return true;
13173 if (
int Ord = CompareConversions(*L, *R))
13176 }
else if (
R->Viable)
13179 assert(L->
Viable ==
R->Viable);
13192 int RDist =
std::abs((
int)
R->getNumParams() - (
int)NumArgs);
13193 if (LDist == RDist) {
13194 if (LFailureKind == RFailureKind)
13202 return LDist < RDist;
13219 unsigned numRFixes =
R->Fix.NumConversionsFixed;
13220 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
13221 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
13222 if (numLFixes != numRFixes) {
13223 return numLFixes < numRFixes;
13227 if (
int Ord = CompareConversions(*L, *R))
13239 if (LRank != RRank)
13240 return LRank < RRank;
13266 struct ConversionSignals {
13267 unsigned KindRank = 0;
13270 static ConversionSignals ForSequence(ImplicitConversionSequence &
Seq) {
13271 ConversionSignals Sig;
13272 Sig.KindRank =
Seq.getKindRank();
13273 if (
Seq.isStandard())
13274 Sig.Rank =
Seq.Standard.getRank();
13275 else if (
Seq.isUserDefined())
13276 Sig.Rank =
Seq.UserDefined.After.getRank();
13282 static ConversionSignals ForObjectArgument() {
13292 int CompareConversions(
const OverloadCandidate &L,
13293 const OverloadCandidate &R) {
13298 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
13300 ? ConversionSignals::ForObjectArgument()
13301 : ConversionSignals::ForSequence(L.Conversions[I]);
13302 auto RS =
R.IgnoreObjectArgument
13303 ? ConversionSignals::ForObjectArgument()
13304 : ConversionSignals::ForSequence(
R.Conversions[I]);
13305 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
13306 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
13331 bool Unfixable =
false;
13337 for (
unsigned ConvIdx =
13341 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
13342 if (Cand->
Conversions[ConvIdx].isInitialized() &&
13351 bool SuppressUserConversions =
false;
13353 unsigned ConvIdx = 0;
13354 unsigned ArgIdx = 0;
13383 assert(ConvCount <= 3);
13389 ConvIdx != ConvCount && ArgIdx < Args.size();
13391 if (Cand->
Conversions[ConvIdx].isInitialized()) {
13393 }
else if (
ParamIdx < ParamTypes.size()) {
13394 if (ParamTypes[
ParamIdx]->isDependentType())
13395 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
13400 SuppressUserConversions,
13405 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
13424 for (
iterator Cand = Candidates.begin(), LastCand = Candidates.end();
13425 Cand != LastCand; ++Cand) {
13426 if (!Filter(*Cand))
13451 Cands.push_back(Cand);
13455 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
13462 bool DeferHint =
false;
13466 auto WrongSidedCands =
13468 return (Cand.
Viable ==
false &&
13474 DeferHint = !WrongSidedCands.empty();
13490 S.
Diag(PD.first, PD.second);
13495 bool NoteCands =
true;
13496 for (
const Expr *Arg : Args) {
13497 if (Arg->getType()->isWebAssemblyTableType())
13506 {Candidates.begin(), Candidates.end()});
13512 bool ReportedAmbiguousConversions =
false;
13515 unsigned CandsShown = 0;
13516 auto I = Cands.begin(), E = Cands.end();
13517 for (; I != E; ++I) {
13533 "Non-viable built-in candidates are not added to Cands.");
13540 if (!ReportedAmbiguousConversions) {
13542 ReportedAmbiguousConversions =
true;
13556 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13561 const Sema &S)
const {
13567 if (Caller && Caller->
hasAttr<CUDAHostAttr>() &&
13568 Caller->
hasAttr<CUDADeviceAttr>())
13589struct CompareTemplateSpecCandidatesForDisplay {
13591 CompareTemplateSpecCandidatesForDisplay(Sema &S) : S(S) {}
13593 bool operator()(
const TemplateSpecCandidate *L,
13594 const TemplateSpecCandidate *R) {
13625 bool ForTakingAddress) {
13630void TemplateSpecCandidateSet::destroyCandidates() {
13632 i->DeductionFailure.Destroy();
13637 destroyCandidates();
13638 Candidates.clear();
13651 Cands.reserve(
size());
13652 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
13653 if (Cand->Specialization)
13654 Cands.push_back(Cand);
13659 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
13666 unsigned CandsShown = 0;
13667 for (I = Cands.begin(), E = Cands.end(); I != E; ++I) {
13673 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
13678 "Non-matching built-in candidates are not added to Cands.");
13683 S.
Diag(Loc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13693 QualType Ret = PossiblyAFunctionType;
13696 Ret = ToTypePtr->getPointeeType();
13699 Ret = ToTypeRef->getPointeeType();
13702 Ret = MemTypePtr->getPointeeType();
13704 Context.getCanonicalType(Ret).getUnqualifiedType();
13709 bool Complain =
true) {
13726class AddressOfFunctionResolver {
13729 const QualType& TargetType;
13730 QualType TargetFunctionType;
13734 ASTContext& Context;
13736 bool TargetTypeIsNonStaticMemberFunction;
13737 bool FoundNonTemplateFunction;
13738 bool StaticMemberFunctionFromBoundPointer;
13739 bool HasComplained;
13741 OverloadExpr::FindResult OvlExprInfo;
13742 OverloadExpr *OvlExpr;
13743 TemplateArgumentListInfo OvlExplicitTemplateArgs;
13744 SmallVector<std::pair<DeclAccessPair, FunctionDecl*>, 4> Matches;
13745 TemplateSpecCandidateSet FailedCandidates;
13748 AddressOfFunctionResolver(Sema &S, Expr *SourceExpr,
13749 const QualType &TargetType,
bool Complain)
13750 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
13751 Complain(Complain), Context(S.getASTContext()),
13752 TargetTypeIsNonStaticMemberFunction(
13753 !!TargetType->getAs<MemberPointerType>()),
13754 FoundNonTemplateFunction(
false),
13755 StaticMemberFunctionFromBoundPointer(
false),
13756 HasComplained(
false),
13757 OvlExprInfo(OverloadExpr::find(SourceExpr)),
13759 FailedCandidates(OvlExpr->getNameLoc(),
true) {
13760 ExtractUnqualifiedFunctionTypeFromTargetType();
13763 if (UnresolvedMemberExpr *UME = dyn_cast<UnresolvedMemberExpr>(OvlExpr))
13764 if (!UME->isImplicitAccess() &&
13766 StaticMemberFunctionFromBoundPointer =
true;
13768 DeclAccessPair dap;
13770 OvlExpr,
false, &dap)) {
13771 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn))
13772 if (!
Method->isStatic()) {
13776 TargetTypeIsNonStaticMemberFunction =
true;
13784 Matches.push_back(std::make_pair(dap, Fn));
13792 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
13794 EliminateSuboptimalCudaMatches();
13798 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
13799 if (FoundNonTemplateFunction) {
13800 EliminateAllTemplateMatches();
13801 EliminateLessPartialOrderingConstrainedMatches();
13803 EliminateAllExceptMostSpecializedTemplate();
13808 bool hasComplained()
const {
return HasComplained; }
13811 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
13818 bool isBetterCandidate(
const FunctionDecl *A,
const FunctionDecl *B) {
13822 return candidateHasExactlyCorrectType(A) &&
13823 (!candidateHasExactlyCorrectType(B) ||
13829 bool eliminiateSuboptimalOverloadCandidates() {
13832 auto Best = Matches.begin();
13833 for (
auto I = Matches.begin()+1, E = Matches.end(); I != E; ++I)
13834 if (isBetterCandidate(I->second, Best->second))
13837 const FunctionDecl *BestFn = Best->second;
13838 auto IsBestOrInferiorToBest = [
this, BestFn](
13839 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
13840 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
13845 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
13847 Matches[0] = *Best;
13852 bool isTargetTypeAFunction()
const {
13861 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
13867 const DeclAccessPair& CurAccessFunPair) {
13868 if (CXXMethodDecl *
Method
13872 bool CanConvertToFunctionPointer =
13873 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13874 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13877 else if (TargetTypeIsNonStaticMemberFunction)
13887 TemplateDeductionInfo Info(FailedCandidates.
getLocation());
13891 Result != TemplateDeductionResult::Success) {
13909 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
13913 bool AddMatchingNonTemplateFunction(NamedDecl* Fn,
13914 const DeclAccessPair& CurAccessFunPair) {
13915 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn)) {
13918 bool CanConvertToFunctionPointer =
13919 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13920 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13923 else if (TargetTypeIsNonStaticMemberFunction)
13926 if (FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13933 if (FunDecl->isMultiVersion()) {
13934 const auto *TA = FunDecl->getAttr<TargetAttr>();
13935 if (TA && !TA->isDefaultVersion())
13937 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13938 if (TVA && !TVA->isDefaultVersion())
13946 HasComplained |= Complain;
13955 candidateHasExactlyCorrectType(FunDecl)) {
13956 Matches.push_back(std::make_pair(
13958 FoundNonTemplateFunction =
true;
13966 bool FindAllFunctionsThatMatchTargetTypeExactly() {
13971 if (IsInvalidFormOfPointerToMemberFunction())
13974 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
13978 NamedDecl *
Fn = (*I)->getUnderlyingDecl();
13987 = dyn_cast<FunctionTemplateDecl>(Fn)) {
13993 AddMatchingNonTemplateFunction(Fn, I.getPair()))
13996 assert(Ret || Matches.empty());
14000 void EliminateAllExceptMostSpecializedTemplate() {
14012 UnresolvedSet<4> MatchesCopy;
14013 for (
unsigned I = 0, E = Matches.size(); I != E; ++I)
14014 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
14019 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
14021 S.
PDiag(diag::err_addr_ovl_ambiguous)
14022 << Matches[0].second->getDeclName(),
14023 S.
PDiag(diag::note_ovl_candidate)
14024 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
14025 Complain, TargetFunctionType);
14029 Matches[0].first = Matches[
Result - MatchesCopy.
begin()].first;
14033 HasComplained |= Complain;
14036 void EliminateAllTemplateMatches() {
14039 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
14040 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
14043 Matches[I] = Matches[--N];
14049 void EliminateLessPartialOrderingConstrainedMatches() {
14054 assert(Matches[0].second->getPrimaryTemplate() ==
nullptr &&
14055 "Call EliminateAllTemplateMatches() first");
14056 SmallVector<std::pair<DeclAccessPair, FunctionDecl *>, 4> Results;
14057 Results.push_back(Matches[0]);
14058 for (
unsigned I = 1, N = Matches.size(); I < N; ++I) {
14059 assert(Matches[I].second->getPrimaryTemplate() ==
nullptr);
14061 S, Matches[I].second, Results[0].second,
14065 Results.push_back(Matches[I]);
14068 if (F == Matches[I].second) {
14070 Results.push_back(Matches[I]);
14073 std::swap(Matches, Results);
14076 void EliminateSuboptimalCudaMatches() {
14082 void ComplainNoMatchesFound()
const {
14083 assert(Matches.empty());
14085 << OvlExpr->
getName() << TargetFunctionType
14087 if (FailedCandidates.
empty())
14094 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
14097 if (FunctionDecl *Fun =
14098 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
14106 bool IsInvalidFormOfPointerToMemberFunction()
const {
14107 return TargetTypeIsNonStaticMemberFunction &&
14111 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
14119 bool IsStaticMemberFunctionFromBoundPointer()
const {
14120 return StaticMemberFunctionFromBoundPointer;
14123 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
14125 diag::err_invalid_form_pointer_member_function)
14129 void ComplainOfInvalidConversion()
const {
14131 << OvlExpr->
getName() << TargetType;
14134 void ComplainMultipleMatchesFound()
const {
14135 assert(Matches.size() > 1);
14142 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
14144 int getNumMatches()
const {
return Matches.size(); }
14146 FunctionDecl* getMatchingFunctionDecl()
const {
14147 if (Matches.size() != 1)
return nullptr;
14148 return Matches[0].second;
14151 const DeclAccessPair* getMatchingFunctionAccessPair()
const {
14152 if (Matches.size() != 1)
return nullptr;
14153 return &Matches[0].first;
14163 bool *pHadMultipleCandidates) {
14166 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
14168 int NumMatches = Resolver.getNumMatches();
14170 bool ShouldComplain = Complain && !Resolver.hasComplained();
14171 if (NumMatches == 0 && ShouldComplain) {
14172 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
14173 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
14175 Resolver.ComplainNoMatchesFound();
14177 else if (NumMatches > 1 && ShouldComplain)
14178 Resolver.ComplainMultipleMatchesFound();
14179 else if (NumMatches == 1) {
14180 Fn = Resolver.getMatchingFunctionDecl();
14184 FoundResult = *Resolver.getMatchingFunctionAccessPair();
14186 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
14187 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
14193 if (pHadMultipleCandidates)
14194 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
14202 bool IsResultAmbiguous =
false;
14210 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
14211 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
14218 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
14226 auto FoundBetter = [&]() {
14227 IsResultAmbiguous =
false;
14239 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
14241 if (PreferenceByCUDA != 0) {
14243 if (PreferenceByCUDA > 0)
14259 if (MoreConstrained != FD) {
14260 if (!MoreConstrained) {
14261 IsResultAmbiguous =
true;
14262 AmbiguousDecls.push_back(FD);
14271 if (IsResultAmbiguous)
14292 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
14294 assert(E->
getType() ==
Context.OverloadTy &&
"SrcExpr must be an overload");
14298 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
14299 Found->isCPUSpecificMultiVersion())
14347 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
14378 if (ForTypeDeduction &&
14392 if (FoundResult) *FoundResult = I.getPair();
14403 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
14405 unsigned DiagIDForComplaining) {
14426 if (!complain)
return false;
14429 diag::err_bound_member_function)
14442 SingleFunctionExpression =
14446 if (doFunctionPointerConversion) {
14447 SingleFunctionExpression =
14449 if (SingleFunctionExpression.
isInvalid()) {
14456 if (!SingleFunctionExpression.
isUsable()) {
14458 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
14460 << DestTypeForComplaining
14461 << OpRangeForComplaining
14472 SrcExpr = SingleFunctionExpression;
14482 bool PartialOverloading,
14489 if (ExplicitTemplateArgs) {
14490 assert(!KnownValid &&
"Explicit template arguments?");
14499 PartialOverloading);
14504 = dyn_cast<FunctionTemplateDecl>(Callee)) {
14506 ExplicitTemplateArgs, Args, CandidateSet,
14508 PartialOverloading);
14512 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
14518 bool PartialOverloading) {
14541 assert(!(*I)->getDeclContext()->isRecord());
14543 !(*I)->getDeclContext()->isFunctionOrMethod());
14544 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
14554 ExplicitTemplateArgs = &TABuffer;
14560 CandidateSet, PartialOverloading,
14565 Args, ExplicitTemplateArgs,
14566 CandidateSet, PartialOverloading);
14574 CandidateSet,
false,
false);
14581 case OO_New:
case OO_Array_New:
14582 case OO_Delete:
case OO_Array_Delete:
14605 if (DC->isTransparentContext())
14611 R.suppressDiagnostics();
14621 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
14626 if (FoundInClass) {
14627 *FoundInClass = RD;
14630 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
14647 AssociatedNamespaces,
14648 AssociatedClasses);
14652 for (Sema::AssociatedNamespaceSet::iterator
14653 it = AssociatedNamespaces.begin(),
14654 end = AssociatedNamespaces.end(); it !=
end; ++it) {
14666 SuggestedNamespaces.insert(*it);
14670 SemaRef.
Diag(R.getNameLoc(), diag::err_not_found_by_two_phase_lookup)
14671 << R.getLookupName();
14672 if (SuggestedNamespaces.empty()) {
14673 SemaRef.
Diag(Best->Function->getLocation(),
14674 diag::note_not_found_by_two_phase_lookup)
14675 << R.getLookupName() << 0;
14676 }
else if (SuggestedNamespaces.size() == 1) {
14677 SemaRef.
Diag(Best->Function->getLocation(),
14678 diag::note_not_found_by_two_phase_lookup)
14679 << R.getLookupName() << 1 << *SuggestedNamespaces.begin();
14684 SemaRef.
Diag(Best->Function->getLocation(),
14685 diag::note_not_found_by_two_phase_lookup)
14686 << R.getLookupName() << 2;
14717class BuildRecoveryCallExprRAII {
14719 Sema::SatisfactionStackResetRAII SatStack;
14722 BuildRecoveryCallExprRAII(Sema &S) : SemaRef(S), SatStack(S) {
14744 bool EmptyLookup,
bool AllowTypoCorrection) {
14752 BuildRecoveryCallExprRAII RCE(SemaRef);
14762 ExplicitTemplateArgs = &TABuffer;
14770 ExplicitTemplateArgs, Args, &FoundInClass)) {
14772 }
else if (EmptyLookup) {
14777 ExplicitTemplateArgs !=
nullptr,
14778 dyn_cast<MemberExpr>(Fn));
14780 AllowTypoCorrection
14786 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
14801 assert(!R.empty() &&
"lookup results empty despite recovery");
14804 if (R.isAmbiguous()) {
14805 R.suppressDiagnostics();
14812 if ((*R.begin())->isCXXClassMember())
14814 ExplicitTemplateArgs, S);
14815 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
14817 ExplicitTemplateArgs);
14841 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
14848 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
14850 llvm_unreachable(
"performing ADL for builtin");
14857 UnbridgedCastsSet UnbridgedCasts;
14872 if (CandidateSet->
empty() ||
14888 if (CandidateSet->
empty())
14891 UnbridgedCasts.restore();
14898 std::optional<QualType>
Result;
14918 if (Best && *Best != CS.
end())
14919 ConsiderCandidate(**Best);
14922 for (
const auto &
C : CS)
14924 ConsiderCandidate(
C);
14927 for (
const auto &
C : CS)
14928 ConsiderCandidate(
C);
14933 if (
Value.isNull() ||
Value->isUndeducedType())
14950 bool AllowTypoCorrection) {
14951 switch (OverloadResult) {
14962 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14968 if (*Best != CandidateSet->
end() &&
14972 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
14977 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
14987 CandidateSet->
empty(),
14988 AllowTypoCorrection);
14995 for (
const Expr *Arg : Args) {
14996 if (!Arg->getType()->isFunctionType())
14998 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
14999 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
15002 Arg->getExprLoc()))
15010 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
15011 << ULE->
getName() << Fn->getSourceRange()),
15019 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
15020 << ULE->
getName() << Fn->getSourceRange()),
15027 Fn->getSourceRange(), ULE->
getName(),
15028 *CandidateSet, FDecl, Args);
15037 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
15045 SubExprs.append(Args.begin(), Args.end());
15052 for (
auto I = CS.
begin(), E = CS.
end(); I != E; ++I) {
15067 bool AllowTypoCorrection,
15068 bool CalleesAddressIsTaken) {
15083 if (CalleesAddressIsTaken)
15094 Best != CandidateSet.
end()) {
15095 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
15096 M && M->isImplicitObjectMemberFunction()) {
15107 CUDA().recordPotentialODRUsedVariable(Args, CandidateSet);
15125 if (
const auto *TP =
15135 ExecConfig, &CandidateSet, &Best,
15136 OverloadResult, AllowTypoCorrection);
15145 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
15151 bool HadMultipleCandidates) {
15161 if (
Method->isExplicitObjectMemberFunction())
15165 E, std::nullopt, FoundDecl,
Method);
15169 if (
Method->getParent()->isLambda() &&
15170 Method->getConversionType()->isBlockPointerType()) {
15174 auto *CE = dyn_cast<CastExpr>(SubE);
15175 if (CE && CE->getCastKind() == CK_NoOp)
15176 SubE = CE->getSubExpr();
15178 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
15179 SubE = BE->getSubExpr();
15202 if (
Method->isExplicitObjectMemberFunction()) {
15208 Expr *ObjectParam = Exp.
get();
15222 Exp.
get()->getEndLoc(),
15237 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15254 Expr *Input,
bool PerformADL) {
15256 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15264 Expr *Args[2] = { Input,
nullptr };
15265 unsigned NumArgs = 1;
15270 if (Opc == UO_PostInc || Opc == UO_PostDec) {
15284 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
15295 if (Fn.isInvalid())
15306 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15325 if (
Method->isExplicitObjectMemberFunction())
15329 Input, std::nullopt, Best->FoundDecl,
Method);
15332 Base = Input = InputInit.
get();
15343 Input = InputInit.
get();
15348 Base, HadMultipleCandidates,
15360 Context, Op, FnExpr.
get(), ArgsArray, ResultTy,
VK, OpLoc,
15376 Input, Best->BuiltinParamTypes[0], Best->Conversions[0],
15381 Input = InputRes.
get();
15401 PDiag(diag::err_ovl_ambiguous_oper_unary)
15418 << (Msg !=
nullptr)
15419 << (Msg ? Msg->
getString() : StringRef())
15472 if (Op != OO_Equal && PerformADL) {
15479 Context.DeclarationNames.getCXXOperatorName(ExtraOp);
15505 Expr *RHS,
bool PerformADL,
15506 bool AllowRewrittenCandidates,
15508 Expr *Args[2] = { LHS, RHS };
15512 AllowRewrittenCandidates =
false;
15518 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
15539 if (Fn.isInvalid())
15548 if (Opc == BO_PtrMemD) {
15549 auto CheckPlaceholder = [&](
Expr *&Arg) {
15558 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
15582 if (Opc == BO_Assign &&
15591 Op, OpLoc, AllowRewrittenCandidates));
15593 CandidateSet.
exclude(DefaultedFn);
15596 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15605 bool IsReversed = Best->isReversed();
15607 std::swap(Args[0], Args[1]);
15624 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
15628 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
15629 : diag::err_ovl_rewrite_equalequal_not_bool)
15637 if (AllowRewrittenCandidates && !IsReversed &&
15647 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
15650 Best->Conversions[ArgIdx]) ==
15652 AmbiguousWith.push_back(Cand.
Function);
15659 if (!AmbiguousWith.empty()) {
15660 bool AmbiguousWithSelf =
15661 AmbiguousWith.size() == 1 &&
15663 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
15665 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
15667 if (AmbiguousWithSelf) {
15669 diag::note_ovl_ambiguous_oper_binary_reversed_self);
15674 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
15675 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
15677 !MD->hasCXXExplicitFunctionObjectParameter() &&
15678 Context.hasSameUnqualifiedType(
15679 MD->getFunctionObjectParameterType(),
15680 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
15681 Context.hasSameUnqualifiedType(
15682 MD->getFunctionObjectParameterType(),
15684 Context.hasSameUnqualifiedType(
15685 MD->getFunctionObjectParameterType(),
15688 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
15691 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
15692 for (
auto *F : AmbiguousWith)
15694 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
15702 if (Op == OO_Equal)
15713 if (
Method->isExplicitObjectMemberFunction()) {
15718 Args[0], std::nullopt, Best->FoundDecl,
Method);
15751 Best->FoundDecl,
Base,
15752 HadMultipleCandidates, OpLoc);
15763 const Expr *ImplicitThis =
nullptr;
15768 Context, ChosenOp, FnExpr.
get(), Args, ResultTy,
VK, OpLoc,
15773 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(FnDecl);
15776 ImplicitThis = ArgsArray[0];
15777 ArgsArray = ArgsArray.slice(1);
15784 if (Op == OO_Equal) {
15789 *
this,
AssignedEntity{Args[0], dyn_cast<CXXMethodDecl>(FnDecl)},
15792 if (ImplicitThis) {
15797 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
15801 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
15816 (Op == OO_Spaceship && IsReversed)) {
15817 if (Op == OO_ExclaimEqual) {
15818 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
15821 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
15823 Expr *ZeroLiteral =
15832 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.get(),
15833 IsReversed ? R.get() : ZeroLiteral,
true,
15841 assert(ChosenOp == Op &&
"unexpected operator name");
15845 if (Best->RewriteKind !=
CRK_None)
15854 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15859 Args[0] = ArgsRes0.
get();
15862 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15867 Args[1] = ArgsRes1.
get();
15877 if (Opc == BO_Comma)
15882 if (DefaultedFn && Opc == BO_Cmp) {
15884 Args[1], DefaultedFn);
15899 Opc >= BO_Assign && Opc <= BO_OrAssign) {
15900 Diag(OpLoc, diag::err_ovl_no_viable_oper)
15903 if (Args[0]->
getType()->isIncompleteType()) {
15904 Diag(OpLoc, diag::note_assign_lhs_incomplete)
15920 assert(
Result.isInvalid() &&
15921 "C++ binary operator overloading is missing candidates!");
15932 << Args[0]->getSourceRange()
15933 << Args[1]->getSourceRange()),
15943 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
15947 Diag(OpLoc, diag::err_ovl_deleted_comparison)
15948 << Args[0]->
getType() << DeletedFD;
15961 PDiag(diag::err_ovl_deleted_oper)
15963 .getCXXOverloadedOperator())
15964 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
15965 << Args[0]->getSourceRange() << Args[1]->getSourceRange()),
15989 "cannot use prvalue expressions more than once");
15990 Expr *OrigLHS = LHS;
15991 Expr *OrigRHS = RHS;
16008 true, DefaultedFn);
16009 if (
Less.isInvalid())
16036 for (; I >= 0; --I) {
16038 auto *VI = Info->lookupValueInfo(Comparisons[I].
Result);
16061 Context, OrigLHS, OrigRHS, BO_Cmp,
Result.get()->getType(),
16062 Result.get()->getValueKind(),
Result.get()->getObjectKind(), OpLoc,
16064 Expr *SemanticForm[] = {LHS, RHS,
Result.get()};
16074 unsigned NumArgsSlots =
16075 MethodArgs.size() + std::max<unsigned>(Args.size(), NumParams);
16078 MethodArgs.reserve(MethodArgs.size() + NumArgsSlots);
16079 bool IsError =
false;
16082 for (
unsigned i = 0; i != NumParams; i++) {
16084 if (i < Args.size()) {
16088 S.
Context, Method->getParamDecl(i)),
16102 MethodArgs.push_back(Arg);
16112 Args.push_back(
Base);
16113 for (
auto *e : ArgExpr) {
16117 Context.DeclarationNames.getCXXOperatorName(OO_Subscript);
16122 ArgExpr.back()->getEndLoc());
16134 if (Fn.isInvalid())
16144 UnbridgedCastsSet UnbridgedCasts;
16157 if (Args.size() == 2)
16160 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16180 if (
Method->isExplicitObjectMemberFunction()) {
16185 Args[0] = Res.
get();
16189 Args[0], std::nullopt, Best->FoundDecl,
Method);
16193 MethodArgs.push_back(Arg0.
get());
16197 *
this, MethodArgs,
Method, ArgExpr, LLoc);
16205 *
this, FnDecl, Best->FoundDecl,
Base, HadMultipleCandidates,
16216 Context, OO_Subscript, FnExpr.
get(), MethodArgs, ResultTy,
VK, RLoc,
16233 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
16238 Args[0] = ArgsRes0.
get();
16241 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
16246 Args[1] = ArgsRes1.
get();
16254 CandidateSet.
empty()
16255 ? (
PDiag(diag::err_ovl_no_oper)
16256 << Args[0]->getType() << 0
16257 << Args[0]->getSourceRange() << Range)
16258 : (
PDiag(diag::err_ovl_no_viable_subscript)
16259 << Args[0]->getType() << Args[0]->getSourceRange() << Range);
16266 if (Args.size() == 2) {
16269 LLoc,
PDiag(diag::err_ovl_ambiguous_oper_binary)
16271 << Args[0]->getSourceRange() << Range),
16276 PDiag(diag::err_ovl_ambiguous_subscript_call)
16278 << Args[0]->getSourceRange() << Range),
16287 PDiag(diag::err_ovl_deleted_oper)
16288 <<
"[]" << (Msg !=
nullptr)
16289 << (Msg ? Msg->
getString() : StringRef())
16290 << Args[0]->getSourceRange() << Range),
16304 Expr *ExecConfig,
bool IsExecConfig,
16305 bool AllowRecovery) {
16314 if (
BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
16315 assert(op->getType() ==
Context.BoundMemberTy);
16316 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
16329 QualType objectType = op->getLHS()->getType();
16330 if (op->getOpcode() == BO_PtrMemI)
16334 Qualifiers difference = objectQuals - funcQuals;
16338 std::string qualsString = difference.
getAsString();
16339 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
16342 << (qualsString.find(
' ') == std::string::npos ? 1 : 2);
16346 Context, MemExprE, Args, resultType, valueKind, RParenLoc,
16356 if (CheckOtherCall(call, proto))
16366 if (!AllowRecovery)
16368 std::vector<Expr *> SubExprs = {MemExprE};
16369 llvm::append_range(SubExprs, Args);
16377 UnbridgedCastsSet UnbridgedCasts;
16383 bool HadMultipleCandidates =
false;
16391 UnbridgedCasts.restore();
16409 TemplateArgs = &TemplateArgsBuffer;
16413 E = UnresExpr->
decls_end(); I != E; ++I) {
16415 QualType ExplicitObjectType = ObjectType;
16422 bool HasExplicitParameter =
false;
16423 if (
const auto *M = dyn_cast<FunctionDecl>(
Func);
16424 M && M->hasCXXExplicitFunctionObjectParameter())
16425 HasExplicitParameter =
true;
16426 else if (
const auto *M = dyn_cast<FunctionTemplateDecl>(
Func);
16428 M->getTemplatedDecl()->hasCXXExplicitFunctionObjectParameter())
16429 HasExplicitParameter =
true;
16431 if (HasExplicitParameter)
16439 }
else if ((
Method = dyn_cast<CXXMethodDecl>(
Func))) {
16446 ObjectClassification, Args, CandidateSet,
16450 I.getPair(), ActingDC, TemplateArgs,
16451 ExplicitObjectType, ObjectClassification,
16452 Args, CandidateSet,
16457 HadMultipleCandidates = (CandidateSet.
size() > 1);
16461 UnbridgedCasts.restore();
16464 bool Succeeded =
false;
16469 FoundDecl = Best->FoundDecl;
16489 PDiag(diag::err_ovl_no_viable_member_function_in_call)
16496 PDiag(diag::err_ovl_ambiguous_member_call)
16503 CandidateSet, Best->Function, Args,
true);
16514 MemExprE = Res.
get();
16518 if (
Method->isStatic()) {
16520 ExecConfig, IsExecConfig);
16530 assert(
Method &&
"Member call to something that isn't a method?");
16535 if (
Method->isExplicitObjectMemberFunction()) {
16543 HadMultipleCandidates, MemExpr->
getExprLoc());
16550 TheCall->setUsesMemberSyntax(
true);
16560 Proto->getNumParams());
16566 return BuildRecoveryExpr(ResultType);
16571 return BuildRecoveryExpr(ResultType);
16581 if (
auto *MemE = dyn_cast<MemberExpr>(NakedMemExpr)) {
16582 if (
const EnableIfAttr *
Attr =
16584 Diag(MemE->getMemberLoc(),
16585 diag::err_ovl_no_viable_member_function_in_call)
16588 diag::note_ovl_candidate_disabled_by_function_cond_attr)
16589 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
16595 TheCall->getDirectCallee()->isPureVirtual()) {
16601 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
16612 if (
auto *DD = dyn_cast<CXXDestructorDecl>(TheCall->getDirectCallee())) {
16616 CallCanBeVirtual,
true,
16621 TheCall->getDirectCallee());
16633 UnbridgedCastsSet UnbridgedCasts;
16637 assert(
Object.get()->getType()->isRecordType() &&
16638 "Requires object type argument");
16652 diag::err_incomplete_object_call,
Object.get()))
16655 auto *
Record =
Object.get()->getType()->castAsCXXRecordDecl();
16658 R.suppressAccessDiagnostics();
16661 Oper != OperEnd; ++Oper) {
16675 bool IgnoreSurrogateFunctions =
false;
16678 if (!Candidate.
Viable &&
16680 IgnoreSurrogateFunctions =
true;
16702 !IgnoreSurrogateFunctions && I != E; ++I) {
16724 Object.get(), Args, CandidateSet);
16729 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16742 CandidateSet.
empty()
16743 ? (
PDiag(diag::err_ovl_no_oper)
16744 <<
Object.get()->getType() << 1
16745 <<
Object.get()->getSourceRange())
16746 : (
PDiag(diag::err_ovl_no_viable_object_call)
16747 <<
Object.get()->getType() <<
Object.get()->getSourceRange());
16754 if (!R.isAmbiguous())
16757 PDiag(diag::err_ovl_ambiguous_object_call)
16758 <<
Object.get()->getType()
16759 <<
Object.get()->getSourceRange()),
16770 PDiag(diag::err_ovl_deleted_object_call)
16771 <<
Object.get()->getType() << (Msg !=
nullptr)
16772 << (Msg ? Msg->
getString() : StringRef())
16773 <<
Object.get()->getSourceRange()),
16779 if (Best == CandidateSet.
end())
16782 UnbridgedCasts.restore();
16784 if (Best->Function ==
nullptr) {
16789 Best->Conversions[0].UserDefined.ConversionFunction);
16795 assert(Conv == Best->FoundDecl.getDecl() &&
16796 "Found Decl & conversion-to-functionptr should be same, right?!");
16804 Conv, HadMultipleCandidates);
16805 if (
Call.isInvalid())
16809 Context,
Call.get()->getType(), CK_UserDefinedConversion,
Call.get(),
16823 if (
Method->isInvalidDecl())
16830 Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc);
16833 Obj, HadMultipleCandidates,
16840 MethodArgs.reserve(NumParams + 1);
16842 bool IsError =
false;
16846 if (
Method->isExplicitObjectMemberFunction()) {
16855 MethodArgs.push_back(
Object.get());
16859 *
this, MethodArgs,
Method, Args, LParenLoc);
16862 if (Proto->isVariadic()) {
16864 for (
unsigned i = NumParams, e = Args.size(); i < e; i++) {
16868 MethodArgs.push_back(Arg.
get());
16883 Context, OO_Call, NewFn.
get(), MethodArgs, ResultTy,
VK, RParenLoc,
16897 bool *NoArrowOperatorFound) {
16898 assert(
Base->getType()->isRecordType() &&
16899 "left-hand side must have class type");
16913 Context.DeclarationNames.getCXXOperatorName(OO_Arrow);
16917 diag::err_typecheck_incomplete_tag,
Base))
16922 R.suppressAccessDiagnostics();
16925 Oper != OperEnd; ++Oper) {
16931 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16942 if (CandidateSet.
empty()) {
16944 if (NoArrowOperatorFound) {
16947 *NoArrowOperatorFound =
true;
16950 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
16951 << BaseType <<
Base->getSourceRange();
16952 if (BaseType->isRecordType() && !BaseType->isPointerType()) {
16953 Diag(OpLoc, diag::note_typecheck_member_reference_suggestion)
16957 Diag(OpLoc, diag::err_ovl_no_viable_oper)
16958 <<
"operator->" <<
Base->getSourceRange();
16963 if (!R.isAmbiguous())
16966 <<
"->" <<
Base->getType()
16967 <<
Base->getSourceRange()),
16975 <<
"->" << (Msg !=
nullptr)
16976 << (Msg ? Msg->
getString() : StringRef())
16977 <<
Base->getSourceRange()),
16988 if (
Method->isExplicitObjectMemberFunction()) {
16995 Base, std::nullopt, Best->FoundDecl,
Method);
17003 Base, HadMultipleCandidates, OpLoc);
17037 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
17050 PDiag(diag::err_ovl_no_viable_function_in_call)
17051 << R.getLookupName()),
17058 << R.getLookupName()),
17065 nullptr, HadMultipleCandidates,
17068 if (Fn.isInvalid())
17074 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
17080 ConvArgs[ArgIdx] = InputInit.
get();
17107 Scope *S =
nullptr;
17110 if (!MemberLookup.
empty()) {
17137 if (CandidateSet->
empty() || CandidateSetError) {
17150 Loc,
nullptr, CandidateSet, &Best,
17163 if (
ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
17168 if (SubExpr.
get() == PE->getSubExpr())
17172 ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.
get());
17180 assert(
Context.hasSameType(ICE->getSubExpr()->getType(),
17182 "Implicit cast type cannot be determined from overload");
17183 assert(ICE->path_empty() &&
"fixing up hierarchy conversion?");
17184 if (SubExpr.
get() == ICE->getSubExpr())
17192 if (
auto *GSE = dyn_cast<GenericSelectionExpr>(E)) {
17193 if (!GSE->isResultDependent()) {
17198 if (SubExpr.
get() == GSE->getResultExpr())
17205 unsigned ResultIdx = GSE->getResultIndex();
17206 AssocExprs[ResultIdx] = SubExpr.
get();
17208 if (GSE->isExprPredicate())
17210 Context, GSE->getGenericLoc(), GSE->getControllingExpr(),
17211 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17212 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17215 Context, GSE->getGenericLoc(), GSE->getControllingType(),
17216 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17217 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17226 assert(UnOp->getOpcode() == UO_AddrOf &&
17227 "Can only take the address of an overloaded function");
17229 if (!
Method->isImplicitObjectMemberFunction()) {
17240 if (SubExpr.
get() == UnOp->getSubExpr())
17248 "fixed to something other than a decl ref");
17251 assert(Qualifier &&
17252 "fixed to a member ref with no nested name qualifier");
17258 Fn->getType(), Qualifier,
17261 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
17266 UnOp->getOperatorLoc(),
false,
17274 if (SubExpr.
get() == UnOp->getSubExpr())
17287 if (ULE->hasExplicitTemplateArgs()) {
17288 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
17289 TemplateArgs = &TemplateArgsBuffer;
17294 getLangOpts().CPlusPlus && !Fn->hasCXXExplicitFunctionObjectParameter()
17299 if (
unsigned BID = Fn->getBuiltinID()) {
17300 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
17307 Fn,
Type, ValueKind, ULE->getNameInfo(), ULE->getQualifierLoc(),
17308 Found.getDecl(), ULE->getTemplateKeywordLoc(), TemplateArgs);
17316 if (MemExpr->hasExplicitTemplateArgs()) {
17317 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
17318 TemplateArgs = &TemplateArgsBuffer;
17325 if (MemExpr->isImplicitAccess()) {
17328 Fn, Fn->getType(),
VK_LValue, MemExpr->getNameInfo(),
17329 MemExpr->getQualifierLoc(),
Found.getDecl(),
17330 MemExpr->getTemplateKeywordLoc(), TemplateArgs);
17335 if (MemExpr->getQualifier())
17336 Loc = MemExpr->getQualifierLoc().getBeginLoc();
17341 Base = MemExpr->getBase();
17347 type = Fn->getType();
17354 Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),
17355 MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn,
Found,
17356 true, MemExpr->getMemberNameInfo(),
17360 llvm_unreachable(
"Invalid reference to overloaded function");
17371 if (!PartialOverloading || !
Function)
17375 if (
const auto *Proto =
17376 dyn_cast<FunctionProtoType>(
Function->getFunctionType()))
17377 if (Proto->isTemplateVariadic())
17379 if (
auto *Pattern =
Function->getTemplateInstantiationPattern())
17380 if (
const auto *Proto =
17381 dyn_cast<FunctionProtoType>(Pattern->getFunctionType()))
17382 if (Proto->isTemplateVariadic())
17395 << IsMember << Name << (Msg !=
nullptr)
17396 << (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 bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static bool hasExplicitAttr(const VarDecl *D)
This file declares semantic analysis for CUDA constructs.
static void BuildBasePathArray(const CXXBasePath &Path, CXXCastPath &BasePathArray)
static bool isRecordType(QualType T)
static void TryUserDefinedConversion(Sema &S, QualType DestType, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt a user-defined conversion between two types (C++ [dcl.init]), which enumerates all conversion...
This file declares semantic analysis for Objective-C.
static ImplicitConversionSequence::CompareKind CompareStandardConversionSequences(Sema &S, SourceLocation Loc, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareStandardConversionSequences - Compare two standard conversion sequences to determine whether o...
static bool sameFunctionParameterTypeLists(Sema &S, FunctionDecl *Fn1, FunctionDecl *Fn2, bool IsFn1Reversed, bool IsFn2Reversed)
We're allowed to use constraints partial ordering only if the candidates have the same parameter type...
static bool isNullPointerConstantForConversion(Expr *Expr, bool InOverloadResolution, ASTContext &Context)
static bool shouldSkipNotingLambdaConversionDecl(const FunctionDecl *Fn)
static const FunctionType * getConversionOpReturnTyAsFunction(CXXConversionDecl *Conv)
static bool functionHasPassObjectSizeParams(const FunctionDecl *FD)
static Comparison compareEnableIfAttrs(const Sema &S, const FunctionDecl *Cand1, const FunctionDecl *Cand2)
Compares the enable_if attributes of two FunctionDecls, for the purposes of overload resolution.
static Qualifiers CollectVRQualifiers(ASTContext &Context, Expr *ArgExpr)
CollectVRQualifiers - This routine returns Volatile/Restrict qualifiers, if any, found in visible typ...
@ ToPromotedUnderlyingType
static void AddOverloadedCallCandidate(Sema &S, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading, bool KnownValid)
Add a single candidate to the overload set.
static void AddTemplateOverloadCandidateImmediately(Sema &S, OverloadCandidateSet &CandidateSet, FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, bool AllowExplicit, Sema::ADLCallKind IsADLCandidate, OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction)
static bool IsVectorOrMatrixElementConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, Expr *From)
static ExprResult FinishOverloadedCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, UnresolvedLookupExpr *ULE, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig, OverloadCandidateSet *CandidateSet, OverloadCandidateSet::iterator *Best, OverloadingResult OverloadResult, bool AllowTypoCorrection)
FinishOverloadedCallExpr - given an OverloadCandidateSet, builds and returns the completed call expre...
static bool isQualificationConversionStep(QualType FromType, QualType ToType, bool CStyle, bool IsTopLevel, bool &PreviousToQualsIncludeConst, bool &ObjCLifetimeConversion, const ASTContext &Ctx)
Perform a single iteration of the loop for checking if a qualification conversion is valid.
static ImplicitConversionSequence::CompareKind CompareQualificationConversions(Sema &S, const StandardConversionSequence &SCS1, const StandardConversionSequence &SCS2)
CompareQualificationConversions - Compares two standard conversion sequences to determine whether the...
static void dropPointerConversion(StandardConversionSequence &SCS)
dropPointerConversions - If the given standard conversion sequence involves any pointer conversions,...
static SourceLocation GetLocationForCandidate(const OverloadCandidate *Cand)
static void DiagnoseArityMismatch(Sema &S, NamedDecl *Found, Decl *D, unsigned NumFormalArgs, bool IsAddressOf=false)
General arity mismatch diagnosis over a candidate in a candidate set.
static const Expr * IgnoreNarrowingConversion(ASTContext &Ctx, const Expr *Converted)
Skip any implicit casts which could be either part of a narrowing conversion or after one in an impli...
static bool allowAmbiguity(ASTContext &Context, const FunctionDecl *F1, const FunctionDecl *F2)
static unsigned RankDeductionFailure(const DeductionFailureInfo &DFI)
static QualType BuildSimilarlyQualifiedPointerType(const Type *FromPtr, QualType ToPointee, QualType ToType, ASTContext &Context, bool StripObjCLifetime=false)
BuildSimilarlyQualifiedPointerType - In a pointer conversion from the pointer type FromPtr to a point...
static void forAllQualifierCombinations(QualifiersAndAtomic Quals, llvm::function_ref< void(QualifiersAndAtomic)> Callback)
static bool FindConversionForRefInit(Sema &S, ImplicitConversionSequence &ICS, QualType DeclType, SourceLocation DeclLoc, Expr *Init, QualType T2, bool AllowRvalues, bool AllowExplicit)
Look for a user-defined conversion to a value reference-compatible with DeclType.
static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static Expr * GetExplicitObjectExpr(Sema &S, Expr *Obj, const FunctionDecl *Fun)
static bool hasDeprecatedStringLiteralToCharPtrConversion(const ImplicitConversionSequence &ICS)
static void AddBuiltinAssignmentOperatorCandidates(Sema &S, QualType T, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
Helper function for AddBuiltinOperatorCandidates() that adds the volatile- and non-volatile-qualified...
static bool CheckConvertedConstantConversions(Sema &S, StandardConversionSequence &SCS)
Check that the specified conversion is permitted in a converted constant expression,...
static 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 void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, DeductionFailureInfo &DeductionFailure, unsigned NumArgs, bool TakingCandidateAddress)
Diagnose a failed template-argument deduction.
static bool IsTransparentUnionStandardConversion(Sema &S, Expr *From, QualType &ToType, bool InOverloadResolution, StandardConversionSequence &SCS, bool CStyle)
static const FunctionProtoType * tryGetFunctionProtoType(QualType FromType)
Attempts to get the FunctionProtoType from a Type.
static bool PrepareArgumentsForCallToObjectOfClassType(Sema &S, SmallVectorImpl< Expr * > &MethodArgs, CXXMethodDecl *Method, MultiExprArg Args, SourceLocation LParenLoc)
static TemplateDeductionResult DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch, bool PartialOrdering, PackFold PackFold, bool *HasDeducedAnyParam)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
a trap message and trap category.
A class for storing results from argument-dependent lookup.
void erase(NamedDecl *D)
Removes any data associated with a given decl.
llvm::mapped_iterator< decltype(Decls)::iterator, select_second > iterator
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
unsigned getIntWidth(QualType T) const
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
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.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
const ParmVarDecl * getParamDecl(unsigned i) const
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
bool hasCXXExplicitFunctionObjectParameter() const
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
bool isVariadic() const
Whether this function is variadic.
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
unsigned getNumNonObjectParams() const
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isTargetMultiVersionDefault() const
True if this function is the default version of a multiversioned dispatch function as a part of the t...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
unsigned getNumParams() const
Qualifiers getMethodQuals() const
QualType getParamType(unsigned i) const
bool isVariadic() const
Whether this function prototype is variadic.
ArrayRef< QualType > param_types() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
A class which abstracts out some details necessary for making a call.
ExtInfo withNoReturn(bool noReturn) const
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
CallingConv getCallConv() const
QualType getReturnType() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
static GenericSelectionExpr * Create(const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef< TypeSourceInfo * > AssocTypes, ArrayRef< Expr * > AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex)
Create a non-result-dependent generic selection expression accepting an expression predicate.
One of these records is kept for each identifier that is lexed.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
void dump() const
dump - Print this implicit conversion sequence to standard error.
bool isUserDefined() const
@ StaticObjectArgumentConversion
StandardConversionSequence Standard
When ConversionKind == StandardConversion, provides the details of the standard conversion sequence.
void setBad(BadConversionSequence::FailureKind Failure, Expr *FromExpr, QualType ToType)
Sets this sequence as a bad conversion for an explicit argument.
UserDefinedConversionSequence UserDefined
When ConversionKind == UserDefinedConversion, provides the details of the user-defined conversion seq...
static ImplicitConversionSequence getNullptrToBool(QualType SourceType, QualType DestType, bool NeedLValToRVal)
Form an "implicit" conversion sequence from nullptr_t to bool, for a direct-initialization of a bool ...
AmbiguousConversionSequence Ambiguous
When ConversionKind == AmbiguousConversion, provides the details of the ambiguous conversion.
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.
For a defaulted function, the kind of defaulted function that it is.
bool isSpecialMember() const
bool isComparison() const
CXXSpecialMemberKind asSpecialMember() const
RAII class to control scope of DeferDiags.
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.
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
ExprResult BuildLiteralOperatorCall(LookupResult &R, DeclarationNameInfo &SuffixInfo, ArrayRef< Expr * > Args, SourceLocation LitEndLoc, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr)
BuildLiteralOperatorCall - Build a UserDefinedLiteral by creating a call to a literal operator descri...
bool IsStringInit(Expr *Init, const ArrayType *AT)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
ExprResult CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, SourceLocation RLoc, Expr *Base, MultiExprArg Args)
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
void AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
Adds a conversion function template specialization candidate to the overload set, using template argu...
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
void AddBuiltinCandidate(QualType *ParamTys, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool IsAssignmentOperator=false, unsigned NumContextualBoolArguments=0)
AddBuiltinCandidate - Add a candidate for a built-in operator.
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void AddArgumentDependentLookupCandidates(DeclarationName Name, SourceLocation Loc, ArrayRef< Expr * > Args, TemplateArgumentListInfo *ExplicitTemplateArgs, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add function candidates found via argument-dependent lookup to the set of overloading candidates.
ExprResult EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue)
EvaluateConvertedConstantExpression - Evaluate an Expression That is a converted constant expression ...
FPOptionsOverride CurFPFeatureOverrides()
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
ExprResult DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, FunctionDecl *FDecl)
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
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.
unsigned QualificationIncludesObjCLifetime
Whether the qualification conversion involves a change in the Objective-C lifetime (for automatic ref...
void setToType(unsigned Idx, QualType T)
bool isPointerConversionToBool() const
isPointerConversionToBool - Determines whether this conversion is a conversion of a pointer or pointe...
void * ToTypePtrs[3]
ToType - The types that this conversion is converting to in each step.
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
unsigned IsLvalueReference
Whether this is an lvalue reference binding (otherwise, it's an rvalue reference binding).
ImplicitConversionKind Dimension
Dimension - Between the second and third conversion a vector or matrix dimension conversion may occur...
unsigned BindsToFunctionLvalue
Whether we're binding to a function lvalue.
unsigned DirectBinding
DirectBinding - True when this is a reference binding that is a direct binding (C++ [dcl....
ImplicitConversionRank getRank() const
getRank - Retrieve the rank of this standard conversion sequence (C++ 13.3.3.1.1p3).
bool isPointerConversionToVoidPointer(ASTContext &Context) const
isPointerConversionToVoidPointer - Determines whether this conversion is a conversion of a pointer to...
void setAllToTypes(QualType T)
unsigned FromBracedInitList
Whether the source expression was originally a single element braced-init-list.
QualType getToType(unsigned Idx) const
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
StringRef getString() const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
virtual bool hasIbm128Type() const
Determine whether the __ibm128 type is supported on this target.
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
A convenient class for passing around template argument information.
A template argument list.
Represents a template argument.
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
QualType getAsType() const
Retrieve the type for a type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
@ Template
The template argument is a template name that was provided for a template template parameter.
@ Pack
The template argument is actually a parameter pack.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
@ Template
A single template declaration.
bool hasAssociatedConstraints() const
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
SmallVector< TemplateSpecCandidate, 16 >::iterator iterator
void NoteCandidates(Sema &S, SourceLocation Loc)
NoteCandidates - When no template specialization match is found, prints diagnostic messages containin...
void clear()
Clear out all of the candidates.
SourceLocation getLocation() const
TemplateSpecCandidate & addCandidate()
Add a new candidate with NumConversions conversion sequence slots to the overload set.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
const Type * getTypeForDecl() const
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isBlockPointerType() const
bool isBooleanType() const
bool isObjCBuiltinType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
bool isIncompleteArrayType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isFloat16Type() const
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
bool isRValueReferenceType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
bool isConvertibleToFixedPointType() const
Return true if this can be converted to (or from) a fixed point type.
CXXRecordDecl * castAsCXXRecordDecl() const
bool isArithmeticType() const
bool isPointerType() const
bool isArrayParameterType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isExtVectorBoolType() const
bool isObjCObjectOrInterfaceType() const
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isLValueReferenceType() const
bool isBitIntType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const BuiltinType * getAsPlaceholderType() const
bool isMemberPointerType() const
bool 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...
The JSON file list parser is used to communicate input to InstallAPI.
ImplicitConversionRank GetDimensionConversionRank(ImplicitConversionRank Base, ImplicitConversionKind Dimension)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
bool isBetterOverloadCandidate(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2, SourceLocation Loc, OverloadCandidateSet::CandidateSetKind Kind, bool PartialOverloading=false)
isBetterOverloadCandidate - Determines whether the first overload candidate is a better candidate tha...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ ovl_fail_final_conversion_not_exact
This conversion function template specialization candidate is not viable because the final conversion...
@ ovl_fail_enable_if
This candidate function was not viable because an enable_if attribute disabled it.
@ ovl_fail_illegal_constructor
This conversion candidate was not considered because it is an illegal instantiation of a constructor ...
@ ovl_fail_bad_final_conversion
This conversion candidate is not viable because its result type is not implicitly convertible to the ...
@ ovl_fail_module_mismatched
This candidate was not viable because it has internal linkage and is from a different module unit tha...
@ ovl_fail_too_few_arguments
@ ovl_fail_addr_not_available
This candidate was not viable because its address could not be taken.
@ ovl_fail_too_many_arguments
@ ovl_non_default_multiversion_function
This candidate was not viable because it is a non-default multiversioned function.
@ ovl_fail_constraints_not_satisfied
This candidate was not viable because its associated constraints were not satisfied.
@ ovl_fail_bad_conversion
@ ovl_fail_bad_target
(CUDA) This candidate was not viable because the callee was not accessible from the caller's target (...
@ ovl_fail_inhctor_slice
This inherited constructor is not viable because it would slice the argument.
@ ovl_fail_object_addrspace_mismatch
This constructor/conversion candidate fail due to an address space mismatch between the object being ...
@ ovl_fail_explicit
This candidate constructor or conversion function is explicit but the context doesn't permit explicit...
@ ovl_fail_trivial_conversion
This conversion candidate was not considered because it duplicates the work of a trivial or derived-t...
@ Comparison
A comparison.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
ImplicitConversionRank
ImplicitConversionRank - The rank of an implicit conversion kind.
@ ICR_Conversion
Conversion.
@ ICR_Writeback_Conversion
ObjC ARC writeback conversion.
@ ICR_HLSL_Dimension_Reduction
HLSL Matching Dimension Reduction.
@ ICR_HLSL_Dimension_Reduction_Conversion
HLSL Dimension reduction with conversion.
@ ICR_HLSL_Scalar_Widening
HLSL Scalar Widening.
@ ICR_C_Conversion
Conversion only allowed in the C standard (e.g. void* to char*).
@ ICR_OCL_Scalar_Widening
OpenCL Scalar Widening.
@ ICR_Complex_Real_Conversion
Complex <-> Real conversion.
@ ICR_HLSL_Scalar_Widening_Conversion
HLSL Scalar Widening with conversion.
@ ICR_HLSL_Dimension_Reduction_Promotion
HLSL Dimension reduction with promotion.
@ ICR_Promotion
Promotion.
@ ICR_Exact_Match
Exact Match.
@ ICR_C_Conversion_Extension
Conversion not allowed by the C standard, but that we accept as an extension anyway.
@ ICR_HLSL_Scalar_Widening_Promotion
HLSL Scalar Widening with promotion.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_ViableCandidates
Requests that only viable candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
Expr::ConstantExprKind ConstantExprKind
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OverloadsShown
Specifies which overload candidates to display when overload resolution fails.
@ Ovl_Best
Show just the "best" overload candidates.
llvm::MutableArrayRef< ImplicitConversionSequence > ConversionSequenceList
A list of implicit conversion sequences for the arguments of an OverloadCandidate.
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
OverloadCandidateRewriteKind
The kinds of rewrite we perform on overload candidates.
@ CRK_Reversed
Candidate is a rewritten candidate with a reversed order of parameters.
@ CRK_None
Candidate is not a rewritten candidate.
@ CRK_DifferentOperator
Candidate is a rewritten candidate with a different operator name.
MutableArrayRef< Expr * > MultiExprArg
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Result
The result type of a method or function.
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.
ActionResult< CXXBaseSpecifier * > BaseResult
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ IncompatiblePointer
IncompatiblePointer - The assignment is between two pointers types that are not compatible,...
@ CompatiblePointerDiscardsQualifiers
CompatiblePointerDiscardsQualifiers - The assignment discards c/v/r qualifiers, which we accept as an...
@ Compatible
Compatible - the types are compatible according to the standard.
@ IncompatiblePointerSign
IncompatiblePointerSign - The assignment is between two pointers types which point to integers which ...
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
@ FunctionTemplate
The name was classified as a function template name.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
CXXSpecialMemberKind
Kinds of C++ special members.
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool shouldEnforceArgLimit(bool PartialOverloading, FunctionDecl *Function)
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
NarrowingKind
NarrowingKind - The kind of narrowing conversion being performed by a standard conversion sequence ac...
@ NK_Not_Narrowing
Not a narrowing conversion.
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
@ TPOC_Conversion
Partial ordering of function templates for a call to a conversion function.
@ TPOC_Call
Partial ordering of function templates for a function call.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateDeductionResult
Describes the result of template argument deduction.
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
@ CUDATargetMismatch
CUDA Target attributes do not match.
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ Invalid
The declaration was invalid; do nothing.
@ Success
Template argument deduction was successful.
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
@ AlreadyDiagnosed
Some error which was already diagnosed.
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
U cast(CodeGen::Address addr)
ConstructorInfo getConstructorInfo(NamedDecl *ND)
@ None
The alignment was not explicit in code.
CCEKind
Contexts in which a converted constant expression is required.
@ TemplateArg
Value of a non-type template parameter.
@ Noexcept
Condition in a noexcept(bool) specifier.
@ ArrayBound
Array bound in array declarator or new-expression.
@ TempArgStrict
As above, but applies strict template checking rules.
@ ExplicitBool
Condition in an explicit(bool) specifier.
ImplicitConversionRank GetConversionRank(ImplicitConversionKind Kind)
GetConversionRank - Retrieve the implicit conversion rank corresponding to the given implicit convers...
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
@ EST_None
no exception specification
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
__DEVICE__ _Tp abs(const std::complex< _Tp > &__c)
Represents an ambiguous user-defined conversion sequence.
ConversionSet::const_iterator const_iterator
ConversionSet & conversions()
SmallVector< std::pair< NamedDecl *, FunctionDecl * >, 4 > ConversionSet
void setFromType(QualType T)
void setToType(QualType T)
void addConversion(NamedDecl *Found, FunctionDecl *D)
void copyFrom(const AmbiguousConversionSequence &)
const Expr * ConstraintExpr
UnsignedOrNone ArgPackSubstIndex
QualType getToType() const
QualType getFromType() const
OverloadFixItKind Kind
The type of fix applied.
unsigned NumConversionsFixed
The number of Conversions fixed.
void setConversionChecker(TypeComparisonFuncTy Foo)
Resets the default conversion checker method.
std::vector< FixItHint > Hints
The list of Hints generated so far.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
const DeclarationNameLoc & getInfo() const
SourceLocation getCXXLiteralOperatorNameLoc() const
getCXXLiteralOperatorNameLoc - Returns the location of the literal operator name (not the operator ke...
A structure used to record information about a failed template argument deduction,...
void * Data
Opaque pointer containing additional data about this deduction failure.
const TemplateArgument * getSecondArg()
Return the second template argument this deduction failure refers to, if any.
unsigned Result
A Sema::TemplateDeductionResult.
PartialDiagnosticAt * getSFINAEDiagnostic()
Retrieve the diagnostic which caused this deduction failure, if any.
unsigned HasDiagnostic
Indicates whether a diagnostic is stored in Diagnostic.
TemplateDeductionResult getResult() const
void Destroy()
Free any memory associated with this deduction failure.
char Diagnostic[sizeof(PartialDiagnosticAt)]
A diagnostic indicating why deduction failed.
UnsignedOrNone getCallArgIndex()
Return the index of the call argument that this deduction failure refers to, if any.
TemplateParameter getTemplateParameter()
Retrieve the template parameter this deduction failure refers to, if any.
TemplateArgumentList * getTemplateArgumentList()
Retrieve the template argument list associated with this deduction failure, if any.
const TemplateArgument * getFirstArg()
Return the first template argument this deduction failure refers to, if any.
DeferredTemplateOverloadCandidate * Next
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
Information about operator rewrites to consider when adding operator functions to a candidate set.
bool allowsReversed(OverloadedOperatorKind Op) const
Determine whether reversing parameter order is allowed for operator Op.
bool shouldAddReversed(Sema &S, ArrayRef< Expr * > OriginalArgs, FunctionDecl *FD) const
Determine whether we should add a rewritten candidate for FD with reversed parameter order.
bool isAcceptableCandidate(const FunctionDecl *FD) const
bool isReversible() const
Determines whether this operator could be implemented by a function with reversed parameter order.
SourceLocation OpLoc
The source location of the operator.
bool AllowRewrittenCandidates
Whether we should include rewritten candidates in the overload set.
OverloadCandidateRewriteKind getRewriteKind(const FunctionDecl *FD, OverloadCandidateParamOrder PO)
Determine the kind of rewrite that should be performed for this candidate.
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
unsigned StrictPackMatch
Have we matched any packs on the parameter side, versus any non-packs on the argument side,...
unsigned IgnoreObjectArgument
IgnoreObjectArgument - True to indicate that the first argument's conversion, which for this function...
bool TryToFixBadConversion(unsigned Idx, Sema &S)
bool NotValidBecauseConstraintExprHasError() const
unsigned IsADLCandidate
True if the candidate was found using ADL.
unsigned IsSurrogate
IsSurrogate - True to indicate that this candidate is a surrogate for a conversion to a function poin...
QualType BuiltinParamTypes[3]
BuiltinParamTypes - Provides the parameter types of a built-in overload candidate.
DeclAccessPair FoundDecl
FoundDecl - The original declaration that was looked up / invented / otherwise found,...
FunctionDecl * Function
Function - The actual function that this candidate represents.
unsigned RewriteKind
Whether this is a rewritten candidate, and if so, of what kind?
ConversionFixItGenerator Fix
The FixIt hints which can be used to fix the Bad candidate.
unsigned Best
Whether this candidate is the best viable function, or tied for being the best viable function.
StandardConversionSequence FinalConversion
FinalConversion - For a conversion function (where Function is a CXXConversionDecl),...
unsigned getNumParams() const
unsigned HasFinalConversion
Whether FinalConversion has been set.
unsigned TookAddressOfOverload
unsigned FailureKind
FailureKind - The reason why this candidate is not viable.
unsigned ExplicitCallArguments
The number of call arguments that were explicitly provided, to be used while performing partial order...
ConversionSequenceList Conversions
The conversion sequences used to convert the function arguments to the function parameters.
DeductionFailureInfo DeductionFailure
unsigned Viable
Viable - True to indicate that this overload candidate is viable.
CXXConversionDecl * Surrogate
Surrogate - The conversion function for which this candidate is a surrogate, but only if IsSurrogate ...
OverloadCandidateRewriteKind getRewriteKind() const
Get RewriteKind value in OverloadCandidateRewriteKind type (This function is to workaround the spurio...
bool HasFormOfMemberPointer
OverloadExpr * Expression
bool SuppressUserConversions
Do not consider any user-defined conversions when constructing the initializing sequence.
bool OnlyInitializeNonUserDefinedConversions
Before constructing the initializing sequence, we check whether the parameter type and argument type ...
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Decl * Entity
The entity that is being synthesized.
Abstract class used to diagnose incomplete types.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
TemplateSpecCandidate - This is a generalization of OverloadCandidate which keeps track of template a...
void NoteDeductionFailure(Sema &S, bool ForTakingAddress)
Diagnose a template argument deduction failure.
DeductionFailureInfo DeductionFailure
Template argument deduction info.
Decl * Specialization
Specialization - The actual specialization that this candidate represents.
DeclAccessPair FoundDecl
The declaration that was looked up, together with its access.
void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)
UserDefinedConversionSequence - Represents a user-defined conversion sequence (C++ 13....
StandardConversionSequence Before
Represents the standard conversion that occurs before the actual user-defined conversion.
FunctionDecl * ConversionFunction
ConversionFunction - The function that will perform the user-defined conversion.
bool HadMultipleCandidates
HadMultipleCandidates - When this is true, it means that the conversion function was resolved from an...
StandardConversionSequence After
After - Represents the standard conversion that occurs after the actual user-defined conversion.
bool EllipsisConversion
EllipsisConversion - When this is true, it means user-defined conversion sequence starts with a ....
DeclAccessPair FoundConversionFunction
The declaration that we found via name lookup, which might be the same as ConversionFunction or it mi...
void dump() const
dump - Print this user-defined conversion sequence to standard error.
Describes an entity that is being assigned.