| // RUN: %target-swift-frontend -Xllvm -sil-full-demangle -O -emit-sil %s | %FileCheck %s |
| |
| // The second run tests is it can be compiled without crashes. |
| // RUN: %target-swift-frontend -Xllvm -sil-full-demangle -O -S %s |
| |
| private class A { |
| func foo() -> Int { return 0 } |
| } |
| |
| // CHECK-LABEL: deinit_in_vtable.(A in {{.*}}).__deallocating_deinit |
| // CHECK: sil private @[[A:.*]] : |
| |
| private class B : A { |
| override func foo() -> Int { return 1 } |
| } |
| |
| // CHECK-LABEL: deinit_in_vtable.(B in {{.*}}).__deallocating_deinit |
| // CHECK: sil private @[[B:.*]] : |
| |
| @inline(never) |
| private func testfunc(_ a: A) -> Int { |
| return a.foo() |
| } |
| |
| public func testmain() { |
| testfunc(B()) |
| } |
| |
| // Check if the deallocating destructors are listed in the vtable. |
| // This is required so that the are not removed (if not public) by dead |
| // function elimination |
| |
| // CHECK-LABEL: sil_vtable A |
| // CHECK: A.deinit!deallocator: [[A]] |
| |
| // CHECK-LABEL: sil_vtable B |
| // CHECK-NOT: A.deinit |
| // CHECK: B.deinit!deallocator: [[B]] |
| |