| =========================================== |
| Clang |release| |ReleaseNotesTitle| |
| =========================================== |
| |
| .. contents:: |
| :local: |
| :depth: 2 |
| |
| Written by the `LLVM Team <https://llvm.org/>`_ |
| |
| .. only:: PreRelease |
| |
| .. warning:: |
| These are in-progress notes for the upcoming Clang |version| release. |
| Release notes for previous releases can be found on |
| `the Releases Page <https://llvm.org/releases/>`_. |
| |
| Introduction |
| ============ |
| |
| This document contains the release notes for the Clang C/C++/Objective-C |
| frontend, part of the LLVM Compiler Infrastructure, release |release|. 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 <https://llvm.org/docs/ReleaseNotes.html>`_. For the libc++ release notes, |
| see `this page <https://libcxx.llvm.org/ReleaseNotes.html>`_. All LLVM releases |
| may be downloaded from the `LLVM releases web site <https://llvm.org/releases/>`_. |
| |
| For more information about Clang or LLVM, including information about the |
| latest release, please see the `Clang Web Site <https://clang.llvm.org>`_ or the |
| `LLVM Web Site <https://llvm.org>`_. |
| |
| Potentially Breaking Changes |
| ============================ |
| These changes are ones which we think may surprise users when upgrading to |
| Clang |release| because of the opportunity they pose for disruption to existing |
| code bases. |
| |
| - Fix a bug in reversed argument for templated operators. |
| This breaks code in C++20 which was previously accepted in C++17. |
| Clang did not properly diagnose such casese in C++20 before this change. Eg: |
| |
| .. code-block:: cpp |
| |
| struct P {}; |
| template<class S> bool operator==(const P&, const S&); |
| |
| struct A : public P {}; |
| struct B : public P {}; |
| |
| // This equality is now ambiguous in C++20. |
| bool ambiguous(A a, B b) { return a == b; } |
| |
| template<class S> bool operator!=(const P&, const S&); |
| // Ok. Found a matching operator!=. |
| bool fine(A a, B b) { return a == b; } |
| |
| To reduce such widespread breakages, as an extension, Clang accepts this code |
| with an existing warning ``-Wambiguous-reversed-operator`` warning. |
| Fixes `GH <https://github.com/llvm/llvm-project/issues/53954>`_. |
| |
| - The CMake variable ``GCC_INSTALL_PREFIX`` (which sets the default |
| ``--gcc-toolchain=``) is deprecated and will be removed. Specify |
| ``--gcc-install-dir=`` or ``--gcc-triple=`` in a `configuration file |
| <https://clang.llvm.org/docs/UsersManual.html#configuration-files>` as a |
| replacement. |
| (`#77537 <https://github.com/llvm/llvm-project/pull/77537>`_) |
| |
| C/C++ Language Potentially Breaking Changes |
| ------------------------------------------- |
| |
| - The default extension name for PCH generation (``-c -xc-header`` and ``-c |
| -xc++-header``) is now ``.pch`` instead of ``.gch``. |
| - ``-include a.h`` probing ``a.h.gch`` will now ignore ``a.h.gch`` if it is not |
| a clang pch file or a directory containing any clang pch file. |
| - Fixed a bug that caused ``__has_cpp_attribute`` and ``__has_c_attribute`` |
| return incorrect values for some C++-11-style attributes. Below is a complete |
| list of behavior changes. |
| |
| .. csv-table:: |
| :header: Test, Old value, New value |
| |
| ``__has_cpp_attribute(unused)``, 201603, 0 |
| ``__has_cpp_attribute(gnu::unused)``, 201603, 1 |
| ``__has_c_attribute(unused)``, 202106, 0 |
| ``__has_cpp_attribute(clang::fallthrough)``, 201603, 1 |
| ``__has_cpp_attribute(gnu::fallthrough)``, 201603, 1 |
| ``__has_c_attribute(gnu::fallthrough)``, 201910, 1 |
| ``__has_cpp_attribute(warn_unused_result)``, 201907, 0 |
| ``__has_cpp_attribute(clang::warn_unused_result)``, 201907, 1 |
| ``__has_cpp_attribute(gnu::warn_unused_result)``, 201907, 1 |
| ``__has_c_attribute(warn_unused_result)``, 202003, 0 |
| ``__has_c_attribute(gnu::warn_unused_result)``, 202003, 1 |
| |
| - Fixed a bug in finding matching `operator!=` while adding reversed `operator==` as |
| outlined in "The Equality Operator You Are Looking For" (`P2468 <http://wg21.link/p2468r2>`_). |
| Fixes (`#68901: <https://github.com/llvm/llvm-project/issues/68901>`_). |
| |
| C++ Specific Potentially Breaking Changes |
| ----------------------------------------- |
| - The name mangling rules for function templates has been changed to take into |
| account the possibility that functions could be overloaded on their template |
| parameter lists or requires-clauses. This causes mangled names to change for |
| function templates in the following cases: |
| |
| - When a template parameter in a function template depends on a previous |
| template parameter, such as ``template<typename T, T V> void f()``. |
| - When the function has any constraints, whether from constrained template |
| parameters or requires-clauses. |
| - When the template parameter list includes a deduced type -- either |
| ``auto``, ``decltype(auto)``, or a deduced class template specialization |
| type. |
| - When a template template parameter is given a template template argument |
| that has a different template parameter list. |
| |
| This fixes a number of issues where valid programs would be rejected due to |
| mangling collisions, or would in some cases be silently miscompiled. Clang |
| will use the old manglings if ``-fclang-abi-compat=17`` or lower is |
| specified. |
| (`#48216 <https://github.com/llvm/llvm-project/issues/48216>`_), |
| (`#49884 <https://github.com/llvm/llvm-project/issues/49884>`_), and |
| (`#61273 <https://github.com/llvm/llvm-project/issues/61273>`_) |
| |
| - The `ClassScopeFunctionSpecializationDecl` AST node has been removed. |
| Dependent class scope explicit function template specializations now use |
| `DependentFunctionTemplateSpecializationInfo` to store candidate primary |
| templates and explicit template arguments. This should not impact users of |
| Clang as a compiler, but it may break assumptions in Clang-based tools |
| iterating over the AST. |
| |
| - The warning `-Wenum-constexpr-conversion` is now also enabled by default on |
| system headers and macros. It will be turned into a hard (non-downgradable) |
| error in the next Clang release. |
| |
| - The flag `-fdelayed-template-parsing` won't be enabled by default with C++20 |
| when targetting MSVC to match the behavior of MSVC. |
| (`MSVC Docs <https://learn.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-170>`_) |
| |
| - Remove the hardcoded path to the imported modules for C++20 named modules. Now we |
| require all the dependent modules to specified from the command line. |
| See (`#62707: <https://github.com/llvm/llvm-project/issues/62707>`_). |
| |
| - Forbid `import XXX;` in C++ to find module `XXX` comes from explicit clang modules. |
| See (`#64755: <https://github.com/llvm/llvm-project/issues/64755>`_). |
| |
| ABI Changes in This Version |
| --------------------------- |
| - Following the SystemV ABI for x86-64, ``__int128`` arguments will no longer |
| be split between a register and a stack slot. |
| |
| AST Dumping Potentially Breaking Changes |
| ---------------------------------------- |
| - When dumping a sugared type, Clang will no longer print the desugared type if |
| its textual representation is the same as the sugared one. This applies to |
| both text dumps of the form ``'foo':'foo'`` which will now be dumped as just |
| ``'foo'``, and JSON dumps of the form: |
| |
| .. code-block:: json |
| |
| "type": { |
| "qualType": "foo", |
| "desugaredQualType": "foo" |
| } |
| |
| which will now be dumped as just: |
| |
| .. code-block:: json |
| |
| "type": { |
| "qualType": "foo" |
| } |
| |
| What's New in Clang |release|? |
| ============================== |
| Some of the major new features and improvements to Clang are listed |
| here. Generic improvements to Clang as a whole or to its underlying |
| infrastructure are described first, followed by language-specific |
| sections with improvements to Clang's support for those languages. |
| |
| C++ Language Changes |
| -------------------- |
| |
| C++20 Feature Support |
| ^^^^^^^^^^^^^^^^^^^^^ |
| - Implemented `P1907R1 <https://wg21.link/P1907R1>` which extends allowed non-type template argument |
| kinds with e.g. floating point values and pointers and references to subobjects. |
| This feature is still experimental. Accordingly, ``__cpp_nontype_template_args`` was not updated. |
| However, its support can be tested with ``__has_extension(cxx_generalized_nttp)``. |
| |
| - Clang won't perform ODR checks for decls in the global module fragment any |
| more to ease the implementation and improve the user's using experience. |
| This follows the MSVC's behavior. Users interested in testing the more strict |
| behavior can use the flag '-Xclang -fno-skip-odr-check-in-gmf'. |
| (`#79240 <https://github.com/llvm/llvm-project/issues/79240>`_). |
| |
| C++23 Feature Support |
| ^^^^^^^^^^^^^^^^^^^^^ |
| - Implemented `P0847R7: Deducing this <https://wg21.link/P0847R7>`_. Some related core issues were also |
| implemented (`CWG2553 <https://wg21.link/CWG2553>`_, `CWG2554 <https://wg21.link/CWG2554>`_, |
| `CWG2653 <https://wg21.link/CWG2653>`_, `CWG2687 <https://wg21.link/CWG2687>`_). Because the |
| support for this feature is still experimental, the feature test macro ``__cpp_explicit_this_parameter`` |
| was not set in this version. |
| However, its support can be tested with ``__has_extension(cxx_explicit_this_parameter)``. |
| |
| - Added a separate warning to warn the use of attributes on lambdas as a C++23 extension |
| in previous language versions: ``-Wc++23-lambda-attributes``. |
| |
| C++2c Feature Support |
| ^^^^^^^^^^^^^^^^^^^^^ |
| |
| - Implemented `P2169R4: A nice placeholder with no name <https://wg21.link/P2169R4>`_. This allows using ``_`` |
| as a variable name multiple times in the same scope and is supported in all C++ language modes as an extension. |
| An extension warning is produced when multiple variables are introduced by ``_`` in the same scope. |
| Unused warnings are no longer produced for variables named ``_``. |
| Currently, inspecting placeholders variables in a debugger when more than one are declared in the same scope |
| is not supported. |
| |
| .. code-block:: cpp |
| |
| struct S { |
| int _, _; // Was invalid, now OK |
| }; |
| void func() { |
| int _, _; // Was invalid, now OK |
| } |
| void other() { |
| int _; // Previously diagnosed under -Wunused, no longer diagnosed |
| } |
| |
| - Attributes now expect unevaluated strings in attributes parameters that are string literals. |
| This is applied to both C++ standard attributes, and other attributes supported by Clang. |
| This completes the implementation of `P2361R6 Unevaluated Strings <https://wg21.link/P2361R6>`_ |
| |
| - Implemented `P2864R2 Remove Deprecated Arithmetic Conversion on Enumerations From C++26 <https://wg21.link/P2864R2>`_. |
| |
| - Implemented `P2361R6 Template parameter initialization <https://wg21.link/P2308R1>`_. |
| This change is applied as a DR in all language modes. |
| |
| |
| Resolutions to C++ Defect Reports |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| - Implemented `CWG2598 <https://wg21.link/CWG2598>`_ and `CWG2096 <https://wg21.link/CWG2096>`_, |
| making unions (that have either no members or at least one literal member) literal types. |
| (`#77924: <https://github.com/llvm/llvm-project/issues/77924>`_). |
| |
| |
| C Language Changes |
| ------------------ |
| - ``structs``, ``unions``, and ``arrays`` that are const may now be used as |
| constant expressions. This change is more consistent with the behavior of |
| GCC. |
| - Enums will now be represented in TBAA metadata using their actual underlying |
| integer type. Previously they were treated as chars, which meant they could |
| alias with all other types. |
| - Clang now supports the C-only attribute ``counted_by``. When applied to a |
| struct's flexible array member, it points to the struct field that holds the |
| number of elements in the flexible array member. This information can improve |
| the results of the array bound sanitizer and the |
| ``__builtin_dynamic_object_size`` builtin. |
| |
| C23 Feature Support |
| ^^^^^^^^^^^^^^^^^^^ |
| - Clang now accepts ``-std=c23`` and ``-std=gnu23`` as language standard modes, |
| and the ``__STDC_VERSION__`` macro now expands to ``202311L`` instead of its |
| previous placeholder value. Clang continues to accept ``-std=c2x`` and |
| ``-std=gnu2x`` as aliases for C23 and GNU C23, respectively. |
| - Clang now supports `requires c23` for module maps. |
| - Clang now supports ``N3007 Type inference for object definitions``. |
| |
| - Clang now supports ``<stdckdint.h>`` which defines several macros for performing |
| checked integer arithmetic. It is also exposed in pre-C23 modes. |
| |
| - Completed the implementation of |
| `N2508 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2508.pdf>`_. We |
| previously implemented allowing a label at the end of a compound statement, |
| and now we've implemented allowing a label to be followed by a declaration |
| instead of a statement. |
| - Implemented |
| `N2940 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2940.pdf>`_ which |
| removes support for trigraphs in C23 and later. In earlier language modes, |
| trigraphs remain enabled by default in conforming modes (e.g. ``-std=c17``) |
| and disabled by default in GNU and Microsoft modes (e.g., ``-std=gnu17`` or |
| ``-fms-compatibility``). If needed, you can enable trigraphs by passing |
| ``-ftrigraphs``. |
| |
| Non-comprehensive list of changes in this release |
| ------------------------------------------------- |
| |
| * Clang now has a ``__builtin_vectorelements()`` function that determines the number of elements in a vector. |
| For fixed-sized vectors, e.g., defined via ``__attribute__((vector_size(N)))`` or ARM NEON's vector types |
| (e.g., ``uint16x8_t``), this returns the constant number of elements at compile-time. |
| For scalable vectors, e.g., SVE or RISC-V V, the number of elements is not known at compile-time and is |
| determined at runtime. |
| * The ``__datasizeof`` keyword has been added. It is similar to ``sizeof`` |
| except that it returns the size of a type ignoring tail padding. |
| * ``__builtin_classify_type()`` now classifies ``_BitInt`` values as the return value ``18`` |
| and vector types as return value ``19``, to match GCC 14's behavior. |
| * The default value of `_MSC_VER` was raised from 1920 to 1933. |
| * Since MSVC 19.33 added undocumented attribute ``[[msvc::constexpr]]``, this release adds the attribute as well. |
| |
| * Added ``#pragma clang fp reciprocal``. |
| |
| * The version of Unicode used by Clang (primarily to parse identifiers) has been updated to 15.1. |
| |
| New Compiler Flags |
| ------------------ |
| |
| * ``-fverify-intermediate-code`` and its complement ``-fno-verify-intermediate-code``. |
| Enables or disables verification of the generated LLVM IR. |
| Users can pass this to turn on extra verification to catch certain types of |
| compiler bugs at the cost of extra compile time. |
| Since enabling the verifier adds a non-trivial cost of a few percent impact on |
| build times, it's disabled by default, unless your LLVM distribution itself is |
| compiled with runtime checks enabled. |
| * ``-fkeep-system-includes`` modifies the behavior of the ``-E`` option, |
| preserving ``#include`` directives for "system" headers instead of copying |
| the preprocessed text to the output. This can greatly reduce the size of the |
| preprocessed output, which can be helpful when trying to reduce a test case. |
| * ``-fassume-nothrow-exception-dtor`` is added to assume that the destructor of |
| a thrown exception object will not throw. The generated code for catch |
| handlers will be smaller. A throw expression of a type with a |
| potentially-throwing destructor will lead to an error. |
| |
| * ``-fopenacc`` was added as a part of the effort to support OpenACC in Clang. |
| |
| * ``-fcx-limited-range`` enables the naive mathematical formulas for complex |
| division and multiplication with no NaN checking of results. The default is |
| ``-fno-cx-limited-range``, but this option is enabled by ``-ffast-math``. |
| |
| * ``-fcx-fortran-rules`` enables the naive mathematical formulas for complex |
| multiplication and enables application of Smith's algorithm for complex |
| division. See SMITH, R. L. Algorithm 116: Complex division. Commun. ACM 5, 8 |
| (1962). The default is ``-fno-cx-fortran-rules``. |
| |
| * ``-fvisibility-global-new-delete=<value>`` gives more freedom to users to |
| control how and if Clang forces a visibility for the replaceable new and |
| delete declarations. The option takes 4 values: ``force-hidden``, |
| ``force-protected``, ``force-default`` and ``source``; ``force-default`` is |
| the default. Option values with prefix ``force-`` assign such declarations |
| an implicit visibility attribute with the corresponding visibility. An option |
| value of ``source`` implies that no implicit attribute is added. Without the |
| attribute the replaceable global new and delete operators behave normally |
| (like other functions) with respect to visibility attributes, pragmas and |
| options (e.g ``--fvisibility=``). |
| |
| Deprecated Compiler Flags |
| ------------------------- |
| |
| Modified Compiler Flags |
| ----------------------- |
| |
| * ``-Woverriding-t-option`` is renamed to ``-Woverriding-option``. |
| * ``-Winterrupt-service-routine`` is renamed to ``-Wexcessive-regsave`` as a generalization |
| * ``-frewrite-includes`` now guards the original #include directives with |
| ``__CLANG_REWRITTEN_INCLUDES``, and ``__CLANG_REWRITTEN_SYSTEM_INCLUDES`` as |
| appropriate. |
| * Introducing a new default calling convention for ``-fdefault-calling-conv``: |
| ``rtdcall``. This new default CC only works for M68k and will use the new |
| ``m68k_rtdcc`` CC on every functions that are not variadic. The ``-mrtd`` |
| driver/frontend flag has the same effect when targeting M68k. |
| * ``-fvisibility-global-new-delete-hidden`` is now a deprecated spelling of |
| ``-fvisibility-global-new-delete=force-hidden`` (``-fvisibility-global-new-delete=`` |
| is new in this release). |
| |
| Removed Compiler Flags |
| ------------------------- |
| |
| * ``-enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang`` has been removed. |
| It has not been needed to enable ``-ftrivial-auto-var-init=zero`` since Clang 16. |
| |
| Attribute Changes in Clang |
| -------------------------- |
| - On X86, a warning is now emitted if a function with ``__attribute__((no_caller_saved_registers))`` |
| calls a function without ``__attribute__((no_caller_saved_registers))``, and is not compiled with |
| ``-mgeneral-regs-only`` |
| - On X86, a function with ``__attribute__((interrupt))`` can now call a function without |
| ``__attribute__((no_caller_saved_registers))`` provided that it is compiled with ``-mgeneral-regs-only`` |
| |
| - When a non-variadic function is decorated with the ``format`` attribute, |
| Clang now checks that the format string would match the function's parameters' |
| types after default argument promotion. As a result, it's no longer an |
| automatic diagnostic to use parameters of types that the format style |
| supports but that are never the result of default argument promotion, such as |
| ``float``. (`#59824: <https://github.com/llvm/llvm-project/issues/59824>`_) |
| |
| - Clang now supports ``[[clang::preferred_type(type-name)]]`` as an attribute |
| which can be applied to a bit-field. This attribute helps to map a bit-field |
| back to a particular type that may be better-suited to representing the bit- |
| field but cannot be used for other reasons and will impact the debug |
| information generated for the bit-field. This is most useful when mapping a |
| bit-field of basic integer type back to a ``bool`` or an enumeration type, |
| e.g., |
| |
| .. code-block:: c++ |
| |
| enum E { Apple, Orange, Pear }; |
| struct S { |
| [[clang::preferred_type(E)]] unsigned FruitKind : 2; |
| }; |
| |
| When viewing ``S::FruitKind`` in a debugger, it will behave as if the member |
| was declared as type ``E`` rather than ``unsigned``. |
| |
| - Clang now warns you that the ``_Alignas`` attribute on declaration specifiers |
| is ignored, changed from the former incorrect suggestion to move it past |
| declaration specifiers. (`#58637 <https://github.com/llvm/llvm-project/issues/58637>`_) |
| |
| - Clang now introduced ``[[clang::coro_only_destroy_when_complete]]`` attribute |
| to reduce the size of the destroy functions for coroutines which are known to |
| be destroyed after having reached the final suspend point. |
| |
| - Clang now introduced ``[[clang::coro_return_type]]`` and ``[[clang::coro_wrapper]]`` |
| attributes. A function returning a type marked with ``[[clang::coro_return_type]]`` |
| should be a coroutine. A non-coroutine function marked with ``[[clang::coro_wrapper]]`` |
| is still allowed to return the such a type. This is helpful for analyzers to recognize coroutines from the function signatures. |
| |
| - Clang now supports ``[[clang::code_align(N)]]`` as an attribute which can be |
| applied to a loop and specifies the byte alignment for a loop. This attribute |
| accepts a positive integer constant initialization expression indicating the |
| number of bytes for the minimum alignment boundary. Its value must be a power |
| of 2, between 1 and 4096(inclusive). |
| |
| .. code-block:: c++ |
| |
| void Array(int *array, size_t n) { |
| [[clang::code_align(64)]] for (int i = 0; i < n; ++i) array[i] = 0; |
| } |
| |
| template<int A> |
| void func() { |
| [[clang::code_align(A)]] for(;;) { } |
| } |
| |
| - Clang now introduced ``[[clang::coro_lifetimebound]]`` attribute. |
| All parameters of a function are considered to be lifetime bound if the function |
| returns a type annotated with ``[[clang::coro_lifetimebound]]`` and ``[[clang::coro_return_type]]``. |
| This analysis can be disabled for a function by annotating the function with ``[[clang::coro_disable_lifetimebound]]``. |
| |
| Improvements to Clang's diagnostics |
| ----------------------------------- |
| - Clang constexpr evaluator now prints template arguments when displaying |
| template-specialization function calls. |
| - Clang contexpr evaluator now displays notes as well as an error when a constructor |
| of a base class is not called in the constructor of its derived class. |
| - Clang no longer emits ``-Wmissing-variable-declarations`` for variables declared |
| with the ``register`` storage class. |
| - Clang's ``-Wswitch-default`` flag now diagnoses whenever a ``switch`` statement |
| does not have a ``default`` label. |
| - Clang's ``-Wtautological-negation-compare`` flag now diagnoses logical |
| tautologies like ``x && !x`` and ``!x || x`` in expressions. This also |
| makes ``-Winfinite-recursion`` diagnose more cases. |
| (`#56035: <https://github.com/llvm/llvm-project/issues/56035>`_). |
| - Clang constexpr evaluator now diagnoses compound assignment operators against |
| uninitialized variables as a read of uninitialized object. |
| (`#51536 <https://github.com/llvm/llvm-project/issues/51536>`_) |
| - Clang's ``-Wformat-truncation`` now diagnoses ``snprintf`` call that is known to |
| result in string truncation. |
| (`#64871: <https://github.com/llvm/llvm-project/issues/64871>`_). |
| Existing warnings that similarly warn about the overflow in ``sprintf`` |
| now falls under its own warning group ```-Wformat-overflow`` so that it can |
| be disabled separately from ``Wfortify-source``. |
| These two new warning groups have subgroups ``-Wformat-truncation-non-kprintf`` |
| and ``-Wformat-overflow-non-kprintf``, respectively. These subgroups are used when |
| the format string contains ``%p`` format specifier. |
| Because Linux kernel's codebase has format extensions for ``%p``, kernel developers |
| are encouraged to disable these two subgroups by setting ``-Wno-format-truncation-non-kprintf`` |
| and ``-Wno-format-overflow-non-kprintf`` in order to avoid false positives on |
| the kernel codebase. |
| Also clang no longer emits false positive warnings about the output length of |
| ``%g`` format specifier and about ``%o, %x, %X`` with ``#`` flag. |
| - Clang now emits ``-Wcast-qual`` for functional-style cast expressions. |
| - Clang no longer emits irrelevant notes about unsatisfied constraint expressions |
| on the left-hand side of ``||`` when the right-hand side constraint is satisfied. |
| (`#54678: <https://github.com/llvm/llvm-project/issues/54678>`_). |
| - Clang now prints its 'note' diagnostic in cyan instead of black, to be more compatible |
| with terminals with dark background colors. This is also more consistent with GCC. |
| - Clang now displays an improved diagnostic and a note when a defaulted special |
| member is marked ``constexpr`` in a class with a virtual base class |
| (`#64843: <https://github.com/llvm/llvm-project/issues/64843>`_). |
| - ``-Wfixed-enum-extension`` and ``-Wmicrosoft-fixed-enum`` diagnostics are no longer |
| emitted when building as C23, since C23 standardizes support for enums with a |
| fixed underlying type. |
| - When describing the failure of static assertion of `==` expression, clang prints the integer |
| representation of the value as well as its character representation when |
| the user-provided expression is of character type. If the character is |
| non-printable, clang now shows the escpaed character. |
| Clang also prints multi-byte characters if the user-provided expression |
| is of multi-byte character type. |
| |
| *Example Code*: |
| |
| .. code-block:: c++ |
| |
| static_assert("A\n"[1] == U'🌍'); |
| |
| *BEFORE*: |
| |
| .. code-block:: text |
| |
| source:1:15: error: static assertion failed due to requirement '"A\n"[1] == U'\U0001f30d'' |
| 1 | static_assert("A\n"[1] == U'🌍'); |
| | ^~~~~~~~~~~~~~~~~ |
| source:1:24: note: expression evaluates to '' |
| ' == 127757' |
| 1 | static_assert("A\n"[1] == U'🌍'); |
| | ~~~~~~~~~^~~~~~~~ |
| |
| *AFTER*: |
| |
| .. code-block:: text |
| |
| source:1:15: error: static assertion failed due to requirement '"A\n"[1] == U'\U0001f30d'' |
| 1 | static_assert("A\n"[1] == U'🌍'); |
| | ^~~~~~~~~~~~~~~~~ |
| source:1:24: note: expression evaluates to ''\n' (0x0A, 10) == U'🌍' (0x1F30D, 127757)' |
| 1 | static_assert("A\n"[1] == U'🌍'); |
| | ~~~~~~~~~^~~~~~~~ |
| - Clang now always diagnoses when using non-standard layout types in ``offsetof`` . |
| (`#64619: <https://github.com/llvm/llvm-project/issues/64619>`_) |
| - Clang now diagnoses redefined defaulted constructor when redefined |
| defaulted constructor with different exception specs. |
| (`#69094: <https://github.com/llvm/llvm-project/issues/69094>`_) |
| - Clang now diagnoses use of variable-length arrays in C++ by default (and |
| under ``-Wall`` in GNU++ mode). This is an extension supported by Clang and |
| GCC, but is very easy to accidentally use without realizing it's a |
| nonportable construct that has different semantics from a constant-sized |
| array. (`#62836 <https://github.com/llvm/llvm-project/issues/62836>`_) |
| |
| - Clang changed the order in which it displays candidate functions on overloading failures. |
| Previously, Clang used definition of ordering from the C++ Standard. The order defined in |
| the Standard is partial and is not suited for sorting. Instead, Clang now uses a strict |
| order that still attempts to push more relevant functions to the top by comparing their |
| corresponding conversions. In some cases, this results in better order. E.g., for the |
| following code |
| |
| .. code-block:: cpp |
| |
| struct Foo { |
| operator int(); |
| operator const char*(); |
| }; |
| |
| void test() { Foo() - Foo(); } |
| |
| Clang now produces a list with two most relevant builtin operators at the top, |
| i.e. ``operator-(int, int)`` and ``operator-(const char*, const char*)``. |
| Previously ``operator-(const char*, const char*)`` was the first element, |
| but ``operator-(int, int)`` was only the 13th element in the output. |
| However, new implementation does not take into account some aspects of |
| C++ semantics, e.g. which function template is more specialized. This |
| can sometimes lead to worse ordering. |
| |
| |
| - When describing a warning/error in a function-style type conversion Clang underlines only until |
| the end of the expression we convert from. Now Clang underlines until the closing parenthesis. |
| |
| Before: |
| |
| .. code-block:: text |
| |
| warning: cast from 'long (*)(const int &)' to 'decltype(fun_ptr)' (aka 'long (*)(int &)') converts to incompatible function type [-Wcast-function-type-strict] |
| 24 | return decltype(fun_ptr)( f_ptr /*comment*/); |
| | ^~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| After: |
| |
| .. code-block:: text |
| |
| warning: cast from 'long (*)(const int &)' to 'decltype(fun_ptr)' (aka 'long (*)(int &)') converts to incompatible function type [-Wcast-function-type-strict] |
| 24 | return decltype(fun_ptr)( f_ptr /*comment*/); |
| | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| - ``-Wzero-as-null-pointer-constant`` diagnostic is no longer emitted when using ``__null`` |
| (or, more commonly, ``NULL`` when the platform defines it as ``__null``) to be more consistent |
| with GCC. |
| - Clang will warn on deprecated specializations used in system headers when their instantiation |
| is caused by user code. |
| - Clang will now print ``static_assert`` failure details for arithmetic binary operators. |
| Example: |
| |
| .. code-block:: cpp |
| |
| static_assert(1 << 4 == 15); |
| |
| will now print: |
| |
| .. code-block:: text |
| |
| error: static assertion failed due to requirement '1 << 4 == 15' |
| 48 | static_assert(1 << 4 == 15); |
| | ^~~~~~~~~~~~ |
| note: expression evaluates to '16 == 15' |
| 48 | static_assert(1 << 4 == 15); |
| | ~~~~~~~^~~~~ |
| |
| - Clang now diagnoses definitions of friend function specializations, e.g. ``friend void f<>(int) {}``. |
| - Clang now diagnoses narrowing conversions involving const references. |
| (`#63151: <https://github.com/llvm/llvm-project/issues/63151>`_). |
| - Clang now diagnoses unexpanded packs within the template argument lists of function template specializations. |
| - The warning `-Wnan-infinity-disabled` is now emitted when ``INFINITY`` |
| or ``NAN`` are used in arithmetic operations or function arguments in |
| floating-point mode where ``INFINITY`` or ``NAN`` don't have the expected |
| values. |
| |
| - Clang now diagnoses attempts to bind a bitfield to an NTTP of a reference type as erroneous |
| converted constant expression and not as a reference to subobject. |
| - Clang now diagnoses ``auto`` and ``decltype(auto)`` in declarations of conversion function template |
| (`CWG1878: <https://cplusplus.github.io/CWG/issues/1878.html>`_) |
| - Clang now diagnoses the requirement that non-template friend declarations with requires clauses |
| and template friend declarations with a constraint that depends on a template parameter from an |
| enclosing template must be a definition. |
| - Clang now diagnoses incorrect usage of ``const`` and ``pure`` attributes, so ``-Wignored-attributes`` diagnoses more cases. |
| - Clang now emits more descriptive diagnostics for 'unusual' expressions (e.g. incomplete index |
| expressions on matrix types or builtin functions without an argument list) as placement-args |
| to new-expressions. |
| |
| Before: |
| |
| .. code-block:: text |
| |
| error: no matching function for call to 'operator new' |
| 13 | new (__builtin_memset) S {}; |
| | ^ ~~~~~~~~~~~~~~~~~~ |
| |
| note: candidate function not viable: no known conversion from '<builtin fn type>' to 'int' for 2nd argument |
| 5 | void* operator new(__SIZE_TYPE__, int); |
| | ^ |
| |
| After: |
| |
| .. code-block:: text |
| |
| error: builtin functions must be directly called |
| 13 | new (__builtin_memset) S {}; |
| | ^ |
| |
| - Clang now diagnoses import before module declarations but not in global |
| module fragment. |
| (`#67627: <https://github.com/llvm/llvm-project/issues/67627>`_). |
| |
| - Clang now diagnoses include headers with angle in module purviews, which is |
| not usually intended. |
| (`#68615: <https://github.com/llvm/llvm-project/issues/68615>`_) |
| |
| - Clang now won't mention invisible namespace when diagnose invisible declarations |
| inside namespace. The original diagnostic message is confusing. |
| (`#73893: <https://github.com/llvm/llvm-project/issues/73893>`_) |
| |
| Improvements to Clang's time-trace |
| ---------------------------------- |
| - Two time-trace scope variables are added. A time trace scope variable of |
| ``ParseDeclarationOrFunctionDefinition`` with the function's source location |
| is added to record the time spent parsing the function's declaration or |
| definition. Another time trace scope variable of ``ParseFunctionDefinition`` |
| is also added to record the name of the defined function. |
| |
| Bug Fixes in This Version |
| ------------------------- |
| - Fixed an issue where a class template specialization whose declaration is |
| instantiated in one module and whose definition is instantiated in another |
| module may end up with members associated with the wrong declaration of the |
| class, which can result in miscompiles in some cases. |
| - Fix crash on use of a variadic overloaded operator. |
| (`#42535 <https://github.com/llvm/llvm-project/issues/42535>`_) |
| - Fix a hang on valid C code passing a function type as an argument to |
| ``typeof`` to form a function declaration. |
| (`#64713 <https://github.com/llvm/llvm-project/issues/64713>`_) |
| - Clang now reports missing-field-initializers warning for missing designated |
| initializers in C++. |
| (`#56628 <https://github.com/llvm/llvm-project/issues/56628>`_) |
| - Clang now respects ``-fwrapv`` and ``-ftrapv`` for ``__builtin_abs`` and |
| ``abs`` builtins. |
| (`#45129 <https://github.com/llvm/llvm-project/issues/45129>`_, |
| `#45794 <https://github.com/llvm/llvm-project/issues/45794>`_) |
| - Fixed an issue where accesses to the local variables of a coroutine during |
| ``await_suspend`` could be misoptimized, including accesses to the awaiter |
| object itself. |
| (`#56301 <https://github.com/llvm/llvm-project/issues/56301>`_) |
| The current solution may bring performance regressions if the awaiters have |
| non-static data members. See |
| `#64945 <https://github.com/llvm/llvm-project/issues/64945>`_ for details. |
| - Clang now prints unnamed members in diagnostic messages instead of giving an |
| empty ''. Fixes |
| (`#63759 <https://github.com/llvm/llvm-project/issues/63759>`_) |
| - Fix crash in __builtin_strncmp and related builtins when the size value |
| exceeded the maximum value representable by int64_t. Fixes |
| (`#64876 <https://github.com/llvm/llvm-project/issues/64876>`_) |
| - Fixed an assertion if a function has cleanups and fatal erors. |
| (`#48974 <https://github.com/llvm/llvm-project/issues/48974>`_) |
| - Clang now emits an error if it is not possible to deduce array size for a |
| variable with incomplete array type. |
| (`#37257 <https://github.com/llvm/llvm-project/issues/37257>`_) |
| - Clang's ``-Wunused-private-field`` no longer warns on fields whose type is |
| declared with ``[[maybe_unused]]``. |
| (`#61334 <https://github.com/llvm/llvm-project/issues/61334>`_) |
| - For function multi-versioning using the ``target``, ``target_clones``, or |
| ``target_version`` attributes, remove comdat for internal linkage functions. |
| (`#65114 <https://github.com/llvm/llvm-project/issues/65114>`_) |
| - Clang now reports ``-Wformat`` for bool value and char specifier confusion |
| in scanf. Fixes |
| (`#64987 <https://github.com/llvm/llvm-project/issues/64987>`_) |
| - Support MSVC predefined macro expressions in constant expressions and in |
| local structs. |
| - Correctly parse non-ascii identifiers that appear immediately after a line splicing |
| (`#65156 <https://github.com/llvm/llvm-project/issues/65156>`_) |
| - Clang no longer considers the loss of ``__unaligned`` qualifier from objects as |
| an invalid conversion during method function overload resolution. |
| - Fix lack of comparison of declRefExpr in ASTStructuralEquivalence |
| (`#66047 <https://github.com/llvm/llvm-project/issues/66047>`_) |
| - Fix parser crash when dealing with ill-formed objective C++ header code. Fixes |
| (`#64836 <https://github.com/llvm/llvm-project/issues/64836>`_) |
| - Fix crash in implicit conversions from initialize list to arrays of unknown |
| bound for C++20. Fixes |
| (`#62945 <https://github.com/llvm/llvm-project/issues/62945>`_) |
| - Clang now allows an ``_Atomic`` qualified integer in a switch statement. Fixes |
| (`#65557 <https://github.com/llvm/llvm-project/issues/65557>`_) |
| - Fixes crash when trying to obtain the common sugared type of |
| `decltype(instantiation-dependent-expr)`. |
| Fixes (`#67603 <https://github.com/llvm/llvm-project/issues/67603>`_) |
| - Fixes a crash caused by a multidimensional array being captured by a lambda |
| (`#67722 <https://github.com/llvm/llvm-project/issues/67722>`_). |
| - Fixes a crash when instantiating a lambda with requires clause. |
| (`#64462 <https://github.com/llvm/llvm-project/issues/64462>`_) |
| - Fixes a regression where the ``UserDefinedLiteral`` was not properly preserved |
| while evaluating consteval functions. (`#63898 <https://github.com/llvm/llvm-project/issues/63898>`_). |
| - Fix a crash when evaluating value-dependent structured binding |
| variables at compile time. |
| Fixes (`#67690 <https://github.com/llvm/llvm-project/issues/67690>`_) |
| - Fixes a ``clang-17`` regression where ``LLVM_UNREACHABLE_OPTIMIZE=OFF`` |
| cannot be used with ``Release`` mode builds. (`#68237 <https://github.com/llvm/llvm-project/issues/68237>`_). |
| - Fix crash in evaluating ``constexpr`` value for invalid template function. |
| Fixes (`#68542 <https://github.com/llvm/llvm-project/issues/68542>`_) |
| - Clang will correctly evaluate ``noexcept`` expression for template functions |
| of template classes. Fixes |
| (`#68543 <https://github.com/llvm/llvm-project/issues/68543>`_, |
| `#42496 <https://github.com/llvm/llvm-project/issues/42496>`_, |
| `#77071 <https://github.com/llvm/llvm-project/issues/77071>`_, |
| `#77411 <https://github.com/llvm/llvm-project/issues/77411>`_) |
| - Fixed an issue when a shift count larger than ``__INT64_MAX__``, in a right |
| shift operation, could result in missing warnings about |
| ``shift count >= width of type`` or internal compiler error. |
| - Fixed an issue with computing the common type for the LHS and RHS of a `?:` |
| operator in C. No longer issuing a confusing diagnostic along the lines of |
| "incompatible operand types ('foo' and 'foo')" with extensions such as matrix |
| types. Fixes (`#69008 <https://github.com/llvm/llvm-project/issues/69008>`_) |
| - Clang no longer permits using the `_BitInt` types as an underlying type for an |
| enumeration as specified in the C23 Standard. |
| Fixes (`#69619 <https://github.com/llvm/llvm-project/issues/69619>`_) |
| - Fixed an issue when a shift count specified by a small constant ``_BitInt()``, |
| in a left shift operation, could result in a faulty warnings about |
| ``shift count >= width of type``. |
| - Clang now accepts anonymous members initialized with designated initializers |
| inside templates. |
| Fixes (`#65143 <https://github.com/llvm/llvm-project/issues/65143>`_) |
| - Fix crash in formatting the real/imaginary part of a complex lvalue. |
| Fixes (`#69218 <https://github.com/llvm/llvm-project/issues/69218>`_) |
| - No longer use C++ ``thread_local`` semantics in C23 when using |
| ``thread_local`` instead of ``_Thread_local``. |
| Fixes (`#70068 <https://github.com/llvm/llvm-project/issues/70068>`_) and |
| (`#69167 <https://github.com/llvm/llvm-project/issues/69167>`_) |
| - Fix crash in evaluating invalid lambda expression which forget capture this. |
| Fixes (`#67687 <https://github.com/llvm/llvm-project/issues/67687>`_) |
| - Fix crash from constexpr evaluator evaluating uninitialized arrays as rvalue. |
| Fixes (`#67317 <https://github.com/llvm/llvm-project/issues/67317>`_) |
| - Clang now properly diagnoses use of stand-alone OpenMP directives after a |
| label (including ``case`` or ``default`` labels). |
| - Fix compiler memory leak for enums with underlying type larger than 64 bits. |
| Fixes (`#78311 <https://github.com/llvm/llvm-project/pull/78311>`_) |
| |
| Before: |
| |
| .. code-block:: c++ |
| |
| label: |
| #pragma omp barrier // ok |
| |
| After: |
| |
| .. code-block:: c++ |
| |
| label: |
| #pragma omp barrier // error: '#pragma omp barrier' cannot be an immediate substatement |
| |
| - Fixed an issue that a benign assertion might hit when instantiating a pack expansion |
| inside a lambda. (`#61460 <https://github.com/llvm/llvm-project/issues/61460>`_) |
| - Fix crash during instantiation of some class template specializations within class |
| templates. Fixes (`#70375 <https://github.com/llvm/llvm-project/issues/70375>`_) |
| - Fix crash during code generation of C++ coroutine initial suspend when the return |
| type of await_resume is not trivially destructible. |
| Fixes (`#63803 <https://github.com/llvm/llvm-project/issues/63803>`_) |
| - ``__is_trivially_relocatable`` no longer returns true for non-object types |
| such as references and functions. |
| Fixes (`#67498 <https://github.com/llvm/llvm-project/issues/67498>`_) |
| - Fix crash when the object used as a ``static_assert`` message has ``size`` or ``data`` members |
| which are not member functions. |
| - Support UDLs in ``static_assert`` message. |
| - Fixed false positive error emitted by clang when performing qualified name |
| lookup and the current class instantiation has dependent bases. |
| Fixes (`#13826 <https://github.com/llvm/llvm-project/issues/13826>`_) |
| - Fix a ``clang-17`` regression where a templated friend with constraints is not |
| properly applied when its parameters reference an enclosing non-template class. |
| Fixes (`#71595 <https://github.com/llvm/llvm-project/issues/71595>`_) |
| - Fix the name of the ifunc symbol emitted for multiversion functions declared with the |
| ``target_clones`` attribute. This addresses a linker error that would otherwise occur |
| when these functions are referenced from other TUs. |
| - Fixes compile error that double colon operator cannot resolve macro with parentheses. |
| Fixes (`#64467 <https://github.com/llvm/llvm-project/issues/64467>`_) |
| - Clang's ``-Wchar-subscripts`` no longer warns on chars whose values are known non-negative constants. |
| Fixes (`#18763 <https://github.com/llvm/llvm-project/issues/18763>`_) |
| - Fix crash due to incorrectly allowing conversion functions in copy elision. |
| Fixes (`#39319 <https://github.com/llvm/llvm-project/issues/39319>`_) and |
| (`#60182 <https://github.com/llvm/llvm-project/issues/60182>`_) and |
| (`#62157 <https://github.com/llvm/llvm-project/issues/62157>`_) and |
| (`#64885 <https://github.com/llvm/llvm-project/issues/64885>`_) and |
| (`#65568 <https://github.com/llvm/llvm-project/issues/65568>`_) |
| - Fix an issue where clang doesn't respect detault template arguments that |
| are added in a later redeclaration for CTAD. |
| Fixes (`#69987 <https://github.com/llvm/llvm-project/issues/69987>`_) |
| - Fix an issue where CTAD fails for explicit type conversion. |
| Fixes (`#64347 <https://github.com/llvm/llvm-project/issues/64347>`_) |
| - Fix crash when using C++ only tokens like ``::`` in C compiler clang. |
| Fixes (`#73559 <https://github.com/llvm/llvm-project/issues/73559>`_) |
| - Clang now accepts recursive non-dependent calls to functions with deduced |
| return type. |
| Fixes (`#71015 <https://github.com/llvm/llvm-project/issues/71015>`_) |
| - Fix assertion failure when initializing union containing struct with |
| flexible array member using empty initializer list. |
| Fixes (`#77085 <https://github.com/llvm/llvm-project/issues/77085>`_) |
| - Fix assertion crash due to failed scope restoring caused by too-early VarDecl |
| invalidation by invalid initializer Expr. |
| Fixes (`#30908 <https://github.com/llvm/llvm-project/issues/30908>`_) |
| - Clang now emits correct source location for code-coverage regions in `if constexpr` |
| and `if consteval` branches. Untaken branches are now skipped. |
| Fixes (`#54419 <https://github.com/llvm/llvm-project/issues/54419>`_) |
| - Fix assertion failure when declaring a template friend function with |
| a constrained parameter in a template class that declares a class method |
| or lambda at different depth. |
| Fixes (`#75426 <https://github.com/llvm/llvm-project/issues/75426>`_) |
| - Fix an issue where clang cannot find conversion function with template |
| parameter when instantiation of template class. |
| Fixes (`#77583 <https://github.com/llvm/llvm-project/issues/77583>`_) |
| - Fix an issue where CTAD fails for function-type/array-type arguments. |
| Fixes (`#51710 <https://github.com/llvm/llvm-project/issues/51710>`_) |
| - Fix crashes when using the binding decl from an invalid structured binding. |
| Fixes (`#67495 <https://github.com/llvm/llvm-project/issues/67495>`_) and |
| (`#72198 <https://github.com/llvm/llvm-project/issues/72198>`_) |
| - Fix assertion failure when call noreturn-attribute function with musttail |
| attribute. |
| Fixes (`#76631 <https://github.com/llvm/llvm-project/issues/76631>`_) |
| - The MS ``__noop`` builtin without an argument list is now accepted |
| in the placement-args of new-expressions, matching MSVC's behaviour. |
| - Fix an issue that caused MS ``__decspec(property)`` accesses as well as |
| Objective-C++ property accesses to not be converted to a function call |
| to the getter in the placement-args of new-expressions. |
| Fixes (`#65053 <https://github.com/llvm/llvm-project/issues/65053>`_) |
| - Fix an issue with missing symbol definitions when the first coroutine |
| statement appears in a discarded ``if constexpr`` branch. |
| Fixes (`#78290 <https://github.com/llvm/llvm-project/issues/78290>`_) |
| - Fixed assertion failure with deleted overloaded unary operators. |
| Fixes (`#78314 <https://github.com/llvm/llvm-project/issues/78314>`_) |
| |
| Bug Fixes to Compiler Builtins |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| Bug Fixes to Attribute Support |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| Bug Fixes to C++ Support |
| ^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| - Clang limits the size of arrays it will try to evaluate at compile time |
| to avoid memory exhaustion. |
| This limit can be modified by `-fconstexpr-steps`. |
| (`#63562 <https://github.com/llvm/llvm-project/issues/63562>`_) |
| |
| - Fix a crash caused by some named unicode escape sequences designating |
| a Unicode character whose name contains a ``-``. |
| (Fixes `#64161 <https://github.com/llvm/llvm-project/issues/64161>`_) |
| |
| - Fix cases where we ignore ambiguous name lookup when looking up members. |
| (`#22413 <https://github.com/llvm/llvm-project/issues/22413>`_), |
| (`#29942 <https://github.com/llvm/llvm-project/issues/29942>`_), |
| (`#35574 <https://github.com/llvm/llvm-project/issues/35574>`_) and |
| (`#27224 <https://github.com/llvm/llvm-project/issues/27224>`_). |
| |
| - Clang emits an error on substitution failure within lambda body inside a |
| requires-expression. This fixes: |
| (`#64138 <https://github.com/llvm/llvm-project/issues/64138>`_) and |
| (`#71684 <https://github.com/llvm/llvm-project/issues/71684>`_). |
| |
| - Update ``FunctionDeclBitfields.NumFunctionDeclBits``. This fixes: |
| (`#64171 <https://github.com/llvm/llvm-project/issues/64171>`_). |
| |
| - Expressions producing ``nullptr`` are correctly evaluated |
| by the constant interpreter when appearing as the operand |
| of a binary comparison. |
| (`#64923 <https://github.com/llvm/llvm-project/issues/64923>`_) |
| |
| - Fix a crash when an immediate invocation is not a constant expression |
| and appear in an implicit cast. |
| (`#64949 <https://github.com/llvm/llvm-project/issues/64949>`_). |
| |
| - Fix crash when parsing ill-formed lambda trailing return type. Fixes: |
| (`#64962 <https://github.com/llvm/llvm-project/issues/64962>`_) and |
| (`#28679 <https://github.com/llvm/llvm-project/issues/28679>`_). |
| |
| - Fix a crash caused by substitution failure in expression requirements. |
| (`#64172 <https://github.com/llvm/llvm-project/issues/64172>`_) and |
| (`#64723 <https://github.com/llvm/llvm-project/issues/64723>`_). |
| |
| - Fix crash when parsing the requires clause of some generic lambdas. |
| (`#64689 <https://github.com/llvm/llvm-project/issues/64689>`_) |
| |
| - Fix crash when the trailing return type of a generic and dependent |
| lambda refers to an init-capture. |
| (`#65067 <https://github.com/llvm/llvm-project/issues/65067>`_ and |
| `#63675 <https://github.com/llvm/llvm-project/issues/63675>`_) |
| |
| - Clang now properly handles out of line template specializations when there is |
| a non-template inner-class between the function and the class template. |
| (`#65810 <https://github.com/llvm/llvm-project/issues/65810>`_) |
| |
| - Fix a crash when calling a non-constant immediate function |
| in the initializer of a static data member. |
| (`#65985 <https://github.com/llvm/llvm-project/issues/65985>_`). |
| - Clang now properly converts static lambda call operator to function |
| pointers on win32. |
| (`#62594 <https://github.com/llvm/llvm-project/issues/62594>`_) |
| |
| - Fixed some cases where the source location for an instantiated specialization |
| of a function template or a member function of a class template was assigned |
| the location of a non-defining declaration rather than the location of the |
| definition the specialization was instantiated from. |
| (`#26057 <https://github.com/llvm/llvm-project/issues/26057>`_`) |
| |
| - Fix a crash when a default member initializer of a base aggregate |
| makes an invalid call to an immediate function. |
| (`#66324 <https://github.com/llvm/llvm-project/issues/66324>`_) |
| |
| - Fix crash for a lambda attribute with a statement expression |
| that contains a `return`. |
| (`#48527 <https://github.com/llvm/llvm-project/issues/48527>`_) |
| |
| - Clang now no longer asserts when an UnresolvedLookupExpr is used as an |
| expression requirement. (`#66612 https://github.com/llvm/llvm-project/issues/66612`) |
| |
| - Clang now disambiguates NTTP types when printing diagnostics where the |
| NTTP types are compared with the 'diff' method. |
| (`#66744 https://github.com/llvm/llvm-project/issues/66744`) |
| |
| - Fix crash caused by a spaceship operator returning a comparision category by |
| reference. Fixes: |
| (`#64162 <https://github.com/llvm/llvm-project/issues/64162>`_) |
| - Fix a crash when calling a consteval function in an expression used as |
| the size of an array. |
| (`#65520 <https://github.com/llvm/llvm-project/issues/65520>`_) |
| |
| - Clang no longer tries to capture non-odr-used variables that appear |
| in the enclosing expression of a lambda expression with a noexcept specifier. |
| (`#67492 <https://github.com/llvm/llvm-project/issues/67492>`_) |
| |
| - Fix crash when fold expression was used in the initialization of default |
| argument. Fixes: |
| (`#67395 <https://github.com/llvm/llvm-project/issues/67395>`_) |
| |
| - Fixed a bug causing destructors of constant-evaluated structured bindings |
| initialized by array elements to be called in the wrong evaluation context. |
| |
| - Fix crash where ill-formed code was being treated as a deduction guide and |
| we now produce a diagnostic. Fixes: |
| (`#65522 <https://github.com/llvm/llvm-project/issues/65522>`_) |
| |
| - Fixed a bug where clang incorrectly considered implicitly generated deduction |
| guides from a non-templated constructor and a templated constructor as ambiguous, |
| rather than prefer the non-templated constructor as specified in |
| [standard.group]p3. |
| |
| - Fixed a crash caused by incorrect handling of dependence on variable templates |
| with non-type template parameters of reference type. Fixes: |
| (`#65153 <https://github.com/llvm/llvm-project/issues/65153>`_) |
| |
| - Clang now properly compares constraints on an out of line class template |
| declaration definition. Fixes: |
| (`#61763 <https://github.com/llvm/llvm-project/issues/61763>`_) |
| |
| - Fix a bug where implicit deduction guides are not correctly generated for nested template |
| classes. Fixes: |
| (`#46200 <https://github.com/llvm/llvm-project/issues/46200>`_) |
| (`#57812 <https://github.com/llvm/llvm-project/issues/57812>`_) |
| |
| - Diagnose use of a variable-length array in a coroutine. The design of |
| coroutines is such that it is not possible to support VLA use. Fixes: |
| (`#65858 <https://github.com/llvm/llvm-project/issues/65858>`_) |
| |
| - Fix bug where we were overriding zero-initialization of class members when |
| default initializing a base class in a constant expression context. Fixes: |
| (`#69890 <https://github.com/llvm/llvm-project/issues/69890>`_) |
| |
| - Fix crash when template class static member imported to other translation unit. |
| Fixes: |
| (`#68769 <https://github.com/llvm/llvm-project/issues/68769>`_) |
| |
| - Clang now rejects incomplete types for ``__builtin_dump_struct``. Fixes: |
| (`#63506 <https://github.com/llvm/llvm-project/issues/63506>`_) |
| |
| - Fixed a crash for C++98/03 while checking an ill-formed ``_Static_assert`` expression. |
| Fixes: (`#72025 <https://github.com/llvm/llvm-project/issues/72025>`_) |
| |
| - Clang now defers the instantiation of explicit specifier until constraint checking |
| completes (except deduction guides). Fixes: |
| (`#59827 <https://github.com/llvm/llvm-project/issues/59827>`_) |
| |
| - Fix crash when parsing nested requirement. Fixes: |
| (`#73112 <https://github.com/llvm/llvm-project/issues/73112>`_) |
| |
| - Fixed a crash caused by using return type requirement in a lambda. Fixes: |
| (`#63808 <https://github.com/llvm/llvm-project/issues/63808>`_) |
| (`#64607 <https://github.com/llvm/llvm-project/issues/64607>`_) |
| (`#64086 <https://github.com/llvm/llvm-project/issues/64086>`_) |
| |
| - Fixed a crash where we lost uninstantiated constraints on placeholder NTTP packs. Fixes: |
| (`#63837 <https://github.com/llvm/llvm-project/issues/63837>`_) |
| |
| - Fixed a regression where clang forgets how to substitute into constraints on template-template |
| parameters. Fixes: |
| (`#57410 <https://github.com/llvm/llvm-project/issues/57410>`_) and |
| (`#76604 <https://github.com/llvm/llvm-project/issues/57410>`_) |
| |
| - Fix a bug where clang would produce inconsistent values when |
| ``std::source_location::current()`` was used in a function template. |
| Fixes (`#78128 <https://github.com/llvm/llvm-project/issues/78128>`_) |
| |
| - Clang now allows parenthesized initialization of arrays in `operator new[]`. |
| Fixes: (`#68198 <https://github.com/llvm/llvm-project/issues/68198>`_) |
| |
| - Fixes CTAD for aggregates on nested template classes. Fixes: |
| (`#77599 <https://github.com/llvm/llvm-project/issues/77599>`_) |
| |
| - Fix crash when importing the same module with an dynamic initializer twice |
| in different visibility. |
| Fixes (`#67893 <https://github.com/llvm/llvm-project/issues/67893>`_) |
| |
| - Remove recorded `#pragma once` state for headers included in named modules. |
| Fixes (`#77995 <https://github.com/llvm/llvm-project/issues/77995>`_) |
| |
| - Set the ``__cpp_auto_cast`` feature test macro in C++23 mode. |
| |
| - Fix crash for inconsistent deducing state of function return types |
| in importing modules. |
| Fixes (`#78830 <https://github.com/llvm/llvm-project/issues/78830>`_) |
| Fixes (`#60085 <https://github.com/llvm/llvm-project/issues/60085>`_) |
| |
| |
| - Fixed a bug where variables referenced by requires-clauses inside |
| nested generic lambdas were not properly injected into the constraint scope. |
| (`#73418 <https://github.com/llvm/llvm-project/issues/73418>`_) |
| |
| - Fix incorrect code generation caused by the object argument of ``static operator()`` and ``static operator[]`` calls not being evaluated. |
| Fixes (`#67976 <https://github.com/llvm/llvm-project/issues/67976>`_) |
| |
| Bug Fixes to AST Handling |
| ^^^^^^^^^^^^^^^^^^^^^^^^^ |
| - Fixed an import failure of recursive friend class template. |
| `Issue 64169 <https://github.com/llvm/llvm-project/issues/64169>`_ |
| - Remove unnecessary RecordLayout computation when importing UnaryOperator. The |
| computed RecordLayout is incorrect if fields are not completely imported and |
| should not be cached. |
| `Issue 64170 <https://github.com/llvm/llvm-project/issues/64170>`_ |
| - Fixed ``hasAnyBase`` not binding nodes in its submatcher. |
| (`#65421 <https://github.com/llvm/llvm-project/issues/65421>`_) |
| - Fixed a bug where RecursiveASTVisitor fails to visit the |
| initializer of a bitfield. |
| `Issue 64916 <https://github.com/llvm/llvm-project/issues/64916>`_ |
| - Fixed a bug where range-loop-analysis checks for trivial copyability, |
| rather than trivial copy-constructibility |
| `Issue 47355 <https://github.com/llvm/llvm-project/issues/47355>`_ |
| - Fixed a bug where Template Instantiation failed to handle Lambda Expressions |
| with certain types of Attributes. |
| (`#76521 <https://github.com/llvm/llvm-project/issues/76521>`_) |
| |
| Miscellaneous Bug Fixes |
| ^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| Miscellaneous Clang Crashes Fixed |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| - Fixed a crash when parsing top-level ObjC blocks that aren't properly |
| terminated. Clang should now also recover better when an @end is missing |
| between blocks. |
| `Issue 64065 <https://github.com/llvm/llvm-project/issues/64065>`_ |
| - Fixed a crash when check array access on zero-length element. |
| `Issue 64564 <https://github.com/llvm/llvm-project/issues/64564>`_ |
| - Fixed a crash when an ObjC ivar has an invalid type. See |
| (`#68001 <https://github.com/llvm/llvm-project/pull/68001>`_) |
| - Fixed a crash in C when redefined struct is another nested redefinition. |
| `Issue 41302 <https://github.com/llvm/llvm-project/issues/41302>`_ |
| - Fixed a crash when ``-ast-dump=json`` was used for code using class |
| template deduction guides. |
| - Fixed a crash when a lambda marked as ``static`` referenced a captured |
| variable in an expression. |
| `Issue 74608 <https://github.com/llvm/llvm-project/issues/74608>`_ |
| - Fixed a crash with modules and a ``constexpr`` destructor. |
| `Issue 68702 <https://github.com/llvm/llvm-project/issues/68702>`_ |
| |
| |
| OpenACC Specific Changes |
| ------------------------ |
| - OpenACC Implementation effort is beginning with semantic analysis and parsing |
| of OpenACC pragmas. The ``-fopenacc`` flag was added to enable these new, |
| albeit incomplete changes. The ``_OPENACC`` macro is currently defined to |
| ``1``, as support is too incomplete to update to a standards-required value. |
| - Added ``-fexperimental-openacc-macro-override``, a command line option to |
| permit overriding the ``_OPENACC`` macro to be any digit-only value specified |
| by the user, which permits testing the compiler against existing OpenACC |
| workloads in order to evaluate implementation progress. |
| |
| Target Specific Changes |
| ----------------------- |
| |
| AMDGPU Support |
| ^^^^^^^^^^^^^^ |
| - Use pass-by-reference (byref) in stead of pass-by-value (byval) for struct |
| arguments in C ABI. Callee is responsible for allocating stack memory and |
| copying the value of the struct if modified. Note that AMDGPU backend still |
| supports byval for struct arguments. |
| - The default value for ``-mcode-object-version`` is now 5. |
| See `AMDHSA Code Object V5 Metadata <https://llvm.org/docs/AMDGPUUsage.html#code-object-v5-metadata>`_ |
| for more details. |
| |
| X86 Support |
| ^^^^^^^^^^^ |
| |
| - Added option ``-m[no-]evex512`` to disable ZMM and 64-bit mask instructions |
| for AVX512 features. |
| - Support ISA of ``USER_MSR``. |
| * Support intrinsic of ``_urdmsr``. |
| * Support intrinsic of ``_uwrmsr``. |
| - Support ISA of ``AVX10.1``. |
| - ``-march=pantherlake`` and ``-march=clearwaterforest`` are now supported. |
| - Added ABI handling for ``__float128`` to match with GCC. |
| - Emit warnings for options to enable knl/knm specific ISAs: AVX512PF, AVX512ER |
| and PREFETCHWT1. From next version (LLVM 19), these ISAs' intrinsic supports |
| will be deprecated: |
| * intrinsic series of *_exp2a23_* |
| * intrinsic series of *_rsqrt28_* |
| * intrinsic series of *_rcp28_* |
| * intrinsic series of *_prefetch_i[3|6][2|4]gather_* |
| * intrinsic series of *_prefetch_i[3|6][2|4]scatter_* |
| |
| Arm and AArch64 Support |
| ^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| - C++ function name mangling has been changed to align with the specification |
| (https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst). |
| This affects C++ functions with SVE ACLE parameters. Clang will use the old |
| manglings if ``-fclang-abi-compat=17`` or lower is specified. |
| |
| - New AArch64 asm constraints have been added for r8-r11(Uci) and r12-r15(Ucj). |
| |
| - Support has been added for the following processors (-mcpu identifiers in parenthesis): |
| |
| For Arm: |
| |
| * Cortex-M52 (cortex-m52). |
| |
| For AArch64: |
| |
| * Cortex-A520 (cortex-a520). |
| * Cortex-A720 (cortex-a720). |
| * Cortex-X4 (cortex-x4). |
| |
| - Alpha support has been added for SVE2.1 intrinsics. |
| |
| - Support has been added for `-fstack-clash-protection` and `-mstack-probe-size` |
| command line options. |
| |
| - Function Multi Versioning has been extended to support Load-Acquire RCpc |
| instructions v3 (rcpc3) as well as Memory Copy and Memory Set Acceleration |
| instructions (mops) when targeting AArch64. The feature identifiers (in |
| parenthesis) can be used with either of the ``target_version`` and |
| ``target_clones`` attributes. |
| |
| Android Support |
| ^^^^^^^^^^^^^^^ |
| |
| - Android target triples are usually suffixed with a version. Clang searches for |
| target-specific runtime and standard libraries in directories named after the |
| target (e.g. if you're building with ``--target=aarch64-none-linux-android21``, |
| Clang will look for ``lib/aarch64-none-linux-android21`` under its resource |
| directory to find runtime libraries). If an exact match isn't found, Clang |
| would previously fall back to a directory without any version (which would be |
| ``lib/aarch64-none-linux-android`` in our example). Clang will now look for |
| directories for lower versions and use the newest version it finds instead, |
| e.g. if you have ``lib/aarch64-none-linux-android21`` and |
| ``lib/aarch64-none-linux-android29``, ``-target aarch64-none-linux-android23`` |
| will use the former and ``-target aarch64-none-linux-android30`` will use the |
| latter. Falling back to a versionless directory will now emit a warning, and |
| the fallback will be removed in Clang 19. |
| |
| Windows Support |
| ^^^^^^^^^^^^^^^ |
| - Fixed an assertion failure that occurred due to a failure to propagate |
| ``MSInheritanceAttr`` attributes to class template instantiations created |
| for explicit template instantiation declarations. |
| |
| - The ``-fno-auto-import`` option was added for MinGW targets. The option both |
| affects code generation (inhibiting generating indirection via ``.refptr`` |
| stubs for potentially auto imported symbols, generating smaller and more |
| efficient code) and linking (making the linker error out on such cases). |
| If the option only is used during code generation but not when linking, |
| linking may succeed but the resulting executables may expose issues at |
| runtime. |
| |
| - Clang now passes relevant LTO options to the linker (LLD) in MinGW mode. |
| |
| LoongArch Support |
| ^^^^^^^^^^^^^^^^^ |
| - Added builtins support for all LSX (128-bits SIMD) and LASX (256-bits SIMD) |
| instructions. |
| - Added builtins support for approximate calculation instructions that were |
| introduced in LoongArch Reference Manual V1.10. |
| - Made ``-mcmodel=`` compatible with LoongArch gcc that accepted ``normal``, |
| ``medium`` and ``extreme``. |
| - The ``model`` attribute was now supported for overriding the default code |
| model used to access global variables. The following values were supported: |
| ``normal``, ``medium`` and ``extreme``. |
| |
| *Example Code*: |
| |
| .. code-block:: c |
| |
| int var __attribute((model("extreme"))); |
| |
| - Default to ``-fno-direct-access-external-data`` for non-PIC. |
| - An ABI mismatch with gcc/g++ about empty structs/unions passing was fixed. |
| - ``_mcount`` was generated instead of ``mcount``. |
| |
| RISC-V Support |
| ^^^^^^^^^^^^^^ |
| - Unaligned memory accesses can be toggled by ``-m[no-]unaligned-access`` or the |
| aliases ``-m[no-]strict-align``. |
| - CodeGen of RV32E/RV64E was supported experimentally. |
| - CodeGen of ilp32e/lp64e was supported experimentally. |
| |
| - Default ABI with F but without D was changed to ilp32f for RV32 and to lp64f |
| for RV64. |
| |
| - ``__attribute__((rvv_vector_bits(N)))`` is now supported for RVV vbool*_t types. |
| |
| CUDA/HIP Language Changes |
| ^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| CUDA Support |
| ^^^^^^^^^^^^ |
| |
| - Clang now supports CUDA SDK up to 12.3 |
| - Added support for sm_90a |
| |
| AIX Support |
| ^^^^^^^^^^^ |
| |
| - Introduced the ``-maix-small-local-exec-tls`` option to produce a faster |
| access sequence for local-exec TLS variables where the offset from the TLS |
| base is encoded as an immediate operand. |
| This access sequence is not used for TLS variables larger than 32KB, and is |
| currently only supported on 64-bit mode. |
| |
| WebAssembly Support |
| ^^^^^^^^^^^^^^^^^^^ |
| |
| AVR Support |
| ^^^^^^^^^^^ |
| |
| DWARF Support in Clang |
| ---------------------- |
| |
| Floating Point Support in Clang |
| ------------------------------- |
| - Add ``__builtin_elementwise_log`` builtin for floating point types only. |
| - Add ``__builtin_elementwise_log10`` builtin for floating point types only. |
| - Add ``__builtin_elementwise_log2`` builtin for floating point types only. |
| - Add ``__builtin_elementwise_exp`` builtin for floating point types only. |
| - Add ``__builtin_elementwise_exp2`` builtin for floating point types only. |
| - Add ``__builtin_set_flt_rounds`` builtin for X86, x86_64, Arm and AArch64 only. |
| - Add ``__builtin_elementwise_pow`` builtin for floating point types only. |
| - Add ``__builtin_elementwise_bitreverse`` builtin for integer types only. |
| - Add ``__builtin_elementwise_sqrt`` builtin for floating point types only. |
| - ``__builtin_isfpclass`` builtin now supports vector types. |
| - ``#pragma float_control(precise,on)`` enables precise floating-point |
| semantics. If ``math-errno`` is disabled in the current TU, clang will |
| re-enable ``math-errno`` in the presense of |
| ``#pragma float_control(precise,on)``. |
| - Add ``__builtin_exp10``, ``__builtin_exp10f``, |
| ``__builtin_exp10f16``, ``__builtin_exp10l`` and |
| ``__builtin_exp10f128`` builtins. |
| - Add ``__builtin_iszero``, ``__builtin_issignaling`` and |
| ``__builtin_issubnormal``. |
| - Add support for C99's ``#pragma STDC CX_LIMITED_RANGE`` feature. This |
| enables the naive mathematical formulas for complex multiplication and |
| division, which are faster but do not correctly handle overflow and infinities. |
| |
| AST Matchers |
| ------------ |
| - Add ``convertVectorExpr``. |
| - Add ``dependentSizedExtVectorType``. |
| - Add ``macroQualifiedType``. |
| - Add ``CXXFoldExpr`` related matchers: ``cxxFoldExpr``, ``callee``, |
| ``hasInit``, ``hasPattern``, ``isRightFold``, ``isLeftFold``, |
| ``isUnaryFold``, ``isBinaryFold``, ``hasOperator``, ``hasLHS``, ``hasRHS``, ``hasEitherOperand``. |
| |
| clang-format |
| ------------ |
| - Add ``AllowBreakBeforeNoexceptSpecifier`` option. |
| - Add ``AllowShortCompoundRequirementOnASingleLine`` option. |
| - Change ``BreakAfterAttributes`` from ``Never`` to ``Leave`` in LLVM style. |
| - Add ``BreakAdjacentStringLiterals`` option. |
| - Add ``ObjCPropertyAttributeOrder`` which can be used to sort ObjC property |
| attributes (like ``nonatomic, strong, nullable``). |
| - Add ``PenaltyBreakScopeResolution`` option. |
| - Add ``.clang-format-ignore`` files. |
| - Add ``AlignFunctionPointers`` sub-option for ``AlignConsecutiveDeclarations``. |
| - Add ``SkipMacroDefinitionBody`` option. |
| |
| libclang |
| -------- |
| |
| - Exposed arguments of ``clang::annotate``. |
| - ``clang::getCursorKindForDecl`` now recognizes linkage specifications such as |
| ``extern "C"`` and reports them as ``CXCursor_LinkageSpec``. |
| |
| Static Analyzer |
| --------------- |
| |
| New features |
| ^^^^^^^^^^^^ |
| |
| - Implemented the ``[[clang::suppress]]`` attribute for suppressing diagnostics |
| of static analysis tools, such as the Clang Static Analyzer. |
| `Documentation <https://clang.llvm.org/docs/AttributeReference.html#suppress>`__. |
| |
| - Added support for the ``cleanup`` attribute. |
| `Documentation <https://clang.llvm.org/docs/AttributeReference.html#cleanup>`__. |
| |
| - Support "Deducing this" (P0847R7). (Worked out of the box) |
| (`af4751738db8 <https://github.com/llvm/llvm-project/commit/af4751738db89a142a8880c782d12d4201b222a8>`__) |
| |
| - Added a new checker ``core.BitwiseShift`` which reports situations where |
| bitwise shift operators produce undefined behavior (because some operand is |
| negative or too large). |
| `Documentation <https://clang.llvm.org/docs/analyzer/checkers.html#core-bitwiseshift-c-c>`__. |
| |
| - Added a new experimental checker ``alpha.core.StdVariant`` to detect variant |
| accesses via wrong alternatives. |
| `Documentation <https://clang.llvm.org/docs/analyzer/checkers.html#alpha-core-stdvariant-c>`__. |
| (`#66481 <https://github.com/llvm/llvm-project/pull/66481>`_) |
| |
| - Added a new experimental checker ``alpha.cplusplus.ArrayDelete`` to detect |
| destructions of arrays of polymorphic objects that are destructed as their |
| base class (`CERT EXP51-CPP <https://wiki.sei.cmu.edu/confluence/display/cplusplus/EXP51-CPP.+Do+not+delete+an+array+through+a+pointer+of+the+incorrect+type>`_). |
| `Documentation <https://clang.llvm.org/docs/analyzer/checkers.html#alpha-cplusplus-arraydelete-c>`__. |
| (`0e246bb67573 <https://github.com/llvm/llvm-project/commit/0e246bb67573799409d0085b89902a330998ddcc>`_) |
| |
| - Added a new checker configuration option ``InvalidatingGetEnv=[true,false]`` to |
| ``security.cert.env.InvalidPtr``. It's not set by default. |
| If set, ``getenv`` calls won't invalidate previously returned pointers. |
| `Documentation <https://clang.llvm.org/docs/analyzer/checkers.html#security-cert-env-invalidptr>`__. |
| (`#67663 <https://github.com/llvm/llvm-project/pull/67663>`_) |
| |
| Crash and bug fixes |
| ^^^^^^^^^^^^^^^^^^^ |
| |
| - Fixed a crash caused by ``builtin_bit_cast``. |
| (`#69922 <https://github.com/llvm/llvm-project/issues/69922>`_) |
| |
| - Fixed a ``core.StackAddressEscape`` crash on temporary object fields. |
| (`#66221 <https://github.com/llvm/llvm-project/issues/66221>`_) |
| |
| - A few crashes have been found and fixed using randomized testing related |
| to the use of ``_BitInt()`` in tidy checks and in clang analysis. |
| (`#67212 <https://github.com/llvm/llvm-project/pull/67212>`_, |
| `#66782 <https://github.com/llvm/llvm-project/pull/66782>`_, |
| `#65889 <https://github.com/llvm/llvm-project/pull/65889>`_, |
| `#65888 <https://github.com/llvm/llvm-project/pull/65888>`_, |
| `#65887 <https://github.com/llvm/llvm-project/pull/65887>`_) |
| |
| - Fixed note links of the HTML output. |
| (`#64054 <https://github.com/llvm/llvm-project/issues/64054>`_) |
| |
| - Allow widening rage-based for loops. |
| (`#70190 <https://github.com/llvm/llvm-project/pull/70190>`_) |
| |
| - Fixed uninitialized base class with initializer list when ctor is not |
| declared in the base class. |
| (`#70464 <https://github.com/llvm/llvm-project/issues/70464>`_, |
| `#59493 <https://github.com/llvm/llvm-project/issues/59493>`_, |
| `#54533 <https://github.com/llvm/llvm-project/issues/54533>`_) |
| |
| - Fixed an ``alpha.unix.cstring`` crash on variadic functions. |
| (`#74269 <https://github.com/llvm/llvm-project/issues/74269>`_) |
| |
| - Fix false positive in mutation check when using pointer to member function. |
| (`#66204 <https://github.com/llvm/llvm-project/issues/66204>`_) |
| |
| Improvements |
| ^^^^^^^^^^^^ |
| |
| - Improved the ``unix.StdCLibraryFunctions`` checker by modeling more |
| functions like ``send``, ``recv``, ``readlink``, ``fflush``, ``mkdtemp``, |
| ``getcwd`` and ``errno`` behavior. |
| (`52ac71f92d38 <https://github.com/llvm/llvm-project/commit/52ac71f92d38f75df5cb88e9c090ac5fd5a71548>`_, |
| `#77040 <https://github.com/llvm/llvm-project/pull/77040>`_, |
| `#76671 <https://github.com/llvm/llvm-project/pull/76671>`_, |
| `#71373 <https://github.com/llvm/llvm-project/pull/71373>`_, |
| `#76557 <https://github.com/llvm/llvm-project/pull/76557>`_, |
| `#71392 <https://github.com/llvm/llvm-project/pull/71392>`_) |
| |
| - Fixed a false negative for when accessing a nonnull property (ObjC). |
| (`1dceba3a3684 <https://github.com/llvm/llvm-project/commit/1dceba3a3684d12394731e09a6cf3efcebf07a3a>`_) |
| |
| - ``security.insecureAPI.DeprecatedOrUnsafeBufferHandling`` now considers |
| ``fprintf`` calls unsafe. |
| `Documentation <https://clang.llvm.org/docs/analyzer/checkers.html#security-insecureapi-deprecatedorunsafebufferhandling-c>`__. |
| |
| - Improved the diagnostics of the ``optin.core.EnumCastOutOfRange`` checker. |
| It will display the name and the declaration of the enumeration along with |
| the concrete value being cast to the enum. |
| (`#74503 <https://github.com/llvm/llvm-project/pull/74503>`_) |
| |
| - Improved the ``alpha.security.ArrayBoundV2`` checker for detecting buffer |
| accesses prior the buffer; and also reworked the diagnostic messages. |
| (`3e014038b373 <https://github.com/llvm/llvm-project/commit/3e014038b373e5a4a96d89d46cea17e4d2456a04>`_, |
| `#70056 <https://github.com/llvm/llvm-project/pull/70056>`_, |
| `#72107 <https://github.com/llvm/llvm-project/pull/72107>`_) |
| |
| - Improved the ``alpha.unix.cstring.OutOfBounds`` checking both ends of the |
| buffers in more cases. |
| (`c3a87ddad62a <https://github.com/llvm/llvm-project/commit/c3a87ddad62a6cc01acaccc76592bc6730c8ac3c>`_, |
| `0954dc3fb921 <https://github.com/llvm/llvm-project/commit/0954dc3fb9214b994623f5306473de075f8e3593>`_) |
| |
| - Improved the ``alpha.unix.Stream`` checker by modeling more functions |
| ``fputs``, ``fputc``, ``fgets``, ``fgetc``, ``fdopen``, ``ungetc``, ``fflush``, |
| ``getdelim``, ``getline`` and no not recognize alternative |
| ``fopen`` and ``tmpfile`` implementations. |
| (`#78693 <https://github.com/llvm/llvm-project/pull/78693>`_, |
| `#76776 <https://github.com/llvm/llvm-project/pull/76776>`_, |
| `#74296 <https://github.com/llvm/llvm-project/pull/74296>`_, |
| `#73335 <https://github.com/llvm/llvm-project/pull/73335>`_, |
| `#72627 <https://github.com/llvm/llvm-project/pull/72627>`_, |
| `#71518 <https://github.com/llvm/llvm-project/pull/71518>`_, |
| `#72016 <https://github.com/llvm/llvm-project/pull/72016>`_, |
| `#70540 <https://github.com/llvm/llvm-project/pull/70540>`_, |
| `#73638 <https://github.com/llvm/llvm-project/pull/73638>`_, |
| `#77331 <https://github.com/llvm/llvm-project/pull/77331>`_) |
| |
| - The ``alpha.security.taint.TaintPropagation`` checker no longer propagates |
| taint on ``strlen`` and ``strnlen`` calls, unless these are marked |
| explicitly propagators in the user-provided taint configuration file. |
| This removal empirically reduces the number of false positive reports. |
| Read the PR for the details. |
| (`#66086 <https://github.com/llvm/llvm-project/pull/66086>`_) |
| |
| - Other taint-related improvements. |
| (`#66358 <https://github.com/llvm/llvm-project/pull/66358>`_, |
| `#66074 <https://github.com/llvm/llvm-project/pull/66074>`_, |
| `#66358 <https://github.com/llvm/llvm-project/pull/66358>`_) |
| |
| - Checkers can query constraint bounds to improve diagnostic messages. |
| (`#74141 <https://github.com/llvm/llvm-project/pull/74141>`_) |
| |
| - Improved the generated initializers for modules. Now the calls to initialize |
| functions from imported module units can be omitted if the initialize |
| function is known to be empty. |
| (`#56794 <https://github.com/llvm/llvm-project/issues/56794>`_) |
| |
| - Clang now allow to export declarations within linkage-specification. |
| (`#71347 <https://github.com/llvm/llvm-project/issues/71347>`_) |
| |
| Moved checkers |
| ^^^^^^^^^^^^^^ |
| |
| - Move checker ``alpha.unix.Errno`` out of the ``alpha`` package |
| to ``unix.Errno``. |
| `Documentation <https://clang.llvm.org/docs/analyzer/checkers.html#unix-errno-c>`__. |
| |
| - Move checker ``alpha.unix.StdCLibraryFunctions`` out of the ``alpha`` package |
| to ``unix.StdCLibraryFunctions``. |
| `Documentation <https://clang.llvm.org/docs/analyzer/checkers.html#unix-stdclibraryfunctions-c>`__. |
| |
| - Move checker ``alpha.security.cert.env.InvalidPtr`` out of the ``alpha`` |
| package to ``security.cert.env.InvalidPtr``. |
| `Documentation <https://clang.llvm.org/docs/analyzer/checkers.html#security-cert-env-invalidptr>`__. |
| |
| - Move checker ``alpha.cplusplus.EnumCastOutOfRange`` out of the ``alpha`` |
| package to ``optin.core.EnumCastOutOfRange``. |
| `Documentation <https://clang.llvm.org/docs/analyzer/checkers.html#optin-core-enumcastoutofrange-c-c>`__. |
| |
| .. _release-notes-sanitizers: |
| |
| Sanitizers |
| ---------- |
| |
| - ``-fsanitize=signed-integer-overflow`` now instruments ``__builtin_abs`` and |
| ``abs`` builtins. |
| |
| Python Binding Changes |
| ---------------------- |
| |
| Additional Information |
| ====================== |
| |
| A wide variety of additional information is available on the `Clang web |
| page <https://clang.llvm.org/>`_. 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) |
| <https://discourse.llvm.org/c/clang/6>`_. |