<!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
        <title>Abstract</title>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.0-rc.1/dist/katex.min.css" integrity="sha384-D+9gmBxUQogRLqvARvNLmA9hS2x//eK1FhVb9PiU86gmcrBrJAQT8okdJ4LMp2uv" crossorigin="anonymous">
        <style>
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ body { font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback"; font-size: 14px; padding: 0 26px; line-height: 22px; word-wrap: break-word; } #code-csp-warning { position: fixed; top: 0; right: 0; color: white; margin: 16px; text-align: center; font-size: 12px; font-family: sans-serif; background-color:#444444; cursor: pointer; padding: 6px; box-shadow: 1px 1px 1px rgba(0,0,0,.25); } #code-csp-warning:hover { text-decoration: none; background-color:#007acc; box-shadow: 2px 2px 2px rgba(0,0,0,.25); } body.scrollBeyondLastLine { margin-bottom: calc(100vh - 22px); } body.showEditorSelection .code-line { position: relative; } body.showEditorSelection .code-active-line:before, body.showEditorSelection .code-line:hover:before { content: ""; display: block; position: absolute; top: 0; left: -12px; height: 100%; } body.showEditorSelection li.code-active-line:before, body.showEditorSelection li.code-line:hover:before { left: -30px; } .vscode-light.showEditorSelection .code-active-line:before { border-left: 3px solid rgba(0, 0, 0, 0.15); } .vscode-light.showEditorSelection .code-line:hover:before { border-left: 3px solid rgba(0, 0, 0, 0.40); } .vscode-light.showEditorSelection .code-line .code-line:hover:before { border-left: none; } .vscode-dark.showEditorSelection .code-active-line:before { border-left: 3px solid rgba(255, 255, 255, 0.4); } .vscode-dark.showEditorSelection .code-line:hover:before { border-left: 3px solid rgba(255, 255, 255, 0.60); } .vscode-dark.showEditorSelection .code-line .code-line:hover:before { border-left: none; } .vscode-high-contrast.showEditorSelection .code-active-line:before { border-left: 3px solid rgba(255, 160, 0, 0.7); } .vscode-high-contrast.showEditorSelection .code-line:hover:before { border-left: 3px solid rgba(255, 160, 0, 1); } .vscode-high-contrast.showEditorSelection .code-line .code-line:hover:before { border-left: none; } img { max-width: 100%; max-height: 100%; } a { text-decoration: none; } a:hover { text-decoration: underline; } a:focus, input:focus, select:focus, textarea:focus { outline: 1px solid -webkit-focus-ring-color; outline-offset: -1px; } hr { border: 0; height: 2px; border-bottom: 2px solid; } h1 { padding-bottom: 0.3em; line-height: 1.2; border-bottom-width: 1px; border-bottom-style: solid; } h1, h2, h3 { font-weight: normal; } h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { font-size: inherit; line-height: auto; } table { border-collapse: collapse; } table > thead > tr > th { text-align: left; border-bottom: 1px solid; } table > thead > tr > th, table > thead > tr > td, table > tbody > tr > th, table > tbody > tr > td { padding: 5px 10px; } table > tbody > tr + tr > td { border-top: 1px solid; } blockquote { margin: 0 7px 0 5px; padding: 0 16px 0 10px; border-left-width: 5px; border-left-style: solid; } code { font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"; font-size: 14px; line-height: 19px; } body.wordWrap pre { white-space: pre-wrap; } .mac code { font-size: 12px; line-height: 18px; } pre:not(.hljs), pre.hljs code > div { padding: 16px; border-radius: 3px; overflow: auto; } /** Theming */ pre code { color: var(--vscode-editor-foreground); } .vscode-light pre { background-color: rgba(220, 220, 220, 0.4); } .vscode-dark pre { background-color: rgba(10, 10, 10, 0.4); } .vscode-high-contrast pre { background-color: rgb(0, 0, 0); } .vscode-high-contrast h1 { border-color: rgb(0, 0, 0); } .vscode-light table > thead > tr > th { border-color: rgba(0, 0, 0, 0.69); } .vscode-dark table > thead > tr > th { border-color: rgba(255, 255, 255, 0.69); } .vscode-light h1, .vscode-light hr, .vscode-light table > tbody > tr + tr > td { border-color: rgba(0, 0, 0, 0.18); } .vscode-dark h1, .vscode-dark hr, .vscode-dark table > tbody > tr + tr > td { border-color: rgba(255, 255, 255, 0.18); } 
</style>
<style>
/* https://raw.githubusercontent.com/isagalaev/highlight.js/master/src/styles/vs2015.css */ /* * Visual Studio 2015 dark style * Author: Nicolas LLOBERA <nllobera@gmail.com> */ .hljs-keyword, .hljs-literal, .hljs-symbol, .hljs-name { color: #569CD6; } .hljs-link { color: #569CD6; text-decoration: underline; } .hljs-built_in, .hljs-type { color: #4EC9B0; } .hljs-number, .hljs-class { color: #B8D7A3; } .hljs-string, .hljs-meta-string { color: #D69D85; } .hljs-regexp, .hljs-template-tag { color: #9A5334; } .hljs-subst, .hljs-function, .hljs-title, .hljs-params, .hljs-formula { color: #DCDCDC; } .hljs-comment, .hljs-quote { color: #57A64A; font-style: italic; } .hljs-doctag { color: #608B4E; } .hljs-meta, .hljs-meta-keyword, .hljs-tag { color: #9B9B9B; } .hljs-variable, .hljs-template-variable { color: #BD63C5; } .hljs-attr, .hljs-attribute, .hljs-builtin-name { color: #9CDCFE; } .hljs-section { color: gold; } .hljs-emphasis { font-style: italic; } .hljs-strong { font-weight: bold; } /*.hljs-code { font-family:'Monospace'; }*/ .hljs-bullet, .hljs-selector-tag, .hljs-selector-id, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo { color: #D7BA7D; } .hljs-addition { background-color: #144212; display: inline-block; width: 100%; } .hljs-deletion { background-color: #600; display: inline-block; width: 100%; } /* From https://raw.githubusercontent.com/isagalaev/highlight.js/master/src/styles/vs.css */ /* Visual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name> */ .vscode-light .hljs-function, .vscode-light .hljs-params { color: inherit; } .vscode-light .hljs-comment, .vscode-light .hljs-quote, .vscode-light .hljs-variable { color: #008000; } .vscode-light .hljs-keyword, .vscode-light .hljs-selector-tag, .vscode-light .hljs-built_in, .vscode-light .hljs-name, .vscode-light .hljs-tag { color: #00f; } .vscode-light .hljs-string, .vscode-light .hljs-title, .vscode-light .hljs-section, .vscode-light .hljs-attribute, .vscode-light .hljs-literal, .vscode-light .hljs-template-tag, .vscode-light .hljs-template-variable, .vscode-light .hljs-type, .vscode-light .hljs-addition { color: #a31515; } .vscode-light .hljs-deletion, .vscode-light .hljs-selector-attr, .vscode-light .hljs-selector-pseudo, .vscode-light .hljs-meta { color: #2b91af; } .vscode-light .hljs-doctag { color: #808080; } .vscode-light .hljs-attr { color: #f00; } .vscode-light .hljs-symbol, .vscode-light .hljs-bullet, .vscode-light .hljs-link { color: #00b0e8; } .vscode-light .hljs-emphasis { font-style: italic; } .vscode-light .hljs-strong { font-weight: bold; }
</style>
<style>
.task-list-item { list-style-type: none; } .task-list-item-checkbox { margin-left: -20px; vertical-align: middle; }
</style>
        <style>
            body {
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', 'HelveticaNeue-Light', 'Ubuntu', 'Droid Sans', sans-serif;
                font-size: 14px;
                line-height: 1.6;
            }
        </style>
        
    </head>
    <body>
        <style type="text/css">
    p {text-align:justify}
    li {text-align:justify}
    blockquote.note
    {
      background-color:#E0E0E0;
      padding-left: 15px;
      padding-right: 15px;
      padding-top: 1px;
      padding-bottom: 1px;
    }
    ins {background-color:#A0FFA0}
    del {background-color:#FFA0A0}
    table {border-collapse: collapse;}
    table, th, td {
      border: 1px solid black;
      border-collapse: collapse;
    }
  </style>
<table>
<thead>
<tr>
<th>Document Number:</th>
<th>P0912R4</th>
</tr>
</thead>
<tbody>
<tr>
<td>Date:</td>
<td>2019-01-16</td>
</tr>
<tr>
<td>Audience:</td>
<td>WG21</td>
</tr>
<tr>
<td>Revises:</td>
<td>P0912R3</td>
</tr>
<tr>
<td>Reply to:</td>
<td><a href="mailto:gorn@microsoft.com">gorn@microsoft.com</a></td>
</tr>
</tbody>
</table>
<h1 id="merge-coroutines-ts-into-c20-working-draft">Merge Coroutines TS into C++20 working draft</h1>
<h2 id="abstract">Abstract</h2>
<p>This paper proposes merging Working Draft of Coroutines TS [N4775] into the C++20 working draft [N4791].</p>
<h2 id="revision-history">Revision history</h2>
<p>r0: initial revision</p>
<p>r1:</p>
<ul>
<li>Markdown rendered as HTML.</li>
<li>Replaced ligature ff with two letters ff.</li>
<li>Expanded on compiler availability.</li>
<li>Reworded the closing paragraph.</li>
<li>Make insertions <ins>green</ins>.</li>
<li>Updated working draft numbers</li>
</ul>
<p>r2:</p>
<ul>
<li>... keywords s/were/are added ...</li>
<li>P0664R3 =&gt; P0664R4</li>
<li>Added list of edits requested by LWG on 2018-06-08.</li>
</ul>
<p>r3:</p>
<ul>
<li>document numbers and edition instructions updated</li>
</ul>
<p>r4:</p>
<ul>
<li>document numbers and edition instructions updated</li>
</ul>
<h2 id="introduction">Introduction</h2>
<ul>
<li>Coroutines of this kind were available in a shipping compiler since 2014.</li>
<li>We have been receiving and acting upon developer feedback for 5 years.</li>
<li>The software built using coroutines has been deployed on more than <strong>400 million</strong> devices in the hands of delighted consumers.</li>
<li>The software built using coroutines on Linux and Windows is powering the foundational services of Windows Azure cloud services.</li>
<li>Coroutines have been used by thousands of software developers in various companies.</li>
<li>We have two publicly available implementations of coroutines TS in MSVC since version 2015 SP2 (2016) and clang version 5 (2017).</li>
<li>We have an independent coroutine implementation in EDG frontend (2015).</li>
<li>GCC implementation is in progress.</li>
<li>There are several open source coroutine abstraction libraries, including an extensive open source coroutine library <a href="https://github.com/lewissbaker/cppcoro">cppcoro</a> that utilizes most of the coroutine features with tests that can be used to smoke test emerging coroutine implementation for completeness and correctness.</li>
<li>Other libraries provides coroutines TS bindings for its types, for example, Facebook's Folly, Just::Thread Pro and others.</li>
</ul>
<p>Coroutines address the dire need by dramatically simplifying development of asynchronous code.
Coroutines have been available and in use for 5 years. We have shipping implementations from two major
compiler vendors. It is time to merge Coroutines TS to the working paper.</p>
 <!-- to unblock development related libraries utilizing coroutine language facilities. -->
<h2 id="wording">Wording</h2>
<ul>
<li>
<p>Apply coroutine wording from N4775 to the working draft with the following changes:</p>
<ul>
<li>replace <code>experimental::</code> with nothing</li>
<li>replace <code>&lt;experimental/coroutine&gt;</code> with <code>&lt;coroutine&gt;</code></li>
<li>in synopsis in [coroutine.trivial.awaitables] and [support.coroutine]
<ul>
<li>remove &quot;namespace experimental {&quot; and &quot;} // namespace experimental&quot;</li>
<li>remove &quot;inline namespace coroutines_v1 {&quot; and &quot;} // namespace coroutines_v1&quot;</li>
</ul>
</li>
</ul>
</li>
<li>
<p>LaTex specific instructions: before applying the changes, in the coroutine TS LaTeX source, replace all occurrences of \cxxref{<i>stable-name</i>} with \ref{<i>stable-name</i>}.</p>
</li>
<li>
<p>Add underlined text to rationale in [diff.cpp17.lex]:</p>
</li>
</ul>
<blockquote>
<p><strong>Rationale:</strong> Required for new features.<br>...<br>
<ins>(1.5) -- ...
The <code>co_await</code>, <code>co_yield</code>, and <code>co_return</code> keywords are added to enable the definition of coroutines (\ref{dcl.fct.def.coroutine}).</ins><br>
<strong>Effect on original feature:</strong> Valid ISO C++ 2017 code using
<code>char8_t</code>, <code>concept</code>, <code>consteval</code><ins>, <code>co_await</code>, <code>co_yield</code>, <code>co_return</code>,</ins> or <code>requires</code> as an identifier is not valid in this International Standard.</p>
</blockquote>
<ul>
<li>Add underlined text to &quot;Effect on original feature&quot; in [diff.cpp17.library]:</li>
</ul>
<blockquote>
<p><strong>Effect on original feature:</strong> The following C++ headers are new: <code>&lt;bit&gt;</code>, <code>&lt;compare&gt;</code>, <code>&lt;contracts&gt;</code><ins>, <code>&lt;coroutine&gt;</code>,</ins> <code>&lt;span&gt;</code>, <code>&lt;syncstream&gt;</code>, and <code>&lt;version&gt;</code>. Valid C++ 2017 code that #includes headers with these names may be invalid in this International Standard.</p>
</blockquote>

    </body>
    </html>