Skip to content

Commit 379fc1f

Browse files
authored
[cxx-interop] Fix issue where multiple records in a module containing the same meth… (#60338)
1 parent 2304bb9 commit 379fc1f

File tree

5 files changed

+43
-28
lines changed

5 files changed

+43
-28
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2110,16 +2110,18 @@ namespace {
21102110
for (auto m : decl->decls()) {
21112111
if (auto method = dyn_cast<clang::CXXMethodDecl>(m)) {
21122112
if (method->getDeclName().isIdentifier()) {
2113-
if (Impl.cxxMethods.find(method->getName()) ==
2114-
Impl.cxxMethods.end()) {
2115-
Impl.cxxMethods[method->getName()] = {};
2113+
auto contextMap = Impl.cxxMethods.find(method->getDeclContext());
2114+
if (contextMap == Impl.cxxMethods.end() ||
2115+
contextMap->second.find(method->getName()) ==
2116+
contextMap->second.end()) {
2117+
Impl.cxxMethods[method->getDeclContext()][method->getName()] = {};
21162118
}
21172119
if (method->isConst()) {
21182120
// Add to const set
2119-
Impl.cxxMethods[method->getName()].first.insert(method);
2121+
Impl.cxxMethods[method->getDeclContext()][method->getName()].first.insert(method);
21202122
} else {
21212123
// Add to mutable set
2122-
Impl.cxxMethods[method->getName()].second.insert(method);
2124+
Impl.cxxMethods[method->getDeclContext()][method->getName()].second.insert(method);
21232125
}
21242126
}
21252127
}
@@ -2258,8 +2260,11 @@ namespace {
22582260
}
22592261

22602262
if (cxxMethod->getDeclName().isIdentifier()) {
2261-
auto &mutableFuncPtrs = Impl.cxxMethods[cxxMethod->getName()].second;
2262-
if(mutableFuncPtrs.contains(cxxMethod)) {
2263+
auto &mutableFuncPtrs =
2264+
Impl.cxxMethods[cxxMethod->getDeclContext()]
2265+
[cxxMethod->getName()]
2266+
.second;
2267+
if (mutableFuncPtrs.contains(cxxMethod)) {
22632268
result->addMemberToLookupTable(member);
22642269
}
22652270
}
@@ -2977,7 +2982,7 @@ namespace {
29772982
// In such a case append a suffix ("Mutating") to the mutable version
29782983
// of the method when importing to swift
29792984
if(decl->getDeclName().isIdentifier()) {
2980-
const auto &cxxMethodPair = Impl.cxxMethods[decl->getName()];
2985+
const auto &cxxMethodPair = Impl.cxxMethods[decl->getDeclContext()][decl->getName()];
29812986
const auto &constFuncPtrs = cxxMethodPair.first;
29822987
const auto &mutFuncPtrs = cxxMethodPair.second;
29832988

lib/ClangImporter/ImporterImpl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,10 +615,10 @@ class LLVM_LIBRARY_VISIBILITY ClangImporter::Implementation
615615

616616
/// Keep track of cxx function names, params etc in order to
617617
/// allow for de-duping functions that differ strictly on "constness".
618-
llvm::DenseMap<llvm::StringRef,
618+
llvm::DenseMap<const clang::DeclContext *, llvm::DenseMap<llvm::StringRef,
619619
std::pair<
620620
llvm::DenseSet<clang::FunctionDecl *>,
621-
llvm::DenseSet<clang::FunctionDecl *>>>
621+
llvm::DenseSet<clang::FunctionDecl *>>>>
622622
cxxMethods;
623623

624624
// Cache for already-specialized function templates and any thunks they may

test/Interop/Cxx/class/method/Inputs/ambiguous_methods.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,10 @@ struct HasAmbiguousMethods {
4141
int mutableMethodsCalledCount = 0;
4242
};
4343

44+
struct HasAmbiguousMethods2 {
45+
int increment(int a) const {
46+
return a + 1;
47+
}
48+
};
49+
4450
#endif // TEST_INTEROP_CXX_CLASS_AMBIGUOUS_METHOD_METHODS_H

test/Interop/Cxx/class/method/ambiguous-methods-module-interface.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@
1111

1212
// CHECK: func numberOfMutableMethodsCalled() -> Int32
1313
// CHECK: mutating func numberOfMutableMethodsCalledMutating() -> Int32
14+
15+
// CHECK: struct HasAmbiguousMethods2
16+
// CHECK: func increment(_ a: Int32) -> Int32
17+
// CHECK-NOT: mutating func incrementMutating(_ a: Int32) -> Int32

test/Interop/Cxx/ergonomics/implicit-computed-properties-module-interface.swift

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
// CHECK: struct VoidGetter {
44
// CHECK-NOT: var
55
// CHECK-NEXT: init()
6-
// CHECK-NEXT: mutating func getXMutating()
7-
// CHECK-NEXT: mutating func setXMutating(_: Int32)
6+
// CHECK-NEXT: mutating func getX()
7+
// CHECK-NEXT: mutating func setX(_: Int32)
88
// CHECK-NEXT: }
99

1010
// CHECK: struct VoidSetterNoName {
@@ -16,13 +16,13 @@
1616
// CHECK: struct IllegalIntReturnSetter {
1717
// CHECK-NOT: var
1818
// CHECK-NEXT: init()
19-
// CHECK-NEXT: mutating func setXMutating(_: Int32) -> Int32
19+
// CHECK-NEXT: mutating func setX(_: Int32) -> Int32
2020
// CHECK-NEXT: }
2121

2222
// CHECK: struct TwoParameterSetter {
2323
// CHECK-NOT: var
2424
// CHECK-NEXT: init()
25-
// CHECK-NEXT: mutating func setXMutating(_: Int32, _: Int32)
25+
// CHECK-NEXT: mutating func setX(_: Int32, _: Int32)
2626
// CHECK-NEXT: }
2727

2828
// CHECK: struct NoNameSetter {
@@ -88,15 +88,15 @@
8888

8989
// CHECK: struct NotypeSetter {
9090
// CHECK-NEXT: init()
91-
// CHECK-NEXT: mutating func setXMutating()
91+
// CHECK-NEXT: mutating func setX()
9292
// CHECK-NEXT: }
9393

9494
// CHECK: struct IntGetterSetter {
9595
// CHECK-NEXT: init()
9696
// CHECK-NEXT: init(val: Int32)
9797
// CHECK-NEXT: var x: Int32
9898
// CHECK-NEXT: func getX() -> Int32
99-
// CHECK-NEXT: mutating func setXMutating(_ v: Int32)
99+
// CHECK-NEXT: mutating func setX(_ v: Int32)
100100
// CHECK-NEXT: var val: Int32
101101
// CHECK-NEXT: }
102102

@@ -120,7 +120,7 @@
120120
// CHECK: struct GetterHasArg {
121121
// CHECK-NEXT: init()
122122
// CHECK-NEXT: func getX(_ v: Int32) -> Int32
123-
// CHECK-NEXT: mutating func setXMutating(_ v: Int32)
123+
// CHECK-NEXT: mutating func setX(_ v: Int32)
124124
// CHECK-NEXT: }
125125

126126
// CHECK: struct GetterSetterIsUpper {
@@ -172,8 +172,8 @@
172172
// CHECK-NEXT: init()
173173
// CHECK-NEXT: init(val: Int32)
174174
// CHECK-NEXT: var x: Int32 { mutating get set }
175-
// CHECK-NEXT: mutating func getXMutating() -> Int32
176-
// CHECK-NEXT: mutating func setXMutating(_ v: Int32)
175+
// CHECK-NEXT: mutating func getX() -> Int32
176+
// CHECK-NEXT: mutating func setX(_ v: Int32)
177177
// CHECK-NEXT: var val: Int32
178178
// CHECK-NEXT: }
179179

@@ -191,7 +191,7 @@
191191
// CHECK-NEXT: init()
192192
// CHECK-NEXT: var x: Int32
193193
// CHECK-NEXT: func getX() -> Int32
194-
// CHECK-NEXT: mutating func setXMutating(_ a: Int32, _ b: Int32)
194+
// CHECK-NEXT: mutating func setX(_ a: Int32, _ b: Int32)
195195
// CHECK-NEXT: }
196196

197197
// CHECK: struct NonTrivial {
@@ -204,33 +204,33 @@
204204
// CHECK-NEXT: init()
205205
// CHECK-NEXT: init(value: Int32)
206206
// CHECK-NEXT: var x: UnsafeMutablePointer<Int32>? { mutating get set }
207-
// CHECK-NEXT: mutating func getXMutating() -> UnsafeMutablePointer<Int32>!
208-
// CHECK-NEXT: mutating func setXMutating(_ v: UnsafeMutablePointer<Int32>!)
207+
// CHECK-NEXT: mutating func getX() -> UnsafeMutablePointer<Int32>!
208+
// CHECK-NEXT: mutating func setX(_ v: UnsafeMutablePointer<Int32>!)
209209
// CHECK-NEXT: var value: Int32
210210
// CHECK-NEXT: }
211211

212212
// CHECK: struct RefGetterSetter {
213213
// CHECK-NEXT: init()
214214
// CHECK-NEXT: init(value: Int32)
215-
// CHECK-NEXT: mutating func getXMutating() -> UnsafePointer<Int32>
216-
// CHECK-NEXT: mutating func setXMutating(_ v: Int32)
215+
// CHECK-NEXT: mutating func getX() -> UnsafePointer<Int32>
216+
// CHECK-NEXT: mutating func setX(_ v: Int32)
217217
// CHECK-NEXT: var value: Int32
218218
// CHECK-NEXT: }
219219

220220
// CHECK: struct NonTrivialGetterSetter {
221221
// CHECK-NEXT: init()
222222
// CHECK-NEXT: init(value: NonTrivial)
223223
// CHECK-NEXT: var x: NonTrivial { mutating get set }
224-
// CHECK-NEXT: mutating func getXMutating() -> NonTrivial
225-
// CHECK-NEXT: mutating func setXMutating(_ v: NonTrivial)
224+
// CHECK-NEXT: mutating func getX() -> NonTrivial
225+
// CHECK-NEXT: mutating func setX(_ v: NonTrivial)
226226
// CHECK-NEXT: var value: NonTrivial
227227
// CHECK-NEXT: }
228228

229229
// CHECK: struct DifferentTypes {
230230
// CHECK-NEXT: init()
231231
// CHECK-NEXT: init(value: NonTrivial)
232-
// CHECK-NEXT: mutating func getXMutating() -> NonTrivial
233-
// CHECK-NEXT: mutating func setXMutating(_ v: Int32)
232+
// CHECK-NEXT: mutating func getX() -> NonTrivial
233+
// CHECK-NEXT: mutating func setX(_ v: Int32)
234234
// CHECK-NEXT: var value: NonTrivial
235235
// CHECK-NEXT: }
236236

0 commit comments

Comments
 (0)