Skip to content

Commit 030a33e

Browse files
authored
Merge pull request #41994 from xedin/fix-score-for-archetype-preference
[CSRanking] Fix a bug in archetype vs. concrete type ranking
2 parents 4d24a27 + a4c17fa commit 030a33e

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

lib/Sema/CSRanking.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1331,7 +1331,7 @@ SolutionCompareResult ConstraintSystem::compareSolutions(
13311331
continue;
13321332
} else if (type2->is<ArchetypeType>() && !type1->is<ArchetypeType>() &&
13331333
!type1->is<PlaceholderType>()) {
1334-
++score2;
1334+
++score1;
13351335
continue;
13361336
}
13371337

test/Constraints/ranking.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,3 +410,33 @@ func useUnsafePointerStruct<U>(_ ptr: UnsafePointer<U>) {
410410
// CHECK: function_ref @$s7ranking19UnsafePointerStructVyACSPyxGclufC : $@convention(method) <τ_0_0> (UnsafePointer<τ_0_0>, @thin UnsafePointerStruct.Type) -> UnsafePointerStruct
411411
let _: UnsafePointerStruct = UnsafePointerStruct(ptr)
412412
}
413+
414+
/// Archetype vs. non-archetype (expect placeholder)
415+
416+
protocol SignalProtocol {
417+
associatedtype Element
418+
associatedtype Error: Swift.Error
419+
}
420+
421+
struct Signal<Element, Error: Swift.Error>: SignalProtocol {
422+
init<S: Sequence>(sequence: S) where S.Iterator.Element == Element {
423+
}
424+
}
425+
426+
extension SignalProtocol where Element: SignalProtocol, Element.Error == Error {
427+
typealias InnerElement = Element.Element
428+
429+
func flatten() -> Signal<InnerElement, Error> {
430+
fatalError()
431+
}
432+
}
433+
434+
extension SignalProtocol where Element: SignalProtocol, Error == Never {
435+
func flatten() -> Signal<Element.Element, Element.Error> {
436+
fatalError()
437+
}
438+
}
439+
440+
func no_ambiguity_error_vs_never<Element, Error>(_ signals: [Signal<Element, Error>]) -> Signal<Element, Error> {
441+
return Signal(sequence: signals).flatten() // Ok
442+
}

0 commit comments

Comments
 (0)