Skip to content

Commit e5ce168

Browse files
Ukilelevinniefalco
authored andcommitted
Add explicit specifier
close #119
1 parent 896859d commit e5ce168

File tree

9 files changed

+249
-1
lines changed

9 files changed

+249
-1
lines changed

include/mrdox/Metadata/Function.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ enum class FnFlags1 : std::uint32_t
8181
nodiscardSpelling = 0x00000002 +
8282
0x00000004 +
8383
0x00000008 +
84-
0x00000010
84+
0x00000010,
85+
86+
isExplicit = 0x00000020
8587
};
8688

8789
// TODO: Expand to allow for documenting templating and default args.

source/api/AST/Serializer.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,19 @@ getFunctionSpecs(
10021002
//MF->isMoveAssignmentOperator()
10031003
//MF->isOverloadedOperator();
10041004
//MF->isStaticOverloadedOperator();
1005+
1006+
if(auto const Ctor = dyn_cast<CXXConstructorDecl>(MF))
1007+
{
1008+
I.specs1.set<FnFlags1::isExplicit>(Ctor->getExplicitSpecifier().isSpecified());
1009+
}
1010+
else if(auto const Conv = dyn_cast<CXXConversionDecl>(MF))
1011+
{
1012+
I.specs1.set<FnFlags1::isExplicit>(Conv->getExplicitSpecifier().isSpecified());
1013+
}
1014+
}
1015+
else if(auto const DG = dyn_cast<CXXDeductionGuideDecl>(D))
1016+
{
1017+
I.specs1.set<FnFlags1::isExplicit>(DG->getExplicitSpecifier().isSpecified());
10051018
}
10061019

10071020
if(auto attr = D->getAttr<WarnUnusedResultAttr>())

source/api/_XML/XMLWriter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,8 @@ visit(
220220

221221
if(I.specs1.get<FnFlags1::isNodiscard>())
222222
os << "<nodiscard/>";
223+
if(I.specs1.get<FnFlags1::isExplicit>())
224+
os << "<explicit/>";
223225

224226
// ConstexprSpecKind
225227
auto CSK = I.specs0.get<
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//Test conversion operators that can be "explicit", "explicit(true)", "explicit(false)" and "explicit(EXPR)"
2+
3+
struct Explicit {
4+
explicit operator bool();
5+
};
6+
7+
struct ExplicitFalse {
8+
explicit(false) operator bool();
9+
};
10+
11+
struct ExplicitTrue {
12+
explicit(true) operator bool();
13+
};
14+
15+
template<bool B>
16+
struct ExplicitExpression {
17+
explicit(B) operator bool();
18+
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE mrdox SYSTEM "mrdox.dtd">
3+
<mrdox>
4+
<namespace name="">
5+
<struct name="ExplicitFalse" id="Lt5u3k14Z7EBxY7Ike3h9qkJ0fo=">
6+
<file path="explicit-conv-operator.cpp" line="7" class="def"/>
7+
<function name="operator bool" access="public" id="hJXOxv26Y9uxUYMMVZRsp3Wps4A=">
8+
<file path="explicit-conv-operator.cpp" line="8"/>
9+
<explicit/>
10+
<return name="_Bool"/>
11+
</function>
12+
</struct>
13+
<struct name="Explicit" id="bonobNKGOblPVcRjxpiPan4nYnc=">
14+
<file path="explicit-conv-operator.cpp" line="3" class="def"/>
15+
<function name="operator bool" access="public" id="64zY8rVu+TzEUayzMrnV65i9nFc=">
16+
<file path="explicit-conv-operator.cpp" line="4"/>
17+
<explicit/>
18+
<return name="_Bool"/>
19+
</function>
20+
</struct>
21+
<struct name="ExplicitTrue" id="htdCGapMsdazR1XkXoanrOCkvDE=">
22+
<file path="explicit-conv-operator.cpp" line="11" class="def"/>
23+
<function name="operator bool" access="public" id="9tpZWv9eJGfWj37jmTdNTg+gp14=">
24+
<file path="explicit-conv-operator.cpp" line="12"/>
25+
<explicit/>
26+
<return name="_Bool"/>
27+
</function>
28+
</struct>
29+
<struct name="ExplicitExpression" id="ztb0u1Q4SVBUQ0roTOM7MFlUt/o=">
30+
<file path="explicit-conv-operator.cpp" line="16" class="def"/>
31+
<function name="operator bool" access="public" id="q6N8XkMK9WWWGKNQnlx/o2E1EYc=">
32+
<file path="explicit-conv-operator.cpp" line="17"/>
33+
<explicit/>
34+
<return name="_Bool"/>
35+
</function>
36+
</struct>
37+
</namespace>
38+
</mrdox>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//Test constructors that can be "explicit", "explicit(true)", "explicit(false)" and "explicit(EXPR)"
2+
3+
struct Explicit {
4+
explicit Explicit();
5+
explicit Explicit(const Explicit&);
6+
explicit Explicit(Explicit&&) noexcept;
7+
explicit Explicit(int, int);
8+
};
9+
10+
struct ExplicitTrue {
11+
explicit(true) ExplicitTrue();
12+
explicit(true) ExplicitTrue(const ExplicitTrue&);
13+
explicit(true) ExplicitTrue(ExplicitTrue&&) noexcept;
14+
explicit(true) ExplicitTrue(int, int);
15+
};
16+
17+
struct ExplicitFalse {
18+
explicit(false) ExplicitFalse();
19+
explicit(false) ExplicitFalse(const ExplicitFalse&);
20+
explicit(false) ExplicitFalse(ExplicitFalse&&) noexcept;
21+
explicit(false) ExplicitFalse(int, int);
22+
};
23+
24+
template<bool B>
25+
struct ExplicitExpression {
26+
explicit(B) ExplicitExpression();
27+
explicit(B) ExplicitExpression(const ExplicitExpression&);
28+
explicit(B) ExplicitExpression(ExplicitExpression&&) noexcept;
29+
explicit(B) ExplicitExpression(int, int);
30+
};
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE mrdox SYSTEM "mrdox.dtd">
3+
<mrdox>
4+
<namespace name="">
5+
<struct name="ExplicitFalse" id="Lt5u3k14Z7EBxY7Ike3h9qkJ0fo=">
6+
<file path="explicit-ctor.cpp" line="17" class="def"/>
7+
<function name="ExplicitFalse" access="public" id="GVN7KvqFotNClBLUnxR3nnPlH7Y=">
8+
<file path="explicit-ctor.cpp" line="18"/>
9+
<explicit/>
10+
</function>
11+
<function name="ExplicitFalse" access="public" id="T0aRgSzz7xtFbPWKv3q57ueIYlI=">
12+
<file path="explicit-ctor.cpp" line="21"/>
13+
<explicit/>
14+
<param type="int"/>
15+
<param type="int"/>
16+
</function>
17+
<function name="ExplicitFalse" access="public" id="gsl+2i8v8v4Lifq3SZ5sFhSfseQ=">
18+
<file path="explicit-ctor.cpp" line="19"/>
19+
<explicit/>
20+
<param type="const ExplicitFalse &amp;"/>
21+
</function>
22+
<function name="ExplicitFalse" access="public" id="qXjKOO0FQ3p2vTehkEQl2kIKpFs=">
23+
<file path="explicit-ctor.cpp" line="20"/>
24+
<explicit/><noexcept/>
25+
<param type="ExplicitFalse &amp;&amp;"/>
26+
</function>
27+
</struct>
28+
<struct name="Explicit" id="bonobNKGOblPVcRjxpiPan4nYnc=">
29+
<file path="explicit-ctor.cpp" line="3" class="def"/>
30+
<function name="Explicit" access="public" id="CuzDbFSxtCdVcGerq2UySnHF7po=">
31+
<file path="explicit-ctor.cpp" line="5"/>
32+
<explicit/>
33+
<param type="const Explicit &amp;"/>
34+
</function>
35+
<function name="Explicit" access="public" id="JPrjQsrkg+QoApI2wln2eGwCGP4=">
36+
<file path="explicit-ctor.cpp" line="4"/>
37+
<explicit/>
38+
</function>
39+
<function name="Explicit" access="public" id="Oj6cGCOaarVfZXkgsr/pOPOOiFY=">
40+
<file path="explicit-ctor.cpp" line="7"/>
41+
<explicit/>
42+
<param type="int"/>
43+
<param type="int"/>
44+
</function>
45+
<function name="Explicit" access="public" id="saOH3agrCzNHcRhbXHOM0FYFxGc=">
46+
<file path="explicit-ctor.cpp" line="6"/>
47+
<explicit/><noexcept/>
48+
<param type="Explicit &amp;&amp;"/>
49+
</function>
50+
</struct>
51+
<struct name="ExplicitTrue" id="htdCGapMsdazR1XkXoanrOCkvDE=">
52+
<file path="explicit-ctor.cpp" line="10" class="def"/>
53+
<function name="ExplicitTrue" access="public" id="Tj9uY+jY7QBYQC8IsjplHuoDgQo=">
54+
<file path="explicit-ctor.cpp" line="12"/>
55+
<explicit/>
56+
<param type="const ExplicitTrue &amp;"/>
57+
</function>
58+
<function name="ExplicitTrue" access="public" id="XCoHYDLlYJYpV6Ut7Ms0GjcQKjM=">
59+
<file path="explicit-ctor.cpp" line="14"/>
60+
<explicit/>
61+
<param type="int"/>
62+
<param type="int"/>
63+
</function>
64+
<function name="ExplicitTrue" access="public" id="iQOO8pEh0iNSnpupVwR9tCVIf8U=">
65+
<file path="explicit-ctor.cpp" line="13"/>
66+
<explicit/><noexcept/>
67+
<param type="ExplicitTrue &amp;&amp;"/>
68+
</function>
69+
<function name="ExplicitTrue" access="public" id="3sd37ryB4gMx1BgYdDdQzVJFniU=">
70+
<file path="explicit-ctor.cpp" line="11"/>
71+
<explicit/>
72+
</function>
73+
</struct>
74+
<struct name="ExplicitExpression" id="ztb0u1Q4SVBUQ0roTOM7MFlUt/o=">
75+
<file path="explicit-ctor.cpp" line="25" class="def"/>
76+
<function name="ExplicitExpression&lt;B&gt;" access="public" id="J31K1hQq31LWiQhVy5ro0V+1pD0=">
77+
<file path="explicit-ctor.cpp" line="29"/>
78+
<explicit/>
79+
<param type="int"/>
80+
<param type="int"/>
81+
</function>
82+
<function name="ExplicitExpression&lt;B&gt;" access="public" id="Ty1Sv+L6at7TykYdCITSQKmXwVs=">
83+
<file path="explicit-ctor.cpp" line="27"/>
84+
<explicit/>
85+
<param type="const ExplicitExpression&lt;B&gt; &amp;"/>
86+
</function>
87+
<function name="ExplicitExpression&lt;B&gt;" access="public" id="gDoLCstIvgYYJng1jhLOLe/yz+Q=">
88+
<file path="explicit-ctor.cpp" line="28"/>
89+
<explicit/><noexcept/>
90+
<param type="ExplicitExpression&lt;B&gt; &amp;&amp;"/>
91+
</function>
92+
<function name="ExplicitExpression&lt;B&gt;" access="public" id="s6L5UKI8FLTRiyny1rXgYxG/f/0=">
93+
<file path="explicit-ctor.cpp" line="26"/>
94+
<explicit/>
95+
</function>
96+
</struct>
97+
</namespace>
98+
</mrdox>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//Test deduction guides that can be "explicit", "explicit(true)", "explicit(false)" and "explicit(EXPR)"
2+
3+
template<int>
4+
struct X {};
5+
6+
explicit X(bool) -> X<0>;
7+
8+
explicit(true) X(char) -> X<0>;
9+
10+
explicit(false) X(int) -> X<0>;
11+
12+
template<bool B = true>
13+
explicit(B) X(long) -> X<0>;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE mrdox SYSTEM "mrdox.dtd">
3+
<mrdox>
4+
<namespace name="">
5+
<struct name="X" id="7wllQWhGGsbbeoZVa3gh4d7bcq8=">
6+
<file path="explicit-deduct-guide.cpp" line="4" class="def"/>
7+
</struct>
8+
<function name="&lt;deduction guide for X&gt;" id="AtQyLakD3CjcM24GabAbHMNgVU4=">
9+
<file path="explicit-deduct-guide.cpp" line="8"/>
10+
<trailing/><explicit/>
11+
<return name="X&lt;0&gt;"/>
12+
<param type="char"/>
13+
</function>
14+
<function name="&lt;deduction guide for X&gt;" id="YS/v8XQ/9ShQ2spNAh5EY33PN7s=">
15+
<file path="explicit-deduct-guide.cpp" line="13"/>
16+
<trailing/><explicit/>
17+
<return name="X&lt;0&gt;"/>
18+
<param type="long"/>
19+
<tparam decl="bool B = true"/>
20+
</function>
21+
<function name="&lt;deduction guide for X&gt;" id="tkYkUU6H8cbFpCU7yBuvBLkT6dg=">
22+
<file path="explicit-deduct-guide.cpp" line="10"/>
23+
<trailing/><explicit/>
24+
<return name="X&lt;0&gt;"/>
25+
<param type="int"/>
26+
</function>
27+
<function name="&lt;deduction guide for X&gt;" id="2IF4pOfGcA57GQDlE3PJgs7yeUs=">
28+
<file path="explicit-deduct-guide.cpp" line="6"/>
29+
<trailing/><explicit/>
30+
<return name="X&lt;0&gt;"/>
31+
<param type="_Bool"/>
32+
</function>
33+
</namespace>
34+
</mrdox>

0 commit comments

Comments
 (0)