C++ Support in Clang
Last updated: $Date: 2015-02-26 00:48:35 +0100 (jeu. 26 févr. 2015) $
Clang fully implements all published ISO C++ standards including C++11, as well as the upcoming C++14 standard, and some parts of the fledgling C++1z standard, and is considered a production-quality C++ compiler.
The Clang community is continually striving to improve C++ standards compliance between releases by submitting and tracking C++ Defect Reports and implementing resolutions as they become available.
Experimental work is also under way to implement C++ Technical Specifications that will help drive the future of the C++ programming language.
The LLVM bug tracker contains Clang C++ components that track known bugs with Clang's language conformance in each language mode.
C++98 implementation status
Clang implements all of the ISO C++ 1998 standard (including the defects addressed in the ISO C++ 2003 standard) except for export (which was removed in C++11).
C++11 implementation status
Clang 3.3 and later implement all of the ISO C++ 2011 standard. The following table describes the Clang version in which each feature became available.
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
-std=c++11
option. Clang's C++11 mode can be used
with libc++ or with gcc's libstdc++, but
patches are needed to make libstdc++-4.4
work with Clang in C++11 mode. Patches are also needed to make
libstdc++-4.6
and libstdc++-4.7 work with Clang
releases prior to version 3.2 in C++11 mode. thread_local support
currently requires the C++ runtime library from g++-4.8 or later.
Language Feature | C++11 Proposal | Available in Clang? |
---|---|---|
Rvalue references | N2118 | Clang 2.9 |
Rvalue references for *this |
N2439 | Clang 2.9 |
Initialization of class objects by rvalues | N1610 | Clang 2.9 |
Non-static data member initializers | N2756 | Clang 3.0 |
Variadic templates | N2242 | Clang 2.9 |
Extending variadic template template parameters | N2555 | Clang 2.9 |
Initializer lists | N2672 | Clang 3.1 |
Static assertions | N1720 | Clang 2.9 |
auto -typed variables |
N1984 | Clang 2.9 |
Multi-declarator auto |
N1737 | Clang 2.9 |
Removal of auto as a storage-class specifier | N2546 | Clang 2.9 |
New function declarator syntax | N2541 | Clang 2.9 |
Lambda expressions | N2927 | Clang 3.1 |
Declared type of an expression | N2343 | Clang 2.9 |
Incomplete return types | N3276 | Clang 3.1 |
Right angle brackets | N1757 | Clang 2.9 |
Default template arguments for function templates | DR226 | Clang 2.9 |
Solving the SFINAE problem for expressions | DR339 | Clang 2.9 |
Alias templates | N2258 | Clang 3.0 |
Extern templates | N1987 | Clang 2.9 |
Null pointer constant | N2431 | Clang 3.0 |
Strongly-typed enums | N2347 | Clang 2.9 |
Forward declarations for enums | N2764
DR1206 |
Clang 3.1 |
Standardized attribute syntax | N2761 | Clang 3.3 (1) |
Generalized constant expressions | N2235 | Clang 3.1 |
Alignment support | N2341 | Clang 3.3 |
Conditionally-support behavior | N1627 | Clang 2.9 |
Changing undefined behavior into diagnosable errors | N1727 | Clang 2.9 |
Delegating constructors | N1986 | Clang 3.0 |
Inheriting constructors | N2540 | Clang 3.3 |
Explicit conversion operators | N2437 | Clang 3.0 |
New character types | N2249 | Clang 2.9 |
Unicode string literals | N2442 | Clang 3.0 |
Raw string literals | N2442 | Clang 3.0 |
Universal character names in literals | N2170 | Clang 3.1 |
User-defined literals | N2765 | Clang 3.1 |
Standard Layout Types | N2342 | Clang 3.0 |
Defaulted functions | N2346 | Clang 3.0 |
Deleted functions | N2346 | Clang 2.9 |
Extended friend declarations | N1791 | Clang 2.9 |
Extending sizeof |
N2253
DR850 |
Clang 3.1 |
Inline namespaces | N2535 | Clang 2.9 |
Unrestricted unions | N2544 | Clang 3.1 |
Local and unnamed types as template arguments | N2657 | Clang 2.9 |
Range-based for | N2930 | Clang 3.0 |
Explicit virtual overrides | N2928
N3206 N3272 |
Clang 3.0 |
Minimal support for garbage collection and reachability-based leak detection | N2670 | N/A (2) |
Allowing move constructors to throw [noexcept] | N3050 | Clang 3.0 |
Defining move special member functions | N3053 | Clang 3.0 |
Concurrency | ||
Sequence points | N2239 | Clang 3.3 |
Atomic operations | N2427 | Clang 3.1 |
Strong Compare and Exchange | N2748 | Clang 3.1 (3) |
Bidirectional Fences | N2752 | Clang 3.1 |
Memory model | N2429 | Clang 3.2 |
Data-dependency ordering: atomics and memory model | N2664 | Clang 3.2 (4) |
Propagating exceptions | N2179 | Clang 2.9 |
Allow atomics use in signal handlers | N2547 | Clang 3.1 |
Thread-local storage | N2659 | Clang 3.3 |
Dynamic initialization and destruction with concurrency | N2660 | Clang 2.9 |
C99 Features in C++11 | ||
__func__ predefined identifier |
N2340 | Clang 2.9 |
C99 preprocessor | N1653 | Clang 2.9 |
long long |
N1811 | Clang 2.9 |
Extended integral types | N1988 | N/A (5) |
(1): The [[carries_dependency]]
attribute
has no effect.
(2): No compiler changes are required for an implementation
such as Clang that does not provide garbage collection.
(3): All compare-exchange operations are emitted as
strong compare-exchanges.
(4): memory_order_consume
is lowered to
memory_order_acquire
.
(5): No compiler changes are required for an implementation
such as Clang that does not provide any extended integer types.
__int128
is not treated as an extended integer type,
because changing intmax_t
would be an ABI-incompatible
change.
C++14 implementation status
Clang 3.4 and later implement all of the Draft International Standard (see most recent publicly available draft) of the upcoming C++14 language standard. The following table describes the Clang version in which each feature became available.
You can use Clang in C++14 mode with the -std=c++14
option
(use -std=c++1y
in Clang 3.4 and earlier).
Language Feature | C++14 Proposal | Available in Clang? |
---|---|---|
Tweak to certain C++ contextual conversions | N3323 | Clang 3.4 |
Binary literals | N3472 | Clang 2.9 |
decltype(auto) | N3638 | Clang 3.3 |
Return type deduction for normal functions | Clang 3.4 | |
Initialized lambda captures | N3648 | Clang 3.4 |
Generic lambdas | N3649 | Clang 3.4 |
Variable templates | N3651 | Clang 3.4 |
Relaxing requirements on constexpr functions | N3652 | Clang 3.4 |
Member initializers and aggregates | N3653 | Clang 3.3 |
Clarifying memory allocation | N3664 | Clang 3.4 |
[[deprecated]] attribute | N3760 | Clang 3.4 |
Single quotation mark as digit separator | N3781 | Clang 3.4 |
C++ Sized Deallocation | N3778 | Clang 3.4 (6) |
(6): In Clang SVN, using sized deallocation in C++14 mode requires linking either
libc++ 3.7 or later, or libstdc++ 5 or later. Alternatively, you can use the
-Xclang -fdefine-sized-deallocation
compiler option to enable the implementation from
Clang 3.4 through Clang 3.6, where weak definitions of sized deallocation functions are implicitly
generated (by the compiler). You can also use the -Xclang -fno-sized-deallocation
option
to disable sized deallocation. Note that both of these flags are temporary provisions and may go away
soon.
C++1z implementation status
Clang has highly experimental support for some proposed features of the C++ standard following C++14, provisionally named C++1z. The following table describes which C++1z features have been implemented in Clang and in which Clang version they became available.
Note that support for these features may change or be removed without notice, as the draft C++1z standard evolves.
You can use Clang in C++1z mode with the -std=c++1z
option.
Language Feature | C++1z Proposal | Available in Clang? |
---|---|---|
static_assert with no message | N3928 | Clang 3.5 |
Disabling trigraph expansion by default | N4086 | Clang 3.5 |
typename in a template template parameter | N4051 | Clang 3.5 |
New auto rules for direct-list-initialization | N3922 | No |
Fold expressions | N4295 | Clang 3.6 |
u8 character literals | N4267 | Clang 3.6 |
Nested namespace definition | N4230 | Clang 3.6 |
Attributes for namespaces and enumerators | N4266 | Clang 3.6 |
Allow constant evaluation for all non-type template arguments | N4268 | Clang 3.6 |
Technical specifications and standing documents
ISO C++ also publishes a number of documents describing additional language and library features that are not part of standard C++. The following table describes which language features have been implemented in Clang and in which Clang version they became available:
Document | Latest draft | Available in Clang? |
---|---|---|
SD-6: SG10 feature test recommendations | SD-6 | Clang 3.4 (N3745) |
Clang 3.6 (N4200) | ||
[DRAFT TS] Array extensions (arrays of runtime bound) | N3820 | No |
[DRAFT TS] Library fundamentals (invocation type traits) | N3908 | No |
[DRAFT TS] Concepts | N3929 | No |