Skip to content

Commit 87311a8

Browse files
committed
fix: overloads finalizer preemptively emplaces members
This avoids infinite recursion between using directives and namespaces.
1 parent 3388ecd commit 87311a8

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

src/lib/Metadata/Finalizers/OverloadsFinalizer.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ OverloadsFinalizer::
263263
operator()(NamespaceInfo& I)
264264
{
265265
MRDOCS_CHECK_OR(!finalized_.contains(I.id));
266+
finalized_.emplace(I.id);
267+
266268
foldOverloads(I.id, I.Members.Functions, true);
267269
for (RecordInfo& RI: toDerivedView<RecordInfo>(I.Members.Records, corpus_))
268270
{
@@ -276,14 +278,15 @@ operator()(NamespaceInfo& I)
276278
{
277279
operator()(UI);
278280
}
279-
finalized_.emplace(I.id);
280281
}
281282

282283
void
283284
OverloadsFinalizer::
284285
operator()(RecordInfo& I)
285286
{
286287
MRDOCS_CHECK_OR(!finalized_.contains(I.id));
288+
finalized_.emplace(I.id);
289+
287290
for (auto& b: I.Bases)
288291
{
289292
auto& BT = b.Type;
@@ -314,14 +317,15 @@ operator()(RecordInfo& I)
314317
for (RecordInfo& RI: toDerivedView<RecordInfo>(I.Interface.Private.Records, corpus_)) {
315318
operator()(RI);
316319
}
317-
finalized_.emplace(I.id);
318320
}
319321

320322
void
321323
OverloadsFinalizer::
322324
operator()(UsingInfo& I)
323325
{
324326
MRDOCS_CHECK_OR(!finalized_.contains(I.id));
327+
finalized_.emplace(I.id);
328+
325329
auto shadowFunctions = toDerivedView<FunctionInfo>(I.ShadowDeclarations, corpus_);
326330
for (FunctionInfo& FI: shadowFunctions)
327331
{
@@ -338,7 +342,6 @@ operator()(UsingInfo& I)
338342
break;
339343
}
340344
foldOverloads(I.id, I.ShadowDeclarations, true);
341-
finalized_.emplace(I.id);
342345
}
343346

344347
} // clang::mrdocs

0 commit comments

Comments
 (0)