Skip to content

Commit 0296448

Browse files
committed
[cxx-interop] fix the use of '.pointee' with getter accessor for derived-to-base synthesized accessor
1 parent 16a8ae4 commit 0296448

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5450,8 +5450,10 @@ makeBaseClassMemberAccessors(DeclContext *declContext,
54505450
auto computedType = computedVar->getInterfaceType();
54515451

54525452
// Use 'address' or 'mutableAddress' accessors for non-copyable
5453-
// types.
5454-
bool useAddress = computedType->isNoncopyable(declContext);
5453+
// types, unless the base accessor returns it by value.
5454+
bool useAddress = computedType->isNoncopyable(declContext) &&
5455+
(baseClassVar->getReadImpl() == ReadImplKind::Stored ||
5456+
baseClassVar->getAccessor(AccessorKind::Address));
54555457

54565458
ParameterList *bodyParams = nullptr;
54575459
if (auto subscript = dyn_cast<SubscriptDecl>(baseClassVar)) {

test/Interop/Cxx/operators/move-only/Inputs/move-only-cxx-value-operators.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,6 @@ using NonCopyableHolderMutDerefDerivedDerived = OneDerived<OneDerived<NonCopyabl
7474

7575
using NonCopyableHolderValueConstDerefDerivedDerived = OneDerived<OneDerived<NonCopyableHolderValueConstDeref>>;
7676

77+
using NonCopyableHolderValueMutDerefDerivedDerived = OneDerived<OneDerived<NonCopyableHolderValueMutDeref>>;
78+
7779
#endif // TEST_INTEROP_CXX_OPERATORS_MOVE_ONLY_OPS_H

test/Interop/Cxx/operators/move-only/move-only-synthesized-properties.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,20 @@ MoveOnlyCxxOperators.test("testNonCopyableHolderMutDerefDerivedDerived pointee b
129129
expectEqual(holder.pointee.x, 0)
130130
}
131131

132+
MoveOnlyCxxOperators.test("testNonCopyableHolderValueConstDerefDerivedDerived pointee value") {
133+
let holder = NonCopyableHolderValueConstDerefDerivedDerived(11)
134+
var k = holder.pointee
135+
expectEqual(k.x, 11)
136+
var k2 = holder.pointee
137+
expectEqual(k.x, k2.x)
138+
}
139+
140+
MoveOnlyCxxOperators.test("testNonCopyableHolderValueMutDerefDerivedDerived pointee value") {
141+
let holder = NonCopyableHolderValueMutDerefDerivedDerived(23)
142+
var k = holder.pointee
143+
expectEqual(k.x, 23)
144+
var k2 = holder.pointee
145+
expectEqual(k.x, k2.x)
146+
}
147+
132148
runAllTests()

0 commit comments

Comments
 (0)