Skip to content

Commit 3ebf3e6

Browse files
committed
ABI updates for C++20 lambda-expression features:
* include declarations for explicitly-specified template parameters in the lambda-sig mangling * add mangling for template parameters at different depths (possible via generic lambdas in unevaluated operands and via template template parameters in lambda-sigs) Fixes itanium-cxx-abi#31.
1 parent a7e8689 commit 3ebf3e6

File tree

1 file changed

+58
-10
lines changed

1 file changed

+58
-10
lines changed

abi.html

+58-10
Original file line numberDiff line numberDiff line change
@@ -4990,14 +4990,52 @@ <h5><a href="#mangle.template-param">5.1.5.8 Template parameters</a></h5>
49904990
that is the actual parameter.
49914991
</p>
49924992

4993+
<p>
4994+
Let L be the number of template parameter scopes enclosing the
4995+
template parameter scope in which the parameter is declared,
4996+
excluding any template parameter scopes whose template arguments
4997+
have already been substituted into the type or expression being mangled.
4998+
Typically L will be zero, but can be nonzero when a generic lambda
4999+
occurs within the signature of a function template or when mangling
5000+
a template template parameter declaration. For example:
5001+
5002+
<pre><code>
5003+
template&lt;typename&gt; struct A {
5004+
// Type of a is TL0_0_, type of b is T_, type of c is TL0__, type of u is TL1__.
5005+
template&lt;typename T&gt; void f(decltype([]&lt;typename U, template&lt;U u&gt; typename&gt;(auto a, T b, U c){})) {}
5006+
};
5007+
</code></pre>
5008+
</p>
5009+
49935010
<pre><code><font color=blue>
4994-
&lt;template-param&gt; ::= T_ # first template parameter
4995-
::= T &lt;<i>parameter-2 non-negative</i> <a href="#mangle.number">number</a>&gt; _
5011+
&lt;template-param&gt; ::= T_ # L == 0, first parameter
5012+
::= T &lt;<i>parameter-2 non-negative</i> <a href="#mangle.number">number</a>&gt; _ # L == 0, second and later parameters
5013+
::= TL &lt;<i>L-1 non-negative</i> <a href="#mangle.number">number</a>&gt; __ # L &gt; 0, first parameter
5014+
::= TL &lt;<i>L-1 non-negative</i> <a href="#mangle.number">number</a>&gt; _ &lt;<i>parameter-2 non-negative</i> <a href="#mangle.number">number</a>&gt; _ # L &gt; 0, second and later parameters
49965015
&lt;<a name="mangle.template-template-param">template-template-param</a>&gt; ::= &lt;<a href="#mangle.template-param">template-param</a>&gt;
49975016
::= &lt;<a href="#mangle.substitution">substitution</a>&gt;
5017+
</font></code></pre>
5018+
5019+
<p>
5020+
Within a &lt;<a href="#mangle.lambda-sig">lambda-sig</a>&gt;,
5021+
explicit template parameter declarations are mangled.
5022+
</p>
49985023

5024+
<a name="mangle.template-param-decl">
5025+
<pre><code><font color=blue>
5026+
&lt;template-param-decl&gt; ::= Ty # template type parameter
5027+
::= Tn &lt;<a href="#mangle.type">type</a>&gt; # template non-type parameter
5028+
::= Tt &lt;<a href="#mangle.template-param-decl">template-param-decl</a>&gt;* E # template template parameter
5029+
::= Tp &lt;<i>non-pack</i> <a href="#mangle.template-param-decl">template-param-decl</a>&gt; # template parameter pack
49995030
</font></code></pre>
50005031

5032+
<p>
5033+
(Note: the intent is to eventually use these template parameter
5034+
manglings more broadly, to distinguish between function templates
5035+
that are overloaded on template parameters but that are otherwise
5036+
indistinguishable.)
5037+
</p>
5038+
50015039
<a name="mangle.function-param">
50025040
<h5><a href="#mangle.function-param">5.1.5.9 Function parameter references</a></h5>
50035041

@@ -5531,7 +5569,8 @@ <h4><a href="#closure-types">5.1.8 Closure Types (Lambdas)</a></h4>
55315569
&lt;<a name="mangle.closure-type-name">closure-type-name</a>&gt; ::= Ul &lt;<a href="#mangle.lambda-sig">lambda-sig</a>&gt; E [ &lt;<i>nonnegative</i> <a href="#mangle.number">number</a>&gt; ] _
55325570
</pre></font></code>
55335571
with
5534-
<pre><code><font color=blue> &lt;<a name="mangle.lambda-sig">lambda-sig</a>&gt; ::= &lt;<i>parameter</i> <a href="#mangle.type">type</a>&gt;+ # Parameter types or "v" if the lambda has no parameters
5572+
<pre><code><font color=blue> &lt;<a name="mangle.lambda-sig">lambda-sig</a>&gt; ::= &lt;<i>explicit</i> <a href="#mangle.template-param-decl">template-param-decl</a>&gt;* # Excluding template parameters introduced for <code>auto</code> parameters
5573+
&lt;<i>parameter</i> <a href="#mangle.type">type</a>&gt;+ # Parameter types or "v" if the lambda has no parameters
55355574
</pre></font></code>
55365575
The number is omitted for the first closure type with a given
55375576
&lt;<a href="#mangle.lambda-sig">lambda-sig</a>&gt; in a given context; it is n-2 for the nth closure
@@ -5611,13 +5650,22 @@ <h4><a href="#closure-types">5.1.8 Closure Types (Lambdas)</a></h4>
56115650
<p>
56125651
In a generic lambda, uses of <code>auto</code> in the parameter list
56135652
are mangled as the corresponding artificial template type parameter.
5614-
This is never ambiguous with a lambda parameter whose type is an
5615-
enclosing template type parameter, because lambdas are never mangled
5616-
in a dependent context (they are forbidden from appearing in function
5617-
signatures). A &lt;<a
5618-
href="#mangle.template-param">template-param</a>&gt; in a &lt;<a
5619-
href="#mangle.lambda-sig">lambda-sig</a>&gt; can only ever refer to a
5620-
template parameter of a generic lambda.
5653+
If a generic lambda appears in a dependent context (for example, in
5654+
the signature of a function template), references to its template
5655+
parameters (including those introduced by uses of <code>auto</code>)
5656+
are encoded as <code>&lt;<a href="#mangle.template-param">template-param</a>&gt;</code>s
5657+
with a non-zero level.
5658+
</p>
5659+
5660+
<p>
5661+
<img src=warning.gif alt="<b>NOTE</b>:">
5662+
<i>
5663+
A non-member function template whose signature contains a lambda-expression can
5664+
never redeclare a function template declared in a different translation unit.
5665+
Implementations must ensure that such symbols are not linked together across
5666+
translation units, perhaps by giving affected symbols internal linkage.
5667+
</i>
5668+
</p>
56215669

56225670
<p>
56235671
<a name="mangling-compression">

0 commit comments

Comments
 (0)