Clang – C++ Programming Language Status

C++ Support in Clang

Clang implements the following published and upcoming ISO C++ standards:

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 uses
the “c++” label, as well as mode-specific labels such as “c++11”, “c++14”,
and so on, to track known bugs with Clang’s language conformance.

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.

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++.

List of features and minimum Clang version with support

Language Feature
C++11 Proposal
Available in Clang?

Rvalue references
N2118
Clang 2.9

P1825R0 (DR)
Clang 13

    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

P1009R2 (DR)
Clang 9

P1957R2 (DR)
Clang 11

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

P0588R1 (DR)
No

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

P0859R0 (DR)
Clang 8

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

P0136R1 (DR)
Clang 3.9

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

P1286R2 (DR)
Clang 9

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

P0962R1 (DR)
Clang 8

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 (5)

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 (6)

(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): thread_local support
requires a C++ runtime library providing __cxa_thread_atexit, such
as libc++abi 3.6 or later,
or libsupc++ 4.8 or later.
(6): 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 ISO
C++ 2014 standard.

By default, Clang builds C++ code according to the C++14 standard.
You can use Clang in C++14 mode with the -std=c++14 option
(use -std=c++1y in Clang 3.4 and earlier).

List of features and minimum Clang version with support

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 (7)

(7): In Clang 3.7 and later, sized deallocation is only enabled
if the user passes the -fsized-deallocation flag. The user must
supply definitions of the sized deallocation functions, either by providing them
explicitly or by using a C++ standard library that does. libstdc++
added these functions in version 5.0, and libc++ added them in
version 3.7.

C++17 implementation status

Clang 5 and later implement all the features of the
ISO C++ 2017 standard.

You can use Clang in C++17 mode with the -std=c++17 option
(use -std=c++1z in Clang 4 and earlier).

List of features and minimum Clang version with support

Language Feature
C++17 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
Clang 3.8 (8)

Fold expressions
N4295
Clang 3.6

P0036R0
Clang 3.9

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

Remove deprecated register storage class
P0001R1
Clang 3.8

Remove deprecated bool increment
P0002R1
Clang 3.8

Make exception specifications part of the type system
P0012R1
Clang 4

__has_include in preprocessor conditionals
P0061R1
Yes

[[fallthrough]] attribute
P0188R1
Clang 3.9

[[nodiscard]] attribute
P0189R1
Clang 3.9

P1771R1 (DR)
Clang 9

[[maybe_unused]] attribute
P0212R1
Clang 3.9

Aggregate initialization of classes with base classes
P0017R1
Clang 3.9

constexpr lambda expressions
P0170R1
Clang 5

Differing begin and end types in range-based for
P0184R0
Clang 3.9

Lambda capture of *this
P0018R3
Clang 3.9

Direct-list-initialization of enums
P0138R2
Clang 3.9

Hexadecimal floating-point literals
P0245R1
Yes

Using attribute namespaces without repetition
P0028R4
Clang 3.9

Dynamic memory allocation for over-aligned data
P0035R4
Clang 4

Template argument deduction for class templates
P0091R3
Clang 5

P0512R0
P0620R0 (DR)
Clang 7

P0702R1 (DR)
Clang 6

Non-type template parameters with auto type
P0127R2
Clang 4

Guaranteed copy elision
P0135R1
Clang 4

Stricter expression evaluation order
P0145R3
Clang 4 (9)
P0400R0

Requirement to ignore unknown attributes
P0283R2
Yes

constexpr if-statements
P0292R2
Clang 3.9

Inline variables
P0386R2
Clang 3.9

Structured bindings
P0217R3
Clang 4

P0961R1 (DR)
Clang 8

P0969R0 (DR)
Clang 8

Separate variable and condition for if and switch
P0305R1
Clang 3.9

Matching template template parameters to compatible arguments
P0522R0
Partial (10)

Removing deprecated dynamic exception specifications
P0003R5
Clang 4

Pack expansions in using-declarations
P0195R2
Clang 4

(8): This is a backwards-incompatible change that is applied to
all language versions that allow type deduction from auto
(per the request of the C++ committee).
In Clang 3.7, a warning is emitted for all cases that would change meaning.

(9): Under the MS ABI, function parameters are destroyed from
left to right in the callee. As a result, function parameters in calls to
operator<<, operator>>, operator->*,
operator&&, operator||, and operator,
functions using expression syntax are no longer guaranteed to be destroyed in
reverse construction order in that ABI.
This is not fully supported during constant expression evaluation until Clang 12.

(10): Despite being the resolution to a Defect Report, this
feature is disabled by default in all language versions, and can be enabled
explicitly with the flag -frelaxed-template-template-args in Clang 4
onwards.
The change to the standard lacks a corresponding change for template partial
ordering, resulting in ambiguity errors for reasonable and previously-valid
code. This issue is expected to be rectified soon.

C++20 implementation status

Clang has support for some of the features of the
ISO C++ 2020 standard.

You can use Clang in C++20 mode with the -std=c++20 option
(use -std=c++2a in Clang 9 and earlier).

List of features and minimum Clang version with support

Language Feature
C++20 Proposal
Available in Clang?

Default member initializers for bit-fields
P0683R1
Clang 6

const&-qualified pointers to members
P0704R1
Clang 6

Allow lambda-capture [=, this]
P0409R2
Clang 6

__VA_OPT__ for preprocessor comma elision
P0306R4
Clang 6

P1042R1
Clang 9

Designated initializers
P0329R4
Clang 10

template-parameter-list for generic lambdas
P0428R2
Clang 9

Concepts
P0734R0
Clang 10

P0857R0
Clang 16

P1084R2
Clang 10

P1141R2
P0848R3

Clang 16 (Partial)
Because of other concepts implementation deficits, the __cpp_concepts macro is not yet set to 202002L.
Also, the related defect reports DR1496 and
DR1734 are not yet implemented. Accordingly, deleted
special member functions are treated as eligible even though they shouldn’t be.

P1616R1
Clang 10

P1452R2
P1972R0
Clang 10

P1980R0
P2103R0
P2493R0
P2092R0
Clang 16

P2113R0
Clang 16

Range-based for statements with initializer
P0614R1
Clang 8

ADL and function templates that are not visible
P0846R0
Clang 9

const mismatch with defaulted copy constructor
P0641R2
Clang 8

Consistent comparison (operator<=>)
P0515R3
Clang 10

P0905R1
P1120R0
P1185R2
P1186R3
P1630R1
P1946R0
P1959R0
P2002R1
Partial

P2085R0
Clang 14

Access checking on specializations
P0692R1
Clang 14

Default constructible and assignable stateless lambdas
P0624R2
Clang 8

Lambdas in unevaluated contexts
P0315R4

Partial
temp.deduct/9 is not implemented yet.

[[no_unique_address]] attribute
P0840R2
Clang 9

[[likely]] and [[unlikely]] attributes
P0479R5
Clang 12

typename optional in more contexts
P0634R3
Clang 16

Pack expansion in lambda init-capture
P0780R2
Clang 9

Class types as non-type template parameters
P0732R2
Partial

P1907R1

Destroying operator delete
P0722R3
Clang 6

Relaxations of constexpr restrictions
P1064R0
Clang 9

P1002R1
Clang 8

P1327R1
Clang 9

P1330R0
P1331R2
Clang 10

P1668R1
P0784R7

Prohibit aggregates with user-declared constructors
P1008R1
Clang 8

Feature test macros
P0941R2
(see below)
explicit(bool)
P0892R2
Clang 9

Signed integers are two’s complement
P1236R1
Clang 9

char8_t
P0482R6
Clang 7 (11)

Immediate functions (consteval)
P1073R3
Clang 15

P1937R2
Clang 14

std::is_constant_evaluated
P0595R2
Clang 9

Nested inline namespaces
P1094R2
Clang 8

Structured binding extensions
P1091R3
Clang 16

P1381R1

Stronger Unicode requirements
P1041R4
Yes

P1139R2

Parenthesized initialization of aggregates
P0960R3
No

P1975R0

Modules
P1103R3
Clang 15

P1766R1 (DR)
Clang 11

P1811R0
No

P1703R1
Subsumed by P1857

P1874R1
Clang 15

P1979R0
No

P1779R3
Clang 15

P1857R3
No

P2115R0
Partial

P1815R2
Partial

Coroutines
P0912R5

Partial
The optimizer does not yet handle TLS with
__attribute__((const)) attribute correctly. There can be issues where the
coroutine may resume on a different thread.
This feature requires further
analysis of the C++ Standard to determine what work is necessary for conformance.

Deprecate a[b,c]
P1161R3
Clang 9

Deprecate some problematic uses of volatile
P1152R4
Clang 10

[[nodiscard("with reason")]]
P1301R4
Clang 9

using enum
P1099R5
Clang 13

Class template argument deduction for aggregates
P1816R0
No

P2082R1

Class template argument deduction for alias templates
P1814R0
No

Permit conversions to arrays of unknown bound
P0388R4
Clang 14

constinit
P1143R2
Clang 10

Pseudo-destructors end object lifetimes
P0593R6 (DR)
Clang 11

More implicit moves
P1825R0 (DR)
Clang 13

(11): Prior to Clang 8, this feature is not enabled by
-std=c++20, but can be enabled with -fchar8_t.

C++2b implementation status

Clang has support for some of the features of the C++ standard following
C++20, informally referred to as C++2b.

You can use Clang in C++2b mode with the -std=c++2b option.

List of features and minimum Clang version with support

Language Feature
C++2b Proposal
Available in Clang?

Literal suffix uz, z for size_t, ssize_t
P0330R8
Clang 13

Make () in lambdas optional in all cases
P1102R2
Clang 13

Simpler implicit move
P2266R1
Clang 13

if consteval
P1938R3
Clang 14

Allow duplicate attributes
P2156R1
Clang 13

Narrowing contextual conversions to bool
P1401R5
Clang 14

Trimming whitespaces before line splicing
P2223R2
Yes

Make declaration order layout mandated
P1874R4
Yes

C++ identifier syntax using UAX 31
P1949R7
Clang 14

Mixed string literal concatenation
P2201R1
Yes

Deducing this
P0847R7
No

Change scope of lambda trailing-return-type
P2036R3
No

P2579R0

Multidimensional subscript operator
P2128R6
Clang 15

Non-literal variables (and labels and gotos) in constexpr functions
P2242R3
Clang 15

Character encoding of diagnostic text
P2246R1
Yes

Character sets and encodings
P2314R4
Yes

Consistent character literal encoding
P2316R2
Yes

Add support for preprocessing directives elifdef and elifndef
P2334R1
Clang 13

Extend init-statement to allow alias-declaration
P2360R0
Clang 14

auto(x): decay-copy in the language
P0849R8
Clang 15

Attributes on Lambda-Expressions
P2173R1
Clang 13

constexpr for <cmath> and <cstdlib>
P0533R9
No

Type trait to determine if a reference binds to a temporary
P2255R2

Partial
Clang provides a __reference_binds_to_temporary type trait
builtin, with which the library facility can be partially implemented.
Both __reference_constructs_from_temporary and
__reference_converts_from_temporary builtins should be
provided, following the normal cross-vendor convention to implement
traits requiring compiler support directly.

The Equality Operator You Are Looking For
P2468R2
Clang 16

De-deprecating volatile compound operations
P2327R1
Clang 15

Support for #warning
P2437R1
Yes

Remove non-encodable wide character literals and multicharacter wide character literals
P2362R3
Clang 14

Labels at the end of compound statements
P2324R2
Clang 16

Delimited escape sequences
P2290R3
Clang 15

Named universal character escapes
P2071R2
Clang 15

Relaxing some constexpr restrictions
P2448R2
No

Using unknown pointers and references in constant expressions
P2280R4
No

static operator()
P1169R4
Clang 16

Extended floating-point types and standard names
P1467R9
No

Class template argument deduction from inherited constructors
P2582R1
No

Portable assumptions
P1774R8
No

Support for UTF-8 as a portable source file encoding
P2295R6
Clang 15

char8_t Compatibility and Portability Fix
P2513R3
Clang 16

Relax requirements on wchar_t to match existing practices
P2460R2
Yes

Explicit lifetime management
P2590R2
No

Defect reports

Clang generally aims to implement resolutions to Defect Reports (bug fixes
against prior standards) retroactively, in all prior standard versions where
the fix is meaningful. Significant Defect Report changes to language features
after the publication of the relevant standard are marked (DR) in the above
table.

Clang also has a test suite for conformance to resolutions for issues on the
C++ core issues list,
most of which are considered Defect Reports.
Implementation status for C++ core issues based on
that test suite is tracked on a separate page.

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++.

List of features and minimum Clang version with support

Document
Latest draft
Compiler flag
Available in Clang?

SD-6: SG10 feature test recommendations
SD-6
N/A

Clang 3.4 (N3745)

Clang 3.6 (N4200)

Clang 4 (P0096R3)

Clang 5 (P0096R4)

Clang 7 (P0096R5)

Clang 9 (P1353R0)

Clang 10 (P1902R1)

[TS] Concepts
P0121R0

Superseded by P0734R0

[TS] Coroutines
N4663
-fcoroutines-ts
-stdlib=libc++

Clang 5

-std=c++20
-stdlib=libc++

Superseded by P0912R5

[TS] Library Fundamentals, Version 1 (invocation type traits)
N4480
N/A
No

[TS] Library Fundamentals, Version 2 (source_location)
N4617
N/A
Clang 9 (documentation)

[TS] Modules
N4720
-fmodules-ts
Superseded by P1103R3

[DRAFT TS] Reflection
N4818

No

[TS] Transactional Memory
N4514

No