37#include "llvm/ADT/DenseSet.h"
38#include "llvm/ADT/STLExtras.h"
39#include "llvm/ADT/SmallPtrSet.h"
40#include "llvm/ADT/SmallString.h"
41#include "llvm/ADT/SmallVector.h"
42#include "llvm/Support/Casting.h"
55 return P->hasAttr<PassObjectSizeAttr>();
76 if (HadMultipleCandidates)
87 CK_FunctionToPointerDecay);
91 bool InOverloadResolution,
94 bool AllowObjCWritebackConversion);
98 bool InOverloadResolution,
106 bool AllowObjCConversionOnExplicit);
165 return Rank[(
int)Kind];
171 static const char*
const Name[] = {
175 "Function-to-pointer",
176 "Function pointer conversion",
178 "Integral promotion",
179 "Floating point promotion",
181 "Integral conversion",
182 "Floating conversion",
183 "Complex conversion",
184 "Floating-integral conversion",
185 "Pointer conversion",
186 "Pointer-to-member conversion",
187 "Boolean conversion",
188 "Compatible-types conversion",
189 "Derived-to-base conversion",
191 "SVE Vector conversion",
192 "RVV Vector conversion",
194 "Complex-real conversion",
195 "Block Pointer conversion",
196 "Transparent Union Conversion",
197 "Writeback conversion",
198 "OpenCL Zero Event Conversion",
199 "OpenCL Zero Queue Conversion",
200 "C specific type conversion",
201 "Incompatible pointer conversion",
202 "Fixed point conversion",
286 const Expr *Converted) {
289 if (
auto *EWC = dyn_cast<ExprWithCleanups>(Converted)) {
296 while (
auto *ICE = dyn_cast<ImplicitCastExpr>(Converted)) {
297 switch (ICE->getCastKind()) {
299 case CK_IntegralCast:
300 case CK_IntegralToBoolean:
301 case CK_IntegralToFloating:
302 case CK_BooleanToSignedIntegral:
303 case CK_FloatingToIntegral:
304 case CK_FloatingToBoolean:
305 case CK_FloatingCast:
306 Converted = ICE->getSubExpr();
330 QualType &ConstantType,
bool IgnoreFloatToIntegralConversion)
const {
331 assert(Ctx.
getLangOpts().CPlusPlus &&
"narrowing check outside C++");
342 ToType = ET->getDecl()->getIntegerType();
348 goto FloatingIntegralConversion;
350 goto IntegralConversion;
361 FloatingIntegralConversion:
366 if (IgnoreFloatToIntegralConversion)
369 assert(
Initializer &&
"Unknown conversion expression");
375 if (std::optional<llvm::APSInt> IntConstantValue =
379 Result.convertFromAPInt(*IntConstantValue, IntConstantValue->isSigned(),
380 llvm::APFloat::rmNearestTiesToEven);
382 llvm::APSInt ConvertedValue = *IntConstantValue;
384 Result.convertToInteger(ConvertedValue,
385 llvm::APFloat::rmTowardZero, &ignored);
387 if (*IntConstantValue != ConvertedValue) {
388 ConstantValue =
APValue(*IntConstantValue);
413 if (
Initializer->isCXX11ConstantExpr(Ctx, &ConstantValue)) {
415 assert(ConstantValue.
isFloat());
416 llvm::APFloat FloatVal = ConstantValue.
getFloat();
419 llvm::APFloat::opStatus ConvertStatus = FloatVal.convert(
421 llvm::APFloat::rmNearestTiesToEven, &ignored);
424 if (ConvertStatus & llvm::APFloat::opOverflow) {
440 IntegralConversion: {
444 const unsigned FromWidth = Ctx.
getIntWidth(FromType);
448 if (FromWidth > ToWidth ||
449 (FromWidth == ToWidth && FromSigned != ToSigned) ||
450 (FromSigned && !ToSigned)) {
458 std::optional<llvm::APSInt> OptInitializerValue;
459 if (!(OptInitializerValue =
Initializer->getIntegerConstantExpr(Ctx))) {
463 llvm::APSInt &InitializerValue = *OptInitializerValue;
464 bool Narrowing =
false;
465 if (FromWidth < ToWidth) {
468 if (InitializerValue.isSigned() && InitializerValue.isNegative())
473 InitializerValue = InitializerValue.extend(
474 InitializerValue.getBitWidth() + 1);
476 llvm::APSInt ConvertedValue = InitializerValue;
477 ConvertedValue = ConvertedValue.trunc(ToWidth);
478 ConvertedValue.setIsSigned(ToSigned);
479 ConvertedValue = ConvertedValue.extend(InitializerValue.getBitWidth());
480 ConvertedValue.setIsSigned(InitializerValue.isSigned());
482 if (ConvertedValue != InitializerValue)
487 ConstantValue =
APValue(InitializerValue);
503 raw_ostream &OS = llvm::errs();
504 bool PrintedSomething =
false;
507 PrintedSomething =
true;
511 if (PrintedSomething) {
517 OS <<
" (by copy constructor)";
519 OS <<
" (direct reference binding)";
521 OS <<
" (reference binding)";
523 PrintedSomething =
true;
527 if (PrintedSomething) {
531 PrintedSomething =
true;
534 if (!PrintedSomething) {
535 OS <<
"No conversions required";
542 raw_ostream &OS = llvm::errs();
550 OS <<
"aggregate initialization";
560 raw_ostream &OS = llvm::errs();
562 OS <<
"Worst list element conversion: ";
563 switch (ConversionKind) {
565 OS <<
"Standard conversion: ";
569 OS <<
"User-defined conversion: ";
573 OS <<
"Ellipsis conversion";
576 OS <<
"Ambiguous conversion";
579 OS <<
"Bad conversion";
604 struct DFIArguments {
610 struct DFIParamWithArguments : DFIArguments {
615 struct DFIDeducedMismatchArgs : DFIArguments {
617 unsigned CallArgIndex;
634 Result.Result =
static_cast<unsigned>(TDK);
635 Result.HasDiagnostic =
false;
654 auto *Saved =
new (Context) DFIDeducedMismatchArgs;
665 DFIArguments *Saved =
new (Context) DFIArguments;
677 DFIParamWithArguments *Saved =
new (Context) DFIParamWithArguments;
678 Saved->Param = Info.
Param;
691 Result.HasDiagnostic =
true;
696 CNSInfo *Saved =
new (Context) CNSInfo;
706 llvm_unreachable(
"not a deduction failure");
739 Diag->~PartialDiagnosticAt();
748 Diag->~PartialDiagnosticAt();
784 return TemplateParameter::getFromOpaqueValue(
Data);
789 return static_cast<DFIParamWithArguments*
>(
Data)->Param;
819 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->TemplateArgs;
825 return static_cast<CNSInfo*
>(
Data)->TemplateArgs;
857 return &
static_cast<DFIArguments*
>(
Data)->FirstArg;
889 return &
static_cast<DFIArguments*
>(
Data)->SecondArg;
904 return static_cast<DFIDeducedMismatchArgs*
>(
Data)->CallArgIndex;
920 for (
unsigned I = 0; I <
X->getNumParams(); ++I)
924 if (
auto *FTX =
X->getDescribedFunctionTemplate()) {
929 FTY->getTemplateParameters()))
938 OverloadedOperatorKind::OO_EqualEqual);
950 OverloadedOperatorKind::OO_ExclaimEqual);
951 if (isa<CXXMethodDecl>(EqFD)) {
968 auto *NotEqFD = Op->getAsFunction();
969 if (
auto *UD = dyn_cast<UsingShadowDecl>(Op))
970 NotEqFD = UD->getUnderlyingDecl()->getAsFunction();
973 cast<Decl>(Op->getLexicalDeclContext())))
983 return Op == OO_EqualEqual || Op == OO_Spaceship;
989 if (!allowsReversed(Op))
991 if (Op == OverloadedOperatorKind::OO_EqualEqual) {
992 assert(OriginalArgs.size() == 2);
994 S, OpLoc, OriginalArgs[1], FD))
1005void OverloadCandidateSet::destroyCandidates() {
1007 for (
auto &
C : i->Conversions)
1008 C.~ImplicitConversionSequence();
1010 i->DeductionFailure.Destroy();
1015 destroyCandidates();
1016 SlabAllocator.Reset();
1017 NumInlineBytesUsed = 0;
1024 class UnbridgedCastsSet {
1034 Entry entry = { &E, E };
1035 Entries.push_back(entry);
1041 i = Entries.begin(), e = Entries.end(); i != e; ++i)
1042 *i->Addr = i->Saved;
1056 UnbridgedCastsSet *unbridgedCasts =
nullptr) {
1060 if (placeholder->getKind() == BuiltinType::Overload)
return false;
1064 if (placeholder->getKind() == BuiltinType::ARCUnbridgedCast &&
1066 unbridgedCasts->save(S, E);
1086 UnbridgedCastsSet &unbridged) {
1087 for (
unsigned i = 0, e = Args.size(); i != e; ++i)
1129 NamedDecl *&Match,
bool NewIsUsingDecl) {
1134 bool OldIsUsingDecl =
false;
1135 if (isa<UsingShadowDecl>(OldD)) {
1136 OldIsUsingDecl =
true;
1140 if (NewIsUsingDecl)
continue;
1142 OldD = cast<UsingShadowDecl>(OldD)->getTargetDecl();
1147 if ((OldIsUsingDecl || NewIsUsingDecl) && !isVisible(*I))
1155 bool UseMemberUsingDeclRules =
1156 (OldIsUsingDecl || NewIsUsingDecl) && CurContext->isRecord() &&
1160 if (!IsOverload(New, OldF, UseMemberUsingDeclRules)) {
1161 if (UseMemberUsingDeclRules && OldIsUsingDecl) {
1162 HideUsingShadowDecl(S, cast<UsingShadowDecl>(*I));
1166 if (!isa<FunctionTemplateDecl>(OldD) &&
1167 !shouldLinkPossiblyHiddenDecl(*I, New))
1176 if (!getASTContext().canBuiltinBeRedeclared(OldF)) {
1178 return Ovl_NonFunction;
1180 }
else if (isa<UsingDecl>(OldD) || isa<UsingPackDecl>(OldD)) {
1184 }
else if (isa<TagDecl>(OldD)) {
1186 }
else if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(OldD)) {
1193 if (UUD->getQualifier()->isDependent() && !UUD->isCXXClassMember()) {
1195 return Ovl_NonFunction;
1202 return Ovl_NonFunction;
1227 if (CheckFunctionTemplateSpecialization(New,
nullptr, TemplateSpecResult,
1230 return Ovl_Overload;
1237 return Ovl_Overload;
1242 bool UseMemberUsingDeclRules,
1243 bool ConsiderCudaAttrs,
1244 bool UseOverrideRules =
false) {
1259 if ((OldTemplate ==
nullptr) != (NewTemplate ==
nullptr))
1272 if (isa<FunctionNoProtoType>(OldQType.
getTypePtr()) ||
1273 isa<FunctionNoProtoType>(NewQType.
getTypePtr()))
1290 const auto *OldMethod = dyn_cast<CXXMethodDecl>(Old);
1291 const auto *NewMethod = dyn_cast<CXXMethodDecl>(New);
1293 int OldParamsOffset = 0;
1294 int NewParamsOffset = 0;
1312 !isa<CXXConstructorDecl>(NewMethod))
1318 auto BS =
Base.getNonReferenceType().getCanonicalType().split();
1319 BS.Quals = NormalizeQualifiers(OldMethod, BS.Quals);
1321 auto DS = D.getNonReferenceType().getCanonicalType().split();
1322 DS.Quals = NormalizeQualifiers(NewMethod, DS.Quals);
1324 if (BS.Quals != DS.Quals)
1327 if (OldMethod->isImplicitObjectMemberFunction() &&
1328 OldMethod->getParent() != NewMethod->getParent()) {
1341 if (
Base->isLValueReferenceType())
1343 return Base->isRValueReferenceType() == D->isRValueReferenceType();
1348 auto DiagnoseInconsistentRefQualifiers = [&]() {
1351 if (OldMethod->getRefQualifier() == NewMethod->getRefQualifier())
1353 if (OldMethod->isExplicitObjectMemberFunction() ||
1354 NewMethod->isExplicitObjectMemberFunction())
1356 if (!UseMemberUsingDeclRules && (OldMethod->getRefQualifier() ==
RQ_None ||
1357 NewMethod->getRefQualifier() ==
RQ_None)) {
1358 SemaRef.
Diag(NewMethod->getLocation(), diag::err_ref_qualifier_overload)
1359 << NewMethod->getRefQualifier() << OldMethod->getRefQualifier();
1360 SemaRef.
Diag(OldMethod->getLocation(), diag::note_previous_declaration);
1366 if (OldMethod && OldMethod->isExplicitObjectMemberFunction())
1368 if (NewMethod && NewMethod->isExplicitObjectMemberFunction())
1382 if (OldMethod && NewMethod && !OldMethod->isStatic() &&
1383 !OldMethod->isStatic()) {
1384 bool HaveCorrespondingObjectParameters = [&](
const CXXMethodDecl *Old,
1386 auto NewObjectType = New->getFunctionObjectParameterReferenceType();
1390 return F->getRefQualifier() ==
RQ_None &&
1391 !F->isExplicitObjectMemberFunction();
1394 if (IsImplicitWithNoRefQual(Old) != IsImplicitWithNoRefQual(New) &&
1395 CompareType(OldObjectType.getNonReferenceType(),
1396 NewObjectType.getNonReferenceType()))
1398 return CompareType(OldObjectType, NewObjectType);
1399 }(OldMethod, NewMethod);
1401 if (!HaveCorrespondingObjectParameters) {
1402 if (DiagnoseInconsistentRefQualifiers())
1407 if (!UseOverrideRules || (!NewMethod->isExplicitObjectMemberFunction() &&
1408 !OldMethod->isExplicitObjectMemberFunction()))
1431 bool ConstraintsInTemplateHead =
1442 if (UseMemberUsingDeclRules && ConstraintsInTemplateHead &&
1443 !SameTemplateParameterList)
1445 if (!UseMemberUsingDeclRules &&
1446 (!SameTemplateParameterList || !SameReturnType))
1450 if (!UseOverrideRules) {
1453 if ((NewRC !=
nullptr) != (OldRC !=
nullptr))
1460 if (NewMethod && OldMethod && OldMethod->isImplicitObjectMemberFunction() &&
1461 NewMethod->isImplicitObjectMemberFunction()) {
1462 if (DiagnoseInconsistentRefQualifiers())
1480 NewI != NewE || OldI != OldE; ++NewI, ++OldI) {
1481 if (NewI == NewE || OldI == OldE)
1483 llvm::FoldingSetNodeID NewID, OldID;
1485 OldI->getCond()->Profile(OldID, SemaRef.
Context,
true);
1490 if (SemaRef.
getLangOpts().CUDA && ConsiderCudaAttrs) {
1493 if (!isa<CXXDestructorDecl>(New)) {
1498 "Unexpected invalid target.");
1502 if (NewTarget != OldTarget)
1513 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1519 bool UseMemberUsingDeclRules,
bool ConsiderCudaAttrs) {
1532 bool SuppressUserConversions,
1534 bool InOverloadResolution,
1536 bool AllowObjCWritebackConversion,
1537 bool AllowObjCConversionOnExplicit) {
1540 if (SuppressUserConversions) {
1551 Conversions, AllowExplicit,
1552 AllowObjCConversionOnExplicit)) {
1569 if (Constructor->isCopyConstructor() &&
1570 (FromCanon == ToCanon ||
1581 if (ToCanon != FromCanon)
1592 Cand != Conversions.
end(); ++Cand)
1635 bool SuppressUserConversions,
1637 bool InOverloadResolution,
1639 bool AllowObjCWritebackConversion,
1640 bool AllowObjCConversionOnExplicit) {
1643 ICS.
Standard, CStyle, AllowObjCWritebackConversion)){
1683 AllowExplicit, InOverloadResolution, CStyle,
1684 AllowObjCWritebackConversion,
1685 AllowObjCConversionOnExplicit);
1690 bool SuppressUserConversions,
1692 bool InOverloadResolution,
1694 bool AllowObjCWritebackConversion) {
1695 return ::TryImplicitConversion(*
this, From, ToType, SuppressUserConversions,
1696 AllowExplicit, InOverloadResolution, CStyle,
1697 AllowObjCWritebackConversion,
1708 bool AllowExplicit) {
1713 bool AllowObjCWritebackConversion
1714 = getLangOpts().ObjCAutoRefCount &&
1715 (Action == AA_Passing || Action == AA_Sending);
1716 if (getLangOpts().ObjC)
1717 CheckObjCBridgeRelatedConversions(From->
getBeginLoc(), ToType,
1720 *
this, From, ToType,
1722 AllowExplicit ? AllowedExplicit::All : AllowedExplicit::None,
1724 false, AllowObjCWritebackConversion,
1726 return PerformImplicitConversion(From, ToType, ICS, Action);
1747 if (TyClass != CanFrom->getTypeClass())
return false;
1748 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto) {
1749 if (TyClass == Type::Pointer) {
1752 }
else if (TyClass == Type::BlockPointer) {
1755 }
else if (TyClass == Type::MemberPointer) {
1759 if (ToMPT->getClass() != FromMPT->
getClass())
1761 CanTo = ToMPT->getPointeeType();
1767 TyClass = CanTo->getTypeClass();
1768 if (TyClass != CanFrom->getTypeClass())
return false;
1769 if (TyClass != Type::FunctionProto && TyClass != Type::FunctionNoProto)
1773 const auto *FromFn = cast<FunctionType>(CanFrom);
1776 const auto *ToFn = cast<FunctionType>(CanTo);
1779 bool Changed =
false;
1789 if (
const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn)) {
1793 unsigned ToFlags = 0;
1794 if (
const auto *ToFPT = dyn_cast<FunctionProtoType>(ToFn))
1795 ToFlags = ToFPT->getExtProtoInfo().AArch64SMEAttributes;
1800 FromFPT->getReturnType(), FromFPT->getParamTypes(), ExtInfo);
1808 if (
const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn)) {
1809 const auto *ToFPT = cast<FunctionProtoType>(ToFn);
1810 if (FromFPT->isNothrow() && !ToFPT->isNothrow()) {
1811 FromFn = cast<FunctionType>(
1822 bool CanUseToFPT, CanUseFromFPT;
1824 CanUseFromFPT, NewParamInfos) &&
1825 CanUseToFPT && !CanUseFromFPT) {
1828 NewParamInfos.empty() ? nullptr : NewParamInfos.data();
1830 FromFPT->getParamTypes(), ExtInfo);
1839 assert(
QualType(FromFn, 0).isCanonical());
1840 if (
QualType(FromFn, 0) != CanTo)
return false;
1853 bool InOverloadResolution,
bool CStyle) {
1903 !ToType->
hasAttr(attr::ArmMveStrictPolymorphism))) {
1908 !InOverloadResolution && !CStyle) {
1910 << FromType << ToType;
1921 bool InOverloadResolution,
1934 bool InOverloadResolution,
1937 bool AllowObjCWritebackConversion) {
1984 if (Method && !Method->
isStatic() &&
1987 "Non-unary operator on non-static member address");
1988 assert(cast<UnaryOperator>(From->
IgnoreParens())->getOpcode()
1990 "Non-address-of operator on non-static member address");
1991 const Type *ClassType
1995 assert(cast<UnaryOperator>(From->
IgnoreParens())->getOpcode() ==
1997 "Non-address-of operator for overloaded function expression");
2017 FromType =
Atomic->getValueType();
2052 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl()))
2072 bool IncompatibleObjC =
false;
2126 const llvm::fltSemantics &FromSem =
2129 if ((&FromSem == &llvm::APFloat::PPCDoubleDouble() &&
2130 &ToSem == &llvm::APFloat::IEEEquad()) ||
2131 (&FromSem == &llvm::APFloat::IEEEquad() &&
2132 &ToSem == &llvm::APFloat::PPCDoubleDouble()))
2148 }
else if (AllowObjCWritebackConversion &&
2152 FromType, IncompatibleObjC)) {
2158 InOverloadResolution, FromType)) {
2162 InOverloadResolution, CStyle)) {
2171 InOverloadResolution,
2205 bool ObjCLifetimeConversion;
2211 ObjCLifetimeConversion)) {
2230 CanonFrom = CanonTo;
2235 if (CanonFrom == CanonTo)
2240 if (S.
getLangOpts().CPlusPlus || !InOverloadResolution)
2284 bool InOverloadResolution,
2294 for (
const auto *it : UD->
fields()) {
2297 ToType = it->getType();
2327 return To->
getKind() == BuiltinType::Int;
2330 return To->
getKind() == BuiltinType::UInt;
2354 if (FromEnumType->getDecl()->isScoped())
2361 if (FromEnumType->getDecl()->isFixed()) {
2362 QualType Underlying = FromEnumType->getDecl()->getIntegerType();
2364 IsIntegralPromotion(
nullptr, Underlying, ToType);
2371 ToType, FromEnumType->getDecl()->getPromotionType());
2396 uint64_t FromSize = Context.
getTypeSize(FromType);
2405 for (
int Idx = 0; Idx < 6; ++Idx) {
2406 uint64_t ToSize = Context.
getTypeSize(PromoteTypes[Idx]);
2407 if (FromSize < ToSize ||
2408 (FromSize == ToSize &&
2409 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType())) {
2434 std::optional<llvm::APSInt> BitWidth;
2437 MemberDecl->getBitWidth()->getIntegerConstantExpr(Context))) {
2438 llvm::APSInt ToSize(BitWidth->getBitWidth(), BitWidth->isUnsigned());
2442 if (*BitWidth < ToSize ||
2444 return To->
getKind() == BuiltinType::Int;
2450 return To->
getKind() == BuiltinType::UInt;
2475 if (FromBuiltin->getKind() == BuiltinType::Float &&
2476 ToBuiltin->getKind() == BuiltinType::Double)
2483 (FromBuiltin->getKind() == BuiltinType::Float ||
2484 FromBuiltin->getKind() == BuiltinType::Double) &&
2485 (ToBuiltin->getKind() == BuiltinType::LongDouble ||
2486 ToBuiltin->getKind() == BuiltinType::Float128 ||
2487 ToBuiltin->getKind() == BuiltinType::Ibm128))
2491 if (!getLangOpts().NativeHalfType &&
2492 FromBuiltin->getKind() == BuiltinType::Half &&
2493 ToBuiltin->getKind() == BuiltinType::Float)
2530 bool StripObjCLifetime =
false) {
2533 "Invalid similarly-qualified pointer type");
2544 if (StripObjCLifetime)
2555 if (isa<ObjCObjectPointerType>(ToType))
2564 if (isa<ObjCObjectPointerType>(ToType))
2570 bool InOverloadResolution,
2576 return !InOverloadResolution;
2600 bool InOverloadResolution,
2602 bool &IncompatibleObjC) {
2603 IncompatibleObjC =
false;
2604 if (isObjCPointerConversion(FromType, ToType, ConvertedType,
2611 ConvertedType = ToType;
2618 ConvertedType = ToType;
2625 ConvertedType = ToType;
2633 ConvertedType = ToType;
2643 ConvertedType = ToType;
2651 !getLangOpts().ObjCAutoRefCount) {
2681 if (getLangOpts().MSVCCompat && FromPointeeType->
isFunctionType() &&
2715 IsDerivedFrom(From->
getBeginLoc(), FromPointeeType, ToPointeeType)) {
2752 bool &IncompatibleObjC) {
2753 if (!getLangOpts().
ObjC)
2765 if (ToObjCPtr && FromObjCPtr) {
2776 if (getLangOpts().CPlusPlus && LHS && RHS &&
2778 FromObjCPtr->getPointeeType()))
2783 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
2791 IncompatibleObjC =
true;
2795 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
2807 if (FromObjCPtr && FromObjCPtr->isObjCBuiltinType()) {
2835 isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
2836 IncompatibleObjC)) {
2838 IncompatibleObjC =
true;
2840 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
2847 isObjCPointerConversion(FromPointeeType, ToPointeeType, ConvertedType,
2848 IncompatibleObjC)) {
2851 ConvertedType =
AdoptQualifiers(Context, ConvertedType, FromQualifiers);
2863 if (FromFunctionType && ToFunctionType) {
2872 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
2873 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic() ||
2874 FromFunctionType->
getMethodQuals() != ToFunctionType->getMethodQuals())
2877 bool HasObjCConversion =
false;
2881 }
else if (isObjCPointerConversion(FromFunctionType->
getReturnType(),
2882 ToFunctionType->getReturnType(),
2883 ConvertedType, IncompatibleObjC)) {
2885 HasObjCConversion =
true;
2892 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
2893 ArgIdx != NumArgs; ++ArgIdx) {
2895 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
2899 }
else if (isObjCPointerConversion(FromArgType, ToArgType,
2900 ConvertedType, IncompatibleObjC)) {
2902 HasObjCConversion =
true;
2909 if (HasObjCConversion) {
2913 IncompatibleObjC =
true;
2932 if (!getLangOpts().ObjCAutoRefCount ||
2974 bool IncompatibleObjC;
2976 FromPointee = ToPointee;
2977 else if (!isObjCPointerConversion(FromPointee, ToPointee, FromPointee,
3012 if (!FromFunctionType || !ToFunctionType)
3015 if (Context.
hasSameType(FromPointeeType, ToPointeeType))
3020 if (FromFunctionType->
getNumParams() != ToFunctionType->getNumParams() ||
3021 FromFunctionType->
isVariadic() != ToFunctionType->isVariadic())
3026 if (FromEInfo != ToEInfo)
3029 bool IncompatibleObjC =
false;
3031 ToFunctionType->getReturnType())) {
3035 QualType LHS = ToFunctionType->getReturnType();
3036 if ((!getLangOpts().CPlusPlus || !RHS->
isRecordType()) &&
3042 }
else if (isObjCPointerConversion(RHS, LHS,
3043 ConvertedType, IncompatibleObjC)) {
3044 if (IncompatibleObjC)
3053 for (
unsigned ArgIdx = 0, NumArgs = FromFunctionType->
getNumParams();
3054 ArgIdx != NumArgs; ++ArgIdx) {
3055 IncompatibleObjC =
false;
3057 QualType ToArgType = ToFunctionType->getParamType(ArgIdx);
3058 if (Context.
hasSameType(FromArgType, ToArgType)) {
3060 }
else if (isObjCPointerConversion(ToArgType, FromArgType,
3061 ConvertedType, IncompatibleObjC)) {
3062 if (IncompatibleObjC)
3071 bool CanUseToFPT, CanUseFromFPT;
3073 CanUseToFPT, CanUseFromFPT,
3077 ConvertedType = ToType;
3118 if (!Context.
hasSameType(FromMember->getClass(), ToMember->getClass())) {
3120 <<
QualType(FromMember->getClass(), 0);
3153 if (!FromFunction || !ToFunction) {
3158 if (FromFunction->
getNumParams() != ToFunction->getNumParams()) {
3166 if (!FunctionParamTypesAreEqual(FromFunction, ToFunction, &ArgPos)) {
3168 << ToFunction->getParamType(ArgPos)
3175 ToFunction->getReturnType())) {
3181 if (FromFunction->
getMethodQuals() != ToFunction->getMethodQuals()) {
3191 cast<FunctionProtoType>(ToFunction->getCanonicalTypeUnqualified())
3211 assert(llvm::size(Old) == llvm::size(New) &&
3212 "Can't compare parameters of functions with different number of "
3215 for (
auto &&[Idx,
Type] : llvm::enumerate(Old)) {
3217 size_t J =
Reversed ? (llvm::size(New) - Idx - 1) : Idx;
3238 return FunctionParamTypesAreEqual(OldType->
param_types(),
3251 unsigned OldIgnore =
3253 unsigned NewIgnore =
3256 auto *OldPT = cast<FunctionProtoType>(OldFunction->
getFunctionType());
3257 auto *NewPT = cast<FunctionProtoType>(NewFunction->
getFunctionType());
3259 return FunctionParamTypesAreEqual(OldPT->param_types().slice(OldIgnore),
3260 NewPT->param_types().slice(NewIgnore),
3273 bool IgnoreBaseAccess,
3276 bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
3280 if (Diagnose && !IsCStyleOrFunctionalCast && !FromType->
isAnyPointerType() &&
3284 DiagRuntimeBehavior(From->
getExprLoc(), From,
3285 PDiag(diag::warn_impcast_bool_to_null_pointer)
3287 else if (!isUnevaluatedContext())
3296 if (FromPointeeType->
isRecordType() && ToPointeeType->isRecordType() &&
3300 unsigned InaccessibleID = 0;
3301 unsigned AmbiguousID = 0;
3303 InaccessibleID = diag::err_upcast_to_inaccessible_base;
3304 AmbiguousID = diag::err_ambiguous_derived_to_base_conv;
3306 if (CheckDerivedToBaseConversion(
3307 FromPointeeType, ToPointeeType, InaccessibleID, AmbiguousID,
3309 &BasePath, IgnoreBaseAccess))
3313 Kind = CK_DerivedToBase;
3316 if (Diagnose && !IsCStyleOrFunctionalCast &&
3317 FromPointeeType->
isFunctionType() && ToPointeeType->isVoidType()) {
3318 assert(getLangOpts().MSVCCompat &&
3319 "this should only be possible with MSVCCompat!");
3331 if (FromPtrType->isObjCBuiltinType() || ToPtrType->isObjCBuiltinType())
3334 Kind = CK_BlockPointerToObjCPointerCast;
3336 Kind = CK_CPointerToObjCPointerCast;
3340 Kind = CK_AnyPointerToBlockPointerCast;
3346 Kind = CK_NullToPointer;
3358 bool InOverloadResolution,
3368 ConvertedType = ToType;
3383 IsDerivedFrom(From->
getBeginLoc(), ToClass, FromClass)) {
3401 bool IgnoreBaseAccess) {
3408 "Expr must be null pointer constant!");
3409 Kind = CK_NullToMemberPointer;
3414 assert(ToPtrType &&
"No member pointer cast has a target type "
3415 "that is not a member pointer.");
3421 assert(FromClass->
isRecordType() &&
"Pointer into non-class.");
3422 assert(ToClass->
isRecordType() &&
"Pointer into non-class.");
3426 bool DerivationOkay =
3427 IsDerivedFrom(From->
getBeginLoc(), ToClass, FromClass, Paths);
3428 assert(DerivationOkay &&
3429 "Should not have been called if derivation isn't OK.");
3430 (void)DerivationOkay;
3433 getUnqualifiedType())) {
3434 std::string PathDisplayStr = getAmbiguousPathsDisplayString(Paths);
3436 << 0 << FromClass << ToClass << PathDisplayStr << From->
getSourceRange();
3440 if (
const RecordType *VBase = Paths.getDetectedVirtual()) {
3442 << FromClass << ToClass <<
QualType(VBase, 0)
3447 if (!IgnoreBaseAccess)
3448 CheckBaseClassAccess(From->
getExprLoc(), FromClass, ToClass,
3450 diag::err_downcast_from_inaccessible_base);
3454 Kind = CK_BaseToDerivedMemberPointer;
3477 bool CStyle,
bool IsTopLevel,
3478 bool &PreviousToQualsIncludeConst,
3479 bool &ObjCLifetimeConversion) {
3491 ObjCLifetimeConversion =
true;
3527 !PreviousToQualsIncludeConst)
3545 PreviousToQualsIncludeConst =
3546 PreviousToQualsIncludeConst && ToQuals.
hasConst();
3559 bool CStyle,
bool &ObjCLifetimeConversion) {
3562 ObjCLifetimeConversion =
false;
3572 bool PreviousToQualsIncludeConst =
true;
3573 bool UnwrappedAnyPointer =
false;
3576 FromType, ToType, CStyle, !UnwrappedAnyPointer,
3577 PreviousToQualsIncludeConst, ObjCLifetimeConversion))
3579 UnwrappedAnyPointer =
true;
3596 bool InOverloadResolution,
3605 InOverloadResolution, InnerSCS,
3622 if (CtorType->getNumParams() > 0) {
3623 QualType FirstArg = CtorType->getParamType(0);
3635 bool AllowExplicit) {
3642 bool Usable = !Info.Constructor->isInvalidDecl() &&
3645 bool SuppressUserConversions =
false;
3646 if (Info.ConstructorTmpl)
3649 CandidateSet, SuppressUserConversions,
3654 CandidateSet, SuppressUserConversions,
3655 false, AllowExplicit);
3659 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
3668 QualType ThisType = Constructor->getFunctionObjectParameterType();
3686 llvm_unreachable(
"Invalid OverloadResult!");
3708 bool AllowObjCConversionOnExplicit) {
3709 assert(AllowExplicit != AllowedExplicit::None ||
3710 !AllowObjCConversionOnExplicit);
3714 bool ConstructorsOnly =
false;
3730 ConstructorsOnly =
true;
3735 = dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
3737 Expr **Args = &From;
3738 unsigned NumArgs = 1;
3739 bool ListInitializing =
false;
3740 if (
InitListExpr *InitList = dyn_cast<InitListExpr>(From)) {
3743 S, From, ToType, ToRecordDecl, User, CandidateSet,
3744 AllowExplicit == AllowedExplicit::All);
3753 Args = InitList->getInits();
3754 NumArgs = InitList->getNumInits();
3755 ListInitializing =
true;
3763 bool Usable = !Info.Constructor->isInvalidDecl();
3764 if (!ListInitializing)
3765 Usable = Usable && Info.Constructor->isConvertingConstructor(
3768 bool SuppressUserConversions = !ConstructorsOnly;
3776 if (SuppressUserConversions && ListInitializing) {
3777 SuppressUserConversions =
3778 NumArgs == 1 && isa<InitListExpr>(Args[0]) &&
3782 if (Info.ConstructorTmpl)
3784 Info.ConstructorTmpl, Info.FoundDecl,
3786 CandidateSet, SuppressUserConversions,
3788 AllowExplicit == AllowedExplicit::All);
3794 SuppressUserConversions,
3796 AllowExplicit == AllowedExplicit::All);
3803 if (ConstructorsOnly || isa<InitListExpr>(From)) {
3806 }
else if (
const RecordType *FromRecordType =
3809 = dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
3811 const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
3812 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
3816 if (isa<UsingShadowDecl>(D))
3817 D = cast<UsingShadowDecl>(D)->getTargetDecl();
3821 if ((ConvTemplate = dyn_cast<FunctionTemplateDecl>(D)))
3824 Conv = cast<CXXConversionDecl>(D);
3828 ConvTemplate, FoundDecl, ActingContext, From, ToType,
3829 CandidateSet, AllowObjCConversionOnExplicit,
3830 AllowExplicit != AllowedExplicit::None);
3833 CandidateSet, AllowObjCConversionOnExplicit,
3834 AllowExplicit != AllowedExplicit::None);
3839 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
3848 = dyn_cast<CXXConstructorDecl>(Best->Function)) {
3855 if (isa<InitListExpr>(From)) {
3859 if (Best->Conversions[0].isEllipsis())
3862 User.
Before = Best->Conversions[0].Standard;
3875 = dyn_cast<CXXConversionDecl>(Best->Function)) {
3882 User.
Before = Best->Conversions[0].Standard;
3897 User.
After = Best->FinalConversion;
3900 llvm_unreachable(
"Not a constructor or conversion function?");
3909 llvm_unreachable(
"Invalid OverloadResult!");
3919 CandidateSet, AllowedExplicit::None,
false);
3933 if (!RequireCompleteType(From->
getBeginLoc(), ToType,
3934 diag::err_typecheck_nonviable_condition_incomplete,
3941 *
this, From, Cands);
3967 if (!Conv1 || !Conv2)
3982 if (Block1 != Block2)
3995 if (Conv1FuncRet && Conv2FuncRet &&
4006 CallOpProto->isVariadic(),
false);
4008 CallOpProto->isVariadic(),
true);
4010 CallingConv PrefOrder[] = {DefaultFree, DefaultMember, CallOpCC};
4105 if (!ICS1.
isBad()) {
4106 bool StdInit1 =
false, StdInit2 =
false;
4113 if (StdInit1 != StdInit2)
4124 CAT2->getElementType())) {
4126 if (CAT1->getSize() != CAT2->getSize())
4128 return CAT1->getSize().ult(CAT2->getSize())
4250 return FixedEnumPromotion::None;
4254 return FixedEnumPromotion::None;
4257 if (!
Enum->isFixed())
4258 return FixedEnumPromotion::None;
4262 return FixedEnumPromotion::ToUnderlyingType;
4264 return FixedEnumPromotion::ToPromotedUnderlyingType;
4293 else if (Rank2 < Rank1)
4316 if (FEP1 != FixedEnumPromotion::None && FEP2 != FixedEnumPromotion::None &&
4318 return FEP1 == FixedEnumPromotion::ToUnderlyingType
4328 bool SCS1ConvertsToVoid
4330 bool SCS2ConvertsToVoid
4332 if (SCS1ConvertsToVoid != SCS2ConvertsToVoid) {
4337 }
else if (!SCS1ConvertsToVoid && !SCS2ConvertsToVoid) {
4343 }
else if (SCS1ConvertsToVoid && SCS2ConvertsToVoid &&
4372 if (FromObjCPtr1 && FromObjCPtr2) {
4377 if (AssignLeft != AssignRight) {
4412 if (UnqualT1 == UnqualT2) {
4424 if (isa<ArrayType>(T1) && T1Quals)
4426 if (isa<ArrayType>(T2) && T2Quals)
4474 if (SCS1IsCompatibleVectorConversion != SCS2IsCompatibleVectorConversion)
4475 return SCS1IsCompatibleVectorConversion
4482 bool SCS1IsCompatibleSVEVectorConversion =
4484 bool SCS2IsCompatibleSVEVectorConversion =
4487 if (SCS1IsCompatibleSVEVectorConversion !=
4488 SCS2IsCompatibleSVEVectorConversion)
4489 return SCS1IsCompatibleSVEVectorConversion
4496 bool SCS1IsCompatibleRVVVectorConversion =
4498 bool SCS2IsCompatibleRVVVectorConversion =
4501 if (SCS1IsCompatibleRVVVectorConversion !=
4502 SCS2IsCompatibleRVVVectorConversion)
4503 return SCS1IsCompatibleRVVVectorConversion
4544 if (UnqualT1 == UnqualT2)
4562 bool ObjCLifetimeConversion;
4572 if (CanPick1 != CanPick2)
4626 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
4634 if (FromPointee1 != FromPointee2 && ToPointee1 == ToPointee2) {
4651 if (FromPtr1 && FromPtr2 && ToPtr1 && ToPtr2) {
4658 bool FromAssignRight
4667 if (ToPtr1->isObjCIdType() &&
4668 (ToPtr2->isObjCQualifiedIdType() || ToPtr2->getInterfaceDecl()))
4670 if (ToPtr2->isObjCIdType() &&
4671 (ToPtr1->isObjCQualifiedIdType() || ToPtr1->getInterfaceDecl()))
4676 if (ToPtr1->isObjCQualifiedIdType() && ToPtr2->getInterfaceDecl())
4678 if (ToPtr2->isObjCQualifiedIdType() && ToPtr1->getInterfaceDecl())
4683 if (ToPtr1->isObjCClassType() &&
4684 (ToPtr2->isObjCQualifiedClassType() || ToPtr2->getInterfaceDecl()))
4686 if (ToPtr2->isObjCClassType() &&
4687 (ToPtr1->isObjCQualifiedClassType() || ToPtr1->getInterfaceDecl()))
4692 if (ToPtr1->isObjCQualifiedClassType() && ToPtr2->getInterfaceDecl())
4694 if (ToPtr2->isObjCQualifiedClassType() && ToPtr1->getInterfaceDecl())
4700 (ToAssignLeft != ToAssignRight)) {
4711 }
else if (IsSecondSame)
4720 (FromAssignLeft != FromAssignRight))
4734 const Type *FromPointeeType1 = FromMemPointer1->getClass();
4735 const Type *ToPointeeType1 = ToMemPointer1->
getClass();
4736 const Type *FromPointeeType2 = FromMemPointer2->
getClass();
4737 const Type *ToPointeeType2 = ToMemPointer2->
getClass();
4743 if (FromPointee1 == FromPointee2 && ToPointee1 != ToPointee2) {
4750 if (ToPointee1 == ToPointee2 && FromPointee1 != FromPointee2) {
4808 "T1 must be the pointee type of the reference type");
4809 assert(!OrigT2->
isReferenceType() &&
"T2 cannot be a reference type");
4833 if (UnqualT1 == UnqualT2) {
4835 }
else if (isCompleteType(Loc, OrigT2) &&
4836 IsDerivedFrom(Loc, UnqualT2, UnqualT1))
4837 Conv |= ReferenceConversions::DerivedToBase;
4841 Conv |= ReferenceConversions::ObjC;
4843 IsFunctionConversion(UnqualT2, UnqualT1, ConvertedT2)) {
4844 Conv |= ReferenceConversions::Function;
4846 return Ref_Compatible;
4848 bool ConvertedReferent = Conv != 0;
4852 bool PreviousToQualsIncludeConst =
true;
4853 bool TopLevel =
true;
4859 Conv |= ReferenceConversions::Qualification;
4865 Conv |= ReferenceConversions::NestedQualification;
4873 bool ObjCLifetimeConversion =
false;
4875 PreviousToQualsIncludeConst,
4876 ObjCLifetimeConversion))
4882 if (ObjCLifetimeConversion)
4883 Conv |= ReferenceConversions::ObjCLifetime;
4902 bool AllowExplicit) {
4903 assert(T2->
isRecordType() &&
"Can only find conversions of record types.");
4908 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();