Skip to content

Commit d456f87

Browse files
committed
feat: support variadic functions and variadic function types
1 parent e0a0547 commit d456f87

File tree

13 files changed

+75
-5
lines changed

13 files changed

+75
-5
lines changed

include/mrdocs/Metadata/Type.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ struct FunctionTypeInfo
196196
QualifierKind CVQualifiers = QualifierKind::None;
197197
ReferenceKind RefQualifier = ReferenceKind::None;
198198
NoexceptInfo ExceptionSpec;
199+
bool IsVariadic = false;
199200

200201
TypeInfo* innerType() const noexcept override
201202
{

mrdocs.rnc

+3-2
Original file line numberDiff line numberDiff line change
@@ -432,12 +432,13 @@ grammar
432432
"pointer" |
433433
"member-pointer" |
434434
"array" |
435-
"function" |
436-
"pack"
435+
"function"
437436
} ?,
438437
ID ?,
439438
Name ?,
440439
attribute parent { text } ?,
440+
attribute is-pack { "1" } ?,
441+
attribute is-variadic { "1" } ?,
441442
attribute cv-qualifiers { "const"|"volatile"|"const volatile" } ?,
442443
attribute ref-qualifier { "&"|"&&" } ?,
443444
attribute exception-spec { text } ?,

share/mrdocs/addons/generator/asciidoc/partials/declarator-after.adoc.hbs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
{{else if (eq kind "function")~}}
88
({{#each param-types~}}
99
{{~>declarator nolink=../nolink~}}{{~#unless @last}}, {{/unless~}}
10-
{{/each~}})
10+
{{/each~}}{{#if is-variadic}}{{#if param-types}}, {{/if}}...{{/if}})
1111
{{~#if cv-qualifiers}} {{cv-qualifiers}}{{/if~}}
1212
{{#if (eq ref-qualifier "lvalue")}} &{{else if (eq ref-qualifier "rvalue")}} &&{{/if~}}
1313
{{#if exception-spec}} {{exception-spec}}{{/if~}}

share/mrdocs/addons/generator/asciidoc/partials/signature/function.adoc.hbs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
{{/unless}}{{>declarator type decl-name=name~}}
1616
{{#if default}} = {{default}}{{/if~}}
1717
{{#unless @last}},{{/unless~}}
18-
{{/each~}})
18+
{{/each~}}{{#if symbol.isVariadic}}{{#if symbol.params}}, {{/if}}...{{/if}})
1919
{{~#if symbol.isConst}} const{{/if~}}
2020
{{#if symbol.isVolatile}} volatile{{/if~}}
2121
{{#if symbol.refQualifier}} {{symbol.refQualifier}}{{/if~}}

src/lib/AST/ASTVisitor.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -3537,6 +3537,7 @@ class TypeInfoBuilder
35373537
FPT->getRefQualifier());
35383538
I->CVQualifiers = convertToQualifierKind(
35393539
FPT->getMethodQuals().getFastQualifiers());
3540+
I->IsVariadic = FPT->isVariadic();
35403541
getASTVisitor().buildNoexceptInfo(I->ExceptionSpec, FPT);
35413542
*std::exchange(Inner, &I->ReturnType) = std::move(I);
35423543
}

src/lib/AST/AnyBlock.hpp

+5
Original file line numberDiff line numberDiff line change
@@ -886,6 +886,11 @@ class TypeInfoBlock
886886
return Error("wrong TypeInfo kind");
887887
return decodeRecord(R, static_cast<
888888
FunctionTypeInfo&>(*I_).ExceptionSpec, Blob);
889+
case TYPEINFO_IS_VARIADIC:
890+
if(! I_->isFunction())
891+
return Error("wrong TypeInfo kind");
892+
return decodeRecord(R, static_cast<
893+
FunctionTypeInfo&>(*I_).IsVariadic, Blob);
889894
default:
890895
return AnyBlock::parseRecord(R, ID, Blob);
891896
}

src/lib/AST/BitcodeIDs.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ enum RecordID
114114
TYPEINFO_CVQUAL,
115115
TYPEINFO_NOEXCEPT,
116116
TYPEINFO_REFQUAL,
117+
TYPEINFO_IS_VARIADIC,
117118
BASE_ACCESS,
118119
BASE_IS_VIRTUAL,
119120
FIELD_ATTRIBUTES,

src/lib/AST/BitcodeWriter.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ RecordIDNameMap = []()
335335
{TYPEINFO_CVQUAL, {"TypeinfoCV", &Integer32Abbrev}},
336336
{TYPEINFO_NOEXCEPT, {"TypeinfoNoexcept", &NoexceptAbbrev}},
337337
{TYPEINFO_REFQUAL, {"TypeinfoRefqual", &Integer32Abbrev}},
338+
{TYPEINFO_IS_VARIADIC, {"TypeinfoIsVariadic", &BoolAbbrev}},
338339
{TYPEDEF_IS_USING, {"IsUsing", &BoolAbbrev}},
339340
{VARIABLE_BITS, {"Bits", &Integer32ArrayAbbrev}},
340341
{USING_SYMBOLS, {"UsingSymbols", &SymbolIDsAbbrev}},
@@ -437,7 +438,7 @@ RecordsByBlock{
437438
// TypeInfo
438439
{BI_TYPEINFO_BLOCK_ID,
439440
{TYPEINFO_KIND, TYPEINFO_IS_PACK, TYPEINFO_CVQUAL,
440-
TYPEINFO_NOEXCEPT, TYPEINFO_REFQUAL}},
441+
TYPEINFO_NOEXCEPT, TYPEINFO_REFQUAL, TYPEINFO_IS_VARIADIC}},
441442
{BI_TYPEINFO_PARENT_BLOCK_ID,
442443
{}},
443444
{BI_TYPEINFO_CHILD_BLOCK_ID,
@@ -1048,6 +1049,7 @@ emitBlock(
10481049

10491050
emitRecord(t.RefQualifier, TYPEINFO_REFQUAL);
10501051
emitRecord(t.ExceptionSpec, TYPEINFO_NOEXCEPT);
1052+
emitRecord(t.IsVariadic, TYPEINFO_IS_VARIADIC);
10511053
}
10521054

10531055
if constexpr(T::isNamed())

src/lib/Gen/xml/CXXTags.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,9 @@ writeType(
252252

253253
if constexpr(T::isFunction())
254254
{
255+
if(t.IsVariadic)
256+
attrs.push({"is-variadic", "1"});
257+
255258
if(t.RefQualifier != ReferenceKind::None)
256259
attrs.push({"ref-qualifier", toString(t.RefQualifier)});
257260

src/lib/Metadata/DomMetadata.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ domCreate(
500500
toString(t.ExceptionSpec));
501501
entries.emplace_back("ref-qualifier",
502502
toString(t.RefQualifier));
503+
entries.emplace_back("is-variadic", t.IsVariadic);
503504
}
504505
});
505506
return dom::Object(std::move(entries));

src/lib/Metadata/Type.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,14 @@ operator()(
217217
writeFullType(**first, write);
218218
}
219219
}
220+
221+
if(t.IsVariadic)
222+
{
223+
if(! t.ParamTypes.empty())
224+
write(", ");
225+
write("...");
226+
}
227+
220228
write(')');
221229

222230
if(t.CVQualifiers != QualifierKind::None)
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using T = void(...);
2+
3+
using U = void(int, ...);
4+
5+
void f(...);
6+
7+
void g(int, ...);
8+
9+
template<typename A = void(...), typename B = void(int, ...)>
10+
struct C;
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<mrdocs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:noNamespaceSchemaLocation="https://github.com/cppalliance/mrdocs/raw/develop/mrdocs.rnc">
4+
<namespace id="//////////////////////////8=">
5+
<alias name="T" id="PvNOREc+JWxdkVgvSz+jC45IbGQ=">
6+
<file path="variadic-function.cpp" line="1" class="def"/>
7+
<type class="function" is-variadic="1">
8+
<return-type name="void"/>
9+
</type>
10+
</alias>
11+
<alias name="U" id="h6hupdyuT6SfsCGFl6UUFGtvrcc=">
12+
<file path="variadic-function.cpp" line="3" class="def"/>
13+
<type class="function" is-variadic="1">
14+
<return-type name="void"/>
15+
<param-type name="int"/>
16+
</type>
17+
</alias>
18+
<function name="f" id="CMaAySU4txrIlGl6edqWDSabBRA=">
19+
<file path="variadic-function.cpp" line="5"/>
20+
<attr id="is-variadic"/>
21+
</function>
22+
<function name="g" id="lldWvRg9y+NwRnDpK3x2NF9+e08=">
23+
<file path="variadic-function.cpp" line="7"/>
24+
<attr id="is-variadic"/>
25+
<param>
26+
<type name="int"/>
27+
</param>
28+
</function>
29+
<template>
30+
<tparam name="A" class="type" default="void(...)"/>
31+
<tparam name="B" class="type" default="void(int, ...)"/>
32+
<struct name="C" id="8nYw0KA23eAszqSOs0wOXAD1DYQ=">
33+
<file path="variadic-function.cpp" line="10"/>
34+
</struct>
35+
</template>
36+
</namespace>
37+
</mrdocs>

0 commit comments

Comments
 (0)