39#include "llvm/ADT/DenseSet.h"
40#include "llvm/ADT/STLExtras.h"
41#include "llvm/ADT/STLForwardCompat.h"
42#include "llvm/ADT/ScopeExit.h"
43#include "llvm/ADT/SmallPtrSet.h"
44#include "llvm/ADT/SmallVector.h"
58 return P->hasAttr<PassObjectSizeAttr>();
79 if (HadMultipleCandidates)
90 CK_FunctionToPointerDecay);
94 bool InOverloadResolution,
97 bool AllowObjCWritebackConversion);
101 bool InOverloadResolution,
109 bool AllowObjCConversionOnExplicit);
177 return Rank[(int)Kind];
202 static const char *
const Name[] = {
206 "Function-to-pointer",
207 "Function pointer conversion",
209 "Integral promotion",
210 "Floating point promotion",
212 "Integral conversion",
213 "Floating conversion",
214 "Complex conversion",
215 "Floating-integral conversion",
216 "Pointer conversion",
217 "Pointer-to-member conversion",
218 "Boolean conversion",
219 "Compatible-types conversion",
220 "Derived-to-base conversion",
222 "SVE Vector conversion",
223 "RVV Vector conversion",
225 "Complex-real conversion",
226 "Block Pointer conversion",
227 "Transparent Union Conversion",
228 "Writeback conversion",
229 "OpenCL Zero Event Conversion",
230 "OpenCL Zero Queue Conversion",
231 "C specific type conversion",
232 "Incompatible pointer conversion",
233 "Fixed point conversion",
234 "HLSL vector truncation",
235 "HLSL matrix truncation",
236 "Non-decaying array conversion",
314 FromType = Context.getArrayDecayedType(FromType);
326 const Expr *Converted) {
329 if (
auto *EWC = dyn_cast<ExprWithCleanups>(Converted)) {
336 while (
auto *ICE = dyn_cast<ImplicitCastExpr>(Converted)) {
337 switch (ICE->getCastKind()) {
339 case CK_IntegralCast:
340 case CK_IntegralToBoolean:
341 case CK_IntegralToFloating:
342 case CK_BooleanToSignedIntegral:
343 case CK_FloatingToIntegral:
344 case CK_FloatingToBoolean:
345 case CK_FloatingCast:
346 Converted = ICE->getSubExpr();
370 QualType &ConstantType,
bool IgnoreFloatToIntegralConversion)
const {
372 "narrowing check outside C++");
383 ToType = ED->getIntegerType();
389 goto FloatingIntegralConversion;
391 goto IntegralConversion;
402 FloatingIntegralConversion:
407 if (IgnoreFloatToIntegralConversion)
410 assert(
Initializer &&
"Unknown conversion expression");
416 if (std::optional<llvm::APSInt> IntConstantValue =
420 Result.convertFromAPInt(*IntConstantValue, IntConstantValue->isSigned(),
421 llvm::APFloat::rmNearestTiesToEven);
423 llvm::APSInt ConvertedValue = *IntConstantValue;
425 llvm::APFloat::opStatus Status =
Result.convertToInteger(
426 ConvertedValue, llvm::APFloat::rmTowardZero, &ignored);
429 if (Status == llvm::APFloat::opInvalidOp ||
430 *IntConstantValue != ConvertedValue) {
431 ConstantValue =
APValue(*IntConstantValue);
459 Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue)))) {
462 ConstantValue = R.Val;
463 assert(ConstantValue.
isFloat());
464 llvm::APFloat FloatVal = ConstantValue.
getFloat();
467 llvm::APFloat Converted = FloatVal;
468 llvm::APFloat::opStatus ConvertStatus =
470 llvm::APFloat::rmNearestTiesToEven, &ignored);
472 llvm::APFloat::rmNearestTiesToEven, &ignored);
474 if (FloatVal.isNaN() && Converted.isNaN() &&
475 !FloatVal.isSignaling() && !Converted.isSignaling()) {
481 if (!Converted.bitwiseIsEqual(FloatVal)) {
488 if (ConvertStatus & llvm::APFloat::opOverflow) {
510 IntegralConversion: {
518 constexpr auto CanRepresentAll = [](
bool FromSigned,
unsigned FromWidth,
519 bool ToSigned,
unsigned ToWidth) {
520 return (FromWidth < ToWidth + (FromSigned == ToSigned)) &&
521 !(FromSigned && !ToSigned);
524 if (CanRepresentAll(FromSigned, FromWidth, ToSigned, ToWidth))
530 bool DependentBitField =
false;
532 if (BitField->getBitWidth()->isValueDependent())
533 DependentBitField =
true;
534 else if (
unsigned BitFieldWidth = BitField->getBitWidthValue();
535 BitFieldWidth < FromWidth) {
536 if (CanRepresentAll(FromSigned, BitFieldWidth, ToSigned, ToWidth))
540 FromWidth = BitFieldWidth;
548 std::optional<llvm::APSInt> OptInitializerValue =
550 if (!OptInitializerValue) {
554 if (DependentBitField && !(FromSigned && !ToSigned))
560 llvm::APSInt &InitializerValue = *OptInitializerValue;
561 bool Narrowing =
false;
562 if (FromWidth < ToWidth) {
565 if (InitializerValue.isSigned() && InitializerValue.isNegative())
571 InitializerValue.extend(InitializerValue.getBitWidth() + 1);
573 llvm::APSInt ConvertedValue = InitializerValue;
574 ConvertedValue = ConvertedValue.trunc(ToWidth);
575 ConvertedValue.setIsSigned(ToSigned);
576 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
577 ConvertedValue.setIsSigned(InitializerValue.isSigned());
579 if (ConvertedValue != InitializerValue)
584 ConstantValue =
APValue(InitializerValue);
600 ConstantValue = R.Val;
601 assert(ConstantValue.
isFloat());
602 llvm::APFloat FloatVal = ConstantValue.
getFloat();
607 if (FloatVal.isNaN() && FloatVal.isSignaling()) {
623 raw_ostream &OS = llvm::errs();
624 bool PrintedSomething =
false;
627 PrintedSomething =
true;
631 if (PrintedSomething) {
637 OS <<
" (by copy constructor)";
639 OS <<
" (direct reference binding)";
641 OS <<
" (reference binding)";
643 PrintedSomething =
true;
647 if (PrintedSomething) {
651 PrintedSomething =
true;
654 if (!PrintedSomething) {
655 OS <<
"No conversions required";
662 raw_ostream &OS = llvm::errs();
670 OS <<
"aggregate initialization";
680 raw_ostream &OS = llvm::errs();
682 OS <<
"Worst list element conversion: ";
683 switch (ConversionKind) {
685 OS <<
"Standard conversion: ";
689 OS <<
"User-defined conversion: ";
693 OS <<
"Ellipsis conversion";
696 OS <<
"Ambiguous conversion";
699 OS <<
"Bad conversion";
724 struct DFIArguments {
730 struct DFIParamWithArguments : DFIArguments {
735 struct DFIDeducedMismatchArgs : DFIArguments {
736 TemplateArgumentList *TemplateArgs;
737 unsigned CallArgIndex;
742 TemplateArgumentList *TemplateArgs;
743 ConstraintSatisfaction Satisfaction;
754 Result.Result =
static_cast<unsigned>(TDK);
755 Result.HasDiagnostic =
false;
774 auto *Saved =
new (Context) DFIDeducedMismatchArgs;
785 DFIArguments *Saved =
new (Context) DFIArguments;
797 DFIParamWithArguments *Saved =
new (Context) DFIParamWithArguments;
798 Saved->Param = Info.
Param;
811 Result.HasDiagnostic =
true;
816 CNSInfo *Saved =
new (Context) CNSInfo;
826 llvm_unreachable(
"not a deduction failure");
859 Diag->~PartialDiagnosticAt();
866 static_cast<CNSInfo *
>(
Data)->Satisfaction.~ConstraintSatisfaction();
869 Diag->~PartialDiagnosticAt();
905 return TemplateParameter::getFromOpaqueValue(
Data);
910 return static_cast<DFIParamWithArguments*
>(
Data)->Param;
940 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->TemplateArgs;
946 return static_cast<CNSInfo*
>(
Data)->TemplateArgs;
978 return &
static_cast<DFIArguments*
>(
Data)->FirstArg;
1010 return &
static_cast<DFIArguments*
>(
Data)->SecondArg;
1025 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->CallArgIndex;
1028 return std::nullopt;
1041 for (
unsigned I = 0; I <
X->getNumParams(); ++I)
1045 if (
auto *FTX =
X->getDescribedFunctionTemplate()) {
1050 FTY->getTemplateParameters()))
1059 OverloadedOperatorKind::OO_EqualEqual);
1071 OverloadedOperatorKind::OO_ExclaimEqual);
1089 auto *NotEqFD = Op->getAsFunction();
1090 if (
auto *UD = dyn_cast<UsingShadowDecl>(Op))
1091 NotEqFD = UD->getUnderlyingDecl()->getAsFunction();
1104 return Op == OO_EqualEqual || Op == OO_Spaceship;
1112 if (Op == OverloadedOperatorKind::OO_EqualEqual) {
1113 assert(OriginalArgs.size() == 2);
1115 S,
OpLoc, OriginalArgs[1], FD))
1126void OverloadCandidateSet::destroyCandidates() {
1127 for (
iterator i = Candidates.begin(), e = Candidates.end(); i != e; ++i) {
1128 for (
auto &
C : i->Conversions)
1129 C.~ImplicitConversionSequence();
1131 i->DeductionFailure.Destroy();
1136 destroyCandidates();
1137 SlabAllocator.Reset();
1138 NumInlineBytesUsed = 0;
1142 FirstDeferredCandidate =
nullptr;
1143 DeferredCandidatesCount = 0;
1144 HasDeferredTemplateConstructors =
false;
1145 ResolutionByPerfectCandidateIsDisabled =
false;
1149 class UnbridgedCastsSet {
1159 Entry entry = { &E, E };
1160 Entries.push_back(entry);
1165 for (SmallVectorImpl<Entry>::iterator
1166 i = Entries.begin(), e = Entries.end(); i != e; ++i)
1167 *i->Addr = i->Saved;
1181 UnbridgedCastsSet *unbridgedCasts =
nullptr) {
1185 if (placeholder->getKind() == BuiltinType::Overload)
return false;
1189 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
1191 unbridgedCasts->save(S, E);
1211 UnbridgedCastsSet &unbridged) {
1212 for (
unsigned i = 0, e = Args.size(); i != e; ++i)
1221 bool NewIsUsingDecl) {
1226 bool OldIsUsingDecl =
false;
1228 OldIsUsingDecl =
true;
1232 if (NewIsUsingDecl)
continue;
1239 if ((OldIsUsingDecl || NewIsUsingDecl) && !
isVisible(*I))
1247 bool UseMemberUsingDeclRules =
1248 (OldIsUsingDecl || NewIsUsingDecl) &&
CurContext->isRecord() &&
1249 !
New->getFriendObjectKind();
1253 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
1259 !shouldLinkPossiblyHiddenDecl(*I,
New))
1278 }
else if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(OldD)) {
1285 if (UUD->getQualifier().isDependent() && !UUD->isCXXClassMember()) {
1313 if (
New->getFriendObjectKind() &&
New->getQualifier() &&
1314 !
New->getDescribedFunctionTemplate() &&
1315 !
New->getDependentSpecializationInfo() &&
1316 !
New->getType()->isDependentType()) {
1321 New->setInvalidDecl();
1333 assert(D &&
"function decl should not be null");
1334 if (
auto *A = D->
getAttr<AttrT>())
1335 return !A->isImplicit();
1341 bool UseMemberUsingDeclRules,
1342 bool ConsiderCudaAttrs,
1343 bool UseOverrideRules =
false) {
1349 if (
New->isMSVCRTEntryPoint())
1360 if ((OldTemplate ==
nullptr) != (NewTemplate ==
nullptr))
1383 if (OldQType != NewQType && OldType->isVariadic() != NewType->isVariadic())
1387 if ((
New->isMemberLikeConstrainedFriend() ||
1398 OldDecl = OldTemplate;
1399 NewDecl = NewTemplate;
1417 bool ConstraintsInTemplateHead =
1428 if (UseMemberUsingDeclRules && ConstraintsInTemplateHead &&
1429 !SameTemplateParameterList)
1431 if (!UseMemberUsingDeclRules &&
1432 (!SameTemplateParameterList || !SameReturnType))
1436 const auto *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1437 const auto *NewMethod = dyn_cast<CXXMethodDecl>(
New);
1439 int OldParamsOffset = 0;
1440 int NewParamsOffset = 0;
1448 if (ThisType.isConstQualified())
1468 BS.
Quals = NormalizeQualifiers(OldMethod, BS.
Quals);
1469 DS.Quals = NormalizeQualifiers(NewMethod, DS.Quals);
1471 if (OldMethod->isExplicitObjectMemberFunction()) {
1473 DS.Quals.removeVolatile();
1476 return BS.
Quals == DS.Quals;
1480 auto BS =
Base.getNonReferenceType().getCanonicalType().split();
1481 auto DS = D.getNonReferenceType().getCanonicalType().split();
1483 if (!AreQualifiersEqual(BS, DS))
1486 if (OldMethod->isImplicitObjectMemberFunction() &&
1487 OldMethod->getParent() != NewMethod->getParent()) {
1499 if (
Base->isLValueReferenceType())
1500 return D->isLValueReferenceType();
1501 return Base->isRValueReferenceType() == D->isRValueReferenceType();
1506 auto DiagnoseInconsistentRefQualifiers = [&]() {
1507 if (SemaRef.
LangOpts.CPlusPlus23 && !UseOverrideRules)
1509 if (OldMethod->getRefQualifier() == NewMethod->getRefQualifier())
1511 if (OldMethod->isExplicitObjectMemberFunction() ||
1512 NewMethod->isExplicitObjectMemberFunction())
1514 if (!UseMemberUsingDeclRules && (OldMethod->getRefQualifier() ==
RQ_None ||
1515 NewMethod->getRefQualifier() ==
RQ_None)) {
1516 SemaRef.
Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
1517 << NewMethod->getRefQualifier() << OldMethod->getRefQualifier();
1518 SemaRef.
Diag(OldMethod->getLocation(), diag::note_previous_declaration);
1527 bool ShouldDiagnoseInconsistentRefQualifiers =
false;
1528 bool HaveInconsistentQualifiers =
false;
1530 if (OldMethod && OldMethod->isExplicitObjectMemberFunction())
1532 if (NewMethod && NewMethod->isExplicitObjectMemberFunction())
1535 if (OldType->getNumParams() - OldParamsOffset !=
1536 NewType->getNumParams() - NewParamsOffset ||
1538 {OldType->param_type_begin() + OldParamsOffset,
1539 OldType->param_type_end()},
1540 {NewType->param_type_begin() + NewParamsOffset,
1541 NewType->param_type_end()},
1546 if (OldMethod && NewMethod && !OldMethod->isStatic() &&
1547 !NewMethod->isStatic()) {
1548 bool HaveCorrespondingObjectParameters = [&](
const CXXMethodDecl *Old,
1550 auto NewObjectType =
New->getFunctionObjectParameterReferenceType();
1554 return F->getRefQualifier() ==
RQ_None &&
1555 !F->isExplicitObjectMemberFunction();
1558 if (IsImplicitWithNoRefQual(Old) != IsImplicitWithNoRefQual(
New) &&
1559 CompareType(OldObjectType.getNonReferenceType(),
1560 NewObjectType.getNonReferenceType()))
1562 return CompareType(OldObjectType, NewObjectType);
1563 }(OldMethod, NewMethod);
1565 if (!HaveCorrespondingObjectParameters) {
1566 ShouldDiagnoseInconsistentRefQualifiers =
true;
1570 if (!UseOverrideRules || (!NewMethod->isExplicitObjectMemberFunction() &&
1571 !OldMethod->isExplicitObjectMemberFunction()))
1572 HaveInconsistentQualifiers =
true;
1576 if (NewMethod && OldMethod && OldMethod->isImplicitObjectMemberFunction() &&
1577 NewMethod->isImplicitObjectMemberFunction())
1578 ShouldDiagnoseInconsistentRefQualifiers =
true;
1580 if (!UseOverrideRules &&
1584 if (!NewRC != !OldRC)
1604 NewI =
New->specific_attr_begin<EnableIfAttr>(),
1605 NewE =
New->specific_attr_end<EnableIfAttr>(),
1608 NewI != NewE || OldI != OldE; ++NewI, ++OldI) {
1609 if (NewI == NewE || OldI == OldE)
1611 llvm::FoldingSetNodeID NewID, OldID;
1612 NewI->getCond()->Profile(NewID, SemaRef.
Context,
true);
1613 OldI->getCond()->Profile(OldID, SemaRef.
Context,
true);
1618 if ((ShouldDiagnoseInconsistentRefQualifiers &&
1619 DiagnoseInconsistentRefQualifiers()) ||
1620 HaveInconsistentQualifiers)
1624 if (SemaRef.
getLangOpts().CUDA && ConsiderCudaAttrs) {
1632 "Unexpected invalid target.");
1636 if (NewTarget != OldTarget) {
1639 if (OldMethod && NewMethod && OldMethod->isVirtual() &&
1640 OldMethod->isConstexpr() && !NewMethod->isConstexpr() &&
1658 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1664 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1677 bool SuppressUserConversions,
1679 bool InOverloadResolution,
1681 bool AllowObjCWritebackConversion,
1682 bool AllowObjCConversionOnExplicit) {
1685 if (SuppressUserConversions) {
1696 Conversions, AllowExplicit,
1697 AllowObjCConversionOnExplicit)) {
1718 bool FromListInit =
false;
1719 if (
const auto *InitList = dyn_cast<InitListExpr>(From);
1720 InitList && InitList->getNumInits() == 1 &&
1722 const Expr *SingleInit = InitList->getInit(0);
1723 FromType = SingleInit->
getType();
1725 FromListInit =
true;
1734 if ((FromCanon == ToCanon ||
1746 if (ToCanon != FromCanon)
1757 Cand != Conversions.
end(); ++Cand)
1798static ImplicitConversionSequence
1800 bool SuppressUserConversions,
1802 bool InOverloadResolution,
1804 bool AllowObjCWritebackConversion,
1805 bool AllowObjCConversionOnExplicit) {
1808 ICS.
Standard, CStyle, AllowObjCWritebackConversion)){
1854 bool CanConvert =
false;
1860 FromResType->getWrappedType()) &&
1862 FromResType->getContainedType()) &&
1863 ToResType->getAttrs() == FromResType->getAttrs())
1865 }
else if (ToTy->isHLSLResourceType()) {
1879 AllowExplicit, InOverloadResolution, CStyle,
1880 AllowObjCWritebackConversion,
1881 AllowObjCConversionOnExplicit);
1884ImplicitConversionSequence
1886 bool SuppressUserConversions,
1888 bool InOverloadResolution,
1890 bool AllowObjCWritebackConversion) {
1891 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1892 AllowExplicit, InOverloadResolution, CStyle,
1893 AllowObjCWritebackConversion,
1899 bool AllowExplicit) {
1904 bool AllowObjCWritebackConversion =
1911 *
this, From, ToType,
1913 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1915 false, AllowObjCWritebackConversion,
1929 if (
Context.hasSameUnqualifiedType(FromType, ToType))
1942 if (TyClass != CanFrom->getTypeClass())
return false;
1943 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1944 if (TyClass == Type::Pointer) {
1947 }
else if (TyClass == Type::BlockPointer) {
1950 }
else if (TyClass == Type::MemberPointer) {
1957 CanTo = ToMPT->getPointeeType();
1963 TyClass = CanTo->getTypeClass();
1964 if (TyClass != CanFrom->getTypeClass())
return false;
1965 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1975 bool Changed =
false;
1983 const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn);
1984 const auto *ToFPT = dyn_cast<FunctionProtoType>(ToFn);
1986 if (FromFPT && ToFPT) {
1987 if (FromFPT->hasCFIUncheckedCallee() != ToFPT->hasCFIUncheckedCallee()) {
1989 FromFPT->getReturnType(), FromFPT->getParamTypes(),
1990 FromFPT->getExtProtoInfo().withCFIUncheckedCallee(
1991 ToFPT->hasCFIUncheckedCallee()));
1999 if (FromFPT && ToFPT) {
2000 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
2012 bool CanUseToFPT, CanUseFromFPT;
2013 if (
Context.mergeExtParameterInfo(ToFPT, FromFPT, CanUseToFPT,
2014 CanUseFromFPT, NewParamInfos) &&
2015 CanUseToFPT && !CanUseFromFPT) {
2018 NewParamInfos.empty() ?
nullptr : NewParamInfos.data();
2020 FromFPT->getParamTypes(), ExtInfo);
2025 if (
Context.hasAnyFunctionEffects()) {
2030 const auto FromFX = FromFPT->getFunctionEffects();
2031 const auto ToFX = ToFPT->getFunctionEffects();
2032 if (FromFX != ToFX) {
2036 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
2046 assert(
QualType(FromFn, 0).isCanonical());
2047 if (
QualType(FromFn, 0) != CanTo)
return false;
2074 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
2075 &ToSem == &llvm::APFloat::IEEEquad()) ||
2076 (&FromSem == &llvm::APFloat::IEEEquad() &&
2077 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2133 bool InOverloadResolution,
bool CStyle) {
2143 if (ToMatrixType && FromMatrixType) {
2145 unsigned ToCols = ToMatrixType->getNumColumns();
2146 if (FromCols < ToCols)
2149 unsigned FromRows = FromMatrixType->
getNumRows();
2150 unsigned ToRows = ToMatrixType->getNumRows();
2151 if (FromRows < ToRows)
2154 if (FromRows == ToRows && FromCols == ToCols)
2160 QualType ToElTy = ToMatrixType->getElementType();
2169 QualType ToElTy = ToMatrixType->getElementType();
2172 if (FromMatrixType && !ToMatrixType) {
2191 bool InOverloadResolution,
bool CStyle) {
2208 if (ToExtType && FromExtType) {
2210 unsigned ToElts = ToExtType->getNumElements();
2211 if (FromElts < ToElts)
2213 if (FromElts == ToElts)
2219 QualType ToElTy = ToExtType->getElementType();
2224 if (FromExtType && !ToExtType) {
2238 if (ToExtType->getNumElements() != FromExtType->getNumElements())
2243 FromExtType->getElementType()->isIntegerType()) {
2255 QualType ToElTy = ToExtType->getElementType();
2290 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
2295 !InOverloadResolution && !CStyle) {
2297 << FromType << ToType;
2308 bool InOverloadResolution,
2309 StandardConversionSequence &SCS,
2314 bool InOverloadResolution,
2315 StandardConversionSequence &SCS,
2327 bool InOverloadResolution,
2330 bool AllowObjCWritebackConversion) {
2356 FromType = Fn->getType();
2376 if (Method && !Method->isStatic() &&
2377 !Method->isExplicitObjectMemberFunction()) {
2379 "Non-unary operator on non-static member address");
2382 "Non-address-of operator on non-static member address");
2384 FromType, std::nullopt, Method->getParent());
2388 "Non-address-of operator for overloaded function expression");
2434 FromType =
Atomic->getValueType();
2469 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2489 bool IncompatibleObjC =
false;
2551 }
else if (AllowObjCWritebackConversion &&
2555 FromType, IncompatibleObjC)) {
2561 InOverloadResolution, FromType)) {
2565 From, InOverloadResolution, CStyle)) {
2570 From, InOverloadResolution, CStyle)) {
2580 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2589 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2619 bool ObjCLifetimeConversion;
2625 ObjCLifetimeConversion)) {
2644 CanonFrom = CanonTo;
2649 if (CanonFrom == CanonTo)
2654 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2666 case AssignConvertType::
2667 CompatibleVoidPtrToNonVoidPtr:
2700 bool InOverloadResolution,
2708 const RecordDecl *UD = UT->getDecl()->getDefinitionOrSelf();
2709 if (!UD->
hasAttr<TransparentUnionAttr>())
2712 for (
const auto *it : UD->
fields()) {
2715 ToType = it->getType();
2741 return To->
getKind() == BuiltinType::Int;
2744 return To->
getKind() == BuiltinType::UInt;
2768 if (FromED->isScoped())
2775 if (FromED->isFixed()) {
2776 QualType Underlying = FromED->getIntegerType();
2777 return Context.hasSameUnqualifiedType(Underlying, ToType) ||
2784 return Context.hasSameUnqualifiedType(ToType, FromED->getPromotionType());
2809 uint64_t FromSize =
Context.getTypeSize(FromType);
2818 for (
int Idx = 0; Idx < 6; ++Idx) {
2819 uint64_t ToSize =
Context.getTypeSize(PromoteTypes[Idx]);
2820 if (FromSize < ToSize ||
2821 (FromSize == ToSize &&
2822 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2826 return Context.hasSameUnqualifiedType(ToType, PromoteTypes[Idx]);
2847 std::optional<llvm::APSInt> BitWidth;
2850 MemberDecl->getBitWidth()->getIntegerConstantExpr(
Context))) {
2851 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2852 ToSize =
Context.getTypeSize(ToType);
2855 if (*BitWidth < ToSize ||
2857 return To->
getKind() == BuiltinType::Int;
2863 return To->
getKind() == BuiltinType::UInt;
2881 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2891 if (FromBuiltin->getKind() == BuiltinType::Float &&
2892 ToBuiltin->getKind() == BuiltinType::Double)
2899 (FromBuiltin->getKind() == BuiltinType::Float ||
2900 FromBuiltin->getKind() == BuiltinType::Double) &&
2901 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2902 ToBuiltin->getKind() == BuiltinType::Float128 ||
2903 ToBuiltin->getKind() == BuiltinType::Ibm128))
2908 if (
getLangOpts().
HLSL && FromBuiltin->getKind() == BuiltinType::Half &&
2909 (ToBuiltin->getKind() == BuiltinType::Float ||
2910 ToBuiltin->getKind() == BuiltinType::Double))
2915 FromBuiltin->getKind() == BuiltinType::Half &&
2916 ToBuiltin->getKind() == BuiltinType::Float)
2945 return Context.getTypeSize(FromType) <
Context.getTypeSize(ToType);
2957 if (
const EnumType *ToEnumType = ToType->
getAs<EnumType>()) {
2969 return Context.getTypeSize(FromType) >
Context.getTypeSize(ToType);
2984 bool StripObjCLifetime =
false) {
2987 "Invalid similarly-qualified pointer type");
2998 if (StripObjCLifetime)
3010 return Context.getObjCObjectPointerType(ToPointee);
3011 return Context.getPointerType(ToPointee);
3019 return Context.getObjCObjectPointerType(QualifiedCanonToPointee);
3020 return Context.getPointerType(QualifiedCanonToPointee);
3024 bool InOverloadResolution,
3030 return !InOverloadResolution;
3038 bool InOverloadResolution,
3040 bool &IncompatibleObjC) {
3041 IncompatibleObjC =
false;
3049 ConvertedType = ToType;
3056 ConvertedType = ToType;
3063 ConvertedType = ToType;
3071 ConvertedType = ToType;
3081 ConvertedType = ToType;
3103 if (
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType))
3130 Context.typesAreCompatible(FromPointeeType, ToPointeeType)) {
3152 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType) &&
3161 Context.areCompatibleVectorTypes(FromPointeeType, ToPointeeType)) {
3180 return Context.getQualifiedType(T, Qs);
3182 return Context.getQualifiedType(T.getUnqualifiedType(), Qs);
3187 bool &IncompatibleObjC) {
3200 if (ToObjCPtr && FromObjCPtr) {
3208 if (
Context.canAssignObjCInterfaces(ToObjCPtr, FromObjCPtr)) {
3222 if (
Context.canAssignObjCInterfaces(FromObjCPtr, ToObjCPtr)) {
3226 IncompatibleObjC =
true;
3242 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
3271 IncompatibleObjC)) {
3273 IncompatibleObjC =
true;
3274 ConvertedType =
Context.getPointerType(ConvertedType);
3283 IncompatibleObjC)) {
3285 ConvertedType =
Context.getPointerType(ConvertedType);
3298 if (FromFunctionType && ToFunctionType) {
3301 if (
Context.getCanonicalType(FromPointeeType)
3302 ==
Context.getCanonicalType(ToPointeeType))
3307 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3308 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
3309 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
3312 bool HasObjCConversion =
false;
3314 Context.getCanonicalType(ToFunctionType->getReturnType())) {
3317 ToFunctionType->getReturnType(),
3318 ConvertedType, IncompatibleObjC)) {
3320 HasObjCConversion =
true;
3327 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3328 ArgIdx != NumArgs; ++ArgIdx) {
3330 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3331 if (
Context.getCanonicalType(FromArgType)
3332 ==
Context.getCanonicalType(ToArgType)) {
3335 ConvertedType, IncompatibleObjC)) {
3337 HasObjCConversion =
true;
3344 if (HasObjCConversion) {
3348 IncompatibleObjC =
true;
3380 if (!FromFunctionType || !ToFunctionType)
3383 if (
Context.hasSameType(FromPointeeType, ToPointeeType))
3388 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3389 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3394 if (FromEInfo != ToEInfo)
3397 bool IncompatibleObjC =
false;
3399 ToFunctionType->getReturnType())) {
3403 QualType LHS = ToFunctionType->getReturnType();
3408 if (
Context.hasSameType(RHS,LHS)) {
3411 ConvertedType, IncompatibleObjC)) {
3412 if (IncompatibleObjC)
3421 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3422 ArgIdx != NumArgs; ++ArgIdx) {
3423 IncompatibleObjC =
false;
3425 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3426 if (
Context.hasSameType(FromArgType, ToArgType)) {
3429 ConvertedType, IncompatibleObjC)) {
3430 if (IncompatibleObjC)
3439 bool CanUseToFPT, CanUseFromFPT;
3440 if (!
Context.mergeExtParameterInfo(ToFunctionType, FromFunctionType,
3441 CanUseToFPT, CanUseFromFPT,
3445 ConvertedType = ToType;
3484 ToMember->getMostRecentCXXRecordDecl())) {
3486 if (ToMember->isSugared())
3488 ToMember->getMostRecentCXXRecordDecl());
3490 PDiag << ToMember->getQualifier();
3491 if (FromMember->isSugared())
3493 FromMember->getMostRecentCXXRecordDecl());
3495 PDiag << FromMember->getQualifier();
3513 !FromType->
getAs<TemplateSpecializationType>()) {
3519 if (
Context.hasSameType(FromType, ToType)) {
3528 if (!FromFunction || !ToFunction) {
3533 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3543 << ToFunction->getParamType(ArgPos)
3550 ToFunction->getReturnType())) {
3556 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3579 assert(llvm::size(Old) == llvm::size(
New) &&
3580 "Can't compare parameters of functions with different number of "
3583 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3585 size_t J =
Reversed ? (llvm::size(
New) - Idx - 1) : Idx;
3590 Context.removePtrSizeAddrSpace(
Type.getUnqualifiedType());
3592 Context.removePtrSizeAddrSpace((
New.begin() + J)->getUnqualifiedType());
3594 if (!
Context.hasSameType(OldType, NewType)) {
3619 unsigned OldIgnore =
3621 unsigned NewIgnore =
3628 NewPT->param_types().slice(NewIgnore),
3635 bool IgnoreBaseAccess,
3638 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3647 PDiag(diag::warn_impcast_bool_to_null_pointer)
3658 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3659 !
Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {
3662 unsigned InaccessibleID = 0;
3663 unsigned AmbiguousID = 0;
3665 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3666 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3669 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3671 &BasePath, IgnoreBaseAccess))
3675 Kind = CK_DerivedToBase;
3678 if (
Diagnose && !IsCStyleOrFunctionalCast &&
3679 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3681 "this should only be possible with MSVCCompat!");
3693 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3696 Kind = CK_BlockPointerToObjCPointerCast;
3698 Kind = CK_CPointerToObjCPointerCast;
3702 Kind = CK_AnyPointerToBlockPointerCast;
3708 Kind = CK_NullToPointer;
3715 bool InOverloadResolution,
3725 ConvertedType = ToType;
3741 ConvertedType =
Context.getMemberPointerType(
3755 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
3763 Kind = CK_NullToMemberPointer;
3781 PD <<
Context.getCanonicalTagType(Cls);
3791 std::swap(
Base, Derived);
3800 PD <<
int(Direction);
3808 DiagFromTo(PD) <<
QualType(VBase, 0) << OpRange;
3816 ? CK_DerivedToBaseMemberPointer
3817 : CK_BaseToDerivedMemberPointer;
3819 if (!IgnoreBaseAccess)
3823 ? diag::err_upcast_to_inaccessible_base
3824 : diag::err_downcast_from_inaccessible_base,
3826 NestedNameSpecifier BaseQual = FromPtrType->getQualifier(),
3827 DerivedQual = ToPtrType->getQualifier();
3828 if (Direction == MemberPointerConversionDirection::Upcast)
3829 std::swap(BaseQual, DerivedQual);
3830 DiagCls(PD, DerivedQual, Derived);
3831 DiagCls(PD, BaseQual, Base);
3866 bool CStyle,
bool IsTopLevel,
3867 bool &PreviousToQualsIncludeConst,
3868 bool &ObjCLifetimeConversion,
3881 ObjCLifetimeConversion =
true;
3921 !PreviousToQualsIncludeConst)
3939 PreviousToQualsIncludeConst =
3940 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3946 bool CStyle,
bool &ObjCLifetimeConversion) {
3947 FromType =
Context.getCanonicalType(FromType);
3948 ToType =
Context.getCanonicalType(ToType);
3949 ObjCLifetimeConversion =
false;
3959 bool PreviousToQualsIncludeConst =
true;
3960 bool UnwrappedAnyPointer =
false;
3961 while (
Context.UnwrapSimilarTypes(FromType, ToType)) {
3963 !UnwrappedAnyPointer,
3964 PreviousToQualsIncludeConst,
3967 UnwrappedAnyPointer =
true;
3975 return UnwrappedAnyPointer &&
Context.hasSameUnqualifiedType(FromType,ToType);
3984 bool InOverloadResolution,
3993 InOverloadResolution, InnerSCS,
4008 bool InOverloadResolution,
4011 const OverflowBehaviorType *ToOBT = ToType->
getAs<OverflowBehaviorType>();
4022 InOverloadResolution, InnerSCS, CStyle,
4039 if (CtorType->getNumParams() > 0) {
4040 QualType FirstArg = CtorType->getParamType(0);
4052 bool AllowExplicit) {
4059 bool Usable = !Info.Constructor->isInvalidDecl() &&
4062 bool SuppressUserConversions =
false;
4063 if (Info.ConstructorTmpl)
4066 CandidateSet, SuppressUserConversions,
4071 CandidateSet, SuppressUserConversions,
4072 false, AllowExplicit);
4076 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4079 switch (
auto Result =
4103 llvm_unreachable(
"Invalid OverloadResult!");
4125 bool AllowObjCConversionOnExplicit) {
4126 assert(AllowExplicit != AllowedExplicit::None ||
4127 !AllowObjCConversionOnExplicit);
4131 bool ConstructorsOnly =
false;
4135 if (
const RecordType *ToRecordType = ToType->
getAsCanonical<RecordType>()) {
4147 ConstructorsOnly =
true;
4151 }
else if (
auto *ToRecordDecl =
4152 dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
4153 ToRecordDecl = ToRecordDecl->getDefinitionOrSelf();
4155 Expr **Args = &From;
4156 unsigned NumArgs = 1;
4157 bool ListInitializing =
false;
4158 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
4161 S, From, ToType, ToRecordDecl, User, CandidateSet,
4162 AllowExplicit == AllowedExplicit::All);
4171 Args = InitList->getInits();
4172 NumArgs = InitList->getNumInits();
4173 ListInitializing =
true;
4181 bool Usable = !Info.Constructor->isInvalidDecl();
4182 if (!ListInitializing)
4183 Usable = Usable && Info.Constructor->isConvertingConstructor(
4186 bool SuppressUserConversions = !ConstructorsOnly;
4194 if (SuppressUserConversions && ListInitializing) {
4195 SuppressUserConversions =
4200 if (Info.ConstructorTmpl)
4202 Info.ConstructorTmpl, Info.FoundDecl,
4204 CandidateSet, SuppressUserConversions,
4206 AllowExplicit == AllowedExplicit::All);
4212 SuppressUserConversions,
4214 AllowExplicit == AllowedExplicit::All);
4224 }
else if (
const RecordType *FromRecordType =
4226 if (
auto *FromRecordDecl =
4227 dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
4228 FromRecordDecl = FromRecordDecl->getDefinitionOrSelf();
4230 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
4231 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4240 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)))
4247 ConvTemplate, FoundDecl, ActingContext, From, ToType,
4248 CandidateSet, AllowObjCConversionOnExplicit,
4249 AllowExplicit != AllowedExplicit::None);
4252 CandidateSet, AllowObjCConversionOnExplicit,
4253 AllowExplicit != AllowedExplicit::None);
4258 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4261 switch (
auto Result =
4267 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
4279 if (Best->Conversions[0].isEllipsis())
4282 User.
Before = Best->Conversions[0].Standard;
4295 = dyn_cast<CXXConversionDecl>(Best->Function)) {
4297 assert(Best->HasFinalConversion);
4305 User.
Before = Best->Conversions[0].Standard;
4320 User.
After = Best->FinalConversion;
4323 llvm_unreachable(
"Not a constructor or conversion function?");
4332 llvm_unreachable(
"Invalid OverloadResult!");
4342 CandidateSet, AllowedExplicit::None,
false);
4357 diag::err_typecheck_nonviable_condition_incomplete,
4364 *
this, From, Cands);
4390 if (!Conv1 || !Conv2)
4405 if (Block1 != Block2)
4418 if (Conv1FuncRet && Conv2FuncRet &&
4427 CallOp->getType()->castAs<
FunctionType>()->getCallConv();
4429 CallOpProto->isVariadic(),
false);
4431 CallOpProto->isVariadic(),
true);
4433 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4528 if (!ICS1.
isBad()) {
4529 bool StdInit1 =
false, StdInit2 =
false;
4536 if (StdInit1 != StdInit2)
4547 CAT2->getElementType())) {
4549 if (CAT1->getSize() != CAT2->getSize())
4551 return CAT1->getSize().ult(CAT2->getSize())
4586 if (ConvFunc1 == ConvFunc2)
4688 if (!
Enum->isFixed())
4724 else if (Rank2 < Rank1)
4759 bool SCS1ConvertsToVoid
4761 bool SCS2ConvertsToVoid
4763 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4768 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4774 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4803 if (FromObjCPtr1 && FromObjCPtr2) {
4808 if (AssignLeft != AssignRight) {
4847 if (UnqualT1 == UnqualT2) {
4909 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4910 return SCS1IsCompatibleVectorConversion
4917 bool SCS1IsCompatibleSVEVectorConversion =
4919 bool SCS2IsCompatibleSVEVectorConversion =
4922 if (SCS1IsCompatibleSVEVectorConversion !=
4923 SCS2IsCompatibleSVEVectorConversion)
4924 return SCS1IsCompatibleSVEVectorConversion
4931 bool SCS1IsCompatibleRVVVectorConversion =
4933 bool SCS2IsCompatibleRVVVectorConversion =
4936 if (SCS1IsCompatibleRVVVectorConversion !=
4937 SCS2IsCompatibleRVVVectorConversion)
4938 return SCS1IsCompatibleRVVVectorConversion
4997 if (UnqualT1 == UnqualT2)
5015 bool ObjCLifetimeConversion;
5025 if (CanPick1 != CanPick2)
5079 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5087 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
5104 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
5111 bool FromAssignRight
5120 if (ToPtr1->isObjCIdType() &&
5121 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
5123 if (ToPtr2->isObjCIdType() &&
5124 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
5129 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
5131 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
5136 if (ToPtr1->isObjCClassType() &&
5137 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
5139 if (ToPtr2->isObjCClassType() &&
5140 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
5145 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
5147 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
5153 (ToAssignLeft != ToAssignRight)) {
5164 }
else if (IsSecondSame)
5173 (FromAssignLeft != FromAssignRight))
5187 CXXRecordDecl *FromPointee1 = FromMemPointer1->getMostRecentCXXRecordDecl();
5192 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
5199 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
5237 if (!T.getQualifiers().hasUnaligned())
5251 "T1 must be the pointee type of the reference type");
5252 assert(!OrigT2->
isReferenceType() &&
"T2 cannot be a reference type");
5275 if (UnqualT1 == UnqualT2) {
5279 Conv |= ReferenceConversions::DerivedToBase;
5282 Context.canBindObjCObjectType(UnqualT1, UnqualT2))
5283 Conv |= ReferenceConversions::ObjC;
5286 Conv |= ReferenceConversions::Function;
5290 bool ConvertedReferent = Conv != 0;
5294 bool PreviousToQualsIncludeConst =
true;
5295 bool TopLevel =
true;
5301 Conv |= ReferenceConversions::Qualification;
5307 Conv |= ReferenceConversions::NestedQualification;
5315 bool ObjCLifetimeConversion =
false;
5317 PreviousToQualsIncludeConst,
5319 return (ConvertedReferent ||
Context.hasSimilarType(T1, T2))
5324 if (ObjCLifetimeConversion)
5325 Conv |= ReferenceConversions::ObjCLifetime;
5328 }
while (
Context.UnwrapSimilarTypes(T1, T2));
5333 return (ConvertedReferent ||
Context.hasSameUnqualifiedType(T1, T2))
5344 bool AllowExplicit) {
5345 assert(T2->
isRecordType() &&
"Can only find conversions of record types.");
5349 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5350 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5357 = dyn_cast<FunctionTemplateDecl>(D);
5374 if (!ConvTemplate &&
5398 ConvTemplate, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5399 false, AllowExplicit);
5402 Conv, I.getPair(), ActingDC,
Init, DeclType, CandidateSet,
5403 false, AllowExplicit);
5406 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5412 assert(Best->HasFinalConversion);
5424 if (!Best->FinalConversion.DirectBinding)
5436 "Expected a direct reference binding!");
5442 Cand != CandidateSet.
end(); ++Cand)
5454 llvm_unreachable(
"Invalid OverloadResult!");
5459static ImplicitConversionSequence
5462 bool SuppressUserConversions,
5463 bool AllowExplicit) {
5464 assert(DeclType->
isReferenceType() &&
"Reference init needs a reference");
5491 auto SetAsReferenceBinding = [&](
bool BindsDirectly) {
5496 ICS.
Standard.
Second = (RefConv & Sema::ReferenceConversions::DerivedToBase)
5498 : (RefConv & Sema::ReferenceConversions::ObjC)
5506 Sema::ReferenceConversions::NestedQualification)
5520 (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0;
5544 SetAsReferenceBinding(
true);
5593 SetAsReferenceBinding(S.
getLangOpts().CPlusPlus11 ||
5684 AllowedExplicit::None,
5709 if (isRValRef && LValRefType) {
5726static ImplicitConversionSequence
5728 bool SuppressUserConversions,
5729 bool InOverloadResolution,
5730 bool AllowObjCWritebackConversion,
5731 bool AllowExplicit =
false);
5735static ImplicitConversionSequence
5737 bool SuppressUserConversions,
5738 bool InOverloadResolution,
5739 bool AllowObjCWritebackConversion) {
5752 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT))
5754 InitTy = IAT->getElementType();
5780 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5786 SuppressUserConversions,
5787 InOverloadResolution,
5788 AllowObjCWritebackConversion);
5796 Result.setStandard();
5797 Result.Standard.setAsIdentityConversion();
5798 Result.Standard.setFromType(ToType);
5799 Result.Standard.setAllToTypes(ToType);
5824 bool IsUnbounded =
false;
5828 if (CT->getSize().ult(e)) {
5832 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5835 if (CT->getSize().ugt(e)) {
5841 S, &EmptyList, InitTy, SuppressUserConversions,
5842 InOverloadResolution, AllowObjCWritebackConversion);
5843 if (DfltElt.
isBad()) {
5847 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5858 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5867 Result.setStandard();
5868 Result.Standard.setAsIdentityConversion();
5869 Result.Standard.setFromType(InitTy);
5870 Result.Standard.setAllToTypes(InitTy);
5871 for (
unsigned i = 0; i < e; ++i) {
5874 S,
Init, InitTy, SuppressUserConversions, InOverloadResolution,
5875 AllowObjCWritebackConversion);
5885 if (Result.isBad()) {
5886 Result.setInitializerListContainerType(ContTy, IsUnbounded);
5896 S, From->
getEndLoc(), DfltElt, Result) ==
5914 AllowedExplicit::None,
5915 InOverloadResolution,
false,
5916 AllowObjCWritebackConversion,
5934 Result.setUserDefined();
5935 Result.UserDefined.Before.setAsIdentityConversion();
5937 Result.UserDefined.Before.setFromType(
QualType());
5938 Result.UserDefined.Before.setAllToTypes(
QualType());
5940 Result.UserDefined.After.setAsIdentityConversion();
5941 Result.UserDefined.After.setFromType(ToType);
5942 Result.UserDefined.After.setAllToTypes(ToType);
5943 Result.UserDefined.ConversionFunction =
nullptr;
5960 if (From->
getNumInits() == 1 && !IsDesignatedInit) {
5981 SuppressUserConversions,
5989 InOverloadResolution,
5990 AllowObjCWritebackConversion);
5991 if (Result.isFailure())
5993 assert(!Result.isEllipsis() &&
5994 "Sub-initialization cannot result in ellipsis conversion.");
6000 Result.UserDefined.After;
6028 S, From->
getInit(0), ToType, SuppressUserConversions,
6029 InOverloadResolution, AllowObjCWritebackConversion);
6030 if (Result.isStandard())
6031 Result.Standard.FromBracedInitList =
true;
6035 else if (NumInits == 0) {
6036 Result.setStandard();
6037 Result.Standard.setAsIdentityConversion();
6038 Result.Standard.setFromType(ToType);
6039 Result.Standard.setAllToTypes(ToType);
6056static ImplicitConversionSequence
6058 bool SuppressUserConversions,
6059 bool InOverloadResolution,
6060 bool AllowObjCWritebackConversion,
6061 bool AllowExplicit) {
6062 if (
InitListExpr *FromInitList = dyn_cast<InitListExpr>(From))
6064 InOverloadResolution,AllowObjCWritebackConversion);
6069 SuppressUserConversions, AllowExplicit);
6072 SuppressUserConversions,
6073 AllowedExplicit::None,
6074 InOverloadResolution,
6076 AllowObjCWritebackConversion,
6089 return !ICS.
isBad();
6098 const CXXRecordDecl *ActingContext,
bool InOverloadResolution =
false,
6100 bool SuppressUserConversion =
false) {
6108 assert(FromClassification.
isLValue());
6119 if (Method->isExplicitObjectMemberFunction()) {
6120 if (ExplicitParameterType.isNull())
6121 ExplicitParameterType = Method->getFunctionObjectParameterReferenceType();
6123 ValueKindFromClassification(FromClassification));
6125 S, &TmpExpr, ExplicitParameterType, SuppressUserConversion,
6142 Qualifiers Quals = Method->getMethodQualifiers();
6180 FromType, ImplicitParamType);
6190 FromType, ImplicitParamType);
6203 }
else if (!Method->isExplicitObjectMemberFunction()) {
6205 FromType, ImplicitParamType);
6210 switch (Method->getRefQualifier()) {
6225 if (!FromClassification.
isRValue()) {
6247 = (Method->getRefQualifier() ==
RQ_None);
6258 QualType ImplicitParamRecordType =
Method->getFunctionObjectParameterType();
6263 DestType =
Method->getThisType();
6266 FromRecordType = From->
getType();
6267 DestType = ImplicitParamRecordType;
6275 Method->getRefQualifier() !=
6293 <<
Method->getDeclName() << FromRecordType << (CVR - 1)
6295 Diag(
Method->getLocation(), diag::note_previous_decl)
6296 <<
Method->getDeclName();
6304 bool IsRValueQualified =
6308 << IsRValueQualified;
6309 Diag(
Method->getLocation(), diag::note_previous_decl)
6310 <<
Method->getDeclName();
6320 llvm_unreachable(
"Lists are not objects");
6323 return Diag(From->
getBeginLoc(), diag::err_member_function_call_bad_type)
6324 << ImplicitParamRecordType << FromRecordType
6333 From = FromRes.
get();
6342 CK = CK_AddressSpaceConversion;
6367 AllowedExplicit::Conversions,
6378 return AMDGPU().ExpandAMDGPUPredicateBuiltIn(From);
6451 llvm_unreachable(
"found a first conversion kind in Second");
6455 llvm_unreachable(
"found a third conversion kind in Second");
6461 llvm_unreachable(
"unknown conversion kind");
6471 [[maybe_unused]]
bool isCCEAllowedPreCXX11 =
6473 assert((S.
getLangOpts().CPlusPlus11 || isCCEAllowedPreCXX11) &&
6474 "converted constant expression outside C++11 or TTP matching");
6506 if (T->isRecordType())
6515 diag::err_typecheck_converted_constant_expression)
6521 llvm_unreachable(
"bad conversion in converted constant expression");
6527 diag::err_typecheck_converted_constant_expression_disallowed)
6533 diag::err_typecheck_converted_constant_expression_indirect)
6543 diag::err_reference_bind_to_bitfield_in_cce)
6551 bool IsTemplateArgument =
6553 if (T->isRecordType()) {
6554 assert(IsTemplateArgument &&
6555 "unexpected class type converted constant expr");
6564 if (Result.isInvalid())
6571 IsTemplateArgument);
6572 if (Result.isInvalid())
6576 bool ReturnPreNarrowingValue =
false;
6579 PreNarrowingType)) {
6589 PreNarrowingValue.
isInt()) {
6592 ReturnPreNarrowingValue =
true;
6618 << CCE << 0 << From->
getType() << T;
6623 if (!ReturnPreNarrowingValue)
6624 PreNarrowingValue = {};
6640 if (Result.isInvalid() || Result.get()->isValueDependent()) {
6645 RequireInt, PreNarrowingValue);
6652 return ::BuildConvertedConstantExpression(*
this, From, T, CCE, Dest,
6659 return ::CheckConvertedConstantExpression(*
this, From, T,
Value, CCE,
false,
6664 llvm::APSInt &
Value,
6666 assert(T->isIntegralOrEnumerationType() &&
"unexpected converted const type");
6671 if (!R.isInvalid() && !R.get()->isValueDependent())
6679 const APValue &PreNarrowingValue) {
6691 Kind = ConstantExprKind::ClassTemplateArgument;
6693 Kind = ConstantExprKind::NonClassTemplateArgument;
6695 Kind = ConstantExprKind::Normal;
6698 (RequireInt && !Eval.
Val.
isInt())) {
6705 if (Notes.empty()) {
6708 if (
const auto *CE = dyn_cast<ConstantExpr>(E)) {
6712 "ConstantExpr has no value associated with it");
6718 Value = std::move(PreNarrowingValue);
6724 if (Notes.size() == 1 &&
6725 Notes[0].second.getDiagID() == diag::note_invalid_subexpr_in_const_expr) {
6726 Diag(Notes[0].first, diag::err_expr_not_cce) << CCE;
6727 }
else if (!Notes.empty() && Notes[0].second.getDiagID() ==
6728 diag::note_constexpr_invalid_template_arg) {
6729 Notes[0].second.setDiagID(diag::err_constexpr_invalid_template_arg);
6730 for (
unsigned I = 0; I < Notes.size(); ++I)
6731 Diag(Notes[I].first, Notes[I].second);
6735 for (
unsigned I = 0; I < Notes.size(); ++I)
6736 Diag(Notes[I].first, Notes[I].second);
6755static ImplicitConversionSequence
6763 AllowedExplicit::Conversions,
6805 "expected a member expression");
6807 if (
const auto M = dyn_cast<UnresolvedMemberExpr>(MemExprE);
6808 M && !M->isImplicitAccess())
6809 Base = M->getBase();
6810 else if (
const auto M = dyn_cast<MemberExpr>(MemExprE);
6811 M && !M->isImplicitAccess())
6812 Base = M->getBase();
6816 if (T->isPointerType())
6845 assert(Method->isExplicitObjectMemberFunction() &&
6846 "Method is not an explicit member function");
6847 assert(NewArgs.empty() &&
"NewArgs should be empty");
6849 NewArgs.reserve(Args.size() + 1);
6851 NewArgs.push_back(
This);
6852 NewArgs.append(Args.begin(), Args.end());
6855 Method,
Object->getBeginLoc());
6861 return AllowScopedEnumerations ? T->isIntegralOrEnumerationType()
6862 : T->isIntegralOrUnscopedEnumerationType();
6874 for (
unsigned I = 0, N = ViableConversions.
size(); I != N; ++I) {
6886 QualType T,
bool HadMultipleCandidates,
6888 if (ExplicitConversions.
size() == 1 && !Converter.
Suppress) {
6896 std::string TypeStr;
6901 "static_cast<" + TypeStr +
">(")
6913 HadMultipleCandidates);
6914 if (Result.isInvalid())
6920 From, Result.get()->
getType());
6921 if (Result.isInvalid())
6923 From = Result.get();
6930 QualType T,
bool HadMultipleCandidates,
6946 HadMultipleCandidates);
6947 if (Result.isInvalid())
6951 CK_UserDefinedConversion, Result.get(),
6952 nullptr, Result.get()->getValueKind(),
6977 if (
auto *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)) {
6979 ConvTemplate, FoundDecl, ActingContext, From, ToType, CandidateSet,
6985 Conv, FoundDecl, ActingContext, From, ToType, CandidateSet,
7019 From = result.
get();
7026 if (Converter.
match(T))
7033 const RecordType *RecordTy = T->getAsCanonical<RecordType>();
7046 : Converter(Converter), From(From) {}
7051 } IncompleteDiagnoser(Converter, From);
7062 ->getDefinitionOrSelf()
7063 ->getVisibleConversionFunctions();
7065 bool HadMultipleCandidates =
7070 bool HasUniqueTargetType =
true;
7086 "Conversion operator templates are considered potentially "
7090 if (Converter.
match(CurToType) || ConvTemplate) {
7096 ExplicitConversions.
addDecl(I.getDecl(), I.getAccess());
7101 else if (HasUniqueTargetType &&
7103 HasUniqueTargetType =
false;
7105 ViableConversions.
addDecl(I.getDecl(), I.getAccess());
7123 HadMultipleCandidates,
7124 ExplicitConversions))
7130 if (!HasUniqueTargetType)
7149 HadMultipleCandidates,
Found))
7158 HadMultipleCandidates,
7159 ExplicitConversions))
7167 switch (ViableConversions.
size()) {
7170 HadMultipleCandidates,
7171 ExplicitConversions))
7181 HadMultipleCandidates,
Found))
7212 if (Proto->getNumParams() < 1)
7216 QualType ArgType = Proto->getParamType(0).getNonReferenceType();
7217 if (Context.hasSameUnqualifiedType(T1, ArgType))
7221 if (Proto->getNumParams() < 2)
7225 QualType ArgType = Proto->getParamType(1).getNonReferenceType();
7226 if (Context.hasSameUnqualifiedType(T2, ArgType))
7245 unsigned SeenAt = 0;
7247 bool HasDefault =
false;
7256 return HasDefault || SeenAt != 0;
7262 bool PartialOverloading,
bool AllowExplicit,
bool AllowExplicitConversions,
7265 bool StrictPackMatch) {
7268 assert(Proto &&
"Functions without a prototype cannot be overloaded");
7269 assert(!
Function->getDescribedFunctionTemplate() &&
7270 "Use AddTemplateOverloadCandidate for function templates");
7283 CandidateSet, SuppressUserConversions,
7284 PartialOverloading, EarlyConversions, PO,
7320 CandidateSet.
addCandidate(Args.size(), EarlyConversions);
7334 Candidate.
Viable =
false;
7347 bool IsImplicitlyInstantiated =
false;
7348 if (
auto *SpecInfo =
Function->getTemplateSpecializationInfo()) {
7349 ND = SpecInfo->getTemplate();
7350 IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() ==
7361 const bool IsInlineFunctionInGMF =
7363 (IsImplicitlyInstantiated ||
Function->isInlined());
7366 Candidate.
Viable =
false;
7373 Candidate.
Viable =
false;
7384 if (Args.size() == 1 &&
Constructor->isSpecializationCopyingObject() &&
7385 (
Context.hasSameUnqualifiedType(ClassType, Args[0]->getType()) ||
7388 Candidate.
Viable =
false;
7400 auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.
getDecl());
7401 if (Shadow && Args.size() == 1 &&
Constructor->getNumParams() >= 1 &&
7402 Constructor->getParamDecl(0)->getType()->isReferenceType()) {
7409 Candidate.
Viable =
false;
7418 Constructor->getMethodQualifiers().getAddressSpace(),
7420 Candidate.
Viable =
false;
7433 Candidate.
Viable =
false;
7443 unsigned MinRequiredArgs =
Function->getMinRequiredArguments();
7444 if (!AggregateCandidateDeduction && Args.size() < MinRequiredArgs &&
7445 !PartialOverloading) {
7447 Candidate.
Viable =
false;
7461 Candidate.
Viable =
false;
7467 if (
Function->getTrailingRequiresClause()) {
7472 Candidate.
Viable =
false;
7481 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7484 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
7487 }
else if (ArgIdx < NumParams) {
7498 Args[ArgIdx]->
getType().getAddressSpace() ==
7500 Diag(Args[ArgIdx]->getBeginLoc(), diag::warn_hlsl_groupshared_inout);
7503 *
this, Args[ArgIdx], ParamType, SuppressUserConversions,
7506 getLangOpts().ObjCAutoRefCount, AllowExplicitConversions);
7508 Candidate.
Viable =
false;
7520 if (EnableIfAttr *FailedAttr =
7522 Candidate.
Viable =
false;
7532 if (Methods.size() <= 1)
7535 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7541 if (
Method->param_size() > NumNamedArgs)
7542 NumNamedArgs =
Method->param_size();
7543 if (Args.size() < NumNamedArgs)
7546 for (
unsigned i = 0; i < NumNamedArgs; i++) {
7548 if (Args[i]->isTypeDependent()) {
7554 Expr *argExpr = Args[i];
7555 assert(argExpr &&
"SelectBestMethod(): missing expression");
7560 !param->
hasAttr<CFConsumedAttr>())
7561 argExpr =
ObjC().stripARCUnbridgedCast(argExpr);
7578 if (ConversionState.
isBad() ||
7588 for (
unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
7589 if (Args[i]->isTypeDependent()) {
7602 if (Args.size() != NumNamedArgs)
7604 else if (
Match && NumNamedArgs == 0 && Methods.size() > 1) {
7607 for (
unsigned b = 0, e = Methods.size();
b < e;
b++) {
7608 QualType ReturnT = Methods[
b]->getReturnType();
7628 "Shouldn't have `this` for ctors!");
7629 assert(!Method->isStatic() &&
"Shouldn't have `this` for static methods!");
7631 ThisArg, std::nullopt, Method, Method);
7634 ConvertedThis = R.get();
7636 if (
auto *MD = dyn_cast<CXXMethodDecl>(Function)) {
7638 assert((MissingImplicitThis || MD->isStatic() ||
7640 "Expected `this` for non-ctor instance methods");
7642 ConvertedThis =
nullptr;
7647 unsigned ArgSizeNoVarargs = std::min(Function->param_size(), Args.size());
7650 for (
unsigned I = 0; I != ArgSizeNoVarargs; ++I) {
7653 S.
Context, Function->getParamDecl(I)),
7659 ConvertedArgs.push_back(R.get());
7666 if (!Function->isVariadic() && Args.size() < Function->getNumParams()) {
7667 for (
unsigned i = Args.size(), e = Function->getNumParams(); i != e; ++i) {
7674 ConvertedArgs.push_back(R.get());
7686 bool MissingImplicitThis) {
7687 auto EnableIfAttrs =
Function->specific_attrs<EnableIfAttr>();
7688 if (EnableIfAttrs.begin() == EnableIfAttrs.end())
7694 llvm::scope_exit UndelayDiags(
7696 DelayedDiagnostics.popUndelayed(CurrentState);
7700 Expr *DiscardedThis;
7702 *
this,
Function,
nullptr, CallLoc, Args, Trap,
7703 true, DiscardedThis, ConvertedArgs))
7704 return *EnableIfAttrs.begin();
7706 for (
auto *EIA : EnableIfAttrs) {
7710 if (EIA->getCond()->isValueDependent() ||
7711 !EIA->getCond()->EvaluateWithSubstitution(
7715 if (!
Result.isInt() || !
Result.getInt().getBoolValue())
7721template <
typename CheckFn>
7724 CheckFn &&IsSuccessful) {
7727 if (ArgDependent == DIA->getArgDependent())
7728 Attrs.push_back(DIA);
7735 auto WarningBegin = std::stable_partition(
7736 Attrs.begin(), Attrs.end(), [](
const DiagnoseIfAttr *DIA) {
7737 return DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_error &&
7738 DIA->getWarningGroup().empty();
7743 auto ErrAttr = llvm::find_if(llvm::make_range(Attrs.begin(), WarningBegin),
7745 if (ErrAttr != WarningBegin) {
7746 const DiagnoseIfAttr *DIA = *ErrAttr;
7747 S.
Diag(Loc, diag::err_diagnose_if_succeeded) << DIA->getMessage();
7748 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7749 << DIA->getParent() << DIA->getCond()->getSourceRange();
7753 auto ToSeverity = [](DiagnoseIfAttr::DefaultSeverity Sev) {
7755 case DiagnoseIfAttr::DS_warning:
7757 case DiagnoseIfAttr::DS_error:
7760 llvm_unreachable(
"Fully covered switch above!");
7763 for (
const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
7764 if (IsSuccessful(DIA)) {
7765 if (DIA->getWarningGroup().empty() &&
7766 DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_warning) {
7767 S.
Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
7768 S.
Diag(DIA->getLocation(), diag::note_from_diagnose_if)
7769 << DIA->getParent() << DIA->getCond()->getSourceRange();
7772 DIA->getWarningGroup());
7775 {ToSeverity(DIA->getDefaultSeverity()),
"%0",
7777 S.
Diag(Loc, DiagID) << DIA->getMessage();
7785 const Expr *ThisArg,
7790 [&](
const DiagnoseIfAttr *DIA) {
7795 if (!DIA->getCond()->EvaluateWithSubstitution(
7798 return Result.isInt() &&
Result.getInt().getBoolValue();
7805 *
this, ND,
false, Loc,
7806 [&](
const DiagnoseIfAttr *DIA) {
7808 return DIA->getCond()->EvaluateAsBooleanCondition(
Result,
Context) &&
7817 bool SuppressUserConversions,
7818 bool PartialOverloading,
7819 bool FirstArgumentIsBase) {
7831 if (Args.size() > 0) {
7832 if (
Expr *E = Args[0]) {
7842 FunctionArgs = Args.slice(1);
7846 FunTmpl, F.getPair(),
7848 ExplicitTemplateArgs, ObjectType, ObjectClassification,
7849 FunctionArgs, CandidateSet, SuppressUserConversions,
7850 PartialOverloading);
7854 ObjectClassification, FunctionArgs, CandidateSet,
7855 SuppressUserConversions, PartialOverloading);
7862 if (Args.size() > 0 &&
7866 FunctionArgs = Args.slice(1);
7870 ExplicitTemplateArgs, FunctionArgs,
7871 CandidateSet, SuppressUserConversions,
7872 PartialOverloading);
7875 SuppressUserConversions, PartialOverloading);
7885 bool SuppressUserConversions,
7895 "Expected a member function template");
7897 nullptr, ObjectType,
7898 ObjectClassification, Args, CandidateSet,
7899 SuppressUserConversions,
false, PO);
7902 ObjectType, ObjectClassification, Args, CandidateSet,
7903 SuppressUserConversions,
false, {}, PO);
7916 assert(Proto &&
"Methods without a prototype cannot be overloaded");
7918 "Use AddOverloadCandidate for constructors");
7927 Method->isMoveAssignmentOperator())
7934 bool IgnoreExplicitObject =
7935 (
Method->isExplicitObjectMemberFunction() &&
7938 bool ImplicitObjectMethodTreatedAsStatic =
7941 Method->isImplicitObjectMemberFunction();
7943 unsigned ExplicitOffset =
7944 !IgnoreExplicitObject &&
Method->isExplicitObjectMemberFunction() ? 1 : 0;
7946 unsigned NumParams =
Method->getNumParams() - ExplicitOffset +
7947 int(ImplicitObjectMethodTreatedAsStatic);
7949 unsigned ExtraArgs =
7956 CandidateSet.
addCandidate(Args.size() + ExtraArgs, EarlyConversions);
7972 Candidate.
Viable =
false;
7982 unsigned MinRequiredArgs =
Method->getMinRequiredArguments() -
7984 int(ImplicitObjectMethodTreatedAsStatic);
7986 if (Args.size() < MinRequiredArgs && !PartialOverloading) {
7988 Candidate.
Viable =
false;
7996 if (!IgnoreExplicitObject) {
7999 else if (
Method->isStatic()) {
8009 Candidate.
Conversions[FirstConvIdx].setStaticObjectArgument();
8014 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8015 Method, ActingContext,
true);
8016 if (Candidate.
Conversions[FirstConvIdx].isBad()) {
8017 Candidate.
Viable =
false;
8028 Candidate.
Viable =
false;
8033 if (
Method->getTrailingRequiresClause()) {
8038 Candidate.
Viable =
false;
8046 for (
unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
8049 if (Candidate.
Conversions[ConvIdx].isInitialized()) {
8052 }
else if (ArgIdx < NumParams) {
8058 if (ImplicitObjectMethodTreatedAsStatic) {
8059 ParamType = ArgIdx == 0
8060 ?
Method->getFunctionObjectParameterReferenceType()
8063 ParamType = Proto->
getParamType(ArgIdx + ExplicitOffset);
8067 SuppressUserConversions,
8072 Candidate.
Viable =
false;
8084 if (EnableIfAttr *FailedAttr =
8086 Candidate.
Viable =
false;
8093 Candidate.
Viable =
false;
8104 bool SuppressUserConversions,
bool PartialOverloading,
8122 PartialOverloading,
false,
8123 false, ObjectType, ObjectClassification,
8127 bool OnlyInitializeNonUserDefinedConversions) {
8128 return S.CheckNonDependentConversions(
8129 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
8130 Sema::CheckNonDependentConversionsFlag(
8131 SuppressUserConversions,
8132 OnlyInitializeNonUserDefinedConversions),
8133 ActingContext, ObjectType, ObjectClassification, PO);
8137 CandidateSet.
addCandidate(Conversions.size(), Conversions);
8140 Candidate.
Viable =
false;
8149 Method->isStatic() ||
8150 (!Method->isExplicitObjectMemberFunction() && ObjectType.
isNull());
8164 assert(
Specialization &&
"Missing member function template specialization?");
8166 "Specialization is not a member function?");
8169 ObjectClassification, Args, CandidateSet, SuppressUserConversions,
8183 if (ExplicitTemplateArgs ||
8186 *
this, CandidateSet, MethodTmpl, FoundDecl, ActingContext,
8187 ExplicitTemplateArgs, ObjectType, ObjectClassification, Args,
8188 SuppressUserConversions, PartialOverloading, PO);
8193 MethodTmpl, FoundDecl, ActingContext, ObjectType, ObjectClassification,
8194 Args, SuppressUserConversions, PartialOverloading, PO);
8212 bool SuppressUserConversions,
bool PartialOverloading,
bool AllowExplicit,
8214 bool AggregateCandidateDeduction) {
8223 Candidate.
Viable =
false;
8243 PartialOverloading, AggregateCandidateDeduction,
8250 bool OnlyInitializeNonUserDefinedConversions) {
8251 return S.CheckNonDependentConversions(
8252 FunctionTemplate, ParamTypes, Args, CandidateSet, Conversions,
8253 Sema::CheckNonDependentConversionsFlag(
8254 SuppressUserConversions,
8255 OnlyInitializeNonUserDefinedConversions),
8256 nullptr, QualType(), {}, PO);
8259 OverloadCandidate &Candidate =
8260 CandidateSet.addCandidate(Conversions.size(), Conversions);
8263 Candidate.
Viable =
false;
8265 CandidateSet.getRewriteInfo().getRewriteKind(Candidate.
Function, PO);
8271 CandidateSet.getKind() ==
8277 ->isExplicitObjectMemberFunction() &&
8293 assert(
Specialization &&
"Missing function template specialization?");
8295 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
8296 PartialOverloading, AllowExplicit,
8297 false, IsADLCandidate, Conversions, PO,
8298 Info.AggregateDeductionCandidateHasMismatchedArity,
8299 Info.hasStrictPackMatch());
8306 bool PartialOverloading,
bool AllowExplicit,
ADLCallKind IsADLCandidate,
8313 if (ExplicitTemplateArgs ||
8316 DependentExplicitSpecifier)) {
8320 Args, SuppressUserConversions, PartialOverloading, AllowExplicit,
8321 IsADLCandidate, PO, AggregateCandidateDeduction);
8323 if (DependentExplicitSpecifier)
8330 PartialOverloading, AllowExplicit, IsADLCandidate, PO,
8331 AggregateCandidateDeduction);
8344 const bool AllowExplicit =
false;
8346 bool ForOverloadSetAddressResolution =
8349 auto *
Method = dyn_cast<CXXMethodDecl>(FD);
8350 bool HasThisConversion = !ForOverloadSetAddressResolution &&
Method &&
8352 unsigned ThisConversions = HasThisConversion ? 1 : 0;
8368 if (!FD->hasCXXExplicitFunctionObjectParameter() ||
8369 !ParamTypes[0]->isDependentType()) {
8371 *
this, CandidateSet.
getLocation(), ObjectType, ObjectClassification,
8372 Method, ActingContext,
true,
8373 FD->hasCXXExplicitFunctionObjectParameter() ? ParamTypes[0]
8383 auto MaybeInvolveUserDefinedConversion = [&](
QualType ParamType,
8407 if (
auto *RD =
ArgType->getAsCXXRecordDecl();
8408 RD && RD->hasDefinition() &&
8409 !RD->getVisibleConversionFunctions().empty())
8416 HasThisConversion &&
Method->hasCXXExplicitFunctionObjectParameter() ? 1
8419 for (
unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
8421 QualType ParamType = ParamTypes[I + Offset];
8425 ConvIdx = Args.size() - 1 - I;
8426 assert(Args.size() + ThisConversions == 2 &&
8427 "number of args (including 'this') must be exactly 2 for "
8431 assert(!HasThisConversion || (ConvIdx == 0 && I == 0));
8434 ConvIdx = ThisConversions + I;
8439 MaybeInvolveUserDefinedConversion(ParamType, Args[I]->
getType()))
8468 bool AllowObjCPointerConversion) {
8476 bool ObjCLifetimeConversion;
8478 ObjCLifetimeConversion))
8483 if (!AllowObjCPointerConversion)
8487 bool IncompatibleObjC =
false;
8497 bool AllowExplicit,
bool AllowResultConversion,
bool StrictPackMatch) {
8499 "Conversion function templates use AddTemplateConversionCandidate");
8514 if (!AllowResultConversion &&
8526 AllowObjCConversionOnExplicit))
8548 if (!AllowExplicit && Conversion->
isExplicit()) {
8549 Candidate.
Viable =
false;
8576 Candidate.
Viable =
false;
8585 Candidate.
Viable =
false;
8596 QualType ToCanon =
Context.getCanonicalType(ToType).getUnqualifiedType();
8597 if (FromCanon == ToCanon ||
8599 Candidate.
Viable =
false;
8616 CK_FunctionToPointerDecay, &ConversionRef,
8621 Candidate.
Viable =
false;
8651 Candidate.
Viable =
false;
8663 Candidate.
Viable =
false;
8670 Candidate.
Viable =
false;
8676 "Can only end up with a standard conversion sequence or failure");
8679 if (EnableIfAttr *FailedAttr =
8681 Candidate.
Viable =
false;
8688 Candidate.
Viable =
false;
8697 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
8698 bool AllowResultConversion) {
8707 Candidate.
Viable =
false;
8724 Candidate.
Viable =
false;
8734 assert(
Specialization &&
"Missing function template specialization?");
8736 ToType, CandidateSet, AllowObjCConversionOnExplicit,
8737 AllowExplicit, AllowResultConversion,
8745 bool AllowExplicit,
bool AllowResultConversion) {
8747 "Only conversion function templates permitted here");
8758 ToType, AllowObjCConversionOnExplicit, AllowExplicit,
8759 AllowResultConversion);
8767 AllowObjCConversionOnExplicit, AllowExplicit, AllowResultConversion);
8806 if (ObjectInit.
isBad()) {
8807 Candidate.
Viable =
false;
8818 Candidate.
Conversions[0].UserDefined.EllipsisConversion =
false;
8819 Candidate.
Conversions[0].UserDefined.HadMultipleCandidates =
false;
8820 Candidate.
Conversions[0].UserDefined.ConversionFunction = Conversion;
8821 Candidate.
Conversions[0].UserDefined.FoundConversionFunction = FoundDecl;
8824 Candidate.
Conversions[0].UserDefined.After.setAsIdentityConversion();
8832 if (Args.size() > NumParams && !Proto->
isVariadic()) {
8833 Candidate.
Viable =
false;
8840 if (Args.size() < NumParams) {
8842 Candidate.
Viable =
false;
8849 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
8850 if (ArgIdx < NumParams) {
8863 Candidate.
Viable =
false;
8880 Candidate.
Viable =
false;
8886 if (EnableIfAttr *FailedAttr =
8888 Candidate.
Viable =
false;
8912 "unqualified operator lookup found a member function");
8916 FunctionArgs, CandidateSet);
8922 FunctionArgs[1], FunctionArgs[0]);
8924 Reversed, CandidateSet,
false,
false,
true,
8925 ADLCallKind::NotADL,
8929 if (ExplicitTemplateArgs)
8934 {FunctionArgs[1], FunctionArgs[0]}, CandidateSet,
8935 false,
false,
true,
false, ADLCallKind::NotADL, {},
8967 if (!T1RD || (!IsComplete && !T1RD->isBeingDefined()))
8975 OperEnd = Operators.
end();
8976 Oper != OperEnd; ++Oper) {
8977 if (Oper->getAsFunction() &&
8980 *
this, {Args[1], Args[0]}, Oper->getAsFunction()))
8983 Args[0]->Classify(
Context), Args.slice(1),
8984 CandidateSet,
false, PO);
8991 bool IsAssignmentOperator,
8992 unsigned NumContextualBoolArguments) {
9007 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9020 if (ArgIdx < NumContextualBoolArguments) {
9021 assert(ParamTys[ArgIdx] ==
Context.BoolTy &&
9022 "Contextual conversion to bool requires bool type");
9028 ArgIdx == 0 && IsAssignmentOperator,
9034 Candidate.
Viable =
false;
9047class BuiltinCandidateTypeSet {
9053 TypeSet PointerTypes;
9057 TypeSet MemberPointerTypes;
9061 TypeSet EnumerationTypes;
9065 TypeSet VectorTypes;
9069 TypeSet MatrixTypes;
9072 TypeSet BitIntTypes;
9075 bool HasNonRecordTypes;
9079 bool HasArithmeticOrEnumeralTypes;
9083 bool HasNullPtrType;
9092 bool AddPointerWithMoreQualifiedTypeVariants(
QualType Ty,
9094 bool AddMemberPointerWithMoreQualifiedTypeVariants(
QualType Ty);
9098 typedef TypeSet::iterator
iterator;
9100 BuiltinCandidateTypeSet(
Sema &SemaRef)
9101 : HasNonRecordTypes(
false),
9102 HasArithmeticOrEnumeralTypes(
false),
9103 HasNullPtrType(
false),
9105 Context(SemaRef.Context) { }
9107 void AddTypesConvertedFrom(
QualType Ty,
9109 bool AllowUserConversions,
9110 bool AllowExplicitConversions,
9111 const Qualifiers &VisibleTypeConversionsQuals);
9113 llvm::iterator_range<iterator> pointer_types() {
return PointerTypes; }
9114 llvm::iterator_range<iterator> member_pointer_types() {
9115 return MemberPointerTypes;
9117 llvm::iterator_range<iterator> enumeration_types() {
9118 return EnumerationTypes;
9120 llvm::iterator_range<iterator> vector_types() {
return VectorTypes; }
9121 llvm::iterator_range<iterator> matrix_types() {
return MatrixTypes; }
9122 llvm::iterator_range<iterator> bitint_types() {
return BitIntTypes; }
9124 bool containsMatrixType(QualType Ty)
const {
return MatrixTypes.count(Ty); }
9125 bool hasNonRecordTypes() {
return HasNonRecordTypes; }
9126 bool hasArithmeticOrEnumeralTypes() {
return HasArithmeticOrEnumeralTypes; }
9127 bool hasNullPtrType()
const {
return HasNullPtrType; }
9142BuiltinCandidateTypeSet::AddPointerWithMoreQualifiedTypeVariants(QualType Ty,
9143 const Qualifiers &VisibleQuals) {
9146 if (!PointerTypes.insert(Ty))
9150 const PointerType *PointerTy = Ty->
getAs<PointerType>();
9151 bool buildObjCPtr =
false;
9153 const ObjCObjectPointerType *PTy = Ty->
castAs<ObjCObjectPointerType>();
9155 buildObjCPtr =
true;
9167 unsigned BaseCVR = PointeeTy.getCVRQualifiers();
9173 if ((CVR | BaseCVR) != CVR)
continue;
9188 QualType QPointerTy;
9195 PointerTypes.insert(QPointerTy);
9211BuiltinCandidateTypeSet::AddMemberPointerWithMoreQualifiedTypeVariants(
9214 if (!MemberPointerTypes.insert(Ty))
9217 const MemberPointerType *PointerTy = Ty->
getAs<MemberPointerType>();
9218 assert(PointerTy &&
"type was not a member pointer type!");
9233 if ((CVR | BaseCVR) != CVR)
continue;
9237 QPointeeTy, std::nullopt, Cls));
9252BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty,
9254 bool AllowUserConversions,
9255 bool AllowExplicitConversions,
9256 const Qualifiers &VisibleQuals) {
9262 if (
const ReferenceType *RefTy = Ty->
getAs<ReferenceType>())
9267 Ty = SemaRef.Context.getArrayDecayedType(Ty);
9274 HasNonRecordTypes = HasNonRecordTypes || !TyIsRec;
9277 HasArithmeticOrEnumeralTypes =
9281 PointerTypes.insert(Ty);
9282 else if (Ty->
getAs<PointerType>() || Ty->
getAs<ObjCObjectPointerType>()) {
9285 if (!AddPointerWithMoreQualifiedTypeVariants(Ty, VisibleQuals))
9289 if (!AddMemberPointerWithMoreQualifiedTypeVariants(Ty))
9292 HasArithmeticOrEnumeralTypes =
true;
9293 EnumerationTypes.insert(Ty);
9295 HasArithmeticOrEnumeralTypes =
true;
9296 BitIntTypes.insert(Ty);
9300 HasArithmeticOrEnumeralTypes =
true;
9301 VectorTypes.insert(Ty);
9305 HasArithmeticOrEnumeralTypes =
true;
9306 MatrixTypes.insert(Ty);
9308 HasNullPtrType =
true;
9309 }
else if (AllowUserConversions && TyIsRec) {
9311 if (!SemaRef.isCompleteType(Loc, Ty))
9315 for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) {
9325 if (AllowExplicitConversions || !Conv->
isExplicit()) {
9373 ClassDecl = RHSMPType->getMostRecentCXXRecordDecl();
9421 if (Available.hasAtomic()) {
9422 Available.removeAtomic();
9429 if (Available.hasVolatile()) {
9430 Available.removeVolatile();
9464class BuiltinOperatorOverloadBuilder {
9467 ArrayRef<Expr *> Args;
9468 QualifiersAndAtomic VisibleTypeConversionsQuals;
9469 bool HasArithmeticOrEnumeralCandidateType;
9470 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes;
9471 OverloadCandidateSet &CandidateSet;
9473 static constexpr int ArithmeticTypesCap = 26;
9474 SmallVector<CanQualType, ArithmeticTypesCap> ArithmeticTypes;
9479 unsigned FirstIntegralType,
9481 unsigned FirstPromotedIntegralType,
9482 LastPromotedIntegralType;
9483 unsigned FirstPromotedArithmeticType,
9484 LastPromotedArithmeticType;
9485 unsigned NumArithmeticTypes;
9487 void InitArithmeticTypes() {
9489 FirstPromotedArithmeticType = 0;
9499 FirstIntegralType = ArithmeticTypes.size();
9500 FirstPromotedIntegralType = ArithmeticTypes.size();
9522 llvm::SmallSetVector<CanQualType, 2> BitIntCandidates;
9523 for (BuiltinCandidateTypeSet &Candidate : CandidateTypes) {
9524 for (QualType BitTy : Candidate.bitint_types())
9527 llvm::move(BitIntCandidates, std::back_inserter(ArithmeticTypes));
9528 LastPromotedIntegralType = ArithmeticTypes.size();
9529 LastPromotedArithmeticType = ArithmeticTypes.size();
9543 LastIntegralType = ArithmeticTypes.size();
9544 NumArithmeticTypes = ArithmeticTypes.size();
9551 assert(ArithmeticTypes.size() - BitIntCandidates.size() <=
9552 ArithmeticTypesCap &&
9553 "Enough inline storage for all arithmetic types.");
9558 void addPlusPlusMinusMinusStyleOverloads(QualType CandidateTy,
9561 QualType ParamTypes[2] = {
9601 void AddCandidate(QualType L, QualType R) {
9602 QualType LandR[2] = {L,
R};
9607 BuiltinOperatorOverloadBuilder(
9608 Sema &S, ArrayRef<Expr *> Args,
9609 QualifiersAndAtomic VisibleTypeConversionsQuals,
9610 bool HasArithmeticOrEnumeralCandidateType,
9611 SmallVectorImpl<BuiltinCandidateTypeSet> &CandidateTypes,
9612 OverloadCandidateSet &CandidateSet)
9614 VisibleTypeConversionsQuals(VisibleTypeConversionsQuals),
9615 HasArithmeticOrEnumeralCandidateType(
9616 HasArithmeticOrEnumeralCandidateType),
9617 CandidateTypes(CandidateTypes),
9618 CandidateSet(CandidateSet) {
9620 InitArithmeticTypes();
9643 if (!HasArithmeticOrEnumeralCandidateType)
9646 for (
unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) {
9647 const auto TypeOfT = ArithmeticTypes[Arith];
9649 if (Op == OO_MinusMinus)
9651 if (Op == OO_PlusPlus && S.
getLangOpts().CPlusPlus17)
9654 addPlusPlusMinusMinusStyleOverloads(
9671 void addPlusPlusMinusMinusPointerOverloads() {
9672 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
9674 if (!PtrTy->getPointeeType()->isObjectType())
9677 addPlusPlusMinusMinusStyleOverloads(
9679 (!PtrTy.isVolatileQualified() &&
9681 (!PtrTy.isRestrictQualified() &&
9696 void addUnaryStarPointerOverloads() {
9697 for (QualType ParamTy : CandidateTypes[0].pointer_types()) {
9702 if (
const FunctionProtoType *Proto =PointeeTy->
getAs<FunctionProtoType>())
9703 if (Proto->getMethodQuals() || Proto->getRefQualifier())
9716 void addUnaryPlusOrMinusArithmeticOverloads() {
9717 if (!HasArithmeticOrEnumeralCandidateType)
9720 for (
unsigned Arith = FirstPromotedArithmeticType;
9721 Arith < LastPromotedArithmeticType; ++Arith) {
9722 QualType ArithTy = ArithmeticTypes[Arith];
9727 for (QualType VecTy : CandidateTypes[0].vector_types())
9736 void addUnaryPlusPointerOverloads() {
9737 for (QualType ParamTy : CandidateTypes[0].pointer_types())
9746 void addUnaryTildePromotedIntegralOverloads() {
9747 if (!HasArithmeticOrEnumeralCandidateType)
9750 for (
unsigned Int = FirstPromotedIntegralType;
9751 Int < LastPromotedIntegralType; ++
Int) {
9752 QualType IntTy = ArithmeticTypes[
Int];
9757 for (QualType VecTy : CandidateTypes[0].vector_types())
9767 void addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads() {
9769 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9771 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9772 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
9777 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
9781 if (CandidateTypes[ArgIdx].hasNullPtrType()) {
9783 if (AddedTypes.insert(NullPtrTy).second) {
9784 QualType ParamTypes[2] = { NullPtrTy, NullPtrTy };
9803 void addGenericBinaryPointerOrEnumeralOverloads(
bool IsSpaceship) {
9816 llvm::DenseSet<std::pair<CanQualType, CanQualType> >
9817 UserDefinedBinaryOperators;
9819 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9820 if (!CandidateTypes[ArgIdx].enumeration_types().empty()) {
9822 CEnd = CandidateSet.
end();
9824 if (!
C->Viable || !
C->Function ||
C->Function->getNumParams() != 2)
9827 if (
C->Function->isFunctionTemplateSpecialization())
9834 QualType FirstParamType =
C->Function->getParamDecl(
Reversed ? 1 : 0)
9836 .getUnqualifiedType();
9837 QualType SecondParamType =
C->Function->getParamDecl(
Reversed ? 0 : 1)
9839 .getUnqualifiedType();
9847 UserDefinedBinaryOperators.insert(
9855 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9857 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
9858 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
9862 if (IsSpaceship && PtrTy->isFunctionPointerType())
9865 QualType ParamTypes[2] = {PtrTy, PtrTy};
9868 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
9873 if (!AddedTypes.insert(CanonType).second ||
9874 UserDefinedBinaryOperators.count(std::make_pair(CanonType,
9877 QualType ParamTypes[2] = {EnumTy, EnumTy};
9902 llvm::SmallPtrSet<QualType, 8> AddedTypes;
9904 for (
int Arg = 0; Arg < 2; ++Arg) {
9905 QualType AsymmetricParamTypes[2] = {
9909 for (QualType PtrTy : CandidateTypes[Arg].pointer_types()) {
9914 AsymmetricParamTypes[Arg] = PtrTy;
9915 if (Arg == 0 || Op == OO_Plus) {
9920 if (Op == OO_Minus) {
9925 QualType ParamTypes[2] = {PtrTy, PtrTy};
9961 void addGenericBinaryArithmeticOverloads() {
9962 if (!HasArithmeticOrEnumeralCandidateType)
9965 for (
unsigned Left = FirstPromotedArithmeticType;
9966 Left < LastPromotedArithmeticType; ++
Left) {
9967 for (
unsigned Right = FirstPromotedArithmeticType;
9968 Right < LastPromotedArithmeticType; ++
Right) {
9969 QualType LandR[2] = { ArithmeticTypes[
Left],
9970 ArithmeticTypes[
Right] };
9977 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
9978 for (QualType Vec2Ty : CandidateTypes[1].vector_types()) {
9979 QualType LandR[2] = {Vec1Ty, Vec2Ty};
9989 void addMatrixBinaryArithmeticOverloads() {
9990 if (!HasArithmeticOrEnumeralCandidateType)
9993 for (QualType M1 : CandidateTypes[0].matrix_types()) {
9995 AddCandidate(M1, M1);
9998 for (QualType M2 : CandidateTypes[1].matrix_types()) {
10000 if (!CandidateTypes[0].containsMatrixType(M2))
10001 AddCandidate(M2, M2);
10036 void addThreeWayArithmeticOverloads() {
10037 addGenericBinaryArithmeticOverloads();
10054 void addBinaryBitwiseArithmeticOverloads() {
10055 if (!HasArithmeticOrEnumeralCandidateType)
10058 for (
unsigned Left = FirstPromotedIntegralType;
10059 Left < LastPromotedIntegralType; ++
Left) {
10060 for (
unsigned Right = FirstPromotedIntegralType;
10061 Right < LastPromotedIntegralType; ++
Right) {
10062 QualType LandR[2] = { ArithmeticTypes[
Left],
10063 ArithmeticTypes[
Right] };
10076 void addAssignmentMemberPointerOrEnumeralOverloads() {
10078 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10080 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10081 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10088 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10113 void addAssignmentPointerOverloads(
bool isEqualOp) {
10115 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10117 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10121 else if (!PtrTy->getPointeeType()->isObjectType())
10125 QualType ParamTypes[2] = {
10132 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10134 if (NeedVolatile) {
10142 if (!PtrTy.isRestrictQualified() &&
10150 if (NeedVolatile) {
10162 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10167 QualType ParamTypes[2] = {
10176 bool NeedVolatile = !PtrTy.isVolatileQualified() &&
10178 if (NeedVolatile) {
10186 if (!PtrTy.isRestrictQualified() &&
10194 if (NeedVolatile) {
10219 void addAssignmentArithmeticOverloads(
bool isEqualOp) {
10220 if (!HasArithmeticOrEnumeralCandidateType)
10223 for (
unsigned Left = 0;
Left < NumArithmeticTypes; ++
Left) {
10224 for (
unsigned Right = FirstPromotedArithmeticType;
10225 Right < LastPromotedArithmeticType; ++
Right) {
10226 QualType ParamTypes[2];
10227 ParamTypes[1] = ArithmeticTypes[
Right];
10229 S, ArithmeticTypes[Left], Args[0]);
10232 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10242 for (QualType Vec1Ty : CandidateTypes[0].vector_types())
10243 for (QualType Vec2Ty : CandidateTypes[0].vector_types()) {
10244 QualType ParamTypes[2];
10245 ParamTypes[1] = Vec2Ty;
10273 void addAssignmentIntegralOverloads() {
10274 if (!HasArithmeticOrEnumeralCandidateType)
10277 for (
unsigned Left = FirstIntegralType;
Left < LastIntegralType; ++
Left) {
10278 for (
unsigned Right = FirstPromotedIntegralType;
10279 Right < LastPromotedIntegralType; ++
Right) {
10280 QualType ParamTypes[2];
10281 ParamTypes[1] = ArithmeticTypes[
Right];
10283 S, ArithmeticTypes[Left], Args[0]);
10286 VisibleTypeConversionsQuals, [&](QualifiersAndAtomic Quals) {
10302 void addExclaimOverload() {
10308 void addAmpAmpOrPipePipeOverload() {
10325 void addSubscriptOverloads() {
10326 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10336 for (QualType PtrTy : CandidateTypes[1].pointer_types()) {
10356 void addArrowStarOverloads() {
10357 for (QualType PtrTy : CandidateTypes[0].pointer_types()) {
10358 QualType C1Ty = PtrTy;
10360 QualifierCollector Q1;
10371 for (QualType MemPtrTy : CandidateTypes[1].member_pointer_types()) {
10378 QualType ParamTypes[2] = {PtrTy, MemPtrTy};
10381 if (!VisibleTypeConversionsQuals.
hasVolatile() &&
10384 if (!VisibleTypeConversionsQuals.
hasRestrict() &&
10403 void addConditionalOperatorOverloads() {
10405 llvm::SmallPtrSet<QualType, 8> AddedTypes;
10407 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
10408 for (QualType PtrTy : CandidateTypes[ArgIdx].pointer_types()) {
10412 QualType ParamTypes[2] = {PtrTy, PtrTy};
10416 for (QualType MemPtrTy : CandidateTypes[ArgIdx].member_pointer_types()) {
10420 QualType ParamTypes[2] = {MemPtrTy, MemPtrTy};
10425 for (QualType EnumTy : CandidateTypes[ArgIdx].enumeration_types()) {
10426 if (!EnumTy->castAsCanonical<EnumType>()->getDecl()->isScoped())
10432 QualType ParamTypes[2] = {EnumTy, EnumTy};
10451 VisibleTypeConversionsQuals.
addConst();
10452 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10454 if (Args[ArgIdx]->
getType()->isAtomicType())
10455 VisibleTypeConversionsQuals.
addAtomic();
10458 bool HasNonRecordCandidateType =
false;
10459 bool HasArithmeticOrEnumeralCandidateType =
false;
10461 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
10462 CandidateTypes.emplace_back(*
this);
10463 CandidateTypes[ArgIdx].AddTypesConvertedFrom(Args[ArgIdx]->
getType(),
10466 (Op == OO_Exclaim ||
10468 Op == OO_PipePipe),
10469 VisibleTypeConversionsQuals);
10470 HasNonRecordCandidateType = HasNonRecordCandidateType ||
10471 CandidateTypes[ArgIdx].hasNonRecordTypes();
10472 HasArithmeticOrEnumeralCandidateType =
10473 HasArithmeticOrEnumeralCandidateType ||
10474 CandidateTypes[ArgIdx].hasArithmeticOrEnumeralTypes();
10482 if (!HasNonRecordCandidateType &&
10483 !(Op == OO_Exclaim || Op == OO_AmpAmp || Op == OO_PipePipe))
10487 BuiltinOperatorOverloadBuilder OpBuilder(*
this, Args,
10488 VisibleTypeConversionsQuals,
10489 HasArithmeticOrEnumeralCandidateType,
10490 CandidateTypes, CandidateSet);
10496 llvm_unreachable(
"Expected an overloaded operator");
10501 case OO_Array_Delete:
10504 "Special operators don't use AddBuiltinOperatorCandidates");
10516 if (Args.size() == 1)
10517 OpBuilder.addUnaryPlusPointerOverloads();
10521 if (Args.size() == 1) {
10522 OpBuilder.addUnaryPlusOrMinusArithmeticOverloads();
10524 OpBuilder.addBinaryPlusOrMinusPointerOverloads(Op);
10525 OpBuilder.addGenericBinaryArithmeticOverloads();
10526 OpBuilder.addMatrixBinaryArithmeticOverloads();
10531 if (Args.size() == 1)
10532 OpBuilder.addUnaryStarPointerOverloads();
10534 OpBuilder.addGenericBinaryArithmeticOverloads();
10535 OpBuilder.addMatrixBinaryArithmeticOverloads();
10540 OpBuilder.addGenericBinaryArithmeticOverloads();
10544 case OO_MinusMinus:
10545 OpBuilder.addPlusPlusMinusMinusArithmeticOverloads(Op);
10546 OpBuilder.addPlusPlusMinusMinusPointerOverloads();
10549 case OO_EqualEqual:
10550 case OO_ExclaimEqual:
10551 OpBuilder.addEqualEqualOrNotEqualMemberPointerOrNullptrOverloads();
10552 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10553 OpBuilder.addGenericBinaryArithmeticOverloads();
10559 case OO_GreaterEqual:
10560 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
false);
10561 OpBuilder.addGenericBinaryArithmeticOverloads();
10565 OpBuilder.addGenericBinaryPointerOrEnumeralOverloads(
true);
10566 OpBuilder.addThreeWayArithmeticOverloads();
10573 case OO_GreaterGreater:
10574 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10578 if (Args.size() == 1)
10584 OpBuilder.addBinaryBitwiseArithmeticOverloads();
10588 OpBuilder.addUnaryTildePromotedIntegralOverloads();
10592 OpBuilder.addAssignmentMemberPointerOrEnumeralOverloads();
10596 case OO_MinusEqual:
10597 OpBuilder.addAssignmentPointerOverloads(Op == OO_Equal);
10601 case OO_SlashEqual:
10602 OpBuilder.addAssignmentArithmeticOverloads(Op == OO_Equal);
10605 case OO_PercentEqual:
10606 case OO_LessLessEqual:
10607 case OO_GreaterGreaterEqual:
10609 case OO_CaretEqual:
10611 OpBuilder.addAssignmentIntegralOverloads();
10615 OpBuilder.addExclaimOverload();
10620 OpBuilder.addAmpAmpOrPipePipeOverload();
10624 if (Args.size() == 2)
10625 OpBuilder.addSubscriptOverloads();
10629 OpBuilder.addArrowStarOverloads();
10632 case OO_Conditional:
10633 OpBuilder.addConditionalOperatorOverloads();
10634 OpBuilder.addGenericBinaryArithmeticOverloads();
10645 bool PartialOverloading) {
10662 CandEnd = CandidateSet.
end();
10663 Cand != CandEnd; ++Cand)
10664 if (Cand->Function) {
10668 Fns.
erase(FunTmpl);
10677 if (ExplicitTemplateArgs)
10681 FD, FoundDecl, Args, CandidateSet,
false,
10682 PartialOverloading,
true,
10683 false, ADLCallKind::UsesADL);
10686 FD, FoundDecl, {Args[1], Args[0]}, CandidateSet,
10687 false, PartialOverloading,
10694 FTD, FoundDecl, ExplicitTemplateArgs, Args, CandidateSet,
10695 false, PartialOverloading,
10696 true, ADLCallKind::UsesADL);
10698 *
this, Args, FTD->getTemplatedDecl())) {
10702 if (ReversedArgs.empty())
10706 FTD, FoundDecl, ExplicitTemplateArgs, ReversedArgs, CandidateSet,
10707 false, PartialOverloading,
10708 true, ADLCallKind::UsesADL,
10733 bool Cand1Attr = Cand1->
hasAttr<EnableIfAttr>();
10734 bool Cand2Attr = Cand2->
hasAttr<EnableIfAttr>();
10735 if (!Cand1Attr || !Cand2Attr) {
10736 if (Cand1Attr == Cand2Attr)
10737 return Comparison::Equal;
10738 return Cand1Attr ? Comparison::Better : Comparison::Worse;
10744 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
10745 for (
auto Pair : zip_longest(Cand1Attrs, Cand2Attrs)) {
10746 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
10747 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
10752 return Comparison::Worse;
10754 return Comparison::Better;
10759 (*Cand1A)->getCond()->Profile(Cand1ID, S.
getASTContext(),
true);
10760 (*Cand2A)->getCond()->Profile(Cand2ID, S.
getASTContext(),
true);
10761 if (Cand1ID != Cand2ID)
10762 return Comparison::Worse;
10765 return Comparison::Equal;
10773 return Comparison::Equal;
10779 return Comparison::Equal;
10780 return Comparison::Worse;
10783 return Comparison::Better;
10789 const auto *Cand1CPUSpec = Cand1.
Function->
getAttr<CPUSpecificAttr>();
10790 const auto *Cand2CPUSpec = Cand2.
Function->
getAttr<CPUSpecificAttr>();
10792 if (!Cand1CPUDisp && !Cand2CPUDisp && !Cand1CPUSpec && !Cand2CPUSpec)
10793 return Comparison::Equal;
10795 if (Cand1CPUDisp && !Cand2CPUDisp)
10796 return Comparison::Better;
10797 if (Cand2CPUDisp && !Cand1CPUDisp)
10798 return Comparison::Worse;
10800 if (Cand1CPUSpec && Cand2CPUSpec) {
10801 if (Cand1CPUSpec->cpus_size() != Cand2CPUSpec->cpus_size())
10802 return Cand1CPUSpec->cpus_size() < Cand2CPUSpec->cpus_size()
10803 ? Comparison::Better
10804 : Comparison::Worse;
10806 std::pair<CPUSpecificAttr::cpus_iterator, CPUSpecificAttr::cpus_iterator>
10807 FirstDiff = std::mismatch(
10808 Cand1CPUSpec->cpus_begin(), Cand1CPUSpec->cpus_end(),
10809 Cand2CPUSpec->cpus_begin(),
10811 return LHS->getName() == RHS->getName();
10814 assert(FirstDiff.first != Cand1CPUSpec->cpus_end() &&
10815 "Two different cpu-specific versions should not have the same "
10816 "identifier list, otherwise they'd be the same decl!");
10817 return (*FirstDiff.first)->getName() < (*FirstDiff.second)->getName()
10818 ? Comparison::Better
10819 : Comparison::Worse;
10821 llvm_unreachable(
"No way to get here unless both had cpu_dispatch");
10827static std::optional<QualType>
10830 return std::nullopt;
10836 return M->getFunctionObjectParameterReferenceType();
10850 PT2->getInstantiatedFromMemberTemplate()))
10861 assert(I < F->getNumParams());
10868 if (F1NumParams != F2NumParams)
10871 unsigned I1 = 0, I2 = 0;
10872 for (
unsigned I = 0; I != F1NumParams; ++I) {
10873 QualType T1 = NextParam(F1, I1, I == 0);
10874 QualType T2 = NextParam(F2, I2, I == 0);
10875 assert(!T1.
isNull() && !T2.
isNull() &&
"Unexpected null param types");
10876 if (!Context.hasSameUnqualifiedType(T1, T2))
10889 bool IsFn1Reversed,
10890 bool IsFn2Reversed) {
10891 assert(Fn1 && Fn2);
10896 IsFn1Reversed ^ IsFn2Reversed))
10899 auto *Mem1 = dyn_cast<CXXMethodDecl>(Fn1);
10900 auto *Mem2 = dyn_cast<CXXMethodDecl>(Fn2);
10901 if (Mem1 && Mem2) {
10904 if (Mem1->getParent() != Mem2->getParent())
10908 if (Mem1->isInstance() && Mem2->isInstance() &&
10910 Mem1->getFunctionObjectParameterReferenceType(),
10911 Mem1->getFunctionObjectParameterReferenceType()))
10917static FunctionDecl *
10919 bool IsFn1Reversed,
bool IsFn2Reversed) {
10929 if (Cand1IsSpecialization || Cand2IsSpecialization)
10946 bool PartialOverloading) {
10992 bool IsCand1ImplicitHD =
10994 bool IsCand2ImplicitHD =
11009 auto EmitThreshold =
11010 (S.
getLangOpts().CUDAIsDevice && IsCallerImplicitHD &&
11011 (IsCand1ImplicitHD || IsCand2ImplicitHD))
11014 auto Cand1Emittable = P1 > EmitThreshold;
11015 auto Cand2Emittable = P2 > EmitThreshold;
11016 if (Cand1Emittable && !Cand2Emittable)
11018 if (!Cand1Emittable && Cand2Emittable)
11029 unsigned StartArg = 0;
11037 return ICS.isStandard() &&
11049 assert(Cand2.
Conversions.size() == NumArgs &&
"Overload candidate mismatch");
11050 bool HasBetterConversion =
false;
11051 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11052 bool Cand1Bad = IsIllFormedConversion(Cand1.
Conversions[ArgIdx]);
11053 bool Cand2Bad = IsIllFormedConversion(Cand2.
Conversions[ArgIdx]);
11054 if (Cand1Bad != Cand2Bad) {
11057 HasBetterConversion =
true;
11061 if (HasBetterConversion)
11068 bool HasWorseConversion =
false;
11069 for (
unsigned ArgIdx = StartArg; ArgIdx < NumArgs; ++ArgIdx) {
11075 HasBetterConversion =
true;
11094 HasWorseConversion =
true;
11109 if (HasBetterConversion && !HasWorseConversion)
11160 bool Cand1IsSpecialization = Cand1.
Function &&
11162 bool Cand2IsSpecialization = Cand2.
Function &&
11164 if (Cand1IsSpecialization != Cand2IsSpecialization)
11165 return Cand2IsSpecialization;
11171 if (Cand1IsSpecialization && Cand2IsSpecialization) {
11172 const auto *Obj1Context =
11174 const auto *Obj2Context =
11203 bool Cand1IsInherited =
11205 bool Cand2IsInherited =
11207 if (Cand1IsInherited != Cand2IsInherited)
11208 return Cand2IsInherited;
11209 else if (Cand1IsInherited) {
11210 assert(Cand2IsInherited);
11213 if (Cand1Class->isDerivedFrom(Cand2Class))
11215 if (Cand2Class->isDerivedFrom(Cand1Class))
11232 auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.
Function);
11233 auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.
Function);
11234 if (Guide1 && Guide2) {
11236 if (Guide1->isImplicit() != Guide2->isImplicit())
11237 return Guide2->isImplicit();
11247 const auto *Constructor1 = Guide1->getCorrespondingConstructor();
11248 const auto *Constructor2 = Guide2->getCorrespondingConstructor();
11249 if (Constructor1 && Constructor2) {
11250 bool isC1Templated = Constructor1->getTemplatedKind() !=
11252 bool isC2Templated = Constructor2->getTemplatedKind() !=
11254 if (isC1Templated != isC2Templated)
11255 return isC2Templated;
11263 if (
Cmp != Comparison::Equal)
11264 return Cmp == Comparison::Better;
11267 bool HasPS1 = Cand1.
Function !=
nullptr &&
11269 bool HasPS2 = Cand2.
Function !=
nullptr &&
11271 if (HasPS1 != HasPS2 && HasPS1)
11275 if (MV == Comparison::Better)
11277 if (MV == Comparison::Worse)
11292 const auto *CD1 = dyn_cast_or_null<CXXConstructorDecl>(Cand1.
Function);
11293 const auto *CD2 = dyn_cast_or_null<CXXConstructorDecl>(Cand2.
Function);
11295 LangAS AS1 = CD1->getMethodQualifiers().getAddressSpace();
11296 LangAS AS2 = CD2->getMethodQualifiers().getAddressSpace();
11317 auto *VA = dyn_cast_or_null<ValueDecl>(A);
11318 auto *VB = dyn_cast_or_null<ValueDecl>(B);
11324 if (!VA->getDeclContext()->getRedeclContext()->Equals(
11325 VB->getDeclContext()->getRedeclContext()) ||
11327 VA->isExternallyVisible() || VB->isExternallyVisible())
11335 if (
Context.hasSameType(VA->getType(), VB->getType()))
11340 if (
auto *EA = dyn_cast<EnumConstantDecl>(VA)) {
11341 if (
auto *EB = dyn_cast<EnumConstantDecl>(VB)) {
11346 if (EnumA->hasNameForLinkage() || EnumB->hasNameForLinkage() ||
11347 !
Context.hasSameType(EnumA->getIntegerType(),
11348 EnumB->getIntegerType()))
11351 return llvm::APSInt::isSameValue(EA->getInitVal(), EB->getInitVal());
11361 assert(D &&
"Unknown declaration");
11362 Diag(Loc, diag::ext_equivalent_internal_linkage_decl_in_modules) << D;
11368 for (
auto *E : Equiv) {
11370 Diag(E->getLocation(), diag::note_equivalent_internal_linkage_decl)
11380 ->Satisfaction.ContainsErrors;
11386 bool PartialOverloading,
bool AllowExplicit,
11388 bool AggregateCandidateDeduction) {
11391 allocateDeferredCandidate<DeferredFunctionTemplateOverloadCandidate>();
11396 false, AllowExplicit, SuppressUserConversions,
11397 PartialOverloading, AggregateCandidateDeduction},
11404 HasDeferredTemplateConstructors |=
11412 bool SuppressUserConversions,
bool PartialOverloading,
11418 allocateDeferredCandidate<DeferredMethodTemplateOverloadCandidate>();
11424 false, SuppressUserConversions, PartialOverloading,
11430 ObjectClassification,
11438 bool AllowObjCConversionOnExplicit,
bool AllowExplicit,
11439 bool AllowResultConversion) {
11442 allocateDeferredCandidate<DeferredConversionTemplateOverloadCandidate>();
11446 AllowObjCConversionOnExplicit, AllowResultConversion,
11463 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
11464 nullptr,
C.ObjectType,
C.ObjectClassification,
11465 C.Args,
C.SuppressUserConversions,
C.PartialOverloading,
C.PO);
11472 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
11473 nullptr,
C.Args,
C.SuppressUserConversions,
11474 C.PartialOverloading,
C.AllowExplicit,
C.IsADLCandidate,
C.PO,
11475 C.AggregateCandidateDeduction);
11482 S, CandidateSet,
C.FunctionTemplate,
C.FoundDecl,
C.ActingContext,
C.From,
11483 C.ToType,
C.AllowObjCConversionOnExplicit,
C.AllowExplicit,
11484 C.AllowResultConversion);
11488 Candidates.reserve(Candidates.size() + DeferredCandidatesCount);
11491 switch (Cand->
Kind) {
11510 FirstDeferredCandidate =
nullptr;
11511 DeferredCandidatesCount = 0;
11515OverloadCandidateSet::ResultForBestCandidate(
const iterator &Best) {
11517 if (Best->Function && Best->Function->isDeleted())
11522void OverloadCandidateSet::CudaExcludeWrongSideCandidates(
11539 bool ContainsSameSideCandidate =
11547 if (!ContainsSameSideCandidate)
11550 auto IsWrongSideCandidate = [&](
const OverloadCandidate *Cand) {
11556 llvm::erase_if(Candidates, IsWrongSideCandidate);
11574 DeferredCandidatesCount == 0) &&
11575 "Unexpected deferred template candidates");
11577 bool TwoPhaseResolution =
11578 DeferredCandidatesCount != 0 && !ResolutionByPerfectCandidateIsDisabled;
11580 if (TwoPhaseResolution) {
11582 if (Best !=
end() && Best->isPerfectMatch(S.
Context)) {
11583 if (!(HasDeferredTemplateConstructors &&
11584 isa_and_nonnull<CXXConversionDecl>(Best->Function)))
11590 return BestViableFunctionImpl(S, Loc, Best);
11597 Candidates.reserve(this->Candidates.size());
11598 std::transform(this->Candidates.begin(), this->Candidates.end(),
11599 std::back_inserter(Candidates),
11603 CudaExcludeWrongSideCandidates(S, Candidates);
11606 for (
auto *Cand : Candidates) {
11607 Cand->
Best =
false;
11609 if (Best ==
end() ||
11626 llvm::SmallVector<OverloadCandidate *, 4> PendingBest;
11627 llvm::SmallVector<const NamedDecl *, 4> EquivalentCands;
11628 PendingBest.push_back(&*Best);
11633 while (!PendingBest.empty()) {
11634 auto *Curr = PendingBest.pop_back_val();
11635 for (
auto *Cand : Candidates) {
11638 PendingBest.push_back(Cand);
11643 EquivalentCands.push_back(Cand->
Function);
11655 if (!EquivalentCands.empty())
11663enum OverloadCandidateKind {
11666 oc_reversed_binary_operator,
11668 oc_implicit_default_constructor,
11669 oc_implicit_copy_constructor,
11670 oc_implicit_move_constructor,
11671 oc_implicit_copy_assignment,
11672 oc_implicit_move_assignment,
11673 oc_implicit_equality_comparison,
11674 oc_inherited_constructor
11677enum OverloadCandidateSelect {
11680 ocs_described_template,
11683static std::pair<OverloadCandidateKind, OverloadCandidateSelect>
11684ClassifyOverloadCandidate(Sema &S,
const NamedDecl *
Found,
11685 const FunctionDecl *Fn,
11687 std::string &Description) {
11690 if (FunctionTemplateDecl *FunTmpl =
Fn->getPrimaryTemplate()) {
11693 FunTmpl->getTemplateParameters(), *
Fn->getTemplateSpecializationArgs());
11696 OverloadCandidateSelect Select = [&]() {
11697 if (!Description.empty())
11698 return ocs_described_template;
11699 return isTemplate ? ocs_template : ocs_non_template;
11702 OverloadCandidateKind Kind = [&]() {
11703 if (
Fn->isImplicit() &&
Fn->getOverloadedOperator() == OO_EqualEqual)
11704 return oc_implicit_equality_comparison;
11707 return oc_reversed_binary_operator;
11709 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(Fn)) {
11710 if (!Ctor->isImplicit()) {
11712 return oc_inherited_constructor;
11714 return oc_constructor;
11717 if (Ctor->isDefaultConstructor())
11718 return oc_implicit_default_constructor;
11720 if (Ctor->isMoveConstructor())
11721 return oc_implicit_move_constructor;
11723 assert(Ctor->isCopyConstructor() &&
11724 "unexpected sort of implicit constructor");
11725 return oc_implicit_copy_constructor;
11728 if (
const auto *Meth = dyn_cast<CXXMethodDecl>(Fn)) {
11731 if (!Meth->isImplicit())
11734 if (Meth->isMoveAssignmentOperator())
11735 return oc_implicit_move_assignment;
11737 if (Meth->isCopyAssignmentOperator())
11738 return oc_implicit_copy_assignment;
11744 return oc_function;
11747 return std::make_pair(Kind, Select);
11750void MaybeEmitInheritedConstructorNote(Sema &S,
const Decl *FoundDecl) {
11753 if (
const auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl))
11755 diag::note_ovl_candidate_inherited_constructor)
11756 << Shadow->getNominatedBaseClass();
11765 if (EnableIf->getCond()->isValueDependent() ||
11766 !EnableIf->getCond()->EvaluateAsBooleanCondition(AlwaysTrue, Ctx))
11783 bool InOverloadResolution,
11787 if (InOverloadResolution)
11789 diag::note_addrof_ovl_candidate_disabled_by_enable_if_attr);
11791 S.
Diag(Loc, diag::err_addrof_function_disabled_by_enable_if_attr) << FD;
11802 if (InOverloadResolution) {
11805 TemplateArgString +=
" ";
11807 FunTmpl->getTemplateParameters(),
11812 diag::note_ovl_candidate_unsatisfied_constraints)
11813 << TemplateArgString;
11815 S.
Diag(Loc, diag::err_addrof_function_constraints_not_satisfied)
11824 return P->hasAttr<PassObjectSizeAttr>();
11831 unsigned ParamNo = std::distance(FD->
param_begin(), I) + 1;
11832 if (InOverloadResolution)
11834 diag::note_ovl_candidate_has_pass_object_size_params)
11837 S.
Diag(Loc, diag::err_address_of_function_with_pass_object_size_params)
11853 return ::checkAddressOfFunctionIsAvailable(*
this,
Function, Complain,
11861 const auto *ConvD = dyn_cast<CXXConversionDecl>(Fn);
11866 if (!RD->isLambda())
11871 CallOp->getType()->castAs<
FunctionType>()->getCallConv();
11876 return ConvToCC != CallOpCC;
11882 QualType DestType,
bool TakingAddress) {
11885 if (Fn->isMultiVersion() && Fn->hasAttr<TargetAttr>() &&
11886 !Fn->getAttr<TargetAttr>()->isDefaultVersion())
11888 if (Fn->isMultiVersion() && Fn->hasAttr<TargetVersionAttr>() &&
11889 !Fn->getAttr<TargetVersionAttr>()->isDefaultVersion())
11894 std::string FnDesc;
11895 std::pair<OverloadCandidateKind, OverloadCandidateSelect> KSPair =
11896 ClassifyOverloadCandidate(*
this,
Found, Fn, RewriteKind, FnDesc);
11898 << (
unsigned)KSPair.first << (
unsigned)KSPair.second
11902 Diag(Fn->getLocation(), PD);
11903 MaybeEmitInheritedConstructorNote(*
this,
Found);
11921 FunctionDecl *FirstCand =
nullptr, *SecondCand =
nullptr;
11922 for (
auto I = Cands.begin(), E = Cands.end(); I != E; ++I) {
11926 if (
auto *
Template = I->Function->getPrimaryTemplate())
11927 Template->getAssociatedConstraints(AC);
11929 I->Function->getAssociatedConstraints(AC);
11932 if (FirstCand ==
nullptr) {
11933 FirstCand = I->Function;
11935 }
else if (SecondCand ==
nullptr) {
11936 SecondCand = I->Function;
11949 SecondCand, SecondAC))
11958 bool TakingAddress) {
11968 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl()) ) {
11972 = dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()) ) {
11985 S.
Diag(CaretLoc, PDiag)
11987 unsigned CandsShown = 0;
12001 unsigned I,
bool TakingCandidateAddress) {
12003 assert(Conv.
isBad());
12004 assert(Cand->
Function &&
"for now, candidate must be a function");
12010 bool isObjectArgument =
false;
12014 isObjectArgument =
true;
12019 std::string FnDesc;
12020 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12031 bool HasParamPack =
12032 llvm::any_of(Fn->parameters().take_front(I), [](
const ParmVarDecl *Parm) {
12033 return Parm->isParameterPack();
12035 if (!isObjectArgument && !HasParamPack && I < Fn->getNumParams())
12036 ToParamRange = Fn->getParamDecl(I)->getSourceRange();
12039 assert(FromExpr &&
"overload set argument came from implicit argument?");
12045 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
12046 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12047 << ToParamRange << ToTy << Name << I + 1;
12048 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12057 CToTy = RT->getPointeeType();
12062 CFromTy = FromPT->getPointeeType();
12063 CToTy = ToPT->getPointeeType();
12073 if (isObjectArgument)
12074 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace_this)
12075 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12078 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_addrspace)
12079 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12082 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12087 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ownership)
12088 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12091 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12096 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_gc)
12097 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12100 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12105 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_ptrauth)
12106 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12111 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12116 assert(CVR &&
"expected qualifiers mismatch");
12118 if (isObjectArgument) {
12119 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr_this)
12120 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12121 << FromTy << (CVR - 1);
12123 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_cvr)
12124 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12125 << ToParamRange << FromTy << (CVR - 1) << I + 1;
12127 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12133 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_value_category)
12134 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12135 << (
unsigned)isObjectArgument << I + 1
12138 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12145 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_list_argument)
12146 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12147 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12152 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12164 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_conv_incomplete)
12165 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12166 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12167 << (
unsigned)(Cand->
Fix.
Kind);
12169 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12174 unsigned BaseToDerivedConversion = 0;
12177 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12179 !FromPtrTy->getPointeeType()->isIncompleteType() &&
12180 !ToPtrTy->getPointeeType()->isIncompleteType() &&
12182 FromPtrTy->getPointeeType()))
12183 BaseToDerivedConversion = 1;
12191 if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs(
12193 FromIface->isSuperClassOf(ToIface))
12194 BaseToDerivedConversion = 2;
12196 if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy,
12199 !ToRefTy->getPointeeType()->isIncompleteType() &&
12201 BaseToDerivedConversion = 3;
12205 if (BaseToDerivedConversion) {
12206 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_base_to_derived_conv)
12207 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12208 << ToParamRange << (BaseToDerivedConversion - 1) << FromTy << ToTy
12210 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12219 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_arc_conv)
12220 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12221 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument
12223 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12233 if (FromTy == S.
Context.AMDGPUFeaturePredicateTy &&
12236 diag::err_amdgcn_predicate_type_needs_explicit_bool_cast)
12243 FDiag << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12244 << ToParamRange << FromTy << ToTy << (
unsigned)isObjectArgument << I + 1
12245 << (
unsigned)(Cand->
Fix.
Kind);
12254 S.
Diag(Fn->getLocation(), FDiag);
12256 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12263 unsigned NumArgs,
bool IsAddressOf =
false) {
12264 assert(Cand->
Function &&
"Candidate is required to be a function.");
12266 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12267 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12274 if (Fn->isInvalidDecl() &&
12278 if (NumArgs < MinParams) {
12295 unsigned NumFormalArgs,
12296 bool IsAddressOf =
false) {
12298 "The templated declaration should at least be a function"
12299 " when diagnosing bad template argument deduction due to too many"
12300 " or too few arguments");
12306 unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
12307 ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12310 bool HasExplicitObjectParam =
12311 !IsAddressOf && Fn->hasCXXExplicitFunctionObjectParameter();
12313 unsigned ParamCount =
12314 Fn->getNumNonObjectParams() + ((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
12315 unsigned mode, modeCount;
12317 if (NumFormalArgs < MinParams) {
12318 if (MinParams != ParamCount || FnTy->isVariadic() ||
12319 FnTy->isTemplateVariadic())
12323 modeCount = MinParams;
12325 if (MinParams != ParamCount)
12329 modeCount = ParamCount;
12332 std::string Description;
12333 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12334 ClassifyOverloadCandidate(S,
Found, Fn,
CRK_None, Description);
12336 unsigned FirstNonObjectParamIdx = HasExplicitObjectParam ? 1 : 0;
12337 if (modeCount == 1 && !IsAddressOf &&
12338 FirstNonObjectParamIdx < Fn->getNumParams() &&
12339 Fn->getParamDecl(FirstNonObjectParamIdx)->getDeclName())
12340 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one)
12341 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12342 << Description << mode << Fn->getParamDecl(FirstNonObjectParamIdx)
12343 << NumFormalArgs << HasExplicitObjectParam
12344 << Fn->getParametersSourceRange();
12346 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_arity)
12347 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second
12348 << Description << mode << modeCount << NumFormalArgs
12349 << HasExplicitObjectParam << Fn->getParametersSourceRange();
12351 MaybeEmitInheritedConstructorNote(S,
Found);
12356 unsigned NumFormalArgs) {
12357 assert(Cand->
Function &&
"Candidate must be a function");
12367 llvm_unreachable(
"Unsupported: Getting the described template declaration"
12368 " for bad deduction diagnosis");
12375 bool TakingCandidateAddress) {
12381 switch (DeductionFailure.
getResult()) {
12384 "TemplateDeductionResult::Success while diagnosing bad deduction");
12386 llvm_unreachable(
"TemplateDeductionResult::NonDependentConversionFailure "
12387 "while diagnosing bad deduction");
12393 assert(ParamD &&
"no parameter found for incomplete deduction result");
12395 diag::note_ovl_candidate_incomplete_deduction)
12397 MaybeEmitInheritedConstructorNote(S,
Found);
12402 assert(ParamD &&
"no parameter found for incomplete deduction result");
12404 diag::note_ovl_candidate_incomplete_deduction_pack)
12406 << (DeductionFailure.
getFirstArg()->pack_size() + 1)
12408 MaybeEmitInheritedConstructorNote(S,
Found);
12413 assert(ParamD &&
"no parameter found for bad qualifiers deduction result");
12431 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_underqualified)
12432 << ParamD->
getDeclName() << Arg << NonCanonParam;
12433 MaybeEmitInheritedConstructorNote(S,
Found);
12438 assert(ParamD &&
"no parameter found for inconsistent deduction result");
12452 diag::note_ovl_candidate_inconsistent_deduction_types)
12455 MaybeEmitInheritedConstructorNote(S,
Found);
12475 diag::note_ovl_candidate_inconsistent_deduction)
12478 MaybeEmitInheritedConstructorNote(S,
Found);
12483 assert(ParamD &&
"no parameter found for invalid explicit arguments");
12486 diag::note_ovl_candidate_explicit_arg_mismatch_named)
12491 index = TTP->getIndex();
12493 = dyn_cast<NonTypeTemplateParmDecl>(ParamD))
12494 index = NTTP->getIndex();
12498 diag::note_ovl_candidate_explicit_arg_mismatch_unnamed)
12501 MaybeEmitInheritedConstructorNote(S,
Found);
12508 TemplateArgString =
" ";
12511 if (TemplateArgString.size() == 1)
12512 TemplateArgString.clear();
12514 diag::note_ovl_candidate_unsatisfied_constraints)
12515 << TemplateArgString;
12518 static_cast<CNSInfo*
>(DeductionFailure.
Data)->Satisfaction);
12528 diag::note_ovl_candidate_instantiation_depth);
12529 MaybeEmitInheritedConstructorNote(S,
Found);
12537 TemplateArgString =
" ";
12540 if (TemplateArgString.size() == 1)
12541 TemplateArgString.clear();
12546 if (PDiag && PDiag->second.getDiagID() ==
12547 diag::err_typename_nested_not_found_enable_if) {
12550 S.
Diag(PDiag->first, diag::note_ovl_candidate_disabled_by_enable_if)
12551 <<
"'enable_if'" << TemplateArgString;
12556 if (PDiag && PDiag->second.getDiagID() ==
12557 diag::err_typename_nested_not_found_requirement) {
12559 diag::note_ovl_candidate_disabled_by_requirement)
12560 << PDiag->second.getStringArg(0) << TemplateArgString;
12570 SFINAEArgString =
": ";
12572 PDiag->second.EmitToString(S.
getDiagnostics(), SFINAEArgString);
12576 diag::note_ovl_candidate_substitution_failure)
12577 << TemplateArgString << SFINAEArgString << R;
12578 MaybeEmitInheritedConstructorNote(S,
Found);
12588 TemplateArgString =
" ";
12591 if (TemplateArgString.size() == 1)
12592 TemplateArgString.clear();
12595 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_deduced_mismatch)
12598 << TemplateArgString
12623 diag::note_ovl_candidate_non_deduced_mismatch_qualified)
12639 diag::note_ovl_candidate_non_deduced_mismatch)
12640 << FirstTA << SecondTA;
12646 S.
Diag(Templated->
getLocation(), diag::note_ovl_candidate_bad_deduction);
12647 MaybeEmitInheritedConstructorNote(S,
Found);
12651 diag::note_cuda_ovl_candidate_target_mismatch);
12659 bool TakingCandidateAddress) {
12660 assert(Cand->
Function &&
"Candidate must be a function");
12675 assert(Cand->
Function &&
"Candidate must be a Function.");
12681 std::string FnDesc;
12682 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12683 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Callee,
12686 S.
Diag(Callee->getLocation(), diag::note_ovl_candidate_bad_target)
12687 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12689 << CalleeTarget << CallerTarget;
12694 if (Meth !=
nullptr && Meth->
isImplicit()) {
12698 switch (FnKindPair.first) {
12701 case oc_implicit_default_constructor:
12704 case oc_implicit_copy_constructor:
12707 case oc_implicit_move_constructor:
12710 case oc_implicit_copy_assignment:
12713 case oc_implicit_move_assignment:
12718 bool ConstRHS =
false;
12722 ConstRHS = RT->getPointeeType().isConstQualified();
12733 assert(Cand->
Function &&
"Candidate must be a function");
12737 S.
Diag(Callee->getLocation(),
12738 diag::note_ovl_candidate_disabled_by_function_cond_attr)
12739 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
12743 assert(Cand->
Function &&
"Candidate must be a function");
12746 assert(ES.
isExplicit() &&
"not an explicit candidate");
12749 switch (Fn->getDeclKind()) {
12750 case Decl::Kind::CXXConstructor:
12753 case Decl::Kind::CXXConversion:
12756 case Decl::Kind::CXXDeductionGuide:
12757 Kind = Fn->isImplicit() ? 0 : 2;
12760 llvm_unreachable(
"invalid Decl");
12769 First = Pattern->getFirstDecl();
12772 diag::note_ovl_candidate_explicit)
12773 << Kind << (ES.
getExpr() ? 1 : 0)
12778 auto *DG = dyn_cast<CXXDeductionGuideDecl>(Fn);
12785 if (!(DG->isImplicit() || (OriginTemplate && OriginTemplate->
isTypeAlias())))
12787 std::string FunctionProto;
12788 llvm::raw_string_ostream OS(FunctionProto);
12801 "Non-template implicit deduction guides are only possible for "
12804 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12809 assert(
Template &&
"Cannot find the associated function template of "
12810 "CXXDeductionGuideDecl?");
12813 S.
Diag(DG->getLocation(), diag::note_implicit_deduction_guide)
12834 bool TakingCandidateAddress,
12836 assert(Cand->
Function &&
"Candidate must be a function");
12844 if (S.
getLangOpts().OpenCL && Fn->isImplicit() &&
12851 !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
12856 if (Fn->isDeleted()) {
12857 std::string FnDesc;
12858 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12859 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12862 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_deleted)
12863 << (
unsigned)FnKindPair.first << (
unsigned)FnKindPair.second << FnDesc
12864 << (Fn->isDeleted()
12865 ? (Fn->getCanonicalDecl()->isDeletedAsWritten() ? 1 : 2)
12867 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12894 TakingCandidateAddress);
12897 S.
Diag(Fn->getLocation(), diag::note_ovl_candidate_illegal_constructor)
12898 << (Fn->getPrimaryTemplate() ? 1 : 0);
12899 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12906 S.
Diag(Fn->getLocation(),
12907 diag::note_ovl_candidate_illegal_constructor_adrspace_mismatch)
12908 << QualsForPrinting;
12909 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12920 for (
unsigned N = Cand->
Conversions.size(); I != N; ++I)
12943 S.
Diag(Fn->getLocation(),
12944 diag::note_ovl_candidate_inherited_constructor_slice)
12945 << (Fn->getPrimaryTemplate() ? 1 : 0)
12946 << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
12947 MaybeEmitInheritedConstructorNote(S, Cand->
FoundDecl);
12953 assert(!Available);
12961 std::string FnDesc;
12962 std::pair<OverloadCandidateKind, OverloadCandidateSelect> FnKindPair =
12963 ClassifyOverloadCandidate(S, Cand->
FoundDecl, Fn,
12966 S.
Diag(Fn->getLocation(),
12967 diag::note_ovl_candidate_constraints_not_satisfied)
12968 << (
unsigned)FnKindPair.first << (
unsigned)ocs_non_template
12987 bool isLValueReference =
false;
12988 bool isRValueReference =
false;
12989 bool isPointer =
false;
12993 isLValueReference =
true;
12997 isRValueReference =
true;
13013 diag::note_ovl_surrogate_constraints_not_satisfied)
13027 assert(Cand->
Conversions.size() <= 2 &&
"builtin operator is not binary");
13028 std::string TypeStr(
"operator");
13034 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13039 S.
Diag(OpLoc, diag::note_ovl_builtin_candidate) << TypeStr;
13046 if (ICS.
isBad())
break;
13050 S, OpLoc, S.
PDiag(diag::note_ambiguous_type_conversion));
13067 llvm_unreachable(
"non-deduction failure while diagnosing bad deduction");
13097 llvm_unreachable(
"Unhandled deduction result");
13102struct CompareOverloadCandidatesForDisplay {
13104 SourceLocation Loc;
13108 CompareOverloadCandidatesForDisplay(
13109 Sema &S, SourceLocation Loc,
size_t NArgs,
13111 : S(S), NumArgs(NArgs), CSK(CSK) {}
13121 if (NumArgs >
C->Function->getNumParams() && !
C->Function->isVariadic())
13123 if (NumArgs < C->
Function->getMinRequiredArguments())
13130 bool operator()(
const OverloadCandidate *L,
13131 const OverloadCandidate *R) {
13133 if (L == R)
return false;
13137 if (!
R->Viable)
return true;
13139 if (
int Ord = CompareConversions(*L, *R))
13142 }
else if (
R->Viable)
13145 assert(L->
Viable ==
R->Viable);
13158 int RDist =
std::abs((
int)
R->getNumParams() - (
int)NumArgs);
13159 if (LDist == RDist) {
13160 if (LFailureKind == RFailureKind)
13168 return LDist < RDist;
13185 unsigned numRFixes =
R->Fix.NumConversionsFixed;
13186 numLFixes = (numLFixes == 0) ?
UINT_MAX : numLFixes;
13187 numRFixes = (numRFixes == 0) ?
UINT_MAX : numRFixes;
13188 if (numLFixes != numRFixes) {
13189 return numLFixes < numRFixes;
13193 if (
int Ord = CompareConversions(*L, *R))
13205 if (LRank != RRank)
13206 return LRank < RRank;
13232 struct ConversionSignals {
13233 unsigned KindRank = 0;
13236 static ConversionSignals ForSequence(ImplicitConversionSequence &
Seq) {
13237 ConversionSignals Sig;
13238 Sig.KindRank =
Seq.getKindRank();
13239 if (
Seq.isStandard())
13240 Sig.Rank =
Seq.Standard.getRank();
13241 else if (
Seq.isUserDefined())
13242 Sig.Rank =
Seq.UserDefined.After.getRank();
13248 static ConversionSignals ForObjectArgument() {
13258 int CompareConversions(
const OverloadCandidate &L,
13259 const OverloadCandidate &R) {
13264 for (
unsigned I = 0, N = L.
Conversions.size(); I != N; ++I) {
13266 ? ConversionSignals::ForObjectArgument()
13267 : ConversionSignals::ForSequence(L.Conversions[I]);
13268 auto RS =
R.IgnoreObjectArgument
13269 ? ConversionSignals::ForObjectArgument()
13270 : ConversionSignals::ForSequence(
R.Conversions[I]);
13271 if (std::tie(LS.KindRank, LS.Rank) != std::tie(RS.KindRank, RS.Rank))
13272 return std::tie(LS.KindRank, LS.Rank) < std::tie(RS.KindRank, RS.Rank)
13297 bool Unfixable =
false;
13303 for (
unsigned ConvIdx =
13307 assert(ConvIdx != ConvCount &&
"no bad conversion in candidate");
13308 if (Cand->
Conversions[ConvIdx].isInitialized() &&
13317 bool SuppressUserConversions =
false;
13319 unsigned ConvIdx = 0;
13320 unsigned ArgIdx = 0;
13349 assert(ConvCount <= 3);
13355 ConvIdx != ConvCount && ArgIdx < Args.size();
13357 if (Cand->
Conversions[ConvIdx].isInitialized()) {
13359 }
else if (
ParamIdx < ParamTypes.size()) {
13360 if (ParamTypes[
ParamIdx]->isDependentType())
13361 Cand->
Conversions[ConvIdx].setAsIdentityConversion(
13366 SuppressUserConversions,
13371 if (!Unfixable && Cand->
Conversions[ConvIdx].isBad())
13390 for (
iterator Cand = Candidates.begin(), LastCand = Candidates.end();
13391 Cand != LastCand; ++Cand) {
13392 if (!Filter(*Cand))
13417 Cands.push_back(Cand);
13421 Cands, CompareOverloadCandidatesForDisplay(S, OpLoc, Args.size(), Kind));
13428 bool DeferHint =
false;
13432 auto WrongSidedCands =
13434 return (Cand.
Viable ==
false &&
13440 DeferHint = !WrongSidedCands.empty();
13456 S.
Diag(PD.first, PD.second);
13461 bool NoteCands =
true;
13462 for (
const Expr *Arg : Args) {
13463 if (Arg->getType()->isWebAssemblyTableType())
13472 {Candidates.begin(), Candidates.end()});
13478 bool ReportedAmbiguousConversions =
false;
13481 unsigned CandsShown = 0;
13482 auto I = Cands.begin(), E = Cands.end();
13483 for (; I != E; ++I) {
13499 "Non-viable built-in candidates are not added to Cands.");
13506 if (!ReportedAmbiguousConversions) {
13508 ReportedAmbiguousConversions =
true;
13522 S.
Diag(OpLoc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13533struct CompareTemplateSpecCandidatesForDisplay {
13535 CompareTemplateSpecCandidatesForDisplay(Sema &S) : S(S) {}
13537 bool operator()(
const TemplateSpecCandidate *L,
13538 const TemplateSpecCandidate *R) {
13569 bool ForTakingAddress) {
13574void TemplateSpecCandidateSet::destroyCandidates() {
13576 i->DeductionFailure.Destroy();
13581 destroyCandidates();
13582 Candidates.clear();
13595 Cands.reserve(
size());
13596 for (
iterator Cand =
begin(), LastCand =
end(); Cand != LastCand; ++Cand) {
13597 if (Cand->Specialization)
13598 Cands.push_back(Cand);
13603 llvm::sort(Cands, CompareTemplateSpecCandidatesForDisplay(S));
13610 unsigned CandsShown = 0;
13611 for (I = Cands.begin(), E = Cands.end(); I != E; ++I) {
13617 if (CandsShown >= 4 && ShowOverloads ==
Ovl_Best)
13622 "Non-matching built-in candidates are not added to Cands.");
13627 S.
Diag(Loc, diag::note_ovl_too_many_candidates) <<
int(E - I);
13637 QualType Ret = PossiblyAFunctionType;
13640 Ret = ToTypePtr->getPointeeType();
13643 Ret = ToTypeRef->getPointeeType();
13646 Ret = MemTypePtr->getPointeeType();
13648 Context.getCanonicalType(Ret).getUnqualifiedType();
13653 bool Complain =
true) {
13670class AddressOfFunctionResolver {
13673 const QualType& TargetType;
13674 QualType TargetFunctionType;
13678 ASTContext& Context;
13680 bool TargetTypeIsNonStaticMemberFunction;
13681 bool FoundNonTemplateFunction;
13682 bool StaticMemberFunctionFromBoundPointer;
13683 bool HasComplained;
13685 OverloadExpr::FindResult OvlExprInfo;
13686 OverloadExpr *OvlExpr;
13687 TemplateArgumentListInfo OvlExplicitTemplateArgs;
13688 SmallVector<std::pair<DeclAccessPair, FunctionDecl*>, 4> Matches;
13689 TemplateSpecCandidateSet FailedCandidates;
13692 AddressOfFunctionResolver(Sema &S, Expr *SourceExpr,
13693 const QualType &TargetType,
bool Complain)
13694 : S(S), SourceExpr(SourceExpr), TargetType(TargetType),
13695 Complain(Complain), Context(S.getASTContext()),
13696 TargetTypeIsNonStaticMemberFunction(
13697 !!TargetType->getAs<MemberPointerType>()),
13698 FoundNonTemplateFunction(
false),
13699 StaticMemberFunctionFromBoundPointer(
false),
13700 HasComplained(
false),
13701 OvlExprInfo(OverloadExpr::find(SourceExpr)),
13703 FailedCandidates(OvlExpr->getNameLoc(),
true) {
13704 ExtractUnqualifiedFunctionTypeFromTargetType();
13707 if (UnresolvedMemberExpr *UME = dyn_cast<UnresolvedMemberExpr>(OvlExpr))
13708 if (!UME->isImplicitAccess() &&
13710 StaticMemberFunctionFromBoundPointer =
true;
13712 DeclAccessPair dap;
13714 OvlExpr,
false, &dap)) {
13715 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn))
13716 if (!
Method->isStatic()) {
13720 TargetTypeIsNonStaticMemberFunction =
true;
13728 Matches.push_back(std::make_pair(dap, Fn));
13736 if (FindAllFunctionsThatMatchTargetTypeExactly()) {
13739 if (Matches.size() > 1 && !eliminiateSuboptimalOverloadCandidates()) {
13740 if (FoundNonTemplateFunction) {
13741 EliminateAllTemplateMatches();
13742 EliminateLessPartialOrderingConstrainedMatches();
13744 EliminateAllExceptMostSpecializedTemplate();
13749 EliminateSuboptimalCudaMatches();
13752 bool hasComplained()
const {
return HasComplained; }
13755 bool candidateHasExactlyCorrectType(
const FunctionDecl *FD) {
13762 bool isBetterCandidate(
const FunctionDecl *A,
const FunctionDecl *B) {
13766 return candidateHasExactlyCorrectType(A) &&
13767 (!candidateHasExactlyCorrectType(B) ||
13773 bool eliminiateSuboptimalOverloadCandidates() {
13776 auto Best = Matches.begin();
13777 for (
auto I = Matches.begin()+1, E = Matches.end(); I != E; ++I)
13778 if (isBetterCandidate(I->second, Best->second))
13781 const FunctionDecl *BestFn = Best->second;
13782 auto IsBestOrInferiorToBest = [
this, BestFn](
13783 const std::pair<DeclAccessPair, FunctionDecl *> &Pair) {
13784 return BestFn == Pair.second || isBetterCandidate(BestFn, Pair.second);
13789 if (!llvm::all_of(Matches, IsBestOrInferiorToBest))
13791 Matches[0] = *Best;
13796 bool isTargetTypeAFunction()
const {
13805 void inline ExtractUnqualifiedFunctionTypeFromTargetType() {
13811 const DeclAccessPair& CurAccessFunPair) {
13812 if (CXXMethodDecl *
Method
13816 bool CanConvertToFunctionPointer =
13817 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13818 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13821 else if (TargetTypeIsNonStaticMemberFunction)
13831 TemplateDeductionInfo Info(FailedCandidates.
getLocation());
13835 Result != TemplateDeductionResult::Success) {
13853 Matches.push_back(std::make_pair(CurAccessFunPair,
Specialization));
13857 bool AddMatchingNonTemplateFunction(NamedDecl* Fn,
13858 const DeclAccessPair& CurAccessFunPair) {
13859 if (CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(Fn)) {
13862 bool CanConvertToFunctionPointer =
13863 Method->isStatic() ||
Method->isExplicitObjectMemberFunction();
13864 if (CanConvertToFunctionPointer == TargetTypeIsNonStaticMemberFunction)
13867 else if (TargetTypeIsNonStaticMemberFunction)
13870 if (FunctionDecl *FunDecl = dyn_cast<FunctionDecl>(Fn)) {
13877 if (FunDecl->isMultiVersion()) {
13878 const auto *TA = FunDecl->getAttr<TargetAttr>();
13879 if (TA && !TA->isDefaultVersion())
13881 const auto *TVA = FunDecl->getAttr<TargetVersionAttr>();
13882 if (TVA && !TVA->isDefaultVersion())
13890 HasComplained |= Complain;
13899 candidateHasExactlyCorrectType(FunDecl)) {
13900 Matches.push_back(std::make_pair(
13902 FoundNonTemplateFunction =
true;
13910 bool FindAllFunctionsThatMatchTargetTypeExactly() {
13915 if (IsInvalidFormOfPointerToMemberFunction())
13918 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
13922 NamedDecl *
Fn = (*I)->getUnderlyingDecl();
13931 = dyn_cast<FunctionTemplateDecl>(Fn)) {
13937 AddMatchingNonTemplateFunction(Fn, I.getPair()))
13940 assert(Ret || Matches.empty());
13944 void EliminateAllExceptMostSpecializedTemplate() {
13956 UnresolvedSet<4> MatchesCopy;
13957 for (
unsigned I = 0, E = Matches.size(); I != E; ++I)
13958 MatchesCopy.
addDecl(Matches[I].second, Matches[I].first.getAccess());
13963 MatchesCopy.
begin(), MatchesCopy.
end(), FailedCandidates,
13965 S.
PDiag(diag::err_addr_ovl_ambiguous)
13966 << Matches[0].second->getDeclName(),
13967 S.
PDiag(diag::note_ovl_candidate)
13968 << (
unsigned)oc_function << (
unsigned)ocs_described_template,
13969 Complain, TargetFunctionType);
13973 Matches[0].first = Matches[
Result - MatchesCopy.
begin()].first;
13977 HasComplained |= Complain;
13980 void EliminateAllTemplateMatches() {
13983 for (
unsigned I = 0, N = Matches.size(); I != N; ) {
13984 if (Matches[I].second->getPrimaryTemplate() ==
nullptr)
13987 Matches[I] = Matches[--N];
13993 void EliminateLessPartialOrderingConstrainedMatches() {
13998 assert(Matches[0].second->getPrimaryTemplate() ==
nullptr &&
13999 "Call EliminateAllTemplateMatches() first");
14000 SmallVector<std::pair<DeclAccessPair, FunctionDecl *>, 4> Results;
14001 Results.push_back(Matches[0]);
14002 for (
unsigned I = 1, N = Matches.size(); I < N; ++I) {
14003 assert(Matches[I].second->getPrimaryTemplate() ==
nullptr);
14005 S, Matches[I].second, Results[0].second,
14009 Results.push_back(Matches[I]);
14012 if (F == Matches[I].second) {
14014 Results.push_back(Matches[I]);
14017 std::swap(Matches, Results);
14020 void EliminateSuboptimalCudaMatches() {
14026 void ComplainNoMatchesFound()
const {
14027 assert(Matches.empty());
14029 << OvlExpr->
getName() << TargetFunctionType
14031 if (FailedCandidates.
empty())
14038 for (UnresolvedSetIterator I = OvlExpr->
decls_begin(),
14041 if (FunctionDecl *Fun =
14042 dyn_cast<FunctionDecl>((*I)->getUnderlyingDecl()))
14050 bool IsInvalidFormOfPointerToMemberFunction()
const {
14051 return TargetTypeIsNonStaticMemberFunction &&
14055 void ComplainIsInvalidFormOfPointerToMemberFunction()
const {
14063 bool IsStaticMemberFunctionFromBoundPointer()
const {
14064 return StaticMemberFunctionFromBoundPointer;
14067 void ComplainIsStaticMemberFunctionFromBoundPointer()
const {
14069 diag::err_invalid_form_pointer_member_function)
14073 void ComplainOfInvalidConversion()
const {
14075 << OvlExpr->
getName() << TargetType;
14078 void ComplainMultipleMatchesFound()
const {
14079 assert(Matches.size() > 1);
14086 bool hadMultipleCandidates()
const {
return (OvlExpr->
getNumDecls() > 1); }
14088 int getNumMatches()
const {
return Matches.size(); }
14090 FunctionDecl* getMatchingFunctionDecl()
const {
14091 if (Matches.size() != 1)
return nullptr;
14092 return Matches[0].second;
14095 const DeclAccessPair* getMatchingFunctionAccessPair()
const {
14096 if (Matches.size() != 1)
return nullptr;
14097 return &Matches[0].first;
14107 bool *pHadMultipleCandidates) {
14110 AddressOfFunctionResolver Resolver(*
this, AddressOfExpr, TargetType,
14112 int NumMatches = Resolver.getNumMatches();
14114 bool ShouldComplain = Complain && !Resolver.hasComplained();
14115 if (NumMatches == 0 && ShouldComplain) {
14116 if (Resolver.IsInvalidFormOfPointerToMemberFunction())
14117 Resolver.ComplainIsInvalidFormOfPointerToMemberFunction();
14119 Resolver.ComplainNoMatchesFound();
14121 else if (NumMatches > 1 && ShouldComplain)
14122 Resolver.ComplainMultipleMatchesFound();
14123 else if (NumMatches == 1) {
14124 Fn = Resolver.getMatchingFunctionDecl();
14128 FoundResult = *Resolver.getMatchingFunctionAccessPair();
14130 if (Resolver.IsStaticMemberFunctionFromBoundPointer())
14131 Resolver.ComplainIsStaticMemberFunctionFromBoundPointer();
14137 if (pHadMultipleCandidates)
14138 *pHadMultipleCandidates = Resolver.hadMultipleCandidates();
14146 bool IsResultAmbiguous =
false;
14154 return static_cast<int>(
CUDA().IdentifyPreference(Caller, FD1)) -
14155 static_cast<int>(
CUDA().IdentifyPreference(Caller, FD2));
14162 auto *FD = dyn_cast<FunctionDecl>(I->getUnderlyingDecl());
14170 auto FoundBetter = [&]() {
14171 IsResultAmbiguous =
false;
14183 int PreferenceByCUDA = CheckCUDAPreference(FD,
Result);
14185 if (PreferenceByCUDA != 0) {
14187 if (PreferenceByCUDA > 0)
14203 if (MoreConstrained != FD) {
14204 if (!MoreConstrained) {
14205 IsResultAmbiguous =
true;
14206 AmbiguousDecls.push_back(FD);
14215 if (IsResultAmbiguous)
14236 ExprResult &SrcExpr,
bool DoFunctionPointerConversion) {
14238 assert(E->
getType() ==
Context.OverloadTy &&
"SrcExpr must be an overload");
14242 if (!
Found ||
Found->isCPUDispatchMultiVersion() ||
14243 Found->isCPUSpecificMultiVersion())
14291 dyn_cast<FunctionTemplateDecl>((*I)->getUnderlyingDecl());
14322 if (ForTypeDeduction &&
14336 if (FoundResult) *FoundResult = I.getPair();
14347 ExprResult &SrcExpr,
bool doFunctionPointerConversion,
bool complain,
14349 unsigned DiagIDForComplaining) {
14370 if (!complain)
return false;
14373 diag::err_bound_member_function)
14386 SingleFunctionExpression =
14390 if (doFunctionPointerConversion) {
14391 SingleFunctionExpression =
14393 if (SingleFunctionExpression.
isInvalid()) {
14400 if (!SingleFunctionExpression.
isUsable()) {
14402 Diag(OpRangeForComplaining.
getBegin(), DiagIDForComplaining)
14404 << DestTypeForComplaining
14405 << OpRangeForComplaining
14416 SrcExpr = SingleFunctionExpression;
14426 bool PartialOverloading,
14433 if (ExplicitTemplateArgs) {
14434 assert(!KnownValid &&
"Explicit template arguments?");
14443 PartialOverloading);
14448 = dyn_cast<FunctionTemplateDecl>(Callee)) {
14450 ExplicitTemplateArgs, Args, CandidateSet,
14452 PartialOverloading);
14456 assert(!KnownValid &&
"unhandled case in overloaded call candidate");
14462 bool PartialOverloading) {
14485 assert(!(*I)->getDeclContext()->isRecord());
14487 !(*I)->getDeclContext()->isFunctionOrMethod());
14488 assert((*I)->getUnderlyingDecl()->isFunctionOrFunctionTemplate());
14498 ExplicitTemplateArgs = &TABuffer;
14504 CandidateSet, PartialOverloading,
14509 Args, ExplicitTemplateArgs,
14510 CandidateSet, PartialOverloading);
14518 CandidateSet,
false,
false);
14525 case OO_New:
case OO_Array_New:
14526 case OO_Delete:
case OO_Array_Delete:
14549 if (DC->isTransparentContext())
14555 R.suppressDiagnostics();
14565 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
14570 if (FoundInClass) {
14571 *FoundInClass = RD;
14574 R.addDecl(Best->FoundDecl.getDecl(), Best->FoundDecl.getAccess());
14591 AssociatedNamespaces,
14592 AssociatedClasses);
14596 for (Sema::AssociatedNamespaceSet::iterator
14597 it = AssociatedNamespaces.begin(),
14598 end = AssociatedNamespaces.end(); it !=
end; ++it) {
14610 SuggestedNamespaces.insert(*it);
14614 SemaRef.
Diag(R.getNameLoc(), diag::err_not_found_by_two_phase_lookup)
14615 << R.getLookupName();
14616 if (SuggestedNamespaces.empty()) {
14617 SemaRef.
Diag(Best->Function->getLocation(),
14618 diag::note_not_found_by_two_phase_lookup)
14619 << R.getLookupName() << 0;
14620 }
else if (SuggestedNamespaces.size() == 1) {
14621 SemaRef.
Diag(Best->Function->getLocation(),
14622 diag::note_not_found_by_two_phase_lookup)
14623 << R.getLookupName() << 1 << *SuggestedNamespaces.begin();
14628 SemaRef.
Diag(Best->Function->getLocation(),
14629 diag::note_not_found_by_two_phase_lookup)
14630 << R.getLookupName() << 2;
14661class BuildRecoveryCallExprRAII {
14663 Sema::SatisfactionStackResetRAII SatStack;
14666 BuildRecoveryCallExprRAII(Sema &S) : SemaRef(S), SatStack(S) {
14688 bool EmptyLookup,
bool AllowTypoCorrection) {
14696 BuildRecoveryCallExprRAII RCE(SemaRef);
14706 ExplicitTemplateArgs = &TABuffer;
14714 ExplicitTemplateArgs, Args, &FoundInClass)) {
14716 }
else if (EmptyLookup) {
14721 ExplicitTemplateArgs !=
nullptr,
14722 dyn_cast<MemberExpr>(Fn));
14724 AllowTypoCorrection
14730 }
else if (FoundInClass && SemaRef.
getLangOpts().MSVCCompat) {
14745 assert(!R.empty() &&
"lookup results empty despite recovery");
14748 if (R.isAmbiguous()) {
14749 R.suppressDiagnostics();
14756 if ((*R.begin())->isCXXClassMember())
14758 ExplicitTemplateArgs, S);
14759 else if (ExplicitTemplateArgs || TemplateKWLoc.
isValid())
14761 ExplicitTemplateArgs);
14785 assert(!ULE->
getQualifier() &&
"qualified name with ADL");
14792 (F = dyn_cast<FunctionDecl>(*ULE->
decls_begin())) &&
14794 llvm_unreachable(
"performing ADL for builtin");
14801 UnbridgedCastsSet UnbridgedCasts;
14816 if (CandidateSet->
empty() ||
14832 if (CandidateSet->
empty())
14835 UnbridgedCasts.restore();
14842 std::optional<QualType> Result;
14854 else if (Result != T)
14862 if (Best && *Best != CS.
end())
14863 ConsiderCandidate(**Best);
14866 for (
const auto &
C : CS)
14868 ConsiderCandidate(
C);
14871 for (
const auto &
C : CS)
14872 ConsiderCandidate(
C);
14876 auto Value = *Result;
14877 if (
Value.isNull() ||
Value->isUndeducedType())
14894 bool AllowTypoCorrection) {
14895 switch (OverloadResult) {
14906 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14912 if (*Best != CandidateSet->
end() &&
14916 dyn_cast_if_present<CXXMethodDecl>((*Best)->Function);
14921 SemaRef.
PDiag(diag::err_member_call_without_object) << 0 << M),
14931 CandidateSet->
empty(),
14932 AllowTypoCorrection);
14939 for (
const Expr *Arg : Args) {
14940 if (!Arg->getType()->isFunctionType())
14942 if (
auto *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts())) {
14943 auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
14946 Arg->getExprLoc()))
14954 SemaRef.
PDiag(diag::err_ovl_no_viable_function_in_call)
14955 << ULE->
getName() << Fn->getSourceRange()),
14963 SemaRef.
PDiag(diag::err_ovl_ambiguous_call)
14964 << ULE->
getName() << Fn->getSourceRange()),
14971 Fn->getSourceRange(), ULE->
getName(),
14972 *CandidateSet, FDecl, Args);
14981 Res.
get(), FDecl, LParenLoc, Args, RParenLoc, ExecConfig,
14989 SubExprs.append(Args.begin(), Args.end());
14996 for (
auto I = CS.
begin(), E = CS.
end(); I != E; ++I) {
15011 bool AllowTypoCorrection,
15012 bool CalleesAddressIsTaken) {
15027 if (CalleesAddressIsTaken)
15038 Best != CandidateSet.
end()) {
15039 if (
auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
15040 M && M->isImplicitObjectMemberFunction()) {
15051 CUDA().recordPotentialODRUsedVariable(Args, CandidateSet);
15069 if (
const auto *TP =
15079 ExecConfig, &CandidateSet, &Best,
15080 OverloadResult, AllowTypoCorrection);
15089 Context, NamingClass, NNSLoc, DNI, PerformADL, Fns.
begin(), Fns.
end(),
15095 bool HadMultipleCandidates) {
15105 if (
Method->isExplicitObjectMemberFunction())
15109 E, std::nullopt, FoundDecl,
Method);
15113 if (
Method->getParent()->isLambda() &&
15114 Method->getConversionType()->isBlockPointerType()) {
15118 auto *CE = dyn_cast<CastExpr>(SubE);
15119 if (CE && CE->getCastKind() == CK_NoOp)
15120 SubE = CE->getSubExpr();
15122 if (
auto *BE = dyn_cast<CXXBindTemporaryExpr>(SubE))
15123 SubE = BE->getSubExpr();
15146 if (
Method->isExplicitObjectMemberFunction()) {
15152 Expr *ObjectParam = Exp.
get();
15166 Exp.
get()->getEndLoc(),
15180 Expr *Input,
bool PerformADL) {
15182 assert(Op !=
OO_None &&
"Invalid opcode for overloaded unary operator");
15190 Expr *Args[2] = { Input,
nullptr };
15191 unsigned NumArgs = 1;
15196 if (Opc == UO_PostInc || Opc == UO_PostDec) {
15210 if (Opc == UO_PreDec || Opc == UO_PreInc || Opc == UO_Deref)
15221 if (Fn.isInvalid())
15247 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15266 if (
Method->isExplicitObjectMemberFunction())
15270 Input, std::nullopt, Best->FoundDecl,
Method);
15273 Base = Input = InputInit.
get();
15284 Input = InputInit.
get();
15289 Base, HadMultipleCandidates,
15301 Context, Op, FnExpr.
get(), ArgsArray, ResultTy,
VK, OpLoc,
15317 Input, Best->BuiltinParamTypes[0], Best->Conversions[0],
15322 Input = InputRes.
get();
15342 PDiag(diag::err_ovl_ambiguous_oper_unary)
15359 << (Msg !=
nullptr)
15360 << (Msg ? Msg->
getString() : StringRef())
15413 if (Op != OO_Equal && PerformADL) {
15420 Context.DeclarationNames.getCXXOperatorName(ExtraOp);
15446 Expr *RHS,
bool PerformADL,
15447 bool AllowRewrittenCandidates,
15449 Expr *Args[2] = { LHS, RHS };
15453 AllowRewrittenCandidates =
false;
15459 if (Args[0]->isTypeDependent() || Args[1]->isTypeDependent()) {
15480 if (Fn.isInvalid())
15489 if (Opc == BO_PtrMemD) {
15490 auto CheckPlaceholder = [&](
Expr *&Arg) {
15499 if (CheckPlaceholder(Args[0]) || CheckPlaceholder(Args[1]))
15520 if (Opc == BO_Assign && !Args[0]->
getType()->isOverloadableType())
15526 Op, OpLoc, AllowRewrittenCandidates));
15528 CandidateSet.
exclude(DefaultedFn);
15531 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
15540 bool IsReversed = Best->isReversed();
15542 std::swap(Args[0], Args[1]);
15559 if (Best->RewriteKind && ChosenOp == OO_EqualEqual &&
15563 Diag(OpLoc, IsExtension ? diag::ext_ovl_rewrite_equalequal_not_bool
15564 : diag::err_ovl_rewrite_equalequal_not_bool)
15572 if (AllowRewrittenCandidates && !IsReversed &&
15582 for (
unsigned ArgIdx = 0; ArgIdx < 2; ++ArgIdx) {
15585 Best->Conversions[ArgIdx]) ==
15587 AmbiguousWith.push_back(Cand.
Function);
15594 if (!AmbiguousWith.empty()) {
15595 bool AmbiguousWithSelf =
15596 AmbiguousWith.size() == 1 &&
15598 Diag(OpLoc, diag::ext_ovl_ambiguous_oper_binary_reversed)
15600 << Args[0]->
getType() << Args[1]->
getType() << AmbiguousWithSelf
15602 if (AmbiguousWithSelf) {
15604 diag::note_ovl_ambiguous_oper_binary_reversed_self);
15609 if (
auto *MD = dyn_cast<CXXMethodDecl>(FnDecl))
15610 if (Op == OverloadedOperatorKind::OO_EqualEqual &&
15612 !MD->hasCXXExplicitFunctionObjectParameter() &&
15613 Context.hasSameUnqualifiedType(
15614 MD->getFunctionObjectParameterType(),
15615 MD->getParamDecl(0)->getType().getNonReferenceType()) &&
15616 Context.hasSameUnqualifiedType(
15617 MD->getFunctionObjectParameterType(),
15619 Context.hasSameUnqualifiedType(
15620 MD->getFunctionObjectParameterType(),
15623 diag::note_ovl_ambiguous_eqeq_reversed_self_non_const);
15626 diag::note_ovl_ambiguous_oper_binary_selected_candidate);
15627 for (
auto *F : AmbiguousWith)
15629 diag::note_ovl_ambiguous_oper_binary_reversed_candidate);
15637 if (Op == OO_Equal)
15648 if (
Method->isExplicitObjectMemberFunction()) {
15653 Args[0], std::nullopt, Best->FoundDecl,
Method);
15686 Best->FoundDecl,
Base,
15687 HadMultipleCandidates, OpLoc);
15698 const Expr *ImplicitThis =
nullptr;
15703 Context, ChosenOp, FnExpr.
get(), Args, ResultTy,
VK, OpLoc,
15708 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(FnDecl);
15711 ImplicitThis = ArgsArray[0];
15712 ArgsArray = ArgsArray.slice(1);
15719 if (Op == OO_Equal) {
15724 *
this,
AssignedEntity{Args[0], dyn_cast<CXXMethodDecl>(FnDecl)},
15727 if (ImplicitThis) {
15732 CheckArgAlignment(OpLoc, FnDecl,
"'this'", ThisType,
15736 checkCall(FnDecl,
nullptr, ImplicitThis, ArgsArray,
15751 (Op == OO_Spaceship && IsReversed)) {
15752 if (Op == OO_ExclaimEqual) {
15753 assert(ChosenOp == OO_EqualEqual &&
"unexpected operator name");
15756 assert(ChosenOp == OO_Spaceship &&
"unexpected operator name");
15758 Expr *ZeroLiteral =
15767 OpLoc, Opc, Fns, IsReversed ? ZeroLiteral : R.get(),
15768 IsReversed ? R.get() : ZeroLiteral,
true,
15776 assert(ChosenOp == Op &&
"unexpected operator name");
15780 if (Best->RewriteKind !=
CRK_None)
15789 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
15794 Args[0] = ArgsRes0.
get();
15797 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
15802 Args[1] = ArgsRes1.
get();
15812 if (Opc == BO_Comma)
15817 if (DefaultedFn && Opc == BO_Cmp) {
15819 Args[1], DefaultedFn);
15834 Opc >= BO_Assign && Opc <= BO_OrAssign) {
15835 Diag(OpLoc, diag::err_ovl_no_viable_oper)
15838 if (Args[0]->
getType()->isIncompleteType()) {
15839 Diag(OpLoc, diag::note_assign_lhs_incomplete)
15855 assert(
Result.isInvalid() &&
15856 "C++ binary operator overloading is missing candidates!");
15867 << Args[0]->getSourceRange()
15868 << Args[1]->getSourceRange()),
15878 Diag(OpLoc, diag::err_ovl_deleted_special_oper)
15882 Diag(OpLoc, diag::err_ovl_deleted_comparison)
15883 << Args[0]->
getType() << DeletedFD;
15896 PDiag(diag::err_ovl_deleted_oper)
15898 .getCXXOverloadedOperator())
15899 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
15900 << Args[0]->getSourceRange() << Args[1]->getSourceRange()),
15924 "cannot use prvalue expressions more than once");
15925 Expr *OrigLHS = LHS;
15926 Expr *OrigRHS = RHS;
15943 true, DefaultedFn);
15944 if (
Less.isInvalid())
15971 for (; I >= 0; --I) {
15973 auto *VI = Info->lookupValueInfo(Comparisons[I].
Result);
15996 Context, OrigLHS, OrigRHS, BO_Cmp,
Result.get()->getType(),
15997 Result.get()->getValueKind(),
Result.get()->getObjectKind(), OpLoc,
15999 Expr *SemanticForm[] = {LHS, RHS,
Result.get()};
16009 unsigned NumArgsSlots =
16010 MethodArgs.size() + std::max<unsigned>(Args.size(), NumParams);
16013 MethodArgs.reserve(MethodArgs.size() + NumArgsSlots);
16014 bool IsError =
false;
16017 for (
unsigned i = 0; i != NumParams; i++) {
16019 if (i < Args.size()) {
16023 S.
Context, Method->getParamDecl(i)),
16037 MethodArgs.push_back(Arg);
16047 Args.push_back(
Base);
16048 for (
auto *e : ArgExpr) {
16052 Context.DeclarationNames.getCXXOperatorName(OO_Subscript);
16057 ArgExpr.back()->getEndLoc());
16069 if (Fn.isInvalid())
16079 UnbridgedCastsSet UnbridgedCasts;
16092 if (Args.size() == 2)
16095 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16115 if (
Method->isExplicitObjectMemberFunction()) {
16120 Args[0] = Res.
get();
16124 Args[0], std::nullopt, Best->FoundDecl,
Method);
16128 MethodArgs.push_back(Arg0.
get());
16132 *
this, MethodArgs,
Method, ArgExpr, LLoc);
16140 *
this, FnDecl, Best->FoundDecl,
Base, HadMultipleCandidates,
16151 Context, OO_Subscript, FnExpr.
get(), MethodArgs, ResultTy,
VK, RLoc,
16168 Args[0], Best->BuiltinParamTypes[0], Best->Conversions[0],
16173 Args[0] = ArgsRes0.
get();
16176 Args[1], Best->BuiltinParamTypes[1], Best->Conversions[1],
16181 Args[1] = ArgsRes1.
get();
16189 CandidateSet.
empty()
16190 ? (
PDiag(diag::err_ovl_no_oper)
16191 << Args[0]->getType() << 0
16192 << Args[0]->getSourceRange() << Range)
16193 : (
PDiag(diag::err_ovl_no_viable_subscript)
16194 << Args[0]->getType() << Args[0]->getSourceRange() << Range);
16201 if (Args.size() == 2) {
16204 LLoc,
PDiag(diag::err_ovl_ambiguous_oper_binary)
16206 << Args[0]->getSourceRange() << Range),
16211 PDiag(diag::err_ovl_ambiguous_subscript_call)
16213 << Args[0]->getSourceRange() << Range),
16222 PDiag(diag::err_ovl_deleted_oper)
16223 <<
"[]" << (Msg !=
nullptr)
16224 << (Msg ? Msg->
getString() : StringRef())
16225 << Args[0]->getSourceRange() << Range),
16239 Expr *ExecConfig,
bool IsExecConfig,
16240 bool AllowRecovery) {
16249 if (
BinaryOperator *op = dyn_cast<BinaryOperator>(NakedMemExpr)) {
16250 assert(op->getType() ==
Context.BoundMemberTy);
16251 assert(op->getOpcode() == BO_PtrMemD || op->getOpcode() == BO_PtrMemI);
16264 QualType objectType = op->getLHS()->getType();
16265 if (op->getOpcode() == BO_PtrMemI)
16269 Qualifiers difference = objectQuals - funcQuals;
16273 std::string qualsString = difference.
getAsString();
16274 Diag(LParenLoc, diag::err_pointer_to_member_call_drops_quals)
16277 << (qualsString.find(
' ') == std::string::npos ? 1 : 2);
16281 Context, MemExprE, Args, resultType, valueKind, RParenLoc,
16291 if (CheckOtherCall(call, proto))
16301 if (!AllowRecovery)
16303 std::vector<Expr *> SubExprs = {MemExprE};
16304 llvm::append_range(SubExprs, Args);
16312 UnbridgedCastsSet UnbridgedCasts;
16318 bool HadMultipleCandidates =
false;
16326 UnbridgedCasts.restore();
16344 TemplateArgs = &TemplateArgsBuffer;
16348 E = UnresExpr->
decls_end(); I != E; ++I) {
16350 QualType ExplicitObjectType = ObjectType;
16357 bool HasExplicitParameter =
false;
16358 if (
const auto *M = dyn_cast<FunctionDecl>(
Func);
16359 M && M->hasCXXExplicitFunctionObjectParameter())
16360 HasExplicitParameter =
true;
16361 else if (
const auto *M = dyn_cast<FunctionTemplateDecl>(
Func);
16363 M->getTemplatedDecl()->hasCXXExplicitFunctionObjectParameter())
16364 HasExplicitParameter =
true;
16366 if (HasExplicitParameter)
16374 }
else if ((
Method = dyn_cast<CXXMethodDecl>(
Func))) {
16381 ObjectClassification, Args, CandidateSet,
16385 I.getPair(), ActingDC, TemplateArgs,
16386 ExplicitObjectType, ObjectClassification,
16387 Args, CandidateSet,
16392 HadMultipleCandidates = (CandidateSet.
size() > 1);
16396 UnbridgedCasts.restore();
16399 bool Succeeded =
false;
16404 FoundDecl = Best->FoundDecl;
16424 PDiag(diag::err_ovl_no_viable_member_function_in_call)
16431 PDiag(diag::err_ovl_ambiguous_member_call)
16438 CandidateSet, Best->Function, Args,
true);
16449 MemExprE = Res.
get();
16453 if (
Method->isStatic()) {
16455 ExecConfig, IsExecConfig);
16465 assert(
Method &&
"Member call to something that isn't a method?");
16470 if (
Method->isExplicitObjectMemberFunction()) {
16478 HadMultipleCandidates, MemExpr->
getExprLoc());
16485 TheCall->setUsesMemberSyntax(
true);
16495 Proto->getNumParams());
16501 return BuildRecoveryExpr(ResultType);
16506 return BuildRecoveryExpr(ResultType);
16516 if (
auto *MemE = dyn_cast<MemberExpr>(NakedMemExpr)) {
16517 if (
const EnableIfAttr *
Attr =
16519 Diag(MemE->getMemberLoc(),
16520 diag::err_ovl_no_viable_member_function_in_call)
16523 diag::note_ovl_candidate_disabled_by_function_cond_attr)
16524 <<
Attr->getCond()->getSourceRange() <<
Attr->getMessage();
16530 TheCall->getDirectCallee()->isPureVirtual()) {
16536 diag::warn_call_to_pure_virtual_member_function_from_ctor_dtor)
16547 if (
auto *DD = dyn_cast<CXXDestructorDecl>(TheCall->getDirectCallee())) {
16551 CallCanBeVirtual,
true,
16556 TheCall->getDirectCallee());
16568 UnbridgedCastsSet UnbridgedCasts;
16572 assert(
Object.get()->getType()->isRecordType() &&
16573 "Requires object type argument");
16587 diag::err_incomplete_object_call,
Object.get()))
16590 auto *
Record =
Object.get()->getType()->castAsCXXRecordDecl();
16593 R.suppressAccessDiagnostics();
16596 Oper != OperEnd; ++Oper) {
16610 bool IgnoreSurrogateFunctions =
false;
16613 if (!Candidate.
Viable &&
16615 IgnoreSurrogateFunctions =
true;
16637 !IgnoreSurrogateFunctions && I != E; ++I) {
16659 Object.get(), Args, CandidateSet);
16664 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16677 CandidateSet.
empty()
16678 ? (
PDiag(diag::err_ovl_no_oper)
16679 <<
Object.get()->getType() << 1
16680 <<
Object.get()->getSourceRange())
16681 : (
PDiag(diag::err_ovl_no_viable_object_call)
16682 <<
Object.get()->getType() <<
Object.get()->getSourceRange());
16689 if (!R.isAmbiguous())
16692 PDiag(diag::err_ovl_ambiguous_object_call)
16693 <<
Object.get()->getType()
16694 <<
Object.get()->getSourceRange()),
16705 PDiag(diag::err_ovl_deleted_object_call)
16706 <<
Object.get()->getType() << (Msg !=
nullptr)
16707 << (Msg ? Msg->
getString() : StringRef())
16708 <<
Object.get()->getSourceRange()),
16714 if (Best == CandidateSet.
end())
16717 UnbridgedCasts.restore();
16719 if (Best->Function ==
nullptr) {
16724 Best->Conversions[0].UserDefined.ConversionFunction);
16730 assert(Conv == Best->FoundDecl.getDecl() &&
16731 "Found Decl & conversion-to-functionptr should be same, right?!");
16739 Conv, HadMultipleCandidates);
16740 if (
Call.isInvalid())
16744 Context,
Call.get()->getType(), CK_UserDefinedConversion,
Call.get(),
16758 if (
Method->isInvalidDecl())
16765 Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc);
16768 Obj, HadMultipleCandidates,
16775 MethodArgs.reserve(NumParams + 1);
16777 bool IsError =
false;
16781 if (
Method->isExplicitObjectMemberFunction()) {
16790 MethodArgs.push_back(
Object.get());
16794 *
this, MethodArgs,
Method, Args, LParenLoc);
16797 if (Proto->isVariadic()) {
16799 for (
unsigned i = NumParams, e = Args.size(); i < e; i++) {
16803 MethodArgs.push_back(Arg.
get());
16818 Context, OO_Call, NewFn.
get(), MethodArgs, ResultTy,
VK, RParenLoc,
16832 bool *NoArrowOperatorFound) {
16833 assert(
Base->getType()->isRecordType() &&
16834 "left-hand side must have class type");
16848 Context.DeclarationNames.getCXXOperatorName(OO_Arrow);
16852 diag::err_typecheck_incomplete_tag,
Base))
16857 R.suppressAccessDiagnostics();
16860 Oper != OperEnd; ++Oper) {
16866 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16877 if (CandidateSet.
empty()) {
16879 if (NoArrowOperatorFound) {
16882 *NoArrowOperatorFound =
true;
16885 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
16886 << BaseType <<
Base->getSourceRange();
16887 if (BaseType->isRecordType() && !BaseType->isPointerType()) {
16888 Diag(OpLoc, diag::note_typecheck_member_reference_suggestion)
16892 Diag(OpLoc, diag::err_ovl_no_viable_oper)
16893 <<
"operator->" <<
Base->getSourceRange();
16898 if (!R.isAmbiguous())
16901 <<
"->" <<
Base->getType()
16902 <<
Base->getSourceRange()),
16910 <<
"->" << (Msg !=
nullptr)
16911 << (Msg ? Msg->
getString() : StringRef())
16912 <<
Base->getSourceRange()),
16923 if (
Method->isExplicitObjectMemberFunction()) {
16930 Base, std::nullopt, Best->FoundDecl,
Method);
16938 Base, HadMultipleCandidates, OpLoc);
16972 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
16985 PDiag(diag::err_ovl_no_viable_function_in_call)
16986 << R.getLookupName()),
16993 << R.getLookupName()),
17000 nullptr, HadMultipleCandidates,
17003 if (Fn.isInvalid())
17009 for (
unsigned ArgIdx = 0, N = Args.size(); ArgIdx != N; ++ArgIdx) {
17015 ConvArgs[ArgIdx] = InputInit.
get();
17042 Scope *S =
nullptr;
17045 if (!MemberLookup.
empty()) {
17072 if (CandidateSet->
empty() || CandidateSetError) {
17085 Loc,
nullptr, CandidateSet, &Best,
17098 if (
ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
17103 if (SubExpr.
get() == PE->getSubExpr())
17107 ParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.
get());
17115 assert(
Context.hasSameType(ICE->getSubExpr()->getType(),
17117 "Implicit cast type cannot be determined from overload");
17118 assert(ICE->path_empty() &&
"fixing up hierarchy conversion?");
17119 if (SubExpr.
get() == ICE->getSubExpr())
17127 if (
auto *GSE = dyn_cast<GenericSelectionExpr>(E)) {
17128 if (!GSE->isResultDependent()) {
17133 if (SubExpr.
get() == GSE->getResultExpr())
17140 unsigned ResultIdx = GSE->getResultIndex();
17141 AssocExprs[ResultIdx] = SubExpr.
get();
17143 if (GSE->isExprPredicate())
17145 Context, GSE->getGenericLoc(), GSE->getControllingExpr(),
17146 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17147 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17150 Context, GSE->getGenericLoc(), GSE->getControllingType(),
17151 GSE->getAssocTypeSourceInfos(), AssocExprs, GSE->getDefaultLoc(),
17152 GSE->getRParenLoc(), GSE->containsUnexpandedParameterPack(),
17161 assert(UnOp->getOpcode() == UO_AddrOf &&
17162 "Can only take the address of an overloaded function");
17164 if (!
Method->isImplicitObjectMemberFunction()) {
17175 if (SubExpr.
get() == UnOp->getSubExpr())
17183 "fixed to something other than a decl ref");
17186 assert(Qualifier &&
17187 "fixed to a member ref with no nested name qualifier");
17193 Fn->getType(), Qualifier,
17196 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
17201 UnOp->getOperatorLoc(),
false,
17209 if (SubExpr.
get() == UnOp->getSubExpr())
17222 if (ULE->hasExplicitTemplateArgs()) {
17223 ULE->copyTemplateArgumentsInto(TemplateArgsBuffer);
17224 TemplateArgs = &TemplateArgsBuffer;
17229 getLangOpts().CPlusPlus && !Fn->hasCXXExplicitFunctionObjectParameter()
17234 if (
unsigned BID = Fn->getBuiltinID()) {
17235 if (!
Context.BuiltinInfo.isDirectlyAddressable(BID)) {
17242 Fn,
Type, ValueKind, ULE->getNameInfo(), ULE->getQualifierLoc(),
17243 Found.getDecl(), ULE->getTemplateKeywordLoc(), TemplateArgs);
17251 if (MemExpr->hasExplicitTemplateArgs()) {
17252 MemExpr->copyTemplateArgumentsInto(TemplateArgsBuffer);
17253 TemplateArgs = &TemplateArgsBuffer;
17260 if (MemExpr->isImplicitAccess()) {
17263 Fn, Fn->getType(),
VK_LValue, MemExpr->getNameInfo(),
17264 MemExpr->getQualifierLoc(),
Found.getDecl(),
17265 MemExpr->getTemplateKeywordLoc(), TemplateArgs);
17270 if (MemExpr->getQualifier())
17271 Loc = MemExpr->getQualifierLoc().getBeginLoc();
17276 Base = MemExpr->getBase();
17282 type = Fn->getType();
17289 Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),
17290 MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn,
Found,
17291 true, MemExpr->getMemberNameInfo(),
17295 llvm_unreachable(
"Invalid reference to overloaded function");
17306 if (!PartialOverloading || !
Function)
17310 if (
const auto *Proto =
17311 dyn_cast<FunctionProtoType>(
Function->getFunctionType()))
17312 if (Proto->isTemplateVariadic())
17314 if (
auto *Pattern =
Function->getTemplateInstantiationPattern())
17315 if (
const auto *Proto =
17316 dyn_cast<FunctionProtoType>(Pattern->getFunctionType()))
17317 if (Proto->isTemplateVariadic())
17330 << IsMember << Name << (Msg !=
nullptr)
17331 << (Msg ? Msg->
getString() : StringRef())
Defines the clang::ASTContext interface.
Defines the Diagnostic-related interfaces.
static bool isBooleanType(QualType Ty)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
static const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
llvm::json::Object Object
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(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.
void setInitializerListContainerType(QualType T, bool IA)
bool hasInitializerListContainerType() const
unsigned getKindRank() const
Return a ranking of the implicit conversion sequence kind, where smaller ranks represent better conve...
bool isInitializerListOfIncompleteArray() const
BadConversionSequence Bad
When ConversionKind == BadConversion, provides the details of the bad conversion.
QualType getInitializerListContainerType() const
void DiagnoseAmbiguousConversion(Sema &S, SourceLocation CaretLoc, const PartialDiagnostic &PDiag) const
Diagnoses an ambiguous conversion.
Describes an C or C++ initializer list.
bool hasDesignatedInit() const
Determine whether this initializer list contains a designated initializer.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
const Expr * getInit(unsigned Init) const
SourceLocation getEndLoc() const LLVM_READONLY
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static InitializedEntity InitializeTemplateParameter(QualType T, NamedDecl *Param)
Create the initialization entity for a template parameter.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
An lvalue reference type, per C++11 [dcl.ref].
bool isCompatibleWithMSVC() const
Represents the results of name lookup.
void addAllDecls(const LookupResult &Other)
Add all the declarations from another set of lookup results.
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.
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.