<!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0/katex.min.css" integrity="sha384-TEMocfGvRuD1rIAacqrknm5BQZ7W7uWitoih+jMNFXQIbNl16bO8OZmylH/Vi/Ei" 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 12px; line-height: 22px; word-wrap: break-word; } 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-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-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); } img { max-width: 100%; max-height: 100%; } a { color: #4080D0; text-decoration: none; } 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; } a:hover { color: #4080D0; text-decoration: underline; } 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: 5px 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; } code > div { padding: 16px; border-radius: 3px; overflow: auto; } /** Theming */ .vscode-light { color: rgb(30, 30, 30); } .vscode-dark { color: #DDD; } .vscode-high-contrast { color: white; } .vscode-light code { color: #A31515; } .vscode-dark code { color: #D7BA7D; } .vscode-light code > div { background-color: rgba(220, 220, 220, 0.4); } .vscode-dark code > div { background-color: rgba(10, 10, 10, 0.4); } .vscode-high-contrast code > div { 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); } .vscode-light blockquote, .vscode-dark blockquote { background: rgba(127, 127, 127, 0.1); border-color: rgba(0, 122, 204, 0.5); } .vscode-high-contrast blockquote { background: transparent; border-color: #fff; }
</style>
<style>
/* Tomorrow Theme */ /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ /* Original theme - https://github.com/chriskempson/tomorrow-theme */ /* Tomorrow Comment */ .hljs-comment, .hljs-quote { color: #8e908c; } /* Tomorrow Red */ .hljs-variable, .hljs-template-variable, .hljs-tag, .hljs-name, .hljs-selector-id, .hljs-selector-class, .hljs-regexp, .hljs-deletion { color: #c82829; } /* Tomorrow Orange */ .hljs-number, .hljs-built_in, .hljs-builtin-name, .hljs-literal, .hljs-type, .hljs-params, .hljs-meta, .hljs-link { color: #f5871f; } /* Tomorrow Yellow */ .hljs-attribute { color: #eab700; } /* Tomorrow Green */ .hljs-string, .hljs-symbol, .hljs-bullet, .hljs-addition { color: #718c00; } /* Tomorrow Blue */ .hljs-title, .hljs-section { color: #4271ae; } /* Tomorrow Purple */ .hljs-keyword, .hljs-selector-tag { color: #8959a8; } .hljs { display: block; overflow-x: auto; color: #4d4d4c; padding: 0.5em; } .hljs-emphasis { font-style: italic; } .hljs-strong { font-weight: bold; }
</style>
<style>
ul.contains-task-list { padding-left: 0; } ul ul.contains-task-list { padding-left: 40px; } .task-list-item { list-style-type: none; } .task-list-item-checkbox { 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>P0912R1</th>
</tr>
</thead>
<tbody>
<tr>
<td>Date:</td>
<td>2018-05-05</td>
</tr>
<tr>
<td>Audience:</td>
<td>WG21</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 [N4736] into the C++20 working draft [N4741].</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>
<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 4 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.</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>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 correction.</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 4 years. We have implementations from two major
compiler vendors. It is time to merge Coroutines TS to the working paper. <!-- to unblock development related libraries utilizing coroutine language facilities. --></p>
<h2 id="wording">Wording</h2>
<ul>
<li>
<p>Apply coroutine wording from N4736 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>Apply resolution to adopted issues from Coroutine TS issue list P0664R3.</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. The <code>requires</code> keyword is added to introduce constraints through a <em>requires-clause</em> or a <em>requires-expression</em>. The <code>concept</code> keyword is added to enable the definition of concepts (17.6.8). <ins>The <code>co_await</code>, <code>co_yield</code>, and <code>co_return</code> keywords were added to enable the definition of coroutines (11.4.4).</ins> Effect on original feature: Valid ISO C++ 2017 code using <code>concept</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;compare&gt;</code><ins>, <code>&lt;coroutine&gt;</code>,</ins> and <code>&lt;syncstream&gt;</code>. Valid C++ 2017 code that #includes headers with these names may be invalid in this International Standard.</p>
</blockquote>

    </body>
    </html>