Skip to content

Commit 2bff4e2

Browse files
committed
feat: conditionally explicit clauses in templated methods
1 parent d348e51 commit 2bff4e2

File tree

5 files changed

+828
-1
lines changed

5 files changed

+828
-1
lines changed

src/lib/AST/ASTVisitor.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -962,7 +962,26 @@ populate(FunctionInfo& I, FunctionTemplateDecl const* D)
962962
{
963963
FunctionDecl const* TD = D->getTemplatedDecl();
964964
populate(I.Template, TD, D);
965-
populate(I, TD);
965+
if (auto* C = dyn_cast<CXXConstructorDecl>(TD))
966+
{
967+
populate(I, C);
968+
}
969+
else if (auto* Dtor = dyn_cast<CXXDestructorDecl>(TD))
970+
{
971+
populate(I, Dtor);
972+
}
973+
else if (auto* Conv = dyn_cast<CXXConversionDecl>(TD))
974+
{
975+
populate(I, Conv);
976+
}
977+
else if (auto* M = dyn_cast<CXXMethodDecl>(TD))
978+
{
979+
populate(I, M);
980+
}
981+
else
982+
{
983+
populate(I, TD);
984+
}
966985
}
967986

968987
void
Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
= Reference
2+
:mrdocs:
3+
4+
[#index]
5+
== Global namespace
6+
7+
=== Types
8+
9+
[cols=1]
10+
|===
11+
| Name
12+
| link:#A[`A`]
13+
|===
14+
15+
[#A]
16+
== A
17+
18+
=== Synopsis
19+
20+
Declared in `&lt;conditional&hyphen;explicit&period;cpp&gt;`
21+
22+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
23+
----
24+
template&lt;class T&gt;
25+
struct A;
26+
----
27+
28+
=== Member Functions
29+
30+
[cols=2]
31+
|===
32+
| Name
33+
| Description
34+
| link:#A-2constructor-0f[`A`] [.small]#[constructor]#
35+
| Constructors
36+
| link:#A-2conversion-0f[`operator U`]
37+
| Conditional explicit conversion to other types
38+
| link:#A-2conversion-00[`operator bool`]
39+
| Explicit conversion to bool
40+
| link:#A-2conversion-04[`operator char`]
41+
| Conditionally explicit conversion to char
42+
| link:#A-2conversion-01[`operator double`]
43+
| Implicit conversion to double
44+
|===
45+
46+
[#A-2constructor-0f]
47+
== link:#A[A]::A
48+
49+
Constructors
50+
51+
=== Synopses
52+
53+
Declared in `&lt;conditional&hyphen;explicit&period;cpp&gt;`
54+
55+
Conditionally explicit conversion from char
56+
57+
58+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
59+
----
60+
explicit(sizeof(T) &gt; 4)
61+
link:#A-2constructor-0b[A](char value);
62+
----
63+
64+
[.small]#link:#A-2constructor-0b[_» more&period;&period;&period;_]#
65+
66+
Explicit conversion from int
67+
68+
69+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
70+
----
71+
explicit
72+
link:#A-2constructor-01[A](int value);
73+
----
74+
75+
[.small]#link:#A-2constructor-01[_» more&period;&period;&period;_]#
76+
77+
Implicit conversion from double
78+
79+
80+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
81+
----
82+
link:#A-2constructor-00[A](double value);
83+
----
84+
85+
[.small]#link:#A-2constructor-00[_» more&period;&period;&period;_]#
86+
87+
Conditionally explicit conversion from other types
88+
89+
90+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
91+
----
92+
template&lt;typename U&gt;
93+
explicit(sizeof(U) &gt; 4)
94+
link:#A-2constructor-02[A](U value);
95+
----
96+
97+
[.small]#link:#A-2constructor-02[_» more&period;&period;&period;_]#
98+
99+
[#A-2constructor-0b]
100+
== link:#A[A]::A
101+
102+
Conditionally explicit conversion from char
103+
104+
=== Synopsis
105+
106+
Declared in `&lt;conditional&hyphen;explicit&period;cpp&gt;`
107+
108+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
109+
----
110+
explicit(sizeof(T) &gt; 4)
111+
A(char value);
112+
----
113+
114+
=== Parameters
115+
116+
[cols=2]
117+
|===
118+
| Name
119+
| Description
120+
| *value*
121+
| The value to construct from
122+
|===
123+
124+
[#A-2constructor-01]
125+
== link:#A[A]::A
126+
127+
Explicit conversion from int
128+
129+
=== Synopsis
130+
131+
Declared in `&lt;conditional&hyphen;explicit&period;cpp&gt;`
132+
133+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
134+
----
135+
explicit
136+
A(int value);
137+
----
138+
139+
=== Parameters
140+
141+
[cols=2]
142+
|===
143+
| Name
144+
| Description
145+
| *value*
146+
| The value to construct from
147+
|===
148+
149+
[#A-2constructor-00]
150+
== link:#A[A]::A
151+
152+
Implicit conversion from double
153+
154+
=== Synopsis
155+
156+
Declared in `&lt;conditional&hyphen;explicit&period;cpp&gt;`
157+
158+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
159+
----
160+
A(double value);
161+
----
162+
163+
=== Parameters
164+
165+
[cols=2]
166+
|===
167+
| Name
168+
| Description
169+
| *value*
170+
| The value to construct from
171+
|===
172+
173+
[#A-2constructor-02]
174+
== link:#A[A]::A
175+
176+
Conditionally explicit conversion from other types
177+
178+
=== Synopsis
179+
180+
Declared in `&lt;conditional&hyphen;explicit&period;cpp&gt;`
181+
182+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
183+
----
184+
template&lt;typename U&gt;
185+
explicit(sizeof(U) &gt; 4)
186+
A(U value);
187+
----
188+
189+
=== Parameters
190+
191+
[cols=2]
192+
|===
193+
| Name
194+
| Description
195+
| *value*
196+
| The object to construct from
197+
|===
198+
199+
[#A-2conversion-0f]
200+
== link:#A[A]::operator U
201+
202+
Conditional explicit conversion to other types
203+
204+
=== Synopsis
205+
206+
Declared in `&lt;conditional&hyphen;explicit&period;cpp&gt;`
207+
208+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
209+
----
210+
template&lt;typename U&gt;
211+
explicit(sizeof(U) &gt; 1)
212+
operator U() const;
213+
----
214+
215+
=== Return Value
216+
217+
The object converted to `U`
218+
219+
[#A-2conversion-00]
220+
== link:#A[A]::operator bool
221+
222+
Explicit conversion to bool
223+
224+
=== Synopsis
225+
226+
Declared in `&lt;conditional&hyphen;explicit&period;cpp&gt;`
227+
228+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
229+
----
230+
explicit
231+
operator bool() const;
232+
----
233+
234+
=== Return Value
235+
236+
The object converted to `bool`
237+
238+
[#A-2conversion-04]
239+
== link:#A[A]::operator char
240+
241+
Conditionally explicit conversion to char
242+
243+
=== Synopsis
244+
245+
Declared in `&lt;conditional&hyphen;explicit&period;cpp&gt;`
246+
247+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
248+
----
249+
explicit(sizeof(T) &gt; 4)
250+
operator char() const;
251+
----
252+
253+
=== Return Value
254+
255+
The object converted to `char`
256+
257+
[#A-2conversion-01]
258+
== link:#A[A]::operator double
259+
260+
Implicit conversion to double
261+
262+
=== Synopsis
263+
264+
Declared in `&lt;conditional&hyphen;explicit&period;cpp&gt;`
265+
266+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
267+
----
268+
operator double() const;
269+
----
270+
271+
=== Return Value
272+
273+
The object converted to `double`
274+
275+
276+
[.small]#Created with https://www.mrdocs.com[MrDocs]#
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
template <class T>
2+
struct A {
3+
/// Implicit conversion from double
4+
A(double);
5+
6+
/// Explicit conversion from int
7+
explicit
8+
A(int);
9+
10+
/// Conditionally explicit conversion from char
11+
explicit(sizeof(T) > 4)
12+
A(char);
13+
14+
/// Conditionally explicit conversion from other types
15+
template <typename U>
16+
explicit(sizeof(U) > 4)
17+
A(U);
18+
19+
/// Implicit conversion to double
20+
operator
21+
double() const;
22+
23+
/// Explicit conversion to bool
24+
explicit
25+
operator bool() const;
26+
27+
/// Conditionally explicit conversion to char
28+
explicit(sizeof(T) > 4)
29+
operator char() const;
30+
31+
/// Conditional explicit conversion to other types
32+
template <typename U>
33+
explicit(sizeof(U) > 1)
34+
operator U() const;
35+
};

0 commit comments

Comments
 (0)