Skip to content

Commit 2a0a8eb

Browse files
committed
fix: avoid infinite recursion in OverloadsFinalizer
1 parent 287e588 commit 2a0a8eb

File tree

9 files changed

+1411
-2
lines changed

9 files changed

+1411
-2
lines changed

src/lib/Metadata/Finalizers/OverloadsFinalizer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ void
188188
OverloadsFinalizer::
189189
operator()(RecordInfo& I)
190190
{
191-
MRDOCS_CHECK_OR(!finalized_.contains(I.id));
191+
MRDOCS_CHECK_OR(finalized_.emplace(I.id).second);
192+
192193
for (auto& b: I.Bases)
193194
{
194195
auto& BT = b.Type;
@@ -213,7 +214,6 @@ operator()(RecordInfo& I)
213214
foldRecordMembers(I.Interface.Public.Records);
214215
foldRecordMembers(I.Interface.Protected.Records);
215216
foldRecordMembers(I.Interface.Private.Records);
216-
finalized_.emplace(I.id);
217217
}
218218

219219
} // clang::mrdocs
Lines changed: 342 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,342 @@
1+
= Reference
2+
:mrdocs:
3+
4+
[#index]
5+
== Global namespace
6+
7+
=== Types
8+
9+
[cols=1]
10+
|===
11+
| Name
12+
| <<Base1,`Base1`>>
13+
| <<Base2,`Base2`>>
14+
| <<BaseBase1,`BaseBase1`>>
15+
| <<BaseBase2,`BaseBase2`>>
16+
| <<User,`User`>>
17+
|===
18+
19+
[#Base1]
20+
== Base1
21+
22+
=== Synopsis
23+
24+
Declared in `&lt;bases&period;cpp&gt;`
25+
26+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
27+
----
28+
struct Base1
29+
: <<BaseBase1,BaseBase1>>;
30+
----
31+
32+
=== Base Classes
33+
34+
[cols=2]
35+
|===
36+
| Name
37+
| Description
38+
| `<<BaseBase1,BaseBase1>>`
39+
|
40+
|===
41+
42+
=== Member Functions
43+
44+
[cols=2]
45+
|===
46+
| Name
47+
| Description
48+
| <<Base1-foo-0b,`foo`>>
49+
|
50+
|===
51+
52+
=== Derived Classes
53+
54+
[cols=2]
55+
|===
56+
| Name
57+
| Description
58+
| <<User,`User`>>
59+
|
60+
|===
61+
62+
[#Base1-foo-0b]
63+
== <<Base1,Base1>>::foo
64+
65+
=== Synopses
66+
67+
Declared in `&lt;bases&period;cpp&gt;`
68+
69+
70+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
71+
----
72+
void
73+
<<BaseBase1-foo,foo>>(bool);
74+
----
75+
76+
[.small]#<<BaseBase1-foo,_» more&period;&period;&period;_>>#
77+
78+
79+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
80+
----
81+
void
82+
<<Base1-foo-0a,foo>>(int);
83+
----
84+
85+
[.small]#<<Base1-foo-0a,_» more&period;&period;&period;_>>#
86+
87+
[#BaseBase1-foo]
88+
== <<BaseBase1,BaseBase1>>::foo
89+
90+
=== Synopsis
91+
92+
Declared in `&lt;bases&period;cpp&gt;`
93+
94+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
95+
----
96+
void
97+
foo(bool);
98+
----
99+
100+
[#Base1-foo-0a]
101+
== <<Base1,Base1>>::foo
102+
103+
=== Synopsis
104+
105+
Declared in `&lt;bases&period;cpp&gt;`
106+
107+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
108+
----
109+
void
110+
foo(int);
111+
----
112+
113+
[#Base2]
114+
== Base2
115+
116+
=== Synopsis
117+
118+
Declared in `&lt;bases&period;cpp&gt;`
119+
120+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
121+
----
122+
struct Base2;
123+
----
124+
125+
=== Member Functions
126+
127+
[cols=1]
128+
|===
129+
| Name
130+
| <<Base2-foo,`foo`>>
131+
|===
132+
133+
=== Derived Classes
134+
135+
[cols=2]
136+
|===
137+
| Name
138+
| Description
139+
| <<User,`User`>>
140+
|
141+
|===
142+
143+
[#Base2-foo]
144+
== <<Base2,Base2>>::foo
145+
146+
=== Synopsis
147+
148+
Declared in `&lt;bases&period;cpp&gt;`
149+
150+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
151+
----
152+
void
153+
foo(double);
154+
----
155+
156+
[#BaseBase1]
157+
== BaseBase1
158+
159+
=== Synopsis
160+
161+
Declared in `&lt;bases&period;cpp&gt;`
162+
163+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
164+
----
165+
struct BaseBase1;
166+
----
167+
168+
=== Member Functions
169+
170+
[cols=1]
171+
|===
172+
| Name
173+
| <<BaseBase1-foo,`foo`>>
174+
|===
175+
176+
=== Derived Classes
177+
178+
[cols=2]
179+
|===
180+
| Name
181+
| Description
182+
| <<Base1,`Base1`>>
183+
|
184+
|===
185+
186+
[#BaseBase1-foo]
187+
== <<BaseBase1,BaseBase1>>::foo
188+
189+
=== Synopsis
190+
191+
Declared in `&lt;bases&period;cpp&gt;`
192+
193+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
194+
----
195+
void
196+
foo(bool);
197+
----
198+
199+
[#BaseBase2]
200+
== BaseBase2
201+
202+
=== Synopsis
203+
204+
Declared in `&lt;bases&period;cpp&gt;`
205+
206+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
207+
----
208+
struct BaseBase2;
209+
----
210+
211+
=== Member Functions
212+
213+
[cols=1]
214+
|===
215+
| Name
216+
| <<BaseBase2-foo,`foo`>>
217+
|===
218+
219+
[#BaseBase2-foo]
220+
== <<BaseBase2,BaseBase2>>::foo
221+
222+
=== Synopsis
223+
224+
Declared in `&lt;bases&period;cpp&gt;`
225+
226+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
227+
----
228+
void
229+
foo(bool);
230+
----
231+
232+
[#User]
233+
== User
234+
235+
=== Synopsis
236+
237+
Declared in `&lt;bases&period;cpp&gt;`
238+
239+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
240+
----
241+
struct User
242+
: <<Base1,Base1>>
243+
, <<Base2,Base2>>;
244+
----
245+
246+
=== Base Classes
247+
248+
[cols=2]
249+
|===
250+
| Name
251+
| Description
252+
| `<<Base1,Base1>>`
253+
|
254+
| `<<Base2,Base2>>`
255+
|
256+
|===
257+
258+
=== Member Functions
259+
260+
[cols=2]
261+
|===
262+
| Name
263+
| Description
264+
| <<User-foo-0a,`foo`>>
265+
|
266+
|===
267+
268+
[#User-foo-0a]
269+
== <<User,User>>::foo
270+
271+
=== Synopses
272+
273+
Declared in `&lt;bases&period;cpp&gt;`
274+
275+
276+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
277+
----
278+
void
279+
<<BaseBase1-foo,foo>>(bool);
280+
----
281+
282+
[.small]#<<BaseBase1-foo,_» more&period;&period;&period;_>>#
283+
284+
285+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
286+
----
287+
void
288+
<<User-foo-0e,foo>>(int);
289+
----
290+
291+
[.small]#<<User-foo-0e,_» more&period;&period;&period;_>>#
292+
293+
294+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
295+
----
296+
void
297+
<<Base2-foo,foo>>(double);
298+
----
299+
300+
[.small]#<<Base2-foo,_» more&period;&period;&period;_>>#
301+
302+
[#BaseBase1-foo]
303+
== <<BaseBase1,BaseBase1>>::foo
304+
305+
=== Synopsis
306+
307+
Declared in `&lt;bases&period;cpp&gt;`
308+
309+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
310+
----
311+
void
312+
foo(bool);
313+
----
314+
315+
[#User-foo-0e]
316+
== <<User,User>>::foo
317+
318+
=== Synopsis
319+
320+
Declared in `&lt;bases&period;cpp&gt;`
321+
322+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
323+
----
324+
void
325+
foo(int);
326+
----
327+
328+
[#Base2-foo]
329+
== <<Base2,Base2>>::foo
330+
331+
=== Synopsis
332+
333+
Declared in `&lt;bases&period;cpp&gt;`
334+
335+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
336+
----
337+
void
338+
foo(double);
339+
----
340+
341+
342+
[.small]#Created with https://www.mrdocs.com[MrDocs]#
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
struct BaseBase1 {
2+
void foo(bool);
3+
};
4+
5+
struct BaseBase2 {
6+
void foo(bool);
7+
};
8+
9+
struct Base1 : public BaseBase1 {
10+
void foo(int);
11+
};
12+
13+
struct Base2 : private BaseBase2 {
14+
void foo(double);
15+
};
16+
17+
struct User : public Base1, Base2 {
18+
void foo(int);
19+
};

0 commit comments

Comments
 (0)