Skip to content

Commit

Permalink
support void_t SFINAE
Browse files Browse the repository at this point in the history
#feat

fix #748
  • Loading branch information
alandefreitas committed Jan 21, 2025
1 parent 90b69e4 commit 6437919
Show file tree
Hide file tree
Showing 5 changed files with 263 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/lib/AST/ASTVisitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2242,6 +2242,10 @@ ASTVisitor::getSFINAETemplateInfo(QualType T, bool const AllowDependentNames) co
T = QualType(DNT->getQualifier()->getAsType(), 0);
MRDOCS_SYMBOL_TRACE(T, context_);
}
if (!T.getTypePtrOrNull())
{
return std::nullopt;
}

// If the type is a template specialization type, extract the template name
// and the template arguments
Expand Down
94 changes: 94 additions & 0 deletions test-files/golden-tests/metadata/sfinae.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@
| <<A-02,`A&lt;T, void&gt;`>>
| Specialization for floating point types

| <<S-02,`S`>>
| SFINAE with std&colon;&colon;void&lowbar;t

| <<S-08,`S&lt;T, std::void&lowbar;t&lt;T::a::b&gt;&gt;`>>
| SFINAE with std&colon;&colon;void&lowbar;t

|===
=== Functions

Expand Down Expand Up @@ -136,6 +142,94 @@ class <<A-09,A>>&lt;T, void&gt;;



[#S-02]
== S


SFINAE with std&colon;&colon;void&lowbar;t

=== Synopsis


Declared in `&lt;sfinae&period;cpp&gt;`

[source,cpp,subs="verbatim,replacements,macros,-callouts"]
----
template&lt;
class T,
class = void&gt;
struct S;
----

=== Member Functions

[cols=1]
|===
| Name

| <<S-02-store,`store`>>
|===



[#S-02-store]
== <<S-02,S>>::store


=== Synopsis


Declared in `&lt;sfinae&period;cpp&gt;`

[source,cpp,subs="verbatim,replacements,macros,-callouts"]
----
void
store(void const*);
----

[#S-08]
== S&lt;T, std::void&lowbar;t&lt;T::a::b&gt;&gt;


SFINAE with std&colon;&colon;void&lowbar;t

=== Synopsis


Declared in `&lt;sfinae&period;cpp&gt;`

[source,cpp,subs="verbatim,replacements,macros,-callouts"]
----
template&lt;class T&gt;
struct <<S-02,S>>&lt;T, std::void&lowbar;t&lt;T::a::b&gt;&gt;;
----

=== Member Functions

[cols=1]
|===
| Name

| <<S-08-store,`store`>>
|===



[#S-08-store]
== <<S-08,S>>&lt;T, std::void&lowbar;t&lt;T::a::b&gt;&gt;::store


=== Synopsis


Declared in `&lt;sfinae&period;cpp&gt;`

[source,cpp,subs="verbatim,replacements,macros,-callouts"]
----
void
store(void const*);
----

[#f1]
== f1

Expand Down
14 changes: 14 additions & 0 deletions test-files/golden-tests/metadata/sfinae.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,17 @@ class A {};
/// Specialization for floating point types
template<class T>
class A<T, std::enable_if_t<std::is_integral_v<T>>> {};

/// SFINAE with std::void_t
template <class T, class = void>
struct S
{
void store(const void*) {}
};

/// SFINAE with std::void_t
template <class T>
struct S<T, std::void_t<typename T::a::b>>
{
void store(const void*) {}
};
110 changes: 110 additions & 0 deletions test-files/golden-tests/metadata/sfinae.html
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ <h2>Types</h2>
</td></tr><tr>
<td><a href="#A-02"><code>A&lt;T, void&gt;</code></a> </td><td><span><span>Specialization for floating point types</span></span>

</td></tr><tr>
<td><a href="#S-02"><code>S</code></a> </td><td><span><span>SFINAE with std::void_t</span></span>

</td></tr><tr>
<td><a href="#S-08"><code>S&lt;T, std::void_t&lt;T::a::b&gt;&gt;</code></a> </td><td><span><span>SFINAE with std::void_t</span></span>

</td></tr>
</tbody>
</table>
Expand Down Expand Up @@ -161,6 +167,110 @@ <h3>Synopsis</h3>
</div>


</div>
<div>
<div>
<h2 id="S-02">S</h2>
<div>
<span><span>SFINAE with std::void_t</span></span>


</div>
</div>
<div>
<h3>Synopsis</h3>
<div>
Declared in <code>&lt;sfinae.cpp&gt;</code></div>
<pre>
<code class="source-code cpp">
template&lt;
class T,
class = void&gt;
struct S;
</code>
</pre>
</div>
<h2>Member Functions</h2>
<table style="table-layout: fixed; width: 100%;">
<thead>
<tr>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="#S-02-store"><code>store</code></a> </td></tr>
</tbody>
</table>


</div>
<div>
<div>
<h2 id="S-02-store"><a href="#S-02">S</a>::store</h2>
</div>
<div>
<h3>Synopsis</h3>
<div>
Declared in <code>&lt;sfinae.cpp&gt;</code></div>
<pre>
<code class="source-code cpp">
void
store(void const*);
</code>
</pre>
</div>
</div>
<div>
<div>
<h2 id="S-08">S&lt;T, std::void_t&lt;T::a::b&gt;&gt;</h2>
<div>
<span><span>SFINAE with std::void_t</span></span>


</div>
</div>
<div>
<h3>Synopsis</h3>
<div>
Declared in <code>&lt;sfinae.cpp&gt;</code></div>
<pre>
<code class="source-code cpp">
template&lt;class T&gt;
struct <a href="#S-02">S</a>&lt;T, std::void_t&lt;T::a::b&gt;&gt;;
</code>
</pre>
</div>
<h2>Member Functions</h2>
<table style="table-layout: fixed; width: 100%;">
<thead>
<tr>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="#S-08-store"><code>store</code></a> </td></tr>
</tbody>
</table>


</div>
<div>
<div>
<h2 id="S-08-store"><a href="#S-08">S</a>&lt;T, std::void_t&lt;T::a::b&gt;&gt;::store</h2>
</div>
<div>
<h3>Synopsis</h3>
<div>
Declared in <code>&lt;sfinae.cpp&gt;</code></div>
<pre>
<code class="source-code cpp">
void
store(void const*);
</code>
</pre>
</div>
</div>
<div>
<div>
Expand Down
41 changes: 41 additions & 0 deletions test-files/golden-tests/metadata/sfinae.xml
Original file line number Diff line number Diff line change
Expand Up @@ -222,5 +222,46 @@
</doc>
</class>
</template>
<template>
<tparam name="T" class="type"/>
<tparam class="type" default="void"/>
<struct name="S" id="IZrmVBMJu1uvsP9zur5JVrwgYmE=">
<file short-path="sfinae.cpp" source-path="sfinae.cpp" line="76" class="def"/>
<doc>
<para>
<text>SFINAE with std::void_t</text>
</para>
</doc>
<function name="store" id="KmwKarrWHSv7aalrBX18hjPbEfs=">
<file short-path="sfinae.cpp" source-path="sfinae.cpp" line="79" class="def"/>
<param>
<type class="pointer">
<pointee-type name="void" cv-qualifiers="const"/>
</type>
</param>
</function>
</struct>
</template>
<template class="partial" id="IZrmVBMJu1uvsP9zur5JVrwgYmE=">
<tparam name="T" class="type"/>
<targ class="type" type="T"/>
<targ class="type" type="std::void_t&lt;T::a::b&gt;"/>
<struct name="S" id="g0UNZpdodOU5mGCtcpviXd8o6Vk=">
<file short-path="sfinae.cpp" source-path="sfinae.cpp" line="84" class="def"/>
<doc>
<para>
<text>SFINAE with std::void_t</text>
</para>
</doc>
<function name="store" id="2KfuSRGlpNo9Lk/lk1bhwZqm/BY=">
<file short-path="sfinae.cpp" source-path="sfinae.cpp" line="86" class="def"/>
<param>
<type class="pointer">
<pointee-type name="void" cv-qualifiers="const"/>
</type>
</param>
</function>
</struct>
</template>
</namespace>
</mrdocs>

0 comments on commit 6437919

Please sign in to comment.