Skip to content

Commit 3e73210

Browse files
authored
Merge pull request #77802 from hamishknight/rdar139234188
2 parents 4488c79 + 746135b commit 3e73210

File tree

4 files changed

+48
-8
lines changed

4 files changed

+48
-8
lines changed

include/swift/Sema/ConstraintSystem.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6434,7 +6434,8 @@ bool isResultBuilderMethodReference(ASTContext &, UnresolvedDotExpr *);
64346434

64356435
/// Determine the number of applications applied to the given overload.
64366436
unsigned getNumApplications(ValueDecl *decl, bool hasAppliedSelf,
6437-
FunctionRefKind functionRefKind);
6437+
FunctionRefKind functionRefKind,
6438+
ConstraintLocatorBuilder locator);
64386439

64396440
} // end namespace constraints
64406441

lib/Sema/CSSimplify.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10153,8 +10153,8 @@ performMemberLookup(ConstraintKind constraintKind, DeclNameRef memberName,
1015310153

1015410154
auto hasAppliedSelf = decl->hasCurriedSelf() &&
1015510155
doesMemberRefApplyCurriedSelf(baseObjTy, decl);
10156-
return getNumApplications(decl, hasAppliedSelf, functionRefKind) <
10157-
decl->getNumCurryLevels();
10156+
return getNumApplications(decl, hasAppliedSelf, functionRefKind,
10157+
memberLocator) < decl->getNumCurryLevels();
1015810158
});
1015910159
};
1016010160

lib/Sema/TypeOfReference.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,20 @@ static unsigned getNumRemovedArgumentLabels(ValueDecl *decl,
661661

662662
/// Determine the number of applications
663663
unsigned 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,

test/Constraints/rdar139234188.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// RUN: %target-swift-emit-silgen %s -verify -swift-version 6
2+
3+
struct S: Equatable {
4+
static func foo() -> Self { fatalError() }
5+
static func bar(_ x: Int) -> Self { fatalError() }
6+
static func baz(x: Int, y: Int) -> Self { fatalError() }
7+
public static func == (_: Self, _: Self) -> Bool { false }
8+
}
9+
10+
// rdar://139234188 - Make sure we don't consider these members to be partially
11+
// applied for concurrency adjustment.
12+
func foo(_ x: S) {
13+
_ = {
14+
switch x {
15+
case .foo():
16+
break
17+
case .bar(0):
18+
break
19+
case .baz(x: 1, y: 2):
20+
break
21+
default:
22+
break
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)