forked from apple/swift
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Handle conformance with multiple protocol requirements with the same …
…selector. When concurrency is enabled, the same Objective-C method on a protocol can be imported as two different protocol requirements, both of which have the same selector. When performing conformance checking, only treat a given @objc protocol requirement as "unsatisfied" by a conformance if none of the requirements with the same Objective-C selector (+ instance/class designation) are satisfied.
- Loading branch information
1 parent
fe4a8bb
commit 50f8705
Showing
4 changed files
with
266 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -I %S/Inputs/custom-modules -enable-experimental-concurrency %s -verify -verify-ignore-unknown | ||
|
||
// REQUIRES: objc_interop | ||
import Foundation | ||
import ObjCConcurrency | ||
|
||
// Conform via async method | ||
class C1: ConcurrentProtocol { | ||
func askUser(toSolvePuzzle puzzle: String) async throws -> String? { nil } | ||
|
||
func askUser(toJumpThroughHoop hoop: String) async -> String { "hello" } | ||
} | ||
|
||
// Conform via completion-handler method | ||
class C2: ConcurrentProtocol { | ||
func askUser(toSolvePuzzle puzzle: String, completionHandler: ((String?, Error?) -> Void)?) { | ||
completionHandler?("hello", nil) | ||
} | ||
|
||
func askUser(toJumpThroughHoop hoop: String, completionHandler: ((String) -> Void)?) { | ||
completionHandler?("hello") | ||
} | ||
} | ||
|
||
// Conform via both; this is an error | ||
class C3: ConcurrentProtocol { | ||
// expected-note@+1{{method 'askUser(toSolvePuzzle:)' declared here}} | ||
func askUser(toSolvePuzzle puzzle: String) async throws -> String? { nil } | ||
|
||
// expected-error@+1{{'askUser(toSolvePuzzle:completionHandler:)' with Objective-C selector 'askUserToSolvePuzzle:completionHandler:' conflicts with method 'askUser(toSolvePuzzle:)' with the same Objective-C selector}} | ||
func askUser(toSolvePuzzle puzzle: String, completionHandler: ((String?, Error?) -> Void)?) { | ||
completionHandler?("hello", nil) | ||
} | ||
} | ||
|
||
// Conform but forget to supply either. Also an error. | ||
// FIXME: Suppress one of the notes? | ||
class C4: ConcurrentProtocol { // expected-error{{type 'C4' does not conform to protocol 'ConcurrentProtocol'}} | ||
} | ||
|
||
class C5 { | ||
} | ||
|
||
extension C5: ConcurrentProtocol { | ||
func askUser(toSolvePuzzle puzzle: String, completionHandler: ((String?, Error?) -> Void)?) { | ||
completionHandler?("hello", nil) | ||
} | ||
|
||
func askUser(toJumpThroughHoop hoop: String, completionHandler: ((String) -> Void)?) { | ||
completionHandler?("hello") | ||
} | ||
} |