@@ -661,7 +661,20 @@ static unsigned getNumRemovedArgumentLabels(ValueDecl *decl,
661661
662662// / Determine the number of applications
663663unsigned constraints::getNumApplications (ValueDecl *decl, bool hasAppliedSelf,
664- FunctionRefKind functionRefKind) {
664+ FunctionRefKind functionRefKind,
665+ ConstraintLocatorBuilder locator) {
666+ // FIXME: Narrow hack for rdar://139234188 - Currently we set
667+ // FunctionRefKind::Compound for enum element patterns with tuple
668+ // sub-patterns to ensure the member has argument labels stripped. As such,
669+ // we need to account for the correct application level here. We ought to be
670+ // setting the correct FunctionRefKind and properly handling the label
671+ // matching in the solver though.
672+ if (auto lastElt = locator.last ()) {
673+ if (auto matchElt = lastElt->getAs <LocatorPathElt::PatternMatch>()) {
674+ if (auto *EP = dyn_cast<EnumElementPattern>(matchElt->getPattern ()))
675+ return (EP->hasSubPattern () ? 1 : 0 ) + hasAppliedSelf;
676+ }
677+ }
665678 switch (functionRefKind) {
666679 case FunctionRefKind::Unapplied:
667680 case FunctionRefKind::Compound:
@@ -885,7 +898,8 @@ ConstraintSystem::getTypeOfReference(ValueDecl *value,
885898
886899 auto origOpenedType = openedType;
887900 if (!isRequirementOrWitness (locator)) {
888- unsigned numApplies = getNumApplications (value, false , functionRefKind);
901+ unsigned numApplies = getNumApplications (value, false , functionRefKind,
902+ locator);
889903 openedType = adjustFunctionTypeForConcurrency (
890904 origOpenedType, /* baseType=*/ Type (), func, useDC, numApplies, false ,
891905 replacements, locator);
@@ -914,7 +928,7 @@ ConstraintSystem::getTypeOfReference(ValueDecl *value,
914928 auto origOpenedType = openedType;
915929 if (!isRequirementOrWitness (locator)) {
916930 unsigned numApplies = getNumApplications (
917- funcDecl, false , functionRefKind);
931+ funcDecl, false , functionRefKind, locator );
918932 openedType = adjustFunctionTypeForConcurrency (
919933 origOpenedType->castTo <FunctionType>(), /* baseType=*/ Type (), funcDecl,
920934 useDC, numApplies, false , replacements, locator);
@@ -1657,7 +1671,7 @@ DeclReferenceType ConstraintSystem::getTypeOfMemberReference(
16571671 // Don't adjust when doing witness matching, because that can cause cycles.
16581672 } else if (isa<AbstractFunctionDecl>(value) || isa<EnumElementDecl>(value)) {
16591673 unsigned numApplies = getNumApplications (
1660- value, hasAppliedSelf, functionRefKind);
1674+ value, hasAppliedSelf, functionRefKind, locator );
16611675 openedType = adjustFunctionTypeForConcurrency (
16621676 origOpenedType->castTo <FunctionType>(), resolvedBaseTy, value, useDC,
16631677 numApplies, isMainDispatchQueueMember (locator), replacements, locator);
@@ -1841,7 +1855,7 @@ Type ConstraintSystem::getEffectiveOverloadType(ConstraintLocator *locator,
18411855 auto hasAppliedSelf =
18421856 doesMemberRefApplyCurriedSelf (overload.getBaseType (), decl);
18431857 unsigned numApplies = getNumApplications (
1844- decl, hasAppliedSelf, overload.getFunctionRefKind ());
1858+ decl, hasAppliedSelf, overload.getFunctionRefKind (), locator );
18451859
18461860 type = adjustFunctionTypeForConcurrency (
18471861 type->castTo <FunctionType>(), overload.getBaseType (), decl,
0 commit comments