<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">How does @inlinable relate to the
@_specialize attribute described in <a moz-do-not-send="true"
href="https://github.com/apple/swift/pull/6797">https://github.com/apple/swift/pull/6797</a>
(original swift-evolution post about it: <a
moz-do-not-send="true"
href="https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20160314/001449.html">https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20160314/001449.html</a>)?<br>
<br>
Here's how I understand it:<br>
<br>
@_specialize emits the specialized generic code (for the types
specified in the @_specialize declaration) in the module binary
(module A). The downside is that the author of module A has to
decide for which types they want to emit specialized code. Clients
of module A that need specialization for other types are out of
luck.<br>
<br>
@inlinable enables the optimizer to emit specialized code in the
binaries that import module A. It shifts the decision what to
specialize where it belongs (and where it can be made).<br>
<br>
Is this understanding correct? Will @inlinable cover everything
we'd need @_specialize for, or is the plan to make @_specialize
public as well in the future?<br>
<br>
Ole<br>
<br>
On 02.10.17 22:31, Slava Pestov via swift-evolution wrote:<br>
</div>
<blockquote type="cite"
cite="mid:7ABBBB77-A9DF-4648-A10D-F1349803C0C6@apple.com">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Hi all,
<div class=""><br class="">
</div>
<div class="">Here is a draft proposal that makes public a feature
we’ve had for a while. Let me know what you think!</div>
<div class=""><br class="">
</div>
<div class="">
<h1 id="toc_0" style="-webkit-print-color-adjust: exact; margin:
0px 0px 10px; padding: 0px; -webkit-font-smoothing:
antialiased; cursor: text; position: relative; font-size:
28px; font-family: Helvetica, arial, sans-serif;
background-color: rgb(255, 255, 255);" class="">Cross-module
inlining and specialization ("@inlinable")</h1>
<ul style="-webkit-print-color-adjust: exact; margin: 15px 0px;
padding-left: 30px; font-family: Helvetica, arial, sans-serif;
font-size: 14px; background-color: rgb(255, 255, 255);"
class="">
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">Proposal: <a
href="file:///Users/slava/NNNN-filename.md"
style="-webkit-print-color-adjust: exact; color: rgb(65,
131, 196); margin-top: 0px;" class=""
moz-do-not-send="true">SE-NNNN</a></li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">Authors: <a href="https://github.com/slavapestov"
style="-webkit-print-color-adjust: exact; color: rgb(65,
131, 196); margin-top: 0px;" class=""
moz-do-not-send="true">Slava Pestov</a>, <a
href="https://github.com/jrose-apple"
style="-webkit-print-color-adjust: exact; color: rgb(65,
131, 196);" class="" moz-do-not-send="true">Jordan Rose</a></li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">Review Manager: TBD</li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">Status: <strong style="-webkit-print-color-adjust:
exact; margin-top: 0px;" class="">Initial pitch</strong></li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">Implementation: Already implemented as an
underscored attribute <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;" class="">@_inlineable</code></li>
</ul>
<h2 id="toc_1" style="-webkit-print-color-adjust: exact; margin:
20px 0px 10px; padding: 0px; -webkit-font-smoothing:
antialiased; cursor: text; position: relative; font-size:
24px; border-bottom-width: 1px; border-bottom-style: solid;
border-bottom-color: rgb(204, 204, 204); font-family:
Helvetica, arial, sans-serif; background-color: rgb(255, 255,
255);" class="">Introduction</h2>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">We propose
introducing an <code style="-webkit-print-color-adjust: exact;
margin: 0px 2px; padding: 0px 5px; white-space: nowrap;
border: 1px solid rgb(234, 234, 234); background-color:
rgb(248, 248, 248); border-top-left-radius: 3px;
border-top-right-radius: 3px; border-bottom-right-radius:
3px; border-bottom-left-radius: 3px;" class="">@inlinable</code> attribute
which exports the body of a function as part of a module's
interface, making it available to the optimizer when
referenced from other modules.</p>
<h2 id="toc_2" style="-webkit-print-color-adjust: exact; margin:
20px 0px 10px; padding: 0px; -webkit-font-smoothing:
antialiased; cursor: text; position: relative; font-size:
24px; border-bottom-width: 1px; border-bottom-style: solid;
border-bottom-color: rgb(204, 204, 204); font-family:
Helvetica, arial, sans-serif; background-color: rgb(255, 255,
255);" class="">Motivation</h2>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">One of the top
priorities of the Swift 5 release is a design and
implementation of <em style="-webkit-print-color-adjust:
exact;" class="">the Swift ABI</em>. This effort consists of
three major tasks:</p>
<ul style="-webkit-print-color-adjust: exact; margin: 15px 0px;
padding-left: 30px; font-family: Helvetica, arial, sans-serif;
font-size: 14px; background-color: rgb(255, 255, 255);"
class="">
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">
<p style="-webkit-print-color-adjust: exact; margin: 0px 0px
15px;" class="">Finalizing the low-level function calling
convention, layout of data types, and various runtime data
structures. The goal here is to maintain compatibility
across compiler versions, ensuring that we can continue to
make improvements to the Swift compiler without breaking
binaries built with an older version of the compiler.</p>
</li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">
<p style="-webkit-print-color-adjust: exact; margin: 0px 0px
15px;" class="">Implementing support for <em
style="-webkit-print-color-adjust: exact; margin-top:
0px;" class="">library evolution</em>, or the ability to
make certain source-compatible changes, without breaking
binary compatibility. Examples of source-compatible
changes we are considering include adding new stored
properties to structs and classes, removing private stored
properties from structs and classes, adding new public
methods to a class, or adding new protocol requirements
that have a default implementation. The goal here is to
maintain compatibility across framework versions, ensuring
that framework authors can evolve their API without
breaking binaries built against an older version of the
framework. For more information about the resilience
model, see the <a
href="https://github.com/apple/swift/blob/master/docs/LibraryEvolution.rst"
style="-webkit-print-color-adjust: exact; color: rgb(65,
131, 196);" class="" moz-do-not-send="true">library
evolution document</a> in the Swift repository.</p>
</li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">
<p style="-webkit-print-color-adjust: exact; margin: 0px 0px
15px;" class="">Stabilizing the API of the standard
library. The goal here is to ensure that the standard
library can be deployed separately from client binaries
and frameworks, without forcing recompilation of existing
code.</p>
</li>
</ul>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">All existing
language features of Swift were designed with these goals in
mind. In particular, the implementation of generic types and
functions relies on runtime reified types to allow separate
compilation and type checking of generic code.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">Within the
scope of a single module, the Swift compiler performs very
aggressive optimization, including full and partial
specialization of generic functions, inlining, and various
forms of interprocedural analysis.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">On the other
hand, across module boundaries, runtime generics introduce
unavoidable overhead, as reified type metadata must be passed
between functions, and various indirect access patterns must
be used to manipulate values of generic type. We believe that
for most applications, this overhead is negligible compared to
the actual work performed by the code itself.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">However, for
some advanced use cases, and in particular for the standard
library, the overhead of runtime generics can dominate any
useful work performed by the library. Examples include the
various algorithms defined in protocol extensions of <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">Sequence</code> and <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">Collection</code>, for instance the <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">map</code>method of the <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">Sequence</code> protocol. Here the algorithm
is very simple and spends most of its time manipulating
generic values and calling to a user-supplied closure;
specialization and inlining can completely eliminate the
algorithm of the higher-order function call and generate
equivalent code to a hand-written loop manipulating concrete
types.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">We would like
to annotate such functions with the <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> attribute. This will make
their bodies available to the optimizer when building client
code; on the other hand, calling such a function will cause it
to be emitted into the client binary, meaning that if a
library were to change the definition of such a function, only
binaries built against the newer version of library will use
the new definition.</p>
<h2 id="toc_3" style="-webkit-print-color-adjust: exact; margin:
20px 0px 10px; padding: 0px; -webkit-font-smoothing:
antialiased; cursor: text; position: relative; font-size:
24px; border-bottom-width: 1px; border-bottom-style: solid;
border-bottom-color: rgb(204, 204, 204); font-family:
Helvetica, arial, sans-serif; background-color: rgb(255, 255,
255);" class="">Proposed solution</h2>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">The <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> attribute causes the body
of a function to be emitted as part of the module interface.
For example, a framework can define a rather impractical
implementation of an algorithm which returns <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">true</code> if all elements of a sequence are
equal or if the sequence is empty, and <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">false</code>otherwise:</p>
<div style="-webkit-print-color-adjust: exact; font-family:
Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">
<pre class=" language-swift" style="-webkit-print-color-adjust: exact; margin-top: 0.5em; margin-bottom: 0.5em; background-color: rgb(245, 242, 240); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 1.5; overflow: auto; padding: 1em; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; word-spacing: normal; word-break: normal; word-wrap: normal; tab-size: 4; -webkit-hyphens: none;"><code class=" language-swift" style="-webkit-print-color-adjust: exact; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-image: none; text-shadow: white 0px 1px; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;">@inlinable <span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">public</span> <span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">func</span> allEqual<span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;"><</span>T<span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">></span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">(</span><span class="token number" style="-webkit-print-color-adjust: exact; color: rgb(153, 0, 85);">_</span> seq<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">:</span> T<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">)</span> <span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">-</span><span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">></span> <span class="token builtin" style="-webkit-print-color-adjust: exact; color: rgb(102, 153, 0);">Bool</span>
<span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">where</span> T <span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">:</span> <span class="token builtin" style="-webkit-print-color-adjust: exact; color: rgb(102, 153, 0);">Sequence</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">,</span> T<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">.</span><span class="token builtin" style="-webkit-print-color-adjust: exact; color: rgb(102, 153, 0);">Element</span> <span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">:</span> <span class="token builtin" style="-webkit-print-color-adjust: exact; color: rgb(102, 153, 0);">Equatable</span> <span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">{</span>
<span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">var</span> iter <span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">=</span> seq<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">.</span><span class="token function" style="-webkit-print-color-adjust: exact; color: rgb(221, 74, 104);">makeIterator</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">(</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">)</span>
<span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">guard</span> <span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">let</span> <span class="token builtin" style="-webkit-print-color-adjust: exact; color: rgb(102, 153, 0);">first</span> <span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">=</span> iter<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">.</span><span class="token function" style="-webkit-print-color-adjust: exact; color: rgb(221, 74, 104);">next</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">(</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">)</span> <span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">else</span> <span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">{</span> <span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">return</span> <span class="token boolean" style="-webkit-print-color-adjust: exact; color: rgb(153, 0, 85);">true</span> <span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">}</span>
<span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">func</span> <span class="token function" style="-webkit-print-color-adjust: exact; color: rgb(221, 74, 104);">rec</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">(</span><span class="token number" style="-webkit-print-color-adjust: exact; color: rgb(153, 0, 85);">_</span> iter<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">:</span> <span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">inout</span> T<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">.</span><span class="token builtin" style="-webkit-print-color-adjust: exact; color: rgb(102, 153, 0);">Iterator</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">)</span> <span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">-</span><span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">></span> <span class="token builtin" style="-webkit-print-color-adjust: exact; color: rgb(102, 153, 0);">Bool</span> <span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">{</span>
<span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">guard</span> <span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">let</span> next <span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">=</span> iter<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">.</span><span class="token function" style="-webkit-print-color-adjust: exact; color: rgb(221, 74, 104);">next</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">(</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">)</span> <span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">else</span> <span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">{</span> <span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">return</span> <span class="token boolean" style="-webkit-print-color-adjust: exact; color: rgb(153, 0, 85);">true</span> <span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">}</span>
<span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">return</span> next <span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">==</span> <span class="token builtin" style="-webkit-print-color-adjust: exact; color: rgb(102, 153, 0);">first</span> <span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">&&</span> <span class="token function" style="-webkit-print-color-adjust: exact; color: rgb(221, 74, 104);">rec</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">(</span><span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">&</span>iter<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">)</span>
<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">}</span>
<span class="token keyword" style="-webkit-print-color-adjust: exact; color: rgb(0, 119, 170);">return</span> <span class="token function" style="-webkit-print-color-adjust: exact; color: rgb(221, 74, 104);">rec</span><span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">(</span><span class="token operator" style="-webkit-print-color-adjust: exact; color: rgb(166, 127, 89); background-color: rgba(255, 255, 255, 0.498039); background-position: initial initial; background-repeat: initial initial;">&</span>iter<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">)</span>
<span class="token punctuation" style="-webkit-print-color-adjust: exact; color: rgb(153, 153, 153);">}</span></code></pre>
</div>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">A client
binary built against this framework can call <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">allEqual()</code> and enjoy a possible
performance improvement when built with optimizations enabled,
due to the elimination of abstraction overhead.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">On the other
hand, once the framework author comes to their senses and
implements an iterative solution to replace the recursive
algorithm defined above, the client binary cannot make use of
the more efficient implementation until recompiled.</p>
<h2 id="toc_4" style="-webkit-print-color-adjust: exact; margin:
20px 0px 10px; padding: 0px; -webkit-font-smoothing:
antialiased; cursor: text; position: relative; font-size:
24px; border-bottom-width: 1px; border-bottom-style: solid;
border-bottom-color: rgb(204, 204, 204); font-family:
Helvetica, arial, sans-serif; background-color: rgb(255, 255,
255);" class="">Detailed design</h2>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">The new <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> attribute can only be
applied to the following kinds of declarations:</p>
<ul style="-webkit-print-color-adjust: exact; margin: 15px 0px;
padding-left: 30px; font-family: Helvetica, arial, sans-serif;
font-size: 14px; background-color: rgb(255, 255, 255);"
class="">
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">Functions and methods</li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">Subscripts</li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">Computed properties</li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">Initializers</li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">Deinitializers</li>
</ul>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">The attribute
can only be applied to public declarations. This is because
the attribute only has an effect when the declaration is used
from outside of the module. Within a module, the optimizer can
always rely on the function body being available.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">For similar
reasons, the attribute cannot be applied to local
declarations, that is, declarations nested inside functions or
statements. However, local functions and closure expressions
defined inside public <code style="-webkit-print-color-adjust:
exact; margin: 0px 2px; padding: 0px 5px; white-space:
nowrap; border: 1px solid rgb(234, 234, 234);
background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> functions are always
implicitly <code style="-webkit-print-color-adjust: exact;
margin: 0px 2px; padding: 0px 5px; white-space: nowrap;
border: 1px solid rgb(234, 234, 234); background-color:
rgb(248, 248, 248); border-top-left-radius: 3px;
border-top-right-radius: 3px; border-bottom-right-radius:
3px; border-bottom-left-radius: 3px;" class="">@inlinable</code>.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">When applied
to subscripts or computed properties, the attribute applies to
the getter, setter, <code style="-webkit-print-color-adjust:
exact; margin: 0px 2px; padding: 0px 5px; white-space:
nowrap; border: 1px solid rgb(234, 234, 234);
background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">didSet</code>and <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">willSet</code>, if present.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">The compiler
will enforce certain restrictions on bodies of inlinable
declarations:</p>
<ul style="-webkit-print-color-adjust: exact; margin: 15px 0px;
padding-left: 30px; font-family: Helvetica, arial, sans-serif;
font-size: 14px; background-color: rgb(255, 255, 255);"
class="">
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">
<p style="-webkit-print-color-adjust: exact; margin: 0px 0px
15px;" class="">inlinable declarations cannot define local
types. This is because all types have a unique identity in
the Swift runtime, visible to the language in the form of
the <code style="-webkit-print-color-adjust: exact;
margin: 0px 2px; padding: 0px 5px; white-space: nowrap;
border: 1px solid rgb(234, 234, 234); background-color:
rgb(248, 248, 248); border-top-left-radius: 3px;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;" class="">==</code> operator
on metatype values. It is not clear what it would mean if
two different libraries inline the same local type from a
third library, with all three libraries linked together
into the same binary. This becomes even worse if two <em
style="-webkit-print-color-adjust: exact;" class="">different</em> versions
of the same inlinable function appear inside the same
binary.</p>
</li>
<li style="-webkit-print-color-adjust: exact; margin: 0px;"
class="">
<p style="-webkit-print-color-adjust: exact; margin: 0px 0px
15px;" class="">inlinable declarations can only reference
other public declarations. This is because they can be
emitted into the client binary, and are therefore limited
to referencing symbols that the client binary can
reference.</p>
</li>
</ul>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class=""><strong
style="-webkit-print-color-adjust: exact;" class="">Note:</strong> The
restrictions enforced on the bodies of <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> declarations are exactly
those that we have in place on default argument expressions
of <code style="-webkit-print-color-adjust: exact; margin: 0px
2px; padding: 0px 5px; white-space: nowrap; border: 1px
solid rgb(234, 234, 234); background-color: rgb(248, 248,
248); border-top-left-radius: 3px; border-top-right-radius:
3px; border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;" class="">public</code> functions
in Swift 4.</p>
<h2 id="toc_5" style="-webkit-print-color-adjust: exact; margin:
20px 0px 10px; padding: 0px; -webkit-font-smoothing:
antialiased; cursor: text; position: relative; font-size:
24px; border-bottom-width: 1px; border-bottom-style: solid;
border-bottom-color: rgb(204, 204, 204); font-family:
Helvetica, arial, sans-serif; background-color: rgb(255, 255,
255);" class="">Source compatibility</h2>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">The
introduction of the <code style="-webkit-print-color-adjust:
exact; margin: 0px 2px; padding: 0px 5px; white-space:
nowrap; border: 1px solid rgb(234, 234, 234);
background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> attribute is an additive
change to the language and has no impact on source
compatibility.</p>
<h2 id="toc_6" style="-webkit-print-color-adjust: exact; margin:
20px 0px 10px; padding: 0px; -webkit-font-smoothing:
antialiased; cursor: text; position: relative; font-size:
24px; border-bottom-width: 1px; border-bottom-style: solid;
border-bottom-color: rgb(204, 204, 204); font-family:
Helvetica, arial, sans-serif; background-color: rgb(255, 255,
255);" class="">Effect on ABI stability</h2>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">The
introduction of the <code style="-webkit-print-color-adjust:
exact; margin: 0px 2px; padding: 0px 5px; white-space:
nowrap; border: 1px solid rgb(234, 234, 234);
background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> attribute does not change
the ABI of existing declarations. However, adding <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> to an existing declaration
changes ABI, because the declaration will no longer have a
public entry point in the generated library. Removing <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> from an existing
declaration does not change ABI, because it merely introduces
a new public symbol in the generated library.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">We have
discussed adding a "versioned <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code>" variant that preserves the
public entry point for older clients, while making the
declaration inlinable for newer clients. This will likely be a
separate proposal and discussion.</p>
<h2 id="toc_7" style="-webkit-print-color-adjust: exact; margin:
20px 0px 10px; padding: 0px; -webkit-font-smoothing:
antialiased; cursor: text; position: relative; font-size:
24px; border-bottom-width: 1px; border-bottom-style: solid;
border-bottom-color: rgb(204, 204, 204); font-family:
Helvetica, arial, sans-serif; background-color: rgb(255, 255,
255);" class="">Effect on API resilience</h2>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">Because a
declaration marked <code style="-webkit-print-color-adjust:
exact; margin: 0px 2px; padding: 0px 5px; white-space:
nowrap; border: 1px solid rgb(234, 234, 234);
background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> is not part of the library
ABI, removing such a declaration is a binary-compatible, but
source-incompatible change.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">Any changes to
the body of a declaration marked <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> should be considered very
carefully. As a general guideline, we feel that <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> makes the most sense with
"obviously correct" algorithms which manipulate other data
types abstractly through protocols, so that any future changes
to an <code style="-webkit-print-color-adjust: exact; margin:
0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px
solid rgb(234, 234, 234); background-color: rgb(248, 248,
248); border-top-left-radius: 3px; border-top-right-radius:
3px; border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;" class="">@inlinable</code> declaration
are optimizations that do not change observed behavior.</p>
<h2 id="toc_8" style="-webkit-print-color-adjust: exact; margin:
20px 0px 10px; padding: 0px; -webkit-font-smoothing:
antialiased; cursor: text; position: relative; font-size:
24px; border-bottom-width: 1px; border-bottom-style: solid;
border-bottom-color: rgb(204, 204, 204); font-family:
Helvetica, arial, sans-serif; background-color: rgb(255, 255,
255);" class="">Comparison with other languages</h2>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">The closest
language feature to the <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> attribute is found in C and
C++. In C and C++, the concept of a header file is similar to
Swift's binary <code style="-webkit-print-color-adjust: exact;
margin: 0px 2px; padding: 0px 5px; white-space: nowrap;
border: 1px solid rgb(234, 234, 234); background-color:
rgb(248, 248, 248); border-top-left-radius: 3px;
border-top-right-radius: 3px; border-bottom-right-radius:
3px; border-bottom-left-radius: 3px;" class="">swiftmodule</code> files,
except they are written by hand and not generated by the
compiler. Swift's <code style="-webkit-print-color-adjust:
exact; margin: 0px 2px; padding: 0px 5px; white-space:
nowrap; border: 1px solid rgb(234, 234, 234);
background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">public</code> declarations are roughly
analogous to declarations whose prototypes appear in a header
file.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">Header files
mostly contain declarations without bodies, but can also
declare <code style="-webkit-print-color-adjust: exact;
margin: 0px 2px; padding: 0px 5px; white-space: nowrap;
border: 1px solid rgb(234, 234, 234); background-color:
rgb(248, 248, 248); border-top-left-radius: 3px;
border-top-right-radius: 3px; border-bottom-right-radius:
3px; border-bottom-left-radius: 3px;" class="">static inline</code>functions
with bodies. Such functions are not part of the binary
interface of the library, and are instead emitted into client
code when referenced. As with <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> declarations, <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">static inline</code>functions can only
reference other "public" declarations, that is, those that are
defined in other header files.</p>
<h2 id="toc_9" style="-webkit-print-color-adjust: exact; margin:
20px 0px 10px; padding: 0px; -webkit-font-smoothing:
antialiased; cursor: text; position: relative; font-size:
24px; border-bottom-width: 1px; border-bottom-style: solid;
border-bottom-color: rgb(204, 204, 204); font-family:
Helvetica, arial, sans-serif; background-color: rgb(255, 255,
255);" class="">Alternatives considered</h2>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">One possible
alterative would be to add a new compiler mode where <em
style="-webkit-print-color-adjust: exact;" class="">all</em> declarations
become implicitly <code style="-webkit-print-color-adjust:
exact; margin: 0px 2px; padding: 0px 5px; white-space:
nowrap; border: 1px solid rgb(234, 234, 234);
background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code>.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">However, such
a compilation mode would not solve the problem of delivering a
stable ABI and standard library which can be deployed
separately from user code. We <em
style="-webkit-print-color-adjust: exact;" class="">don't
want</em> all declaration bodies in the standard library to
be available to the optimizer when building user code.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">While such a
feature might be useful for users who build private frameworks
that are always shipped together their application without
resilience concerns, we do not feel it aligns with our goals
for ABI stability, and at best it should be a separate
discussion.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">For similar
reasons, we do not feel that an "opt-out" attribute that can
be applied to declarations to mark them non-inlinable makes
sense.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">We have also
considered generalizing <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> to allow it to be applied
to entire blocks of declarations, for example at the level of
an extension. As we gain more experience with using this
attribute in the standard library we might decide this would
be a useful addition, but we feel that for now, it makes sense
to focus on the case of a single inlinable declaration
instead. Any future generalizations can be introduced as
additive language features.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">We originally
used the spelling <code style="-webkit-print-color-adjust:
exact; margin: 0px 2px; padding: 0px 5px; white-space:
nowrap; border: 1px solid rgb(234, 234, 234);
background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlineable</code> for the attribute.
However, we settled on <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@inlinable</code> for consistency with the <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">Decodable</code> and <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">Encodable</code> protocols, which are named
as they are and not <code style="-webkit-print-color-adjust:
exact; margin: 0px 2px; padding: 0px 5px; white-space:
nowrap; border: 1px solid rgb(234, 234, 234);
background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">Decodeable</code> and <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">Encodeable</code>.</p>
<p style="-webkit-print-color-adjust: exact; margin: 15px 0px;
font-family: Helvetica, arial, sans-serif; font-size: 14px;
background-color: rgb(255, 255, 255);" class="">Finally, we
have considered some alternate spellings for this attribute.
The name <code style="-webkit-print-color-adjust: exact;
margin: 0px 2px; padding: 0px 5px; white-space: nowrap;
border: 1px solid rgb(234, 234, 234); background-color:
rgb(248, 248, 248); border-top-left-radius: 3px;
border-top-right-radius: 3px; border-bottom-right-radius:
3px; border-bottom-left-radius: 3px;" class="">@inlinable</code> is
somewhat of a misnomer, because nothing about it actually
forces the compiler to inline the declaration; it might simply
generate a concrete specialization of it, or look at the body
as part of an interprocedural analysis, or completely ignore
the body. We have considered <code
style="-webkit-print-color-adjust: exact; margin: 0px 2px;
padding: 0px 5px; white-space: nowrap; border: 1px solid
rgb(234, 234, 234); background-color: rgb(248, 248, 248);
border-top-left-radius: 3px; border-top-right-radius: 3px;
border-bottom-right-radius: 3px; border-bottom-left-radius:
3px;" class="">@alwaysEmitIntoClient</code> as a more
accurate, but awkward, spelling of the attribute's behavior.</p>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
swift-evolution mailing list
<a class="moz-txt-link-abbreviated" href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>
<a class="moz-txt-link-freetext" href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a>
</pre>
</blockquote>
<p><br>
</p>
</body>
</html>