Clang 15.0.0 Release Notes

Written by theLLVM Team

Introduction

This document contains the release notes for the Clang C/C++/Objective-Cfrontend, part of the LLVM Compiler Infrastructure, release 15.0.0. Here wedescribe the status of Clang in some detail, including majorimprovements from the previous release and new feature work. For thegeneral LLVM release notes, seethe LLVMdocumentation. All LLVMreleases may be downloaded from theLLVM releases website.

For more information about Clang or LLVM, including information about thelatest release, please see theClang Web Site or theLLVM Web Site.

Note that if you are reading this file from a Git checkout or themain Clang web page, this document applies to thenext release, notthe current one. To see the release notes for a specific release, pleasesee thereleases page.

What’s New in Clang 15.0.0?

Some of the major new features and improvements to Clang are listedhere. Generic improvements to Clang as a whole or to its underlyinginfrastructure are described first, followed by language-specificsections with improvements to Clang’s support for those languages.

Major New Features

  • Clang now supports the-fzero-call-used-regs feature for x86. The purposeof this feature is to limit Return-Oriented Programming (ROP) exploits andinformation leakage. It works by zeroing out a selected class of registersbefore function return — e.g., all GPRs that are used within the function.There is an analogouszero_call_used_regs attribute to allow for finercontrol of this feature.

  • Clang now supports randomizing structure layout in C. This feature is acompile-time hardening technique, making it more difficult for an attacker toretrieve data from structures. Specify randomization with therandomize_layout attribute. The correspondingno_randomize_layoutattribute can be used to turn the feature off.

    A seed value is required to enable randomization, and is deterministic basedon a seed value. Use the-frandomize-layout-seed= or-frandomize-layout-seed-file= flags.

    Note

    Randomizing structure layout is a C-only feature.

  • Clang now supports the-fstrict-flex-arrays=<arg> option to control whicharray bounds lead to flexible array members. The option yields more accurate__builtin_object_size and__builtin_dynamic_object_size results inmost cases but may be overly conservative for some legacy code.

  • Experimental support for HLSL has been added. The implementation isincomplete and highly experimental. For more information about the ongoingwork to support HLSL see thedocumentation, or theGitHub project.

Bug Fixes

  • CXXNewExpr::getArraySize() previously returned allvm::Optionalwrapping anullptr when theCXXNewExpr did not have an arraysize expression. This was fixed and::getArraySize() will now alwayseither returnNone or allvm::Optional wrapping a validExpr*.This fixesIssue 53742.

  • We now ignore full expressions when traversing cast subexpressions. ThisfixesIssue 53044.

  • Allow-Wno-gnu to silence GNU extension diagnostics for pointerarithmetic diagnostics. FixesIssue 54444.

  • Placeholder constraints, as inConceptautox=f();, were not checkedwhen modifiers likeauto& orauto** were added. These constraints arenow checked.This fixesIssue 53911andIssue 54443.

  • Previously invalid member variables with template parameters would crash clang.Now fixed by setting identifiers for them.This fixesIssue 28475 (PR28101).

  • Now allow therestrict and_Atomic qualifiers to be used inconjunction with__auto_type to match the behavior in GCC. This fixesIssue 53652.

  • No longer crash when specifying a variably-modified parameter type in afunction with thenaked attribute. This fixesIssue 50541.

  • Allow multiple#pragmaweak directives to name the same undeclared (if analias, target) identifier instead of only processing one such#pragmaweakper identifier.FixesIssue 28985.

  • Assignment expressions in C11 and later mode now properly strip the _Atomicqualifier when determining the type of the assignment expression. FixesIssue 48742.

  • Improved the diagnostic when accessing a member of an atomic structure orunion object in C; was previously an unhelpful error, but now issues a-Watomic-access warning which defaults to an error. FixesIssue 54563.

  • Unevaluated lambdas in dependant contexts no longer result in clang crashing.This fixes Issues50376,51414,51416,and51641.

  • The builtin function __builtin_dump_struct would crash clang when the targetstruct contains a bitfield. It now correctly handles bitfields.This fixes IssueIssue 54462.

  • Statement expressions are now disabled in default arguments in general.This fixes IssueIssue 53488.

  • According toCWG 1394 andC++20 [dcl.fct.def.general]p2,Clang should not diagnose incomplete types in function definitions if the function body is=delete;.This fixes IssueIssue 52802.

  • Unknown type attributes with a[[]] spelling are no longer diagnosed twice.This fixes IssueIssue 54817.

  • Clang should no longer incorrectly diagnose a variable declaration inside ofa lambda expression that shares the name of a variable in a containingif/while/for/switch init statement as a redeclaration.This fixesIssue 54913.

  • Overload resolution for constrained function templates could use the partialorder of constraints to select an overload, even if the parameter types ofthe functions were different. It now diagnoses this case correctly as anambiguous call and an error. FixesIssue 53640.

  • No longer crash when trying to determine whether the controlling expressionargument to a generic selection expression has side effects in the case wherethe expression is result dependent. This fixesIssue 50227.

  • Fixed an assertion when constant evaluating an initializer for a GCC/Clangfloating-point vector type when the width of the initialization is exactlythe same as the elements of the vector being initialized.FixesIssue 50216.

  • Fixed a crash when the__bf16 type is used such that its size oralignment is calculated on a target which does not support that type. ThisfixesIssue 50171.

  • Fixed a false positive diagnostic about an unevaluated expression having noside effects when the expression is of VLA type and is an operand of thesizeof operator. FixesIssue 48010.

  • Fixed a false positive diagnostic about scoped enumerations being a C++11extension in C mode. A scoped enumeration’s enumerators cannot be named in Cbecause there is no way to fully qualify the enumerator name, so this“extension” was unintentional and useless. This fixesIssue 42372.

  • Clang will now find and emit a call to an allocation function in apromise_type body for coroutines if there is any allocation functiondeclaration in the scope of promise_type. Additionally, to implement CWG2585,a coroutine will no longer generate a call to a global allocation functionwith the signature(std::size_t,p0,...,pn).This fixes IssueIssue 54881.

  • ImplementCWG 2394: Const class membersmay be initialized with a defaulted default constructor under the sameconditions it would be allowed for a const object elsewhere.

  • __has_unique_object_representations no longer reports that_BitInt typeshave unique object representations if they have padding bits.

  • Unscoped and scoped enumeration types can no longer be initialized from abrace-init-list containing a single element of a different scoped enumerationtype.

  • Allow use of an elaborated type specifier as a_Generic selectionassociation in C++ mode. This fixesIssue 55562.

  • Clang will allow calling aconsteval function in a default argument. ThisfixesIssue 48230.

  • Fixed memory leak due toVarTemplateSpecializationDecl usingTemplateArgumentListInfo instead ofASTTemplateArgumentListInfo.

  • An initializer for a static variable declaration, which is nestedinside a statement expression in an aggregate initializer, is nowemitted as a dynamic initializer. Previously the variable wouldincorrectly be zero-initialized. In contexts where a dynamicinitializer is not allowed this is now diagnosed as an error.

  • Clang now correctly emits symbols for implicitly instantiated constexprtemplate function. FixesIssue 55560.

  • Clang now checks ODR violations when merging concepts from different modules.Note that this may possibly break existing code, and is done so intentionally.FixesIssue 56310.

  • Clang will now look through type sugar when checking a member function is amove assignment operator. FixesIssue 56456.

  • Fixed a crash when a variable with a bool enum type that has no definitionused in comparison operators. FixesIssue 56560.

  • Fix thatifconsteval could evaluate totrue at runtime because it was incorrectlyconstant folded. FixesIssue 55638.

  • Fixed incompatibility of Clang’s<stdatomic.h> with MSVC<atomic>.FixesMSVC STL Issue 2862.

  • Empty enums and enums with a single enumerator with value zero will beconsidered to have one positive bit in order to represent the underlyingvalue. This effects whether we consider the store of the value one to be welldefined.

  • An operator introduced to the scope via ausing statement now correctly references thisstatement in clangd (hover over the symbol, jump to definition) as well as in the AST dump.This also fixesissue 55095 as aside-effect.

  • When including a PCH from a GCC style directory with multiple alternative PCHfiles, Clang now requires all defines set on the command line while generatingthe PCH and when including it to match. This matches GCC’s behaviour.Previously Clang would tolerate defines to be set when creating the PCH butmissing when used, or vice versa. This makes sure that Clang picks thecorrect one, where it previously would consider multiple ones as potentiallyacceptable (and erroneously use whichever one is tried first).

Improvements to Clang’s diagnostics

  • -Wliteral-range will warn on floating-point equality comparisons withconstants that are not representable in a casted value. For example,(float)f==0.1 is always false.

  • -Winline-namespace-reopened-noninline now takes into account that theinline keyword must appear on the original but not necessarily allextension definitions of an inline namespace and therefore points its noteat the original definition. This fixesIssue 50794 (PR51452).

  • -Wunused-but-set-variable now also warns if the variable is only usedby unary operators.

  • -Wunused-variable no longer warn for references extending the lifetimeof temporaries with side effects. This fixesIssue 54489.

  • Modified the behavior of-Wstrict-prototypes and added a new, relateddiagnostic-Wdeprecated-non-prototype. The strict prototypes warning willnow only diagnose deprecated declarations and definitions of functionswithout a prototype where the behavior in C2x will remain correct. Thisdiagnostic remains off by default but is now enabled via-pedantic due toit being a deprecation warning.-Wstrict-prototypes has no effect in C2xor when-fno-knr-functions is enabled.-Wdeprecated-non-prototypewill diagnose cases where the deprecated declarations or definitions of afunction without a prototype will change behavior in C2x. Additionally, itwill diagnose calls which pass arguments to a function without a prototype.This warning is enabled only when the-Wdeprecated-non-prototype optionis enabled at the function declaration site, which allows a developer todisable the diagnostic for all callers at the point of declaration. Thisdiagnostic is grouped under the-Wstrict-prototypes warning group, but isenabled by default.-Wdeprecated-non-prototype has no effect in C2x orwhen-fno-knr-functions is enabled.

  • Clang now appropriately issues an error in C when a definition of a functionwithout a prototype and with no arguments is an invalid redeclaration of afunction with a prototype. e.g.,voidf(int);voidf(){} is now properlydiagnosed.

  • The-Wimplicit-function-declaration warning diagnostic now defaults toan error in C99 and later. Prior to C2x, it may be downgraded to a warningwith-Wno-error=implicit-function-declaration, or disabled entirely with-Wno-implicit-function-declaration. As of C2x, support for implicitfunction declarations has been removed, and the warning options will have noeffect.

  • The-Wimplicit-int warning diagnostic now defaults to an error in C99 andlater. Prior to C2x, it may be downgraded to a warning with-Wno-error=implicit-int, or disabled entirely with-Wno-implicit-int.As of C2x, support for implicit int has been removed, and the warning optionswill have no effect. Specifying-Wimplicit-int in C89 mode will now issuewarnings instead of being a noop.

  • No longer issue a “declaration specifiers missing, defaulting to int”diagnostic in C89 mode because it is not an extension in C89, it was validcode. The diagnostic has been removed entirely as it did not have adiagnostic group to disable it, but it can be covered wholly by-Wimplicit-int.

  • -Wmisexpect warns when the branch weights collected during profilingconflict with those added byllvm.expect.

  • -Wthread-safety-analysis now considers overloaded compound assignment andincrement/decrement operators as writing to their first argument, thusrequiring an exclusive lock if the argument is guarded.

  • -Wenum-conversion now warns on converting a signed enum of one type to anunsigned enum of a different type (or vice versa) rather than-Wsign-conversion.

  • Added the-Wunreachable-code-generic-assoc diagnostic flag (grouped underthe-Wunreachable-code flag) which is enabled by default and warns theuser about_Generic selection associations which are unreachable becausethe type specified is an array type or a qualified type.

  • Added the-Wgnu-line-marker diagnostic flag (grouped under the-Wgnuflag) which is a portability warning about use of GNU linemarker preprocessordirectives. FixesIssue 55067.

  • Using#warning,#elifdef and#elifndef that are incompatible with C/C++standards before C2x/C++2b are now warned via-pedantic. Additionally,on such language mode,-Wpre-c2x-compat and-Wpre-c++2b-compatdiagnostic flags report a compatibility issue.FixesIssue 55306.

  • Clang now checks for stack resource exhaustion when recursively parsingdeclarators in order to give a diagnostic before we run out of stack space.This fixesIssue 51642.

  • Unknown preprocessor directives in a skipped conditional block are now givena typo correction suggestion if the given directive is sufficiently similarto another preprocessor conditional directive. For example, if#esleappears in a skipped block, we will warn about the unknown directive andsuggest#else as an alternative.#elifdef and#elifndef are onlysuggested when in C2x or C++2b mode. FixesIssue 51598.

  • The-Wdeprecated diagnostic will now warn on out-of-lineconstexprdeclarations downgraded to definitions in C++1z, in addition to theexisting warning on out-of-lineconst declarations.

  • -Wshift-overflow will not warn for signed left shifts in C++20 mode(and newer), as it will always wrap and never overflow. This fixesIssue 52873.

  • When using class templates without arguments, clang now tells developersthat template arguments are missing in certain contexts.This fixesIssue 55962.

  • Printable Unicode characters withinstatic_assert messages are no longerescaped.

  • The-Winfinite-recursion diagnostic no longer warns aboutunevaluated operands of atypeid expression, as they are nowmodeled correctly in the CFG. This fixesIssue 21668.

  • -Wself-assign,-Wself-assign-overloaded and-Wself-move willsuggest a fix if the decl being assigned is a parameter that shadows a datamember of the contained class.

  • Added-Winvalid-utf8 which diagnoses invalid UTF-8 code unit sequences incomments.

  • The-Wint-conversion warning diagnostic for implicit int <-> pointerconversions now defaults to an error in all C language modes. It may bedowngraded to a warning with-Wno-error=int-conversion, or disabledentirely with-Wno-int-conversion.

  • Deprecated lax vector conversions for Altivec vectors.The default behaviour with respect to these conversionswill switch to disable them in an upcoming release.

  • On AIX, only emit XL compatibility warning when 16 byte aligned structs arepass-by-value function arguments.

Non-comprehensive list of changes in this release

  • Improve__builtin_dump_struct:

    • Support bitfields in struct and union.

    • Improve the dump format, dump both bitwidth (if its a bitfield) and fieldvalue.

    • Remove anonymous tag locations and flatten anonymous struct members.

    • Beautify dump format, add indent for struct members.

    • Support passing additional arguments to the formatting function, allowinguse withfprintf and similar formatting functions.

    • Support use within constant evaluation in C++, if aconstexprformatting function is provided.

    • Support formatting of base classes in C++.

    • Support calling a formatting function template in C++, which can providecustom formatting for non-aggregate types.

  • Previously disabled sanitizer options now enabled by default:

    • ASAN_OPTIONS=detect_stack_use_after_return=1 (only on Linux).

    • MSAN_OPTIONS=poison_in_dtor=1.

  • Some type-trait builtins, such as__has_trivial_assign, have been documentedas deprecated for a while because their semantics don’t mix well with post-C++11 type-traits.Clang now emits deprecation warnings for them under the flag-Wdeprecated-builtins.

New Compiler Flags

  • Added the-fno-knr-functions flag to allow users to opt into the C2xbehavior where a function with an empty parameter list is treated as thoughthe parameter list werevoid. There is no-fknr-functions or-fno-no-knr-functions flag; this feature cannot be disabled in languagemodes where it is required, such as C++ or C2x.

  • A new ARM pass to workaround Cortex-A57 Erratum 1742098 and Cortex-A72 Erratum1655431 can be enabled using-mfix-cortex-a57-aes-1742098 or-mfix-cortex-a72-aes-1655431. The pass is enabled when using either ofthese cpus with-mcpu= and can be disabled using-mno-fix-cortex-a57-aes-1742098 or-mno-fix-cortex-a72-aes-1655431.

  • Added the-fexperimental-max-bitint-width= option to increase the maximumallowed bit width of_BitInt types beyond the default of 128 bits. Someoperations, such as division or float-to-integer conversion, on_BitInttypes with more than 128 bits currently crash clang. This option will beremoved in the future once clang supports all such operations.

  • Added the-print-diagnostic-options option, which prints a list ofwarnings the compiler supports.

  • Added the-Warray-parameter warning. It diagnoses differences betweenarray parameters between function redeclarations (arrays of different extents,etc). This flag is related to the same flag in GCC, but is different in thatit does not accept an explicitly- specified warning level and use of this flaghas no effect on-Warray-bounds.

Deprecated Compiler Flags

Modified Compiler Flags

Removed Compiler Flags

  • Removed the-fno-concept-satisfaction-caching flag. The flag was addedat the time when the draft of C++20 standard did not permit caching ofatomic constraints. The final standard permits such caching, seeWG21 P2104R0.

New Pragmas in Clang

  • Added support for MSVC’s#pragmafunction, which tells the compiler togenerate calls to functions listed in the pragma instead of using thebuiltins.

  • Added support for MSVC’s#pragmaalloc_text. The pragma names the codesection functions are placed in. The pragma only applies to functions withC linkage.

  • Added support for an empty optimization list for MSVC’s#pragmaoptimize.The pragma takes a list of optimizations to turn on or off which applies toall functions following the pragma. At the moment, only an empty list issupported.

Attribute Changes in Clang

  • Added support for parameter pack expansion inclang::annotate.

  • Theoverloadable attribute can now be written in all of the syntacticlocations a declaration attribute may appear.This fixesIssue 53805.

  • Improved namespace attributes handling:

    • Handle GNU attributes before a namespace identifier and subsequentattributes of different kinds.

    • Emit error on GNU attributes for a nested namespace definition.

  • Statement attributes[[clang::noinline]] and[[clang::always_inline]]can be used to control inlining decisions at callsites.

  • #pragmaclangattributepush now supports multiple attributes within a single directive.

  • The__declspec(naked) attribute can no longer be written on a memberfunction in Microsoft compatibility mode, matching the behavior of cl.exe.

  • Attributeno_builtin should now affect the generated code. It now disablesbuiltins (corresponding to the specific names listed in the attribute) in thebody of the function the attribute is on.

  • When theweak attribute is applied to a const qualified variable clang no longertells the backend it is allowed to optimize based on initializer value.

  • Added theclang::annotate_type attribute, which can be used to addannotations to types (see documentation for details).

  • Added half float to types that can be represented by__attribute__((mode(XX))).

  • Theformat attribute can now be applied to non-variadic functions. Theformat string must correctly format the fixed parameter types of the function.Using the attribute this way emits a GCC compatibility diagnostic.

  • Support was added for__attribute__((function_return("thunk-extern")))to X86 to replaceret instructions withjmp__x86_return_thunk. Thecorresponding attribute to disable this,__attribute__((function_return("keep"))) was added. This is intended tobe used by the Linux kernel to mitigate RETBLEED.

  • Ignore the__preferred_name__ attribute when writing for C++20 module interfaces.This is a short-term workaround intentionally since clang doesn’t take care of theserialization and deserialization of__preferred_name__. Seehttps://github.com/llvm/llvm-project/issues/56490 for example.

Windows Support

  • Add support for MSVC-compatible/JMC//JMC- flag in clang-cl (supportsX86/X64/ARM/ARM64)./JMC could only be used when/Zi or/Z7 isturned on. With this addition, clang-cl can be used in Visual Studio for theJustMyCode feature. Note, you may need to manually add/JMC as additionalcompile options in the Visual Studio since it currently assumes clang-cl does not support/JMC.

  • Implemented generation of SEH unwind information on ARM. (C++ exceptionhandling in MSVC mode is still unimplemented though.)

  • Switched MinGW mode on ARM to use SEH instead of DWARF for unwind information.

AIX Support

  • The driver no longer adds-mignore-xcoff-visibility by default for AIXtargets when no other visibility command-line options are in effect, asignoring hidden visibility can silently have undesirable side effects (e.gwhen libraries depend on visibility to hide non-ABI facing entities). The-mignore-xcoff-visibility option can be manually specified on thecommand-line to recover the previous behavior if desired.

C Language Changes in Clang

C2x Feature Support

C++ Language Changes in Clang

  • Improved-O0 code generation for calls tostd::move,std::forward,std::move_if_noexcept,std::addressof, andstd::as_const. Theseare now treated as compiler builtins and implemented directly, rather thaninstantiating the definition from the standard library.

  • Fixed mangling of nested dependent names such asT::a::b, whereT is atemplate parameter, to conform to the Itanium C++ ABI and be compatible withGCC. This breaks binary compatibility with code compiled with earlier versionsof clang; use the-fclang-abi-compat=14 option to get the old mangling.

  • Preprocessor character literals with au8 prefix are now correctly treated asunsigned character literals. This fixesIssue 54886.

  • Stopped allowing constraints on non-template functions to be compliant withdcl.decl.general p4.

  • Improvedcopy elision optimization. It’s possible to applyNRVO for an object if at the moment whenany return statement of this object is executed, thereturn slot won’t be occupied by another object.

C++20 Feature Support

  • Diagnose consteval and constexpr issues that happen at namespace scope. Thispartially addressesIssue 51593.

  • No longer attempt to evaluate a consteval UDL function call at runtime whenit is called through a template instantiation. This fixesIssue 54578.

  • Implemented__builtin_source_location(), which enables library supportforstd::source_location.

  • The mangling scheme for C++20 modules has incompatibly changed. Theinitial mangling was discovered not to be reversible, and the weakownership design decision did not give the backwards compatibilitythat was hoped for. C++20 since addedextern"C++" semanticsthat can be used for such compatibility. The demangler now demanglessymbols with named module attachment.

  • Enhanced the support for C++20 Modules, including: Partitions,Reachability, Header Unit andextern"C++" semantics.

  • ImplementedP1103R3: Merging Modules.

  • ImplementedP1779R3: ABI isolation for member functions.

  • ImplementedP1874R1: Dynamic Initialization Order of Non-Local Variables in Modules.

  • Partially implementedP1815R2: Translation-unit-local entities.

  • As per “Conditionally Trivial Special Member Functions” (P0848), it isnow possible to overload destructors using concepts. Note that the restof the paper about other special member functions is not yet implemented.

C++2b Feature Support

CUDA/HIP Language Changes in Clang

  • Added__noinline__ as a keyword to avoid diagnostics due to usage of__attribute__((__noinline__)) in CUDA/HIP programs.

Objective-C Language Changes in Clang

OpenCL Kernel Language Changes in Clang

  • Improved/fixed misc issues in the builtin function support and diagnostics.

  • Improved diagnostics for unknown extension pragma, subgroup functions andimplicit function prototype.

  • Added-cl-ext flag to the Clang driver to toggle extensions/featurescompiled for.

  • Addedcl_khr_subgroup_rotate extension.

  • Removed someprintf andhostcall related diagnostics when compilingfor AMDGPU.

  • Fixed alignment of pointer types in kernel arguments.

ABI Changes in Clang

  • When compiling C for ARM or AArch64, a zero-length bitfield in astruct(e.g.int:0) no longer prevents the structure from being considered ahomogeneous floating-point or vector aggregate. The new behavior agrees withthe AAPCS specification, and matches the similar bug fix in GCC 12.1.

  • Targeting AArch64, since D127209 LLVM now only preserves the z8-z23and p4-p15 registers across a call if the registers z0-z7 or p0-p3 areused to pass data into or out of a subroutine. The new behaviormatches the AAPCS. Previously LLVM preserved z8-z23 and p4-p15 acrossa call if the callee had an SVE type anywhere in its signature. Thiswould cause an incorrect use of the caller-preserved z8-z23 and p4-p15ABI for example if the 9th argument or greater were the first SVE typein the signature of a function.

  • All copy constructors can now be trivial if they are not user-provided,regardless of the type qualifiers of the argument of the defaulted constructor,fixing dr2171.You can switch back to the old ABI behavior with the flag:-fclang-abi-compat=14.0.

OpenMP Support in Clang

  • Added the support foratomiccompare andatomiccomparecapture(-fopenmp-version=51 is required).

CUDA Support in Clang

X86 Support in Clang

  • Support-mharden-sls=[none|all|return|indirect-jmp] for straight-linespeculation hardening.

  • Support for the_Float16 type has been added for all targets with SSE2.When AVX512-FP16 is not available, arithmetic on_Float16 is emulatedusingfloat.

  • Added the-m[no-]rdpru flag to enable/disable the RDPRU instructionprovided by AMD Zen2 and later processors. Defined intrinsics for usingthis instruction (see rdpruintrin.h).

  • Support-mstack-protector-guard-symbol=[SymbolName] to use the givensymbol for addressing the stack protector guard.

  • -mfunction-return=thunk-extern support was added to clang for x86. Thiswill be used by Linux kernel mitigations for RETBLEED. The corresponding flag-mfunction-return=keep may be appended to disable the feature.

The_Float16 type requires SSE2 feature and above due to the instructionlimitations. When using it on i386 targets, you need to specify-msse2explicitly.

For targets without F16C feature or above, please make sure:

  • Use GCC 12.0 and above if you are using libgcc.

  • If you are using compiler-rt, use the same version with the compiler.Early versions provided FP16 builtins in a different ABI. A workaround is to usea small code snippet to check the ABI if you cannot make sure of it.

  • If you are using downstream runtimes that provide FP16 conversions, updatethem with the new ABI.

DWARF Support in Clang

  • clang now adds DWARF information for inline strings in C/C++ programs,allowingline:column symbolization of strings. Some debugging programs mayrequire updating, as this takes advantage of DWARFDW_TAG_variablestructureswithout aDW_AT_name field, which is valid DWARF, but may behandled incorrectly by some software (e.g. new failures with incorrectassertions).

Arm and AArch64 Support in Clang

  • clang now supports the Cortex-M85 CPU, which can be chosen with-mcpu=cortex-m85. By default, this has PACBTI turned on, but it can bedisabled with-mcpu=cortex-m85+nopacbti.

  • clang now supports using C/C++ operators on sizeless SVE vectors such assvint32_t. The set of supported operators is shown in the table VectorOperations found in theClang Language Extensionsdocument.

RISC-V Support in Clang

  • Updates to the RISC-V vector intrinsics to align with ongoing additions tothe RISC-V Vector intrinsics specification. Additionally, these intrinsicsare now generated lazily, resulting a substantial improvement incompile-time for code including the vector intrinsics header.

  • Intrinsics added for the RISC-V scalar crypto (‘K’) extensions.

  • Intrinsics added for the RISC-V CLZ and CTZ instructions in the Zbbextension.

  • An ABI lowering bug (resulting in incorrect LLVM IR generation) was fixed.The bug could be triggered in particular circumstances in C++ when passing adata-only struct that inherits from another struct.

SPIR-V Support in Clang

  • Added flag-fintegrated-objemitter to enable use of experimentalintegrated LLVM backend when generating SPIR-V binary.

  • The SPIR-V generator continues to produce typed pointers in this releasedespite the general switch of LLVM to opaque pointers.

Floating Point Support in Clang

Internal API Changes

  • Added a new attribute flagAcceptsExprPack that when set allowsexpression pack expansions in the parsed arguments of the correspondingattribute. Additionally it introduces delaying of attribute arguments, addingcommon handling for creating attributes that cannot be fully initializedprior to template instantiation.

Build System Changes

  • CMake-DCLANG_DEFAULT_PIE_ON_LINUX=ON is now the default. This is used bylinux-gnu systems to decide whether-fPIE-pie is the default (instead of-fno-pic-no-pie). This matches GCC installations on many Linux distros.Note: linux-android and linux-musl always default to-fPIE-pie, ignoringthis variable.-DCLANG_DEFAULT_PIE_ON_LINUX may be removed in the future.

AST Matchers

  • ExpandedisInline narrowing matcher to support C++17 inline variables.

  • AddedforEachTemplateArgument matcher which creates a match everytime atemplateArgument matches the matcher supplied to it.

  • AddedobjcStringLiteral matcher which matches ObjectiveC Stringliteral expressions.

clang-format

  • Important change: RenamedIndentRequires toIndentRequiresClauseand changed the default for all styles fromfalse totrue.

  • Reworked and improved handling of concepts and requires. Added theRequiresClausePosition option as part of that.

  • ChangedBreakBeforeConceptDeclarations fromBoolean to an enum.

  • OptionInsertBraces has been added to insert optional braces after controlstatements.

clang-extdef-mapping

  • clang-extdef-mapping now accepts .ast files as input. This is faster than torecompile the files from sources when extracting method definitons. This canbe really beneficial when creating .ast files for input to the clang-static-analyzer.

libclang

  • Introduce new optionCLANG_FORCE_MATCHING_LIBCLANG_SOVERSION that defaults to ON.This means that by default libclang’s SOVERSION matches the major version of LLVM.Setting this to OFF makes the SOVERSION be the ABI compatible version (currently 13).Seediscussionhere.

Static Analyzer

  • New CTU implementationthat keeps the slow-down around 2x compared to the single-TU analysis, evenin case of complex C++ projects. Still, it finds the majority of the “old”CTU findings. Besides, not more than ~3% of the bug reports are lost comparedto single-TU analysis, the lost reports are highly likely to be falsepositives.

  • Added a new checkeralpha.unix.cstring.UninitializedRead this will check for uninitialized readsfrom common memory copy/manipulation functions such asmemcpy,mempcpy,memmove,memcmp,strcmp,strncmp,strcpy,strlen,strsep and many more. Althoughthis checker currently is in list of alpha checkers due to a false positive.

  • Added a new checkeralpha.unix.Errno. This can find the first readoferrno after successful standard function calls, such use oferrnocould be unsafe.

  • Deprecate the-analyzer-storeregion and-analyzer-opt-analyze-nested-blocks analyzer flags.These flags are still accepted, but a warning will be displayed.These flags will be rejected, thus turned into a hard error starting withclang-16.

Undefined Behavior Sanitizer (UBSan)

Core Analysis Improvements

New Issues Found

Python Binding Changes

The following methods have been added:

Significant Known Problems

Additional Information

A wide variety of additional information is available on theClang webpage. The web page contains versions of theAPI documentation which are up-to-date with the Git version ofthe source code. You can access versions of these documents specific tothis release by going into the “clang/docs/” directory in the Clangtree.

If you have any questions or comments about Clang, please feel free tocontact us on theDiscourse forums (Clang Frontend category).