<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;">&lt;</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;">&gt;</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;">&gt;</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;">&gt;</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;">&amp;&amp;</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;">&amp;</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;">&amp;</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>