You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[Sema] Always consider outer alternatives when resolving a decl ref.
Currently, when a type member has the same base name as a global declaration, one cannot refer to the global member from a method context, and the current diagnostics force the user to use a fully qualified name. This is a long-standing issue with the use of top-level `min` and `max` in an extension, and is causing unnecessarily verbosity in math algorithms in extensions for `ElementaryFunctions`-conforming types.
More context:
1. [Forum thread](https://forums.swift.org/t/elementaryfunctions-and-ambiguity-in-extensions/25297): `ElementaryFunctions` and ambiguity in extensions
2. [SR-456](https://bugs.swift.org/browse/SR-456): Confusing build error when calling 'max' function within 'extension Int'.
3. [SR-1772](https://bugs.swift.org/browse/SR-1772): File-level function with the same name as instance function not picked up by compiler.
This PR makes `UnresolvedDeclRefExpr` resolution always consider alternative candidates from the outer context. The following code will no longer trigger any error or warning.
```swift
import Foundation // which exports a top-level `sin(_:)`.
extension Float {
func foo() {
// Refers to top-level `sin(_:)`, not static method `Float.sin(_:)`.
_ = sin(self)
_ = sin(_:) as (Float) -> Float
}
}
extension Sequence {
func foo() {
// Refers to top-level `max(_:_:)`.
_ = max(1, 2)
}
}
```
0 commit comments