llvm-project/clang/docs/ReleaseNotes.rst

392 lines
17 KiB
ReStructuredText
Raw Normal View History

===========================================
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 Download Page <https://releases.llvm.org/download.html>`_.
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>`_. 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>`_.
Note that if you are reading this file from a Git checkout or the
main Clang web page, this document applies to the *next* release, not
the current one. To see the release notes for a specific release, please
see the `releases page <https://llvm.org/releases/>`_.
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.
Major New Features
------------------
- Clang now supports the ``-fzero-call-used-regs`` feature for x86. The purpose
of this feature is to limit Return-Oriented Programming (ROP) exploits and
information leakage. It works by zeroing out a selected class of registers
before function return --- e.g., all GPRs that are used within the function.
There is an analogous ``zero_call_used_regs`` attribute to allow for finer
control of this feature.
- Clang now supports randomizing structure layout in C. This feature is a
compile-time hardening technique, making it more difficult for an attacker to
retrieve data from structures. Specify randomization with the
``randomize_layout`` attribute. The corresponding ``no_randomize_layout``
attribute can be used to turn the feature off.
A seed value is required to enable randomization, and is deterministic based
on a seed value. Use the ``-frandomize-layout-seed=`` or
``-frandomize-layout-seed-file=`` flags.
.. note::
Randomizing structure layout is a C-only feature.
Bug Fixes
------------------
- ``CXXNewExpr::getArraySize()`` previously returned a ``llvm::Optional``
wrapping a ``nullptr`` when the ``CXXNewExpr`` did not have an array
size expression. This was fixed and ``::getArraySize()`` will now always
either return ``None`` or a ``llvm::Optional`` wrapping a valid ``Expr*``.
This fixes `Issue 53742 <https://github.com/llvm/llvm-project/issues/53742>`_.
- We now ignore full expressions when traversing cast subexpressions. This
fixes `Issue 53044 <https://github.com/llvm/llvm-project/issues/53044>`_.
- Allow `-Wno-gnu` to silence GNU extension diagnostics for pointer arithmetic
diagnostics. Fixes `Issue 54444 <https://github.com/llvm/llvm-project/issues/54444>`_.
- Placeholder constraints, as in `Concept auto x = f();`, were not checked when modifiers
like ``auto&`` or ``auto**`` were added. These constraints are now checked.
This fixes `Issue 53911 <https://github.com/llvm/llvm-project/issues/53911>`_
and `Issue 54443 <https://github.com/llvm/llvm-project/issues/54443>`_.
- Previously invalid member variables with template parameters would crash clang.
Now fixed by setting identifiers for them.
This fixes `Issue 28475 (PR28101) <https://github.com/llvm/llvm-project/issues/28475>`_.
- Now allow the `restrict` and `_Atomic` qualifiers to be used in conjunction
with `__auto_type` to match the behavior in GCC. This fixes
`Issue 53652 <https://github.com/llvm/llvm-project/issues/53652>`_.
- No longer crash when specifying a variably-modified parameter type in a
function with the ``naked`` attribute. This fixes
`Issue 50541 <https://github.com/llvm/llvm-project/issues/50541>`_.
- Allow multiple ``#pragma weak`` directives to name the same undeclared (if an
alias, target) identifier instead of only processing one such ``#pragma weak``
per identifier.
Fixes `Issue 28985 <https://github.com/llvm/llvm-project/issues/28985>`_.
- Assignment expressions in C11 and later mode now properly strip the _Atomic
qualifier when determining the type of the assignment expression. Fixes
`Issue 48742 <https://github.com/llvm/llvm-project/issues/48742>`_.
- Improved the diagnostic when accessing a member of an atomic structure or
union object in C; was previously an unhelpful error, but now issues a
`-Watomic-access` warning which defaults to an error. Fixes
`Issue 54563 <https://github.com/llvm/llvm-project/issues/54563>`_.
- Unevaluated lambdas in dependant contexts no longer result in clang crashing.
This fixes Issues `50376 <https://github.com/llvm/llvm-project/issues/50376>`_,
`51414 <https://github.com/llvm/llvm-project/issues/51414>`_,
`51416 <https://github.com/llvm/llvm-project/issues/51416>`_,
and `51641 <https://github.com/llvm/llvm-project/issues/51641>`_.
- The builtin function __builtin_dump_struct would crash clang when the target
struct contains a bitfield. It now correctly handles bitfields.
This fixes Issue `Issue 54462 <https://github.com/llvm/llvm-project/issues/54462>`_.
- Statement expressions are now disabled in default arguments in general.
This fixes Issue `Issue 53488 <https://github.com/llvm/llvm-project/issues/53488>`_.
- According to `CWG 1394 <https://wg21.link/cwg1394>`_ and
`C++20 [dcl.fct.def.general]p2 <https://timsong-cpp.github.io/cppwp/n4868/dcl.fct.def#general-2.sentence-3>`_,
Clang should not diagnose incomplete types in function definitions if the function body is "= delete;".
This fixes Issue `Issue 52802 <https://github.com/llvm/llvm-project/issues/52802>`_.
- Unknown type attributes with a ``[[]]`` spelling are no longer diagnosed twice.
This fixes Issue `Issue 54817 <https://github.com/llvm/llvm-project/issues/54817>`_.
- Clang should no longer incorrectly diagnose a variable declaration inside of
a lambda expression that shares the name of a variable in a containing
if/while/for/switch init statement as a redeclaration.
This fixes `Issue 54913 <https://github.com/llvm/llvm-project/issues/54913>`_.
Improvements to Clang's diagnostics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- ``-Wliteral-range`` will warn on floating-point equality comparisons with
constants that are not representable in a casted value. For example,
``(float) f == 0.1`` is always false.
- ``-Winline-namespace-reopened-noninline`` now takes into account that the
``inline`` keyword must appear on the original but not necessarily all
extension definitions of an inline namespace and therefore points its note
at the original definition. This fixes `Issue 50794 (PR51452)
<https://github.com/llvm/llvm-project/issues/50794>`_.
- ``-Wunused-but-set-variable`` now also warns if the variable is only used
by unary operators.
- ``-Wunused-variable`` no longer warn for references extending the lifetime
of temporaries with side effects. This fixes `Issue 54489
<https://github.com/llvm/llvm-project/issues/54489>`_.
- Modified the behavior of ``-Wstrict-prototypes`` and added a new, related
diagnostic ``-Wdeprecated-non-prototype``. The strict prototypes warning will
now only diagnose deprecated declarations and definitions of functions
without a prototype where the behavior in C2x will remain correct. This
diagnostic remains off by default but is now enabled via ``-pedantic`` due to
it being a deprecation warning. ``-Wdeprecated-non-prototype`` will diagnose
cases where the deprecated declarations or definitions of a function without
a prototype will change behavior in C2x. Additionally, it will diagnose calls
which pass arguments to a function without a prototype. This warning is
enabled only when the ``-Wdeprecated-non-prototype`` option is enabled at the
function declaration site, which allows a developer to disable the diagnostic
for all callers at the point of declaration. This diagnostic is grouped under
the ``-Wstrict-prototypes`` warning group, but is enabled by default.
- Clang now appropriately issues an error in C when a definition of a function
without a prototype and with no arguments is an invalid redeclaration of a
function with a prototype. e.g., ``void f(int); void f() {}`` is now properly
diagnosed.
- ``-Wmisexpect`` warns when the branch weights collected during profiling
conflict with those added by ``llvm.expect``.
Non-comprehensive list of changes in this release
2022-03-25 07:13:26 -04:00
-------------------------------------------------
- Improve __builtin_dump_struct:
- Support bitfields in struct and union.
- Improve the dump format, dump both bitwidth(if its a bitfield) and field value.
- Remove anonymous tag locations.
- Beautify dump format, add indent for nested struct and struct members.
New Compiler Flags
------------------
Deprecated Compiler Flags
-------------------------
Modified Compiler Flags
-----------------------
Removed Compiler Flags
-------------------------
New Pragmas in Clang
--------------------
- ...
Attribute Changes in Clang
--------------------------
- Added support for parameter pack expansion in `clang::annotate`.
- The ``overloadable`` attribute can now be written in all of the syntactic
locations a declaration attribute may appear.
This fixes `Issue 53805 <https://github.com/llvm/llvm-project/issues/53805>`_.
- Improved namespace attributes handling:
- Handle GNU attributes before a namespace identifier and subsequent
attributes of different kinds.
- Emit error on GNU attributes for a nested namespace definition.
- Statement attributes ``[[clang::noinline]]`` and ``[[clang::always_inline]]``
can be used to control inlining decisions at callsites.
- ``#pragma clang attribute push`` now supports multiple attributes within a single directive.
- The ``__declspec(naked)`` attribute can no longer be written on a member
function in Microsoft compatibility mode, matching the behavior of cl.exe.
Windows Support
---------------
- Add support for MSVC-compatible ``/JMC``/``/JMC-`` flag in clang-cl (supports
X86/X64/ARM/ARM64). ``/JMC`` could only be used when ``/Zi`` or ``/Z7`` is
turned on. With this addition, clang-cl can be used in Visual Studio for the
JustMyCode feature. Note, you may need to manually add ``/JMC`` as additional
compile options in the Visual Studio since it currently assumes clang-cl does not support ``/JMC``.
C Language Changes in Clang
---------------------------
C2x Feature Support
-------------------
- Implemented `WG14 N2674 The noreturn attribute <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2764.pdf>`_.
- Implemented `WG14 N2935 Make false and true first-class language features <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2935.pdf>`_.
- Implemented `WG14 N2763 Adding a fundamental type for N-bit integers <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2763.pdf>`_.
- Implemented `WG14 N2775 Literal suffixes for bit-precise integers <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2775.pdf>`_.
- Implemented the `*_WIDTH` macros to complete support for
`WG14 N2412 Two's complement sign representation for C2x <https://www9.open-std.org/jtc1/sc22/wg14/www/docs/n2412.pdf>`_.
- Implemented `WG14 N2418 Adding the u8 character prefix <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2418.pdf>`_.
C++ Language Changes in Clang
-----------------------------
Treat `std::move`, `forward`, etc. as builtins. This is extended to all `std::` functions that take a reference to a value and return a reference (or pointer) to that same value: `move`, `forward`, `move_if_noexcept`, `as_const`, `addressof`, and the libstdc++-specific function `__addressof`. We still require these functions to be declared before they can be used, but don't instantiate their definitions unless their addresses are taken. Instead, code generation, constant evaluation, and static analysis are given direct knowledge of their effect. This change aims to reduce various costs associated with these functions -- per-instantiation memory costs, compile time and memory costs due to creating out-of-line copies and inlining them, code size at -O0, and so on -- so that they are not substantially more expensive than a cast. Most of these improvements are very small, but I measured a 3% decrease in -O0 object file size for a simple C++ source file using the standard library after this change. We now automatically infer the `const` and `nothrow` attributes on these now-builtin functions, in particular meaning that we get a warning for an unused call to one of these functions. In C++20 onwards, we disallow taking the addresses of these functions, per the C++20 "addressable function" rule. In earlier language modes, a compatibility warning is produced but the address can still be taken. The same infrastructure is extended to the existing MSVC builtin `__GetExceptionInfo`, which is now only recognized in namespace `std` like it always should have been. This is a re-commit of fc3090109643af8d2da9822d0f99c84742b9c877, a571f82a50416b767fd3cce0fb5027bb5dfec58c, and 64c045e25b8471bbb572bd29159c294a82a86a25 which were reverted in e75d8b70370435b0ad10388afba0df45fcf9bfcc due to a crasher bug where CodeGen would emit a builtin glvalue as an rvalue if it constant-folds. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D123345
2022-04-17 13:09:42 -07:00
- Improved ``-O0`` code generation for calls to ``std::move``, ``std::forward``,
``std::move_if_noexcept``, ``std::addressof``, and ``std::as_const``. These
are now treated as compiler builtins and implemented directly, rather than
instantiating the definition from the standard library.
C++20 Feature Support
^^^^^^^^^^^^^^^^^^^^^
- Diagnose consteval and constexpr issues that happen at namespace scope. This
partially addresses `Issue 51593 <https://github.com/llvm/llvm-project/issues/51593>`_.
- No longer attempt to evaluate a consteval UDL function call at runtime when
it is called through a template instantiation. This fixes
`Issue 54578 <https://github.com/llvm/llvm-project/issues/54578>`_.
- Implemented `__builtin_source_location()` which enables library support for std::source_location.
- The mangling scheme for C++20 modules has incompatibly changed. The
initial mangling was discovered not to be reversible, and the weak
ownership design decision did not give the backwards compatibility
that was hoped for. C++20 since added ``extern "C++"`` semantics
that can be used for such compatibility. The demangler now demangles
symbols with named module attachment.
C++2b Feature Support
^^^^^^^^^^^^^^^^^^^^^
- Implemented `P2128R6: Multidimensional subscript operator <https://wg21.link/P2128R6>`_.
- Implemented `P0849R8: auto(x): decay-copy in the language <https://wg21.link/P0849R8>`_.
- Implemented `P2242R3: Non-literal variables (and labels and gotos) in constexpr functions <https://wg21.link/P2242R3>`_.
[clang] Implement Change scope of lambda trailing-return-type Implement P2036R3. Captured variables by copy (explicitely or not), are deduced correctly at the point we know whether the lambda is mutable, and ill-formed before that. Up until now, the entire lambda declaration up to the start of the body would be parsed in the parent scope, such that capture would not be available to look up. The scoping is changed to have an outer lambda scope, followed by the lambda prototype and body. The lambda scope is necessary because there may be a template scope between the start of the lambda (to which we want to attach the captured variable) and the prototype scope. We also need to introduce a declaration context to attach the captured variable to (and several parts of clang assume captures are handled from the call operator context), before we know the type of the call operator. The order of operations is as follow: * Parse the init capture in the lambda's parent scope * Introduce a lambda scope * Create the lambda class and call operator * Add the init captures to the call operator context and the lambda scope. But the variables are not capured yet (because we don't know their type). Instead, explicit captures are stored in a temporary map that conserves the order of capture (for the purpose of having a stable order in the ast dumps). * A flag is set on LambdaScopeInfo to indicate that we have not yet injected the captures. * The parameters are parsed (in the parent context, as lambda mangling recurses in the parent context, we couldn't mangle a lambda that is attached to the context of a lambda whose type is not yet known). * The lambda qualifiers are parsed, at this point We can switch (for the second time) inside the lambda context, unset the flag indicating that we have not parsed the lambda qualifiers, record the lambda is mutable and capture the explicit variables. * We can parse the rest of the lambda type, transform the lambda and call operator's types and also transform the call operator to a template function decl where necessary. At this point, both captures and parameters can be injected in the body's scope. When trying to capture an implicit variable, if we are before the qualifiers of a lambda, we need to remember that the variables are still in the parent's context (rather than in the call operator's). Reviewed By: aaron.ballman, #clang-language-wg, ChuanqiXu Differential Revision: https://reviews.llvm.org/D119136
2022-02-06 22:58:43 +01:00
- Implemented `P2036R3: Change scope of lambda trailing-return-type <https://wg21.link/P2036R3>`_.
This proposal modifies how variables captured in lambdas can appear in trailing return type
expressions and how their types are deduced therein, in all C++ language versions.
`CWG2569 <https://cplusplus.github.io/CWG/issues/2569.html>`_ is also partially implemented so that
`[x](decltype(x)){}` doesn't become ill-formed with the adoption of P2036R3.
CUDA Language Changes in Clang
2021-08-23 13:45:13 -07:00
------------------------------
Objective-C Language Changes in Clang
-------------------------------------
OpenCL C Language Changes in Clang
----------------------------------
...
ABI Changes in Clang
--------------------
OpenMP Support in Clang
-----------------------
...
CUDA Support in Clang
---------------------
- ...
X86 Support in Clang
--------------------
DWARF Support in Clang
----------------------
Arm and AArch64 Support in Clang
--------------------------------
Floating Point Support in Clang
-------------------------------
Internal API Changes
--------------------
- Added a new attribute flag `AcceptsExprPack` that when set allows expression
pack expansions in the parsed arguments of the corresponding attribute.
Additionally it introduces delaying of attribute arguments, adding common
handling for creating attributes that cannot be fully initialized prior to
template instantiation.
Build System Changes
--------------------
* CMake ``-DCLANG_DEFAULT_PIE_ON_LINUX=ON`` is now the default. This is used by
linux-gnu systems to decide whether ``-fPIE -pie`` is the default (instead of
``-fno-pic -no-pie``). This matches GCC installations on many Linux distros.
Note: linux-android and linux-musl always default to ``-fPIE -pie``, ignoring
this variable. ``-DCLANG_DEFAULT_PIE_ON_LINUX`` may be removed in the future.
AST Matchers
------------
- Expanded ``isInline`` narrowing matcher to support c++17 inline variables.
clang-format
------------
- **Important change**: Renamed ``IndentRequires`` to ``IndentRequiresClause``
and changed the default for all styles from ``false`` to ``true``.
- Reworked and improved handling of concepts and requires. Added the
``RequiresClausePosition`` option as part of that.
- Changed ``BreakBeforeConceptDeclarations`` from ``Boolean`` to an enum.
- Option ``InsertBraces`` has been added to insert optional braces after control
statements.
libclang
--------
- ...
Static Analyzer
---------------
- ...
.. _release-notes-ubsan:
Undefined Behavior Sanitizer (UBSan)
------------------------------------
Core Analysis Improvements
==========================
- ...
New Issues Found
================
- ...
Python Binding Changes
----------------------
The following methods have been added:
- ...
Significant Known Problems
==========================
Additional Information
======================
A wide variety of additional information is available on the `Clang web
page <https://clang.llvm.org/>`_. The web page contains versions of the
2020-03-22 22:18:40 +01:00
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 via the `mailing
list <https://lists.llvm.org/mailman/listinfo/cfe-dev>`_.