Skip to content

Commit 01670cd

Browse files
authored
Merge pull request #70325 from apple/egorzhdan/friend-operator-lookup
[cxx-interop] Add friend operators to the lookup table properly
2 parents 46d37d2 + af0f1fb commit 01670cd

File tree

7 files changed

+35
-8
lines changed

7 files changed

+35
-8
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2240,10 +2240,6 @@ namespace {
22402240
if (auto friendDecl = dyn_cast<clang::FriendDecl>(m)) {
22412241
if (friendDecl->getFriendDecl()) {
22422242
m = friendDecl->getFriendDecl();
2243-
2244-
auto lookupTable = Impl.findLookupTable(decl);
2245-
addEntryToLookupTable(*lookupTable, friendDecl->getFriendDecl(),
2246-
Impl.getNameImporter());
22472243
}
22482244
}
22492245

@@ -2986,7 +2982,11 @@ namespace {
29862982
// This cannot be done when building the lookup table,
29872983
// because templates are instantiated lazily.
29882984
for (auto member : def->decls()) {
2989-
if (auto method = dyn_cast<clang::CXXMethodDecl>(member)) {
2985+
if (auto friendDecl = dyn_cast<clang::FriendDecl>(member))
2986+
if (auto underlyingDecl = friendDecl->getFriendDecl())
2987+
member = underlyingDecl;
2988+
2989+
if (auto method = dyn_cast<clang::FunctionDecl>(member)) {
29902990
if (method->isOverloadedOperator()) {
29912991
addEntryToLookupTable(*Impl.findLookupTable(decl), method,
29922992
Impl.getNameImporter());

lib/ClangImporter/SwiftLookupTable.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1965,6 +1965,10 @@ void importer::addEntryToLookupTable(SwiftLookupTable &table,
19651965
isa<clang::ObjCCategoryDecl>(named)) {
19661966
clang::DeclContext *dc = cast<clang::DeclContext>(named);
19671967
for (auto member : dc->decls()) {
1968+
if (auto friendDecl = dyn_cast<clang::FriendDecl>(member))
1969+
if (auto underlyingDecl = friendDecl->getFriendDecl())
1970+
member = underlyingDecl;
1971+
19681972
if (auto namedMember = dyn_cast<clang::NamedDecl>(member))
19691973
addEntryToLookupTable(table, namedMember, nameImporter);
19701974
}

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct LoadableIntWrapper {
3030
}
3131

3232
// Friend functions
33-
friend bool operator==(const LoadableIntWrapper lhs,
33+
friend bool operator==(const LoadableIntWrapper &lhs,
3434
const LoadableIntWrapper &rhs) {
3535
return lhs.value == rhs.value;
3636
}
@@ -45,6 +45,16 @@ struct LoadableIntWrapper {
4545
}
4646
};
4747

48+
namespace NS {
49+
struct IntWrapperInNamespace {
50+
int value;
51+
friend bool operator==(const IntWrapperInNamespace &lhs,
52+
const IntWrapperInNamespace &rhs) {
53+
return lhs.value == rhs.value;
54+
}
55+
};
56+
} // namespace NS
57+
4858
struct LoadableBoolWrapper {
4959
bool value;
5060
LoadableBoolWrapper operator!() {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
// CHECK: mutating func callAsFunction(_ x: Int32) -> Int32
99
// CHECK: mutating func callAsFunction(_ x: Int32, _ y: Int32) -> Int32
1010
// CHECK: }
11+
// CHECK: func == (lhs: LoadableIntWrapper, rhs: LoadableIntWrapper) -> Bool
12+
// CHECK: func -= (lhs: inout LoadableIntWrapper, rhs: LoadableIntWrapper)
13+
14+
// CHECK: func == (lhs: NS.IntWrapperInNamespace, rhs: NS.IntWrapperInNamespace) -> Bool
1115

1216
// CHECK: struct LoadableBoolWrapper
1317
// CHECK: prefix static func ! (lhs: inout LoadableBoolWrapper) -> LoadableBoolWrapper

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,15 @@ OperatorsTestSuite.test("LoadableIntWrapper.successor() (inline)") {
8383
expectEqual(42, wrapper.value)
8484
}
8585

86+
OperatorsTestSuite.test("IntWrapperInNamespace.equal (inline)") {
87+
let lhs = NS.IntWrapperInNamespace(value: 42)
88+
let rhs = NS.IntWrapperInNamespace(value: 42)
89+
90+
let result = lhs == rhs
91+
92+
expectTrue(result)
93+
}
94+
8695
OperatorsTestSuite.test("TemplatedWithFriendOperator.equal (inline)") {
8796
let lhs = TemplatedWithFriendOperatorSpec()
8897
let rhs = TemplatedWithFriendOperatorSpec()

test/Interop/Cxx/stdlib/print-libcxx-module-interface.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// REQUIRES: OS=macosx
44

55
// CHECK: enum std {
6-
// CHECK-NEXT: enum __1 {
6+
// CHECK: enum __1 {
77

88
// CHECK: typealias string =
99

test/Interop/Cxx/symbolic-imports/print-libcxx-symbolic-module-interface.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// REQUIRES: OS=macosx
99

1010
// CHECK: enum std {
11-
// CHECK-NEXT: enum __1 {
11+
// CHECK: enum __1 {
1212

1313
// STRING: struct basic_string {
1414

0 commit comments

Comments
 (0)