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
|
// The StdlibUnittest test suite is placed here because it contains
// expressions that are only allowed at the top level in files named
// "main.swift".
import StdlibUnittest
@inline(never)
func testProto(_ c: Container) {
// call the dead witness method abc()
c.p.abc()
}
@inline(never)
func testProtoAsync(_ c: Container) async {
// call the dead witness method abcAsync()
await c.p.abcAsync()
}
@inline(never)
func testClass(_ c: ClassContainer) {
// call the dead vtable method def()
c.p.def()
}
@inline(never)
func testClassAsync(_ c: ClassContainer) async {
// call the dead vtable method defAsync()
await c.p.defAsync()
}
public class PublicDerived : PublicBase {
// The vtable of PublicDerived contains a reference to PublicBase.ghi()
}
@inline(never)
func callPublicClass() {
testPublicClass(PublicDerived())
}
@inline(never)
func testPublicClass(_ c: PublicBase) {
// call the dead private vtable method ghi()
c.ghi()
}
@inline(never)
func callPublicClassAsync() async {
await testPublicClassAsync(PublicDerived())
}
@inline(never)
func testPublicClassAsync(_ c: PublicBase) async {
// call the dead private vtable method ghiAsync()
await c.ghiAsync()
}
@main struct Main {
static func main() async {
let tests = TestSuite("ReportDeadMethodCall")
tests.test("Call class") {
expectCrashLater(withMessage: "Fatal error: Call of deleted method")
callClass()
}
tests.test("Call class async") {
// TODO: it should crash with the error message and not with sigsegv
expectCrashLater()
await callClassAsync()
}
tests.test("Call proto") {
expectCrashLater(withMessage: "Fatal error: Call of deleted method")
callProto()
}
tests.test("Call proto async") {
// TODO: it should crash with the error message and not with sigsegv
expectCrashLater(withMessage: "")
await callProtoAsync()
}
tests.test("Call public class") {
expectCrashLater(withMessage: "Fatal error: Call of deleted method")
callPublicClass()
}
tests.test("Call public class async") {
expectCrashLater(withMessage: "Fatal error: Call of deleted method")
await callPublicClassAsync()
}
await runAllTestsAsync()
}
}
|