blob: de6c5eff760990d1c032b48faf7b1cb240d1bd74 [file] [log] [blame]
Richard Smithe2bf8782016-09-28 21:01:37 +00001<!DOCTYPE html>
Cedric Venet084381332009-02-14 20:20:19 +00002<html>
3<head>
Richard Smithe2bf8782016-09-28 21:01:37 +00004 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
Hubert Tongf4076ad2020-03-09 14:17:34 -04005 <title>Clang - C++20, C++17, C++14, C++11 and C++98 Status</title>
Gabor Greifdd4ddf12009-02-25 15:22:45 +00006 <link type="text/css" rel="stylesheet" href="menu.css">
7 <link type="text/css" rel="stylesheet" href="content.css">
Cedric Venet084381332009-02-14 20:20:19 +00008 <style type="text/css">
Michael J. Spencere73bd642011-11-02 06:29:37 +00009 .none { background-color: #FFCCCC }
Richard Smith452d6b02013-05-04 07:02:10 +000010 .partial { background-color: #FFE0B0 }
Richard Smithb32013b2020-01-22 14:48:56 -080011 .unreleased { background-color: #FFFF99 }
Michael J. Spencere73bd642011-11-02 06:29:37 +000012 .full { background-color: #CCFF99 }
Richard Smith6d244d72012-03-11 03:06:00 +000013 .na { background-color: #DDDDDD }
Richard Smithc61fec22017-08-30 23:10:31 +000014 :target { background-color: #FFFFBB; outline: #DDDD55 solid thin; }
Benjamin Kramer1c9e1582011-11-05 10:11:36 +000015 th { background-color: #FFDDAA }
Richard Smith63497c62016-07-14 00:14:59 +000016 td { vertical-align: middle }
Richard Smith29c5f162017-07-06 00:29:13 +000017 tt { white-space: nowrap }
Cedric Venet084381332009-02-14 20:20:19 +000018 </style>
19</head>
20<body>
21
22<!--#include virtual="menu.html.incl"-->
23
24<div id="content">
25
26<!--*************************************************************************-->
Richard Smithcf31c6b2014-06-20 20:33:10 +000027<h1>C++ Support in Clang</h1>
Cedric Venet084381332009-02-14 20:20:19 +000028<!--*************************************************************************-->
29
Richard Smithb32013b2020-01-22 14:48:56 -080030<p>Clang fully implements all published ISO C++ standards
31(<a href="#cxx98">C++98 / C++03</a>,
32<a href="#cxx11">C++11</a>,
33<a href="#cxx14">C++14</a>, and
34<a href="#cxx17">C++17</a>), and some of the upcoming <a
35href="#cxx20">C++20</a> standard.
Alp Toker05f89432013-12-06 06:35:49 +000036
Richard Smith60586342013-12-09 08:52:23 +000037<p>The Clang community is continually striving to improve C++ standards
Alp Toker05f89432013-12-06 06:35:49 +000038compliance between releases by submitting and tracking <a
39href="cxx_dr_status.html">C++ Defect Reports</a> and implementing resolutions
40as they become available.</p>
41
42<p>Experimental work is also under way to implement <a href="#ts">C++ Technical
43Specifications</a> that will help drive the future of the C++ programming
44language.</p>
45
Sylvestre Ledru9ea1f352018-09-22 07:41:09 +000046<p>The <a href="https://bugs.llvm.org/">LLVM bug tracker</a> contains Clang
Richard Smith60586342013-12-09 08:52:23 +000047C++ components that track known bugs with Clang's language conformance in
48each language mode.</p>
49
Richard Smith18743de2012-02-24 18:42:08 +000050<h2 id="cxx98">C++98 implementation status</h2>
51
Alp Toker05f89432013-12-06 06:35:49 +000052<p>Clang implements all of the ISO C++ 1998 standard
Douglas Gregor17aa45d2011-07-21 17:46:15 +000053 (including the defects addressed in the ISO C++ 2003 standard)
Richard Smith707e3ba2014-06-22 16:00:05 +000054 except for <tt>export</tt> (which was removed in C++11).
Douglas Gregorbb26a922010-02-05 23:51:14 +000055
Richard Smith18743de2012-02-24 18:42:08 +000056<h2 id="cxx11">C++11 implementation status</h2>
Chris Lattner6fe37482010-05-21 20:59:40 +000057
Richard Smithe2bf8782016-09-28 21:01:37 +000058<p>Clang 3.3 and later implement all of the <a
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -070059 href="https://www.iso.org/standard/50372.html">ISO
Richard Smithe2bf8782016-09-28 21:01:37 +000060 C++ 2011 standard</a>.
Chris Lattner6fe37482010-05-21 20:59:40 +000061
Richard Smith531c9a02013-03-10 00:11:00 +000062<p>By default, Clang builds C++ code according to the C++98 standard, with many
63C++11 features accepted as extensions. You can use Clang in C++11 mode with the
64<code>-std=c++11</code> option. Clang's C++11 mode can be used
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -070065with <a href="https://libcxx.llvm.org/">libc++</a> or with gcc's libstdc++.
Jeffrey Yasskincb407572011-03-29 22:27:50 +000066
Richard Smithe2bf8782016-09-28 21:01:37 +000067<details>
68<summary>List of features and minimum Clang version with support</summary>
69
Cedric Venet084381332009-02-14 20:20:19 +000070<table width="689" border="1" cellspacing="0">
Douglas Gregor1f64b592011-10-14 23:21:49 +000071 <tr>
Benjamin Kramer1c9e1582011-11-05 10:11:36 +000072 <th>Language Feature</th>
Richard Smith18743de2012-02-24 18:42:08 +000073 <th>C++11 Proposal</th>
Benjamin Kramer1c9e1582011-11-05 10:11:36 +000074 <th>Available in Clang?</th>
Douglas Gregor1f64b592011-10-14 23:21:49 +000075 </tr>
76 <tr>
Richard Smith1f8aa532019-07-20 08:20:54 +000077 <td rowspan="2">Rvalue references</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -070078 <td><a href="https://wg21.link/n2118">N2118</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +000079 <td class="full" align="center">Clang 2.9</td>
Richard Smith1f8aa532019-07-20 08:20:54 +000080 <tr> <!-- from Kona 2019-->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -070081 <td><a href="https://wg21.link/p1825r0">P1825R0</a> (<a href="#dr">DR</a>)</td>
Richard Smith1f8aa532019-07-20 08:20:54 +000082 <td class="none" align="center">No</td>
83 </tr>
Douglas Gregor1f64b592011-10-14 23:21:49 +000084 </tr>
85 <tr>
86 <td>&nbsp;&nbsp;&nbsp;&nbsp;Rvalue references for <code>*this</code></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -070087 <td><a href="https://wg21.link/n2439">N2439</a></td>
Benjamin Kramer1c9e1582011-11-05 10:11:36 +000088 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +000089 </tr>
90 <tr>
91 <td>Initialization of class objects by rvalues</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -070092 <td><a href="https://wg21.link/n1610">N1610</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +000093 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +000094 </tr>
95 <tr>
96 <td>Non-static data member initializers</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -070097 <td><a href="https://wg21.link/n2756">N2756</a></td>
Benjamin Kramer1c9e1582011-11-05 10:11:36 +000098 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +000099 </tr>
100 <tr>
101 <td>Variadic templates</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700102 <td><a href="https://wg21.link/n2242">N2242</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000103 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000104 </tr>
105 <tr>
106 <td>&nbsp;&nbsp;&nbsp;&nbsp;Extending variadic template template parameters</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700107 <td><a href="https://wg21.link/n2555">N2555</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000108 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000109 </tr>
110 <tr>
Richard Smithb74a3812020-02-15 01:51:43 -0800111 <td rowspan="3">Initializer lists</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700112 <td><a href="https://wg21.link/n2672">N2672</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000113 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000114 </tr>
Richard Smith456e7af2019-02-23 21:06:25 +0000115 <tr> <!-- from Kona 2019-->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700116 <td><a href="https://wg21.link/p1009r2">P1009R2</a> (<a href="#dr">DR</a>)</td>
Richard Smith2d2850f2019-09-20 18:09:05 +0000117 <td class="full" align="center">Clang 9</td>
Richard Smith456e7af2019-02-23 21:06:25 +0000118 </tr>
Richard Smithb74a3812020-02-15 01:51:43 -0800119 <tr> <!-- from Prague-->
120 <td><a href="https://wg21.link/p1957r2">P1957R2</a> (<a href="#dr">DR</a>)</td>
121 <td class="unreleased" align="center">Clang 11</td>
122 </tr>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000123 <tr>
124 <td>Static assertions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700125 <td><a href="https://wg21.link/n1720">N1720</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000126 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000127 </tr>
128 <tr>
129 <td><code>auto</code>-typed variables</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700130 <td><a href="https://wg21.link/n1984">N1984</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000131 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000132 </tr>
133 <tr>
134 <td>&nbsp;&nbsp;&nbsp;&nbsp;Multi-declarator <code>auto</code></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700135 <td><a href="https://wg21.link/n1737">N1737</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000136 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000137 </tr>
138 <tr>
139 <td>&nbsp;&nbsp;&nbsp;&nbsp;Removal of auto as a storage-class specifier</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700140 <td><a href="https://wg21.link/n2546">N2546</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000141 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000142 </tr>
143 <tr>
144 <td>&nbsp;&nbsp;&nbsp;&nbsp;New function declarator syntax</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700145 <td><a href="https://wg21.link/n2541">N2541</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000146 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000147 </tr>
148 <tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000149 <td rowspan="2">Lambda expressions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700150 <td><a href="https://wg21.link/n2927">N2927</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000151 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000152 </tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000153 <tr>
154 <!-- from Albuquerque 2017 -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700155 <td><a href="https://wg21.link/p0588r1">P0588R1</a> (<a href="#dr">DR</a>)</td>
Richard Smitha14f3202018-03-17 14:28:47 +0000156 <td class="none" align="center">No</td>
157 </tr>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000158 <tr>
159 <td>Declared type of an expression</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700160 <td><a href="https://wg21.link/n2343">N2343</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000161 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000162 </tr>
163 <tr>
Douglas Gregor05989622012-04-10 20:00:33 +0000164 <td>&nbsp;&nbsp;&nbsp;&nbsp;Incomplete return types</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700165 <td><a href="https://wg21.link/n3276">N3276</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000166 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor05989622012-04-10 20:00:33 +0000167 </tr>
168 <tr>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000169 <td>Right angle brackets</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700170 <td><a href="https://wg21.link/n1757">N1757</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000171 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000172 </tr>
173 <tr>
174 <td>Default template arguments for function templates</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700175 <td><a href="https://wg21.link/cwg226">DR226</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000176 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000177 </tr>
178 <tr>
179 <td>Solving the SFINAE problem for expressions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700180 <td><a href="https://wg21.link/n2634">DR339</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000181 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000182 </tr>
183 <tr>
184 <td>Alias templates</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700185 <td><a href="https://wg21.link/n2258">N2258</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000186 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000187 </tr>
188 <tr>
189 <td>Extern templates</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700190 <td><a href="https://wg21.link/n1987">N1987</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000191 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000192 </tr>
193 <tr>
194 <td>Null pointer constant</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700195 <td><a href="https://wg21.link/n2431">N2431</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000196 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000197 </tr>
198 <tr>
199 <td>Strongly-typed enums</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700200 <td><a href="https://wg21.link/n2347">N2347</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000201 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000202 </tr>
203 <tr>
204 <td>Forward declarations for enums</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700205 <td><a href="https://wg21.link/n2764">N2764</a>
206 <br><a href="https://wg21.link/cwg1206">DR1206</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000207 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000208 </tr>
209 <tr>
Richard Smith3dd73db2014-01-17 00:11:48 +0000210 <td>Standardized attribute syntax</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700211 <td><a href="https://wg21.link/n2761">N2761</a></td>
Richard Smith99247722013-06-17 23:54:23 +0000212 <td class="full" align="center">Clang 3.3 <a href="#n2761">(1)</a></td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000213 </tr>
214 <tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000215 <td rowspan="2">Generalized constant expressions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700216 <td><a href="https://wg21.link/n2235">N2235</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000217 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000218 </tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000219 <tr>
220 <!-- from Albuquerque 2017 -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700221 <td><a href="https://wg21.link/p0859r0">P0859R0</a> (<a href="#dr">DR</a>)</td>
Richard Smithde510a82019-05-04 00:23:18 +0000222 <td class="full" align="center">Clang 8</td>
Richard Smitha14f3202018-03-17 14:28:47 +0000223 </tr>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000224 <tr>
225 <td>Alignment support</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700226 <td><a href="https://wg21.link/n2341">N2341</a></td>
Richard Smith99247722013-06-17 23:54:23 +0000227 <td class="full" align="center">Clang 3.3</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000228 </tr>
Richard Smith7e34fbd2014-03-14 21:21:24 +0000229 <tr>
230 <td>Conditionally-support behavior</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700231 <td><a href="https://wg21.link/n1627">N1627</a></td>
Richard Smith7e34fbd2014-03-14 21:21:24 +0000232 <td class="full" align="center">Clang 2.9</td>
233 </tr>
234 <tr>
235 <td>Changing undefined behavior into diagnosable errors</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700236 <td><a href="https://wg21.link/n1727">N1727</a></td>
Richard Smith7e34fbd2014-03-14 21:21:24 +0000237 <td class="full" align="center">Clang 2.9</td>
238 </tr>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000239 <tr>
240 <td>Delegating constructors</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700241 <td><a href="https://wg21.link/n1986">N1986</a></td>
Benjamin Kramer1c9e1582011-11-05 10:11:36 +0000242 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000243 </tr>
244 <tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000245 <td rowspan="2">Inheriting constructors</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700246 <td><a href="https://wg21.link/n2540">N2540</a></td>
Richard Smith99247722013-06-17 23:54:23 +0000247 <td class="full" align="center">Clang 3.3</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000248 </tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000249 <tr>
250 <!-- from Kona 2015 -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700251 <td><a href="https://wg21.link/p0136r1">P0136R1</a> (<a href="#dr">DR</a>)</td>
Richard Smitha14f3202018-03-17 14:28:47 +0000252 <td class="full" align="center">Clang 3.9</td>
253 </tr>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000254 <tr>
255 <td>Explicit conversion operators</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700256 <td><a href="https://wg21.link/n2437">N2437</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000257 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000258 </tr>
259 <tr>
260 <td>New character types</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700261 <td><a href="https://wg21.link/n2249">N2249</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000262 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000263 </tr>
264 <tr>
265 <td>Unicode string literals</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700266 <td><a href="https://wg21.link/n2442">N2442</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000267 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000268 </tr>
269 <tr>
270 <td>Raw string literals</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700271 <td><a href="https://wg21.link/n2442">N2442</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000272 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000273 </tr>
274 <tr>
Richard Smith2a70e652012-03-09 22:27:51 +0000275 <td>Universal character names in literals</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700276 <td><a href="https://wg21.link/n2170">N2170</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000277 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000278 </tr>
279 <tr>
280 <td>User-defined literals</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700281 <td><a href="https://wg21.link/n2765">N2765</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000282 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000283 </tr>
284 <tr>
285 <td>Standard Layout Types</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700286 <td><a href="https://wg21.link/n2342">N2342</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000287 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000288 </tr>
289 <tr>
Richard Smith456e7af2019-02-23 21:06:25 +0000290 <td rowspan="2">Defaulted functions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700291 <td><a href="https://wg21.link/n2346">N2346</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000292 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor7ff1e7e2011-10-28 19:44:09 +0000293 </tr>
Richard Smith456e7af2019-02-23 21:06:25 +0000294 <tr> <!-- from Kona 2019-->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700295 <td><a href="https://wg21.link/p1286r2">P1286R2</a> (<a href="#dr">DR</a>)</td>
Richard Smith2d2850f2019-09-20 18:09:05 +0000296 <td class="full" align="center">Clang 9</td>
Richard Smith456e7af2019-02-23 21:06:25 +0000297 </tr>
Douglas Gregor7ff1e7e2011-10-28 19:44:09 +0000298 <tr>
299 <td>Deleted functions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700300 <td><a href="https://wg21.link/n2346">N2346</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000301 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000302 </tr>
303 <tr>
304 <td>Extended friend declarations</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700305 <td><a href="https://wg21.link/n1791">N1791</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000306 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000307 </tr>
308 <tr>
309 <td>Extending <code>sizeof</code></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700310 <td><a href="https://wg21.link/n2253">N2253</a>
311 <br><a href="https://wg21.link/cwg850">DR850</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000312 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000313 </tr>
314 <tr>
315 <td>Inline namespaces</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700316 <td><a href="https://wg21.link/n2535">N2535</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000317 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000318 </tr>
319 <tr>
320 <td>Unrestricted unions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700321 <td><a href="https://wg21.link/n2544">N2544</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000322 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000323 </tr>
324 <tr>
325 <td>Local and unnamed types as template arguments</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700326 <td><a href="https://wg21.link/n2657">N2657</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000327 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000328 </tr>
329 <tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000330 <td rowspan="2">Range-based for</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700331 <td><a href="https://wg21.link/n2930">N2930</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000332 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000333 </tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000334 <tr>
335 <!-- from Jacksonville 2018 -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700336 <td><a href="https://wg21.link/p0962r1">P0962R1</a> (<a href="#dr">DR</a>)</td>
Richard Smithde510a82019-05-04 00:23:18 +0000337 <td class="full" align="center">Clang 8</td>
Richard Smitha14f3202018-03-17 14:28:47 +0000338 </tr>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000339 <tr>
340 <td>Explicit virtual overrides</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700341 <td><a href="https://wg21.link/n2928">N2928</a>
342 <br><a href="https://wg21.link/n3206">N3206</a>
343 <br><a href="https://wg21.link/n3272">N3272</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000344 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000345 </tr>
346 <tr>
347 <td>Minimal support for garbage collection and reachability-based leak detection</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700348 <td><a href="https://wg21.link/n2670">N2670</a></td>
Richard Smithd997cce2014-03-14 20:26:09 +0000349 <td class="na" align="center">N/A <a href="#n2670">(2)</a></td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000350 </tr>
351 <tr>
352 <td>Allowing move constructors to throw [noexcept]</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700353 <td><a href="https://wg21.link/n3050">N3050</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000354 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000355 </tr>
356 <tr>
357 <td>Defining move special member functions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700358 <td><a href="https://wg21.link/n3053">N3053</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000359 <td class="full" align="center">Clang 3.0</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000360 </tr>
Cedric Venet084381332009-02-14 20:20:19 +0000361
Douglas Gregor1f64b592011-10-14 23:21:49 +0000362 <tr class="separator">
Benjamin Kramer1c9e1582011-11-05 10:11:36 +0000363 <th align="center" colspan="3">Concurrency</th>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000364 </tr>
365 <tr>
366 <td>Sequence points</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700367 <td><a href="https://wg21.link/n2239">N2239</a></td>
Richard Smith99247722013-06-17 23:54:23 +0000368 <td class="full" align="center">Clang 3.3</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000369 </tr>
370 <tr>
371 <td>Atomic operations</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700372 <td><a href="https://wg21.link/n2427">N2427</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000373 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000374 </tr>
375 <tr>
376 <td>Strong Compare and Exchange</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700377 <td><a href="https://wg21.link/n2748">N2748</a></td>
Richard Smithd997cce2014-03-14 20:26:09 +0000378 <td class="full" align="center">Clang 3.1 <a href="#n2748">(3)</a></td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000379 </tr>
380 <tr>
381 <td>Bidirectional Fences</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700382 <td><a href="https://wg21.link/n2752">N2752</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000383 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000384 </tr>
Douglas Gregor6b6e0822010-12-21 05:43:31 +0000385
Douglas Gregor1f64b592011-10-14 23:21:49 +0000386 <tr>
387 <td>Memory model</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700388 <td><a href="https://wg21.link/n2429">N2429</a></td>
Richard Smithbc4fc772013-01-29 04:55:18 +0000389 <td class="full" align="center">Clang 3.2</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000390 </tr>
391 <tr>
392 <td>Data-dependency ordering: atomics and memory model</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700393 <td><a href="https://wg21.link/n2664">N2664</a></td>
Richard Smithd997cce2014-03-14 20:26:09 +0000394 <td class="full" align="center">Clang 3.2 <a href="#n2664">(4)</a></td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000395 </tr>
396 <tr>
397 <td>Propagating exceptions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700398 <td><a href="https://wg21.link/n2179">N2179</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000399 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000400 </tr>
401 <tr>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000402 <td>Allow atomics use in signal handlers</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700403 <td><a href="https://wg21.link/n2547">N2547</a></td>
Richard Smith607d6312012-05-23 01:38:11 +0000404 <td class="full" align="center">Clang 3.1</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000405 </tr>
406 <tr>
407 <td>Thread-local storage</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700408 <td><a href="https://wg21.link/n2659">N2659</a></td>
Richard Smith952923b2016-02-09 22:48:14 +0000409 <td class="full" align="center">Clang 3.3 <a href="#n2659">(5)</a></td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000410 </tr>
411 <tr>
412 <td>Dynamic initialization and destruction with concurrency</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700413 <td><a href="https://wg21.link/n2660">N2660</a></td>
Richard Smith537a8342013-02-22 09:31:00 +0000414 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000415 </tr>
Cedric Venet084381332009-02-14 20:20:19 +0000416
Douglas Gregor1f64b592011-10-14 23:21:49 +0000417 <tr class="separator">
Richard Smith18743de2012-02-24 18:42:08 +0000418 <th align="center" colspan="3">C99 Features in C++11</th>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000419 </tr>
420 <tr>
421 <td><code>__func__</code> predefined identifier</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700422 <td><a href="https://wg21.link/n2340">N2340</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000423 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000424 </tr>
425 <tr>
426 <td>C99 preprocessor</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700427 <td><a href="https://wg21.link/n1653">N1653</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000428 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000429 </tr>
430 <tr>
431 <td><code>long long</code></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700432 <td><a href="https://wg21.link/n1811">N1811</a></td>
Michael J. Spencere73bd642011-11-02 06:29:37 +0000433 <td class="full" align="center">Clang 2.9</td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000434 </tr>
435 <tr>
436 <td>Extended integral types</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700437 <td><a href="https://wg21.link/n1988">N1988</a></td>
Richard Smith952923b2016-02-09 22:48:14 +0000438 <td class="na" align="center">N/A <a href="#n1988">(6)</a></td>
Douglas Gregor1f64b592011-10-14 23:21:49 +0000439 </tr>
Cedric Venet084381332009-02-14 20:20:19 +0000440</table>
Richard Smith9deb9d92013-03-12 19:56:09 +0000441
442<p>
443<span id="n2761">(1): The <code>[[carries_dependency]]</code> attribute
Richard Smith38546ed2013-03-18 21:57:52 +0000444has no effect.</span><br>
Richard Smithd997cce2014-03-14 20:26:09 +0000445<span id="n2670">(2): No compiler changes are required for an implementation
446such as Clang that does not provide garbage collection.</span><br>
447<span id="n2748">(3): All compare-exchange operations are emitted as
Richard Smith38546ed2013-03-18 21:57:52 +0000448strong compare-exchanges.</span><br>
Richard Smithd997cce2014-03-14 20:26:09 +0000449<span id="n2664">(4): <code>memory_order_consume</code> is lowered to
Richard Smith38546ed2013-03-18 21:57:52 +0000450<code>memory_order_acquire</code>.</span><br>
Richard Smith952923b2016-02-09 22:48:14 +0000451<span id="n2659">(5): <code>thread_local</code> support
452requires a C++ runtime library providing <code>__cxa_thread_atexit</code>, such
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700453as <a href="https://libcxxabi.llvm.org">libc++abi</a> 3.6 or later,
Richard Smith952923b2016-02-09 22:48:14 +0000454or libsupc++ 4.8 or later.</span><br>
455<span id="n1988">(6): No compiler changes are required for an implementation
Richard Smithd997cce2014-03-14 20:26:09 +0000456such as Clang that does not provide any extended integer types.
457<code>__int128</code> is not treated as an extended integer type,
458because changing <code>intmax_t</code> would be an ABI-incompatible
459change.</span>
Richard Smith9deb9d92013-03-12 19:56:09 +0000460</p>
Richard Smithe2bf8782016-09-28 21:01:37 +0000461</details>
Richard Smith9deb9d92013-03-12 19:56:09 +0000462
Richard Smith20f37672014-08-31 04:17:48 +0000463<h2 id="cxx14">C++14 implementation status</h2>
Richard Smith91725202013-04-19 17:27:48 +0000464
Richard Smith01881102016-09-28 19:22:36 +0000465<p>Clang 3.4 and later implement all of the <a
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700466 href="https://www.iso.org/standard/64029.html">ISO
Richard Smithe2bf8782016-09-28 21:01:37 +0000467 C++ 2014 standard</a>.
Richard Smith91725202013-04-19 17:27:48 +0000468
Richard Smith20f37672014-08-31 04:17:48 +0000469<p>You can use Clang in C++14 mode with the <code>-std=c++14</code> option
Richard Smith1b886322014-08-31 04:18:54 +0000470(use <code>-std=c++1y</code> in Clang 3.4 and earlier).</p>
Richard Smith4cf9a1e2013-04-20 13:22:50 +0000471
Richard Smithe2bf8782016-09-28 21:01:37 +0000472<details>
473<summary>List of features and minimum Clang version with support</summary>
474
Richard Smith91725202013-04-19 17:27:48 +0000475<table width="689" border="1" cellspacing="0">
476 <tr>
477 <th>Language Feature</th>
Richard Smith20f37672014-08-31 04:17:48 +0000478 <th>C++14 Proposal</th>
Richard Smith91725202013-04-19 17:27:48 +0000479 <th>Available in Clang?</th>
480 </tr>
481 <tr>
482 <td>Tweak to certain C++ contextual conversions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700483 <td><a href="https://wg21.link/n3323">N3323</a></td>
Richard Smith7fe89622014-02-03 06:58:08 +0000484 <td class="full" align="center">Clang 3.4</td>
Richard Smith91725202013-04-19 17:27:48 +0000485 </tr>
486 <tr>
Richard Smith0fa4fce2013-04-20 12:44:32 +0000487 <td>Binary literals</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700488 <td><a href="https://wg21.link/n3472">N3472</a></td>
Benjamin Kramereb0ad452015-02-09 11:48:43 +0000489 <td class="full" align="center">Clang 2.9</td>
Richard Smith91725202013-04-19 17:27:48 +0000490 </tr>
491 <tr>
Richard Smith74aeef52013-04-26 16:15:35 +0000492 <td>decltype(auto)</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700493 <td rowspan=2 style="vertical-align:middle"><a href="https://wg21.link/n3638">N3638</a></td>
Richard Smith99247722013-06-17 23:54:23 +0000494 <td class="full" align="center">Clang 3.3</td>
Richard Smith74aeef52013-04-26 16:15:35 +0000495 </tr>
496 <tr>
Richard Smith5db8b282013-04-20 12:47:36 +0000497 <td>Return type deduction for normal functions</td>
Richard Smith7fe89622014-02-03 06:58:08 +0000498 <td class="full" align="center">Clang 3.4</td>
Richard Smith5db8b282013-04-20 12:47:36 +0000499 </tr>
Richard Smith0fa4fce2013-04-20 12:44:32 +0000500 <tr>
Richard Smith5db8b282013-04-20 12:47:36 +0000501 <td>Initialized lambda captures</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700502 <td><a href="https://wg21.link/n3648">N3648</a></td>
Richard Smith7fe89622014-02-03 06:58:08 +0000503 <td class="full" align="center">Clang 3.4</td>
Richard Smith91725202013-04-19 17:27:48 +0000504 </tr>
505 <tr>
Richard Smith7898d7b2013-04-20 12:58:57 +0000506 <td>Generic lambdas</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700507 <td><a href="https://wg21.link/n3649">N3649</a></td>
Richard Smith7fe89622014-02-03 06:58:08 +0000508 <td class="full" align="center">Clang 3.4</td>
Richard Smith91725202013-04-19 17:27:48 +0000509 </tr>
510 <tr>
Richard Smith7898d7b2013-04-20 12:58:57 +0000511 <td>Variable templates</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700512 <td><a href="https://wg21.link/n3651">N3651</a></td>
Richard Smith7fe89622014-02-03 06:58:08 +0000513 <td class="full" align="center">Clang 3.4</td>
Richard Smith91725202013-04-19 17:27:48 +0000514 </tr>
515 <tr>
Richard Smith7feda2f2013-04-20 12:49:36 +0000516 <td>Relaxing requirements on constexpr functions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700517 <td><a href="https://wg21.link/n3652">N3652</a></td>
Richard Smith7fe89622014-02-03 06:58:08 +0000518 <td class="full" align="center">Clang 3.4</td>
Richard Smith91725202013-04-19 17:27:48 +0000519 </tr>
520 <tr>
Richard Smith5db8b282013-04-20 12:47:36 +0000521 <td>Member initializers and aggregates</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700522 <td><a href="https://wg21.link/n3653">N3653</a></td>
Richard Smith99247722013-06-17 23:54:23 +0000523 <td class="full" align="center">Clang 3.3</td>
Richard Smith91725202013-04-19 17:27:48 +0000524 </tr>
Richard Smith91725202013-04-19 17:27:48 +0000525 <tr>
Richard Smithd3a73862013-04-20 12:57:49 +0000526 <td>Clarifying memory allocation</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700527 <td><a href="https://wg21.link/n3664">N3664</a></td>
Richard Smith7fe89622014-02-03 06:58:08 +0000528 <td class="full" align="center">Clang 3.4</td>
Richard Smith91725202013-04-19 17:27:48 +0000529 </tr>
Richard Smith3ca005b2013-09-27 19:11:33 +0000530 <tr>
531 <td><tt>[[deprecated]]</tt> attribute</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700532 <td><a href="https://wg21.link/n3760">N3760</a></td>
Richard Smith7fe89622014-02-03 06:58:08 +0000533 <td class="full" align="center">Clang 3.4</td>
Richard Smith3ca005b2013-09-27 19:11:33 +0000534 </tr>
535 <tr>
536 <td>Single quotation mark as digit separator</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700537 <td><a href="https://wg21.link/n3781">N3781</a></td>
Richard Smith7fe89622014-02-03 06:58:08 +0000538 <td class="full" align="center">Clang 3.4</td>
Richard Smith3ca005b2013-09-27 19:11:33 +0000539 </tr>
540 <tr>
Benjamin Kramer8ba47d02013-09-27 19:35:09 +0000541 <td>C++ Sized Deallocation</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700542 <td><a href="https://wg21.link/n3778">N3778</a></td>
Richard Smith952923b2016-02-09 22:48:14 +0000543 <td class="full" align="center">Clang 3.4 <a href="#n3778">(7)</a></td>
Richard Smith3ca005b2013-09-27 19:11:33 +0000544 </tr>
Richard Smith91725202013-04-19 17:27:48 +0000545</table>
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +0000546
Larisse Voufoee3c1b22015-02-19 04:34:13 +0000547<p>
Richard Smith952923b2016-02-09 22:48:14 +0000548<span id="n3778">(7): In Clang 3.7 and later, sized deallocation is only enabled
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +0000549if the user passes the <code>-fsized-deallocation</code> flag. The user must
550supply definitions of the sized deallocation functions, either by providing them
551explicitly or by using a C++ standard library that does. <code>libstdc++</code>
552added these functions in version 5.0, and <code>libc++</code> added them in
553version 3.7.
Larisse Voufoee3c1b22015-02-19 04:34:13 +0000554</span>
555</p>
Richard Smithe2bf8782016-09-28 21:01:37 +0000556</details>
Richard Smith91725202013-04-19 17:27:48 +0000557
Richard Smithda62f422017-07-15 15:42:36 +0000558<h2 id="cxx17">C++17 implementation status</h2>
Richard Smith76b9f232013-11-07 06:41:26 +0000559
Richard Smitha14f3202018-03-17 14:28:47 +0000560<p>Clang 5 and later implement all the features of the
561<a href="https://www.iso.org/standard/68564.html">ISO C++ 2017 standard</a>.
Richard Smithcf31c6b2014-06-20 20:33:10 +0000562
Richard Smithc61fec22017-08-30 23:10:31 +0000563<p>You can use Clang in C++17 mode with the <code>-std=c++17</code> option
564(use <code>-std=c++1z</code> in Clang 4 and earlier).</p>
Richard Smithcf31c6b2014-06-20 20:33:10 +0000565
Richard Smithe2bf8782016-09-28 21:01:37 +0000566<details open>
567<summary>List of features and minimum Clang version with support</summary>
568
Richard Smithcf31c6b2014-06-20 20:33:10 +0000569<table width="689" border="1" cellspacing="0">
570 <tr>
571 <th>Language Feature</th>
Richard Smithda62f422017-07-15 15:42:36 +0000572 <th>C++17 Proposal</th>
Richard Smithcf31c6b2014-06-20 20:33:10 +0000573 <th>Available in Clang?</th>
574 </tr>
Richard Smith5a20d7e2016-11-11 22:48:43 +0000575 <!-- Issaquah 2014 papers -->
Richard Smithcf31c6b2014-06-20 20:33:10 +0000576 <tr>
577 <td><tt>static_assert</tt> with no message</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700578 <td><a href="https://wg21.link/n3928">N3928</a></td>
Richard Smithee0a49c2014-09-11 17:30:32 +0000579 <td class="full" align="center">Clang 3.5</td>
Richard Smithcf31c6b2014-06-20 20:33:10 +0000580 </tr>
Richard Smith0f0af192014-11-08 05:07:16 +0000581 <!-- Rapperswil papers -->
Richard Smithcf31c6b2014-06-20 20:33:10 +0000582 <tr>
583 <td>Disabling trigraph expansion by default</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700584 <td><a href="https://wg21.link/n4086">N4086</a></td>
Richard Smithee0a49c2014-09-11 17:30:32 +0000585 <td class="full" align="center">Clang 3.5</td>
Richard Smithcf31c6b2014-06-20 20:33:10 +0000586 </tr>
Richard Smith83d3f152014-11-27 01:54:27 +0000587 <tr>
Richard Smithcf31c6b2014-06-20 20:33:10 +0000588 <td><tt>typename</tt> in a template template parameter</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700589 <td><a href="https://wg21.link/n4051">N4051</a></td>
Richard Smithee0a49c2014-09-11 17:30:32 +0000590 <td class="full" align="center">Clang 3.5</td>
Richard Smithcf31c6b2014-06-20 20:33:10 +0000591 </tr>
Richard Smith410cc892014-11-26 03:26:53 +0000592 <tr>
593 <td>New <tt>auto</tt> rules for direct-list-initialization
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700594 <td><a href="https://wg21.link/n3922">N3922</a></td>
Richard Smith25dde972016-03-20 10:37:12 +0000595 <td class="full" align="center">Clang 3.8 <a href="#n3922">(8)</a></td>
Richard Smith410cc892014-11-26 03:26:53 +0000596 </tr>
Richard Smith0f0af192014-11-08 05:07:16 +0000597 <!-- Urbana papers -->
598 <tr>
Richard Smithf006a962016-03-04 21:01:14 +0000599 <td rowspan="2">Fold expressions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700600 <td><a href="https://wg21.link/n4295">N4295</a></td>
Richard Smith42b10572015-11-11 01:36:17 +0000601 <td class="full" align="center">Clang 3.6</td>
Richard Smith3e3a7052014-11-08 06:08:42 +0000602 </tr>
Richard Smithf006a962016-03-04 21:01:14 +0000603 <tr> <!-- from Jacksonville -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700604 <td><a href="https://wg21.link/p0036r0">P0036R0</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000605 <td class="full" align="center">Clang 3.9</td>
Richard Smithf006a962016-03-04 21:01:14 +0000606 </tr>
Richard Smith3e3a7052014-11-08 06:08:42 +0000607 <tr>
608 <td><tt>u8</tt> character literals</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700609 <td><a href="https://wg21.link/n4267">N4267</a></td>
Richard Smith42b10572015-11-11 01:36:17 +0000610 <td class="full" align="center">Clang 3.6</td>
Richard Smith0f0af192014-11-08 05:07:16 +0000611 </tr>
Richard Smith13307f52014-11-08 05:37:34 +0000612 <tr>
613 <td>Nested namespace definition</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700614 <td><a href="https://wg21.link/n4230">N4230</a></td>
Richard Smith42b10572015-11-11 01:36:17 +0000615 <td class="full" align="center">Clang 3.6</td>
Richard Smith13307f52014-11-08 05:37:34 +0000616 </tr>
Aaron Ballman730476b2014-11-08 15:33:35 +0000617 <tr>
618 <td>Attributes for namespaces and enumerators</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700619 <td><a href="https://wg21.link/n4266">N4266</a></td>
Richard Smith42b10572015-11-11 01:36:17 +0000620 <td class="full" align="center">Clang 3.6</td>
Aaron Ballman730476b2014-11-08 15:33:35 +0000621 </tr>
Richard Smith410cc892014-11-26 03:26:53 +0000622 <tr>
623 <td>Allow constant evaluation for all non-type template arguments</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700624 <td><a href="https://wg21.link/n4268">N4268</a></td>
Richard Smith42b10572015-11-11 01:36:17 +0000625 <td class="full" align="center">Clang 3.6</td>
Richard Smith410cc892014-11-26 03:26:53 +0000626 </tr>
Richard Smith894835f2015-11-05 21:41:06 +0000627 <!-- Kona papers -->
628 <tr>
629 <td>Remove deprecated <tt>register</tt> storage class</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700630 <td><a href="https://wg21.link/p0001r1">P0001R1</a></td>
Richard Smith25dde972016-03-20 10:37:12 +0000631 <td class="full" align="center">Clang 3.8</td>
Richard Smith894835f2015-11-05 21:41:06 +0000632 </tr>
633 <tr>
634 <td>Remove deprecated <tt>bool</tt> increment</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700635 <td><a href="https://wg21.link/p0002r1">P0002R1</a></td>
Richard Smith25dde972016-03-20 10:37:12 +0000636 <td class="full" align="center">Clang 3.8</td>
Richard Smith894835f2015-11-05 21:41:06 +0000637 </tr>
638 <tr>
639 <td>Make exception specifications part of the type system</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700640 <td><a href="https://wg21.link/p0012r1">P0012R1</a></td>
Ed Schoutenf59d8df2017-03-16 14:21:00 +0000641 <td class="full" align="center">Clang 4</td>
Richard Smith894835f2015-11-05 21:41:06 +0000642 </tr>
643 <tr>
Richard Smith4a0cd892015-11-26 02:16:37 +0000644 <td><tt>__has_include</tt> in preprocessor conditionals</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700645 <td><a href="https://wg21.link/p0061r1">P0061R1</a></td>
Richard Smith894835f2015-11-05 21:41:06 +0000646 <td class="full" align="center">Yes</td>
647 </tr>
Richard Smithf006a962016-03-04 21:01:14 +0000648 <!-- Jacksonville papers -->
649 <tr>
650 <td><tt>[[fallthrough]]</tt> attribute</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700651 <td><a href="https://wg21.link/p0188r1">P0188R1</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000652 <td class="full" align="center">Clang 3.9</td>
Richard Smithf006a962016-03-04 21:01:14 +0000653 </tr>
654 <tr>
Richard Smith1f8aa532019-07-20 08:20:54 +0000655 <td rowspan="2"><tt>[[nodiscard]]</tt> attribute</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700656 <td><a href="https://wg21.link/p0189r1">P0189R1</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000657 <td class="full" align="center">Clang 3.9</td>
Richard Smithf006a962016-03-04 21:01:14 +0000658 </tr>
Richard Smith1f8aa532019-07-20 08:20:54 +0000659 <tr> <!-- from Cologne 2019 -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700660 <td><a href="https://wg21.link/p1771r1">P1771R1</a> (<a href="#dr">DR</a>)</td>
Richard Smith2d2850f2019-09-20 18:09:05 +0000661 <td class="full" align="center">Clang 9</td>
Richard Smith1f8aa532019-07-20 08:20:54 +0000662 </tr>
Richard Smithf006a962016-03-04 21:01:14 +0000663 <tr>
664 <td><tt>[[maybe_unused]]</tt> attribute</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700665 <td><a href="https://wg21.link/p0212r1">P0212R1</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000666 <td class="full" align="center">Clang 3.9</td>
Richard Smithf006a962016-03-04 21:01:14 +0000667 </tr>
668 <tr>
669 <td>Aggregate initialization of classes with base classes</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700670 <td><a href="https://wg21.link/p0017r1">P0017R1</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000671 <td class="full" align="center">Clang 3.9</td>
Richard Smithf006a962016-03-04 21:01:14 +0000672 </tr>
673 <tr>
674 <td><tt>constexpr</tt> lambda expressions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700675 <td><a href="https://wg21.link/p0170r1">P0170R1</a></td>
Richard Smith4b82f9c2017-09-09 01:11:04 +0000676 <td class="full" align="center">Clang 5</td>
Richard Smithf006a962016-03-04 21:01:14 +0000677 </tr>
678 <tr>
679 <td>Differing <tt>begin</tt> and <tt>end</tt> types in range-based <tt>for</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700680 <td><a href="https://wg21.link/p0184r0">P0184R0</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000681 <td class="full" align="center">Clang 3.9</td>
Richard Smithf006a962016-03-04 21:01:14 +0000682 </tr>
683 <tr>
684 <td>Lambda capture of <tt>*this</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700685 <td><a href="https://wg21.link/p0018r3">P0018R3</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000686 <td class="full" align="center">Clang 3.9</td>
Richard Smithf006a962016-03-04 21:01:14 +0000687 </tr>
688 <tr>
689 <td>Direct-list-initialization of <tt>enum</tt>s</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700690 <td><a href="https://wg21.link/p0138r2">P0138R2</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000691 <td class="full" align="center">Clang 3.9</td>
Richard Smithf006a962016-03-04 21:01:14 +0000692 </tr>
693 <tr>
694 <td>Hexadecimal floating-point literals</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700695 <td><a href="https://wg21.link/p0245r1">P0245R1</a></td>
Richard Smithf006a962016-03-04 21:01:14 +0000696 <td class="full" align="center">Yes</td>
697 </tr>
Richard Smithb130fe72016-06-23 19:16:49 +0000698 <!-- Oulu papers -->
Richard Smith74f56e72016-06-24 11:20:31 +0000699 <tr>
700 <td>Using attribute namespaces without repetition</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700701 <td><a href="https://wg21.link/p0028r4">P0028R4</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000702 <td class="full" align="center">Clang 3.9</td>
Richard Smith74f56e72016-06-24 11:20:31 +0000703 </tr>
704 <tr>
705 <td>Dynamic memory allocation for over-aligned data</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700706 <td><a href="https://wg21.link/p0035r4">P0035R4</a></td>
Ed Schoutenf59d8df2017-03-16 14:21:00 +0000707 <td class="full" align="center">Clang 4</td>
Richard Smith74f56e72016-06-24 11:20:31 +0000708 </tr>
709 <tr>
Richard Smithd9f2e072018-05-30 23:30:36 +0000710 <td rowspan="4">Template argument deduction for class templates</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700711 <td><a href="https://wg21.link/p0091r3">P0091R3</a></td>
Richard Smith4b82f9c2017-09-09 01:11:04 +0000712 <td rowspan="2" class="full" align="center">Clang 5</td>
Richard Smith74f56e72016-06-24 11:20:31 +0000713 </tr>
Richard Smith19a311a2017-02-09 22:47:51 +0000714 <tr> <!-- from Issaquah -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700715 <td><a href="https://wg21.link/p0512r0">P0512R0</a></td>
Richard Smith19a311a2017-02-09 22:47:51 +0000716 </tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000717 <tr>
Richard Smithd9f2e072018-05-30 23:30:36 +0000718 <!-- from Kona 2017 -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700719 <td><a href="https://wg21.link/p0620r1">P0620R0</a> (<a href="#dr">DR</a>)</td>
Richard Smithe57418b2018-09-24 23:21:09 +0000720 <td class="full" align="center">Clang 7</td>
Richard Smithd9f2e072018-05-30 23:30:36 +0000721 </tr>
722 <tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000723 <!-- from Toronto 2017 -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700724 <td><a href="https://wg21.link/p0702r1">P0702R1</a> (<a href="#dr">DR</a>)</td>
Richard Smithd9f2e072018-05-30 23:30:36 +0000725 <td class="full" align="center">Clang 6</td>
Richard Smitha14f3202018-03-17 14:28:47 +0000726 </tr>
Richard Smith74f56e72016-06-24 11:20:31 +0000727 <tr>
Richard Smith3a2dc6f02016-06-24 12:21:30 +0000728 <td>Non-type template parameters with <tt>auto</tt> type</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700729 <td><a href="https://wg21.link/p0127r2">P0127R2</a></td>
Ed Schoutenf59d8df2017-03-16 14:21:00 +0000730 <td class="full" align="center">Clang 4</td>
Richard Smith74f56e72016-06-24 11:20:31 +0000731 </tr>
732 <tr>
733 <td>Guaranteed copy elision</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700734 <td><a href="https://wg21.link/p0135r1">P0135R1</a></td>
Ed Schoutenf59d8df2017-03-16 14:21:00 +0000735 <td class="full" align="center">Clang 4</td>
Richard Smith74f56e72016-06-24 11:20:31 +0000736 </tr>
737 <tr>
Richard Smith63497c62016-07-14 00:14:59 +0000738 <td rowspan=2>Stricter expression evaluation order</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700739 <td><a href="https://wg21.link/p0145r3">P0145R3</a></td>
Richard Smitha14f3202018-03-17 14:28:47 +0000740 <td class="full" align="center" rowspan=2>Clang 4 <a href="#p0145">(9)</a></td>
Richard Smith63497c62016-07-14 00:14:59 +0000741 </tr>
742 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700743 <td><a href="https://wg21.link/p0400r0">P0400R0</a></td>
Richard Smith74f56e72016-06-24 11:20:31 +0000744 </tr>
745 <tr>
Richard Smith74f56e72016-06-24 11:20:31 +0000746 <td>Requirement to ignore unknown attributes</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700747 <td><a href="https://wg21.link/p0283r2">P0283R2</a></td>
Richard Smith74f56e72016-06-24 11:20:31 +0000748 <td class="full" align="center">Yes</td>
749 </tr>
Richard Smithb130fe72016-06-23 19:16:49 +0000750 <tr>
751 <td><tt>constexpr</tt> <em>if-statement</em>s</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700752 <td><a href="https://wg21.link/p0292r2">P0292R2</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000753 <td class="full" align="center">Clang 3.9</td>
Richard Smithb130fe72016-06-23 19:16:49 +0000754 </tr>
Richard Smith74f56e72016-06-24 11:20:31 +0000755 <tr>
756 <td>Inline variables</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700757 <td><a href="https://wg21.link/p0386r2">P0386R2</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000758 <td class="full" align="center">Clang 3.9</td>
Richard Smith74f56e72016-06-24 11:20:31 +0000759 </tr>
760 <tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000761 <td rowspan="3">Structured bindings</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700762 <td><a href="https://wg21.link/p0217r3">P0217R3</a></td>
Ed Schoutenf59d8df2017-03-16 14:21:00 +0000763 <td class="full" align="center">Clang 4</td>
Richard Smith74f56e72016-06-24 11:20:31 +0000764 </tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000765 <tr>
766 <!-- from Jacksonville 2018 -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700767 <td><a href="https://wg21.link/p0961r1">P0961R1</a> (<a href="#dr">DR</a>)</td>
Richard Smithde510a82019-05-04 00:23:18 +0000768 <td class="full" align="center">Clang 8</td>
Richard Smitha14f3202018-03-17 14:28:47 +0000769 </tr>
770 <tr>
771 <!-- from Jacksonville 2018 -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700772 <td><a href="https://wg21.link/p0969r0">P0969R0</a> (<a href="#dr">DR</a>)</td>
Richard Smithde510a82019-05-04 00:23:18 +0000773 <td class="full" align="center">Clang 8</td>
Richard Smitha14f3202018-03-17 14:28:47 +0000774 </tr>
Richard Smith74f56e72016-06-24 11:20:31 +0000775 <tr>
Richard Smith90ea9eb2016-06-24 14:23:32 +0000776 <td>Separate variable and condition for <tt>if</tt> and <tt>switch</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700777 <td><a href="https://wg21.link/p0305r1">P0305R1</a></td>
Richard Smithb1a268a2016-08-15 02:47:23 +0000778 <td class="full" align="center">Clang 3.9</td>
Richard Smith74f56e72016-06-24 11:20:31 +0000779 </tr>
Richard Smith5a20d7e2016-11-11 22:48:43 +0000780 <!-- Issaquah 2016 papers -->
Richard Smith5a20d7e2016-11-11 22:48:43 +0000781 <tr>
782 <td>Matching template template parameters to compatible arguments</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700783 <td><a href="https://wg21.link/p0522r0">P0522R0</a></td>
Richard Smitha14f3202018-03-17 14:28:47 +0000784 <td class="partial" align="center">Partial <a href="#p0522">(10)</a></td>
Richard Smith5a20d7e2016-11-11 22:48:43 +0000785 </tr>
786 <tr>
787 <td>Removing deprecated dynamic exception specifications</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700788 <td><a href="https://wg21.link/p0003r5">P0003R5</a></td>
Ed Schoutenf59d8df2017-03-16 14:21:00 +0000789 <td class="full" align="center">Clang 4</td>
Richard Smith5a20d7e2016-11-11 22:48:43 +0000790 </tr>
791 <tr>
792 <td>Pack expansions in <em>using-declarations</em></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700793 <td><a href="https://wg21.link/p0195r2">P0195R2</a></td>
Ed Schoutenf59d8df2017-03-16 14:21:00 +0000794 <td class="full" align="center">Clang 4</td>
Richard Smith5a20d7e2016-11-11 22:48:43 +0000795 </tr>
Richard Smithcf31c6b2014-06-20 20:33:10 +0000796</table>
Richard Smith76b9f232013-11-07 06:41:26 +0000797
Richard Smith42b10572015-11-11 01:36:17 +0000798<p>
Richard Smith952923b2016-02-09 22:48:14 +0000799<span id="n3922">(8): This is a backwards-incompatible change that is applied to
Richard Smith42b10572015-11-11 01:36:17 +0000800all language versions that allow type deduction from <tt>auto</tt>
801(per the request of the C++ committee).
802In Clang 3.7, a warning is emitted for all cases that would change meaning.
Richard Smith4a93c592016-06-28 20:37:43 +0000803</span><br>
Richard Smitha14f3202018-03-17 14:28:47 +0000804<span id="p0145">(9): Under the MS ABI, function parameters are destroyed from
Richard Smitha560ccf2016-09-29 21:30:12 +0000805left to right in the callee. As a result, function parameters in calls to
Richard Smith762672a2016-09-28 19:09:10 +0000806<tt>operator&lt;&lt;</tt>, <tt>operator&gt;&gt;</tt>, <tt>operator-&gt;*</tt>,
807<tt>operator&amp;&amp;</tt>, <tt>operator||</tt>, and <tt>operator,</tt>
Richard Smitha560ccf2016-09-29 21:30:12 +0000808functions using expression syntax are no longer guaranteed to be destroyed in
809reverse construction order in that ABI.
Richard Smith00d3e6c2020-10-05 17:52:23 -0700810This is not fully supported during constant expression evaluation until Clang 12.
Richard Smithe0c75002016-11-11 23:46:25 +0000811</span><br>
Richard Smitha14f3202018-03-17 14:28:47 +0000812<span id="p0522">(10): Despite being the resolution to a Defect Report, this
Richard Smith26b86ea2016-12-31 21:41:23 +0000813feature is disabled by default in all language versions, and can be enabled
Richard Smithe0c11f22017-11-30 23:07:29 +0000814explicitly with the flag <tt>-frelaxed-template-template-args</tt> in Clang 4
815onwards.
Richard Smithd7279bb2017-01-13 00:57:54 +0000816The change to the standard lacks a corresponding change for template partial
817ordering, resulting in ambiguity errors for reasonable and previously-valid
818code. This issue is expected to be rectified soon.
Richard Smith5179eb72016-06-28 19:03:57 +0000819</span>
Richard Smith42b10572015-11-11 01:36:17 +0000820</p>
Richard Smithe2bf8782016-09-28 21:01:37 +0000821</details>
Richard Smith42b10572015-11-11 01:36:17 +0000822
Richard Smith24ad1212020-02-18 16:13:23 -0800823<h2 id="cxx20">C++20 implementation status</h2>
Richard Smithda62f422017-07-15 15:42:36 +0000824
Richard Smith24ad1212020-02-18 16:13:23 -0800825<p>Clang has support for some of the features of the
826ISO C++ 2020 Draft International Standard.
Richard Smithda62f422017-07-15 15:42:36 +0000827
Richard Smith24ad1212020-02-18 16:13:23 -0800828<p>You can use Clang in C++20 mode with the <code>-std=c++20</code> option
Richard Smith6d34a872020-02-20 11:40:09 -0800829(use <code>-std=c++2a</code> in Clang 9 and earlier).</p>
Richard Smithda62f422017-07-15 15:42:36 +0000830
831<details open>
832<summary>List of features and minimum Clang version with support</summary>
833
834<table width="689" border="1" cellspacing="0">
835 <tr>
836 <th>Language Feature</th>
Richard Smith24ad1212020-02-18 16:13:23 -0800837 <th>C++20 Proposal</th>
Richard Smithda62f422017-07-15 15:42:36 +0000838 <th>Available in Clang?</th>
839 </tr>
840 <!-- Toronto 2017 papers -->
841 <tr>
842 <td>Default member initializers for bit-fields</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700843 <td><a href="https://wg21.link/p0683r1">P0683R1</a></td>
Richard Smithd9f2e072018-05-30 23:30:36 +0000844 <td class="full" align="center">Clang 6</td>
Richard Smithda62f422017-07-15 15:42:36 +0000845 </tr>
846 <tr>
847 <td><tt>const&amp;</tt>-qualified pointers to members</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700848 <td><a href="https://wg21.link/p0704r1">P0704R1</a></td>
Richard Smithd9f2e072018-05-30 23:30:36 +0000849 <td class="full" align="center">Clang 6</td>
Richard Smithda62f422017-07-15 15:42:36 +0000850 </tr>
851 <tr>
852 <td>Allow <i>lambda-capture</i> <tt>[=, this]</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700853 <td><a href="https://wg21.link/p0409r2">P0409R2</a></td>
Richard Smithd9f2e072018-05-30 23:30:36 +0000854 <td class="full" align="center">Clang 6</td>
Richard Smithda62f422017-07-15 15:42:36 +0000855 </tr>
856 <tr>
Richard Smith3e3e2e92018-06-14 00:05:28 +0000857 <td rowspan="2"><tt>__VA_OPT__</tt> for preprocessor comma elision</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700858 <td><a href="https://wg21.link/p0306r4">P0306R4</a></td>
Richard Smithd9f2e072018-05-30 23:30:36 +0000859 <td class="full" align="center">Clang 6</td>
Richard Smithda62f422017-07-15 15:42:36 +0000860 </tr>
Richard Smith3e3e2e92018-06-14 00:05:28 +0000861 <tr> <!-- from Rapperswil -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700862 <td><a href="https://wg21.link/p1042r1">P1042R1</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +0000863 <td class="full" align="center">Clang 9</td>
Richard Smith3e3e2e92018-06-14 00:05:28 +0000864 </tr>
Richard Smithda62f422017-07-15 15:42:36 +0000865 <tr>
866 <td>Designated initializers</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700867 <td><a href="https://wg21.link/p0329r4">P0329R4</a></td>
Hubert Tong021a3332020-04-14 18:36:50 -0400868 <td class="full" align="center">Clang 10</td>
Richard Smithda62f422017-07-15 15:42:36 +0000869 </tr>
870 <tr>
871 <td><i>template-parameter-list</i> for generic lambdas</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700872 <td><a href="https://wg21.link/p0428r2">P0428R2</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +0000873 <td class="full" align="center">Clang 9</td>
Richard Smithda62f422017-07-15 15:42:36 +0000874 </tr>
Richard Smith137f6572017-11-11 17:54:46 +0000875 <tr id="p0734">
Richard Smithb74a3812020-02-15 01:51:43 -0800876 <td rowspan="12">Concepts</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700877 <td><a href="https://wg21.link/p0734r0">P0734R0</a></td>
Hubert Tong021a3332020-04-14 18:36:50 -0400878 <td rowspan="4" class="full" align="center">Clang 10</td>
Richard Smith137f6572017-11-11 17:54:46 +0000879 </tr>
880 <tr> <!-- from Albuquerque -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700881 <td><a href="https://wg21.link/p0857r0">P0857R0</a></td>
Richard Smith137f6572017-11-11 17:54:46 +0000882 </tr>
Richard Smith429dbdd2018-11-10 18:02:40 +0000883 <tr> <!-- from San Diego -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700884 <td><a href="https://wg21.link/p1084r2">P1084R2</a></td>
Richard Smith429dbdd2018-11-10 18:02:40 +0000885 </tr>
886 <tr>
Richard Smith357e64e2019-12-14 14:52:24 -0800887 <td><a href="https://wg21.link/p1141r2">P1141R2</a></td>
Richard Smith429dbdd2018-11-10 18:02:40 +0000888 </tr>
Richard Smith1f8aa532019-07-20 08:20:54 +0000889 <tr> <!-- from Cologne -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700890 <td><a href="https://wg21.link/p0848r3">P0848R3</a></td>
Saar Razf394d222020-01-24 02:59:14 +0200891 <td rowspan="1" class="none" align="center">No</td>
Richard Smith1f8aa532019-07-20 08:20:54 +0000892 </tr>
893 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700894 <td><a href="https://wg21.link/p1616r1">P1616R1</a></td>
Hubert Tong021a3332020-04-14 18:36:50 -0400895 <td rowspan="2" class="full" align="center">Clang 10</td>
Richard Smith1f8aa532019-07-20 08:20:54 +0000896 </tr>
897 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700898 <td><a href="https://wg21.link/p1452r2">P1452R2</a></td>
Richard Smith1f8aa532019-07-20 08:20:54 +0000899 </tr>
Richard Smith092577e2019-11-09 01:17:57 -0800900 <tr> <!-- from Belfast -->
901 <td><a href="https://wg21.link/p1972r0">P1972R0</a></td>
Saar Razf394d222020-01-24 02:59:14 +0200902 <td rowspan="2" class="none" align="center">No</td>
Richard Smith092577e2019-11-09 01:17:57 -0800903 </tr>
904 <tr>
905 <td><a href="https://wg21.link/p1980r0">P1980R0</a></td>
906 </tr>
Richard Smithb74a3812020-02-15 01:51:43 -0800907 <tr> <!-- from Prague -->
908 <td><a href="https://wg21.link/p2103r0">P2103R0</a></td>
909 <td rowspan="3" class="none" align="center">No</td>
910 </tr>
911 <tr>
912 <td><a href="https://wg21.link/p2092r0">P2092R0</a></td>
913 </tr>
914 <tr>
915 <td><a href="https://wg21.link/p2113r0">P2113R0</a></td>
916 </tr>
Richard Smith137f6572017-11-11 17:54:46 +0000917 <!-- Albuquerque papers -->
918 <tr>
919 <td>Range-based for statements with initializer</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700920 <td><a href="https://wg21.link/p0614r1">P0614R1</a></td>
Richard Smithde510a82019-05-04 00:23:18 +0000921 <td class="full" align="center">Clang 8</td>
Richard Smith137f6572017-11-11 17:54:46 +0000922 </tr>
923 <tr>
Richard Smith137f6572017-11-11 17:54:46 +0000924 <td>ADL and function templates that are not visible</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700925 <td><a href="https://wg21.link/p0846r0">P0846R0</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +0000926 <td class="full" align="center">Clang 9</td>
Richard Smith137f6572017-11-11 17:54:46 +0000927 </tr>
928 <tr>
929 <td><tt>const</tt> mismatch with defaulted copy constructor</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700930 <td><a href="https://wg21.link/p0641r2">P0641R2</a></td>
Richard Smithde510a82019-05-04 00:23:18 +0000931 <td class="full" align="center">Clang 8</td>
Richard Smith137f6572017-11-11 17:54:46 +0000932 </tr>
933 <tr>
Richard Smithb74a3812020-02-15 01:51:43 -0800934 <td rowspan="10">Consistent comparison (<tt>operator&lt;=&gt;</tt>)</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700935 <td><a href="https://wg21.link/p0515r3">P0515R3</a></td>
Hubert Tong021a3332020-04-14 18:36:50 -0400936 <td rowspan="8" class="full" align="center">Clang 10</td>
Richard Smith137f6572017-11-11 17:54:46 +0000937 </tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000938 <tr> <!-- from Jacksonville -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700939 <td><a href="https://wg21.link/p0905r1">P0905R1</a></td>
Richard Smitha14f3202018-03-17 14:28:47 +0000940 </tr>
Richard Smith3e3e2e92018-06-14 00:05:28 +0000941 <tr> <!-- from Rapperswil -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700942 <td><a href="https://wg21.link/p1120r0">P1120R0</a></td>
Richard Smith3e3e2e92018-06-14 00:05:28 +0000943 </tr>
Richard Smith456e7af2019-02-23 21:06:25 +0000944 <tr> <!-- from Kona 2019 -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700945 <td><a href="https://wg21.link/p1185r2">P1185R2</a></td>
Richard Smith1f8aa532019-07-20 08:20:54 +0000946 </tr>
947 <tr> <!-- from Cologne -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700948 <td><a href="https://wg21.link/p1186r3">P1186R3</a></td>
Richard Smith1f8aa532019-07-20 08:20:54 +0000949 </tr>
950 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700951 <td><a href="https://wg21.link/p1630r1">P1630R1</a></td>
Richard Smith456e7af2019-02-23 21:06:25 +0000952 </tr>
Richard Smith092577e2019-11-09 01:17:57 -0800953 <tr> <!-- from Belfast -->
954 <td><a href="https://wg21.link/p1946r0">P1946R0</a></td>
Richard Smith439cb882019-12-09 18:01:47 -0800955 </tr>
956 <tr>
957 <td><a href="https://wg21.link/p1959r0">P1959R0</a></td>
Richard Smith092577e2019-11-09 01:17:57 -0800958 </tr>
Richard Smithb74a3812020-02-15 01:51:43 -0800959 <tr> <!-- from Prague -->
960 <td><a href="https://wg21.link/p2002r1">P2002R1</a></td>
961 <td class="partial" align="center">Partial</td>
962 </tr>
963 <tr>
964 <td><a href="https://wg21.link/p2085r0">P2085R0</a></td>
965 <td class="none" align="center">No</td>
966 </tr>
Richard Smith137f6572017-11-11 17:54:46 +0000967 <tr>
968 <td>Access checking on specializations</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700969 <td><a href="https://wg21.link/p0692r1">P0692R1</a></td>
Richard Smith137f6572017-11-11 17:54:46 +0000970 <td class="partial" align="center">Partial</td>
971 </tr>
972 <tr>
973 <td>Default constructible and assignable stateless lambdas</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700974 <td><a href="https://wg21.link/p0624r2">P0624R2</a></td>
Richard Smithde510a82019-05-04 00:23:18 +0000975 <td class="full" align="center">Clang 8</td>
Richard Smith137f6572017-11-11 17:54:46 +0000976 </tr>
977 <tr>
978 <td>Lambdas in unevaluated contexts</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700979 <td><a href="https://wg21.link/p0315r4">P0315R4</a></td>
Richard Smithda62f422017-07-15 15:42:36 +0000980 <td class="none" align="center">No</td>
981 </tr>
Richard Smitha14f3202018-03-17 14:28:47 +0000982 <!-- Jacksonville papers -->
983 <tr>
984 <td><tt>[[no_unique_address]]</tt> attribute</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700985 <td><a href="https://wg21.link/p0840r2">P0840R2</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +0000986 <td class="full" align="center">Clang 9</td>
Richard Smitha14f3202018-03-17 14:28:47 +0000987 </tr>
988 <tr>
989 <td><tt>[[likely]]</tt> and <tt>[[unlikely]]</tt> attributes</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700990 <td><a href="https://wg21.link/p0479r5">P0479R5</a></td>
Mark de Wever2bcda6b2020-10-18 13:34:41 +0200991 <td class="unreleased" align="center">Clang 12</td>
Richard Smitha14f3202018-03-17 14:28:47 +0000992 </tr>
993 <tr>
994 <td><tt>typename</tt> optional in more contexts</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -0700995 <td><a href="https://wg21.link/p0634r3">P0634R3</a></td>
Richard Smitha14f3202018-03-17 14:28:47 +0000996 <td class="none" align="center">No</td>
997 </tr>
998 <tr>
999 <td>Pack expansion in lambda <i>init-capture</i></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001000 <td><a href="https://wg21.link/p0780r2">P0780R2</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +00001001 <td class="full" align="center">Clang 9</td>
Richard Smitha14f3202018-03-17 14:28:47 +00001002 </tr>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001003 <!-- Rapperswil papers -->
1004 <tr>
Richard Smith092577e2019-11-09 01:17:57 -08001005 <td rowspan="2">Class types as non-type template parameters</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001006 <td><a href="https://wg21.link/p0732r2">P0732R2</a></td>
Richard Smith092577e2019-11-09 01:17:57 -08001007 <td rowspan="2" class="none" align="center">No</td>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001008 </tr>
Richard Smith092577e2019-11-09 01:17:57 -08001009 <tr> <!-- from Belfast -->
1010 <td><a href="https://wg21.link/p1907r1">P1907R1</a></td>
1011 </tr>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001012 <tr>
1013 <td>Destroying operator delete</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001014 <td><a href="https://wg21.link/p0722r3">P0722R3</a></td>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001015 <td class="full" align="center">Clang 6</td>
1016 </tr>
1017 <tr>
Richard Smith1f8aa532019-07-20 08:20:54 +00001018 <td rowspan="7">Relaxations of <tt>constexpr</tt> restrictions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001019 <td><a href="https://wg21.link/p1064r0">P1064R0</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +00001020 <td class="full" align="center">Clang 9</td>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001021 </tr>
Richard Smith429dbdd2018-11-10 18:02:40 +00001022 <tr> <!-- from San Diego -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001023 <td><a href="https://wg21.link/p1002r1">P1002R1</a></td>
Richard Smithde510a82019-05-04 00:23:18 +00001024 <td class="full" align="center">Clang 8</td>
Richard Smith429dbdd2018-11-10 18:02:40 +00001025 </tr>
1026 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001027 <td><a href="https://wg21.link/p1327r1">P1327R1</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +00001028 <td rowspan="2" class="full" align="center">Clang 9</td>
Richard Smith429dbdd2018-11-10 18:02:40 +00001029 </tr>
1030 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001031 <td><a href="https://wg21.link/p1330r0">P1330R0</a></td>
Richard Smith429dbdd2018-11-10 18:02:40 +00001032 </tr>
Richard Smith1f8aa532019-07-20 08:20:54 +00001033 <tr> <!-- from Cologne -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001034 <td><a href="https://wg21.link/p1331r2">P1331R2</a></td>
Hubert Tong021a3332020-04-14 18:36:50 -04001035 <td rowspan="3" class="full" align="center">Clang 10</td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001036 </tr>
1037 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001038 <td><a href="https://wg21.link/p1668r1">P1668R1</a></td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001039 </tr>
1040 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001041 <td><a href="https://wg21.link/p0784r7">P0784R7</a></td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001042 </tr>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001043 <tr>
1044 <td>Prohibit aggregates with user-declared constructors</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001045 <td><a href="https://wg21.link/p1008r1">P1008R1</a></td>
Richard Smithde510a82019-05-04 00:23:18 +00001046 <td class="full" align="center">Clang 8</td>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001047 </tr>
1048 <tr>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001049 <td>Feature test macros</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001050 <td><a href="https://wg21.link/p0941r2">P0941R2</a></td>
Richard Smith20eb9ba2018-06-14 00:40:20 +00001051 <td class="full" align="center"><a href="#sd6">(see below)</a></td>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001052 </tr>
1053 <tr>
1054 <td><tt>explicit(bool)</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001055 <td><a href="https://wg21.link/p0892r2">P0892R2</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +00001056 <td class="full" align="center">Clang 9</td>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001057 </tr>
Richard Smith429dbdd2018-11-10 18:02:40 +00001058 <!-- San Diego papers -->
1059 <tr>
1060 <td>Signed integers are two's complement</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001061 <td><a href="https://wg21.link/p1236r1">P1236R1</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +00001062 <td class="full" align="center">Clang 9</td>
Richard Smith429dbdd2018-11-10 18:02:40 +00001063 </tr>
1064 <tr>
1065 <td><tt>char8_t</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001066 <td><a href="https://wg21.link/p0482r6">P0482R6</a></td>
Richard Smith28ddb912018-11-14 21:04:34 +00001067 <td class="full" align="center">Clang 7 <a href="#p0482">(11)</a></td>
Richard Smith429dbdd2018-11-10 18:02:40 +00001068 </tr>
1069 <tr>
Richard Smithb74a3812020-02-15 01:51:43 -08001070 <td rowspan=2>Immediate functions (<tt>consteval</tt>)</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001071 <td><a href="https://wg21.link/p1073r3">P1073R3</a></td>
Richard Smithb74a3812020-02-15 01:51:43 -08001072 <td rowspan=2 class="none" align="center">No</td>
Richard Smith429dbdd2018-11-10 18:02:40 +00001073 </tr>
Richard Smithb74a3812020-02-15 01:51:43 -08001074 <tr> <!-- from Prague -->
1075 <td><a href="https://wg21.link/p1937r2">P1937R2</a></td>
1076 </tr>
Richard Smith429dbdd2018-11-10 18:02:40 +00001077 <tr>
1078 <td><tt>std::is_constant_evaluated</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001079 <td><a href="https://wg21.link/p0595r2">P0595R2</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +00001080 <td class="full" align="center">Clang 9</td>
Richard Smith429dbdd2018-11-10 18:02:40 +00001081 </tr>
1082 <tr>
1083 <td>Nested inline namespaces</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001084 <td><a href="https://wg21.link/p1094r2">P1094R2</a></td>
Richard Smithde510a82019-05-04 00:23:18 +00001085 <td class="full" align="center">Clang 8</td>
Richard Smith429dbdd2018-11-10 18:02:40 +00001086 </tr>
Richard Smith456e7af2019-02-23 21:06:25 +00001087 <!-- Kona 2019 papers -->
1088 <tr>
1089 <td rowspan="2">Structured binding extensions</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001090 <td><a href="https://wg21.link/p1091r3">P1091R3</a></td>
Richard Smith13bf9892019-05-22 19:52:55 +00001091 <td rowspan="2" class="partial" align="center">Partial</td>
Richard Smith456e7af2019-02-23 21:06:25 +00001092 </tr>
1093 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001094 <td><a href="https://wg21.link/p1381r1">P1381R1</a></td>
Richard Smith456e7af2019-02-23 21:06:25 +00001095 </tr>
1096 <tr>
1097 <td rowspan="2">Stronger Unicode requirements</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001098 <td><a href="https://wg21.link/p1041r4">P1041R4</a></td>
Richard Smith456e7af2019-02-23 21:06:25 +00001099 <td rowspan="2" class="full" align="center">Yes</td>
1100 </tr>
1101 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001102 <td><a href="https://wg21.link/p1139r2">P1139R2</a></td>
Richard Smith456e7af2019-02-23 21:06:25 +00001103 </tr>
1104 <tr>
Richard Smith092577e2019-11-09 01:17:57 -08001105 <td rowspan="2">Parenthesized initialization of aggregates</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001106 <td><a href="https://wg21.link/p0960r3">P0960R3</a></td>
Richard Smith092577e2019-11-09 01:17:57 -08001107 <td rowspan="2" class="none" align="center">No</td>
Richard Smith456e7af2019-02-23 21:06:25 +00001108 </tr>
Richard Smith092577e2019-11-09 01:17:57 -08001109 <tr> <!-- from Belfast -->
1110 <td><a href="https://wg21.link/p1975r0">P1975R0</a></td>
1111 </tr>
Richard Smith456e7af2019-02-23 21:06:25 +00001112 <tr>
Richard Smithb74a3812020-02-15 01:51:43 -08001113 <td rowspan="10">Modules</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001114 <td><a href="https://wg21.link/p1103r3">P1103R3</a></td>
Richard Smith3c7688b2019-05-04 00:27:21 +00001115 <td class="partial" align="center">Partial</td>
Richard Smith456e7af2019-02-23 21:06:25 +00001116 </tr>
Richard Smith1f8aa532019-07-20 08:20:54 +00001117 <tr> <!-- from Cologne -->
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001118 <td><a href="https://wg21.link/p1766r1">P1766R1</a> (<a href="#dr">DR</a>)</td>
Richard Smith42efd352020-02-07 11:53:54 -08001119 <td class="unreleased" align="center">Clang 11</td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001120 </tr>
1121 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001122 <td><a href="https://wg21.link/p1811r0">P1811R0</a></td>
Richard Smith42efd352020-02-07 11:53:54 -08001123 <td rowspan="2" class="none" align="center">No</td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001124 </tr>
1125 <tr>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001126 <td><a href="https://wg21.link/p1703r1">P1703R1</a></td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001127 </tr>
Richard Smith092577e2019-11-09 01:17:57 -08001128 <tr> <!-- from Belfast -->
1129 <td><a href="https://wg21.link/p1874r1">P1874R1</a></td>
1130 <td class="partial" align="center">Partial</td>
1131 </tr>
1132 <tr> <!-- from Belfast -->
1133 <td><a href="https://wg21.link/p1979r0">P1979R0</a></td>
Richard Smithb74a3812020-02-15 01:51:43 -08001134 <td rowspan="3" class="none" align="center">No</td>
1135 </tr>
1136 <tr> <!-- from Prague -->
1137 <td><a href="https://wg21.link/p1779r3">P1779R3</a></td>
1138 </tr>
1139 <tr>
1140 <td><a href="https://wg21.link/p1857r3">P1857R3</a></td>
1141 </tr>
1142 <tr>
1143 <td><a href="https://wg21.link/p2115r0">P2115R0</a></td>
1144 <td class="partial" align="center">Partial</td>
1145 </tr>
1146 <tr>
1147 <td><a href="https://wg21.link/p1815r2">P1815R2</a></td>
Richard Smith092577e2019-11-09 01:17:57 -08001148 <td class="none" align="center">No</td>
1149 </tr>
Richard Smith456e7af2019-02-23 21:06:25 +00001150 <tr>
1151 <td>Coroutines</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001152 <td><a href="https://wg21.link/p0912r5">P0912R5</a></td>
Richard Smith10ab78e2019-02-23 21:06:26 +00001153 <td class="partial" align="center">Partial</td>
Richard Smith456e7af2019-02-23 21:06:25 +00001154 </tr>
Richard Smith1f8aa532019-07-20 08:20:54 +00001155 <!-- Cologne 2019 papers -->
1156 <tr>
1157 <td>Deprecate <tt>a[b,c]</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001158 <td><a href="https://wg21.link/p1161r3">P1161R3</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +00001159 <td class="full" align="center">Clang 9</td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001160 </tr>
1161 <tr>
1162 <td>Deprecate some problematic uses of <tt>volatile</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001163 <td><a href="https://wg21.link/p1152r4">P1152R4</a></td>
Hubert Tong021a3332020-04-14 18:36:50 -04001164 <td class="full" align="center">Clang 10</td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001165 </tr>
1166 <tr>
1167 <td><tt>[[nodiscard("with reason")]]</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001168 <td><a href="https://wg21.link/p1301r4">P1301R4</a></td>
Richard Smith2d2850f2019-09-20 18:09:05 +00001169 <td class="full" align="center">Clang 9</td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001170 </tr>
1171 <tr>
1172 <td><tt>using enum</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001173 <td><a href="https://wg21.link/p1099r5">P1099R5</a></td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001174 <td class="none" align="center">No</td>
1175 </tr>
1176 <tr>
Richard Smithb74a3812020-02-15 01:51:43 -08001177 <td rowspan=2>Class template argument deduction for aggregates</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001178 <td><a href="https://wg21.link/p1816r0">P1816R0</a></td>
Richard Smithb74a3812020-02-15 01:51:43 -08001179 <td rowspan=2 class="none" align="center">No</td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001180 </tr>
Richard Smithb74a3812020-02-15 01:51:43 -08001181 <tr> <!-- from Prague -->
1182 <td><a href="https://wg21.link/p2082r1">P2082R1</a></td>
1183 </tr>
Richard Smith1f8aa532019-07-20 08:20:54 +00001184 <tr>
1185 <td>Class template argument deduction for alias templates</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001186 <td><a href="https://wg21.link/p1814r0">P1814R0</a></td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001187 <td class="none" align="center">No</td>
1188 </tr>
1189 <tr>
1190 <td>Permit conversions to arrays of unknown bound</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001191 <td><a href="https://wg21.link/p0388r4">P0388R4</a></td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001192 <td class="none" align="center">No</td>
1193 </tr>
1194 <tr>
1195 <td><tt>constinit</tt></td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001196 <td><a href="https://wg21.link/p1143r2">P1143R2</a></td>
Hubert Tong021a3332020-04-14 18:36:50 -04001197 <td class="full" align="center">Clang 10</td>
Richard Smith1f8aa532019-07-20 08:20:54 +00001198 </tr>
Richard Smithb74a3812020-02-15 01:51:43 -08001199 <!-- Prague 2019 papers -->
1200 <tr>
1201 <td>Pseudo-destructors end object lifetimes</td>
1202 <td><a href="https://wg21.link/p0593r6">P0593R6</a> (<a href="#dr">DR</a>)</td>
Richard Smith061f3a52020-02-18 18:39:57 -08001203 <td class="unreleased" align="center">Clang 11</td>
Richard Smithb74a3812020-02-15 01:51:43 -08001204 </tr>
Richard Smithda62f422017-07-15 15:42:36 +00001205</table>
Richard Smith28ddb912018-11-14 21:04:34 +00001206
1207<p>
1208<span id="p0482">(11): Prior to Clang 8, this feature is not enabled by
Richard Smith24ad1212020-02-18 16:13:23 -08001209<tt>-std=c++20</tt>, but can be enabled with <tt>-fchar8_t</tt>.
Richard Smith28ddb912018-11-14 21:04:34 +00001210</span>
1211</p>
Richard Smithda62f422017-07-15 15:42:36 +00001212</details>
1213
Richard Smitha14f3202018-03-17 14:28:47 +00001214<h2 id="dr">Defect reports</h2>
1215
1216<p>Clang generally aims to implement resolutions to Defect Reports (bug fixes
1217against prior standards) retroactively, in all prior standard versions where
1218the fix is meaningful. Significant Defect Report changes to language features
1219after the publication of the relevant standard are marked (DR) in the above
1220table.</p>
1221
1222<p>Clang also has a test suite for conformance to resolutions for issues on the
1223<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_toc.html">C++ core issues list</a>,
1224most of which are considered Defect Reports.
1225<a href="cxx_dr_status.html">Implementation status for C++ core issues</a> based on
1226that test suite is tracked on a separate page.</p>
Richard Smith1363e8f2017-09-07 07:22:36 +00001227
Richard Smith91e474f2013-11-27 22:58:16 +00001228<h2 id="ts">Technical specifications and standing documents</h2>
1229
1230<p>ISO C++ also publishes a number of documents describing additional language
Richard Smithe2bf8782016-09-28 21:01:37 +00001231and library features that are not part of standard C++.</p>
1232
1233<details open>
1234<summary>List of features and minimum Clang version with support</summary>
Richard Smith91e474f2013-11-27 22:58:16 +00001235
1236<table width="689" border="1" cellspacing="0">
1237 <tr>
1238 <th>Document</th>
1239 <th>Latest draft</th>
Richard Smithe2bf8782016-09-28 21:01:37 +00001240 <th>Compiler flag</th>
Richard Smith91e474f2013-11-27 22:58:16 +00001241 <th>Available in Clang?</th>
1242 </tr>
Richard Smith3e3e2e92018-06-14 00:05:28 +00001243 <tr id="sd6">
Richard Smith092577e2019-11-09 01:17:57 -08001244 <td rowspan="7">SD-6: SG10 feature test recommendations</td>
1245 <td rowspan="7"><a href="https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations">SD-6</a></td>
1246 <td rowspan="7">N/A</td>
Richard Smith38af8562014-11-12 21:16:38 +00001247 <td class="full" align="center">
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001248 Clang 3.4 (<a href="https://wg21.link/n3745">N3745</a>)</br>
Richard Smith38af8562014-11-12 21:16:38 +00001249 </td>
1250 </tr>
1251 <tr>
Richard Smith42b10572015-11-11 01:36:17 +00001252 <td class="full" align="center">
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001253 Clang 3.6 (<a href="https://wg21.link/n4200">N4200</a>)</a>
Richard Smith38af8562014-11-12 21:16:38 +00001254 </td>
Richard Smith91e474f2013-11-27 22:58:16 +00001255 </tr>
Richard Smithb02043c2016-09-28 19:44:50 +00001256 <tr>
Richard Smithd7279bb2017-01-13 00:57:54 +00001257 <td class="full" align="center">
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001258 Clang 4 (<a href="https://wg21.link/p0096r3">P0096R3</a>)</a>
Richard Smithb02043c2016-09-28 19:44:50 +00001259 </td>
1260 </tr>
Richard Smith9d07ae72017-08-11 03:39:40 +00001261 <tr>
Richard Smith4b82f9c2017-09-09 01:11:04 +00001262 <td class="full" align="center">
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001263 Clang 5 (<a href="https://wg21.link/p0096r4">P0096R4</a>)</a>
Richard Smith9d07ae72017-08-11 03:39:40 +00001264 </td>
1265 </tr>
Richard Smith20eb9ba2018-06-14 00:40:20 +00001266 <tr>
Richard Smithe57418b2018-09-24 23:21:09 +00001267 <td class="full" align="center">
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001268 Clang 7 (<a href="https://wg21.link/p0096r5">P0096R5</a>)</a>
Richard Smith20eb9ba2018-06-14 00:40:20 +00001269 </td>
1270 </tr>
Chris Kennelly8dfa4ad2019-01-11 17:09:22 +00001271 <tr>
Richard Smithdf2e2ab2019-12-19 12:57:04 -08001272 <td class="full" align="center">
1273 Clang 9 (<a href="https://wg21.link/p1353r0">P1353R0</a>)
Chris Kennelly8dfa4ad2019-01-11 17:09:22 +00001274 </td>
1275 </tr>
Richard Smith092577e2019-11-09 01:17:57 -08001276 <tr>
Hubert Tong021a3332020-04-14 18:36:50 -04001277 <td class="full" align="center">
Richard Smithb32013b2020-01-22 14:48:56 -08001278 Clang 10 (<a href="https://wg21.link/p1902r1">P1902R1</a>)</a>
Richard Smith894835f2015-11-05 21:41:06 +00001279 </td>
1280 </tr>
Richard Smith894835f2015-11-05 21:41:06 +00001281 <!-- No compiler support is known to be needed for:
1282 * Concurrency TS
Richard Smith20eb9ba2018-06-14 00:40:20 +00001283 * Parallelism TS (v1, v2)
Richard Smith894835f2015-11-05 21:41:06 +00001284 * Ranges TS
1285 * Networking TS
1286 * File System TS
1287 -->
1288 <tr>
1289 <td>[TS] Concepts</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001290 <td><a href="https://wg21.link/p0121r0">P0121R0</a></td>
Richard Smithe2bf8782016-09-28 21:01:37 +00001291 <td></td>
Richard Smith137f6572017-11-11 17:54:46 +00001292 <td class="na" align="center">Superseded by <a href="#p0734">P0734R0</a></td>
Richard Smithe2bf8782016-09-28 21:01:37 +00001293 </tr>
1294 <tr>
Richard Smith429dbdd2018-11-10 18:02:40 +00001295 <!-- track unimplemented Coroutines features: p0913r1 p0914r1 p1356r0 -->
Richard Smith456e7af2019-02-23 21:06:25 +00001296 <td rowspan="2">[TS] Coroutines</td>
1297 <td rowspan="2"><a href="https://isocpp.org/files/papers/N4663.pdf">N4663</a></td>
Richard Smith29c5f162017-07-06 00:29:13 +00001298 <td><tt>-fcoroutines-ts<br>-stdlib=libc++</tt></td>
Richard Smith4b82f9c2017-09-09 01:11:04 +00001299 <td class="full" align="center">Clang 5</td>
Richard Smith91e474f2013-11-27 22:58:16 +00001300 </tr>
Richard Smith3a0ed872014-02-15 00:29:00 +00001301 <tr>
Richard Smith24ad1212020-02-18 16:13:23 -08001302 <td><tt>-std=c++20<br>-stdlib=libc++</tt></td>
Richard Smith456e7af2019-02-23 21:06:25 +00001303 <td class="na" align="center">Superseded by <a href="#p0912">P0912R5</a></td>
1304 </tr>
1305 <tr>
Richard Smith894835f2015-11-05 21:41:06 +00001306 <td>[TS] Library Fundamentals, Version 1 (invocation type traits)</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001307 <td><a href="https://wg21.link/n4480">N4480</a></td>
Richard Smithe2bf8782016-09-28 21:01:37 +00001308 <td>N/A</td>
Richard Smith3a0ed872014-02-15 00:29:00 +00001309 <td class="none" align="center">No</td>
1310 </tr>
1311 <tr>
Richard Smith20eb9ba2018-06-14 00:40:20 +00001312 <td>[TS] Library Fundamentals, Version 2 (<tt>source_location</tt>)</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001313 <td><a href="https://wg21.link/n4617">N4617</a></td>
Richard Smithe2bf8782016-09-28 21:01:37 +00001314 <td>N/A</td>
Richard Smith32377ad2019-10-08 23:39:56 +00001315 <td class="full" align="center">Clang 9 (<a href="docs/LanguageExtensions.html#source-location-builtins">documentation</a>)</td>
Richard Smith894835f2015-11-05 21:41:06 +00001316 </tr>
1317 <tr>
Richard Smith20eb9ba2018-06-14 00:40:20 +00001318 <td>[TS] Modules</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001319 <td><a href="https://wg21.link/n4720">N4720</a></td>
Richard Smithe2bf8782016-09-28 21:01:37 +00001320 <td><tt>-fmodules-ts</tt></td>
Richard Smith456e7af2019-02-23 21:06:25 +00001321 <td class="na" align="center">Superseded by <a href="#p1103">P1103R3</a></td>
Richard Smithf006a962016-03-04 21:01:14 +00001322 </tr>
Richard Smitha14f3202018-03-17 14:28:47 +00001323 <tr>
1324 <td>[DRAFT TS] Reflection</td>
Hubert Tongdfaafba2020-03-09 14:09:00 -04001325 <td><a href="https://wg21.link/n4818">N4818</a></td>
Richard Smitha14f3202018-03-17 14:28:47 +00001326 <td></td>
1327 <td class="none" align="center">No</td>
1328 </tr>
Richard Smithf006a962016-03-04 21:01:14 +00001329 <tr>
Richard Smith894835f2015-11-05 21:41:06 +00001330 <td>[TS] Transactional Memory</td>
Stephan T. Lavavej2e4f1e12019-10-23 16:42:47 -07001331 <td><a href="https://wg21.link/n4514">N4514</a></td>
Richard Smithe2bf8782016-09-28 21:01:37 +00001332 <td></td>
Richard Smith3a0ed872014-02-15 00:29:00 +00001333 <td class="none" align="center">No</td>
1334 </tr>
Richard Smith91e474f2013-11-27 22:58:16 +00001335</table>
Richard Smithe2bf8782016-09-28 21:01:37 +00001336</details>
Richard Smith91e474f2013-11-27 22:58:16 +00001337
Cedric Venet084381332009-02-14 20:20:19 +00001338</div>
1339</body>
1340</html>