Newer
Older
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Clang - C++98 and C++11 Status</title>
<link type="text/css" rel="stylesheet" href="menu.css">
<link type="text/css" rel="stylesheet" href="content.css">
.none { background-color: #FFCCCC }

Richard Smith
committed
.svn { background-color: #FFFF99 }
.full { background-color: #CCFF99 }

Richard Smith
committed
.na { background-color: #DDDDDD }
span:target { background-color: #FFFFBB; outline: #DDDD55 solid thin; }
</style>
</head>
<body>
<!--#include virtual="menu.html.incl"-->
<div id="content">
<!--*************************************************************************-->
<h1>C++98, C++11, and C++14 Support in Clang</h1>
<!--*************************************************************************-->
<p>Last updated: $Date$</p>
<h2 id="cxx98">C++98 implementation status</h2>

Douglas Gregor
committed
<p>Clang currently implements all of the ISO C++ 1998 standard
(including the defects addressed in the ISO C++ 2003 standard)
except for 'export' (which has been removed in C++11)

Douglas Gregor
committed
and is considered a production-quality C++ compiler. The <a
href="http://llvm.org/bugs/">LLVM bug tracker</a> contains a Clang
C++ component that tracks known Clang C++ bugs.</p>
<h2 id="cxx11">C++11 implementation status</h2>
<p>Clang implements all of the <a
href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372">ISO
C++ 2011 standard</a>. The following table describes the Clang version
in which each feature became available.</p>
<p>By default, Clang builds C++ code according to the C++98 standard, with many
C++11 features accepted as extensions. You can use Clang in C++11 mode with the
<code>-std=c++11</code> option. Clang's C++11 mode can be used
with <a href="http://libcxx.llvm.org/">libc++</a> or with gcc's libstdc++, but
patches are needed to make <a href="libstdc++4.4-clang0x.patch">libstdc++-4.4</a>
work with Clang in C++11 mode. Patches are also needed to make

Richard Smith
committed
<a href="libstdc++4.6-clang11.patch">libstdc++-4.6</a>,
and <a href="libstdc++4.7-clang11.patch">libstdc++-4.7</a> work with Clang
releases prior to version 3.2 in C++11 mode. <tt>thread_local</tt> support
currently requires g++-4.8's C++ runtime library.</p>
<table width="689" border="1" cellspacing="0">
<th>C++11 Proposal</th>
</tr>
<tr>
<td>Rvalue references</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html">N2118</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td> Rvalue references for <code>*this</code></td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm">N2439</a></td>
</tr>
<tr>
<td>Initialization of class objects by rvalues</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1610.html">N1610</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Non-static data member initializers</td>
<td><a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm">N2756</a></td>
</tr>
<tr>
<td>Variadic templates</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf">N2242</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td> Extending variadic template template parameters</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf">N2555</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Initializer lists</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm">N2672</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>Static assertions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html">N1720</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td><code>auto</code>-typed variables</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf">N1984</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td> Multi-declarator <code>auto</code></td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1737.pdf">N1737</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td> Removal of auto as a storage-class specifier</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm">N2546</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td> New function declarator syntax</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm">N2541</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td><a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2927.pdf">N2927</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>Declared type of an expression</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf">N2343</a></td>
<td class="full" align="center">Clang 2.9</td>
<tr>
<td> Incomplete return types</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3276.pdf">N3276</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>Right angle brackets</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html">N1757</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Default template arguments for function templates</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226">DR226</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Solving the SFINAE problem for expressions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html">DR339</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Alias templates</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf">N2258</a></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr>
<td>Extern templates</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm">N1987</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Null pointer constant</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf">N2431</a></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr>
<td>Strongly-typed enums</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf">N2347</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Forward declarations for enums</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf">N2764</a>
<br><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1206">DR1206</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>Generalized attributes</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf">N2761</a></td>
<td class="svn" align="center">SVN <a href="#n2761">(1)</a></td>
</tr>
<tr>
<td>Generalized constant expressions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf">N2235</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>Alignment support</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf">N2341</a></td>
</tr>
<!-- Skipped N1627: Conditionally-support behavior -->
<!-- Skipped N1727: Changing Undefined Behavior into Diagnosable Errors -->
<tr>
<td>Delegating constructors</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf">N1986</a></td>
</tr>
<tr>
<td>Inheriting constructors</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm">N2540</a></td>
<td class="svn" align="center">SVN</td>
</tr>
<tr>
<td>Explicit conversion operators</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf">N2437</a></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr>
<td>New character types</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html">N2249</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Unicode string literals</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm">N2442</a></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr>
<td>Raw string literals</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm">N2442</a></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr>

Richard Smith
committed
<td>Universal character names in literals</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html">N2170</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>User-defined literals</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf">N2765</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>Standard Layout Types</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm">N2342</a></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr>
<td>Defaulted functions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm">N2346</a></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr>
<td>Deleted functions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm">N2346</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Extended friend declarations</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf">N1791</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Extending <code>sizeof</code></td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html">N2253</a>
<br><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#850">DR850</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>Inline namespaces</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm">N2535</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Unrestricted unions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf">N2544</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>Local and unnamed types as template arguments</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm">N2657</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Range-based for</td>
<td><a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2930.html">N2930</a></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr>
<td>Explicit virtual overrides</td>
<td><a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2928.htm">N2928</a>
<br><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm">N3206</a>
<br><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm">N3272</a></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr>
<td>Minimal support for garbage collection and reachability-based leak detection</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm">N2670</a></td>

Richard Smith
committed
<td class="na" align="center">N/A</td>
</tr>
<tr>
<td>Allowing move constructors to throw [noexcept]</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html">N3050</a></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr>
<td>Defining move special member functions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html">N3053</a></td>
<td class="full" align="center">Clang 3.0</td>
<tr class="separator">
</tr>
<tr>
<td>Sequence points</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html">N2239</a></td>
</tr>
<tr>
<td>Atomic operations</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html">N2427</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>Strong Compare and Exchange</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2748.html">N2748</a></td>
<td class="full" align="center">Clang 3.1 <a href="#n2748">(2)</a></td>
</tr>
<tr>
<td>Bidirectional Fences</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2752.htm">N2752</a></td>
<td class="full" align="center">Clang 3.1</td>
<tr>
<td>Memory model</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2429.htm">N2429</a></td>
</tr>
<tr>
<td>Data-dependency ordering: atomics and memory model</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm">N2664</a></td>
<td class="full" align="center">Clang 3.2 <a href="#n2664">(3)</a></td>
</tr>
<tr>
<td>Propagating exceptions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html">N2179</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Abandoning a process and at_quick_exit</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2440.htm">N2440</a></td>
<td class="na" align="center">N/A</td>
</tr>
<tr>
<td>Allow atomics use in signal handlers</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2547.htm">N2547</a></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr>
<td>Thread-local storage</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm">N2659</a></td>
<td class="svn" align="center">SVN</td>
</tr>
<tr>
<td>Dynamic initialization and destruction with concurrency</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm">N2660</a></td>
<tr class="separator">
<th align="center" colspan="3">C99 Features in C++11</th>
</tr>
<tr>
<td><code>__func__</code> predefined identifier</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm">N2340</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>C99 preprocessor</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm">N1653</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td><code>long long</code></td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf">N1811</a></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr>
<td>Extended integral types</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf">N1988</a></td>
<td class="na" align="center">N/A <a href="#n1988">(4)</a></td>
<p>
<span id="n2761">(1): The <code>[[carries_dependency]]</code> attribute
<span id="n2748">(2): All compare-exchange operations are emitted as
strong compare-exchanges.</span><br>
<span id="n2664">(3): <code>memory_order_consume</code> is lowered to
<code>memory_order_acquire</code>.</span><br>
<span id="n1988">(4): <code>__int128</code> is not treated as an extended
integer type, because changing <code>intmax_t</code> would be an
ABI-incompatible change.</span>
</p>
<h2 id="cxx14">C++1y implementation status</h2>
<p>Clang is introducing support for the upcoming C++ language standard,
provisionally named C++1y. The following table describes which C++1y features
have been implemented in Clang and in which Clang version they became
available.</p>
<table width="689" border="1" cellspacing="0">
<tr>
<th>Language Feature</th>
<th>C++1y Proposal</th>
<th>Available in Clang?</th>
</tr>
<tr>
<td>Tweak to certain C++ contextual conversions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3323.pdf">N3323</a></td>
<td class="none" align="center">No</td>
</tr>
<tr>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3472.pdf">N3472</a></td>

Richard Smith
committed
<td class="full" align="center">Yes</td>
<tr>
<td>[PROVISIONAL] Runtime-sized arrays with automatic storage duration</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3639.html">N3639</a></td>
<td class="none" align="center">Partial</td>
</tr>
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
<tr>
<td>[PROVISIONAL] Return type deduction for normal functions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3638.html">N3638</a></td>
<td class="none" align="center">No</td>
</tr>
<!--
<tr>
<td>Runtime-sized arrays with automatic storage duration</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3639.html">N3639</a></td>
<td class="none" align="center">No</td>
</tr>
-->
<tr>
<td>[PROVISIONAL] Initialized lambda captures</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3648.html">N3648</a></td>
<td class="none" align="center">No</td>
</tr>
<tr>
<td>[PROVISIONAL] Generic lambdas</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3649.html">N3649</a></td>
<td class="none" align="center">No</td>
</tr>
<tr>
<td>[PROVISIONAL] Variable templates</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3651.pdf">N3651</a></td>
<td class="none" align="center">No</td>
</tr>
<tr>
<td>[PROVISIONAL] Relaxing requirements on constexpr functions</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3652.html">N3652</a></td>
<td class="none" align="center">No</td>
</tr>
<tr>
<td>[PROVISIONAL] Member initializers and aggregates</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3653.html">N3653</a></td>
<td class="none" align="center">No</td>
</tr>
<!--
<tr>
<td>Digit separators</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3661.html">N3661</a></td>
<td class="none" align="center">No</td>
</tr>
-->
<tr>
<td>[PROVISIONAL] Clarifying memory allocation</td>
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3664.html">N3664</a></td>
<td class="na" align="center">N/A</td>
</tr>
</table>