C++ Support in Clang
Last updated: $Date$
Clang C++ Status
Clang currently implements nearly all of the ISO C++ 1998 standard (including the defects addressed in the ISO C++ 2003 standard). However, the implementation of Clang C++ is still quite immature, with many remaining bugs that are likely to cause compiler crashes, erroneous errors and warnings, and miscompiled code. 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 some language C++ projects, or large pieces of such projects. The following table describes various projects that we have attempted to compile with Clang along with the results of that attempt.
At this point in time, each new C++ project typically uncovers new bugs. We keep track of these in the LLVM bug tracker via tracking bugs, which are used to relate all of the bugs known to affect that particular project. Introducing a new project in this list typically requires a liason familiar with LLVM or Clang development, who is able to provide detailed bug reports and track progress for the particular project.
Project | Status | Last Tested | Tracking Bug |
---|---|---|---|
Clang and LLVM | Successful self-hosting achieved | Continually | |
CMake | Compiles, passes regression tests (debug build) | February 9, 2010 | |
Qt | Partially compiles; miscompilation of uic prevents complete compilation, qmake works, some small examples also. | February 9, 2010 | PR5881 |
Boost | Some libraries (e.g., Boost.MPL) successfully build and pass regression tests, the majority still fail. | February 5, 2010 | PR6023 |
Implementation Status by Section
The following table is used to help track our implementation progress toward implementing the complete C++03 standard. We use a simple, somewhat arbitrary color-coding scheme to describe the relative completeness of features by section:
Not started/not evaluated | Not Applicable | Broken | Some examples work | Many examples work | Nearly everything works | Complete | Complete (with tests for each paragraph) |
---|---|---|---|---|---|---|---|
N/A | ✓ |
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++ standard. Note that many C++ features are actually described in several different sections within the 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! Since Clang already supports much of C, and therefore much C++, many of the currently-white cells could be filled in. If you wish to do so, please compare Clang's implementation against the C++ standard and provide a patch that updates the table accordingly. Tests for the various features are also welcome!
Section | Parse | AST | Sema | CodeGen | Notes |
---|---|---|---|---|---|
2 [lex] | N/A | N/A | N/A | ||
2.1 [lex.phases] | N/A | N/A | N/A | Extended characters aren't handled. | |
2.2 [lex.charset] | N/A | N/A | N/A | No support for extended characters. | |
2.3 [lex.trigraph] | N/A | N/A | N/A | ||
2.4 [lex.pptoken] | N/A | N/A | N/A | ||
2.5 [lex.digraph] | N/A | N/A | N/A | ||
2.6 [lex.token] | N/A | N/A | N/A | ||
2.7 [lex.comment] | N/A | N/A | NDR "form feed or vtab in comment" is not diagnosed. | ||
2.8 [lex.header] | N/A | N/A | N/A | ||
2.9 [lex.ppnumber] | N/A | N/A | N/A | ||
2.10 [lex.name] | N/A | N/A | N/A | No support for extended characters | |
2.11 [lex.key] | N/A | N/A | N/A | ||
2.12 [lex.operators] | N/A | N/A | N/A | ||
2.13 [lex.literal] | N/A | N/A | N/A | ||
2.13.1 [lex.icon] | N/A | N/A | N/A | ||
2.13.2 [lex.ccon] | N/A | N/A | N/A | Poor support for extended characters | |
2.13.3 [lex.fcon] | N/A | N/A | N/A | ||
2.13.4 [lex.string] | N/A | N/A | N/A | Poor support for extended characters | |
2.13.5 [lex.bool] | N/A | N/A | N/A | ||
3 [basic] | N/A | N/A | N/A | N/A | |
3.1 [basic.def] | N/A | ||||
3.2 [basic.def.odr] | |||||
3.3 [basic.scope] | N/A | N/A | N/A | ||
3.3.1 [basic.scope.pdecl] | N/A | N/A | N/A | ||
3.3.2 [basic.scope.local] | N/A | N/A | N/A | ||
3.3.3 [basic.scope.proto] | N/A | N/A | N/A | ||
3.3.4 [basic.funscope] | N/A | N/A | N/A | ||
3.3.5 [basic.scope.namespace] | N/A | N/A | N/A | ||
3.3.6 [basic.scope.class] | N/A | N/A | N/A | Does not check that reordering the members of a class maintains semantics. | |
3.3.7 [basic.scope.hiding] | N/A | N/A | N/A | ||
3.4 [basic.lookup] | N/A | N/A | N/A | ||
3.4.1 [basic.lookup.unqual] | N/A | N/A | N/A | ||
3.4.2 [basic.lookup.argdep] | N/A | N/A | N/A | ||
3.4.3 [basic.lookup.qual] | N/A | N/A | N/A | ||
3.4.3.1 [class.qual] | N/A | N/A | N/A | ||
3.4.3.2 [namespace.qual] | N/A | N/A | N/A | ||
3.4.4 [basic.lookup.elab] | |||||
3.4.5 [basic.lookup.classref] | N/A | N/A | N/A | Missing ambiguity/consistency checks for paragraphs 3 (~type-name) and 7 (conversion-type-id) | |
3.4.6 [basic.lookup.udir] | N/A | N/A | N/A | ||
3.5 [basic.link] | |||||
3.6 [basic.start] | |||||
3.6.1 [basic.start.main] | |||||
3.6.2 [basic.start.init] | |||||
3.6.3 [basic.start.term] | |||||
3.7 [basic.stc] | |||||
3.7.1 [basic.stc.static] | |||||
3.7.2 [basic.stc.auto] | |||||
3.7.3 [basic.stc.dynamic] | |||||
3.7.3.1 [basic.stc.dynamic.allocation] | |||||
3.7.3.2 [basic.stc.dynamic.deallocation] | |||||
3.7.4 [basic.stc.inherit] | |||||
3.8 [basic.life] | |||||
3.9 [basic.types] | |||||
3.9.1 [basic.fundamental] | |||||
3.9.2 [basic.compound] | |||||
3.9.3 [basic.type.qualifier] | |||||
3.10 [basic.lval] | |||||
4 [conv] | |||||
4.1 [conv.lval] | |||||
4.2 [conv.array] | |||||
4.3 [conv.func] | |||||
4.4 [conv.qual] | |||||
4.5 [conv.prom] | |||||
4.6 [conv.fpprom] | |||||
4.7 [conv.integral] | |||||
4.8 [conv.double] | |||||
4.9 [conv.fpint] | |||||
4.10 [conv.ptr] | |||||
4.11 [conv.mem] | |||||
4.12 [conv.bool] | |||||
5 [expr] | N/A | N/A | ✓ | N/A | |
5.1 [expr.prim] | |||||
5.2 [expr.post] | |||||
5.2.1 [expr.sub] | |||||
5.2.2 [expr.call] | |||||
5.2.3 [expr.type.conv] | |||||
5.2.4 [expr.pseudo] | |||||
5.2.5 [expr.ref] | |||||
5.2.6 [expr.post.incr] | |||||
5.2.7 [expr.dynamic.cast] | |||||
5.2.8 [expr.typeid] | |||||
5.2.9 [expr.static.cast] | |||||
5.2.10 [expr.reinterpret.cast] | |||||
5.2.11 [expr.const.cast] | |||||
5.3 [expr.unary] | |||||
5.3.1 [expr.unary.op] | |||||
5.3.1p1 Unary * | |||||
5.3.1p2-5 Unary & | |||||
5.3.1p6 Unary + | |||||
5.3.1p7 Unary - | |||||
5.3.1p8 Unary ! | |||||
5.3.1p9 Unary ~ | |||||
5.3.2 [expr.pre.incr] | |||||
5.3.3 [expr.sizeof] | |||||
5.3.4 [expr.new] | operator delete is not looked up, initialization not quite correct | ||||
5.3.5 [expr.delete] | |||||
5.4 [expr.cast] | |||||
5.5 [expr.mptr.oper] | Dereferenced member function pointers have the wrong type(see FIXME in CheckPointerToMemberOperands). | ||||
5.6 [expr.mul] | |||||
5.7 [expr.add] | |||||
5.8 [expr.shift] | |||||
5.9 [expr.rel] | |||||
5.10 [expr.eq] | |||||
5.11 [expr.bit.and] | |||||
5.12 [expr.xor] | |||||
5.13 [expr.or] | |||||
5.14 [expr.log.and] | |||||
5.15 [expr.log.or] | |||||
5.16 [expr.cond] | some invalid hierarchy casts still accepted, but that's a general problem | ||||
5.17 [expr.ass] | |||||
5.18 [expr.comma] | |||||
5.19 [expr.const] | Uses C semantics | ||||
6 [stmt.stmt] | |||||
6.1 [stmt.label] | |||||
6.2 [stmt.expr] | |||||
6.3 [stmt.block] | |||||
6.4 [stmt.select] | Conversion of declarations to required types not really supported. | ||||
6.4.1 [stmt.if] | |||||
6.4.2 [stmt.switch] | |||||
6.5 [stmt.iter] | Conversion of declarations to required types not really supported. | ||||
6.5.1 [stmt.while] | |||||
6.5.2 [stmt.do] | |||||
6.5.3 [stmt.for] | |||||
6.6 [stmt.jump] | |||||
6.6.1 [stmt.break] | |||||
6.6.2 [stmt.cont] | |||||
6.6.3 [stmt.return] | |||||
6.6.4 [stmt.goto] | |||||
6.7 [stmt.dcl] | Existence and accessibility of destructors is not tested for. | ||||
6.8 [stmt.ambig] | |||||
7 [dcl.dcl] | |||||
7.1 [dcl.spec] | |||||
7.1.1 [dcl.stc] | Linkage merging has some errors. | ||||
7.1.2 [dcl.fct.spec] | |||||
7.1.3 [dcl.typedef] | |||||
7.1.4 [dcl.friend] | |||||
7.1.5 [dcl.type] | |||||
7.1.5.1 [dcl.type.cv] | |||||
7.1.5.2 [dcl.type.simple] | |||||
7.1.5.3 [dcl.type.elab] | |||||
7.2 [dcl.enum] | |||||
7.3 [basic.namespace] | |||||
7.3.1 [namespace.def] | |||||
7.3.1.1 [namespace.unnamed] | |||||
7.3.1.2 [namespace.memdef] | |||||
7.3.2 [namespace.alias] | N/A | ||||
7.3.3 [namespace.udecl] | N/A | ||||
7.3.4[namespace.udir] | Example in p4 fails. | ||||
7.4 [dcl.asm] | |||||
7.5 [dcl.link] | |||||
8 [dcl.decl] | |||||
8.1 [dcl.name] | N/A | ||||
8.2 [dcl.ambig.res] | ✓ | N/A | ✓ | N/A | |
8.3 [dcl.meaning] | N/A | ||||
8.3.1 [dcl.ptr] | N/A | ||||
8.3.2 [dcl.ref] | N/A | ||||
8.3.3 [dcl.mptr] | N/A | ||||
8.3.4 [dcl.array] | N/A | ||||
8.3.5 [dcl.fct] | N/A | ||||
8.3.6 [dcl.fct.default] | N/A | Partial support for default arguments of templates. | |||
8.4 [dcl.fct.def] | |||||
8.5 [dcl.init] | |||||
8.5.1[dcl.init.aggr] | No CodeGen for dynamic initialization. | ||||
8.5.2[dcl.init.string] | |||||
8.5.3 [dcl.init.ref] | |||||
9 [class] | |||||
9.1 [class.name] | N/A | ||||
9.2 [class.mem] | |||||
9.3 [class.mfct] | |||||
9.3.1 [class.mfct.non-static] | |||||
9.3.2 [class.this] | |||||
9.4 [class.static] | |||||
9.4.1 [class.static.mfct] | |||||
9.4.2 [class.static.data] | |||||
9.5 [class.union] | |||||
9.6 [class.bit] | |||||
9.7 [class.nest] | N/A | ||||
9.8 [class.local] | ✓ | ✓ | ✓ | N/A | |
9.9 [class.nested.type] | ✓ | ✓ | ✓ | N/A | |
10 [class.derived] | |||||
10.1 [class.mi] | |||||
10.2 [class.member.lookup] | N/A | ||||
10.3 [class.virtual] | |||||
10.4 [class.abstract] | N/A | ||||
11 [class.access] | N/A | ||||
11.1 [class.access.spec] | N/A | ||||
11.2 [class.access.base] | N/A | ||||
11.3 [class.access.dcl] | N/A | ||||
11.4 [class.friend] | N/A | ||||
11.5 [class.protected] | N/A | ||||
11.6 [class.access.virt] | N/A | ||||
11.7 [class.paths] | N/A | ||||
11.8 [class.access.nest] | N/A | ||||
12 [special] | |||||
12.1 [class.ctor] | |||||
12.2 [class.temporary] | N/A | ||||
12.3 [class.conv] | |||||
12.3.1 [class.conv.ctor] | |||||
12.3.2 [class.conv.fct] | |||||
12.4 [class.dtor] | |||||
12.5 [class.free] | |||||
12.6 [class.init] | |||||
12.6.1 [class.expl.init] | |||||
12.6.2 [class.base.init] | Most of the semantics of base initializations are implemented. | ||||
12.7 [class.cdtor] | |||||
12.8 [class.copy] | Most of the semantics of copy constructors are implemented. | ||||
13 [over] | |||||
13.1 [over.load] | N/A | ||||
13.2 [over.dcl] | N/A | N/A | |||
13.3 [over.match] | N/A | N/A | |||
13.3.1 [over.match.funcs] | N/A | N/A | |||
13.3.1.1 [over.match.call] | N/A | N/A | |||
13.3.1.1.1 [over.call.func] | N/A | N/A | |||
13.3.1.1.2 [over.call.object] | N/A | N/A | |||
13.3.1.2 [over.match.oper] | N/A | N/A | |||
13.3.1.3 [over.match.ctor] | N/A | N/A | |||
13.3.1.4 [over.match.copy] | N/A | N/A | |||
13.3.1.5 [over.match.conv] | N/A | N/A | |||
13.3.1.6 [over.match.ref] | N/A | N/A | |||
13.3.2 [over.match.viable] | N/A | N/A | |||
13.3.3 [over.match.best] | N/A | N/A | |||
13.3.3.1 [over.best.ics] | N/A | N/A | |||
13.3.3.1.1 [over.ics.scs] | N/A | N/A | |||
13.3.3.1.2 [over.ics.user] | N/A | N/A | |||
13.3.3.1.3 [over.ics.ellipsis] | N/A | N/A | |||
13.3.3.1.4 [over.ics.ref] | N/A | N/A | |||
13.3.3.2 [over.ics.rank] | N/A | N/A | |||
13.4 [over.over] | N/A | N/A | |||
13.5 [over.oper] | N/A | ||||
13.5.1 [over.unary] | N/A | N/A | |||
13.5.2 [over.binary] | N/A | N/A | |||
13.5.3 [over.ass] | N/A | N/A | |||
13.5.4 [over.call] | N/A | N/A | |||
13.5.5 [over.sub] | N/A | N/A | |||
13.5.6 [over.ref] | N/A | N/A | |||
13.5.7 [over.inc] | N/A | N/A | |||
13.6 [over.built] | N/A | N/A | Missing support for the ternary operator (p24, p25). | ||
14 [temp] | |||||
14.1 [temp.param] | ✓ | ✓ | N/A | ||
14.2 [temp.names] | N/A | ||||
14.3 [temp.arg] | N/A | ||||
14.3.1 [temp.arg.type] | ✓ | ✓ | N/A | Paragraph 3 will be tested elsewhere | |
14.3.2 [temp.arg.nontype] | N/A | ||||
14.3.3 [temp.arg.template] | N/A | ||||
14.4 [temp.type] | N/A | ✓ | ✓ | N/A | |
14.5 [temp.decls] | |||||
14.5.1 [temp.class] | |||||
14.5.1.1 [temp.mem.func] | |||||
14.5.1.2 [temp.mem.class] | |||||
14.5.1.3 [temp.static] | |||||
14.5.2 [temp.mem] | |||||
14.5.3 [temp.friend] | N/A | ||||
14.5.4 [temp.class.spec] | N/A | ||||
14.5.4.1 [temp.class.spec.match] | N/A | N/A | N/A | ||
14.5.4.2 [temp.class.order] | N/A | ||||
14.5.5.3 [temp.class.spec.mfunc] | N/A | ||||
14.5.5 [temp.fct] | |||||
14.5.5.1 [temp.over.link] | N/A | ||||
14.5.5.2 [temp.func.order] | N/A | ||||
14.6 [temp.res] | |||||
14.6.1 [temp.local] | |||||
14.6.2 [temp.dep] | N/A | ||||
14.6.2.1 [temp.dep.type] | N/A | ||||
14.6.2.2 [temp.dep.expr] | N/A | ||||
14.6.2.3 [temp.dep.constexpr] | N/A | ||||
14.6.2.4 [temp.dep.temp] | N/A | ||||
14.6.3 [temp.nondep] | N/A | ||||
14.6.4 [temp.dep.res] | N/A | ||||
14.6.4.1 [temp.point] | N/A | ||||
14.6.4.2 [temp.dep.candidate] | N/A | Not restricted to functions with external linkage | |||
14.6.5 [temp.inject] | N/A | ||||
14.7 [temp.spec] | |||||
14.7.1 [temp.inst] | N/A | ||||
14.7.2 [temp.explicit] | Cannot test paragraph 11 until access control is implemented. ASTs do not carry enough information to reproduce source code accurately. |
||||
14.7.3 [temp.expl.spec] | ✓ | ✓ | ASTs do not carry enough information to reproduce source code accurately | ||
14.8 [temp.fct.spec] | |||||
14.8.1 [temp.arg.explicit] | |||||
14.8.2 [temp.deduct] | N/A | N/A | N/A | ||
14.8.2.1 [temp.deduct.call] | |||||
14.8.2.2 [temp.deduct.funcaddr] | N/A | N/A | |||
14.8.2.3 [temp.deduct.conv] | |||||
14.8.2.4 [temp.deduct.type] | N/A | N/A | |||
14.8.3 [temp.over] | |||||
15 [except] | |||||
15.1 [except.throw] | N/A | N/A | |||
15.2 [except.ctor] | N/A | N/A | N/A | ||
15.3 [except.handle] | N/A | N/A | Not all constraints are checked | ||
15.4 [except.spec] | |||||
15.5 [except.special] | N/A | N/A | N/A | N/A | |
15.5.1 [except.terminate] | N/A | N/A | N/A | N/A | |
15.5.2 [except.unexpected] | N/A | N/A | N/A | N/A | |
15.5.3 [except.uncaught] | N/A | N/A | N/A | N/A | |
15.6 [except.access] | N/A | N/A | N/A | N/A | Redundant - struck from C++0x |
16 [cpp] | |||||
16.1 [cpp.cond] | |||||
16.2 [cpp.include] | |||||
16.3 [cpp.replace] | |||||
16.3.1 [cpp.subst] | |||||
16.3.2 [cpp.stringize] | |||||
16.3.3 [cpp.concat] | |||||
16.3.4 [cpp.rescan] | |||||
16.3.5 [cpp.scope] | |||||
16.4 [cpp.line] | |||||
16.5 [cpp.error] | |||||
16.6 [cpp.pragma] | |||||
16.7 [cpp.null] | |||||
16.8 [cpp.predefined] | |||||
A [gram] | |||||
A.1 [gram.key] | |||||
A.2 [gram.lex] | |||||
A.3 [gram.basic] | |||||
A.4 [gram.expr] | |||||
A.5 [gram.stmt] | |||||
A.6 [gram.dcl] | |||||
A.7 [gram.decl] | |||||
A.8 [gram.class] | |||||
A.9 [gram.derived] | |||||
A.10 [gram.special] | |||||
A.11 [gram.over] | |||||
A.12 [gram.temp] | |||||
A.13 [gram.except] | |||||
A.14 [gram.cpp] | |||||
B [implimits] | |||||
C [diff] | |||||
C.1 [diff.iso] | |||||
C.1.1 [diff.lex] | |||||
C.1.2 [diff.basic] | |||||
C.1.3 [diff.expr] | |||||
C.1.4 [diff.stat] | |||||
C.1.5 [diff.dcl] | |||||
C.1.6 [diff.decl] | |||||
C.1.7 [diff.class] | |||||
C.1.8 [diff.special] | |||||
C.1.9 [diff.cpp] | |||||
C.2 [diff.library] | |||||
C.2.1 [diff.mods.to.headers] | |||||
C.2.2 [diff.mods.to.definitions] | |||||
C.2.2.2 [diff.wchar.t] | |||||
C.2.2.3 [diff.header.iso646.h] | |||||
C.2.2.4 [diff.null] | |||||
C.2.3 [diff.mods.to.declarations] | |||||
C.2.4 [diff.mods.to.behavior] | |||||
C.2.4.1 [diff.offsetof] | |||||
C.2.4.2 [diff.malloc] | |||||
D [depr] | |||||
D.1 [depr.incr.bool] | |||||
D.2 [depr.static] | |||||
D.3 [depr.access.dcl] | |||||
D.4 [depr.string] | |||||
D.5 [depr.c.headers] | |||||
E [extendid] | |||||
C++0x Implementation status
Clang's development effort is focused primarily on supporting the current ISO C++ standard (1998/2003). This section tracks the status of various C++0x features. In general, the implementations of these features are far less developed than C++98/03 features.
C++0x Features | |||||
Explicit conversion operators (N2437) | No name mangling; ASTs don't contain calls to conversion operators | ||||
Static assertions (N1720) | N/A | ||||
Deleted functions (N2346) | N/A | ||||
Rvalue references (N2118 + N2831) | |||||
nullptr (N2431) | |||||
Right angle brackets (N1757) | N/A | N/A | N/A | ||
Decltype (N2343) | ✓ | ✓ | ✓ | N/A |