Skip to content

Commit f15fe69

Browse files
committed
[interop][SwiftToCxx] use vtable offset/thunk to dispatch class property accessors
1 parent 134630c commit f15fe69

File tree

6 files changed

+231
-10
lines changed

6 files changed

+231
-10
lines changed

lib/PrintAsClang/DeclAndTypePrinter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,7 @@ class DeclAndTypePrinter::Implementation
10191019
typeDeclContext, accessor, funcABI->getSignature(),
10201020
funcABI->getSymbolName(), resultTy,
10211021
/*isStatic=*/isClassMethod,
1022-
/*isDefinition=*/false);
1022+
/*isDefinition=*/false, dispatchInfo);
10231023
} else {
10241024
declPrinter.printCxxMethod(typeDeclContext, AFD,
10251025
funcABI->getSignature(),
@@ -1043,7 +1043,7 @@ class DeclAndTypePrinter::Implementation
10431043
typeDeclContext, accessor, funcABI->getSignature(),
10441044
funcABI->getSymbolName(), resultTy,
10451045
/*isStatic=*/isClassMethod,
1046-
/*isDefinition=*/true);
1046+
/*isDefinition=*/true, dispatchInfo);
10471047
} else {
10481048
defPrinter.printCxxMethod(typeDeclContext, AFD, funcABI->getSignature(),
10491049
funcABI->getSymbolName(), resultTy,

lib/PrintAsClang/PrintClangFunction.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,7 +1425,8 @@ static std::string remapPropertyName(const AccessorDecl *accessor,
14251425
void DeclAndTypeClangFunctionPrinter::printCxxPropertyAccessorMethod(
14261426
const NominalTypeDecl *typeDeclContext, const AccessorDecl *accessor,
14271427
const LoweredFunctionSignature &signature, StringRef swiftSymbolName,
1428-
Type resultTy, bool isStatic, bool isDefinition) {
1428+
Type resultTy, bool isStatic, bool isDefinition,
1429+
Optional<IRABIDetailsProvider::MethodDispatchInfo> dispatchInfo) {
14291430
assert(accessor->isSetter() || accessor->getParameters()->size() == 0);
14301431
os << " ";
14311432

@@ -1450,7 +1451,8 @@ void DeclAndTypeClangFunctionPrinter::printCxxPropertyAccessorMethod(
14501451
// FIXME: should it be objTy for resultTy?
14511452
printCxxThunkBody(accessor, signature, swiftSymbolName, typeDeclContext,
14521453
accessor->getModuleContext(), resultTy,
1453-
accessor->getParameters());
1454+
accessor->getParameters(),
1455+
/*hasThrows=*/false, nullptr, isStatic, dispatchInfo);
14541456
os << " }\n";
14551457
}
14561458

lib/PrintAsClang/PrintClangFunction.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,11 @@ class DeclAndTypeClangFunctionPrinter {
125125
Optional<IRABIDetailsProvider::MethodDispatchInfo> dispatchInfo);
126126

127127
/// Print the C++ getter/setter method signature.
128-
void printCxxPropertyAccessorMethod(const NominalTypeDecl *typeDeclContext,
129-
const AccessorDecl *accessor,
130-
const LoweredFunctionSignature &signature,
131-
StringRef swiftSymbolName, Type resultTy,
132-
bool isStatic, bool isDefinition);
128+
void printCxxPropertyAccessorMethod(
129+
const NominalTypeDecl *typeDeclContext, const AccessorDecl *accessor,
130+
const LoweredFunctionSignature &signature, StringRef swiftSymbolName,
131+
Type resultTy, bool isStatic, bool isDefinition,
132+
Optional<IRABIDetailsProvider::MethodDispatchInfo> dispatchInfo);
133133

134134
/// Print the C++ subscript method.
135135
void printCxxSubscriptAccessorMethod(

test/Interop/SwiftToCxx/class/swift-class-virtual-method-dispatch-execution.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,64 @@ int main() {
9090
derivedDerived.methodInDerivedDerived();
9191
// CHECK-NEXT: DerivedDerivedClass.methodInDerivedDerived
9292
}
93+
94+
{
95+
swift::Int x;
96+
x = base.getVirtualComputedProp();
97+
assert(x == 21);
98+
99+
x = derived.getVirtualComputedProp();
100+
assert(x == -75);
101+
x = derivedAsBase.getVirtualComputedProp();
102+
assert(x == -75);
103+
104+
x = derivedDerived.getVirtualComputedProp();
105+
assert(x == -75);
106+
x = derivedDerivedAsBase.getVirtualComputedProp();
107+
assert(x == -75);
108+
}
109+
110+
{
111+
int64_t x;
112+
x = base.getVirtualComputedGetSet();
113+
assert(x == 0);
114+
base.setVirtualComputedGetSet(45);
115+
x = base.getVirtualComputedGetSet();
116+
assert(x == 45);
117+
118+
x = derived.getVirtualComputedGetSet();
119+
assert(x == 0);
120+
derivedAsBase.setVirtualComputedGetSet(9);
121+
x = derivedAsBase.getVirtualComputedGetSet();
122+
assert(x == 18);
123+
derived.setVirtualComputedGetSet(-1);
124+
x = derived.getVirtualComputedGetSet();
125+
assert(x == -2);
126+
127+
x = derivedDerived.getVirtualComputedGetSet();
128+
assert(x == 0);
129+
derivedDerivedAsBase.setVirtualComputedGetSet(3);
130+
x = derivedDerivedAsBase.getVirtualComputedGetSet();
131+
assert(x == 6);
132+
}
133+
134+
{
135+
swift::Int x;
136+
x = base.getStoredProp();
137+
assert(x == 0);
138+
139+
derivedAsBase.setStoredProp(39);
140+
x = derivedAsBase.getStoredProp();
141+
assert(x == -39);
142+
143+
x = derivedDerivedAsBase.getStoredProp();
144+
assert(x == 0);
145+
derivedDerivedAsBase.setStoredProp(843);
146+
x = derivedDerivedAsBase.getStoredProp();
147+
assert(x == 844);
148+
149+
x = derivedDerived.getComputedPropInDerivedDerived();
150+
assert(x == 11);
151+
}
93152
return 0;
94153
}

test/Interop/SwiftToCxx/class/swift-class-virtual-method-dispatch.swift

Lines changed: 131 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,19 @@ public class BaseClass {
1919
public final func finalMethodInBase(_ x: Int) -> Int {
2020
return x * 2
2121
}
22+
23+
public var virtualComputedProp: Int {
24+
return 21
25+
}
26+
public var virtualComputedGetSet: Int64 {
27+
get {
28+
return field
29+
}
30+
set {
31+
field = newValue
32+
}
33+
}
34+
public var storedProp: Int = 0
2235
}
2336

2437
public class DerivedClass: BaseClass {
@@ -34,6 +47,26 @@ public class DerivedClass: BaseClass {
3447
public func virtualMethodInDerived(_ x: BaseClass) -> BaseClass {
3548
return x
3649
}
50+
51+
override public var virtualComputedProp: Int {
52+
return -75
53+
}
54+
override public var virtualComputedGetSet: Int64 {
55+
get {
56+
super.virtualComputedGetSet
57+
}
58+
set {
59+
super.virtualComputedGetSet = newValue * 2
60+
}
61+
}
62+
override public var storedProp: Int {
63+
get {
64+
return -super.storedProp
65+
}
66+
set {
67+
super.storedProp = newValue
68+
}
69+
}
3770
}
3871

3972
public final class DerivedDerivedClass: DerivedClass {
@@ -49,6 +82,16 @@ public final class DerivedDerivedClass: DerivedClass {
4982
public func methodInDerivedDerived() {
5083
print("DerivedDerivedClass.methodInDerivedDerived")
5184
}
85+
override public var storedProp: Int {
86+
get {
87+
return -super.storedProp
88+
}
89+
set {
90+
super.storedProp = newValue + 1
91+
}
92+
}
93+
public var storedPropInDerivedDerived: Int = 0
94+
public var computedPropInDerivedDerived: Int { return 11 }
5295
}
5396

5497
public func returnBaseClass() -> BaseClass {
@@ -83,6 +126,46 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
83126
// CHECK-NEXT: return _impl::$s5Class04BaseA0C013finalMethodInB0yS2iF(x, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
84127
// CHECK-NEXT: }
85128

129+
// CHECK: swift::Int BaseClass::getVirtualComputedProp() {
130+
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
131+
// CHECK-NEXT: void **vtable_ = *selfPtr_;
132+
// CHECK-NEXT: using FType = decltype(_impl::$s5Class04BaseA0C19virtualComputedPropSivg);
133+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 2]]));
134+
// CHECK-NEXT: return (* fptr_)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
135+
// CHECK-NEXT: }
136+
137+
// CHECK: int64_t BaseClass::getVirtualComputedGetSet() {
138+
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
139+
// CHECK-NEXT: void **vtable_ = *selfPtr_;
140+
// CHECK-NEXT: using FType = decltype(_impl::$s5Class04BaseA0C21virtualComputedGetSets5Int64Vvg);
141+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 3]]));
142+
// CHECK-NEXT: return (* fptr_)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
143+
// CHECK-NEXT: }
144+
145+
// CHECK: void BaseClass::setVirtualComputedGetSet(int64_t newValue) {
146+
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
147+
// CHECK-NEXT: void **vtable_ = *selfPtr_;
148+
// CHECK-NEXT: using FType = decltype(_impl::$s5Class04BaseA0C21virtualComputedGetSets5Int64Vvs);
149+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 4]]));
150+
// CHECK-NEXT: return (* fptr_)(newValue, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
151+
// CHECK-NEXT: }
152+
153+
// CHECK: swift::Int BaseClass::getStoredProp() {
154+
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
155+
// CHECK-NEXT: void **vtable_ = *selfPtr_;
156+
// CHECK-NEXT: using FType = decltype(_impl::$s5Class04BaseA0C10storedPropSivg);
157+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 6]]));
158+
// CHECK-NEXT: return (* fptr_)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
159+
// CHECK-NEXT: }
160+
161+
// CHECK: void BaseClass::setStoredProp(swift::Int value) {
162+
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
163+
// CHECK-NEXT: void **vtable_ = *selfPtr_;
164+
// CHECK-NEXT: using FType = decltype(_impl::$s5Class04BaseA0C10storedPropSivs);
165+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 7]]));
166+
// CHECK-NEXT: return (* fptr_)(value, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
167+
// CHECK-NEXT: }
168+
86169
// CHECK: void DerivedClass::virtualMethod() {
87170
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
88171
// CHECK-NEXT: void **vtable_ = *selfPtr_;
@@ -103,10 +186,50 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
103186
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
104187
// CHECK-NEXT: void **vtable_ = *selfPtr_;
105188
// CHECK-NEXT: using FType = decltype(_impl::$s5Class07DerivedA0C015virtualMethodInB0yAA04BaseA0CAFF);
106-
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 2]]));
189+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 9]]));
107190
// CHECK-NEXT: return _impl::_impl_BaseClass::makeRetained((* fptr_)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(x), ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this)));
108191
// CHECK-NEXT: }
109192

193+
// CHECK: swift::Int DerivedClass::getVirtualComputedProp() {
194+
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
195+
// CHECK-NEXT: void **vtable_ = *selfPtr_;
196+
// CHECK-NEXT: using FType = decltype(_impl::$s5Class07DerivedA0C19virtualComputedPropSivg);
197+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 2]]));
198+
// CHECK-NEXT: return (* fptr_)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
199+
// CHECK-NEXT: }
200+
201+
// CHECK: int64_t DerivedClass::getVirtualComputedGetSet() {
202+
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
203+
// CHECK-NEXT: void **vtable_ = *selfPtr_;
204+
// CHECK-NEXT: using FType = decltype(_impl::$s5Class07DerivedA0C21virtualComputedGetSets5Int64Vvg);
205+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 3]]));
206+
// CHECK-NEXT: return (* fptr_)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
207+
// CHECK-NEXT: }
208+
209+
// CHECK: void DerivedClass::setVirtualComputedGetSet(int64_t newValue) {
210+
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
211+
// CHECK-NEXT: void **vtable_ = *selfPtr_;
212+
// CHECK-NEXT: using FType = decltype(_impl::$s5Class07DerivedA0C21virtualComputedGetSets5Int64Vvs);
213+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 4]]));
214+
// CHECK-NEXT: return (* fptr_)(newValue, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
215+
// CHECK-NEXT: }
216+
217+
// CHECK: swift::Int DerivedClass::getStoredProp() {
218+
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
219+
// CHECK-NEXT: void **vtable_ = *selfPtr_;
220+
// CHECK-NEXT: using FType = decltype(_impl::$s5Class07DerivedA0C10storedPropSivg);
221+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 6]]));
222+
// CHECK-NEXT: return (* fptr_)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
223+
// CHECK-NEXT: }
224+
225+
// CHECK: void DerivedClass::setStoredProp(swift::Int newValue) {
226+
// CHECK-NEXT: void ***selfPtr_ = reinterpret_cast<void ***>( ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
227+
// CHECK-NEXT: void **vtable_ = *selfPtr_;
228+
// CHECK-NEXT: using FType = decltype(_impl::$s5Class07DerivedA0C10storedPropSivs);
229+
// CHECK-NEXT: FType *fptr_ = reinterpret_cast<FType *>(*(vtable_ + [[#VM1 + 7]]));
230+
// CHECK-NEXT: return (* fptr_)(newValue, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
231+
// CHECK-NEXT: }
232+
110233
// CHECK: void DerivedDerivedClass::virtualMethod() {
111234
// CHECK-NEXT: return _impl::$s5Class07DerivedbA0C13virtualMethodyyF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
112235
// CHECK-NEXT: }
@@ -119,3 +242,10 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
119242
// CHECK-NEXT: return _impl::$s5Class07DerivedbA0C08methodInbB0yyF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
120243
// CHECK-NEXT: }
121244

245+
// CHECK: swift::Int DerivedDerivedClass::getStoredProp() {
246+
// CHECK-NEXT: return _impl::$s5Class07DerivedbA0C10storedPropSivg(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
247+
// CHECK-NEXT: }
248+
249+
// CHECK: swift::Int DerivedDerivedClass::getComputedPropInDerivedDerived() {
250+
// CHECK-NEXT: return _impl::$s5Class07DerivedbA0C014computedPropInbB0Sivg(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
251+
// CHECK-NEXT: }

test/Interop/SwiftToCxx/class/swift-resilient-class-virtual-method-dispatch.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66

77
// note: implemented in swift-class-virtual-method-dispatch.swift
88

9+
// CHECK: SWIFT_EXTERN void $s5Class04BaseA0C13virtualMethodyyF(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL; // virtualMethod()
10+
// CHECK-NEXT: SWIFT_EXTERN void $s5Class04BaseA0C13virtualMethodyyFTj(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL; // dispatch thunk for virtualMethod()
11+
12+
// CHECK: SWIFT_EXTERN ptrdiff_t $s5Class04BaseA0C19virtualComputedPropSivg(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL;
13+
// CHECK-NEXT: SWIFT_EXTERN ptrdiff_t $s5Class04BaseA0C19virtualComputedPropSivgTj(SWIFT_CONTEXT void * _Nonnull _self) SWIFT_NOEXCEPT SWIFT_CALL; // dispatch thunk for
14+
915
// CHECK: void BaseClass::virtualMethod() {
1016
// CHECK-NEXT: return _impl::$s5Class04BaseA0C13virtualMethodyyFTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
1117
// CHECK-NEXT: }
@@ -18,6 +24,21 @@
1824
// CHECK-NEXT: return _impl::$s5Class04BaseA0C013finalMethodInB0yS2iF(x, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
1925
// CHECK-NEXT: }
2026

27+
// CHECK: swift::Int BaseClass::getVirtualComputedProp() {
28+
// CHECK-NEXT: _impl::$s5Class04BaseA0C19virtualComputedPropSivgTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
29+
30+
// CHECK: int64_t BaseClass::getVirtualComputedGetSet() {
31+
// CHECK-NEXT: _impl::$s5Class04BaseA0C21virtualComputedGetSets5Int64VvgTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
32+
33+
// CHECK: void BaseClass::setVirtualComputedGetSet(int64_t newValue) {
34+
// CHECK-NEXT: _impl::$s5Class04BaseA0C21virtualComputedGetSets5Int64VvsTj(newValue, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
35+
36+
// CHECK: swift::Int BaseClass::getStoredProp() {
37+
// CHECK-NEXT: _impl::$s5Class04BaseA0C10storedPropSivgTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
38+
39+
// CHECK: void BaseClass::setStoredProp(swift::Int value) {
40+
// CHECK-NEXT: _impl::$s5Class04BaseA0C10storedPropSivsTj(value, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
41+
2142
// CHECK: void DerivedClass::virtualMethod() {
2243
// CHECK-NEXT: return _impl::$s5Class04BaseA0C13virtualMethodyyFTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
2344
// CHECK-NEXT: }
@@ -30,6 +51,10 @@
3051
// CHECK-NEXT: return _impl::_impl_BaseClass::makeRetained(_impl::$s5Class07DerivedA0C015virtualMethodInB0yAA04BaseA0CAFFTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(x), ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this)));
3152
// CHECK-NEXT: }
3253

54+
// CHECK: swift::Int DerivedClass::getVirtualComputedProp() {
55+
// CHECK-NEXT: _impl::$s5Class04BaseA0C19virtualComputedPropSivgTj(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
56+
57+
3358
// CHECK: void DerivedDerivedClass::virtualMethod() {
3459
// CHECK-NEXT: return _impl::$s5Class07DerivedbA0C13virtualMethodyyF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
3560
// CHECK-NEXT: }
@@ -42,3 +67,8 @@
4267
// CHECK-NEXT: return _impl::$s5Class07DerivedbA0C08methodInbB0yyF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
4368
// CHECK-NEXT: }
4469

70+
// CHECK: swift::Int DerivedDerivedClass::getStoredProp() {
71+
// CHECK-NEXT: return _impl::$s5Class07DerivedbA0C10storedPropSivg(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
72+
73+
// CHECK: swift::Int DerivedDerivedClass::getComputedPropInDerivedDerived() {
74+
// CHECK-NEXT: return _impl::$s5Class07DerivedbA0C014computedPropInbB0Sivg(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));

0 commit comments

Comments
 (0)