C++ and C++'0x Support in Clang
Last updated: $Date$
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 from the C++'0x draft). The LLVM bug tracker contains a Clang C++ component that tracks known Clang C++ bugs.
Projects Building with Clang
Clang is now capable of compiling large C++ projects, and the following table describes various projects that we have attempted to compile with Clang++.
Project | Status | Last Tested | Tracking Bug |
---|---|---|---|
Clang and LLVM | Successful self-hosting achieved | Continually | |
CMake | Compiles, passes regression tests (debug build) | February 9, 2010 | |
Boost | Compiles and passes regression tests on Darwin/X86-64. | May 20, 2010 | |
Qt | Partially compiles; miscompilation of uic prevents complete compilation, qmake works, some small examples also. | February 9, 2010 | PR5881 |
C++0x Implementation status
Clang's development effort is focused primarily on fixing bugs in the current ISO C++ standard (1998/2003). This section tracks the status of various C++0x features.
Implementation Status by Feature
The following table is used to help track our implementation progress toward implementing the complete C++'0x standard. We use a simple, somewhat arbitrary color-coding scheme to describe the relative completeness of features:
Not started/not evaluated | Not Applicable | Broken | Some examples work | Many examples work | Nearly everything works | Complete |
---|---|---|---|---|---|---|
N/A | rXXXXXX |
In addition, boxes marked with ✓ have complete and passing tests. Similarly, boxes marked with ✗ have complete tests, some of which are failing, and a ? indicates partial tests while not making any statement about passing status.
A feature is "complete" when the appropriate Clang component (Parse, AST, Sema, CodeGen) implements the behavior described in all of the paragraphs in the relevant C++'0x draft standard. The major components are:
- Parse
- Clang is able to parse the grammar of this feature (or the grammar
described by this section), but does not necessarily do anything with the
parsed result. Use Clang's
-fsyntax-only
option to parse C++ programs. - AST
- Clang builds an abstract syntax tree (AST) for the feature, but does not
necessarily perform any type-checking. Use Clang's
-ast-print
option to print the resulting ASTs. - Sema
- Clang parses and type-checks this feature and provides a well-formed AST
annotated with types. Use Clang's
-fsyntax-only
to type-check code. - CodeGen
- Clang parses, type-checks, and generates code for this feature, allowing one to compile and execute programs.
Updates to this table are welcome! Tests for the various features are also welcome!
C++0x Features (current draft report here) | ||||||
Feature | Parse | AST | Sema | CodeGen | Standard Sections | Notes |
---|---|---|---|---|---|---|
Control Flow Modifications | ||||||
Range-based for loop | 6.5.4 | N2243 | ||||
Type System Modifications | ||||||
rvalue references | 8.3.2 | N2118, N2831 N2439 | ||||
decltype | ✓ | ✓ | N/A | 7.1.6.2 | N2343 N1478 N1978 | |
auto type deduction | 7.1.6.2, 7.1.6.4 | N1984 | ||||
nullptr | 2.14.7, 4.10, 4.11 | N2431 N1488 N2214 | ||||
enum classes | 7.2 | N1513 N2347 N2499 Includes forward declaration capability | ||||
long long | 3.9.1 | C99 N1811 | ||||
constexpr | 3.6.2, 3.9, 5.19, 7.1.5 | N1521 N2235 | ||||
char16_t/char32_t | N2249 | |||||
Unicode string literal types | 2.14.3, 2.14.5 | |||||
Raw string literal types | 2.14.5 | N2053 N2442 N2378 | ||||
user-defined literal types | 2.14.8 | N2378 | ||||
POD defintion changes | 3.9, 9 | N2294 | ||||
Unrestricted unions | 9.5 | N2544 | ||||
Tighter narrowing rules | 8.5.4 | N1890 N2215 N2640 | ||||
Class Modifications | ||||||
delegating constructors | 12.6.2 | N1986 | ||||
inheriting constructors | 12.9 | N1890 N1898 N2512 | ||||
In-declaration member initialization | N2628 | |||||
Changes to implicitly generated methods | Includes implicit generation of move operations | |||||
defaulted methods | N1717 N2326 | |||||
destructor defaults to noexcept | ||||||
sizeof on members without object instance | N2150 | |||||
virtual function safety modifications | ||||||
Explicit conversion operators | 12.3 | N2437 N2333 No name mangling; ASTs don't contain calls to conversion operators | ||||
Template Modifications | ||||||
Right angle brackets | N/A | N/A | N/A | N1757 | ||
variadic templates | 14.6.3 | N2080 N2087 N2242 N2488 N2555 | ||||
template aliases | 7.1.3, 14.6.7 | N1489 N2258 Includes non-template type aliasing | ||||
Removal of export | N/A | N/A | N/A | This was never implemented in C++03 | ||
extern templates | 14.8.2 | N1987 | ||||
Local classes as template parameters | N2402 N2657 | |||||
Exception Modifications | ||||||
Deprecation of exception specifications | 15.4 | |||||
noexcept | ✓ | ✓ | ✓ | N/A | 5.3.7, 15.4 | N3050 |
Preprocessor Modifications | ||||||
__STDC_HOSTED__ | N/A | N/A | N/A | 16.8 | C99 N1568 | |
_Pragma | N/A | N/A | N/A | 16.9 | C99 N1568 | |
Variable argument macros | N/A | N/A | N/A | 16.3 | C99 N1568 | |
Empty macro arguments | N/A | N/A | N/A | 16.3 | C99 N1568 | |
__func__ | N/A | N/A | N/A | 8.4.1 | C99 N1568 | |
__cplusplus | N/A | N/A | N/A | 16.8 | ||
Things Completely New | ||||||
Late-specified return type | 8.3.5 | N2445 | ||||
lambda expressions | 5.1.2 | N1968 N2550 N2859 | ||||
Uniform initializers | 12.6 | N2215 N2640 | ||||
Memory model | 1.7 | N2556 | ||||
Miscellania | ||||||
Standard attribute syntax | N2418 | |||||
alignment control | ||||||
Deleted functions | N/A | 8.4.3 | N2326 This also includes class methods. | |||
static_assert | N/A | 7 | N1381 N1720 | |||
Inline namespaces | ✓ | ✓ | ✓ | N/A | 7.3.1 | N2535 |
thread_local storage | 3.7.2, 7.1.1 | N2660 | ||||
Standard Library Modifications, see libc++ or libstdc++ or VC++ 2010 |