1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -enable-experimental-cxx-interop)
// REQUIRES: executable_test
import StdlibUnittest
import ProtocolConformance
protocol TestMethods {
init(_: DummyStruct)
mutating func test1()
mutating func test2(_: Int32)
mutating func test3(_: Int32, _: UInt32) -> CChar
}
protocol CanReturn42 {
mutating func return42() -> Int32
}
extension CanReturn42 {
mutating func return42() -> Int32 { 0 }
}
protocol DefaultInitializable {
init()
}
extension NonTrivial : TestMethods { }
extension NonTrivial : DefaultInitializable { }
extension Trivial : TestMethods { }
extension Trivial : DefaultInitializable { }
extension Trivial : CanReturn42 { }
extension ConformsToProtocol : CanReturn42 { }
@inline(never)
@_optimize(none)
func tryReturn42(_ _p: CanReturn42) -> Int32 {
var p = _p
return p.return42()
}
@inline(never)
@_optimize(none)
func makeIt<T : DefaultInitializable>(_ _: T.Type) -> T { T() }
@inline(never)
@_optimize(none)
func makeItWithDummy<T : TestMethods>(_ _: T.Type) -> T { T(DummyStruct()) }
@inline(never)
@_optimize(none)
func callTestMethods(on _subject: TestMethods) -> CChar {
var subject = _subject
subject.test1()
subject.test2(0 as Int32)
return subject.test3(0 as Int32, 1 as UInt32)
}
struct Holder<T : DefaultInitializable & TestMethods> {
var value: DefaultInitializable & TestMethods = T()
}
@inline(never)
@_optimize(none)
func callTestMethods<T : TestMethods>(on subject: Holder<T>) -> CChar {
callTestMethods(on: subject.value)
}
var ExtendedTypes = TestSuite("Extended C++ Types")
ExtendedTypes.test("(Don't) Use default impl") {
let noMethod = Trivial()
expectEqual(0, tryReturn42(noMethod))
let hasMethod = ConformsToProtocol()
expectEqual(42, tryReturn42(hasMethod))
}
ExtendedTypes.test("Constrained generic") {
var trivial = makeIt(Trivial.self)
var result = callTestMethods(on: trivial)
expectEqual(42, result)
let nonTrivial = makeIt(NonTrivial.self)
result = callTestMethods(on: nonTrivial)
expectEqual(42, result)
trivial = makeItWithDummy(Trivial.self)
result = callTestMethods(on: trivial)
expectEqual(42, result)
}
ExtendedTypes.test("Generic struct") {
var hold = Holder<Trivial>()
var result = callTestMethods(on: hold)
expectEqual(42, result)
hold.value = makeItWithDummy(NonTrivial.self)
result = callTestMethods(on: hold)
expectEqual(42, result)
}
runAllTests()
|