Skip to content

Commit 0f1ef6d

Browse files
committed
[cxx-interop] Add tests for operator++() that returns void
This pattern was discovered on `llvm::detail::SafeIntIterator` (`llvm/ADT/Sequence.h:153`): ```cpp // Pre Increment/Decrement void operator++() { offset(1); } void operator--() { offset(-1); } ``` rdar://95684692
1 parent 1c6055a commit 0f1ef6d

File tree

4 files changed

+49
-1
lines changed

4 files changed

+49
-1
lines changed

test/Interop/Cxx/operators/Inputs/member-inline.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,12 @@ struct HasPostIncrementOperator {
7070

7171
struct HasPreIncrementOperatorWithAnotherReturnType {
7272
int value = 0;
73-
const int &operator++() { return value; }
73+
const int &operator++() { return ++value; }
74+
};
75+
76+
struct HasPreIncrementOperatorWithVoidReturnType {
77+
int value = 0;
78+
void operator++() { ++value; }
7479
};
7580

7681
struct HasDeletedOperator {

test/Interop/Cxx/operators/member-inline-module-interface.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,17 @@
1818
// CHECK: mutating func callAsFunction(_ x: Int32, _ y: Int32) -> Int32
1919
// CHECK: }
2020

21+
// CHECK: struct HasPostIncrementOperator {
22+
// CHECK: }
23+
24+
// CHECK: struct HasPreIncrementOperatorWithAnotherReturnType {
25+
// CHECK: func successor() -> HasPreIncrementOperatorWithAnotherReturnType
26+
// CHECK: }
27+
28+
// CHECK: struct HasPreIncrementOperatorWithVoidReturnType {
29+
// CHECK: func successor() -> HasPreIncrementOperatorWithVoidReturnType
30+
// CHECK: }
31+
2132
// CHECK: struct HasDeletedOperator {
2233
// CHECK: }
2334

test/Interop/Cxx/operators/member-inline-typechecker.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,9 @@ let diffTypesResultDoubleByVal: Double = diffTypesArrayByVal[0.5]
4343

4444
let postIncrement = HasPostIncrementOperator()
4545
postIncrement.successor() // expected-error {{value of type 'HasPostIncrementOperator' has no member 'successor'}}
46+
47+
let anotherReturnType = HasPreIncrementOperatorWithAnotherReturnType()
48+
let anotherReturnTypeResult: HasPreIncrementOperatorWithAnotherReturnType = anotherReturnType.successor()
49+
50+
let voidReturnType = HasPreIncrementOperatorWithVoidReturnType()
51+
let voidReturnTypeResult: HasPreIncrementOperatorWithVoidReturnType = voidReturnType.successor()

test/Interop/Cxx/operators/member-inline.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,32 @@ OperatorsTestSuite.test("AddressOnlyIntWrapper.successor() (inline)") {
8484
expectEqual(0, wrapper.value)
8585
}
8686

87+
OperatorsTestSuite.test("HasPreIncrementOperatorWithAnotherReturnType.successor() (inline)") {
88+
var wrapper = HasPreIncrementOperatorWithAnotherReturnType()
89+
90+
let result1 = wrapper.successor()
91+
expectEqual(1, result1.value)
92+
expectEqual(0, wrapper.value) // Calling `successor()` should not mutate `wrapper`.
93+
94+
let result2 = result1.successor()
95+
expectEqual(2, result2.value)
96+
expectEqual(1, result1.value)
97+
expectEqual(0, wrapper.value)
98+
}
99+
100+
OperatorsTestSuite.test("HasPreIncrementOperatorWithVoidReturnType.successor() (inline)") {
101+
var wrapper = HasPreIncrementOperatorWithVoidReturnType()
102+
103+
let result1 = wrapper.successor()
104+
expectEqual(1, result1.value)
105+
expectEqual(0, wrapper.value) // Calling `successor()` should not mutate `wrapper`.
106+
107+
let result2 = result1.successor()
108+
expectEqual(2, result2.value)
109+
expectEqual(1, result1.value)
110+
expectEqual(0, wrapper.value)
111+
}
112+
87113
OperatorsTestSuite.test("DerivedFromAddressOnlyIntWrapper.call (inline, base class)") {
88114
var wrapper = DerivedFromAddressOnlyIntWrapper(42)
89115

0 commit comments

Comments
 (0)