Skip to content

Commit 764a4d2

Browse files
authored
Merge pull request swiftlang#61269 from zoecarver/plus-equals
[cxx-interop] Add plus-equal, minus-equal, star-equal, slash-equal operators.
2 parents 3292f4e + da2791e commit 764a4d2

File tree

5 files changed

+64
-0
lines changed

5 files changed

+64
-0
lines changed

lib/ClangImporter/ImportName.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,6 +1858,10 @@ ImportedName NameImporter::importNameImpl(const clang::NamedDecl *D,
18581858
case clang::OverloadedOperatorKind::OO_Minus:
18591859
case clang::OverloadedOperatorKind::OO_Star:
18601860
case clang::OverloadedOperatorKind::OO_Slash:
1861+
case clang::OverloadedOperatorKind::OO_PlusEqual:
1862+
case clang::OverloadedOperatorKind::OO_MinusEqual:
1863+
case clang::OverloadedOperatorKind::OO_StarEqual:
1864+
case clang::OverloadedOperatorKind::OO_SlashEqual:
18611865
case clang::OverloadedOperatorKind::OO_Percent:
18621866
case clang::OverloadedOperatorKind::OO_Caret:
18631867
case clang::OverloadedOperatorKind::OO_Amp:

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ struct LoadableIntWrapper {
77
return LoadableIntWrapper{.value = value - rhs.value};
88
}
99

10+
LoadableIntWrapper operator+=(LoadableIntWrapper rhs) {
11+
value += rhs.value;
12+
return *this;
13+
}
14+
1015
int operator()() {
1116
return value;
1217
}
@@ -31,6 +36,11 @@ struct LoadableIntWrapper {
3136
friend LoadableIntWrapper operator-(const LoadableIntWrapper& obj) {
3237
return LoadableIntWrapper{.value = -obj.value};
3338
}
39+
40+
friend LoadableIntWrapper operator-=(LoadableIntWrapper& lhs, const LoadableIntWrapper& rhs) {
41+
lhs.value -= rhs.value;
42+
return lhs;
43+
}
3444
};
3545

3646
struct LoadableBoolWrapper {

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,16 @@ inline bool operator>=(LoadableIntWrapper lhs, LoadableIntWrapper rhs) {
6565
return lhs.value != rhs.value;
6666
}
6767

68+
inline LoadableIntWrapper operator/=(LoadableIntWrapper &lhs, LoadableIntWrapper rhs) {
69+
lhs.value /= rhs.value;
70+
return lhs;
71+
}
72+
73+
inline LoadableIntWrapper operator*=(LoadableIntWrapper &lhs, LoadableIntWrapper rhs) {
74+
lhs.value *= rhs.value;
75+
return lhs;
76+
}
77+
6878
struct LoadableBoolWrapper {
6979
bool value;
7080
};

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,26 @@ OperatorsTestSuite.test("LoadableIntWrapper.equal (inline)") {
3838
expectTrue(result)
3939
}
4040

41+
OperatorsTestSuite.test("LoadableIntWrapper.plusEqual (inline)") {
42+
var lhs = LoadableIntWrapper(value: 42)
43+
let rhs = LoadableIntWrapper(value: 42)
44+
45+
let result = lhs += rhs
46+
47+
expectEqual(lhs.value, 84)
48+
expectEqual(result.value, 84)
49+
}
50+
51+
OperatorsTestSuite.test("LoadableIntWrapper.minusEqual (inline)") {
52+
var lhs = LoadableIntWrapper(value: 42)
53+
let rhs = LoadableIntWrapper(value: 42)
54+
55+
let result = lhs -= rhs
56+
57+
expectEqual(lhs.value, 0)
58+
expectEqual(result.value, 0)
59+
}
60+
4161
OperatorsTestSuite.test("LoadableIntWrapper.unaryMinus (inline)") {
4262
let lhs = LoadableIntWrapper(value: 42)
4363
let inverseLhs = -lhs;

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,26 @@ OperatorsTestSuite.test("greater equal (>=)") {
151151
expectEqual(true, result)
152152
}
153153

154+
OperatorsTestSuite.test("slash equal (/=)") {
155+
var lhs = LoadableIntWrapper(value: 8)
156+
let rhs = LoadableIntWrapper(value: 2)
157+
158+
let result = lhs /= rhs
159+
160+
expectEqual(lhs.value, 4)
161+
expectEqual(result.value, 4)
162+
}
163+
164+
OperatorsTestSuite.test("star equal (*=)") {
165+
var lhs = LoadableIntWrapper(value: 8)
166+
let rhs = LoadableIntWrapper(value: 2)
167+
168+
let result = lhs *= rhs
169+
170+
expectEqual(lhs.value, 16)
171+
expectEqual(result.value, 16)
172+
}
173+
154174
OperatorsTestSuite.test("amp amp (&&)") {
155175
let lhs = LoadableBoolWrapper(value: true)
156176
let rhs = LoadableBoolWrapper(value: false)

0 commit comments

Comments
 (0)