37#include "llvm/ADT/DenseSet.h"
38#include "llvm/ADT/STLExtras.h"
39#include "llvm/ADT/STLForwardCompat.h"
40#include "llvm/ADT/ScopeExit.h"
41#include "llvm/ADT/SmallPtrSet.h"
42#include "llvm/ADT/SmallVector.h"
56 return P->hasAttr<PassObjectSizeAttr>();
77 if (HadMultipleCandidates)
88 CK_FunctionToPointerDecay);
92 bool InOverloadResolution,
95 bool AllowObjCWritebackConversion);
99 bool InOverloadResolution,
107 bool AllowObjCConversionOnExplicit);
168 return Rank[(
int)Kind];
193 static const char *
const Name[] = {
197 "Function-to-pointer",
198 "Function pointer conversion",
200 "Integral promotion",
201 "Floating point promotion",
203 "Integral conversion",
204 "Floating conversion",
205 "Complex conversion",
206 "Floating-integral conversion",
207 "Pointer conversion",
208 "Pointer-to-member conversion",
209 "Boolean conversion",
210 "Compatible-types conversion",
211 "Derived-to-base conversion",
213 "SVE Vector conversion",
214 "RVV Vector conversion",
216 "Complex-real conversion",
217 "Block Pointer conversion",
218 "Transparent Union Conversion",
219 "Writeback conversion",
220 "OpenCL Zero Event Conversion",
221 "OpenCL Zero Queue Conversion",
222 "C specific type conversion",
223 "Incompatible pointer conversion",
224 "Fixed point conversion",
225 "HLSL vector truncation",
226 "Non-decaying array conversion",
314 const Expr *Converted) {
317 if (
auto *EWC = dyn_cast<ExprWithCleanups>(Converted)) {
324 while (
auto *ICE = dyn_cast<ImplicitCastExpr>(Converted)) {
325 switch (ICE->getCastKind()) {
327 case CK_IntegralCast:
328 case CK_IntegralToBoolean:
329 case CK_IntegralToFloating:
330 case CK_BooleanToSignedIntegral:
331 case CK_FloatingToIntegral:
332 case CK_FloatingToBoolean:
333 case CK_FloatingCast:
334 Converted = ICE->getSubExpr();
358 QualType &ConstantType,
bool IgnoreFloatToIntegralConversion)
const {
360 "narrowing check outside C++");
371 ToType = ET->getDecl()->getIntegerType();
377 goto FloatingIntegralConversion;
379 goto IntegralConversion;
390 FloatingIntegralConversion:
395 if (IgnoreFloatToIntegralConversion)
398 assert(
Initializer &&
"Unknown conversion expression");
404 if (std::optional<llvm::APSInt> IntConstantValue =
408 Result.convertFromAPInt(*IntConstantValue, IntConstantValue->isSigned(),
409 llvm::APFloat::rmNearestTiesToEven);
411 llvm::APSInt ConvertedValue = *IntConstantValue;
413 Result.convertToInteger(ConvertedValue,
414 llvm::APFloat::rmTowardZero, &ignored);
416 if (*IntConstantValue != ConvertedValue) {
417 ConstantValue =
APValue(*IntConstantValue);
444 Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue)) {
447 ConstantValue = R.
Val;
448 assert(ConstantValue.
isFloat());
449 llvm::APFloat FloatVal = ConstantValue.
getFloat();
452 llvm::APFloat Converted = FloatVal;
453 llvm::APFloat::opStatus ConvertStatus =
455 llvm::APFloat::rmNearestTiesToEven, &ignored);
457 llvm::APFloat::rmNearestTiesToEven, &ignored);
459 if (FloatVal.isNaN() && Converted.isNaN() &&
460 !FloatVal.isSignaling() && !Converted.isSignaling()) {
466 if (!Converted.bitwiseIsEqual(FloatVal)) {
473 if (ConvertStatus & llvm::APFloat::opOverflow) {
495 IntegralConversion: {
503 constexpr auto CanRepresentAll = [](
bool FromSigned,
unsigned FromWidth,
504 bool ToSigned,
unsigned ToWidth) {
505 return (FromWidth < ToWidth + (FromSigned == ToSigned)) &&
506 !(FromSigned && !ToSigned);
509 if (CanRepresentAll(FromSigned, FromWidth, ToSigned, ToWidth))
515 bool DependentBitField =
false;
517 if (BitField->getBitWidth()->isValueDependent())
518 DependentBitField =
true;
519 else if (
unsigned BitFieldWidth = BitField->getBitWidthValue(Ctx);
520 BitFieldWidth < FromWidth) {
521 if (CanRepresentAll(FromSigned, BitFieldWidth, ToSigned, ToWidth))
525 FromWidth = BitFieldWidth;
533 std::optional<llvm::APSInt> OptInitializerValue =
535 if (!OptInitializerValue) {
539 if (DependentBitField && !(FromSigned && !ToSigned))
545 llvm::APSInt &InitializerValue = *OptInitializerValue;
546 bool Narrowing =
false;
547 if (FromWidth < ToWidth) {
550 if (InitializerValue.isSigned() && InitializerValue.isNegative())
556 InitializerValue.extend(InitializerValue.getBitWidth() + 1);
558 llvm::APSInt ConvertedValue = InitializerValue;
559 ConvertedValue = ConvertedValue.trunc(ToWidth);
560 ConvertedValue.setIsSigned(ToSigned);
561 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
562 ConvertedValue.setIsSigned(InitializerValue.isSigned());
564 if (ConvertedValue != InitializerValue)
569 ConstantValue =
APValue(InitializerValue);
585 ConstantValue = R.
Val;
586 assert(ConstantValue.
isFloat());
587 llvm::APFloat FloatVal = ConstantValue.
getFloat();
592 if (FloatVal.isNaN() && FloatVal.isSignaling()) {
608 raw_ostream &OS = llvm::errs();
609 bool PrintedSomething =
false;
612 PrintedSomething =
true;
616 if (PrintedSomething) {
622 OS <<
" (by copy constructor)";
624 OS <<
" (direct reference binding)";
626 OS <<
" (reference binding)";
628 PrintedSomething =
true;
632 if (PrintedSomething) {
636 PrintedSomething =
true;
639 if (!PrintedSomething) {
640 OS <<
"No conversions required";
647 raw_ostream &OS = llvm::errs();
655 OS <<
"aggregate initialization";
665 raw_ostream &OS = llvm::errs();
667 OS <<
"Worst list element conversion: ";
668 switch (ConversionKind) {
670 OS <<
"Standard conversion: ";
674 OS <<
"User-defined conversion: ";
678 OS <<
"Ellipsis conversion";
681 OS <<
"Ambiguous conversion";
684 OS <<
"Bad conversion";
709 struct DFIArguments {
715 struct DFIParamWithArguments : DFIArguments {
720 struct DFIDeducedMismatchArgs : DFIArguments {
722 unsigned CallArgIndex;
739 Result.Result =
static_cast<unsigned>(TDK);
740 Result.HasDiagnostic =
false;
759 auto *Saved =
new (Context) DFIDeducedMismatchArgs;
770 DFIArguments *Saved =
new (Context) DFIArguments;
782 DFIParamWithArguments *Saved =
new (Context) DFIParamWithArguments;
783 Saved->Param = Info.
Param;
796 Result.HasDiagnostic =
true;
801 CNSInfo *Saved =
new (Context) CNSInfo;
811 llvm_unreachable(
"not a deduction failure");
844 Diag->~PartialDiagnosticAt();
853 Diag->~PartialDiagnosticAt();
889 return TemplateParameter::getFromOpaqueValue(
Data);
894 return static_cast<DFIParamWithArguments*
>(
Data)->Param;
924 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->TemplateArgs;
930 return static_cast<CNSInfo*
>(
Data)->TemplateArgs;
962 return &
static_cast<DFIArguments*
>(
Data)->FirstArg;
994 return &
static_cast<DFIArguments*
>(
Data)->SecondArg;
1009 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->CallArgIndex;
1012 return std::nullopt;
1025 for (
unsigned I = 0; I <
X->getNumParams(); ++I)
1029 if (
auto *FTX =
X->getDescribedFunctionTemplate()) {
1034 FTY->getTemplateParameters()))
1043 OverloadedOperatorKind::OO_EqualEqual);
1055 OverloadedOperatorKind::OO_ExclaimEqual);
1056 if (isa<CXXMethodDecl>(EqFD)) {
1073 auto *NotEqFD = Op->getAsFunction();
1074 if (
auto *UD = dyn_cast<UsingShadowDecl>(Op))
1075 NotEqFD = UD->getUnderlyingDecl()->getAsFunction();
1078 cast<Decl>(Op->getLexicalDeclContext())))
1088 return Op == OO_EqualEqual || Op == OO_Spaceship;
1094 if (!allowsReversed(Op))
1096 if (Op == OverloadedOperatorKind::OO_EqualEqual) {
1097 assert(OriginalArgs.size() == 2);
1099 S, OpLoc, OriginalArgs[1], FD))
1110void OverloadCandidateSet::destroyCandidates() {
1112 for (
auto &
C : i->Conversions)
1113 C.~ImplicitConversionSequence();
1115 i->DeductionFailure.Destroy();
1120 destroyCandidates();
1121 SlabAllocator.Reset();
1122 NumInlineBytesUsed = 0;
1129 class UnbridgedCastsSet {
1139 Entry entry = { &
E,
E };
1140 Entries.push_back(entry);
1146 i = Entries.begin(), e = Entries.end(); i != e; ++i)
1147 *i->Addr = i->Saved;
1161 UnbridgedCastsSet *unbridgedCasts =
nullptr) {
1165 if (placeholder->getKind() == BuiltinType::Overload)
return false;
1169 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
1171 unbridgedCasts->save(S,
E);
1191 UnbridgedCastsSet &unbridged) {
1192 for (
unsigned i = 0, e = Args.size(); i != e; ++i)
1201 NamedDecl *&Match,
bool NewIsUsingDecl) {
1206 bool OldIsUsingDecl =
false;
1207 if (isa<UsingShadowDecl>(OldD)) {
1208 OldIsUsingDecl =
true;
1212 if (NewIsUsingDecl)
continue;
1214 OldD = cast<UsingShadowDecl>(OldD)->getTargetDecl();
1219 if ((OldIsUsingDecl || NewIsUsingDecl) && !isVisible(*I))
1227 bool UseMemberUsingDeclRules =
1228 (OldIsUsingDecl || NewIsUsingDecl) && CurContext->isRecord() &&
1232 if (!IsOverload(New, OldF, UseMemberUsingDeclRules)) {
1233 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
1234 HideUsingShadowDecl(S, cast<UsingShadowDecl>(*I));
1238 if (!isa<FunctionTemplateDecl>(OldD) &&
1239 !shouldLinkPossiblyHiddenDecl(*I, New))
1248 if (!getASTContext().canBuiltinBeRedeclared(OldF)) {
1250 return Ovl_NonFunction;
1252 }
else if (isa<UsingDecl>(OldD) || isa<UsingPackDecl>(OldD)) {
1256 }
else if (isa<TagDecl>(OldD)) {
1258 }
else if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(OldD)) {
1265 if (UUD->getQualifier()->isDependent() && !UUD->isCXXClassMember()) {
1267 return Ovl_NonFunction;
1274 return Ovl_NonFunction;
1299 if (CheckFunctionTemplateSpecialization(New,
nullptr, TemplateSpecResult,
1302 return Ovl_Overload;
1309 return Ovl_Overload;
1314 bool UseMemberUsingDeclRules,
1315 bool ConsiderCudaAttrs,
1316 bool UseOverrideRules =
false) {
1333 if ((OldTemplate ==
nullptr) != (NewTemplate ==
nullptr))
1346 if (isa<FunctionNoProtoType>(OldQType.
getTypePtr()) ||
1347 isa<FunctionNoProtoType>(NewQType.
getTypePtr()))
1350 const auto *OldType = cast<FunctionProtoType>(OldQType);
1351 const auto *NewType = cast<FunctionProtoType>(NewQType);
1356 if (OldQType != NewQType && OldType->isVariadic() != NewType->isVariadic())
1371 OldDecl = OldTemplate;
1372 NewDecl = NewTemplate;
1390 bool ConstraintsInTemplateHead =
1401 if (UseMemberUsingDeclRules && ConstraintsInTemplateHead &&
1402 !SameTemplateParameterList)
1404 if (!UseMemberUsingDeclRules &&
1405 (!SameTemplateParameterList || !SameReturnType))
1409 const auto *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1410 const auto *NewMethod = dyn_cast<CXXMethodDecl>(New);
1412 int OldParamsOffset = 0;
1413 int NewParamsOffset = 0;
1421 if (ThisType.isConstQualified())
1435 !isa<CXXConstructorDecl>(NewMethod))
1441 BS.
Quals = NormalizeQualifiers(OldMethod, BS.
Quals);
1442 DS.Quals = NormalizeQualifiers(NewMethod, DS.Quals);
1444 if (OldMethod->isExplicitObjectMemberFunction()) {
1446 DS.Quals.removeVolatile();
1449 return BS.
Quals == DS.Quals;
1453 auto BS =
Base.getNonReferenceType().getCanonicalType().split();
1454 auto DS =
D.getNonReferenceType().getCanonicalType().split();
1456 if (!AreQualifiersEqual(BS, DS))
1459 if (OldMethod->isImplicitObjectMemberFunction() &&
1460 OldMethod->getParent() != NewMethod->getParent()) {
1463 .getCanonicalType();
1473 if (
Base->isLValueReferenceType())
1474 return D->isLValueReferenceType();
1475 return Base->isRValueReferenceType() ==
D->isRValueReferenceType();
1480 auto DiagnoseInconsistentRefQualifiers = [&]() {
1483 if (OldMethod->getRefQualifier() == NewMethod->getRefQualifier())
1485 if (OldMethod->isExplicitObjectMemberFunction() ||
1486 NewMethod->isExplicitObjectMemberFunction())
1488 if (!UseMemberUsingDeclRules && (OldMethod->getRefQualifier() ==
RQ_None ||
1489 NewMethod->getRefQualifier() ==
RQ_None)) {
1490 SemaRef.
Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
1491 << NewMethod->getRefQualifier() << OldMethod->getRefQualifier();
1492 SemaRef.
Diag(OldMethod->getLocation(), diag::note_previous_declaration);
1498 if (OldMethod && OldMethod->isExplicitObjectMemberFunction())
1500 if (NewMethod && NewMethod->isExplicitObjectMemberFunction())
1503 if (OldType->getNumParams() - OldParamsOffset !=
1504 NewType->getNumParams() - NewParamsOffset ||
1506 {OldType->param_type_begin() + OldParamsOffset,
1507 OldType->param_type_end()},
1508 {NewType->param_type_begin() + NewParamsOffset,
1509 NewType->param_type_end()},
1514 if (OldMethod && NewMethod && !OldMethod->isStatic() &&
1515 !NewMethod->isStatic()) {
1516 bool HaveCorrespondingObjectParameters = [&](
const CXXMethodDecl *Old,
1518 auto NewObjectType = New->getFunctionObjectParameterReferenceType();
1522 return F->getRefQualifier() ==
RQ_None &&
1523 !F->isExplicitObjectMemberFunction();
1526 if (IsImplicitWithNoRefQual(Old) != IsImplicitWithNoRefQual(New) &&
1527 CompareType(OldObjectType.getNonReferenceType(),
1528 NewObjectType.getNonReferenceType()))
1530 return CompareType(OldObjectType, NewObjectType);
1531 }(OldMethod, NewMethod);
1533 if (!HaveCorrespondingObjectParameters) {
1534 if (DiagnoseInconsistentRefQualifiers())
1539 if (!UseOverrideRules || (!NewMethod->isExplicitObjectMemberFunction() &&
1540 !OldMethod->isExplicitObjectMemberFunction()))
1545 if (!UseOverrideRules &&
1549 if ((NewRC !=
nullptr) != (OldRC !=
nullptr))
1556 if (NewMethod && OldMethod && OldMethod->isImplicitObjectMemberFunction() &&
1557 NewMethod->isImplicitObjectMemberFunction()) {
1558 if (DiagnoseInconsistentRefQualifiers())
1576 NewI != NewE || OldI != OldE; ++NewI, ++OldI) {
1577 if (NewI == NewE || OldI == OldE)
1579 llvm::FoldingSetNodeID NewID, OldID;
1581 OldI->getCond()->Profile(OldID, SemaRef.
Context,
true);
1586 if (SemaRef.
getLangOpts().CUDA && ConsiderCudaAttrs) {
1589 if (!isa<CXXDestructorDecl>(New)) {
1594 "Unexpected invalid target.");
1598 if (NewTarget != OldTarget)
1609 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1615 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1628 bool SuppressUserConversions,
1630 bool InOverloadResolution,
1632 bool AllowObjCWritebackConversion,
1633 bool AllowObjCConversionOnExplicit) {
1636 if (SuppressUserConversions) {
1647 Conversions, AllowExplicit,
1648 AllowObjCConversionOnExplicit)) {
1669 if (
const auto *InitList = dyn_cast<InitListExpr>(From);
1670 InitList && InitList->getNumInits() == 1 &&
1672 const Expr *SingleInit = InitList->getInit(0);
1673 FromType = SingleInit->
getType();
1683 if ((FromCanon == ToCanon ||
1694 if (ToCanon != FromCanon)
1705 Cand != Conversions.
end(); ++Cand)
1748 bool SuppressUserConversions,
1750 bool InOverloadResolution,
1752 bool AllowObjCWritebackConversion,
1753 bool AllowObjCConversionOnExplicit) {
1756 ICS.
Standard, CStyle, AllowObjCWritebackConversion)){
1797 auto *ToResType = cast<HLSLAttributedResourceType>(ToType);
1798 auto *FromResType = cast<HLSLAttributedResourceType>(FromType);
1800 FromResType->getWrappedType()) &&
1802 FromResType->getContainedType()) &&
1803 ToResType->getAttrs() == FromResType->getAttrs()) {
1813 AllowExplicit, InOverloadResolution, CStyle,
1814 AllowObjCWritebackConversion,
1815 AllowObjCConversionOnExplicit);
1820 bool SuppressUserConversions,
1822 bool InOverloadResolution,
1824 bool AllowObjCWritebackConversion) {
1825 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1826 AllowExplicit, InOverloadResolution, CStyle,
1827 AllowObjCWritebackConversion,
1833 bool AllowExplicit) {
1838 bool AllowObjCWritebackConversion =
1841 if (getLangOpts().ObjC)
1845 *
this, From, ToType,
1847 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1849 false, AllowObjCWritebackConversion,
1851 return PerformImplicitConversion(From, ToType, ICS, Action);
1869 if (TyClass != CanFrom->getTypeClass())
return false;
1870 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1871 if (TyClass == Type::Pointer) {
1874 }
else if (TyClass == Type::BlockPointer) {
1877 }
else if (TyClass == Type::MemberPointer) {
1881 if (ToMPT->getClass() != FromMPT->
getClass())
1883 CanTo = ToMPT->getPointeeType();
1889 TyClass = CanTo->getTypeClass();
1890 if (TyClass != CanFrom->getTypeClass())
return false;
1891 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1895 const auto *FromFn = cast<FunctionType>(CanFrom);
1898 const auto *ToFn = cast<FunctionType>(CanTo);
1901 bool Changed =
false;
1910 if (
const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn)) {
1911 const auto *ToFPT = cast<FunctionProtoType>(ToFn);
1912 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
1913 FromFn = cast<FunctionType>(
1924 bool CanUseToFPT, CanUseFromFPT;
1926 CanUseFromFPT, NewParamInfos) &&
1927 CanUseToFPT && !CanUseFromFPT) {
1930 NewParamInfos.empty() ? nullptr : NewParamInfos.data();
1932 FromFPT->getParamTypes(), ExtInfo);
1942 FromFPT = cast<FunctionProtoType>(FromFn);
1946 const auto FromFX = FromFPT->getFunctionEffects();
1947 const auto ToFX = ToFPT->getFunctionEffects();
1948 if (FromFX != ToFX) {
1952 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
1962 assert(
QualType(FromFn, 0).isCanonical());
1963 if (
QualType(FromFn, 0) != CanTo)
return false;
1991 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
1992 &ToSem == &llvm::APFloat::IEEEquad()) ||
1993 (&FromSem == &llvm::APFloat::IEEEquad() &&
1994 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2049 bool InOverloadResolution,
bool CStyle) {
2066 if (ToExtType && FromExtType) {
2068 unsigned ToElts = ToExtType->getNumElements();
2069 if (FromElts < ToElts)
2071 if (FromElts == ToElts)
2077 QualType ToElTy = ToExtType->getElementType();
2082 if (FromExtType && !ToExtType) {
2104 QualType ToElTy = ToExtType->getElementType();
2138 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
2143 !InOverloadResolution && !CStyle) {
2145 << FromType << ToType;
2156 bool InOverloadResolution,
2169 bool InOverloadResolution,
2172 bool AllowObjCWritebackConversion) {
2198 FromType = Fn->getType();
2219 if (Method && !Method->
isStatic() &&
2222 "Non-unary operator on non-static member address");
2223 assert(cast<UnaryOperator>(From->
IgnoreParens())->getOpcode()
2225 "Non-address-of operator on non-static member address");
2226 const Type *ClassType
2230 assert(cast<UnaryOperator>(From->
IgnoreParens())->getOpcode() ==
2232 "Non-address-of operator for overloaded function expression");
2279 FromType =
Atomic->getValueType();
2314 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2334 bool IncompatibleObjC =
false;
2389 }
else if (AllowObjCWritebackConversion &&
2393 FromType, IncompatibleObjC)) {
2399 InOverloadResolution, FromType)) {
2403 From, InOverloadResolution, CStyle)) {
2413 S, From, ToType, InOverloadResolution, SCS, CStyle)) {
2449 bool ObjCLifetimeConversion;
2455 ObjCLifetimeConversion)) {
2474 CanonFrom = CanonTo;
2479 if (CanonFrom == CanonTo)
2484 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2528 bool InOverloadResolution,
2538 for (
const auto *it : UD->
fields()) {
2541 ToType = it->getType();
2567 return To->
getKind() == BuiltinType::Int;
2570 return To->
getKind() == BuiltinType::UInt;
2594 if (FromEnumType->getDecl()->isScoped())
2601 if (FromEnumType->getDecl()->isFixed()) {
2602 QualType Underlying = FromEnumType->getDecl()->getIntegerType();
2604 IsIntegralPromotion(
nullptr, Underlying, ToType);
2611 ToType, FromEnumType->getDecl()->getPromotionType());
2636 uint64_t FromSize = Context.
getTypeSize(FromType);
2645 for (
int Idx = 0; Idx < 6; ++Idx) {
2646 uint64_t ToSize = Context.
getTypeSize(PromoteTypes[Idx]);
2647 if (FromSize < ToSize ||
2648 (FromSize == ToSize &&
2649 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2674 std::optional<llvm::APSInt> BitWidth;
2677 MemberDecl->getBitWidth()->getIntegerConstantExpr(Context))) {
2678 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2682 if (*BitWidth < ToSize ||
2684 return To->
getKind() == BuiltinType::Int;
2690 return To->
getKind() == BuiltinType::UInt;
2718 if (FromBuiltin->getKind() == BuiltinType::Float &&
2719 ToBuiltin->getKind() == BuiltinType::Double)
2726 (FromBuiltin->getKind() == BuiltinType::Float ||
2727 FromBuiltin->getKind() == BuiltinType::Double) &&
2728 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2729 ToBuiltin->getKind() == BuiltinType::Float128 ||
2730 ToBuiltin->getKind() == BuiltinType::Ibm128))
2735 if (getLangOpts().
HLSL && FromBuiltin->getKind() == BuiltinType::Half &&
2736 (ToBuiltin->getKind() == BuiltinType::Float ||
2737 ToBuiltin->getKind() == BuiltinType::Double))
2741 if (!getLangOpts().NativeHalfType &&
2742 FromBuiltin->getKind() == BuiltinType::Half &&
2743 ToBuiltin->getKind() == BuiltinType::Float)
2775 bool StripObjCLifetime =
false) {
2778 "Invalid similarly-qualified pointer type");
2789 if (StripObjCLifetime)
2800 if (isa<ObjCObjectPointerType>(ToType))
2809 if (isa<ObjCObjectPointerType>(ToType))
2815 bool InOverloadResolution,
2821 return !InOverloadResolution;
2829 bool InOverloadResolution,
2831 bool &IncompatibleObjC) {
2832 IncompatibleObjC =
false;
2833 if (isObjCPointerConversion(FromType, ToType, ConvertedType,
2840 ConvertedType = ToType;
2847 ConvertedType = ToType;
2854 ConvertedType = ToType;
2862 ConvertedType = ToType;
2872 ConvertedType = ToType;
2880 !getLangOpts().ObjCAutoRefCount) {
2910 if (getLangOpts().MSVCCompat && FromPointeeType->
isFunctionType() &&
2944 IsDerivedFrom(From->
getBeginLoc(), FromPointeeType, ToPointeeType)) {
2978 bool &IncompatibleObjC) {
2979 if (!getLangOpts().
ObjC)
2991 if (ToObjCPtr && FromObjCPtr) {
3002 if (getLangOpts().CPlusPlus && LHS && RHS &&
3004 FromObjCPtr->getPointeeType(), getASTContext()))
3009 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
3017 IncompatibleObjC =
true;
3021 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
3033 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
3061 isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
3062 IncompatibleObjC)) {
3064 IncompatibleObjC =
true;
3066 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
3073 isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
3074 IncompatibleObjC)) {
3077 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
3089 if (FromFunctionType && ToFunctionType) {
3098 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3099 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
3100 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
3103 bool HasObjCConversion =
false;
3107 }
else if (isObjCPointerConversion(FromFunctionType->
getReturnType(),
3108 ToFunctionType->getReturnType(),
3109 ConvertedType, IncompatibleObjC)) {
3111 HasObjCConversion =
true;
3118 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3119 ArgIdx != NumArgs; ++ArgIdx) {
3121 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3125 }
else if (isObjCPointerConversion(FromArgType, ToArgType,
3126 ConvertedType, IncompatibleObjC)) {
3128 HasObjCConversion =
true;
3135 if (HasObjCConversion) {
3139 IncompatibleObjC =
true;
3171 if (!FromFunctionType || !ToFunctionType)
3174 if (Context.
hasSameType(FromPointeeType, ToPointeeType))
3179 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3180 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3185 if (FromEInfo != ToEInfo)
3188 bool IncompatibleObjC =
false;
3190 ToFunctionType->getReturnType())) {
3194 QualType LHS = ToFunctionType->getReturnType();
3195 if ((!getLangOpts().CPlusPlus || !RHS->
isRecordType()) &&
3201 }
else if (isObjCPointerConversion(RHS, LHS,
3202 ConvertedType, IncompatibleObjC)) {
3203 if (IncompatibleObjC)
3212 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3213 ArgIdx != NumArgs; ++ArgIdx) {
3214 IncompatibleObjC =
false;
3216 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3217 if (Context.
hasSameType(FromArgType, ToArgType)) {
3219 }
else if (isObjCPointerConversion(ToArgType, FromArgType,
3220 ConvertedType, IncompatibleObjC)) {
3221 if (IncompatibleObjC)
3230 bool CanUseToFPT, CanUseFromFPT;
3232 CanUseToFPT, CanUseFromFPT,
3236 ConvertedType = ToType;
3274 if (!Context.
hasSameType(FromMember->getClass(), ToMember->getClass())) {
3276 <<
QualType(FromMember->getClass(), 0);
3309 if (!FromFunction || !ToFunction) {
3314 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3322 if (!FunctionParamTypesAreEqual(FromFunction, ToFunction, &ArgPos)) {
3324 << ToFunction->getParamType(ArgPos)
3331 ToFunction->getReturnType())) {
3337 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3347 cast<FunctionProtoType>(ToFunction->getCanonicalTypeUnqualified())
3360 assert(llvm::size(Old) == llvm::size(New) &&
3361 "Can't compare parameters of functions with different number of "
3364 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3366 size_t J =
Reversed ? (llvm::size(New) - Idx - 1) : Idx;
3387 return FunctionParamTypesAreEqual(OldType->
param_types(),
3400 unsigned OldIgnore =
3402 unsigned NewIgnore =
3405 auto *OldPT = cast<FunctionProtoType>(OldFunction->
getFunctionType());
3406 auto *NewPT = cast<FunctionProtoType>(NewFunction->
getFunctionType());
3408 return FunctionParamTypesAreEqual(OldPT->param_types().slice(OldIgnore),
3409 NewPT->param_types().slice(NewIgnore),
3416 bool IgnoreBaseAccess,
3419 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3423 if (Diagnose && !IsCStyleOrFunctionalCast && !FromType->
isAnyPointerType() &&
3427 DiagRuntimeBehavior(From->
getExprLoc(), From,
3428 PDiag(diag::warn_impcast_bool_to_null_pointer)
3430 else if (!isUnevaluatedContext())
3439 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3443 unsigned InaccessibleID = 0;
3444 unsigned AmbiguousID = 0;
3446 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3447 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3449 if (CheckDerivedToBaseConversion(
3450 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3452 &BasePath, IgnoreBaseAccess))
3456 Kind = CK_DerivedToBase;
3459 if (Diagnose && !IsCStyleOrFunctionalCast &&
3460 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3461 assert(getLangOpts().MSVCCompat &&
3462 "this should only be possible with MSVCCompat!");
3474 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3477 Kind = CK_BlockPointerToObjCPointerCast;
3479 Kind = CK_CPointerToObjCPointerCast;
3483 Kind = CK_AnyPointerToBlockPointerCast;
3489 Kind = CK_NullToPointer;
3496 bool InOverloadResolution,
3506 ConvertedType = ToType;
3521 IsDerivedFrom(From->
getBeginLoc(), ToClass, FromClass)) {
3533 bool IgnoreBaseAccess) {
3540 "Expr must be null pointer constant!");
3541 Kind = CK_NullToMemberPointer;
3546 assert(ToPtrType &&
"No member pointer cast has a target type "
3547 "that is not a member pointer.");
3553 assert(FromClass->
isRecordType() &&
"Pointer into non-class.");
3554 assert(ToClass->
isRecordType() &&
"Pointer into non-class.");
3558 bool DerivationOkay =
3559 IsDerivedFrom(From->
getBeginLoc(), ToClass, FromClass, Paths);
3560 assert(DerivationOkay &&
3561 "Should not have been called if derivation isn't OK.");
3562 (void)DerivationOkay;
3565 getUnqualifiedType())) {
3566 std::string PathDisplayStr = getAmbiguousPathsDisplayString(Paths);
3568 << 0 << FromClass << ToClass << PathDisplayStr << From->
getSourceRange();
3572 if (
const RecordType *VBase = Paths.getDetectedVirtual()) {
3574 << FromClass << ToClass <<
QualType(VBase, 0)
3579 if (!IgnoreBaseAccess)
3580 CheckBaseClassAccess(From->
getExprLoc(), FromClass, ToClass,
3582 diag::err_downcast_from_inaccessible_base);
3586 Kind = CK_BaseToDerivedMemberPointer;
3609 bool CStyle,
bool IsTopLevel,
3610 bool &PreviousToQualsIncludeConst,
3611 bool &ObjCLifetimeConversion,
3624 ObjCLifetimeConversion =
true;
3660 !PreviousToQualsIncludeConst)
3678 PreviousToQualsIncludeConst =
3679 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3685 bool CStyle,
bool &ObjCLifetimeConversion) {
3688 ObjCLifetimeConversion =
false;
3698 bool PreviousToQualsIncludeConst =
true;
3699 bool UnwrappedAnyPointer =
false;
3702 !UnwrappedAnyPointer,
3703 PreviousToQualsIncludeConst,
3704 ObjCLifetimeConversion, getASTContext()))
3706 UnwrappedAnyPointer =
true;
3723 bool InOverloadResolution,
3732 InOverloadResolution, InnerSCS,
3749 if (CtorType->getNumParams() > 0) {
3750 QualType FirstArg = CtorType->getParamType(0);
3762 bool AllowExplicit) {
3769 bool Usable = !Info.Constructor->isInvalidDecl() &&
3772 bool SuppressUserConversions =
false;
3773 if (Info.ConstructorTmpl)
3776 CandidateSet, SuppressUserConversions,
3781 CandidateSet, SuppressUserConversions,
3782 false, AllowExplicit);
3786 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
3795 QualType ThisType = Constructor->getFunctionObjectParameterType();
3813 llvm_unreachable(
"Invalid OverloadResult!");
3835 bool AllowObjCConversionOnExplicit) {
3836 assert(AllowExplicit != AllowedExplicit::None ||
3837 !AllowObjCConversionOnExplicit);
3841 bool ConstructorsOnly =
false;
3857 ConstructorsOnly =
true;
3862 = dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
3864 Expr **Args = &From;
3865 unsigned NumArgs = 1;
3866 bool ListInitializing =
false;
3867 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
3870 S, From, ToType, ToRecordDecl, User, CandidateSet,
3871 AllowExplicit == AllowedExplicit::All);
3880 Args = InitList->getInits();
3881 NumArgs = InitList->getNumInits();
3882 ListInitializing =
true;
3890 bool Usable = !Info.Constructor->isInvalidDecl();
3891 if (!ListInitializing)
3892 Usable = Usable && Info.Constructor->isConvertingConstructor(
3895 bool SuppressUserConversions = !ConstructorsOnly;
3903 if (SuppressUserConversions && ListInitializing) {
3904 SuppressUserConversions =
3905 NumArgs == 1 && isa<InitListExpr>(Args[0]) &&
3909 if (Info.ConstructorTmpl)
3911 Info.ConstructorTmpl, Info.FoundDecl,
3913 CandidateSet, SuppressUserConversions,
3915 AllowExplicit == AllowedExplicit::All);
3921 SuppressUserConversions,
3923 AllowExplicit == AllowedExplicit::All);
3930 if (ConstructorsOnly || isa<InitListExpr>(From)) {
3933 }
else if (
const RecordType *FromRecordType =
3936 = dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
3938 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
3939 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
3943 if (isa<UsingShadowDecl>(
D))
3944 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
3948 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(
D)))
3951 Conv = cast<CXXConversionDecl>(
D);
3955 ConvTemplate, FoundDecl, ActingContext, From, ToType,
3956 CandidateSet, AllowObjCConversionOnExplicit,
3957 AllowExplicit != AllowedExplicit::None);
3960 CandidateSet, AllowObjCConversionOnExplicit,
3961 AllowExplicit != AllowedExplicit::None);
3966 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
3975 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
3982 if (isa<InitListExpr>(From)) {
3986 if (Best->Conversions[0].isEllipsis())
3989 User.
Before = Best->Conversions[0].Standard;
4002 = dyn_cast<CXXConversionDecl>(Best->Function)) {
4009 User.
Before = Best->Conversions[0].Standard;
4024 User.
After = Best->FinalConversion;
4027 llvm_unreachable(
"Not a constructor or conversion function?");
4036 llvm_unreachable(
"Invalid OverloadResult!");
4046 CandidateSet, AllowedExplicit::None,
false);
4060 if (!RequireCompleteType(From->
getBeginLoc(), ToType,
4061 diag::err_typecheck_nonviable_condition_incomplete,
4068 *
this, From, Cands);
4094 if (!Conv1 || !Conv2)
4109 if (Block1 != Block2)
4122 if (Conv1FuncRet && Conv2FuncRet &&
4133 CallOpProto->isVariadic(),
false);
4135 CallOpProto->isVariadic(),
true);
4137 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4232 if (!ICS1.
isBad()) {
4233 bool StdInit1 =
false, StdInit2 =
false;
4240 if (StdInit1 != StdInit2)
4251 CAT2->getElementType())) {
4253 if (CAT1->getSize() != CAT2->getSize())
4255 return CAT1->getSize().ult(CAT2->getSize())
4377 return FixedEnumPromotion::None;
4381 return FixedEnumPromotion::None;
4384 if (!
Enum->isFixed())
4385 return FixedEnumPromotion::None;
4389 return FixedEnumPromotion::ToUnderlyingType;
4391 return FixedEnumPromotion::ToPromotedUnderlyingType;
4420 else if (Rank2 < Rank1)
4443 if (FEP1 != FixedEnumPromotion::None && FEP2 != FixedEnumPromotion::None &&
4445 return FEP1 == FixedEnumPromotion::ToUnderlyingType
4455 bool SCS1ConvertsToVoid
4457 bool SCS2ConvertsToVoid
4459 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4464 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4470 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4499 if (FromObjCPtr1 && FromObjCPtr2) {
4504 if (AssignLeft != AssignRight) {
4539 if (UnqualT1 == UnqualT2) {
4551 if (isa<ArrayType>(T1) && T1Quals)
4553 if (isa<ArrayType>(T2) && T2Quals)
4601 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4602 return SCS1IsCompatibleVectorConversion
4609 bool SCS1IsCompatibleSVEVectorConversion =
4611 bool SCS2IsCompatibleSVEVectorConversion =
4614 if (SCS1IsCompatibleSVEVectorConversion !=
4615 SCS2IsCompatibleSVEVectorConversion)
4616 return SCS1IsCompatibleSVEVectorConversion
4623 bool SCS1IsCompatibleRVVVectorConversion =
4625 bool SCS2IsCompatibleRVVVectorConversion =
4628 if (SCS1IsCompatibleRVVVectorConversion !=
4629 SCS2IsCompatibleRVVVectorConversion)
4630 return SCS1IsCompatibleRVVVectorConversion
4670 if (UnqualT1 == UnqualT2)
4688 bool ObjCLifetimeConversion;
4698 if (CanPick1 != CanPick2)
4752 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
4760 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
4777 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
4784 bool FromAssignRight
4793 if (ToPtr1->isObjCIdType() &&
4794 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
4796 if (ToPtr2->isObjCIdType() &&
4797 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
4802 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
4804 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
4809 if (ToPtr1->isObjCClassType() &&
4810 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
4812 if (ToPtr2->isObjCClassType() &&
4813 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
4818 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
4820 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
4826 (ToAssignLeft != ToAssignRight)) {
4837 }
else if (IsSecondSame)
4846 (FromAssignLeft != FromAssignRight))