Skip to content

Commit 1ce18b8

Browse files
committed
Pass inheritingDecl through ClangRecordMemberLookup requests
1 parent 94a7599 commit 1ce18b8

File tree

3 files changed

+30
-13
lines changed

3 files changed

+30
-13
lines changed

include/swift/ClangImporter/ClangImporterRequests.h

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,29 +134,43 @@ class CXXNamespaceMemberLookup
134134
/// The input type for a record member lookup request.
135135
struct ClangRecordMemberLookupDescriptor final {
136136
NominalTypeDecl *recordDecl;
137+
NominalTypeDecl *inheritingDecl;
137138
DeclName name;
138-
bool inherited;
139139

140-
ClangRecordMemberLookupDescriptor(NominalTypeDecl *recordDecl, DeclName name,
141-
bool inherited = false)
142-
: recordDecl(recordDecl), name(name), inherited(inherited) {
140+
ClangRecordMemberLookupDescriptor(NominalTypeDecl *recordDecl, DeclName name)
141+
: recordDecl(recordDecl), inheritingDecl(recordDecl), name(name) {
143142
assert(isa<clang::RecordDecl>(recordDecl->getClangDecl()));
144143
}
145144

146145
friend llvm::hash_code
147146
hash_value(const ClangRecordMemberLookupDescriptor &desc) {
148-
return llvm::hash_combine(desc.name, desc.recordDecl);
147+
return llvm::hash_combine(desc.name, desc.recordDecl, desc.inheritingDecl);
149148
}
150149

151150
friend bool operator==(const ClangRecordMemberLookupDescriptor &lhs,
152151
const ClangRecordMemberLookupDescriptor &rhs) {
153-
return lhs.name == rhs.name && lhs.recordDecl == rhs.recordDecl;
152+
return lhs.name == rhs.name && lhs.recordDecl == rhs.recordDecl &&
153+
lhs.inheritingDecl == rhs.inheritingDecl;
154154
}
155155

156156
friend bool operator!=(const ClangRecordMemberLookupDescriptor &lhs,
157157
const ClangRecordMemberLookupDescriptor &rhs) {
158158
return !(lhs == rhs);
159159
}
160+
161+
private:
162+
friend class ClangRecordMemberLookup;
163+
164+
// This private constructor should only be used in ClangRecordMemberLookup,
165+
// for recursively traversing base classes that inheritingDecl inherites from.
166+
ClangRecordMemberLookupDescriptor(NominalTypeDecl *recordDecl, DeclName name,
167+
NominalTypeDecl *inheritingDecl)
168+
: recordDecl(recordDecl), inheritingDecl(inheritingDecl), name(name) {
169+
assert(isa<clang::RecordDecl>(recordDecl->getClangDecl()));
170+
assert(isa<clang::CXXRecordDecl>(inheritingDecl->getClangDecl()));
171+
assert(recordDecl != inheritingDecl &&
172+
"recursive calls should lookup elsewhere");
173+
}
160174
};
161175

162176
void simple_display(llvm::raw_ostream &out,

lib/AST/NameLookupRequests.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,9 @@ void swift::simple_display(llvm::raw_ostream &out,
539539
simple_display(out, desc.name);
540540
out << " in ";
541541
simple_display(out, desc.recordDecl);
542+
if (desc.recordDecl != desc.inheritingDecl)
543+
out << " inherited by ";
544+
simple_display(out, desc.inheritingDecl);
542545
}
543546

544547
SourceLoc

lib/ClangImporter/ClangImporter.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6149,8 +6149,8 @@ cloneBaseMemberDecl(ValueDecl *decl, DeclContext *newContext) {
61496149
TinyPtrVector<ValueDecl *> ClangRecordMemberLookup::evaluate(
61506150
Evaluator &evaluator, ClangRecordMemberLookupDescriptor desc) const {
61516151
NominalTypeDecl *recordDecl = desc.recordDecl;
6152+
NominalTypeDecl *inheritingDecl = desc.inheritingDecl;
61526153
DeclName name = desc.name;
6153-
bool inherited = desc.inherited;
61546154

61556155
auto &ctx = recordDecl->getASTContext();
61566156
auto allResults = evaluateOrDefault(
@@ -6204,11 +6204,11 @@ TinyPtrVector<ValueDecl *> ClangRecordMemberLookup::evaluate(
62046204
continue;
62056205

62066206
// Add Clang members that are imported lazily.
6207-
auto baseResults =
6208-
evaluateOrDefault(ctx.evaluator,
6209-
ClangRecordMemberLookup(
6210-
{cast<NominalTypeDecl>(import), name, true}),
6211-
{});
6207+
auto baseResults = evaluateOrDefault(
6208+
ctx.evaluator,
6209+
ClangRecordMemberLookup(
6210+
{cast<NominalTypeDecl>(import), name, inheritingDecl}),
6211+
{});
62126212
// Add members that are synthesized eagerly, such as subscripts.
62136213
for (auto member :
62146214
cast<NominalTypeDecl>(import)->getCurrentMembersWithoutLoading()) {
@@ -6237,7 +6237,7 @@ TinyPtrVector<ValueDecl *> ClangRecordMemberLookup::evaluate(
62376237
//
62386238
// Instead, we simply pass on the imported decl (foundInBase) as is,
62396239
// so that only the top-most request calls importBaseMemberDecl().
6240-
if (inherited) {
6240+
if (inheritingDecl != recordDecl) {
62416241
result.push_back(foundInBase);
62426242
continue;
62436243
}

0 commit comments

Comments
 (0)