mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
When doing code completion it's entirely expected we'll end up with ambiguities in the body of a closure if we're completing e.g `someOverloadedFn(#^CC^#)`. As such we don't want to penalize the solution for unbound type variables outside of the body since that will prevent us from being able to eagerly prune e.g disfavored overloads in the outer scope. This gives up to a 7% perf win in the stress tester.
32 lines
1011 B
Swift
32 lines
1011 B
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %batch-code-completion -debug-constraints 2> %t/constraints.log
|
|
// RUN: %FileCheck %s -check-prefix CONSTRAINTS < %t/constraints.log
|
|
// RUN: %FileCheck %s -check-prefix CONSTRAINTS-NOT < %t/constraints.log
|
|
|
|
protocol P1 {}
|
|
protocol P2 {}
|
|
|
|
func foo<T: P1>(_ fn: () -> T) {}
|
|
|
|
@_disfavoredOverload
|
|
func foo<T: P2>(_ fn: () -> T) {}
|
|
|
|
func bar(_ x: Int) -> Int {}
|
|
func bar(_ x: String) -> String {}
|
|
|
|
// Make sure we eagerly prune the disfavored overload of 'foo', despite the
|
|
// ambiguity in the closure body.
|
|
foo {
|
|
let x = bar(#^COMPLETE^#)
|
|
// COMPLETE: Decl[FreeFunction]/CurrModule/Flair[ArgLabels]: ['(']{#(x): Int#}[')'][#Int#]; name=:
|
|
// COMPLETE: Decl[FreeFunction]/CurrModule/Flair[ArgLabels]: ['(']{#(x): String#}[')'][#String#]; name=:
|
|
|
|
return x
|
|
}
|
|
|
|
// CONSTRAINTS: attempting disjunction choice {{.*}}:12:6
|
|
// CONSTRAINTS: increasing 'disfavored overload' score
|
|
// CONSTRAINTS: solution is worse than the best solution
|
|
|
|
// CONSTRAINTS-NOT-NOT: increasing 'hole'
|