Skip to content

Commit 392dac4

Browse files
committed
[CSSolver] DynamicMemberLookup: Ignore disabled choices while filtering disjunctions
`filterDisjunction` should ignore the choices that are already disabled while attempting to optimize disjunctions related to dynamic member lookup. Resolves: rdar://139314763
1 parent 0d7054b commit 392dac4

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

lib/Sema/CSSolver.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1781,6 +1781,9 @@ ConstraintSystem::filterDisjunction(
17811781
return SolutionKind::Unsolved;
17821782

17831783
for (auto *currentChoice : disjunction->getNestedConstraints()) {
1784+
if (currentChoice->isDisabled())
1785+
continue;
1786+
17841787
if (currentChoice != choice)
17851788
solverState->disableConstraint(currentChoice);
17861789
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// RUN: not %target-swift-frontend %s -typecheck
2+
3+
class A {}
4+
5+
struct B {}
6+
7+
@dynamicMemberLookup
8+
enum DynMember {
9+
subscript<T>(_: T.Type) -> T {
10+
get { fatalError() }
11+
}
12+
13+
subscript<T>(dynamicMember keyPath: KeyPath<B, T>) -> T {
14+
fatalError()
15+
}
16+
}
17+
18+
@dynamicMemberLookup
19+
class Test {
20+
subscript<T>(_: KeyPath<A, T>) -> T {
21+
self[setting: T.self]
22+
}
23+
24+
subscript<T>(setting: T.Type) -> T {
25+
get {
26+
fatalError()
27+
}
28+
}
29+
30+
subscript<T>(dynamicMember keyPath: KeyPath<DynMember, T>) -> T {
31+
fatalError()
32+
}
33+
}

0 commit comments

Comments
 (0)