Clang - C Programming Language Status

# C Support in Clang

Clang implements the following published and upcoming ISO C standards:

Language Standard | Flag | Available in Clang?
--- | --- | ---
C89 | `-std=c89` | Yes
C99 | `-std=c99` | Almost certainly
C11 | `-std=c11` | Probably
C17 | `-std=c17` | Maybe?
C23 | `-std=c23` | Partial

The implementation status for C99, C11, C17, and C23 are currently under investigation. Any proposal whose status in Clang is currently unknown will be marked in magenta.

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.

The LLVM bug tracker uses the "c", "c99", "c11", "c17", and "c23" labels to track known bugs with Clang's language conformance.

## C89 implementation status

Clang implements all of the ISO 9899:1990 (C89) standard.

You can use Clang in C89 mode with the `-std=c89` or `-std=c90` options.

## C99 implementation status

Clang implements a significant portion of the ISO 9899:1999 (C99) standard, but the status of individual proposals is still under investigation.

Note, the list of C99 features comes from the C99 committee draft. Not all C99 documents are publicly available, so the documents referenced in this section may be inaccurate, unknown, or not linked.

You can use Clang in C99 mode with the `-std=c99` option.

List of features and minimum Clang version with support

Language Feature | C99 Proposal | Available in Clang?
--- | --- | ---
restricted character set support via digraphs and <iso646.h> | Unknown | Unknown
more precise aliasing rules via effective type | Unknown | Unknown
restricted pointers | N448 | Unknown
variable length arrays | N683 | Yes
flexible array members | Unknown | Yes
static and type qualifiers in parameter array declarators | Unknown | Yes
more precise aliasing rules via effective type | Unknown | Unknown
complex and imaginary support in <complex.h>
N620 | Unknown
N638 | Unknown
N657 | Unknown
N694 | Unknown
N809 | Unknown
type-generic math macros in <tgmath.h> | N693 | Yes
the long long int type | N601 | Yes
increase minimum translation limits | N590 | Unknown
additional floating-point characteristics in <float.h> | Unknown | Unknown
remove implicit int
N635 | Yes
N692 | Yes
N722 | Yes
reliable integer division | N617 | Yes
universal character names (\u and \U) | Unknown | Yes
extended identifiers | N717 | Unknown
hexadecimal floating-point constants | N308 | Yes
compound literals | N716 | Yes
designated initializers | N494 | Yes
// comments | N644 | Yes
extended integer types and library functions in <inttypes.h> and <stdint.h> | Unknown | Yes
remove implicit function declaration | N636 | Yes
preprocessor arithmetic done in intmax_t/uintmax_t | N736 | Yes
mixed declarations and code | N740 | Yes
new block scopes for selection and iteration statements | Unknown | Unknown
integer constant type rules | N629 | Yes
integer promotion rules | N725 | Yes
macros with a variable number of arguments | N707 | Yes
IEC 60559 support | Unknown | Unknown
trailing comma allowed in enum declaration | Unknown | Yes
inline functions | N741 | Yes
boolean type in <stdbool.h> | N815 | Yes
idempotent type qualifiers | N505 | Yes
empty macro arguments | N570 | Unknown
new structure type compatibility (tag compatibility) | N522 | Unknown
additional predefined macro names | Unknown | Unknown
_Pragma preprocessing operator | N634 | Yes
standard pragmas
N631 | Unknown
N696 | Unknown
__func__ predefined identifier | N611 | Yes
va_copy macro | N671 | Yes
LIA compatibility annex | N792 | No
remove deprecation of aliased array parameters | Unknown | Unknown
conversion of array to pointer not limited to lvalues | Unknown | Unknown
relaxed constraints on aggregate and union initialization | Unknown | Unknown
relaxed restrictions on portable header names | N772 | Unknown
return without an expression not permitted in function that returns a value | Unknown | Yes

## C11 implementation status

Clang implements a significant portion of the ISO 9899:2011 (C11) standard, but the status of individual proposals is still under investigation.

You can use Clang in C11 mode with the `-std=c11` option (use `-std=c1x` in Clang 3.0 and earlier).

List of features and minimum Clang version with support

Language Feature | C11 Proposal | Available in Clang?
--- | --- | ---
A finer-grained specification for sequencing | N1252 | Unknown
Clarification of expressions | N1282 | Unknown
Extending the lifetime of temporary objects (factored approach) | N1285 | Unknown
Requiring signed char to have no padding bits | N1310 | Unknown
Initializing static or external variables | N1311 | Yes
Conversion between pointers and floating types | N1316 | Yes
Adding TR 19769 to the C Standard Library | N1326 | Clang 3.3
Static assertions | N1330 | Yes
Parallel memory sequencing model proposal | N1349 | Unknown
Analyzability (#1, #4 - conditionally normative) | N1350 | Unknown
FLT_EVAL_METHOD issues (first change only) | N1353 | Unknown
_Bool bit-fields | N1356 | Yes
Technical corrigendum for C1X | N1359 | Unknown
Benign typedef redefinition | N1360 | Clang 3.1
Thread-local storage | N1364 | Clang 3.3
Constant expressions | N1365 | Unknown
Contractions and expression evaluation methods | N1367 | Unknown
FLT_EVAL_METHOD and return | N1382 | Unknown
Floating-point to int/_Bool conversions | N1391 | Yes
Analyzability (along the lines) | N1394 | Unknown
Wide function returns (alternate proposal) | N1396 | Unknown
Alignment
N1397 | Clang 3.2
N1447 | Clang 3.2
Anonymous member-structures and unions (modulo "name lookup") | N1406 | Yes
Completeness of types | N1439 | Yes
Generic macro facility | N1441 | Yes
Dependency ordering for C memory model | N1444 | Unknown
Subsetting the standard | N1460 | Yes
Assumed types in F.9.2 | N1468 | Unknown
Supporting the 'noreturn' property in C1x | N1478 | Clang 3.3
Updates to C++ memory model based on formalization | N1480 | Unknown
Explicit initializers for atomics | N1482 | Unknown
Atomics proposal (minus ternary op) | N1485 | Yes
UTF-8 string literals | N1488 | Clang 3.3
Optimizing away infinite loops | N1509 | Yes
Conditional normative status for Annex G | N1514 | Unknown
Creation of complex value | N1464 | Unknown
Recommendations for extended identifier characters for C and C++ | N1518 | Unknown
Atomic C1x/C++0x compatibility refinements (1st part only) | N1526 | Yes
Atomic bitfields implementation defined | N1530 | Yes
Small fix for the effect of alignment on struct/union type compatibility | N1532 | Yes
Synthesis re _Atomic | N1537 | Unknown
Clarification for wide evaluation | N1531 | Unknown

## C17 implementation status

There are no major changes in this edition, only technical corrections and clarifications that are tracked by Defect Report.

You can use Clang in C17 mode with the `-std=c17` or `-std=c18` options (available in Clang 6 and later).

## C23 implementation status

Clang has support for some of the features of the C standard following C17, informally referred to as C23.

You can use Clang in C23 mode with the `-std=c23` option (available in Clang 18 and later) or with the `-std=c2x` option (available in Clang 9 and later).

List of features and minimum Clang version with support

Language Feature | C23 Proposal | Available in Clang?
--- | --- | ---
Evaluation formats | N2186 | Unknown
Clarifying the restrict Keyword v2 | N2660 | Unknown
Harmonizing static_assert with C++ | N2665 | Clang 9
nodiscard attribute | N2267 | Clang 9
maybe_unused attribute | N2270 | Clang 9
TS 18661 Integration
N2314 | Unknown
N2341 | Unknown
N2401 | Unknown
N2359 | No
N2546 | Unknown
N2580 | Unknown
N2640 | Unknown
N2755 | Unknown
Preprocessor line numbers unspecified | N2322 | Partial The line number associated with a macro invocation is not the line number of the first character of the macro name in the invocation. Additionally, Clang may not associate the line number of a pp-directive with the first `#` token. As these are recommended practices and not normative requirements, Clang's behavior is still conforming.
deprecated attribute | N2334 | Clang 9
Attributes
N2335 | Clang 9
N2554 | Clang 9
Defining new types in offsetof | N2350 | Yes
fallthrough attribute | N2408 | Clang 9
Two's complement sign representation | N2412 | Clang 14
Adding the u8 character prefix | N2418 | Clang 15
Remove support for function definitions with identifier lists | N2432 | Clang 15
*_IS_IEC_60559 feature test macros | N2379 | Unknown
Floating-point negation and conversion | N2416 | Unknown
Annex F.8 update for implementation extensions and rounding | N2384 | Unknown
_Bool definitions for true and false | N2393 | Subsumed by N2935
[[nodiscard("should have a reason")]] | N2448 | Clang 10
Allowing unnamed parameters in function definitions | N2480 | Clang 11
Free positioning of labels inside compound statements | N2508 | Clang 18
Clarification request for C17 example of undefined behavior | N2517 | No
Querying attribute support | N2553 | Clang 9
Binary literals | N2549 | Clang 9
Allow duplicate attributes | N2557 | Clang 13
Character encoding of diagnostic text | N2563 | Yes
What we think we reserve | N2572 | Partial
Remove mixed wide string literal concatenation | N2594 | Clang 9
Update to IEC 60559:2020 | N2600 | Unknown
Compatibility of Pointers to Arrays with Qualifiers | N2607 | Partial Much of the proposal is implemented, but Clang lacks pedantic diagnostics in C17 and earlier regarding use of incompatible pointer types as an extension. Further, Clang does not properly compute the correct result type for the `?:` operator when the result type should be a qualified array type.
Unclear type relationship between a format specifier and its argument | N2562 | Clang 16
String functions for freestanding implementations | N2524 | No
Digit separators | N2626 | Clang 13
Missing +(x) in table | N2641 | Yes
Add support for preprocessing directives elifdef and elifndef | N2645 | Clang 13
[[maybe_unused]] for labels | N2662 | Clang 16
Zeros compare equal | N2670 | Yes
Negative values | N2671 | Yes
5.2.4.2.2 cleanup | N2672 | Yes
Towards Integer Safety | N2683 | Clang 18
Adding Fundamental Type for N-bit Integers
N2763 | Clang 15
N2775 | Clang 15
N2969 | Clang 15
N3035 | Clang 15
#warning directive | N2686 | Yes
Sterile characters | N2686 | Yes
Numerically equal | N2716 | Yes
char16_t & char32_t string literals shall be UTF-16 & UTF-32 | N2728 | Yes
IEC 60559 binding | N2749 | Unknown
__has_include for C | N2799 | Yes
Annex F overflow and underflow | N2747 | Yes
Remove UB from Incomplete Types in Function Parameters | N2770 | Yes
Variably-modified types | N2778 | Yes
Types do not have types | N2781 | Yes
5.2.4.2.2 cleanup (N2672 update) | N2806 | Yes
Allow 16-bit ptrdiff_t | N2808 | Yes
Proposal to update CFP freestanding requirements | N2823 | Unknown
Types and sizes | N2838 | Yes
Clarifying integer terms | N2837 | Yes
Clarification for max exponent macros | N2843 | Unknown
Clarification about expression transformations | N2846 | Unknown
Contradiction about INFINITY macro | N2848 | Unknown
Require exact-width integer type interfaces | N2872 | Yes
@, $, and ‘ in the source/execution character set | N2701 | Yes
Quantum exponent of NaN (version 2) | N2754 | Unknown
The noreturn attribute | N2764 | Clang 15
*_HAS_SUBNORM==0 implies what? | N2797 | Yes
Disambiguate the storage class of some compound literals | N2819 | Unknown
Add annotations for unreachable control flow v2 | N2826 | Clang 17
Unicode Sequences More Than 21 Bits are a Constraint Violation r0 | N2828 | Clang 3.6
Identifier Syntax using Unicode Standard Annex 31 | N2836 | Clang 15
No function declarators without prototypes | N2841 | Clang 15
Remove default argument promotions for _FloatN types | N2844 | No
Revised Suggestions of Change for Numerically Equal/Equivalent | N2847 | Yes
5.2.4.2.2 Cleanup, Again Again (N2806 update) | N2879 | Yes
char8_t: A type for UTF-8 characters and strings | N2653 | No
Clarification for max exponent macros-update | N2882 | Unknown
Consistent, Warningless, and Intuitive Initialization with {}
N2900 | Clang 17
N3011 | Clang 17
Not-so-magic: typeof
N2927 | Clang 16
N2930 | Clang 16
Type annex tgmath narrowing macros with integer args v2 | N2931 | Unknown
Revise spelling of keywords v7 | N2934 | Clang 17
Make false and true first-class language features v8 | N2935 | Clang 15
Properly define blocks as part of the grammar v3 | N2937 | Yes
Annex X (replacing Annex H) for IEC 60559 interchange | N2601 | No
Indeterminate Values and Trap Representations | N2861 | Yes
Remove ATOMIC_VAR_INIT v2 | N2886 | Clang 17
Require exact-width integer type interfaces v2 | N2888 | Yes
Wording Change for Variably-Modified Types | N2992 | Yes
Identifier syntax fixes | N2939 | Clang 15
Remove trigraphs??! | N2940 | Clang 18
Improved normal enumerations | N3029 | Unknown
Relax requirements for va_start | N2975 | Clang 16
Enhanced enumerations | N3030 | Unknown
Freestanding C and IEC 60559 conformance scope reduction | N2951 | Unknown
Unsequenced functions | N2956 | No
Comma ommission and deletion (__VA_OPT__) | N3033 | Unknown
Underspecified object definitions | N3006 | No
Type inference for object declarations | N3007 | Clang 18
constexpr for object definitions | N3018 | No
Introduce storage class specifiers for compound literals | N3038 | No
Identifier primary expressions | N3034 | Yes
Introduce the nullptr constant | N3042 | Clang 17
Memory layout of unions | N2929 | Yes
Improved tag compatibility | N3037 | No
#embed | N3017 | No