Skip to content

Commit cf8a5bd

Browse files
authored
Merge pull request #78974 from swiftlang/susmonteiro/operators-unnamed-param
[cxx-interop] Fix crash when operator doesn't name parameter in header
2 parents 8462105 + b7c5a47 commit cf8a5bd

11 files changed

+80
-3
lines changed

lib/ClangImporter/SwiftDeclSynthesizer.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "SwiftDeclSynthesizer.h"
1414
#include "swift/AST/ASTMangler.h"
1515
#include "swift/AST/Builtins.h"
16+
#include "swift/AST/Decl.h"
1617
#include "swift/AST/Expr.h"
1718
#include "swift/AST/ParameterList.h"
1819
#include "swift/AST/Pattern.h"
@@ -2214,7 +2215,11 @@ SwiftDeclSynthesizer::makeOperator(FuncDecl *operatorMethod,
22142215
newParams.push_back(lhsParam);
22152216

22162217
for (auto param : *paramList) {
2217-
newParams.push_back(param);
2218+
auto clonedParam = ParamDecl::clone(ctx, param);
2219+
if (clonedParam->getParameterName().empty()) {
2220+
clonedParam->setName(ctx.getIdentifier("other"));
2221+
}
2222+
newParams.push_back(clonedParam);
22182223
}
22192224

22202225
auto oldArgNames = operatorMethod->getName().getArgumentNames();

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,4 +561,10 @@ struct ClassWithSuccessorUnavailable {
561561
}
562562
};
563563

564+
struct ClassWithOperatorEqualsParamUnnamed {
565+
bool operator==(const ClassWithOperatorEqualsParamUnnamed &) const {
566+
return false;
567+
}
568+
};
569+
564570
#endif

test/Interop/Cxx/operators/Inputs/member-out-of-line.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,14 @@ int& ReadWriteIntArray::operator[](int x) {
3838

3939
int NonTrivialIntArrayByVal::operator[](int x) {
4040
return values[x];
41-
}
41+
}
42+
43+
bool ClassWithOperatorEqualsParamUnnamed::operator==(
44+
const ClassWithOperatorEqualsParamUnnamed &other) const {
45+
return false;
46+
}
47+
48+
bool ClassWithOperatorEqualsParamUnnamed::operator!=(
49+
const ClassWithOperatorEqualsParamUnnamed &) const {
50+
return true;
51+
}

test/Interop/Cxx/operators/Inputs/member-out-of-line.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,9 @@ struct __attribute__((swift_attr("import_owned"))) NonTrivialIntArrayByVal {
4444
int values[5] = { 1, 2, 3, 4, 5 };
4545
};
4646

47-
#endif
47+
struct ClassWithOperatorEqualsParamUnnamed {
48+
bool operator==(const ClassWithOperatorEqualsParamUnnamed &) const;
49+
bool operator!=(const ClassWithOperatorEqualsParamUnnamed &) const;
50+
};
51+
52+
#endif

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,13 @@ inline LoadableBoolWrapper operator||(LoadableBoolWrapper lhs, LoadableBoolWrapp
8787
return LoadableBoolWrapper{.value = lhs.value || rhs.value};
8888
}
8989

90+
struct ClassWithOperatorEqualsParamUnnamed {};
91+
92+
inline bool operator==(const ClassWithOperatorEqualsParamUnnamed &,
93+
const ClassWithOperatorEqualsParamUnnamed &) {
94+
return false;
95+
}
96+
9097
// Make sure that we don't crash on templated operators
9198
template<typename T> struct S {};
9299
template<typename T> S<T> operator+(S<T> lhs, S<T> rhs);

test/Interop/Cxx/operators/Inputs/non-member-out-of-line.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,13 @@
33
LoadableIntWrapper operator+(LoadableIntWrapper lhs, LoadableIntWrapper rhs) {
44
return LoadableIntWrapper{.value = lhs.value + rhs.value};
55
}
6+
7+
bool operator==(const ClassWithOperatorEqualsParamUnnamed &lhs,
8+
const ClassWithOperatorEqualsParamUnnamed &rhs) {
9+
return false;
10+
}
11+
12+
bool operator!=(const ClassWithOperatorEqualsParamUnnamed &,
13+
const ClassWithOperatorEqualsParamUnnamed &) {
14+
return true;
15+
}

test/Interop/Cxx/operators/Inputs/non-member-out-of-line.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,12 @@ struct LoadableIntWrapper {
77

88
LoadableIntWrapper operator+(LoadableIntWrapper lhs, LoadableIntWrapper rhs);
99

10+
struct ClassWithOperatorEqualsParamUnnamed {};
11+
12+
bool operator==(const ClassWithOperatorEqualsParamUnnamed &,
13+
const ClassWithOperatorEqualsParamUnnamed &);
14+
15+
bool operator!=(const ClassWithOperatorEqualsParamUnnamed &,
16+
const ClassWithOperatorEqualsParamUnnamed &);
17+
1018
#endif

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,4 +464,10 @@ OperatorsTestSuite.test("HasStaticOperatorCallWithConstOperator.call") {
464464
expectEqual(8, res2)
465465
}
466466

467+
OperatorsTestSuite.test("UnnamedParameterInOperator.equal") {
468+
let lhs = ClassWithOperatorEqualsParamUnnamed()
469+
let rhs = ClassWithOperatorEqualsParamUnnamed()
470+
expectFalse(lhs == rhs)
471+
}
472+
467473
runAllTests()

test/Interop/Cxx/operators/member-out-of-line.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,11 @@ OperatorsTestSuite.test("NonTrivialIntArrayByVal.subscript (out-of-line)") {
7272
expectEqual(42, result5)
7373
}
7474

75+
OperatorsTestSuite.test("UnnamedParameterInOperator.equal") {
76+
let lhs = ClassWithOperatorEqualsParamUnnamed()
77+
let rhs = ClassWithOperatorEqualsParamUnnamed()
78+
expectFalse(lhs == rhs)
79+
expectTrue(lhs != rhs)
80+
}
81+
7582
runAllTests()

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,10 @@ OperatorsTestSuite.test("pipe pipe (||)") {
187187
expectEqual(true, result.value)
188188
}
189189

190+
OperatorsTestSuite.test("UnnamedParameterInOperator.equal") {
191+
let lhs = ClassWithOperatorEqualsParamUnnamed()
192+
let rhs = ClassWithOperatorEqualsParamUnnamed()
193+
expectFalse(lhs == rhs)
194+
}
195+
190196
runAllTests()

test/Interop/Cxx/operators/non-member-out-of-line.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,11 @@ OperatorsTestSuite.test("plus") {
2020
expectEqual(65, result.value)
2121
}
2222

23+
OperatorsTestSuite.test("UnnamedParameterInOperator.equal") {
24+
let lhs = ClassWithOperatorEqualsParamUnnamed()
25+
let rhs = ClassWithOperatorEqualsParamUnnamed()
26+
expectFalse(lhs == rhs)
27+
expectTrue(lhs != rhs)
28+
}
29+
2330
runAllTests()

0 commit comments

Comments
 (0)