|
| 1 | +// RUN: %empty-directory(%t) |
| 2 | +// RUN: %target-swift-frontend %s -D RESILIENT_MODULE -module-name Class -emit-module -emit-module-path %t/Class.swiftmodule -enable-library-evolution -clang-header-expose-decls=all-public -emit-clang-header-path %t/class.h |
| 3 | + |
| 4 | +// RUN: %target-swift-frontend %s -I %t -typecheck -module-name UseClass -clang-header-expose-decls=all-public -emit-clang-header-path %t/useclass.h |
| 5 | + |
| 6 | +// RUN: %FileCheck %s < %t/useclass.h |
| 7 | + |
| 8 | +// FIXME: add import automatically? |
| 9 | +// RUN: echo '#include "class.h"' > %t/fixed-useclass.h |
| 10 | +// RUN: cat %t/useclass.h >> %t/fixed-useclass.h |
| 11 | + |
| 12 | +// RUN: %check-interop-cxx-header-in-clang(%t/fixed-useclass.h) |
| 13 | + |
| 14 | +#if RESILIENT_MODULE |
| 15 | + |
| 16 | +open class BaseClass { |
| 17 | + var field: Int64 |
| 18 | + |
| 19 | + public init() { |
| 20 | + field = 0 |
| 21 | + } |
| 22 | + open func virtualMethod() { |
| 23 | + print("BaseClass.virtualMethod") |
| 24 | + } |
| 25 | + open var computedProp: Int { |
| 26 | + return 11 |
| 27 | + } |
| 28 | +} |
| 29 | + |
| 30 | +#else |
| 31 | + |
| 32 | +import Class |
| 33 | + |
| 34 | +public class CrossModuleDerivedClass: BaseClass { |
| 35 | + override public init() {} |
| 36 | + override public func virtualMethod() { |
| 37 | + print("CrossModuleDerivedClass.virtualMethod") |
| 38 | + } |
| 39 | + override public var computedProp: Int { |
| 40 | + return -56 |
| 41 | + } |
| 42 | + |
| 43 | + public func virtualMethodInDerived() { |
| 44 | + print("CrossModuleDerivedClass.virtualMethodInDerived") |
| 45 | + } |
| 46 | + public var derivedComputedProp: Int { |
| 47 | + return 23 |
| 48 | + } |
| 49 | + public func virtualMethod2InDerived() { |
| 50 | + print("CrossModuleDerivedClass.virtualMethod2InDerived") |
| 51 | + } |
| 52 | +} |
| 53 | + |
| 54 | +public class CrossModuleDerivedDerivedClass: CrossModuleDerivedClass { |
| 55 | + override public init() {} |
| 56 | + override public func virtualMethodInDerived() { |
| 57 | + print("CrossModuleDerivedDerivedClass.virtualMethodInDerived") |
| 58 | + } |
| 59 | + override public var derivedComputedProp: Int { |
| 60 | + return -95 |
| 61 | + } |
| 62 | + override public final func virtualMethod2InDerived() { |
| 63 | + print("CrossModuleDerivedDerivedClass.virtualMethod2InDerived") |
| 64 | + } |
| 65 | +} |
| 66 | + |
| 67 | +public func createCrossModuleDerivedClass() -> CrossModuleDerivedClass { |
| 68 | + return CrossModuleDerivedClass() |
| 69 | +} |
| 70 | + |
| 71 | +public func createCrossModuleDerivedDerivedClass() -> CrossModuleDerivedDerivedClass { |
| 72 | + return CrossModuleDerivedDerivedClass() |
| 73 | +} |
| 74 | + |
| 75 | +#endif |
| 76 | + |
| 77 | +// CHECK: SWIFT_EXTERN void $s8UseClass018CrossModuleDerivedB0C015virtualMethodInE0yyF(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL; // virtualMethodInDerived() |
| 78 | +// CHECK-NEXT: SWIFT_EXTERN uint64_t $s8UseClass018CrossModuleDerivedB0CMo; // class metadata base offset |
| 79 | +// CHECK-NEXT: SWIFT_EXTERN ptrdiff_t $s8UseClass018CrossModuleDerivedB0C19derivedComputedPropSivg(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL; |
| 80 | +// CHECK-NEXT: SWIFT_EXTERN void $s8UseClass018CrossModuleDerivedB0C016virtualMethod2InE0yyF(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL; // virtualMethod2InDerived() |
| 81 | + |
| 82 | + |
| 83 | +// CHECK: void CrossModuleDerivedClass::virtualMethod() { |
| 84 | +// CHECK-NEXT: return _impl::$s5Class04BaseA0C13virtualMethodyyFTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this)); |
| 85 | + |
| 86 | +// CHECK: void CrossModuleDerivedClass::virtualMethodInDerived() { |
| 87 | +// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this)); |
| 88 | +// CHECK-NEXT: #ifdef __arm64e__ |
| 89 | +// CHECK-NEXT: void **vtable_ = ptrauth_auth_data(*selfPtr_, ptrauth_key_process_independent_data, ptrauth_blend_discriminator(selfPtr_,27361)); |
| 90 | +// CHECK-NEXT: #else |
| 91 | +// CHECK-NEXT: void **vtable_ = *selfPtr_; |
| 92 | +// CHECK-NEXT: #endif |
| 93 | +// CHECK-NEXT: struct FTypeAddress { |
| 94 | +// CHECK-NEXT: decltype(_impl::$s8UseClass018CrossModuleDerivedB0C015virtualMethodInE0yyF) * func; |
| 95 | +// CHECK-NEXT: }; |
| 96 | +// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo / sizeof(void *)) + 0); |
| 97 | +// CHECK-NEXT: return (* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this)); |
| 98 | +// CHECK-NEXT: } |
| 99 | + |
| 100 | +// CHECK: swift::Int CrossModuleDerivedClass::getDerivedComputedProp() { |
| 101 | +// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo / sizeof(void *)) + 1); |
| 102 | + |
| 103 | +// CHECK: void CrossModuleDerivedClass::virtualMethod2InDerived() { |
| 104 | +// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo / sizeof(void *)) + 2); |
| 105 | + |
| 106 | +// CHECK: void CrossModuleDerivedDerivedClass::virtualMethodInDerived() { |
| 107 | +// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo / sizeof(void *)) + 0); |
| 108 | + |
| 109 | +// CHECK: swift::Int CrossModuleDerivedDerivedClass::getDerivedComputedProp() { |
| 110 | +// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo / sizeof(void *)) + 1); |
| 111 | + |
| 112 | +// CHECK: void CrossModuleDerivedDerivedClass::virtualMethod2InDerived() { |
| 113 | +// CHECK-NEXT: return _impl::$s8UseClass018CrossModuleDerivedeB0C016virtualMethod2InE0yyF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this)); |
0 commit comments