Clang 23.0.0git (In-Progress) Release Notes¶
Written by the LLVM Team
Warning
These are in-progress notes for the upcoming Clang 23 release. Release notes for previous releases can be found on the Releases Page.
Introduction¶
This document contains the release notes for the Clang C/C++/Objective-C frontend, part of the LLVM Compiler Infrastructure, release 23.0.0git. Here we describe the status of Clang in some detail, including major improvements from the previous release and new feature work. For the general LLVM release notes, see the LLVM documentation. For the libc++ release notes, see this page. All LLVM releases may be downloaded from the LLVM releases web site.
For more information about Clang or LLVM, including information about the latest release, please see the Clang Web Site or the LLVM Web Site.
Potentially Breaking Changes¶
C/C++ Language Potentially Breaking Changes¶
C++ Specific Potentially Breaking Changes¶
Clang now more aggressively optimizes away stores to objects after they are dead. This behavior can be disabled with
-fno-lifetime-dse.
ABI Changes in This Version¶
Fixed incorrect struct layout for
_BitIntbitfields wider than 255 bits on MSVC targets. Internal bitfield tracking fields were changed fromunsigned chartouint64_tto prevent overflow. This might be an ABI break for such structs compared to earlier Clang versions.
AST Dumping Potentially Breaking Changes¶
The JSON AST dump now includes all fields from
AvailabilityAttr:platform,introduced,deprecated,obsoleted,unavailable,message,strict,replacement,priority, andenvironment. Previously, these fields were missing from the JSON output.
Clang Frontend Potentially Breaking Changes¶
HIPSPV toolchain: –offload-targets=spirv{32,64} option is deprecated and will be removed when the new offload driver becomes default. The replacement for the option is –offload-targets=spirv{32,64}-unknown-chipstar when using the new offload driver (–offload-new-driver).
The new driver (–offload-new-driver) is now default for all offloading compilations. This changes the ABI for relocatable device code. Currently, libraries will need to be recompiled, or used with (–no-offload-new-driver). This option will be removed in the next release.
Clang Python Bindings Potentially Breaking Changes¶
Remove
CompletionString.Availability. No libclang interfaces returned instances of it.CompletionString.availabilitynow returns instances ofCompletionString.AvailabilityKindCompat.Instances of
AvailabilityKindCompathave the same__str__representation as the previousCompletionChunk.Kindand are equality-comparable with the existingAvailabilityKindenum. It will be replaced byAvailabilityKindin a future release. When this happens, the return type ofCompletionString.availabilitywill change toAvailabilityKind, so it is recommended to useAvailabilityKindto compare with the return values ofCompletionString.availability.Remove
availabilityKinds. In this release, uses ofavailabilityKindsneed to be replaced byCompletionString.AvailabilityKind.CompletionChunk.kindnow returns instances ofCompletionChunkKind.Instances of
CompletionChunkKindhave the same__str__representation as the previousCompletionChunk.Kindfor compatibility. These representations will be changed in a future release to match other enums.Remove
completionChunkKindMap. In this release, uses ofcompletionChunkKindMapneed to be replaced byCompletionChunkKind.Move
SPELLING_CACHEintoCompletionChunkand change it to useCompletionChunkKindinstances as keys, instead of the enum values. An alias is kept in the form of aSPELLING_CACHEvariable, but it only supports__getitem__and__contains__. It will be removed in a future release. Please migrate to usingCompletionChunk.SPELLING_CACHEinstead.SourceLocationandSourceRangenow useNotImplementedto delegate equality checks (__eq__) to the other object they are compared with when they are of different classes. They previously returnedFalsewhen compared with objects of other classes.
What’s New in Clang 23.0.0git?¶
C++ Language Changes¶
__is_trivially_equality_comparableno longer returns false for all enum types. (#132672)
C++2c Feature Support¶
C++23 Feature Support¶
C++20 Feature Support¶
C++17 Feature Support¶
Resolutions to C++ Defect Reports¶
C Language Changes¶
C2y Feature Support¶
C23 Feature Support¶
Clang now allows C23
constexprstruct member access through the dot operator in constant expressions. (#178349)
Non-comprehensive list of changes in this release¶
Added support for floating point and pointer values in most
__atomic_builtins.Added
__builtin_stdc_rotate_leftand__builtin_stdc_rotate_rightfor bit rotation of unsigned integers including_BitInttypes. Rotation counts are normalized modulo the bit-width and support negative values. Usable in constant expressions. Implicit conversion is supported for class/struct types with conversion operators.A new generic bit-reverse builtin function
__builtin_bitreversegthat extends bit-reversal support to all standard integers type, including_BitIntDeprecated float types support from
__builtin_elementwise_maxand__builtin_elementwise_min.
New Compiler Flags¶
New option
-fms-anonymous-structs/-fno-ms-anonymous-structsadded to enable or disable Microsoft’s anonymous struct/union extension without enabling other-fms-extensionsfeatures (#177607).New option
--precompile-reduced-bmiallows build system to generate a reduced BMI only for a C++20 importable module unit. Previously the users can only generate the reduced BMI as a by-product, e.g, an object files or a full BMI.New
-cc1option-fexperimental-overflow-behavior-typesadded to enable parsing of the experimentaloverflow_behaviortype attribute and type specifiers.New
-cloption/d2guardnochecksadded to match MSVC. When Windows Control Flow Guard (CFG) is enabled by other options, it will instruct Clang to emit the CFG metadata, but disable adding checks.
Deprecated Compiler Flags¶
Modified Compiler Flags¶
The -mno-outline and -moutline compiler flags are now allowed on RISC-V and X86, which both support the machine outliner.
The -mno-outline flag will now add the nooutline IR attribute, so that -mno-outline and -moutline objects can be mixed correctly during LTO.
Removed Compiler Flags¶
Attribute Changes in Clang¶
Added new attribute
stack_protector_ignoreto opt specific local variables out of the analysis which determines if a function should get a stack protector. A function will still generate a stack protector if other local variables or command line flags require it.Added a new attribute,
[[clang::no_outline]]to suppress outlining from annotated functions. This uses the LLVM nooutline attribute.Introduced a new type attribute
__attribute__((overflow_behavior))which currently accepts eitherwraportrapas an argument, enabling type-level control over overflow behavior. There is also an accompanying type specifier for each behavior kind via __ob_wrap and __ob_trap.
Improvements to Clang’s diagnostics¶
Added
-Wlifetime-safetyto enable lifetime safety analysis, a CFG-based intra-procedural analysis that detects use-after-free and related temporal safety bugs. See the RFC for more details. By design, this warning is enabled in-Weverything. To disable the analysis, use-Wno-lifetime-safetyor-fno-lifetime-safety.Added
-Wlifetime-safety-suggestionsto enable lifetime annotation suggestions. This provides suggestions for function parameters that should be marked[[clang::lifetimebound]]based on lifetime analysis. For example, for the following function:int* p(int *in) { return in; }
Clang will suggest:
warning: parameter in intra-TU function should be marked [[clang::lifetimebound]] int* p(int *in) { return in; } ^~~~~~~ [[clang::lifetimebound]] note: param returned here int* p(int *in) { return in; } ^~
Added
-Wlifetime-safety-noescapeto detect misuse of[[clang::noescape]]annotation where the parameter escapes through return. For example:int* p(int *in [[clang::noescape]]) { return in; }
Clang will warn:
warning: parameter is marked [[clang::noescape]] but escapes int* p(int *in [[clang::noescape]]) { return in; } ^~~~~~~ note: returned here int* p(int *in [[clang::noescape]]) { return in; } ^~
Added
-Wlifetime-safety-dangling-fieldto detect dangling field references when stack memory escapes to class fields. This is part of-Wlifetime-safetyand detects cases where local variables or parameters are stored in fields but outlive their scope. For example:struct DanglingView { std::string_view view; DanglingView(std::string s) : view(s) {} // warning: address of stack memory escapes to a field };
Improved
-Wassign-enumperformance by caching enum enumerator values. (#176454)Fixed a false negative in
-Warray-boundswhere the warning was suppressed when accessing a member function on a past-the-end array element. (#179128)Added a missing space to the FixIt for the
implicit-intgroup of diagnostics and made sure that only one such diagnostic and FixIt is emitted per declaration group. (#179354)The
-Wloop-analysiswarning has been extended to catch more cases of variable modification inside lambda expressions (#132038).Clang now emits
-Wsizeof-pointer-memaccesswhen snprintf/vsnprintf use the sizeof the destination buffer(dynamically allocated) in the len parameter(#162366)-Wunsafe-buffer-usagenow warns about unsafe two-parameter constructors ofstd::string_view(pointer and size), consistent with the existing warning forstd::span.Added
-Wmodule-map-path-outside-directory(off by default) to warn on header and umbrella directory paths that use..to refer outside the module directory in module maps found via implicit search (-fimplicit-module-maps). This does not affect module maps specified explicitly via-fmodule-map-file=.
Improvements to Clang’s time-trace¶
Improvements to Coverage Mapping¶
[MC/DC] Nested expressions are handled as individual MC/DC expressions.
“Single byte coverage” now supports branch coverage and can be used together with
-fcoverage-mcdc.
Bug Fixes in This Version¶
Fixed atomic boolean compound assignment; the conversion back to atomic bool would be miscompiled. (#33210)
Fixed a failed assertion in the preprocessor when
__has_embedparameters are missing parentheses. (#175088)Fix lifetime extension of temporaries in for-range-initializers in templates. (#165182)
Fixed a preprocessor crash in
__has_cpp_attributeon incomplete scoped attributes. (#178098)Fixes an assertion failure when evaluating
__underlying_typeon enum redeclarations. (#177943)Fixed an assertion failure caused by nested macro expansion during header-name lexing (
__has_embed(__has_include)). (#178635)Clang now outputs relative paths of embeds for dependency output. (#161950)
Fix the result type of a binary operation where both operands are ‘void’ l-values. (#111300)
Fixed an assertion failure when evaluating
_Countofon invalidvoid-typed operands. (#180893)Fixed an assertion failure in the serialized diagnostic printer when it is destroyed without calling
finish(). (#140433)Fixed an assertion failure caused by error recovery while extending a nested name specifier with results from ordinary lookup. (#181470)
Fixed a crash when parsing
#pragma clang attributearguments for attributes that forbid arguments. (#182122)Fixed a bug with multiple-include optimization (MIOpt) state not being preserved in some cases during lexing, which could suppress header-guard mismatch diagnostics and interfere with include-guard optimization. (#180155)
Bug Fixes to Compiler Builtins¶
Fixed a crash when calling __builtin_allow_sanitize_check with no arguments. (#183927)
Bug Fixes to Attribute Support¶
Fixed a behavioral discrepancy between deleted functions and private members when checking the
enable_ifattribute. (#175895)Fixed
init_priorityattribute by delaying type checks until after the type is deduced.
Bug Fixes to C++ Support¶
Fixed a crash on error recovery when dealing with invalid templates. (#183075)
Fixed a crash when instantiating
requiresexpressions involving substitution failures in C++ concepts. (#176402)Fixed an incorrect template argument deduction when matching packs of template template parameters when one of its parameters is also a pack. (#181166)
Fixed a crash when a default argument is passed to an explicit object parameter. (#176639)
Fixed a crash when diagnosing an invalid static member function with an explicit object parameter (#177741)
Fixed a crash when pack expansions are used as arguments for non-pack parameters of built-in templates. (#180307)
Fixed a bug where captured variables in non-mutable lambdas were incorrectly treated as mutable when used inside decltype in the return type. (#180460)
Fixed a crash when evaluating uninitialized GCC vector/ext_vector_type vectors in
constexpr. (#180044)Fixed a crash when explicit(bool) is used with an incomplete enumeration. (#183887)
Fixed a crash on
typeidof incomplete local types during template instantiation. (#63242), (#176397)Fixed a crash when an immediate-invoked
constevallambda is used as an invalid initializer. (#185270)Inherited constructors in
dllexportclasses are now exported for ABI-compatible cases, matching MSVC behavior. Constructors with variadic arguments or callee-cleanup parameters are not yet supported and produce a warning. (#162640)Fix initialization of GRO when GRO-return type mismatches, as part of CWG2563. (#98744)
Fix an error using an initializer list with array new for a type that is not default-constructible. (#81157)
Bug Fixes to AST Handling¶
Miscellaneous Bug Fixes¶
Fixed the arguments of the format attribute on
__builtin_os_log_format. Previously, they were off by 1.
Miscellaneous Clang Crashes Fixed¶
Fixed a crash when attempting to jump over initialization of a variable with variably modified type. (#175540)
Fixed a crash when using loop hint with a value dependent argument inside a generic lambda. (#172289)
Fixed a crash in C++ overload resolution with
_Atomic-qualified argument types. (#170433)Fixed a crash when casting a parenthesized unresolved template-id or array section. (#183505)
Fixed a crash when initializing a
constexprpointer with a floating-point literal in C23. (#180313)Fixed an assertion when diagnosing address-space qualified
new/deletein language-defined address spaces such as OpenCL__local. (#178319)Fixed an assertion failure in ObjC++ ARC when binding a rvalue reference to reference with different lifetimes (#178524)
Fixed a crash when subscripting a vector type with large unsigned integer values. (#180563)
OpenACC Specific Changes¶
Target Specific Changes¶
AMDGPU Support¶
Initial support for gfx1310
NVPTX Support¶
X86 Support¶
march=znver6is now supported.
Arm and AArch64 Support¶
Android Support¶
Windows Support¶
Clang now defines the
_MSVC_TRADITIONALmacro as1when emulating MSVC 19.15 (Visual Studio 2017 version 15.8) and later. (#47114)
LoongArch Support¶
DWARF fission is now compatible with linker relaxations, allowing -gsplit-dwarf and -mrelax to be used together when building for the LoongArch platform.
RISC-V Support¶
Tenstorrent Ascalon D8 was renamed to Ascalon X. Use tt-ascalon-x with -mcpu or -mtune.
CUDA/HIP Language Changes¶
The new offloading driver is now the default for HIP. Use –no-oflfoad-new-driver to return to the old behavior.
CUDA Support¶
AIX Support¶
NetBSD Support¶
WebAssembly Support¶
Fixed a crash when
__funcrefis applied to a non-function pointer type. (#118233)
AVR Support¶
SystemZ Support¶
Add support for #pragma export for z/OS. This is a pragma used to export functions and variables with external linkage from shared libraries. It provides compatibility with the IBM XL C/C++ compiler.
DWARF Support in Clang¶
Floating Point Support in Clang¶
Fixed Point Support in Clang¶
AST Matchers¶
Add
functionTypeLocmatcher for matchingFunctionTypeLoc.Add missing support for
TraversalKindin someaddMatcher()overloads.
clang-format¶
Add
ObjCSpaceAfterMethodDeclarationPrefixoption to control space between the ‘-‘/’+’ and the return type in Objective-C method declarationsAdd
AfterCommavalue toBreakConstructorInitializersto allow breaking constructor initializers after commas, keeping the colon on the same line.Extend
BreakBinaryOperationsto accept a structured configuration with per-operator break rules and minimum chain length gating viaPerOperator.
libclang¶
Visit constraints of auto type to properly visit concept usages (#166580)
Visit switch initializer statements (https://bugs.kde.org/show_bug.cgi?id=415537#c2)
Fix crash in clang_getBinaryOperatorKindSpelling and clang_getUnaryOperatorKindSpelling
Code Completion¶
Fixed a crash in code completion when using a C-Style cast with a parenthesized operand in Objective-C++ mode. (#180125)
Static Analyzer¶
Sanitizers¶
Python Binding Changes¶
Add deprecation warnings to
CompletionChunk.isKind...methods. These will be removed in a future release. Existing uses should be adapted to directly compare equality of theCompletionChunkkind with the correspondingCompletionChunkKindvariant.Affected methods:
isKindOptional,isKindTypedText,isKindPlaceHolder,isKindInformativeandisKindResultType.Add a deprecation warning to
CodeCompletionResults.results. This property will become an implementation detail with changed behavior in a future release and should not be used directly.. Existing uses ofCodeCompletionResults.resultsshould be changed to directly useCodeCompletionResults: it nows supports__len__and__getitem__, so it can be used the same asCodeCompletionResults.results.
OpenMP Support¶
Added support for
transparentclause in task and taskloop directives.Added support for
use_device_ptrclause to accept an optionalfallbackmodifier (fb_nullifyorfb_preserve) with OpenMP >= 61.
Improvements¶
Additional Information¶
A wide variety of additional information is available on the Clang web
page. The web page contains versions of the
API documentation which are up-to-date with the Git version of
the source code. You can access versions of these documents specific to
this release by going into the “clang/docs/” directory in the Clang
tree.
If you have any questions or comments about Clang, please feel free to contact us on the Discourse forums (Clang Frontend category).