Files
swift-mirror/test/Interop/SwiftToCxx/class/swift-resilient-class-virtual-method-dispatch.swift
Gabor Horvath 94b466656e [cxx-interop] Support nested structs
It is really involved to change how methods and classes are emitted into
the header so this patch introduces the impression of nested structs
through using statements and still emits the structs themselves as top
level structs. It emits them in their own namespace to avoid name
collisions. This patch also had to change some names to be fully
qualified to avoid some name lookup errors in case of nested structs.
Moreover, nesting level of 3 and above requires C++17 because it relies
on nested namespaces. Only nested structs are supported, not nested
classes.

Since this patch is already started to grow quite big, I decided to put
it out for reviews and plan to address some of the shortcomings in a
follow-up PR.

rdar://118793469
2024-09-10 13:22:17 +01:00

78 lines
5.1 KiB
Swift

// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend %S/swift-class-virtual-method-dispatch.swift -typecheck -module-name Class -clang-header-expose-decls=all-public -emit-clang-header-path %t/class.h -enable-library-evolution
// RUN: %FileCheck %s < %t/class.h
// RUN: %check-interop-cxx-header-in-clang(%t/class.h -DSWIFT_CXX_INTEROP_HIDE_STL_OVERLAY)
// note: implemented in swift-class-virtual-method-dispatch.swift
// CHECK: SWIFT_EXTERN void $s5Class04BaseA0C13virtualMethodyyF(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL; // virtualMethod()
// CHECK-NEXT: SWIFT_EXTERN void $s5Class04BaseA0C13virtualMethodyyFTj(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL; // dispatch thunk for virtualMethod()
// CHECK: SWIFT_EXTERN ptrdiff_t $s5Class04BaseA0C19virtualComputedPropSivg(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL;
// CHECK-NEXT: SWIFT_EXTERN ptrdiff_t $s5Class04BaseA0C19virtualComputedPropSivgTj(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL; // dispatch thunk for
// CHECK: void BaseClass::virtualMethod() {
// CHECK-NEXT: _impl::$s5Class04BaseA0C13virtualMethodyyFTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK-NEXT: }
// CHECK: swift::Int BaseClass::virtualMethodIntInt(swift::Int x) {
// CHECK-NEXT: return Class::_impl::$s5Class04BaseA0C016virtualMethodIntE0yS2iFTj(x, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK-NEXT: }
// CHECK: swift::Int BaseClass::finalMethodInBase(swift::Int x) {
// CHECK-NEXT: return Class::_impl::$s5Class04BaseA0C013finalMethodInB0yS2iF(x, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK-NEXT: }
// CHECK: swift::Int BaseClass::getVirtualComputedProp() {
// CHECK-NEXT: _impl::$s5Class04BaseA0C19virtualComputedPropSivgTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK: int64_t BaseClass::getVirtualComputedGetSet() {
// CHECK-NEXT: _impl::$s5Class04BaseA0C21virtualComputedGetSets5Int64VvgTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK: void BaseClass::setVirtualComputedGetSet(int64_t newValue) {
// CHECK-NEXT: _impl::$s5Class04BaseA0C21virtualComputedGetSets5Int64VvsTj(newValue, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK: swift::Int BaseClass::getStoredProp() {
// CHECK-NEXT: _impl::$s5Class04BaseA0C10storedPropSivgTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK: void BaseClass::setStoredProp(swift::Int value) {
// CHECK-NEXT: _impl::$s5Class04BaseA0C10storedPropSivsTj(value, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK: swift::Int BaseClass::operator [](swift::Int i) const
// CHECK-NEXT: return Class::_impl::$s5Class04BaseA0CyS2icigTj(i, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK: void DerivedClass::virtualMethod() {
// CHECK-NEXT: _impl::$s5Class04BaseA0C13virtualMethodyyFTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK-NEXT: }
// CHECK: swift::Int DerivedClass::virtualMethodIntInt(swift::Int x) {
// CHECK-NEXT: return Class::_impl::$s5Class04BaseA0C016virtualMethodIntE0yS2iFTj(x, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK-NEXT: }
// CHECK: BaseClass DerivedClass::virtualMethodInDerived(const BaseClass& x) {
// CHECK-NEXT: return _impl::_impl_BaseClass::makeRetained(Class::_impl::$s5Class07DerivedA0C015virtualMethodInB0yAA04BaseA0CAFFTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(x), ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this)));
// CHECK-NEXT: }
// CHECK: swift::Int DerivedClass::getVirtualComputedProp() {
// CHECK-NEXT: Class::_impl::$s5Class04BaseA0C19virtualComputedPropSivgTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK: void DerivedDerivedClass::virtualMethod() {
// CHECK-NEXT: _impl::$s5Class07DerivedbA0C13virtualMethodyyF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK-NEXT: }
// CHECK: BaseClass DerivedDerivedClass::virtualMethodInDerived(const BaseClass& x) {
// CHECK-NEXT: return _impl::_impl_BaseClass::makeRetained(Class::_impl::$s5Class07DerivedbA0C015virtualMethodInB0yAA04BaseA0CAFF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(x), ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this)));
// CHECK-NEXT: }
// CHECK: void DerivedDerivedClass::methodInDerivedDerived() {
// CHECK-NEXT: _impl::$s5Class07DerivedbA0C08methodInbB0yyF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK-NEXT: }
// CHECK: swift::Int DerivedDerivedClass::getStoredProp() {
// CHECK-NEXT: return Class::_impl::$s5Class07DerivedbA0C10storedPropSivg(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
// CHECK: swift::Int DerivedDerivedClass::getComputedPropInDerivedDerived() {
// CHECK-NEXT: return Class::_impl::$s5Class07DerivedbA0C014computedPropInbB0Sivg(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));