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)){
1863 bool CanConvert =
false;
1869 FromResType->getWrappedType()) &&
1871 FromResType->getContainedType()) &&
1872 ToResType->getAttrs() == FromResType->getAttrs())
1874 }
else if (ToTy->isHLSLResourceType()) {
1888 AllowExplicit, InOverloadResolution, CStyle,
1889 AllowObjCWritebackConversion,
1890 AllowObjCConversionOnExplicit);
1893ImplicitConversionSequence
1895 bool SuppressUserConversions,
1897 bool InOverloadResolution,
1899 bool AllowObjCWritebackConversion) {
1900 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1901 AllowExplicit, InOverloadResolution, CStyle,
1902 AllowObjCWritebackConversion,
1908 bool AllowExplicit) {
1913 bool AllowObjCWritebackConversion =
1920 *
this, From, ToType,
1922 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1924 false, AllowObjCWritebackConversion,
1938 if (
Context.hasSameUnqualifiedType(FromType, ToType))
1951 if (TyClass != CanFrom->getTypeClass())
return false;
1952 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1953 if (TyClass == Type::Pointer) {
1956 }
else if (TyClass == Type::BlockPointer) {
1959 }
else if (TyClass == Type::MemberPointer) {
1966 CanTo = ToMPT->getPointeeType();
1972 TyClass = CanTo->getTypeClass();
1973 if (TyClass != CanFrom->getTypeClass())
return false;
1974 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1984 bool Changed =
false;
1992 const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn);
1993 const auto *ToFPT = dyn_cast<FunctionProtoType>(ToFn);
1995 if (FromFPT && ToFPT) {
1996 if (FromFPT->hasCFIUncheckedCallee() != ToFPT->hasCFIUncheckedCallee()) {
1998 FromFPT->getReturnType(), FromFPT->getParamTypes(),
1999 FromFPT->getExtProtoInfo().withCFIUncheckedCallee(
2000 ToFPT->hasCFIUncheckedCallee()));
2008 if (FromFPT && ToFPT) {
2009 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
2021 bool CanUseToFPT, CanUseFromFPT;
2022 if (
Context.mergeExtParameterInfo(ToFPT, FromFPT, CanUseToFPT,
2023 CanUseFromFPT, NewParamInfos) &&
2024 CanUseToFPT && !CanUseFromFPT) {
2027 NewParamInfos.empty() ?
nullptr : NewParamInfos.data();
2029 FromFPT->getParamTypes(), ExtInfo);
2034 if (
Context.hasAnyFunctionEffects()) {
2039 const auto FromFX = FromFPT->getFunctionEffects();
2040 const auto ToFX = ToFPT->getFunctionEffects();
2041 if (FromFX != ToFX) {
2045 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
2055 assert(
QualType(FromFn, 0).isCanonical());
2056 if (
QualType(FromFn, 0) != CanTo)
return false;
2083 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
2084 &ToSem == &llvm::APFloat::IEEEquad()) ||
2085 (&FromSem == &llvm::APFloat::IEEEquad() &&
2086 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2142 bool InOverloadResolution,
bool CStyle) {
2152 if (ToMatrixType && FromMatrixType) {
2154 unsigned ToCols = ToMatrixType->getNumColumns();
2155 if (FromCols < ToCols)
2158 unsigned FromRows = FromMatrixType->
getNumRows();
2159 unsigned ToRows = ToMatrixType->getNumRows();
2160 if (FromRows < ToRows)
2163 if (FromRows == ToRows && FromCols == ToCols)
2169 QualType ToElTy = ToMatrixType->getElementType();
2178 QualType ToElTy = ToMatrixType->getElementType();
2181 if (FromMatrixType && !ToMatrixType) {
2200 bool InOverloadResolution,
bool CStyle) {
2217 if (ToExtType && FromExtType) {
2219 unsigned ToElts = ToExtType->getNumElements();
2220 if (FromElts < ToElts)
2222 if (FromElts == ToElts)
2228 QualType ToElTy = ToExtType->getElementType();
2233 if (FromExtType && !ToExtType) {
2247 if (ToExtType->getNumElements() != FromExtType->getNumElements())
2252 FromExtType->getElementType()->isIntegerType()) {
2264 QualType ToElTy = ToExtType->getElementType();
2299 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
2304 !InOverloadResolution && !CStyle) {
2306 << FromType << ToType;
2317 bool InOverloadResolution,
2318 StandardConversionSequence &SCS,
2323 bool InOverloadResolution,
2324 StandardConversionSequence &SCS,
2336 bool InOverloadResolution,
2339 bool AllowObjCWritebackConversion) {
2365 FromType = Fn->getType();
2385 if (Method && !Method->isStatic() &&
2386 !Method->isExplicitObjectMemberFunction()) {
2388 "Non-unary operator on non-static member address");
2391 "Non-address-of operator on non-static member address");
2393 FromType, std::nullopt, Method->getParent());
2397 "Non-address-of operator for overloaded function expression");
2443 FromType =
Atomic->getValueType();
2478 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2498 bool IncompatibleObjC =
false;
2560 }
else if (AllowObjCWritebackConversion &&
2564 FromType, IncompatibleObjC)) {
2570 InOverloadResolution, FromType)) {
2574 From, InOverloadResolution, CStyle)) {
2579 From, InOverloadResolution, CStyle)) {
2589 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2598 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2628 bool ObjCLifetimeConversion;
2634 ObjCLifetimeConversion)) {
2653 CanonFrom = CanonTo;
2658 if (CanonFrom == CanonTo)
2663 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2675 case AssignConvertType::
2676 CompatibleVoidPtrToNonVoidPtr:
2709 bool InOverloadResolution,
2717 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2718 if (!UD->
hasAttr<TransparentUnionAttr>())
2721 for (
const auto *it : UD->
fields()) {
2724 ToType = it->getType();
2750 return To->
getKind() == BuiltinType::Int;
2753 return To->
getKind() == BuiltinType::UInt;
2777 if (FromED->isScoped())
2784 if (FromED->isFixed()) {
2785 QualType Underlying = FromED->getIntegerType();
2786 return Context.hasSameUnqualifiedType(Underlying, ToType) ||
2793 return Context.hasSameUnqualifiedType(ToType, FromED->getPromotionType());
2818 uint64_t FromSize =
Context.getTypeSize(FromType);
2827 for (
int Idx = 0; Idx < 6; ++Idx) {
2828 uint64_t ToSize =
Context.getTypeSize(PromoteTypes[Idx]);
2829 if (FromSize < ToSize ||
2830 (FromSize == ToSize &&
2831 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2835 return Context.hasSameUnqualifiedType(ToType, PromoteTypes[Idx]);
2856 std::optional<llvm::APSInt> BitWidth;
2859 MemberDecl->getBitWidth()->getIntegerConstantExpr(
Context))) {
2860 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2861 ToSize =
Context.getTypeSize(ToType);
2864 if (*BitWidth < ToSize ||
2866 return To->
getKind() == BuiltinType::Int;
2872 return To->
getKind() == BuiltinType::UInt;
2890 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2900 if (FromBuiltin->getKind() == BuiltinType::Float &&
2901 ToBuiltin->getKind() == BuiltinType::Double)
2908 (FromBuiltin->getKind() == BuiltinType::Float ||
2909 FromBuiltin->getKind() == BuiltinType::Double) &&
2910 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2911 ToBuiltin->getKind() == BuiltinType::Float128 ||
2912 ToBuiltin->getKind() == BuiltinType::Ibm128))
2917 if (
getLangOpts().
HLSL && FromBuiltin->getKind() == BuiltinType::Half &&
2918 (ToBuiltin->getKind() == BuiltinType::Float ||
2919 ToBuiltin->getKind() == BuiltinType::Double))
2924 FromBuiltin->getKind() == BuiltinType::Half &&
2925 ToBuiltin->getKind() == BuiltinType::Float)
2954 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2966 if (
const EnumType *ToEnumType = ToType->
getAs<EnumType>()) {
2978 return Context.getTypeSize(FromType) >
Context.getTypeSize(ToType);
2993 bool StripObjCLifetime =
false) {
2996 "Invalid similarly-qualified pointer type");
3007 if (StripObjCLifetime)
3019 return Context.getObjCObjectPointerType(ToPointee);
3020 return Context.getPointerType(ToPointee);
3028 return Context.getObjCObjectPointerType(QualifiedCanonToPointee);
3029 return Context.getPointerType(QualifiedCanonToPointee);
3033 bool InOverloadResolution,
3039 return !InOverloadResolution;
3047 bool InOverloadResolution,
3049 bool &IncompatibleObjC) {
3050 IncompatibleObjC =
false;
3058 ConvertedType = ToType;
3065 ConvertedType = ToType;
3072 ConvertedType = ToType;
3080 ConvertedType = ToType;
3090 ConvertedType = ToType;
3112 if (
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType))
3139 Context.typesAreCompatible(FromPointeeType, ToPointeeType)) {
3161 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType) &&
3170 Context.areCompatibleVectorTypes(FromPointeeType, ToPointeeType)) {
3189 return Context.getQualifiedType(T, Qs);
3191 return Context.getQualifiedType(T.getUnqualifiedType(), Qs);
3196 bool &IncompatibleObjC) {
3209 if (ToObjCPtr && FromObjCPtr) {
3217 if (
Context.canAssignObjCInterfaces(ToObjCPtr, FromObjCPtr)) {
3231 if (
Context.canAssignObjCInterfaces(FromObjCPtr, ToObjCPtr)) {
3235 IncompatibleObjC =
true;
3251 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
3280 IncompatibleObjC)) {
3282 IncompatibleObjC =
true;
3283 ConvertedType =
Context.getPointerType(ConvertedType);
3292 IncompatibleObjC)) {
3294 ConvertedType =
Context.getPointerType(ConvertedType);
3307 if (FromFunctionType && ToFunctionType) {
3310 if (
Context.getCanonicalType(FromPointeeType)
3311 ==
Context.getCanonicalType(ToPointeeType))
3316 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3317 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
3318 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
3321 bool HasObjCConversion =
false;
3323 Context.getCanonicalType(ToFunctionType->getReturnType())) {
3326 ToFunctionType->getReturnType(),
3327 ConvertedType, IncompatibleObjC)) {
3329 HasObjCConversion =
true;
3336 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3337 ArgIdx != NumArgs; ++ArgIdx) {
3339 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3340 if (
Context.getCanonicalType(FromArgType)
3341 ==
Context.getCanonicalType(ToArgType)) {
3344 ConvertedType, IncompatibleObjC)) {
3346 HasObjCConversion =
true;
3353 if (HasObjCConversion) {
3357 IncompatibleObjC =
true;
3389 if (!FromFunctionType || !ToFunctionType)
3392 if (
Context.hasSameType(FromPointeeType, ToPointeeType))
3397 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3398 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3403 if (FromEInfo != ToEInfo)
3406 bool IncompatibleObjC =
false;
3408 ToFunctionType->getReturnType())) {
3412 QualType LHS = ToFunctionType->getReturnType();
3417 if (
Context.hasSameType(RHS,LHS)) {
3420 ConvertedType, IncompatibleObjC)) {
3421 if (IncompatibleObjC)
3430 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3431 ArgIdx != NumArgs; ++ArgIdx) {
3432 IncompatibleObjC =
false;
3434 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3435 if (
Context.hasSameType(FromArgType, ToArgType)) {
3438 ConvertedType, IncompatibleObjC)) {
3439 if (IncompatibleObjC)
3448 bool CanUseToFPT, CanUseFromFPT;
3449 if (!
Context.mergeExtParameterInfo(ToFunctionType, FromFunctionType,
3450 CanUseToFPT, CanUseFromFPT,
3454 ConvertedType = ToType;
3493 ToMember->getMostRecentCXXRecordDecl())) {
3495 if (ToMember->isSugared())
3497 ToMember->getMostRecentCXXRecordDecl());
3499 PDiag << ToMember->getQualifier();
3500 if (FromMember->isSugared())
3502 FromMember->getMostRecentCXXRecordDecl());
3504 PDiag << FromMember->getQualifier();
3522 !FromType->
getAs<TemplateSpecializationType>()) {
3528 if (
Context.hasSameType(FromType, ToType)) {
3537 if (!FromFunction || !ToFunction) {
3542 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3552 << ToFunction->getParamType(ArgPos)
3559 ToFunction->getReturnType())) {
3565 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3588 assert(llvm::size(Old) == llvm::size(
New) &&
3589 "Can't compare parameters of functions with different number of "
3592 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3594 size_t J =
Reversed ? (llvm::size(
New) - Idx - 1) : Idx;
3599 Context.removePtrSizeAddrSpace(
Type.getUnqualifiedType());
3601 Context.removePtrSizeAddrSpace((
New.begin() + J)->getUnqualifiedType());
3603 if (!
Context.hasSameType(OldType, NewType)) {
3628 unsigned OldIgnore =
3630 unsigned NewIgnore =
3637 NewPT->param_types().slice(NewIgnore),
3644 bool IgnoreBaseAccess,
3647 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3656 PDiag(diag::warn_impcast_bool_to_null_pointer)
3667 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3668 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {
3671 unsigned InaccessibleID = 0;
3672 unsigned AmbiguousID = 0;
3674 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3675 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3678 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3680 &BasePath, IgnoreBaseAccess))
3684 Kind = CK_DerivedToBase;
3687 if (
Diagnose && !IsCStyleOrFunctionalCast &&
3688 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3690 "this should only be possible with MSVCCompat!");
3702 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3705 Kind = CK_BlockPointerToObjCPointerCast;
3707 Kind = CK_CPointerToObjCPointerCast;
3711 Kind = CK_AnyPointerToBlockPointerCast;
3717 Kind = CK_NullToPointer;
3724 bool InOverloadResolution,
3734 ConvertedType = ToType;
3750 ConvertedType =
Context.getMemberPointerType(
3764 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
3772 Kind = CK_NullToMemberPointer;
3790 PD <<
Context.getCanonicalTagType(Cls);
3800 std::swap(
Base, Derived);
3809 PD <<
int(Direction);
3817 DiagFromTo(PD) <<
QualType(VBase, 0) << OpRange;
3825 ? CK_DerivedToBaseMemberPointer
3826 : CK_BaseToDerivedMemberPointer;
3828 if (!IgnoreBaseAccess)
3832 ? diag::err_upcast_to_inaccessible_base
3833 : diag::err_downcast_from_inaccessible_base,
3835 NestedNameSpecifier BaseQual = FromPtrType->getQualifier(),
3836 DerivedQual = ToPtrType->getQualifier();
3837 if (Direction == MemberPointerConversionDirection::Upcast)
3838 std::swap(BaseQual, DerivedQual);
3839 DiagCls(PD, DerivedQual, Derived);
3840 DiagCls(PD, BaseQual, Base);
3875 bool CStyle,
bool IsTopLevel,
3876 bool &PreviousToQualsIncludeConst,
3877 bool &ObjCLifetimeConversion,
3890 ObjCLifetimeConversion =
true;
3930 !PreviousToQualsIncludeConst)
3948 PreviousToQualsIncludeConst =
3949 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3955 bool CStyle,
bool &ObjCLifetimeConversion) {
3956 FromType =
Context.getCanonicalType(FromType);
3957 ToType =
Context.getCanonicalType(ToType);
3958 ObjCLifetimeConversion =
false;
3968 bool PreviousToQualsIncludeConst =
true;
3969 bool UnwrappedAnyPointer =
false;
3970 while (
Context.UnwrapSimilarTypes(FromType, ToType)) {
3972 !UnwrappedAnyPointer,
3973 PreviousToQualsIncludeConst,
3976 UnwrappedAnyPointer =
true;
3984 return UnwrappedAnyPointer &&
Context.hasSameUnqualifiedType(FromType,ToType);
3993 bool InOverloadResolution,
4002 InOverloadResolution, InnerSCS,
4017 bool InOverloadResolution,
4020 const OverflowBehaviorType *ToOBT = ToType->
getAs<OverflowBehaviorType>();
4031 InOverloadResolution, InnerSCS, CStyle,
4048 if (CtorType->getNumParams() > 0) {
4049 QualType FirstArg = CtorType->getParamType(0);
4061 bool AllowExplicit) {
4068 bool Usable = !Info.Constructor->isInvalidDecl() &&
4071 bool SuppressUserConversions =
false;
4072 if (Info.ConstructorTmpl)
4075 CandidateSet, SuppressUserConversions,
4080 CandidateSet, SuppressUserConversions,
4081 false, AllowExplicit);
4085 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4112 llvm_unreachable(
"Invalid OverloadResult!");
4134 bool AllowObjCConversionOnExplicit) {
4135 assert(AllowExplicit != AllowedExplicit::None ||
4136 !AllowObjCConversionOnExplicit);
4140 bool ConstructorsOnly =
false;
4144 if (
const RecordType *ToRecordType = ToType->
getAsCanonical<RecordType>()) {
4156 ConstructorsOnly =
true;
4160 }
else if (
auto *ToRecordDecl =
4161 dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
4162 ToRecordDecl = ToRecordDecl->getDefinitionOrSelf();
4164 Expr **Args = &From;
4165 unsigned NumArgs = 1;
4166 bool ListInitializing =
false;
4167 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
4170 S, From, ToType, ToRecordDecl, User, CandidateSet,
4171 AllowExplicit == AllowedExplicit::All);
4180 Args = InitList->getInits();
4181 NumArgs = InitList->getNumInits();
4182 ListInitializing =
true;
4190 bool Usable = !Info.Constructor->isInvalidDecl();
4191 if (!ListInitializing)
4192 Usable = Usable && Info.Constructor->isConvertingConstructor(
4195 bool SuppressUserConversions = !ConstructorsOnly;
4203 if (SuppressUserConversions && ListInitializing) {
4204 SuppressUserConversions =
4209 if (Info.ConstructorTmpl)
4211 Info.ConstructorTmpl, Info.FoundDecl,
4213 CandidateSet, SuppressUserConversions,
4215 AllowExplicit == AllowedExplicit::All);
4221 SuppressUserConversions,
4223 AllowExplicit == AllowedExplicit::All);
4233 }
else if (
const RecordType *FromRecordType =
4235 if (
auto *FromRecordDecl =
4236 dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
4237 FromRecordDecl = FromRecordDecl->getDefinitionOrSelf();
4239 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
4240 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4249 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)))
4256 ConvTemplate, FoundDecl, ActingContext, From, ToType,
4257 CandidateSet, AllowObjCConversionOnExplicit,
4258 AllowExplicit != AllowedExplicit::None);
4261 CandidateSet, AllowObjCConversionOnExplicit,
4262 AllowExplicit != AllowedExplicit::None);
4267 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4276 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
4288 if (Best->Conversions[0].isEllipsis())
4291 User.
Before = Best->Conversions[0].Standard;
4304 = dyn_cast<CXXConversionDecl>(Best->Function)) {
4306 assert(Best->HasFinalConversion);
4314 User.
Before = Best->Conversions[0].Standard;
4329 User.
After = Best->FinalConversion;
4332 llvm_unreachable(
"Not a constructor or conversion function?");
4341 llvm_unreachable(
"Invalid OverloadResult!");
4351 CandidateSet, AllowedExplicit::None,
false);
4366 diag::err_typecheck_nonviable_condition_incomplete,
4373 *
this, From, Cands);
4399 if (!Conv1 || !Conv2)
4414 if (Block1 != Block2)
4427 if (Conv1FuncRet && Conv2FuncRet &&
4436 CallOp->getType()->castAs<
FunctionType>()->getCallConv();
4438 CallOpProto->isVariadic(),
false);
4440 CallOpProto->isVariadic(),
true);
4442 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4537 if (!ICS1.
isBad()) {
4538 bool StdInit1 =
false, StdInit2 =
false;
4545 if (StdInit1 != StdInit2)
4556 CAT2->getElementType())) {
4558 if (CAT1->getSize() != CAT2->getSize())
4560 return CAT1->getSize().ult(CAT2->getSize())
4595 if (ConvFunc1 == ConvFunc2)
4697 if (!
Enum->isFixed())
4733 else if (Rank2 < Rank1)
4768 bool SCS1ConvertsToVoid
4770 bool SCS2ConvertsToVoid
4772 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4777 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4783 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4812 if (FromObjCPtr1 && FromObjCPtr2) {
4817 if (AssignLeft != AssignRight) {
4856 if (UnqualT1 == UnqualT2) {
4918 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4919 return SCS1IsCompatibleVectorConversion
4926 bool SCS1IsCompatibleSVEVectorConversion =
4928 bool SCS2IsCompatibleSVEVectorConversion =
4931 if (SCS1IsCompatibleSVEVectorConversion !=
4932 SCS2IsCompatibleSVEVectorConversion)
4933 return SCS1IsCompatibleSVEVectorConversion
4940 bool SCS1IsCompatibleRVVVectorConversion =
4942 bool SCS2IsCompatibleRVVVectorConversion =
4945 if (SCS1IsCompatibleRVVVectorConversion !=
4946 SCS2IsCompatibleRVVVectorConversion)
4947 return SCS1IsCompatibleRVVVectorConversion
5006 if (UnqualT1 == UnqualT2)
5024 bool ObjCLifetimeConversion;
5034 if (CanPick1 != CanPick2)
5088 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5096 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
5113 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
5120 bool FromAssignRight
5129 if (ToPtr1->isObjCIdType() &&
5130 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
5132 if (ToPtr2->isObjCIdType() &&
5133 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
5138 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
5140 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
5145 if (ToPtr1->isObjCClassType() &&
5146 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
5148 if (ToPtr2->isObjCClassType() &&
5149 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
5154 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
5156 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
5162 (ToAssignLeft != ToAssignRight)) {
5173 }
else if (IsSecondSame)
5182 (FromAssignLeft != FromAssignRight))
5196 CXXRecordDecl *FromPointee1 = FromMemPointer1->getMostRecentCXXRecordDecl();
5201 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5208 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
5246 if (!T.getQualifiers().hasUnaligned())
5260 "T1 must be the pointee type of the reference type");
5261 assert(!OrigT2->
isReferenceType() &&
"T2 cannot be a reference type");
5284 if (UnqualT1 == UnqualT2) {
5288 Conv |= ReferenceConversions::DerivedToBase;
5291 Context.canBindObjCObjectType(UnqualT1, UnqualT2))
5292 Conv |= ReferenceConversions::ObjC;
5295 Conv |= ReferenceConversions::Function;
5299 bool ConvertedReferent = Conv != 0;
5303 bool PreviousToQualsIncludeConst =
true;
5304 bool TopLevel =
true;
5310 Conv |= ReferenceConversions::Qualification;
5316 Conv |= ReferenceConversions::NestedQualification;
5324 bool ObjCLifetimeConversion =
false;
5326 PreviousToQualsIncludeConst,
5328 return (ConvertedReferent ||
Context.hasSimilarType(T1, T2))
5333 if (ObjCLifetimeConversion)
5334 Conv |= ReferenceConversions::ObjCLifetime;
5337 }
while (
Context.UnwrapSimilarTypes(T1, T2));
5342 return (ConvertedReferent ||
Context.hasSameUnqualifiedType(T1, T2))
5353 bool AllowExplicit) {
5354 assert(T2->
isRecordType() &&
"Can only find conversions of record types.");
5358 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5359 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5366 = dyn_cast<FunctionTemplateDecl>(D);
5383 if (!ConvTemplate &&
5407 ConvTemplate, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5408 false, AllowExplicit);
5411 Conv, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5412 false, AllowExplicit);
5415 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5421 assert(Best->HasFinalConversion);
5433 if (!Best->FinalConversion.DirectBinding)
5445 "Expected a direct reference binding!");
5451 Cand != CandidateSet.
end(); ++Cand)
5463 llvm_unreachable(
"Invalid OverloadResult!");
5468static ImplicitConversionSequence
5471 bool SuppressUserConversions,
5472 bool AllowExplicit) {
5473 assert(DeclType->
isReferenceType() &&
"Reference init needs a reference");
5500 auto SetAsReferenceBinding = [&](
bool BindsDirectly) {
5505 ICS.
Standard.
Second = (RefConv & Sema::ReferenceConversions::DerivedToBase)
5507 : (RefConv & Sema::ReferenceConversions::ObjC)
5515 Sema::ReferenceConversions::NestedQualification)
5529 (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0;
5553 SetAsReferenceBinding(
true);
5602 SetAsReferenceBinding(S.
getLangOpts().CPlusPlus11 ||
5693 AllowedExplicit::None,
5718 if (isRValRef && LValRefType) {
5735static ImplicitConversionSequence
5737 bool SuppressUserConversions,
5738 bool InOverloadResolution,
5739 bool AllowObjCWritebackConversion,
5740 bool AllowExplicit =
false);
5744static ImplicitConversionSequence
5746 bool SuppressUserConversions,
5747 bool InOverloadResolution,
5748 bool AllowObjCWritebackConversion) {
5761 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT))
5763 InitTy = IAT->getElementType();
5789 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5795 SuppressUserConversions,
5796 InOverloadResolution,
5797 AllowObjCWritebackConversion);
5806 Result.Standard.setAsIdentityConversion();
5807 Result.Standard.setFromType(ToType);
5808 Result.Standard.setAllToTypes(ToType);
5833 bool IsUnbounded =
false;
5837 if (CT->getSize().ult(e)) {
5841 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5844 if (CT->getSize().ugt(e)) {
5850 S, &EmptyList, InitTy, SuppressUserConversions,
5851 InOverloadResolution, AllowObjCWritebackConversion);
5852 if (DfltElt.
isBad()) {
5856 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5867 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5877 Result.Standard.setAsIdentityConversion();
5878 Result.Standard.setFromType(InitTy);
5879 Result.Standard.setAllToTypes(InitTy);
5880 for (
unsigned i = 0; i < e; ++i) {
5883 S,
Init, InitTy, SuppressUserConversions, InOverloadResolution,
5884 AllowObjCWritebackConversion);
5895 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5909 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5923 AllowedExplicit::None,
5924 InOverloadResolution,
false,
5925 AllowObjCWritebackConversion,
5944 Result.UserDefined.Before.setAsIdentityConversion();
5949 Result.UserDefined.After.setAsIdentityConversion();
5950 Result.UserDefined.After.setFromType(ToType);
5951 Result.UserDefined.After.setAllToTypes(ToType);
5952 Result.UserDefined.ConversionFunction =
nullptr;
5969 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5990 SuppressUserConversions,
5998 InOverloadResolution,
5999 AllowObjCWritebackConversion);
6002 assert(!
Result.isEllipsis() &&
6003 "Sub-initialization cannot result in ellipsis conversion.");
6009 Result.UserDefined.After;
6037 S, From->
getInit(0), ToType, SuppressUserConversions,
6038 InOverloadResolution, AllowObjCWritebackConversion);
6040 Result.Standard.FromBracedInitList =
true;
6044 else if (NumInits == 0) {
6046 Result.Standard.setAsIdentityConversion();
6047 Result.Standard.setFromType(ToType);
6048 Result.Standard.setAllToTypes(ToType);
6065static ImplicitConversionSequence
6067 bool SuppressUserConversions,
6068 bool InOverloadResolution,
6069 bool AllowObjCWritebackConversion,
6070 bool AllowExplicit) {
6071 if (
InitListExpr *FromInitList = dyn_cast<InitListExpr>(From))
6073 InOverloadResolution,AllowObjCWritebackConversion);
6078 SuppressUserConversions, AllowExplicit);
6081 SuppressUserConversions,
6082 AllowedExplicit::None,
6083 InOverloadResolution,
6085 AllowObjCWritebackConversion,
6098 return !ICS.
isBad();
6107 const CXXRecordDecl *ActingContext,
bool InOverloadResolution =
false,
6109 bool SuppressUserConversion =
false) {
6117 assert(FromClassification.
isLValue());
6128 if (Method->isExplicitObjectMemberFunction()) {
6129 if (ExplicitParameterType.isNull())
6130 ExplicitParameterType = Method->getFunctionObjectParameterReferenceType();
6132 ValueKindFromClassification(FromClassification));
6134 S, &TmpExpr, ExplicitParameterType, SuppressUserConversion,
6151 Qualifiers Quals = Method->getMethodQualifiers();
6189 FromType, ImplicitParamType);
6199 FromType, ImplicitParamType);
6212 }
else if (!Method->isExplicitObjectMemberFunction()) {
6214 FromType, ImplicitParamType);
6219 switch (Method->getRefQualifier()) {
6234 if (!FromClassification.
isRValue()) {
6256 = (Method->getRefQualifier() ==
RQ_None);
6267 QualType ImplicitParamRecordType =
Method->getFunctionObjectParameterType();
6272 DestType =
Method->getThisType();
6275 FromRecordType = From->
getType();
6276 DestType = ImplicitParamRecordType;
6284 Method->getRefQualifier() !=
6302 <<
Method->getDeclName() << FromRecordType << (CVR - 1)
6304 Diag(
Method->getLocation(), diag::note_previous_decl)
6305 <<
Method->getDeclName();
6313 bool IsRValueQualified =
6317 << IsRValueQualified;
6318 Diag(
Method->getLocation(), diag::note_previous_decl)
6319 <<
Method->getDeclName();
6329 llvm_unreachable(
"Lists are not objects");
6332 return Diag(From->
getBeginLoc(), diag::err_member_function_call_bad_type)
6333 << ImplicitParamRecordType << FromRecordType
6342 From = FromRes.
get();
6351 CK = CK_AddressSpaceConversion;
6376 AllowedExplicit::Conversions,
6387 return AMDGPU().ExpandAMDGPUPredicateBuiltIn(From);
6460 llvm_unreachable(
"found a first conversion kind in Second");
6464 llvm_unreachable(
"found a third conversion kind in Second");
6470 llvm_unreachable(
"unknown conversion kind");
6480 [[maybe_unused]]
bool isCCEAllowedPreCXX11 =
6482 assert((S.
getLangOpts().CPlusPlus11 || isCCEAllowedPreCXX11) &&
6483 "converted constant expression outside C++11 or TTP matching");
6515 if (T->isRecordType())
6524 diag::err_typecheck_converted_constant_expression)
6530 llvm_unreachable(
"bad conversion in converted constant expression");
6536 diag::err_typecheck_converted_constant_expression_disallowed)
6542 diag::err_typecheck_converted_constant_expression_indirect)
6552 diag::err_reference_bind_to_bitfield_in_cce)
6560 bool IsTemplateArgument =
6562 if (T->isRecordType()) {
6563 assert(IsTemplateArgument &&
6564 "unexpected class type converted constant expr");
6580 IsTemplateArgument);
6585 bool ReturnPreNarrowingValue =
false;
6588 PreNarrowingType)) {
6598 PreNarrowingValue.
isInt()) {
6601 ReturnPreNarrowingValue =
true;
6627 << CCE << 0 << From->
getType() << T;
6632 if (!ReturnPreNarrowingValue)
6633 PreNarrowingValue = {};
6649 if (
Result.isInvalid() ||
Result.get()->isValueDependent()) {
6654 RequireInt, PreNarrowingValue);
6661 return ::BuildConvertedConstantExpression(*
this, From, T, CCE, Dest,
6668 return ::CheckConvertedConstantExpression(*
this, From, T,
Value, CCE,
false,
6673 llvm::APSInt &
Value,
6675 assert(T->isIntegralOrEnumerationType() &&
"unexpected converted const type");
6680 if (!R.isInvalid() && !R.get()->isValueDependent())
6688 const APValue &PreNarrowingValue) {
6700 Kind = ConstantExprKind::ClassTemplateArgument;
6702 Kind = ConstantExprKind::NonClassTemplateArgument;
6704 Kind = ConstantExprKind::Normal;
6707 (RequireInt && !Eval.
Val.
isInt())) {
6714 if (Notes.empty()) {
6717 if (
const auto *CE = dyn_cast<ConstantExpr>(E)) {
6721 "ConstantExpr has no value associated with it");
6727 Value = std::move(PreNarrowingValue);
6733 if (Notes.size() == 1 &&
6734 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6735 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6736 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6737 diag::note_constexpr_invalid_template_arg) {
6738 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6739 for (
unsigned I = 0; I < Notes.size(); ++I)
6740 Diag(Notes[I].first, Notes[I].second);
6744 for (
unsigned I = 0; I < Notes.size(); ++I)
6745 Diag(Notes[I].first, Notes[I].second);
6764static ImplicitConversionSequence
6772 AllowedExplicit::Conversions,
6814 "expected a member expression");
6816 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6817 M && !M->isImplicitAccess())
6818 Base = M->getBase();
6819 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6820 M && !M->isImplicitAccess())
6821 Base = M->getBase();
6825 if (T->isPointerType())
6854 assert(Method->isExplicitObjectMemberFunction() &&
6855 "Method is not an explicit member function");
6856 assert(NewArgs.empty() &&
"NewArgs should be empty");
6858 NewArgs.reserve(Args.size() + 1);
6860 NewArgs.push_back(
This);
6861 NewArgs.append(Args.begin(), Args.end());
6864 Method,
Object->getBeginLoc());
6870 return AllowScopedEnumerations ? T->isIntegralOrEnumerationType()
6871 : T->isIntegralOrUnscopedEnumerationType();
6883 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6895 QualType T,
bool HadMultipleCandidates,
6897 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6905 std::string TypeStr;
6910 "static_cast<" + TypeStr +
">(")
6922 HadMultipleCandidates);
6929 From,
Result.get()->getType());
6939 QualType T,
bool HadMultipleCandidates,
6955 HadMultipleCandidates);
6960 CK_UserDefinedConversion,
Result.get(),
6961 nullptr,
Result.get()->getValueKind(),
6986 if (
auto *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)) {
6988 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
6994 Conv, FoundDecl, ActingContext, From, ToType, CandidateSet,
7028 From = result.
get();
7035 if (Converter.
match(T))
7042 const RecordType *RecordTy = T->getAsCanonical<RecordType>();
7055 : Converter(Converter), From(From) {}
7060 } IncompleteDiagnoser(Converter, From);
7071 ->getDefinitionOrSelf()
7072 ->getVisibleConversionFunctions();
7074 bool HadMultipleCandidates =
7079 bool HasUniqueTargetType =
true;
7095 "Conversion operator templates are considered potentially "
7099 if (Converter.
match(CurToType) || ConvTemplate) {
7105 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
7110 else if (HasUniqueTargetType &&
7112 HasUniqueTargetType =
false;
7114 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
7132 HadMultipleCandidates,
7133 ExplicitConversions))
7139 if (!HasUniqueTargetType)
7158 HadMultipleCandidates,
Found))
7167 HadMultipleCandidates,
7168 ExplicitConversions))
7176 switch (ViableConversions.
size()) {
7179 HadMultipleCandidates,
7180 ExplicitConversions))
7190 HadMultipleCandidates,
Found))
7221 if (Proto->getNumParams() < 1)
7225 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
7226 if (Context.hasSameUnqualifiedType(T1, ArgType))
7230 if (Proto->getNumParams() < 2)
7234 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
7235 if (Context.hasSameUnqualifiedType(T2, ArgType))
7254 unsigned SeenAt = 0;
7256 bool HasDefault =
false;
7265 return HasDefault || SeenAt != 0;
7271 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
7274 bool StrictPackMatch) {
7277 assert(Proto &&
"Functions without a prototype cannot be overloaded");
7278 assert(!
Function->getDescribedFunctionTemplate() &&
7279 "Use AddTemplateOverloadCandidate for function templates");
7292 CandidateSet, SuppressUserConversions,
7293 PartialOverloading, EarlyConversions, PO,
7329 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
7343 Candidate.
Viable =
false;
7356 bool IsImplicitlyInstantiated =
false;
7357 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo()) {
7358 ND = SpecInfo->getTemplate();
7359 IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() ==
7370 const bool IsInlineFunctionInGMF =
7372 (IsImplicitlyInstantiated ||
Function->isInlined());
7375 Candidate.
Viable =
false;
7382 Candidate.
Viable =
false;
7393 if (Args.size() == 1 &&
Constructor->isSpecializationCopyingObject() &&
7394 (
Context.hasSameUnqualifiedType(ClassType, Args[0]->getType()) ||
7397 Candidate.
Viable =
false;
7409 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.
getDecl());
7410 if (Shadow && Args.size() == 1 &&
Constructor->getNumParams() >= 1 &&
7411 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
7418 Candidate.
Viable =
false;
7427 Constructor->getMethodQualifiers().getAddressSpace(),
7429 Candidate.
Viable =
false;
7442 Candidate.
Viable =
false;
7452 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7453 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7454 !PartialOverloading) {
7456 Candidate.
Viable =
false;
7470 Candidate.
Viable =
false;
7476 if (
Function->getTrailingRequiresClause()) {
7481 Candidate.
Viable =
false;
7490 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7493 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7496 }
else if (ArgIdx < NumParams) {
7507 Args[ArgIdx]->
getType().getAddressSpace() ==
7509 Diag(Args[ArgIdx]->getBeginLoc(), diag::warn_hlsl_groupshared_inout);
7512 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7515 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7517 Candidate.
Viable =
false;
7529 if (EnableIfAttr *FailedAttr =
7531 Candidate.
Viable =
false;
7541 if (Methods.size() <= 1)
7544 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7550 if (
Method->param_size() > NumNamedArgs)
7551 NumNamedArgs =
Method->param_size();
7552 if (Args.size() < NumNamedArgs)
7555 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7557 if (Args[i]->isTypeDependent()) {
7563 Expr *argExpr = Args[i];
7564 assert(argExpr &&
"SelectBestMethod(): missing expression");
7569 !param->
hasAttr<CFConsumedAttr>())
7570 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7587 if (ConversionState.
isBad() ||
7597 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7598 if (Args[i]->isTypeDependent()) {
7611 if (Args.size() != NumNamedArgs)
7613 else if (
Match && NumNamedArgs == 0 && Methods.size() > 1) {
7616 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7617 QualType ReturnT = Methods[
b]->getReturnType();
7637 "Shouldn't have `this` for ctors!");
7638 assert(!Method->isStatic() &&
"Shouldn't have `this` for static methods!");
7640 ThisArg, std::nullopt, Method, Method);
7643 ConvertedThis = R.get();
7645 if (
auto *MD = dyn_cast<CXXMethodDecl>(Function)) {
7647 assert((MissingImplicitThis || MD->isStatic() ||
7649 "Expected `this` for non-ctor instance methods");
7651 ConvertedThis =
nullptr;
7656 unsigned ArgSizeNoVarargs = std::min(Function->param_size(), Args.size());
7659 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7662 S.
Context, Function->getParamDecl(I)),
7668 ConvertedArgs.push_back(R.get());
7675 if (!Function->isVariadic() && Args.size() < Function->getNumParams()) {
7676 for (
unsigned i = Args.size(), e = Function->getNumParams(); i != e; ++i) {
7683 ConvertedArgs.push_back(R.get());
7695 bool MissingImplicitThis) {
7696 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7697 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7703 llvm::scope_exit UndelayDiags(
7705 DelayedDiagnostics.popUndelayed(CurrentState);
7709 Expr *DiscardedThis;
7711 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7712 true, DiscardedThis, ConvertedArgs))
7713 return *EnableIfAttrs.begin();
7715 for (
auto *EIA : EnableIfAttrs) {
7719 if (EIA->getCond()->isValueDependent() ||
7720 !EIA->getCond()->EvaluateWithSubstitution(
7724 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7730template <
typename CheckFn>
7733 CheckFn &&IsSuccessful) {
7736 if (ArgDependent == DIA->getArgDependent())
7737 Attrs.push_back(DIA);
7744 auto WarningBegin = std::stable_partition(
7745 Attrs.begin(), Attrs.end(), [](
const DiagnoseIfAttr *DIA) {
7746 return DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_error &&
7747 DIA->getWarningGroup().empty();
7752 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7754 if (ErrAttr != WarningBegin) {
7755 const DiagnoseIfAttr *DIA = *ErrAttr;
7756 S.
Diag(Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7757 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7758 << DIA->getParent() << DIA->getCond()->getSourceRange();
7762 auto ToSeverity = [](DiagnoseIfAttr::DefaultSeverity Sev) {
7764 case DiagnoseIfAttr::DS_warning:
7766 case DiagnoseIfAttr::DS_error:
7769 llvm_unreachable(
"Fully covered switch above!");
7772 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7773 if (IsSuccessful(DIA)) {
7774 if (DIA->getWarningGroup().empty() &&
7775 DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_warning) {
7776 S.
Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7777 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7778 << DIA->getParent() << DIA->getCond()->getSourceRange();
7781 DIA->getWarningGroup());
7784 {ToSeverity(DIA->getDefaultSeverity()),
"%0",
7786 S.
Diag(Loc, DiagID) << DIA->getMessage();
7794 const Expr *ThisArg,
7799 [&](
const DiagnoseIfAttr *DIA) {
7804 if (!DIA->getCond()->EvaluateWithSubstitution(
7807 return Result.isInt() &&
Result.getInt().getBoolValue();
7814 *
this, ND,
false, Loc,
7815 [&](
const DiagnoseIfAttr *DIA) {
7817 return DIA->getCond()->EvaluateAsBooleanCondition(
Result,
Context) &&
7826 bool SuppressUserConversions,
7827 bool PartialOverloading,
7828 bool FirstArgumentIsBase) {
7840 if (Args.size() > 0) {
7841 if (
Expr *E = Args[0]) {
7851 FunctionArgs = Args.slice(1);
7855 FunTmpl, F.getPair(),
7857 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7858 FunctionArgs, CandidateSet, SuppressUserConversions,
7859 PartialOverloading);
7863 ObjectClassification, FunctionArgs, CandidateSet,
7864 SuppressUserConversions, PartialOverloading);
7871 if (Args.size() > 0 &&
7875 FunctionArgs = Args.slice(1);
7879 ExplicitTemplateArgs, FunctionArgs,
7880 CandidateSet, SuppressUserConversions,
7881 PartialOverloading);
7884 SuppressUserConversions, PartialOverloading);
7894 bool SuppressUserConversions,
7904 "Expected a member function template");
7906 nullptr, ObjectType,
7907 ObjectClassification, Args, CandidateSet,
7908 SuppressUserConversions,
false, PO);
7911 ObjectType, ObjectClassification, Args, CandidateSet,
7912 SuppressUserConversions,
false, {}, PO);
7925 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7927 "Use AddOverloadCandidate for constructors");
7936 Method->isMoveAssignmentOperator())
7943 bool IgnoreExplicitObject =
7944 (
Method->isExplicitObjectMemberFunction() &&
7947 bool ImplicitObjectMethodTreatedAsStatic =
7950 Method->isImplicitObjectMemberFunction();
7952 unsigned ExplicitOffset =
7953 !IgnoreExplicitObject &&
Method->isExplicitObjectMemberFunction() ? 1 : 0;
7955 unsigned NumParams =
Method->getNumParams() - ExplicitOffset +
7956 int(ImplicitObjectMethodTreatedAsStatic);
7958 unsigned ExtraArgs =
7965 CandidateSet.
addCandidate(Args.size() + ExtraArgs, EarlyConversions);
7981 Candidate.
Viable =
false;
7991 unsigned MinRequiredArgs =
Method->getMinRequiredArguments() -
7993 int(ImplicitObjectMethodTreatedAsStatic);
7995 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
7997 Candidate.
Viable =
false;
8005 if (!IgnoreExplicitObject) {
8008 else if (
Method->isStatic()) {
8018 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
8023 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8024 Method, ActingContext,
true);
8025 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
8026 Candidate.
Viable =
false;
8037 Candidate.
Viable =
false;
8042 if (
Method->getTrailingRequiresClause()) {
8047 Candidate.
Viable =
false;
8055 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
8058 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
8061 }
else if (ArgIdx < NumParams) {
8067 if (ImplicitObjectMethodTreatedAsStatic) {
8068 ParamType = ArgIdx == 0
8069 ?
Method->getFunctionObjectParameterReferenceType()
8072 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
8076 SuppressUserConversions,
8081 Candidate.
Viable =
false;
8093 if (EnableIfAttr *FailedAttr =
8095 Candidate.
Viable =
false;
8102 Candidate.
Viable =
false;
8113 bool SuppressUserConversions,
bool PartialOverloading,
8131 PartialOverloading,
false,
8132 false, ObjectType, ObjectClassification,
8136 bool OnlyInitializeNonUserDefinedConversions) {
8137 return S.CheckNonDependentConversions(
8138 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
8139 Sema::CheckNonDependentConversionsFlag(
8140 SuppressUserConversions,
8141 OnlyInitializeNonUserDefinedConversions),
8142 ActingContext, ObjectType, ObjectClassification, PO);
8146 CandidateSet.
addCandidate(Conversions.size(), Conversions);
8149 Candidate.
Viable =
false;
8158 Method->isStatic() ||
8159 (!Method->isExplicitObjectMemberFunction() && ObjectType.
isNull());
8173 assert(
Specialization &&
"Missing member function template specialization?");
8175 "Specialization is not a member function?");
8178 ObjectClassification, Args, CandidateSet, SuppressUserConversions,
8192 if (ExplicitTemplateArgs ||
8195 *
this, CandidateSet, MethodTmpl, FoundDecl, ActingContext,
8196 ExplicitTemplateArgs, ObjectType, ObjectClassification, Args,
8197 SuppressUserConversions, PartialOverloading, PO);
8202 MethodTmpl, FoundDecl, ActingContext, ObjectType, ObjectClassification,
8203 Args, SuppressUserConversions, PartialOverloading, PO);
8221 bool SuppressUserConversions,
bool PartialOverloading,
bool AllowExplicit,
8223 bool AggregateCandidateDeduction) {
8232 Candidate.
Viable =
false;
8252 PartialOverloading, AggregateCandidateDeduction,
8259 bool OnlyInitializeNonUserDefinedConversions) {
8260 return S.CheckNonDependentConversions(
8261 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
8262 Sema::CheckNonDependentConversionsFlag(
8263 SuppressUserConversions,
8264 OnlyInitializeNonUserDefinedConversions),
8265 nullptr, QualType(), {}, PO);
8268 OverloadCandidate &Candidate =
8269 CandidateSet.addCandidate(Conversions.size(), Conversions);
8272 Candidate.
Viable =
false;
8274 CandidateSet.getRewriteInfo().getRewriteKind(Candidate.
Function, PO);
8280 CandidateSet.getKind() ==
8286 ->isExplicitObjectMemberFunction() &&
8302 assert(
Specialization &&
"Missing function template specialization?");
8304 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
8305 PartialOverloading, AllowExplicit,
8306 false, IsADLCandidate, Conversions, PO,
8307 Info.AggregateDeductionCandidateHasMismatchedArity,
8308 Info.hasStrictPackMatch());
8315 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
8322 if (ExplicitTemplateArgs ||
8325 DependentExplicitSpecifier)) {
8329 Args, SuppressUserConversions, PartialOverloading, AllowExplicit,
8330 IsADLCandidate, PO, AggregateCandidateDeduction);
8332 if (DependentExplicitSpecifier)
8339 PartialOverloading, AllowExplicit, IsADLCandidate, PO,
8340 AggregateCandidateDeduction);
8353 const bool AllowExplicit =
false;
8355 bool ForOverloadSetAddressResolution =
8358 auto *
Method = dyn_cast<CXXMethodDecl>(FD);
8359 bool HasThisConversion = !ForOverloadSetAddressResolution &&
Method &&
8361 unsigned ThisConversions = HasThisConversion ? 1 : 0;
8377 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
8378 !ParamTypes[0]->isDependentType()) {
8380 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8381 Method, ActingContext,
true,
8382 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
8392 auto MaybeInvolveUserDefinedConversion = [&](
QualType ParamType,
8416 if (
auto *RD =
ArgType->getAsCXXRecordDecl();
8417 RD && RD->hasDefinition() &&
8418 !RD->getVisibleConversionFunctions().empty())
8425 HasThisConversion &&
Method->hasCXXExplicitFunctionObjectParameter() ? 1
8428 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
8430 QualType ParamType = ParamTypes[I + Offset];
8434 ConvIdx = Args.size() - 1 - I;
8435 assert(Args.size() + ThisConversions == 2 &&
8436 "number of args (including 'this') must be exactly 2 for "
8440 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
8443 ConvIdx = ThisConversions + I;
8448 MaybeInvolveUserDefinedConversion(ParamType, Args[I]->
getType()))
8477 bool AllowObjCPointerConversion) {
8485 bool ObjCLifetimeConversion;
8487 ObjCLifetimeConversion))
8492 if (!AllowObjCPointerConversion)
8496 bool IncompatibleObjC =
false;
8506 bool AllowExplicit,
bool AllowResultConversion,
bool StrictPackMatch) {
8508 "Conversion function templates use AddTemplateConversionCandidate");
8523 if (!AllowResultConversion &&
8535 AllowObjCConversionOnExplicit))
8557 if (!AllowExplicit && Conversion->
isExplicit()) {
8558 Candidate.
Viable =
false;
8585 Candidate.
Viable =
false;
8594 Candidate.
Viable =
false;
8605 QualType ToCanon =
Context.getCanonicalType(ToType).getUnqualifiedType();
8606 if (FromCanon == ToCanon ||
8608 Candidate.
Viable =
false;
8625 CK_FunctionToPointerDecay, &ConversionRef,
8630 Candidate.
Viable =
false;
8660 Candidate.
Viable =
false;
8672 Candidate.
Viable =
false;
8679 Candidate.
Viable =
false;
8685 "Can only end up with a standard conversion sequence or failure");
8688 if (EnableIfAttr *FailedAttr =
8690 Candidate.
Viable =
false;
8697 Candidate.
Viable =
false;
8706 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
8707 bool AllowResultConversion) {
8716 Candidate.
Viable =
false;
8733 Candidate.
Viable =
false;
8743 assert(
Specialization &&
"Missing function template specialization?");
8745 ToType, CandidateSet, AllowObjCConversionOnExplicit,
8746 AllowExplicit, AllowResultConversion,
8754 bool AllowExplicit,
bool AllowResultConversion) {
8756 "Only conversion function templates permitted here");
8767 ToType, AllowObjCConversionOnExplicit, AllowExplicit,
8768 AllowResultConversion);
8776 AllowObjCConversionOnExplicit, AllowExplicit, AllowResultConversion);
8815 if (ObjectInit.
isBad()) {
8816 Candidate.
Viable =
false;
8827 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8828 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8829 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8830 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8833 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8841 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8842 Candidate.
Viable =
false;
8849 if (Args.size() < NumParams) {
8851 Candidate.
Viable =
false;
8858 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8859 if (ArgIdx < NumParams) {
8872 Candidate.
Viable =
false;
8889 Candidate.
Viable =
false;
8895 if (EnableIfAttr *FailedAttr =
8897 Candidate.
Viable =
false;
8921 "unqualified operator lookup found a member function");
8925 FunctionArgs, CandidateSet);
8931 FunctionArgs[1], FunctionArgs[0]);
8933 Reversed, CandidateSet,
false,
false,
true,
8934 ADLCallKind::NotADL,
8938 if (ExplicitTemplateArgs)
8943 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
8944 false,
false,
true,
false, ADLCallKind::NotADL, {},
8976 if (!T1RD || (!IsComplete && !T1RD->isBeingDefined()))
8984 OperEnd = Operators.
end();
8985 Oper != OperEnd; ++Oper) {
8986 if (Oper->getAsFunction() &&
8989 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
8992 Args[0]->Classify(
Context), Args.slice(1),
8993 CandidateSet,
false, PO);
9000 bool IsAssignmentOperator,
9001 unsigned NumContextualBoolArguments) {
9016 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9029 if (ArgIdx < NumContextualBoolArguments) {
9030 assert(ParamTys[ArgIdx] ==
Context.BoolTy &&
9031 "Contextual conversion to bool requires bool type");
9037 ArgIdx == 0 && IsAssignmentOperator,
9043 Candidate.
Viable =
false;
9056class BuiltinCandidateTypeSet {
9062 TypeSet PointerTypes;
9066 TypeSet MemberPointerTypes;
9070 TypeSet EnumerationTypes;
9074 TypeSet VectorTypes;
9078 TypeSet MatrixTypes;
9081 TypeSet BitIntTypes;
9084 bool HasNonRecordTypes;
9088 bool HasArithmeticOrEnumeralTypes;
9092 bool HasNullPtrType;
9101 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
9103 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
9107 typedef TypeSet::iterator
iterator;
9109 BuiltinCandidateTypeSet(
Sema &SemaRef)
9110 : HasNonRecordTypes(
false),
9111 HasArithmeticOrEnumeralTypes(
false),
9112 HasNullPtrType(
false),
9114 Context(SemaRef.Context) { }
9116 void AddTypesConvertedFrom(
QualType Ty,
9118 bool AllowUserConversions,
9119 bool AllowExplicitConversions,
9120 const Qualifiers &VisibleTypeConversionsQuals);
9122 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
9123 llvm::iterator_range<iterator> member_pointer_types() {
9124 return MemberPointerTypes;
9126 llvm::iterator_range<iterator> enumeration_types() {
9127 return EnumerationTypes;
9129 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
9130 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
9131 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
9133 bool containsMatrixType(QualType Ty)
const {
return MatrixTypes.count(Ty); }
9134 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
9135 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
9136 bool hasNullPtrType()
const {
return HasNullPtrType; }
9151BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(QualType Ty,
9152 const Qualifiers &VisibleQuals) {
9155 if (!PointerTypes.insert(Ty))
9159 const PointerType *PointerTy = Ty->
getAs<PointerType>();
9160 bool buildObjCPtr =
false;
9162 const ObjCObjectPointerType *PTy = Ty->
castAs<ObjCObjectPointerType>();
9164 buildObjCPtr =
true;
9176 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
9182 if ((CVR | BaseCVR) != CVR)
continue;
9197 QualType QPointerTy;
9204 PointerTypes.insert(QPointerTy);
9220BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
9223 if (!MemberPointerTypes.insert(Ty))
9226 const MemberPointerType *PointerTy = Ty->
getAs<MemberPointerType>();
9227 assert(PointerTy &&
"type was not a member pointer type!");
9242 if ((CVR | BaseCVR) != CVR)
continue;
9246 QPointeeTy, std::nullopt, Cls));
9261BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty,
9263 bool AllowUserConversions,
9264 bool AllowExplicitConversions,
9265 const Qualifiers &VisibleQuals) {
9271 if (
const ReferenceType *RefTy = Ty->
getAs<ReferenceType>())
9276 Ty = SemaRef.Context.getArrayDecayedType(Ty);
9283 HasNonRecordTypes = HasNonRecordTypes || !TyIsRec;
9286 HasArithmeticOrEnumeralTypes =
9290 PointerTypes.insert(Ty);
9291 else if (Ty->
getAs<PointerType>() || Ty->
getAs<ObjCObjectPointerType>()) {
9294 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
9298 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
9301 HasArithmeticOrEnumeralTypes =
true;
9302 EnumerationTypes.insert(Ty);
9304 HasArithmeticOrEnumeralTypes =
true;
9305 BitIntTypes.insert(Ty);
9309 HasArithmeticOrEnumeralTypes =
true;
9310 VectorTypes.insert(Ty);
9314 HasArithmeticOrEnumeralTypes =
true;
9315 MatrixTypes.insert(Ty);
9317 HasNullPtrType =
true;
9318 }
else if (AllowUserConversions && TyIsRec) {
9320 if (!SemaRef.isCompleteType(Loc, Ty))
9324 for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) {
9334 if (AllowExplicitConversions || !Conv->
isExplicit()) {
9382 ClassDecl = RHSMPType->getMostRecentCXXRecordDecl();
9430 if (Available.hasAtomic()) {
9431 Available.removeAtomic();
9438 if (Available.hasVolatile()) {
9439 Available.removeVolatile();
9473class BuiltinOperatorOverloadBuilder {
9476 ArrayRef<Expr *> Args;
9477 QualifiersAndAtomic VisibleTypeConversionsQuals;
9478 bool HasArithmeticOrEnumeralCandidateType;
9479 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes;
9480 OverloadCandidateSet &CandidateSet;
9482 static constexpr int ArithmeticTypesCap = 26;
9483 SmallVector<CanQualType, ArithmeticTypesCap> ArithmeticTypes;
9488 unsigned FirstIntegralType,
9490 unsigned FirstPromotedIntegralType,
9491 LastPromotedIntegralType;
9492 unsigned FirstPromotedArithmeticType,
9493 LastPromotedArithmeticType;
9494 unsigned NumArithmeticTypes;
9496 void InitArithmeticTypes() {
9498 FirstPromotedArithmeticType = 0;
9508 FirstIntegralType = ArithmeticTypes.size();
9509 FirstPromotedIntegralType = ArithmeticTypes.size();
9531 llvm::SmallSetVector<CanQualType, 2> BitIntCandidates;
9532 for (BuiltinCandidateTypeSet &Candidate : CandidateTypes) {
9533 for (QualType BitTy : Candidate.bitint_types())
9536 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
9537 LastPromotedIntegralType = ArithmeticTypes.size();
9538 LastPromotedArithmeticType = ArithmeticTypes.size();
9552 LastIntegralType = ArithmeticTypes.size();
9553 NumArithmeticTypes = ArithmeticTypes.size();
9560 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
9561 ArithmeticTypesCap &&
9562 "Enough inline storage for all arithmetic types.");
9567 void addPlusPlusMinusMinusStyleOverloads(QualType CandidateTy,
9570 QualType ParamTypes[2] = {
9610 void AddCandidate(QualType L, QualType R) {
9611 QualType LandR[2] = {L,
R};
9616 BuiltinOperatorOverloadBuilder(
9617 Sema &S, ArrayRef<Expr *> Args,
9618 QualifiersAndAtomic VisibleTypeConversionsQuals,
9619 bool HasArithmeticOrEnumeralCandidateType,
9620 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes,
9621 OverloadCandidateSet &CandidateSet)
9623 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
9624 HasArithmeticOrEnumeralCandidateType(
9625 HasArithmeticOrEnumeralCandidateType),
9626 CandidateTypes(CandidateTypes),
9627 CandidateSet(CandidateSet) {
9629 InitArithmeticTypes();
9652 if (!HasArithmeticOrEnumeralCandidateType)
9655 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9656 const auto TypeOfT = ArithmeticTypes[Arith];
9658 if (Op == OO_MinusMinus)
9660 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9663 addPlusPlusMinusMinusStyleOverloads(
9680 void addPlusPlusMinusMinusPointerOverloads() {
9681 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
9683 if (!PtrTy->getPointeeType()->isObjectType())
9686 addPlusPlusMinusMinusStyleOverloads(
9688 (!PtrTy.isVolatileQualified() &&
9690 (!PtrTy.isRestrictQualified() &&
9705 void addUnaryStarPointerOverloads() {
9706 for (QualType ParamTy : CandidateTypes[0].pointer_types()) {
9711 if (
const FunctionProtoType *Proto =PointeeTy->
getAs<FunctionProtoType>())
9712 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9725 void addUnaryPlusOrMinusArithmeticOverloads() {
9726 if (!HasArithmeticOrEnumeralCandidateType)
9729 for (
unsigned Arith = FirstPromotedArithmeticType;
9730 Arith < LastPromotedArithmeticType; ++Arith) {
9731 QualType ArithTy = ArithmeticTypes[Arith];
9736 for (QualType VecTy : CandidateTypes[0].vector_types())
9745 void addUnaryPlusPointerOverloads() {
9746 for (QualType ParamTy : CandidateTypes[0].pointer_types())
9755 void addUnaryTildePromotedIntegralOverloads() {
9756 if (!HasArithmeticOrEnumeralCandidateType)
9759 for (
unsigned Int = FirstPromotedIntegralType;
9760 Int < LastPromotedIntegralType; ++
Int) {
9761 QualType IntTy = ArithmeticTypes[
Int];
9766 for (QualType VecTy : CandidateTypes[0].vector_types())
9776 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9778 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9780 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9781 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9786 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9790 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9792 if (AddedTypes.insert(NullPtrTy).second) {
9793 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9812 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9825 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9826 UserDefinedBinaryOperators;
9828 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9829 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9831 CEnd = CandidateSet.
end();
9833 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9836 if (
C->Function->isFunctionTemplateSpecialization())
9843 QualType FirstParamType =
C->Function->getParamDecl(
Reversed ? 1 : 0)
9845 .getUnqualifiedType();
9846 QualType SecondParamType =
C->Function->getParamDecl(
Reversed ? 0 : 1)
9848 .getUnqualifiedType();
9856 UserDefinedBinaryOperators.insert(
9864 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9866 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9867 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9871 if (IsSpaceship && PtrTy->isFunctionPointerType())
9874 QualType ParamTypes[2] = {PtrTy, PtrTy};
9877 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9882 if (!AddedTypes.insert(CanonType).second ||
9883 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9886 QualType ParamTypes[2] = {EnumTy, EnumTy};
9911 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9913 for (
int Arg = 0; Arg < 2; ++Arg) {
9914 QualType AsymmetricParamTypes[2] = {
9918 for (QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9923 AsymmetricParamTypes[Arg] = PtrTy;
9924 if (Arg == 0 || Op == OO_Plus) {
9929 if (Op == OO_Minus) {
9934 QualType ParamTypes[2] = {PtrTy, PtrTy};
9970 void addGenericBinaryArithmeticOverloads() {
9971 if (!HasArithmeticOrEnumeralCandidateType)
9974 for (
unsigned Left = FirstPromotedArithmeticType;
9975 Left < LastPromotedArithmeticType; ++
Left) {
9976 for (
unsigned Right = FirstPromotedArithmeticType;
9977 Right < LastPromotedArithmeticType; ++
Right) {
9978 QualType LandR[2] = { ArithmeticTypes[
Left],
9979 ArithmeticTypes[
Right] };
9986 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
9987 for (QualType Vec2Ty : CandidateTypes[1].vector_types()) {
9988 QualType LandR[2] = {Vec1Ty, Vec2Ty};
9998 void addMatrixBinaryArithmeticOverloads() {
9999 if (!HasArithmeticOrEnumeralCandidateType)
10002 for (QualType M1 : CandidateTypes[0].matrix_types()) {
10004 AddCandidate(M1, M1);
10007 for (QualType M2 : CandidateTypes[1].matrix_types()) {
10009 if (!CandidateTypes[0].containsMatrixType(M2))
10010 AddCandidate(M2, M2);
10045 void addThreeWayArithmeticOverloads() {
10046 addGenericBinaryArithmeticOverloads();
10063 void addBinaryBitwiseArithmeticOverloads() {
10064 if (!HasArithmeticOrEnumeralCandidateType)
10067 for (
unsigned Left = FirstPromotedIntegralType;
10068 Left < LastPromotedIntegralType; ++
Left) {
10069 for (
unsigned Right = FirstPromotedIntegralType;
10070 Right < LastPromotedIntegralType; ++
Right) {
10071 QualType LandR[2] = { ArithmeticTypes[
Left],
10072 ArithmeticTypes[
Right] };
10085 void addAssignmentMemberPointerOrEnumeralOverloads() {
10087 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10089 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10090 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10097 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10122 void addAssignmentPointerOverloads(
bool isEqualOp) {
10124 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10126 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10130 else if (!PtrTy->getPointeeType()->isObjectType())
10134 QualType ParamTypes[2] = {
10141 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10143 if (NeedVolatile) {
10151 if (!PtrTy.isRestrictQualified() &&
10159 if (NeedVolatile) {
10171 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10176 QualType ParamTypes[2] = {
10185 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10187 if (NeedVolatile) {
10195 if (!PtrTy.isRestrictQualified() &&
10203 if (NeedVolatile) {
10228 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
10229 if (!HasArithmeticOrEnumeralCandidateType)
10232 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
10233 for (
unsigned Right = FirstPromotedArithmeticType;
10234 Right < LastPromotedArithmeticType; ++
Right) {
10235 QualType ParamTypes[2];
10236 ParamTypes[1] = ArithmeticTypes[
Right];
10238 S, ArithmeticTypes[Left], Args[0]);
10241 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10251 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10252 for (QualType Vec2Ty : CandidateTypes[0].vector_types()) {
10253 QualType ParamTypes[2];
10254 ParamTypes[1] = Vec2Ty;
10282 void addAssignmentIntegralOverloads() {
10283 if (!HasArithmeticOrEnumeralCandidateType)
10286 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
10287 for (
unsigned Right = FirstPromotedIntegralType;
10288 Right < LastPromotedIntegralType; ++
Right) {
10289 QualType ParamTypes[2];
10290 ParamTypes[1] = ArithmeticTypes[
Right];
10292 S, ArithmeticTypes[Left], Args[0]);
10295 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10311 void addExclaimOverload() {
10317 void addAmpAmpOrPipePipeOverload() {
10334 void addSubscriptOverloads() {
10335 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10345 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10365 void addArrowStarOverloads() {
10366 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10367 QualType C1Ty = PtrTy;
10369 QualifierCollector Q1;
10380 for (QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
10387 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
10390 if (!VisibleTypeConversionsQuals.
hasVolatile() &&
10393 if (!VisibleTypeConversionsQuals.
hasRestrict() &&
10412 void addConditionalOperatorOverloads() {
10414 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10416 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10417 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
10421 QualType ParamTypes[2] = {PtrTy, PtrTy};
10425 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10429 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
10434 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10435 if (!EnumTy->castAsCanonical<EnumType>()->getDecl()->isScoped())
10441 QualType ParamTypes[2] = {EnumTy, EnumTy};
10460 VisibleTypeConversionsQuals.
addConst();
10461 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10463 if (Args[ArgIdx]->
getType()->isAtomicType())
10464 VisibleTypeConversionsQuals.
addAtomic();
10467 bool HasNonRecordCandidateType =
false;
10468 bool HasArithmeticOrEnumeralCandidateType =
false;
10470 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10471 CandidateTypes.emplace_back(*
this);
10472 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->
getType(),
10475 (Op == OO_Exclaim ||
10477 Op == OO_PipePipe),
10478 VisibleTypeConversionsQuals);
10479 HasNonRecordCandidateType = HasNonRecordCandidateType ||
10480 CandidateTypes[ArgIdx].hasNonRecordTypes();
10481 HasArithmeticOrEnumeralCandidateType =
10482 HasArithmeticOrEnumeralCandidateType ||
10483 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
10491 if (!HasNonRecordCandidateType &&
10492 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
10496 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
10497 VisibleTypeConversionsQuals,
10498 HasArithmeticOrEnumeralCandidateType,
10499 CandidateTypes, CandidateSet);
10505 llvm_unreachable(
"Expected an overloaded operator");
10510 case OO_Array_Delete:
10513 "Special operators don't use AddBuiltinOperatorCandidates");
10525 if (Args.size() == 1)
10526 OpBuilder.addUnaryPlusPointerOverloads();
10530 if (Args.size() == 1) {
10531 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
10533 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
10534 OpBuilder.addGenericBinaryArithmeticOverloads();
10535 OpBuilder.addMatrixBinaryArithmeticOverloads();
10540 if (Args.size() == 1)
10541 OpBuilder.addUnaryStarPointerOverloads();
10543 OpBuilder.addGenericBinaryArithmeticOverloads();
10544 OpBuilder.addMatrixBinaryArithmeticOverloads();
10549 OpBuilder.addGenericBinaryArithmeticOverloads();
10553 case OO_MinusMinus:
10554 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
10555 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
10558 case OO_EqualEqual:
10559 case OO_ExclaimEqual:
10560 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
10561 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10562 OpBuilder.addGenericBinaryArithmeticOverloads();
10568 case OO_GreaterEqual:
10569 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10570 OpBuilder.addGenericBinaryArithmeticOverloads();
10574 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
10575 OpBuilder.addThreeWayArithmeticOverloads();
10582 case OO_GreaterGreater:
10583 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10587 if (Args.size() == 1)
10593 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10597 OpBuilder.addUnaryTildePromotedIntegralOverloads();
10601 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
10605 case OO_MinusEqual:
10606 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
10610 case OO_SlashEqual:
10611 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
10614 case OO_PercentEqual:
10615 case OO_LessLessEqual:
10616 case OO_GreaterGreaterEqual:
10618 case OO_CaretEqual:
10620 OpBuilder.addAssignmentIntegralOverloads();
10624 OpBuilder.addExclaimOverload();
10629 OpBuilder.addAmpAmpOrPipePipeOverload();
10633 if (Args.size() == 2)
10634 OpBuilder.addSubscriptOverloads();
10638 OpBuilder.addArrowStarOverloads();
10641 case OO_Conditional:
10642 OpBuilder.addConditionalOperatorOverloads();
10643 OpBuilder.addGenericBinaryArithmeticOverloads();
10654 bool PartialOverloading) {
10671 CandEnd = CandidateSet.
end();
10672 Cand != CandEnd; ++Cand)
10673 if (Cand->Function) {
10677 Fns.
erase(FunTmpl);
10686 if (ExplicitTemplateArgs)
10690 FD, FoundDecl, Args, CandidateSet,
false,
10691 PartialOverloading,
true,
10692 false, ADLCallKind::UsesADL);
10695 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10696 false, PartialOverloading,
10703 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10704 false, PartialOverloading,
10705 true, ADLCallKind::UsesADL);
10707 *
this, Args, FTD->getTemplatedDecl())) {
10711 if (ReversedArgs.empty())
10715 FTD, FoundDecl, ExplicitTemplateArgs, ReversedArgs, CandidateSet,
10716 false, PartialOverloading,
10717 true, ADLCallKind::UsesADL,
10742 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10743 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10744 if (!Cand1Attr || !Cand2Attr) {
10745 if (Cand1Attr == Cand2Attr)
10746 return Comparison::Equal;
10747 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10753 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10754 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10755 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10756 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10761 return Comparison::Worse;
10763 return Comparison::Better;
10768 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10769 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10770 if (Cand1ID != Cand2ID)
10771 return Comparison::Worse;
10774 return Comparison::Equal;
10782 return Comparison::Equal;
10788 return Comparison::Equal;
10789 return Comparison::Worse;
10792 return Comparison::Better;
10798 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10799 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10801 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10802 return Comparison::Equal;
10804 if (Cand1CPUDisp && !Cand2CPUDisp)
10805 return Comparison::Better;
10806 if (Cand2CPUDisp && !Cand1CPUDisp)
10807 return Comparison::Worse;
10809 if (Cand1CPUSpec && Cand2CPUSpec) {
10810 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10811 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10812 ? Comparison::Better
10813 : Comparison::Worse;
10815 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10816 FirstDiff = std::mismatch(
10817 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10818 Cand2CPUSpec->cpus_begin(),
10820 return LHS->getName() == RHS->getName();
10823 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10824 "Two different cpu-specific versions should not have the same "
10825 "identifier list, otherwise they'd be the same decl!");
10826 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->getName()
10827 ? Comparison::Better
10828 : Comparison::Worse;
10830 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10836static std::optional<QualType>
10839 return std::nullopt;
10845 return M->getFunctionObjectParameterReferenceType();
10859 PT2->getInstantiatedFromMemberTemplate()))
10870 assert(I < F->getNumParams());
10877 if (F1NumParams != F2NumParams)
10880 unsigned I1 = 0, I2 = 0;
10881 for (
unsigned I = 0; I != F1NumParams; ++I) {
10882 QualType T1 = NextParam(F1, I1, I == 0);
10883 QualType T2 = NextParam(F2, I2, I == 0);
10884 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10885 if (!Context.hasSameUnqualifiedType(T1, T2))
10898 bool IsFn1Reversed,
10899 bool IsFn2Reversed) {
10900 assert(Fn1 && Fn2);
10905 IsFn1Reversed ^ IsFn2Reversed))
10908 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10909 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10910 if (Mem1 && Mem2) {
10913 if (Mem1->getParent() != Mem2->getParent())
10917 if (Mem1->isInstance() && Mem2->isInstance() &&
10919 Mem1->getFunctionObjectParameterReferenceType(),
10920 Mem1->getFunctionObjectParameterReferenceType()))
10926static FunctionDecl *
10928 bool IsFn1Reversed,
bool IsFn2Reversed) {
10938 if (Cand1IsSpecialization || Cand2IsSpecialization)
10955 bool PartialOverloading) {
11001 bool IsCand1ImplicitHD =
11003 bool IsCand2ImplicitHD =
11018 auto EmitThreshold =
11019 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
11020 (IsCand1ImplicitHD || IsCand2ImplicitHD))
11023 auto Cand1Emittable = P1 > EmitThreshold;
11024 auto Cand2Emittable = P2 > EmitThreshold;
11025 if (Cand1Emittable && !Cand2Emittable)
11027 if (!Cand1Emittable && Cand2Emittable)
11038 unsigned StartArg = 0;
11046 return ICS.isStandard() &&
11058 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
11059 bool HasBetterConversion =
false;
11060 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11061 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
11062 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
11063 if (Cand1Bad != Cand2Bad) {
11066 HasBetterConversion =
true;
11070 if (HasBetterConversion)
11077 bool HasWorseConversion =
false;
11078 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11084 HasBetterConversion =
true;
11103 HasWorseConversion =
true;
11118 if (HasBetterConversion && !HasWorseConversion)
11169 bool Cand1IsSpecialization = Cand1.
Function &&
11171 bool Cand2IsSpecialization = Cand2.
Function &&
11173 if (Cand1IsSpecialization != Cand2IsSpecialization)
11174 return Cand2IsSpecialization;
11180 if (Cand1IsSpecialization && Cand2IsSpecialization) {
11181 const auto *Obj1Context =
11183 const auto *Obj2Context =
11212 bool Cand1IsInherited =
11214 bool Cand2IsInherited =
11216 if (Cand1IsInherited != Cand2IsInherited)
11217 return Cand2IsInherited;
11218 else if (Cand1IsInherited) {
11219 assert(Cand2IsInherited);
11222 if (Cand1Class->isDerivedFrom(Cand2Class))
11224 if (Cand2Class->isDerivedFrom(Cand1Class))
11241 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
11242 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
11243 if (Guide1 && Guide2) {
11245 if (Guide1->isImplicit() != Guide2->isImplicit())
11246 return Guide2->isImplicit();
11256 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
11257 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
11258 if (Constructor1 && Constructor2) {
11259 bool isC1Templated = Constructor1->getTemplatedKind() !=
11261 bool isC2Templated = Constructor2->getTemplatedKind() !=
11263 if (isC1Templated != isC2Templated)
11264 return isC2Templated;
11272 if (
Cmp != Comparison::Equal)
11273 return Cmp == Comparison::Better;
11276 bool HasPS1 = Cand1.
Function !=
nullptr &&
11278 bool HasPS2 = Cand2.
Function !=
nullptr &&
11280 if (HasPS1 != HasPS2 && HasPS1)
11284 if (MV == Comparison::Better)
11286 if (MV == Comparison::Worse)
11301 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
11302 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
11304 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
11305 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
11326 auto *VA = dyn_cast_or_null<ValueDecl>(A);
11327 auto *VB = dyn_cast_or_null<ValueDecl>(B);
11333 if (!VA->getDeclContext()->getRedeclContext()->Equals(
11334 VB->getDeclContext()->getRedeclContext()) ||
11336 VA->isExternallyVisible() || VB->isExternallyVisible())
11344 if (
Context.hasSameType(VA->getType(), VB->getType()))
11349 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
11350 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
11355 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
11356 !
Context.hasSameType(EnumA->getIntegerType(),
11357 EnumB->getIntegerType()))
11360 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
11370 assert(D &&
"Unknown declaration");
11371 Diag(Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) << D;
11377 for (
auto *E : Equiv) {
11379 Diag(E->getLocation(), diag::note_equivalent_internal_linkage_decl)
11389 ->Satisfaction.ContainsErrors;
11395 bool PartialOverloading,
bool AllowExplicit,
11397 bool AggregateCandidateDeduction) {
11400 allocateDeferredCandidate<DeferredFunctionTemplateOverloadCandidate>();
11405 false, AllowExplicit, SuppressUserConversions,
11406 PartialOverloading, AggregateCandidateDeduction},
11413 HasDeferredTemplateConstructors |=
11421 bool SuppressUserConversions,
bool PartialOverloading,
11427 allocateDeferredCandidate<DeferredMethodTemplateOverloadCandidate>();
11433 false, SuppressUserConversions, PartialOverloading,
11439 ObjectClassification,
11447 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
11448 bool AllowResultConversion) {
11451 allocateDeferredCandidate<DeferredConversionTemplateOverloadCandidate>();
11455 AllowObjCConversionOnExplicit, AllowResultConversion,
11472 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
11473 nullptr,
C.ObjectType,
C.ObjectClassification,
11474 C.Args,
C.SuppressUserConversions,
C.PartialOverloading,
C.PO);
11481 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
11482 nullptr,
C.Args,
C.SuppressUserConversions,
11483 C.PartialOverloading,
C.AllowExplicit,
C.IsADLCandidate,
C.PO,
11484 C.AggregateCandidateDeduction);
11491 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
C.From,
11492 C.ToType,
C.AllowObjCConversionOnExplicit,
C.AllowExplicit,
11493 C.AllowResultConversion);
11497 Candidates.reserve(Candidates.size() + DeferredCandidatesCount);
11500 switch (Cand->
Kind) {
11519 FirstDeferredCandidate =
nullptr;
11520 DeferredCandidatesCount = 0;
11524OverloadCandidateSet::ResultForBestCandidate(
const iterator &Best) {
11526 if (Best->Function && Best->Function->isDeleted())
11531void OverloadCandidateSet::CudaExcludeWrongSideCandidates(
11548 bool ContainsSameSideCandidate =
11556 if (!ContainsSameSideCandidate)
11559 auto IsWrongSideCandidate = [&](
const OverloadCandidate *Cand) {
11565 llvm::erase_if(Candidates, IsWrongSideCandidate);
11583 DeferredCandidatesCount == 0) &&
11584 "Unexpected deferred template candidates");
11586 bool TwoPhaseResolution =
11587 DeferredCandidatesCount != 0 && !ResolutionByPerfectCandidateIsDisabled;
11589 if (TwoPhaseResolution) {
11591 if (Best !=
end() && Best->isPerfectMatch(S.
Context)) {
11592 if (!(HasDeferredTemplateConstructors &&
11593 isa_and_nonnull<CXXConversionDecl>(Best->Function)))
11599 return BestViableFunctionImpl(S, Loc, Best);
11606 Candidates.reserve(this->Candidates.size());
11607 std::transform(this->Candidates.begin(), this->Candidates.end(),
11608 std::back_inserter(Candidates),
11612 CudaExcludeWrongSideCandidates(S, Candidates);
11615 for (
auto *Cand : Candidates) {
11616 Cand->
Best =
false;
11618 if (Best ==
end() ||
11635 llvm::SmallVector<OverloadCandidate *, 4> PendingBest;
11636 llvm::SmallVector<const NamedDecl *, 4> EquivalentCands;
11637 PendingBest.push_back(&*Best);
11642 while (!PendingBest.empty()) {
11643 auto *Curr = PendingBest.pop_back_val();
11644 for (
auto *Cand : Candidates) {
11647 PendingBest.push_back(Cand);
11652 EquivalentCands.push_back(Cand->
Function);
11664 if (!EquivalentCands.empty())
11672enum OverloadCandidateKind {
11675 oc_reversed_binary_operator,
11677 oc_implicit_default_constructor,
11678 oc_implicit_copy_constructor,
11679 oc_implicit_move_constructor,
11680 oc_implicit_copy_assignment,
11681 oc_implicit_move_assignment,
11682 oc_implicit_equality_comparison,
11683 oc_inherited_constructor
11686enum OverloadCandidateSelect {
11689 ocs_described_template,
11692static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
11693ClassifyOverloadCandidate(Sema &S,
const NamedDecl *
Found,
11694 const FunctionDecl *Fn,
11696 std::string &Description) {
11699 if (FunctionTemplateDecl *FunTmpl =
Fn->getPrimaryTemplate()) {
11702 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
11705 OverloadCandidateSelect Select = [&]() {
11706 if (!Description.empty())
11707 return ocs_described_template;
11708 return isTemplate ? ocs_template : ocs_non_template;
11711 OverloadCandidateKind Kind = [&]() {
11712 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
11713 return oc_implicit_equality_comparison;
11716 return oc_reversed_binary_operator;
11718 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
11719 if (!Ctor->isImplicit()) {
11721 return oc_inherited_constructor;
11723 return oc_constructor;
11726 if (Ctor->isDefaultConstructor())
11727 return oc_implicit_default_constructor;
11729 if (Ctor->isMoveConstructor())
11730 return oc_implicit_move_constructor;
11732 assert(Ctor->isCopyConstructor() &&
11733 "unexpected sort of implicit constructor");
11734 return oc_implicit_copy_constructor;
11737 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
11740 if (!Meth->isImplicit())
11743 if (Meth->isMoveAssignmentOperator())
11744 return oc_implicit_move_assignment;
11746 if (Meth->isCopyAssignmentOperator())
11747 return oc_implicit_copy_assignment;
11753 return oc_function;
11756 return std::make_pair(Kind, Select);
11759void MaybeEmitInheritedConstructorNote(Sema &S,
const Decl *FoundDecl) {
11762 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
11764 diag::note_ovl_candidate_inherited_constructor)
11765 << Shadow->getNominatedBaseClass();
11774 if (EnableIf->getCond()->isValueDependent() ||
11775 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
11792 bool InOverloadResolution,
11796 if (InOverloadResolution)
11798 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
11800 S.
Diag(Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
11811 if (InOverloadResolution) {
11814 TemplateArgString +=
" ";
11816 FunTmpl->getTemplateParameters(),
11821 diag::note_ovl_candidate_unsatisfied_constraints)
11822 << TemplateArgString;
11824 S.
Diag(Loc, diag::err_addrof_function_constraints_not_satisfied)
11833 return P->hasAttr<PassObjectSizeAttr>();
11840 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11841 if (InOverloadResolution)
11843 diag::note_ovl_candidate_has_pass_object_size_params)
11846 S.
Diag(Loc, diag::err_address_of_function_with_pass_object_size_params)
11862 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11870 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11875 if (!RD->isLambda())
11880 CallOp->getType()->castAs<
FunctionType>()->getCallConv();
11885 return ConvToCC != CallOpCC;
11891 QualType DestType,
bool TakingAddress) {
11894 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11895 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11897 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11898 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11903 std::string FnDesc;
11904 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11905 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11907 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11911 Diag(Fn->getLocation(), PD);
11912 MaybeEmitInheritedConstructorNote(*
this,
Found);
11930 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11931 for (
auto I = Cands.begin(), E = Cands.end(); I != E; ++I) {
11935 if (
auto *
Template = I->Function->getPrimaryTemplate())
11936 Template->getAssociatedConstraints(AC);
11938 I->Function->getAssociatedConstraints(AC);
11941 if (FirstCand ==
nullptr) {
11942 FirstCand = I->Function;
11944 }
else if (SecondCand ==
nullptr) {
11945 SecondCand = I->Function;
11958 SecondCand, SecondAC))
11967 bool TakingAddress) {
11977 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
11981 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
11994 S.
Diag(CaretLoc, PDiag)
11996 unsigned CandsShown = 0;
12010 unsigned I,
bool TakingCandidateAddress) {
12012 assert(Conv.
isBad());
12013 assert(Cand->
Function &&
"for now, candidate must be a function");
12019 bool isObjectArgument =
false;
12023 isObjectArgument =
true;
12028 std::string FnDesc;
12029 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12040 bool HasParamPack =
12041 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
12042 return Parm->isParameterPack();
12044 if (!isObjectArgument && !HasParamPack && I < Fn->getNumParams())
12045 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
12048 assert(FromExpr &&
"overload set argument came from implicit argument?");
12054 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
12055 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12056 << ToParamRange << ToTy << Name << I + 1;
12057 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12066 CToTy = RT->getPointeeType();
12071 CFromTy = FromPT->getPointeeType();
12072 CToTy = ToPT->getPointeeType();
12082 if (isObjectArgument)
12083 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
12084 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12087 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
12088 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12091 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12096 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
12097 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12100 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12105 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
12106 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12109 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12114 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ptrauth)
12115 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12120 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12125 assert(CVR &&
"expected qualifiers mismatch");
12127 if (isObjectArgument) {
12128 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
12129 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12130 << FromTy << (CVR - 1);
12132 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
12133 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12134 << ToParamRange << FromTy << (CVR - 1) << I + 1;
12136 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12142 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
12143 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12144 << (
unsigned)isObjectArgument << I + 1
12147 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12154 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
12155 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12156 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12161 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12173 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
12174 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12175 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12176 << (
unsigned)(Cand->
Fix.
Kind);
12178 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12183 unsigned BaseToDerivedConversion = 0;
12186 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12188 !FromPtrTy->getPointeeType()->isIncompleteType() &&
12189 !ToPtrTy->getPointeeType()->isIncompleteType() &&
12191 FromPtrTy->getPointeeType()))
12192 BaseToDerivedConversion = 1;
12200 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12202 FromIface->isSuperClassOf(ToIface))
12203 BaseToDerivedConversion = 2;
12205 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy,
12208 !ToRefTy->getPointeeType()->isIncompleteType() &&
12210 BaseToDerivedConversion = 3;
12214 if (BaseToDerivedConversion) {
12215 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
12216 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12217 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
12219 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12228 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
12229 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12230 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
12232 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12242 if (FromTy == S.
Context.AMDGPUFeaturePredicateTy &&
12245 diag::err_amdgcn_predicate_type_needs_explicit_bool_cast)
12252 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12253 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12254 << (
unsigned)(Cand->
Fix.
Kind);
12263 S.
Diag(Fn->getLocation(), FDiag);
12265 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12272 unsigned NumArgs,
bool IsAddressOf =
false) {
12273 assert(Cand->
Function &&
"Candidate is required to be a function.");
12275 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12276 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12283 if (Fn->isInvalidDecl() &&
12287 if (NumArgs < MinParams) {
12304 unsigned NumFormalArgs,
12305 bool IsAddressOf =
false) {
12307 "The templated declaration should at least be a function"
12308 " when diagnosing bad template argument deduction due to too many"
12309 " or too few arguments");
12315 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12316 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12319 bool HasExplicitObjectParam =
12320 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
12322 unsigned ParamCount =
12323 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12324 unsigned mode, modeCount;
12326 if (NumFormalArgs < MinParams) {
12327 if (MinParams != ParamCount || FnTy->isVariadic() ||
12328 FnTy->isTemplateVariadic())
12332 modeCount = MinParams;
12334 if (MinParams != ParamCount)
12338 modeCount = ParamCount;
12341 std::string Description;
12342 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12343 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
12345 unsigned FirstNonObjectParamIdx = HasExplicitObjectParam ? 1 : 0;
12346 if (modeCount == 1 && !IsAddressOf &&
12347 FirstNonObjectParamIdx < Fn->getNumParams() &&
12348 Fn->getParamDecl(FirstNonObjectParamIdx)->getDeclName())
12349 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
12350 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12351 << Description << mode << Fn->getParamDecl(FirstNonObjectParamIdx)
12352 << NumFormalArgs << HasExplicitObjectParam
12353 << Fn->getParametersSourceRange();
12355 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
12356 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12357 << Description << mode << modeCount << NumFormalArgs
12358 << HasExplicitObjectParam << Fn->getParametersSourceRange();
12360 MaybeEmitInheritedConstructorNote(S,
Found);
12365 unsigned NumFormalArgs) {
12366 assert(Cand->
Function &&
"Candidate must be a function");
12376 llvm_unreachable(
"Unsupported: Getting the described template declaration"
12377 " for bad deduction diagnosis");
12384 bool TakingCandidateAddress) {
12390 switch (DeductionFailure.
getResult()) {
12393 "TemplateDeductionResult::Success while diagnosing bad deduction");
12395 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
12396 "while diagnosing bad deduction");
12402 assert(ParamD &&
"no parameter found for incomplete deduction result");
12404 diag::note_ovl_candidate_incomplete_deduction)
12406 MaybeEmitInheritedConstructorNote(S,
Found);
12411 assert(ParamD &&
"no parameter found for incomplete deduction result");
12413 diag::note_ovl_candidate_incomplete_deduction_pack)
12415 << (DeductionFailure.
getFirstArg()->pack_size() + 1)
12417 MaybeEmitInheritedConstructorNote(S,
Found);
12422 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
12440 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
12441 << ParamD->
getDeclName() << Arg << NonCanonParam;
12442 MaybeEmitInheritedConstructorNote(S,
Found);
12447 assert(ParamD &&
"no parameter found for inconsistent deduction result");
12461 diag::note_ovl_candidate_inconsistent_deduction_types)
12464 MaybeEmitInheritedConstructorNote(S,
Found);
12484 diag::note_ovl_candidate_inconsistent_deduction)
12487 MaybeEmitInheritedConstructorNote(S,
Found);
12492 assert(ParamD &&
"no parameter found for invalid explicit arguments");
12495 diag::note_ovl_candidate_explicit_arg_mismatch);
12497 Diag << diag::ExplicitArgMismatchNameKind::Named << ParamD->
getDeclName();
12499 Diag << diag::ExplicitArgMismatchNameKind::Unnamed
12504 Diag << diag::ExplicitArgMismatchReasonKind::Detailed << DiagContent;
12506 Diag << diag::ExplicitArgMismatchReasonKind::Vague;
12509 MaybeEmitInheritedConstructorNote(S,
Found);
12516 TemplateArgString =
" ";
12519 if (TemplateArgString.size() == 1)
12520 TemplateArgString.clear();
12522 diag::note_ovl_candidate_unsatisfied_constraints)
12523 << TemplateArgString;
12526 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
12536 diag::note_ovl_candidate_instantiation_depth);
12537 MaybeEmitInheritedConstructorNote(S,
Found);
12545 TemplateArgString =
" ";
12548 if (TemplateArgString.size() == 1)
12549 TemplateArgString.clear();
12554 if (PDiag && PDiag->second.getDiagID() ==
12555 diag::err_typename_nested_not_found_enable_if) {
12558 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
12559 <<
"'enable_if'" << TemplateArgString;
12564 if (PDiag && PDiag->second.getDiagID() ==
12565 diag::err_typename_nested_not_found_requirement) {
12567 diag::note_ovl_candidate_disabled_by_requirement)
12568 << PDiag->second.getStringArg(0) << TemplateArgString;
12578 SFINAEArgString =
": ";
12580 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
12584 diag::note_ovl_candidate_substitution_failure)
12585 << TemplateArgString << SFINAEArgString << R;
12586 MaybeEmitInheritedConstructorNote(S,
Found);
12596 TemplateArgString =
" ";
12599 if (TemplateArgString.size() == 1)
12600 TemplateArgString.clear();
12603 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
12606 << TemplateArgString
12631 diag::note_ovl_candidate_non_deduced_mismatch_qualified)
12647 diag::note_ovl_candidate_non_deduced_mismatch)
12648 << FirstTA << SecondTA;
12654 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
12655 MaybeEmitInheritedConstructorNote(S,
Found);
12659 diag::note_cuda_ovl_candidate_target_mismatch);
12667 bool TakingCandidateAddress) {
12668 assert(Cand->
Function &&
"Candidate must be a function");
12683 assert(Cand->
Function &&
"Candidate must be a Function.");
12689 std::string FnDesc;
12690 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12691 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
12694 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
12695 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12697 << CalleeTarget << CallerTarget;
12702 if (Meth !=
nullptr && Meth->
isImplicit()) {
12706 switch (FnKindPair.first) {
12709 case oc_implicit_default_constructor:
12712 case oc_implicit_copy_constructor:
12715 case oc_implicit_move_constructor:
12718 case oc_implicit_copy_assignment:
12721 case oc_implicit_move_assignment:
12726 bool ConstRHS =
false;
12730 ConstRHS = RT->getPointeeType().isConstQualified();
12741 assert(Cand->
Function &&
"Candidate must be a function");
12745 S.
Diag(Callee->getLocation(),
12746 diag::note_ovl_candidate_disabled_by_function_cond_attr)
12747 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
12751 assert(Cand->
Function &&
"Candidate must be a function");
12754 assert(ES.
isExplicit() &&
"not an explicit candidate");
12757 switch (Fn->getDeclKind()) {
12758 case Decl::Kind::CXXConstructor:
12761 case Decl::Kind::CXXConversion:
12764 case Decl::Kind::CXXDeductionGuide:
12765 Kind = Fn->isImplicit() ? 0 : 2;
12768 llvm_unreachable(
"invalid Decl");
12777 First = Pattern->getFirstDecl();
12780 diag::note_ovl_candidate_explicit)
12781 << Kind << (ES.
getExpr() ? 1 : 0)
12786 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
12793 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
12795 std::string FunctionProto;
12796 llvm::raw_string_ostream OS(FunctionProto);
12809 "Non-template implicit deduction guides are only possible for "
12812 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12817 assert(
Template &&
"Cannot find the associated function template of "
12818 "CXXDeductionGuideDecl?");
12821 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12842 bool TakingCandidateAddress,
12844 assert(Cand->
Function &&
"Candidate must be a function");
12852 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
12859 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12864 if (Fn->isDeleted()) {
12865 std::string FnDesc;
12866 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12867 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12870 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12871 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12872 << (Fn->isDeleted()
12873 ? (Fn->getCanonicalDecl()->isDeletedAsWritten() ? 1 : 2)
12875 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12902 TakingCandidateAddress);
12905 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12906 << (Fn->getPrimaryTemplate() ? 1 : 0);
12907 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12914 S.
Diag(Fn->getLocation(),
12915 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12916 << QualsForPrinting;
12917 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12928 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
12951 S.
Diag(Fn->getLocation(),
12952 diag::note_ovl_candidate_inherited_constructor_slice)
12953 << (Fn->getPrimaryTemplate() ? 1 : 0)
12954 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
12955 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12961 assert(!Available);
12969 std::string FnDesc;
12970 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12971 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12974 S.
Diag(Fn->getLocation(),
12975 diag::note_ovl_candidate_constraints_not_satisfied)
12976 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12995 bool isLValueReference =
false;
12996 bool isRValueReference =
false;
12997 bool isPointer =
false;
13001 isLValueReference =
true;
13005 isRValueReference =
true;
13021 diag::note_ovl_surrogate_constraints_not_satisfied)
13035 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
13036 std::string TypeStr(
"operator");
13042 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13047 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13054 if (ICS.
isBad())
break;
13058 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
13075 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
13105 llvm_unreachable(
"Unhandled deduction result");
13110struct CompareOverloadCandidatesForDisplay {
13112 SourceLocation Loc;
13116 CompareOverloadCandidatesForDisplay(
13117 Sema &S, SourceLocation Loc,
size_t NArgs,
13119 : S(S), NumArgs(NArgs), CSK(CSK) {}
13129 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
13131 if (NumArgs < C->
Function->getMinRequiredArguments())
13138 bool operator()(
const OverloadCandidate *L,
13139 const OverloadCandidate *R) {
13141 if (L == R)
return false;
13145 if (!
R->Viable)
return true;
13147 if (
int Ord = CompareConversions(*L, *R))
13150 }
else if (
R->Viable)
13153 assert(L->
Viable ==
R->Viable);
13166 int RDist =
std::abs((
int)
R->getNumParams() - (
int)NumArgs);
13167 if (LDist == RDist) {
13168 if (LFailureKind == RFailureKind)
13176 return LDist < RDist;
13193 unsigned numRFixes =
R->Fix.NumConversionsFixed;
13194 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
13195 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
13196 if (numLFixes != numRFixes) {
13197 return numLFixes < numRFixes;
13201 if (
int Ord = CompareConversions(*L, *R))
13213 if (LRank != RRank)
13214 return LRank < RRank;
13240 struct ConversionSignals {
13241 unsigned KindRank = 0;
13244 static ConversionSignals ForSequence(ImplicitConversionSequence &
Seq) {
13245 ConversionSignals Sig;
13246 Sig.KindRank =
Seq.getKindRank();
13247 if (
Seq.isStandard())
13248 Sig.Rank =
Seq.Standard.getRank();
13249 else if (
Seq.isUserDefined())
13250 Sig.Rank =
Seq.UserDefined.After.getRank();
13256 static ConversionSignals ForObjectArgument() {
13266 int CompareConversions(
const OverloadCandidate &L,
13267 const OverloadCandidate &R) {
13272 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
13274 ? ConversionSignals::ForObjectArgument()
13275 : ConversionSignals::ForSequence(L.Conversions[I]);
13276 auto RS =
R.IgnoreObjectArgument
13277 ? ConversionSignals::ForObjectArgument()
13278 : ConversionSignals::ForSequence(
R.Conversions[I]);
13279 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
13280 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
13305 bool Unfixable =
false;
13311 for (
unsigned ConvIdx =
13315 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
13316 if (Cand->
Conversions[ConvIdx].isInitialized() &&
13325 bool SuppressUserConversions =
false;
13327 unsigned ConvIdx = 0;
13328 unsigned ArgIdx = 0;
13357 assert(ConvCount <= 3);
13363 ConvIdx != ConvCount && ArgIdx < Args.size();
13365 if (Cand->
Conversions[ConvIdx].isInitialized()) {
13367 }
else if (
ParamIdx < ParamTypes.size()) {
13368 if (ParamTypes[
ParamIdx]->isDependentType())
13369 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
13374 SuppressUserConversions,
13379 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
13398 for (
iterator Cand = Candidates.begin(), LastCand = Candidates.end();
13399 Cand != LastCand; ++Cand) {
13400 if (!Filter(*Cand))
13425 Cands.push_back(Cand);
13429 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
13436 bool DeferHint =
false;
13440 auto WrongSidedCands =
13442 return (Cand.
Viable ==
false &&
13448 DeferHint = !WrongSidedCands.empty();
13464 S.
Diag(PD.first, PD.second);
13469 bool NoteCands =
true;
13470 for (
const Expr *Arg : Args) {
13471 if (Arg->getType()->isWebAssemblyTableType())
13480 {Candidates.begin(), Candidates.end()});
13486 bool ReportedAmbiguousConversions =
false;
13489 unsigned CandsShown = 0;
13490 auto I = Cands.begin(), E = Cands.end();
13491 for (; I != E; ++I) {
13507 "Non-viable built-in candidates are not added to Cands.");
13514 if (!ReportedAmbiguousConversions) {
13516 ReportedAmbiguousConversions =
true;
13530 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13541struct CompareTemplateSpecCandidatesForDisplay {
13543 CompareTemplateSpecCandidatesForDisplay(Sema &S) : S(S) {}
13545 bool operator()(
const TemplateSpecCandidate *L,
13546 const TemplateSpecCandidate *R) {
13577 bool ForTakingAddress) {
13582void TemplateSpecCandidateSet::destroyCandidates() {
13584 i->DeductionFailure.Destroy();
13589 destroyCandidates();
13590 Candidates.clear();
13603 Cands.reserve(
size());
13604 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
13605 if (Cand->Specialization)
13606 Cands.push_back(Cand);
13611 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
13618 unsigned CandsShown = 0;
13619 for (I = Cands.begin(), E = Cands.end(); I != E; ++I) {
13625 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
13630 "Non-matching built-in candidates are not added to Cands.");
13635 S.
Diag(Loc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13645 QualType Ret = PossiblyAFunctionType;
13648 Ret = ToTypePtr->getPointeeType();
13651 Ret = ToTypeRef->getPointeeType();
13654 Ret = MemTypePtr->getPointeeType();
13656 Context.getCanonicalType(Ret).getUnqualifiedType();
13661 bool Complain =
true) {
13678class AddressOfFunctionResolver {
13681 const QualType& TargetType;
13682 QualType TargetFunctionType;
13686 ASTContext& Context;
13688 bool TargetTypeIsNonStaticMemberFunction;
13689 bool FoundNonTemplateFunction;
13690 bool StaticMemberFunctionFromBoundPointer;
13691 bool HasComplained;
13693 OverloadExpr::FindResult OvlExprInfo;
13694 OverloadExpr *OvlExpr;
13695 TemplateArgumentListInfo OvlExplicitTemplateArgs;
13696 SmallVector<std::pair<DeclAccessPair, FunctionDecl*>, 4> Matches;
13697 TemplateSpecCandidateSet FailedCandidates;
13700 AddressOfFunctionResolver(Sema &S, Expr *SourceExpr,
13701 const QualType &TargetType,
bool Complain)
13702 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
13703 Complain(Complain), Context(S.getASTContext()),
13704 TargetTypeIsNonStaticMemberFunction(
13705 !!TargetType->getAs<MemberPointerType>()),
13706 FoundNonTemplateFunction(
false),
13707 StaticMemberFunctionFromBoundPointer(
false),
13708 HasComplained(
false),
13709 OvlExprInfo(OverloadExpr::find(SourceExpr)),
13711 FailedCandidates(OvlExpr->getNameLoc(),
true) {
13712 ExtractUnqualifiedFunctionTypeFromTargetType();
13715 if (UnresolvedMemberExpr *UME = dyn_cast<UnresolvedMemberExpr>(OvlExpr))
13716 if (!UME->isImplicitAccess() &&
13718 StaticMemberFunctionFromBoundPointer =
true;
13720 DeclAccessPair dap;
13722 OvlExpr,
false, &dap)) {
13723 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn))
13724 if (!
Method->isStatic()) {
13728 TargetTypeIsNonStaticMemberFunction =
true;
13736 Matches.push_back(std::make_pair(dap, Fn));
13744 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
13747 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
13748 if (FoundNonTemplateFunction) {
13749 EliminateAllTemplateMatches();
13750 EliminateLessPartialOrderingConstrainedMatches();
13752 EliminateAllExceptMostSpecializedTemplate();
13757 EliminateSuboptimalCudaMatches();
13760 bool hasComplained()
const {
return HasComplained; }
13763 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
13770 bool isBetterCandidate(
const FunctionDecl *A,
const FunctionDecl *B) {
13774 return candidateHasExactlyCorrectType(A) &&
13775 (!candidateHasExactlyCorrectType(B) ||
13781 bool eliminiateSuboptimalOverloadCandidates() {
13784 auto Best = Matches.begin();
13785 for (
auto I = Matches.begin()+1, E = Matches.end(); I != E; ++I)
13786 if (isBetterCandidate(I->second, Best->second))
13789 const FunctionDecl *BestFn = Best->second;
13790 auto IsBestOrInferiorToBest = [
this, BestFn](
13791 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
13792 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
13797 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
13799 Matches[0] = *Best;
13804 bool isTargetTypeAFunction()
const {
13813 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
13819 const DeclAccessPair& CurAccessFunPair) {
13820 if (CXXMethodDecl *
Method
13824 bool CanConvertToFunctionPointer =
13825 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13826 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13829 else if (TargetTypeIsNonStaticMemberFunction)
13839 TemplateDeductionInfo Info(FailedCandidates.
getLocation());
13843 Result != TemplateDeductionResult::Success) {
13861 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
13865 bool AddMatchingNonTemplateFunction(NamedDecl* Fn,
13866 const DeclAccessPair& CurAccessFunPair) {
13867 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn)) {
13870 bool CanConvertToFunctionPointer =
13871 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13872 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13875 else if (TargetTypeIsNonStaticMemberFunction)
13878 if (FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13885 if (FunDecl->isMultiVersion()) {
13886 const auto *TA = FunDecl->getAttr<TargetAttr>();
13887 if (TA && !TA->isDefaultVersion())
13889 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13890 if (TVA && !TVA->isDefaultVersion())
13898 HasComplained |= Complain;
13907 candidateHasExactlyCorrectType(FunDecl)) {
13908 Matches.push_back(std::make_pair(
13910 FoundNonTemplateFunction =
true;
13918 bool FindAllFunctionsThatMatchTargetTypeExactly() {
13923 if (IsInvalidFormOfPointerToMemberFunction())
13926 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
13930 NamedDecl *
Fn = (*I)->getUnderlyingDecl();
13939 = dyn_cast<FunctionTemplateDecl>(Fn)) {
13945 AddMatchingNonTemplateFunction(Fn, I.getPair()))
13948 assert(Ret || Matches.empty());
13952 void EliminateAllExceptMostSpecializedTemplate() {
13964 UnresolvedSet<4> MatchesCopy;
13965 for (
unsigned I = 0, E = Matches.size(); I != E; ++I)
13966 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
13971 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
13973 S.
PDiag(diag::err_addr_ovl_ambiguous)
13974 << Matches[0].second->getDeclName(),
13975 S.
PDiag(diag::note_ovl_candidate)
13976 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
13977 Complain, TargetFunctionType);
13981 Matches[0].first = Matches[
Result - MatchesCopy.
begin()].first;
13985 HasComplained |= Complain;
13988 void EliminateAllTemplateMatches() {
13991 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
13992 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
13995 Matches[I] = Matches[--N];
14001 void EliminateLessPartialOrderingConstrainedMatches() {
14006 assert(Matches[0].second->getPrimaryTemplate() ==
nullptr &&
14007 "Call EliminateAllTemplateMatches() first");
14008 SmallVector<std::pair<DeclAccessPair, FunctionDecl *>, 4> Results;
14009 Results.push_back(Matches[0]);
14010 for (
unsigned I = 1, N = Matches.size(); I < N; ++I) {
14011 assert(Matches[I].second->getPrimaryTemplate() ==
nullptr);
14013 S, Matches[I].second, Results[0].second,
14017 Results.push_back(Matches[I]);
14020 if (F == Matches[I].second) {
14022 Results.push_back(Matches[I]);
14025 std::swap(Matches, Results);
14028 void EliminateSuboptimalCudaMatches() {
14034 void ComplainNoMatchesFound()
const {
14035 assert(Matches.empty());
14037 << OvlExpr->
getName() << TargetFunctionType
14039 if (FailedCandidates.
empty())
14046 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
14049 if (FunctionDecl *Fun =
14050 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
14058 bool IsInvalidFormOfPointerToMemberFunction()
const {
14059 return TargetTypeIsNonStaticMemberFunction &&
14063 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
14071 bool IsStaticMemberFunctionFromBoundPointer()
const {
14072 return StaticMemberFunctionFromBoundPointer;
14075 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
14077 diag::err_invalid_form_pointer_member_function)
14081 void ComplainOfInvalidConversion()
const {
14083 << OvlExpr->
getName() << TargetType;
14086 void ComplainMultipleMatchesFound()
const {
14087 assert(Matches.size() > 1);
14094 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
14096 int getNumMatches()
const {
return Matches.size(); }
14098 FunctionDecl* getMatchingFunctionDecl()
const {
14099 if (Matches.size() != 1)
return nullptr;
14100 return Matches[0].second;
14103 const DeclAccessPair* getMatchingFunctionAccessPair()
const {
14104 if (Matches.size() != 1)
return nullptr;
14105 return &Matches[0].first;
14115 bool *pHadMultipleCandidates) {
14118 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
14120 int NumMatches = Resolver.getNumMatches();
14122 bool ShouldComplain = Complain && !Resolver.hasComplained();
14123 if (NumMatches == 0 && ShouldComplain) {
14124 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
14125 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
14127 Resolver.ComplainNoMatchesFound();
14129 else if (NumMatches > 1 && ShouldComplain)
14130 Resolver.ComplainMultipleMatchesFound();
14131 else if (NumMatches == 1) {
14132 Fn = Resolver.getMatchingFunctionDecl();
14136 FoundResult = *Resolver.getMatchingFunctionAccessPair();
14138 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
14139 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
14145 if (pHadMultipleCandidates)
14146 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
14154 bool IsResultAmbiguous =
false;
14162 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
14163 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
14170 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
14178 auto FoundBetter = [&]() {
14179 IsResultAmbiguous =
false;
14191 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
14193 if (PreferenceByCUDA != 0) {
14195 if (PreferenceByCUDA > 0)
14211 if (MoreConstrained != FD) {
14212 if (!MoreConstrained) {
14213 IsResultAmbiguous =
true;
14214 AmbiguousDecls.push_back(FD);
14223 if (IsResultAmbiguous)
14244 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
14246 assert(E->
getType() ==
Context.OverloadTy &&
"SrcExpr must be an overload");
14250 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
14251 Found->isCPUSpecificMultiVersion())
14299 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
14330 if (ForTypeDeduction &&
14344 if (FoundResult) *FoundResult = I.getPair();
14355 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
14357 unsigned DiagIDForComplaining) {
14378 if (!complain)
return false;
14381 diag::err_bound_member_function)
14394 SingleFunctionExpression =
14398 if (doFunctionPointerConversion) {
14399 SingleFunctionExpression =
14401 if (SingleFunctionExpression.
isInvalid()) {
14408 if (!SingleFunctionExpression.
isUsable()) {
14410 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
14412 << DestTypeForComplaining
14413 << OpRangeForComplaining
14424 SrcExpr = SingleFunctionExpression;
14434 bool PartialOverloading,
14441 if (ExplicitTemplateArgs) {
14442 assert(!KnownValid &&
"Explicit template arguments?");
14451 PartialOverloading);
14456 = dyn_cast<FunctionTemplateDecl>(Callee)) {
14458 ExplicitTemplateArgs, Args, CandidateSet,
14460 PartialOverloading);
14464 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
14470 bool PartialOverloading) {
14493 assert(!(*I)->getDeclContext()->isRecord());
14495 !(*I)->getDeclContext()->isFunctionOrMethod());
14496 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
14506 ExplicitTemplateArgs = &TABuffer;
14512 CandidateSet, PartialOverloading,
14517 Args, ExplicitTemplateArgs,
14518 CandidateSet, PartialOverloading);
14526 CandidateSet,
false,
false);
14533 case OO_New:
case OO_Array_New:
14534 case OO_Delete:
case OO_Array_Delete:
14557 if (DC->isTransparentContext())
14563 R.suppressDiagnostics();
14573 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
14578 if (FoundInClass) {
14579 *FoundInClass = RD;
14582 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
14599 AssociatedNamespaces,
14600 AssociatedClasses);
14604 for (Sema::AssociatedNamespaceSet::iterator
14605 it = AssociatedNamespaces.begin(),
14606 end = AssociatedNamespaces.end(); it !=
end; ++it) {
14618 SuggestedNamespaces.insert(*it);
14622 SemaRef.
Diag(R.getNameLoc(), diag::err_not_found_by_two_phase_lookup)
14623 << R.getLookupName();
14624 if (SuggestedNamespaces.empty()) {
14625 SemaRef.
Diag(Best->Function->getLocation(),
14626 diag::note_not_found_by_two_phase_lookup)
14627 << R.getLookupName() << 0;
14628 }
else if (SuggestedNamespaces.size() == 1) {
14629 SemaRef.
Diag(Best->Function->getLocation(),
14630 diag::note_not_found_by_two_phase_lookup)
14631 << R.getLookupName() << 1 << *SuggestedNamespaces.begin();
14636 SemaRef.
Diag(Best->Function->getLocation(),
14637 diag::note_not_found_by_two_phase_lookup)
14638 << R.getLookupName() << 2;
14669class BuildRecoveryCallExprRAII {
14671 Sema::SatisfactionStackResetRAII SatStack;
14674 BuildRecoveryCallExprRAII(Sema &S) : SemaRef(S), SatStack(S) {
14696 bool EmptyLookup,
bool AllowTypoCorrection) {
14704 BuildRecoveryCallExprRAII RCE(SemaRef);
14714 ExplicitTemplateArgs = &TABuffer;
14722 ExplicitTemplateArgs, Args, &FoundInClass)) {
14724 }
else if (EmptyLookup) {
14729 ExplicitTemplateArgs !=
nullptr,
14730 dyn_cast<MemberExpr>(Fn));
14732 AllowTypoCorrection
14738 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
14753 assert(!R.empty() &&
"lookup results empty despite recovery");
14756 if (R.isAmbiguous()) {
14757 R.suppressDiagnostics();
14764 if ((*R.begin())->isCXXClassMember())
14766 ExplicitTemplateArgs, S);
14767 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
14769 ExplicitTemplateArgs);
14793 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
14800 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
14802 llvm_unreachable(
"performing ADL for builtin");
14809 UnbridgedCastsSet UnbridgedCasts;
14824 if (CandidateSet->
empty() ||
14840 if (CandidateSet->
empty())
14843 UnbridgedCasts.restore();
14850 std::optional<QualType>
Result;
14870 if (Best && *Best != CS.
end())
14871 ConsiderCandidate(**Best);
14874 for (
const auto &
C : CS)
14876 ConsiderCandidate(
C);
14879 for (
const auto &
C : CS)
14880 ConsiderCandidate(
C);
14885 if (
Value.isNull() ||
Value->isUndeducedType())
14902 bool AllowTypoCorrection) {
14903 switch (OverloadResult) {
14914 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14920 if (*Best != CandidateSet->
end() &&
14924 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
14929 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
14939 CandidateSet->
empty(),
14940 AllowTypoCorrection);
14947 for (
const Expr *Arg : Args) {
14948 if (!Arg->getType()->isFunctionType())
14950 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
14951 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
14954 Arg->getExprLoc()))
14962 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
14963 << ULE->
getName() << Fn->getSourceRange()),
14971 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
14972 << ULE->
getName() << Fn->getSourceRange()),
14979 Fn->getSourceRange(), ULE->
getName(),
14980 *CandidateSet, FDecl, Args);
14989 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14997 SubExprs.append(Args.begin(), Args.end());
15004 for (
auto I = CS.
begin(), E = CS.
end(); I != E; ++I) {
15019 bool AllowTypoCorrection,
15020 bool CalleesAddressIsTaken) {
15035 if (CalleesAddressIsTaken)
15046 Best != CandidateSet.
end()) {
15047 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
15048 M && M->isImplicitObjectMemberFunction()) {
15059 CUDA().recordPotentialODRUsedVariable(Args, CandidateSet);
15077 if (
const auto *TP =
15087 ExecConfig, &CandidateSet, &Best,
15088 OverloadResult, AllowTypoCorrection);
15097 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
15103 bool HadMultipleCandidates) {
15113 if (
Method->isExplicitObjectMemberFunction())
15117 E, std::nullopt, FoundDecl,
Method);
15121 if (
Method->getParent()->isLambda() &&
15122 Method->getConversionType()->isBlockPointerType()) {
15126 auto *CE = dyn_cast<CastExpr>(SubE);
15127 if (CE && CE->getCastKind() == CK_NoOp)
15128 SubE = CE->getSubExpr();
15130 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
15131 SubE = BE->getSubExpr();
15154 if (
Method->isExplicitObjectMemberFunction()) {
15160 Expr *ObjectParam = Exp.
get();
15174 Exp.
get()->getEndLoc(),
15188 Expr *Input,
bool PerformADL) {
15190 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15198 Expr *Args[2] = { Input,
nullptr };
15199 unsigned NumArgs = 1;
15204 if (Opc == UO_PostInc || Opc == UO_PostDec) {
15218 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
15229 if (Fn.isInvalid())
15255 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15274 if (
Method->isExplicitObjectMemberFunction())
15278 Input, std::nullopt, Best->FoundDecl,
Method);
15281 Base = Input = InputInit.
get();
15292 Input = InputInit.
get();
15297 Base, HadMultipleCandidates,
15309 Context, Op, FnExpr.
get(), ArgsArray, ResultTy,
VK, OpLoc,
15325 Input, Best->BuiltinParamTypes[0], Best->Conversions[0],
15330 Input = InputRes.
get();
15350 PDiag(diag::err_ovl_ambiguous_oper_unary)
15367 << (Msg !=
nullptr)
15368 << (Msg ? Msg->
getString() : StringRef())
15421 if (Op != OO_Equal && PerformADL) {
15428 Context.DeclarationNames.getCXXOperatorName(ExtraOp);
15454 Expr *RHS,
bool PerformADL,
15455 bool AllowRewrittenCandidates,
15457 Expr *Args[2] = { LHS, RHS };
15461 AllowRewrittenCandidates =
false;
15467 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
15488 if (Fn.isInvalid())
15497 if (Opc == BO_PtrMemD) {
15498 auto CheckPlaceholder = [&](
Expr *&Arg) {
15507 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
15528 if (Opc == BO_Assign && !Args[0]->
getType()->isOverloadableType())
15534 Op, OpLoc, AllowRewrittenCandidates));
15536 CandidateSet.
exclude(DefaultedFn);
15539 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15548 bool IsReversed = Best->isReversed();
15550 std::swap(Args[0], Args[1]);
15567 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
15571 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
15572 : diag::err_ovl_rewrite_equalequal_not_bool)
15580 if (AllowRewrittenCandidates && !IsReversed &&
15590 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
15593 Best->Conversions[ArgIdx]) ==
15595 AmbiguousWith.push_back(Cand.
Function);
15602 if (!AmbiguousWith.empty()) {
15603 bool AmbiguousWithSelf =
15604 AmbiguousWith.size() == 1 &&
15606 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
15608 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
15610 if (AmbiguousWithSelf) {
15612 diag::note_ovl_ambiguous_oper_binary_reversed_self);
15617 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
15618 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
15620 !MD->hasCXXExplicitFunctionObjectParameter() &&
15621 Context.hasSameUnqualifiedType(
15622 MD->getFunctionObjectParameterType(),
15623 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
15624 Context.hasSameUnqualifiedType(
15625 MD->getFunctionObjectParameterType(),
15627 Context.hasSameUnqualifiedType(
15628 MD->getFunctionObjectParameterType(),
15631 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
15634 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
15635 for (
auto *F : AmbiguousWith)
15637 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
15645 if (Op == OO_Equal)
15656 if (
Method->isExplicitObjectMemberFunction()) {
15661 Args[0], std::nullopt, Best->FoundDecl,
Method);
15694 Best->FoundDecl,
Base,
15695 HadMultipleCandidates, OpLoc);
15706 const Expr *ImplicitThis =
nullptr;
15711 Context, ChosenOp, FnExpr.
get(), Args, ResultTy,
VK, OpLoc,
15716 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(FnDecl);
15719 ImplicitThis = ArgsArray[0];
15720 ArgsArray = ArgsArray.slice(1);
15727 if (Op == OO_Equal) {
15732 *
this,
AssignedEntity{Args[0], dyn_cast<CXXMethodDecl>(FnDecl)},
15735 if (ImplicitThis) {
15740 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
15744 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
15759 (Op == OO_Spaceship && IsReversed)) {
15760 if (Op == OO_ExclaimEqual) {
15761 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
15764 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
15766 Expr *ZeroLiteral =
15775 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.get(),
15776 IsReversed ? R.get() : ZeroLiteral,
true,
15784 assert(ChosenOp == Op &&
"unexpected operator name");
15788 if (Best->RewriteKind !=
CRK_None)
15797 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15802 Args[0] = ArgsRes0.
get();
15805 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15810 Args[1] = ArgsRes1.
get();
15820 if (Opc == BO_Comma)
15825 if (DefaultedFn && Opc == BO_Cmp) {
15827 Args[1], DefaultedFn);
15842 Opc >= BO_Assign && Opc <= BO_OrAssign) {
15843 Diag(OpLoc, diag::err_ovl_no_viable_oper)
15846 if (Args[0]->
getType()->isIncompleteType()) {
15847 Diag(OpLoc, diag::note_assign_lhs_incomplete)
15863 assert(
Result.isInvalid() &&
15864 "C++ binary operator overloading is missing candidates!");
15875 << Args[0]->getSourceRange()
15876 << Args[1]->getSourceRange()),
15886 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
15890 Diag(OpLoc, diag::err_ovl_deleted_comparison)
15891 << Args[0]->
getType() << DeletedFD;
15904 PDiag(diag::err_ovl_deleted_oper)
15906 .getCXXOverloadedOperator())
15907 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
15908 << Args[0]->getSourceRange() << Args[1]->getSourceRange()),
15932 "cannot use prvalue expressions more than once");
15933 Expr *OrigLHS = LHS;
15934 Expr *OrigRHS = RHS;
15951 true, DefaultedFn);
15952 if (
Less.isInvalid())
15979 for (; I >= 0; --I) {
15981 auto *VI = Info->lookupValueInfo(Comparisons[I].
Result);
16004 Context, OrigLHS, OrigRHS, BO_Cmp,
Result.get()->getType(),
16005 Result.get()->getValueKind(),
Result.get()->getObjectKind(), OpLoc,
16007 Expr *SemanticForm[] = {LHS, RHS,
Result.get()};
16017 unsigned NumArgsSlots =
16018 MethodArgs.size() + std::max<unsigned>(Args.size(), NumParams);
16021 MethodArgs.reserve(MethodArgs.size() + NumArgsSlots);
16022 bool IsError =
false;
16025 for (
unsigned i = 0; i != NumParams; i++) {
16027 if (i < Args.size()) {
16031 S.
Context, Method->getParamDecl(i)),
16045 MethodArgs.push_back(Arg);
16055 Args.push_back(
Base);
16056 for (
auto *e : ArgExpr) {
16060 Context.DeclarationNames.getCXXOperatorName(OO_Subscript);
16065 ArgExpr.back()->getEndLoc());
16077 if (Fn.isInvalid())
16087 UnbridgedCastsSet UnbridgedCasts;
16100 if (Args.size() == 2)
16103 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16123 if (
Method->isExplicitObjectMemberFunction()) {
16128 Args[0] = Res.
get();
16132 Args[0], std::nullopt, Best->FoundDecl,
Method);
16136 MethodArgs.push_back(Arg0.
get());
16140 *
this, MethodArgs,
Method, ArgExpr, LLoc);
16148 *
this, FnDecl, Best->FoundDecl,
Base, HadMultipleCandidates,
16159 Context, OO_Subscript, FnExpr.
get(), MethodArgs, ResultTy,
VK, RLoc,
16176 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
16181 Args[0] = ArgsRes0.
get();
16184 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
16189 Args[1] = ArgsRes1.
get();
16197 CandidateSet.
empty()
16198 ? (
PDiag(diag::err_ovl_no_oper)
16199 << Args[0]->getType() << 0
16200 << Args[0]->getSourceRange() << Range)
16201 : (
PDiag(diag::err_ovl_no_viable_subscript)
16202 << Args[0]->getType() << Args[0]->getSourceRange() << Range);
16209 if (Args.size() == 2) {
16212 LLoc,
PDiag(diag::err_ovl_ambiguous_oper_binary)
16214 << Args[0]->getSourceRange() << Range),
16219 PDiag(diag::err_ovl_ambiguous_subscript_call)
16221 << Args[0]->getSourceRange() << Range),
16230 PDiag(diag::err_ovl_deleted_oper)
16231 <<
"[]" << (Msg !=
nullptr)
16232 << (Msg ? Msg->
getString() : StringRef())
16233 << Args[0]->getSourceRange() << Range),
16247 Expr *ExecConfig,
bool IsExecConfig,
16248 bool AllowRecovery) {
16257 if (
BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
16258 assert(op->getType() ==
Context.BoundMemberTy);
16259 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
16272 QualType objectType = op->getLHS()->getType();
16273 if (op->getOpcode() == BO_PtrMemI)
16277 Qualifiers difference = objectQuals - funcQuals;
16281 std::string qualsString = difference.
getAsString();
16282 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
16285 << (qualsString.find(
' ') == std::string::npos ? 1 : 2);
16289 Context, MemExprE, Args, resultType, valueKind, RParenLoc,
16299 if (CheckOtherCall(call, proto))
16309 if (!AllowRecovery)
16311 std::vector<Expr *> SubExprs = {MemExprE};
16312 llvm::append_range(SubExprs, Args);
16320 UnbridgedCastsSet UnbridgedCasts;
16326 bool HadMultipleCandidates =
false;
16334 UnbridgedCasts.restore();
16352 TemplateArgs = &TemplateArgsBuffer;
16356 E = UnresExpr->
decls_end(); I != E; ++I) {
16358 QualType ExplicitObjectType = ObjectType;
16365 bool HasExplicitParameter =
false;
16366 if (
const auto *M = dyn_cast<FunctionDecl>(
Func);
16367 M && M->hasCXXExplicitFunctionObjectParameter())
16368 HasExplicitParameter =
true;
16369 else if (
const auto *M = dyn_cast<FunctionTemplateDecl>(
Func);
16371 M->getTemplatedDecl()->hasCXXExplicitFunctionObjectParameter())
16372 HasExplicitParameter =
true;
16374 if (HasExplicitParameter)
16382 }
else if ((
Method = dyn_cast<CXXMethodDecl>(
Func))) {
16389 ObjectClassification, Args, CandidateSet,
16393 I.getPair(), ActingDC, TemplateArgs,
16394 ExplicitObjectType, ObjectClassification,
16395 Args, CandidateSet,
16400 HadMultipleCandidates = (CandidateSet.
size() > 1);
16404 UnbridgedCasts.restore();
16407 bool Succeeded =
false;
16412 FoundDecl = Best->FoundDecl;
16432 PDiag(diag::err_ovl_no_viable_member_function_in_call)
16439 PDiag(diag::err_ovl_ambiguous_member_call)
16446 CandidateSet, Best->Function, Args,
true);
16457 MemExprE = Res.
get();
16461 if (
Method->isStatic()) {
16463 ExecConfig, IsExecConfig);
16473 assert(
Method &&
"Member call to something that isn't a method?");
16478 if (
Method->isExplicitObjectMemberFunction()) {
16486 HadMultipleCandidates, MemExpr->
getExprLoc());
16493 TheCall->setUsesMemberSyntax(
true);
16503 Proto->getNumParams());
16509 return BuildRecoveryExpr(ResultType);
16514 return BuildRecoveryExpr(ResultType);
16524 if (
auto *MemE = dyn_cast<MemberExpr>(NakedMemExpr)) {
16525 if (
const EnableIfAttr *
Attr =
16527 Diag(MemE->getMemberLoc(),
16528 diag::err_ovl_no_viable_member_function_in_call)
16531 diag::note_ovl_candidate_disabled_by_function_cond_attr)
16532 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
16538 TheCall->getDirectCallee()->isPureVirtual()) {
16544 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
16555 if (
auto *DD = dyn_cast<CXXDestructorDecl>(TheCall->getDirectCallee())) {
16559 CallCanBeVirtual,
true,
16564 TheCall->getDirectCallee());
16576 UnbridgedCastsSet UnbridgedCasts;
16580 assert(
Object.get()->getType()->isRecordType() &&
16581 "Requires object type argument");
16595 diag::err_incomplete_object_call,
Object.get()))
16598 auto *
Record =
Object.get()->getType()->castAsCXXRecordDecl();
16601 R.suppressAccessDiagnostics();
16604 Oper != OperEnd; ++Oper) {
16618 bool IgnoreSurrogateFunctions =
false;
16621 if (!Candidate.
Viable &&
16623 IgnoreSurrogateFunctions =
true;
16645 !IgnoreSurrogateFunctions && I != E; ++I) {
16667 Object.get(), Args, CandidateSet);
16672 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16685 CandidateSet.
empty()
16686 ? (
PDiag(diag::err_ovl_no_oper)
16687 <<
Object.get()->getType() << 1
16688 <<
Object.get()->getSourceRange())
16689 : (
PDiag(diag::err_ovl_no_viable_object_call)
16690 <<
Object.get()->getType() <<
Object.get()->getSourceRange());
16697 if (!R.isAmbiguous())
16700 PDiag(diag::err_ovl_ambiguous_object_call)
16701 <<
Object.get()->getType()
16702 <<
Object.get()->getSourceRange()),
16713 PDiag(diag::err_ovl_deleted_object_call)
16714 <<
Object.get()->getType() << (Msg !=
nullptr)
16715 << (Msg ? Msg->
getString() : StringRef())
16716 <<
Object.get()->getSourceRange()),
16722 if (Best == CandidateSet.
end())
16725 UnbridgedCasts.restore();
16727 if (Best->Function ==
nullptr) {
16732 Best->Conversions[0].UserDefined.ConversionFunction);
16738 assert(Conv == Best->FoundDecl.getDecl() &&
16739 "Found Decl & conversion-to-functionptr should be same, right?!");
16747 Conv, HadMultipleCandidates);
16748 if (
Call.isInvalid())
16752 Context,
Call.get()->getType(), CK_UserDefinedConversion,
Call.get(),
16766 if (
Method->isInvalidDecl())
16773 Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc);
16776 Obj, HadMultipleCandidates,
16783 MethodArgs.reserve(NumParams + 1);
16785 bool IsError =
false;
16789 if (
Method->isExplicitObjectMemberFunction()) {
16798 MethodArgs.push_back(
Object.get());
16802 *
this, MethodArgs,
Method, Args, LParenLoc);
16805 if (Proto->isVariadic()) {
16807 for (
unsigned i = NumParams, e = Args.size(); i < e; i++) {
16811 MethodArgs.push_back(Arg.
get());
16826 Context, OO_Call, NewFn.
get(), MethodArgs, ResultTy,
VK, RParenLoc,
16840 bool *NoArrowOperatorFound) {
16841 assert(
Base->getType()->isRecordType() &&
16842 "left-hand side must have class type");
16856 Context.DeclarationNames.getCXXOperatorName(OO_Arrow);
16860 diag::err_typecheck_incomplete_tag,
Base))
16865 R.suppressAccessDiagnostics();
16868 Oper != OperEnd; ++Oper) {
16874 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16885 if (CandidateSet.
empty()) {
16887 if (NoArrowOperatorFound) {
16890 *NoArrowOperatorFound =
true;
16893 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
16894 << BaseType <<
Base->getSourceRange();
16895 if (BaseType->isRecordType() && !BaseType->isPointerType()) {
16896 Diag(OpLoc, diag::note_typecheck_member_reference_suggestion)
16900 Diag(OpLoc, diag::err_ovl_no_viable_oper)
16901 <<
"operator->" <<
Base->getSourceRange();
16906 if (!R.isAmbiguous())
16909 <<
"->" <<
Base->getType()
16910 <<
Base->getSourceRange()),
16918 <<
"->" << (Msg !=
nullptr)
16919 << (Msg ? Msg->
getString() : StringRef())
16920 <<
Base->getSourceRange()),
16931 if (
Method->isExplicitObjectMemberFunction()) {
16938 Base, std::nullopt, Best->FoundDecl,
Method);
16946 Base, HadMultipleCandidates, OpLoc);
16980 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16993 PDiag(diag::err_ovl_no_viable_function_in_call)
16994 << R.getLookupName()),
17001 << R.getLookupName()),
17008 nullptr, HadMultipleCandidates,
17011 if (Fn.isInvalid())
17017 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
17023 ConvArgs[ArgIdx] = InputInit.
get();
17050 Scope *S =
nullptr;
17053 if (!MemberLookup.
empty()) {
17080 if (CandidateSet->
empty() || CandidateSetError) {
17093 Loc,
nullptr, CandidateSet, &Best,
17106 if (
ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
17111 if (SubExpr.
get() == PE->getSubExpr())
17115 ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.
get());
17123 assert(
Context.hasSameType(ICE->getSubExpr()->getType(),
17125 "Implicit cast type cannot be determined from overload");
17126 assert(ICE->path_empty() &&
"fixing up hierarchy conversion?");
17127 if (SubExpr.
get() == ICE->getSubExpr())
17135 if (
auto *GSE = dyn_cast<GenericSelectionExpr>(E)) {
17136 if (!GSE->isResultDependent()) {
17141 if (SubExpr.
get() == GSE->getResultExpr())
17148 unsigned ResultIdx = GSE->getResultIndex();
17149 AssocExprs[ResultIdx] = SubExpr.
get();
17151 if (GSE->isExprPredicate())
17153 Context, GSE->getGenericLoc(), GSE->getControllingExpr(),
17154 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17155 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17158 Context, GSE->getGenericLoc(), GSE->getControllingType(),
17159 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17160 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17169 assert(UnOp->getOpcode() == UO_AddrOf &&
17170 "Can only take the address of an overloaded function");
17172 if (!
Method->isImplicitObjectMemberFunction()) {
17183 if (SubExpr.
get() == UnOp->getSubExpr())
17191 "fixed to something other than a decl ref");
17194 assert(Qualifier &&
17195 "fixed to a member ref with no nested name qualifier");
17201 Fn->getType(), Qualifier,
17204 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
17209 UnOp->getOperatorLoc(),
false,
17217 if (SubExpr.
get() == UnOp->getSubExpr())
17230 if (ULE->hasExplicitTemplateArgs()) {
17231 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
17232 TemplateArgs = &TemplateArgsBuffer;
17237 getLangOpts().CPlusPlus && !Fn->hasCXXExplicitFunctionObjectParameter()
17242 if (
unsigned BID = Fn->getBuiltinID()) {
17243 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
17250 Fn,
Type, ValueKind, ULE->getNameInfo(), ULE->getQualifierLoc(),
17251 Found.getDecl(), ULE->getTemplateKeywordLoc(), TemplateArgs);
17259 if (MemExpr->hasExplicitTemplateArgs()) {
17260 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
17261 TemplateArgs = &TemplateArgsBuffer;
17268 if (MemExpr->isImplicitAccess()) {
17271 Fn, Fn->getType(),
VK_LValue, MemExpr->getNameInfo(),
17272 MemExpr->getQualifierLoc(),
Found.getDecl(),
17273 MemExpr->getTemplateKeywordLoc(), TemplateArgs);
17278 if (MemExpr->getQualifier())
17279 Loc = MemExpr->getQualifierLoc().getBeginLoc();
17284 Base = MemExpr->getBase();
17290 type = Fn->getType();
17297 Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),
17298 MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn,
Found,
17299 true, MemExpr->getMemberNameInfo(),
17303 llvm_unreachable(
"Invalid reference to overloaded function");
17314 if (!PartialOverloading || !
Function)
17318 if (
const auto *Proto =
17319 dyn_cast<FunctionProtoType>(
Function->getFunctionType()))
17320 if (Proto->isTemplateVariadic())
17322 if (
auto *Pattern =
Function->getTemplateInstantiationPattern())
17323 if (
const auto *Proto =
17324 dyn_cast<FunctionProtoType>(Pattern->getFunctionType()))
17325 if (Proto->isTemplateVariadic())
17338 << IsMember << Name << (Msg !=
nullptr)
17339 << (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 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.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents an ObjC class declaration.
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCMethodDecl - Represents an instance or class method declaration.
Represents a pointer to an Objective C object.
bool isSpecialized() const
Whether this type is specialized, meaning that it has type arguments.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
void clear(CandidateSetKind CSK)
Clear out all of the candidates.
void AddDeferredTemplateCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, bool AllowExplicit, CallExpr::ADLCallKind IsADLCandidate, OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction)
bool isNewCandidate(Decl *F, OverloadCandidateParamOrder PO=OverloadCandidateParamOrder::Normal)
Determine when this overload candidate will be new to the overload set.
void AddDeferredConversionTemplateCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion)
void AddDeferredMethodTemplateCandidate(FunctionTemplateDecl *MethodTmpl, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, QualType ObjectType, Expr::Classification ObjectClassification, ArrayRef< Expr * > Args, bool SuppressUserConversions, bool PartialOverloading, OverloadCandidateParamOrder PO)
void DisableResolutionByPerfectCandidate()
ConversionSequenceList allocateConversionSequences(unsigned NumConversions)
Allocate storage for conversion sequences for NumConversions conversions.
llvm::MutableArrayRef< Expr * > getPersistentArgsArray(unsigned N)
Provide storage for any Expr* arg that must be preserved until deferred template candidates are deduc...
OperatorRewriteInfo getRewriteInfo() const
bool shouldDeferTemplateArgumentDeduction(const LangOptions &Opts) const
@ CSK_AddressOfOverloadSet
C++ [over.match.call.general] Resolve a call through the address of an overload set.
@ CSK_InitByConstructor
C++ [over.match.ctor], [over.match.list] Initialization of an object of class type by constructor,...
@ CSK_InitByUserDefinedConversion
C++ [over.match.copy]: Copy-initialization of an object of class type by user-defined conversion.
@ CSK_Normal
Normal lookup.
@ CSK_Operator
C++ [over.match.oper]: Lookup of operator function candidates in a call using operator syntax.
SmallVectorImpl< OverloadCandidate >::iterator iterator
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
bool shouldDeferDiags(Sema &S, ArrayRef< Expr * > Args, SourceLocation OpLoc)
Whether diagnostics should be deferred.
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
void exclude(Decl *F)
Exclude a function from being considered by overload resolution.
SourceLocation getLocation() const
OverloadCandidate & addCandidate(unsigned NumConversions=0, ConversionSequenceList Conversions={})
Add a new candidate with NumConversions conversion sequence slots to the overload set.
void InjectNonDeducedTemplateCandidates(Sema &S)
CandidateSetKind getKind() const
size_t nonDeferredCandidatesCount() const
SmallVector< OverloadCandidate *, 32 > CompleteCandidates(Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, SourceLocation OpLoc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
NestedNameSpecifier getQualifier() const
Fetches the nested-name qualifier, if one was given.
SourceLocation getNameLoc() const
Gets the location of the name.
UnresolvedSetImpl::iterator decls_iterator
decls_iterator decls_begin() const
unsigned getNumDecls() const
Gets the number of declarations in the unresolved set.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
decls_iterator decls_end() const
DeclarationName getName() const
Gets the name looked up.
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
ParenExpr - This represents a parenthesized expression, e.g.
Represents a parameter to a function.
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
bool isEquivalent(PointerAuthQualifier Other) const
std::string getAsString() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
bool isMoreQualifiedThan(QualType Other, const ASTContext &Ctx) const
Determine whether this type is more qualified than the other given type, requiring exact equality for...
bool isConstQualified() const
Determine whether this type is const-qualified.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualType apply(const ASTContext &Context, QualType QT) const
Apply the collected qualifiers to the given type.
QualifiersAndAtomic withVolatile()
QualifiersAndAtomic withAtomic()
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
bool hasOnlyConst() const
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
void removeObjCLifetime()
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
void removeAddressSpace()
void setAddressSpace(LangAS space)
PointerAuthQualifier getPointerAuth() const
bool hasObjCGCAttr() const
ObjCLifetime getObjCLifetime() const
std::string getAsString() const
LangAS getAddressSpace() const
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
field_range fields() const
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Scope - A scope is a transient data structure that is used while parsing the program.
Smart pointer class that efficiently represents Objective-C method names.
unsigned getNumArgs() const
bool areCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an SVE builtin and a VectorType that is a fixed-length representat...
bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible SVE vector types, false otherwise.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
bool IsAllowedCall(const FunctionDecl *Caller, const FunctionDecl *Callee)
Determines whether Caller may invoke Callee, based on their CUDA host/device attributes.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
bool inferTargetForImplicitSpecialMember(CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, CXXMethodDecl *MemberDecl, bool ConstRHS, bool Diagnose)
Given a implicit special member, infer its CUDA target from the calls it needs to make to underlying ...
static bool isImplicitHostDeviceFunction(const FunctionDecl *D)
void EraseUnwantedMatches(const FunctionDecl *Caller, llvm::SmallVectorImpl< std::pair< DeclAccessPair, FunctionDecl * > > &Matches)
Finds a function in Matches with highest calling priority from Caller context and erases all function...
CUDAFunctionPreference IdentifyPreference(const FunctionDecl *Caller, const FunctionDecl *Callee)
Identifies relative preference of a given Caller/Callee combination, based on their host/device attri...
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
Expr * stripARCUnbridgedCast(Expr *e)
stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast type, remove the placeholder cast.
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
virtual SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for one of the candidate conversions.
virtual SemaDiagnosticBuilder diagnoseNoMatch(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic complaining that the expression does not have integral or enumeration type.
virtual SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, QualType ConvTy)=0
Emits a note for the explicit conversion function.
virtual SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when the only matching conversion function is explicit.
virtual SemaDiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy)=0
Emits a diagnostic when we picked a conversion function (for cases when we are not allowed to pick a ...
virtual SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when there are multiple possible conversion functions.
virtual bool match(QualType T)=0
Determine whether the specified type is a valid destination type for this conversion.
virtual SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, QualType T)=0
Emits a diagnostic when the expression has incomplete class type.
For a defaulted function, the kind of defaulted function that it is.
bool isSpecialMember() const
bool isComparison() const
CXXSpecialMemberKind asSpecialMember() const
RAII class to control scope of DeferDiags.
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....
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)
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 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, CodePtr &PC)
void checkAssignmentLifetime(Sema &SemaRef, const AssignedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for assigning to the ent...
The JSON file list parser is used to communicate input to InstallAPI.
ImplicitConversionRank GetDimensionConversionRank(ImplicitConversionRank Base, ImplicitConversionKind Dimension)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
bool isBetterOverloadCandidate(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2, SourceLocation Loc, OverloadCandidateSet::CandidateSetKind Kind, bool PartialOverloading=false)
isBetterOverloadCandidate - Determines whether the first overload candidate is a better candidate tha...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ ovl_fail_final_conversion_not_exact
This conversion function template specialization candidate is not viable because the final conversion...
@ ovl_fail_enable_if
This candidate function was not viable because an enable_if attribute disabled it.
@ ovl_fail_illegal_constructor
This conversion candidate was not considered because it is an illegal instantiation of a constructor ...
@ ovl_fail_bad_final_conversion
This conversion candidate is not viable because its result type is not implicitly convertible to the ...
@ ovl_fail_module_mismatched
This candidate was not viable because it has internal linkage and is from a different module unit tha...
@ ovl_fail_too_few_arguments
@ ovl_fail_addr_not_available
This candidate was not viable because its address could not be taken.
@ ovl_fail_too_many_arguments
@ ovl_non_default_multiversion_function
This candidate was not viable because it is a non-default multiversioned function.
@ ovl_fail_constraints_not_satisfied
This candidate was not viable because its associated constraints were not satisfied.
@ ovl_fail_bad_conversion
@ ovl_fail_bad_target
(CUDA) This candidate was not viable because the callee was not accessible from the caller's target (...
@ ovl_fail_inhctor_slice
This inherited constructor is not viable because it would slice the argument.
@ ovl_fail_object_addrspace_mismatch
This constructor/conversion candidate fail due to an address space mismatch between the object being ...
@ ovl_fail_explicit
This candidate constructor or conversion function is explicit but the context doesn't permit explicit...
@ ovl_fail_trivial_conversion
This conversion candidate was not considered because it duplicates the work of a trivial or derived-t...
@ Comparison
A comparison.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
ImplicitConversionRank
ImplicitConversionRank - The rank of an implicit conversion kind.
@ ICR_Conversion
Conversion.
@ ICR_Writeback_Conversion
ObjC ARC writeback conversion.
@ ICR_HLSL_Dimension_Reduction
HLSL Matching Dimension Reduction.
@ ICR_HLSL_Dimension_Reduction_Conversion
HLSL Dimension reduction with conversion.
@ ICR_HLSL_Scalar_Widening
HLSL Scalar Widening.
@ ICR_C_Conversion
Conversion only allowed in the C standard (e.g. void* to char*).
@ ICR_OCL_Scalar_Widening
OpenCL Scalar Widening.
@ ICR_Complex_Real_Conversion
Complex <-> Real conversion.
@ ICR_HLSL_Scalar_Widening_Conversion
HLSL Scalar Widening with conversion.
@ ICR_HLSL_Dimension_Reduction_Promotion
HLSL Dimension reduction with promotion.
@ ICR_Promotion
Promotion.
@ ICR_Exact_Match
Exact Match.
@ ICR_C_Conversion_Extension
Conversion not allowed by the C standard, but that we accept as an extension anyway.
@ ICR_HLSL_Scalar_Widening_Promotion
HLSL Scalar Widening with promotion.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_ViableCandidates
Requests that only viable candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
@ OK_Ordinary
An ordinary object is located at an address in memory.
Expr::ConstantExprKind ConstantExprKind
OverloadCandidateParamOrder
The parameter ordering that will be used for the candidate.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OverloadsShown
Specifies which overload candidates to display when overload resolution fails.
@ Ovl_Best
Show just the "best" overload candidates.
llvm::MutableArrayRef< ImplicitConversionSequence > ConversionSequenceList
A list of implicit conversion sequences for the arguments of an OverloadCandidate.
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
OverloadCandidateRewriteKind
The kinds of rewrite we perform on overload candidates.
@ CRK_Reversed
Candidate is a rewritten candidate with a reversed order of parameters.
@ CRK_None
Candidate is not a rewritten candidate.
@ CRK_DifferentOperator
Candidate is a rewritten candidate with a different operator name.
MutableArrayRef< Expr * > MultiExprArg
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Result
The result type of a method or function.
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
OptionalUnsigned< unsigned > UnsignedOrNone
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.