2022-02-02 15:13:01 +08:00
|
|
|
===========================================
|
|
|
|
Clang |release| |ReleaseNotesTitle|
|
|
|
|
===========================================
|
2020-02-14 05:46:33 +08:00
|
|
|
|
|
|
|
.. contents::
|
|
|
|
:local:
|
|
|
|
:depth: 2
|
|
|
|
|
|
|
|
Written by the `LLVM Team <https://llvm.org/>`_
|
|
|
|
|
2022-02-02 15:13:01 +08:00
|
|
|
.. only:: PreRelease
|
2020-02-14 05:46:33 +08:00
|
|
|
|
2022-02-02 15:13:01 +08:00
|
|
|
.. 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>`_.
|
2020-02-14 05:46:33 +08:00
|
|
|
|
|
|
|
Introduction
|
|
|
|
============
|
|
|
|
|
|
|
|
This document contains the release notes for the Clang C/C++/Objective-C
|
2022-02-02 15:13:01 +08:00
|
|
|
frontend, part of the LLVM Compiler Infrastructure, release |release|. Here we
|
2020-02-14 05:46:33 +08:00
|
|
|
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/>`_.
|
|
|
|
|
2022-02-02 15:13:01 +08:00
|
|
|
What's New in Clang |release|?
|
|
|
|
==============================
|
2020-02-14 05:46:33 +08:00
|
|
|
|
|
|
|
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
|
|
|
|
------------------
|
|
|
|
|
2022-02-15 16:06:01 +08:00
|
|
|
- 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.
|
2020-02-14 05:46:33 +08:00
|
|
|
|
2022-04-09 14:36:51 +08:00
|
|
|
- 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.
|
|
|
|
|
2022-02-11 15:27:33 +08:00
|
|
|
Bug Fixes
|
2022-05-06 20:47:19 +08:00
|
|
|
---------
|
2022-02-11 15:27:33 +08:00
|
|
|
- ``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*``.
|
2022-02-23 01:50:39 +08:00
|
|
|
This fixes `Issue 53742 <https://github.com/llvm/llvm-project/issues/53742>`_.
|
2022-03-22 03:09:02 +08:00
|
|
|
- We now ignore full expressions when traversing cast subexpressions. This
|
|
|
|
fixes `Issue 53044 <https://github.com/llvm/llvm-project/issues/53044>`_.
|
2022-05-06 07:04:19 +08:00
|
|
|
- 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.
|
2022-03-20 01:26:02 +08:00
|
|
|
This fixes `Issue 53911 <https://github.com/llvm/llvm-project/issues/53911>`_
|
|
|
|
and `Issue 54443 <https://github.com/llvm/llvm-project/issues/54443>`_.
|
2022-03-23 09:12:05 +08:00
|
|
|
- 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>`_.
|
2022-05-06 07:04:19 +08:00
|
|
|
- Now allow the ``restrict`` and ``_Atomic`` qualifiers to be used in
|
|
|
|
conjunction with ``__auto_type`` to match the behavior in GCC. This fixes
|
2022-03-24 01:24:53 +08:00
|
|
|
`Issue 53652 <https://github.com/llvm/llvm-project/issues/53652>`_.
|
2022-03-24 22:38:37 +08:00
|
|
|
- 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>`_.
|
2022-03-25 08:11:54 +08:00
|
|
|
- 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>`_.
|
2022-03-26 20:01:47 +08:00
|
|
|
- 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>`_.
|
2022-03-30 00:13:54 +08:00
|
|
|
- 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
|
2022-05-06 07:04:19 +08:00
|
|
|
``-Watomic-access`` warning which defaults to an error. Fixes
|
2022-03-30 00:13:54 +08:00
|
|
|
`Issue 54563 <https://github.com/llvm/llvm-project/issues/54563>`_.
|
2022-03-13 03:49:01 +08:00
|
|
|
- Unevaluated lambdas in dependant contexts no longer result in clang crashing.
|
2022-03-26 02:34:16 +08:00
|
|
|
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>`_.
|
2022-03-30 01:30:34 +08:00
|
|
|
- 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>`_.
|
2022-04-06 08:45:46 +08:00
|
|
|
- Statement expressions are now disabled in default arguments in general.
|
|
|
|
This fixes Issue `Issue 53488 <https://github.com/llvm/llvm-project/issues/53488>`_.
|
2022-04-09 02:13:42 +08:00
|
|
|
- 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>`_.
|
2022-04-12 21:11:51 +08:00
|
|
|
- Unknown type attributes with a ``[[]]`` spelling are no longer diagnosed twice.
|
|
|
|
This fixes Issue `Issue 54817 <https://github.com/llvm/llvm-project/issues/54817>`_.
|
2022-04-21 01:17:47 +08:00
|
|
|
- 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>`_.
|
2022-04-24 09:12:15 +08:00
|
|
|
- Overload resolution for constrained function templates could use the partial
|
|
|
|
order of constraints to select an overload, even if the parameter types of
|
|
|
|
the functions were different. It now diagnoses this case correctly as an
|
|
|
|
ambiguous call and an error. Fixes
|
|
|
|
`Issue 53640 <https://github.com/llvm/llvm-project/issues/53640>`_.
|
2022-05-05 00:39:18 +08:00
|
|
|
- No longer crash when trying to determine whether the controlling expression
|
|
|
|
argument to a generic selection expression has side effects in the case where
|
|
|
|
the expression is result dependent. This fixes
|
|
|
|
`Issue 50227 <https://github.com/llvm/llvm-project/issues/50227>`_.
|
2022-05-05 01:22:30 +08:00
|
|
|
- Fixed an assertion when constant evaluating an initializer for a GCC/Clang
|
|
|
|
floating-point vector type when the width of the initialization is exactly
|
|
|
|
the same as the elements of the vector being initialized.
|
|
|
|
Fixes `Issue 50216 <https://github.com/llvm/llvm-project/issues/50216>`_.
|
2022-05-05 04:45:42 +08:00
|
|
|
- Fixed a crash when the ``__bf16`` type is used such that its size or
|
|
|
|
alignment is calculated on a target which does not support that type. This
|
|
|
|
fixes `Issue 50171 <https://github.com/llvm/llvm-project/issues/50171>`_.
|
2022-05-06 00:10:06 +08:00
|
|
|
- Fixed a false positive diagnostic about an unevaluated expression having no
|
|
|
|
side effects when the expression is of VLA type and is an operand of the
|
|
|
|
``sizeof`` operator. Fixes `Issue 48010 <https://github.com/llvm/llvm-project/issues/48010>`_.
|
2022-05-06 01:53:03 +08:00
|
|
|
- Fixed a false positive diagnostic about scoped enumerations being a C++11
|
|
|
|
extension in C mode. A scoped enumeration's enumerators cannot be named in C
|
|
|
|
because there is no way to fully qualify the enumerator name, so this
|
|
|
|
"extension" was unintentional and useless. This fixes
|
|
|
|
`Issue 42372 <https://github.com/llvm/llvm-project/issues/42372>`_.
|
2022-05-12 18:00:45 +08:00
|
|
|
- Clang shouldn't lookup allocation function in global scope for coroutines
|
|
|
|
in case it found the allocation function name in the promise_type body.
|
|
|
|
This fixes Issue `Issue 54881 <https://github.com/llvm/llvm-project/issues/54881>`_.
|
2022-03-13 03:49:01 +08:00
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
Improvements to Clang's diagnostics
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
2022-03-17 19:40:03 +08:00
|
|
|
- ``-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.
|
2022-03-24 05:27:35 +08:00
|
|
|
- ``-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>`_.
|
2022-03-25 17:45:08 +08:00
|
|
|
- ``-Wunused-but-set-variable`` now also warns if the variable is only used
|
|
|
|
by unary operators.
|
2022-03-29 23:28:56 +08:00
|
|
|
- ``-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>`_.
|
2022-04-09 04:19:58 +08:00
|
|
|
- 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
|
2022-04-30 01:36:53 +08:00
|
|
|
it being a deprecation warning. ``-Wstrict-prototypes`` has no effect in C2x
|
|
|
|
or when ``-fno-knr-functions`` is enabled. ``-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. ``-Wdeprecated-non-prototype`` has no effect in C2x or
|
|
|
|
when ``-fno-knr-functions`` is enabled.
|
2022-04-13 20:20:19 +08:00
|
|
|
- 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.
|
[C11/C2x] Change the behavior of the implicit function declaration warning
C89 had a questionable feature where the compiler would implicitly
declare a function that the user called but was never previously
declared. The resulting function would be globally declared as
extern int func(); -- a function without a prototype which accepts zero
or more arguments.
C99 removed support for this questionable feature due to severe
security concerns. However, there was no deprecation period; C89 had
the feature, C99 didn't. So Clang (and GCC) both supported the
functionality as an extension in C99 and later modes.
C2x no longer supports that function signature as it now requires all
functions to have a prototype, and given the known security issues with
the feature, continuing to support it as an extension is not tenable.
This patch changes the diagnostic behavior for the
-Wimplicit-function-declaration warning group depending on the language
mode in effect. We continue to warn by default in C89 mode (due to the
feature being dangerous to use). However, because this feature will not
be supported in C2x mode, we've diagnosed it as being invalid for so
long, the security concerns with the feature, and the trivial
workaround for users (declare the function), we now default the
extension warning to an error in C99-C17 mode. This still gives users
an easy workaround if they are extensively using the extension in those
modes (they can disable the warning or use -Wno-error to downgrade the
error), but the new diagnostic makes it more clear that this feature is
not supported and should be avoided. In C2x mode, we no longer allow an
implicit function to be defined and treat the situation the same as any
other lookup failure.
Differential Revision: https://reviews.llvm.org/D122983
2022-04-20 23:25:35 +08:00
|
|
|
- The ``-Wimplicit-function-declaration`` warning diagnostic now defaults to
|
|
|
|
an error in C99 and later. Prior to C2x, it may be downgraded to a warning
|
|
|
|
with ``-Wno-error=implicit-function-declaration``, or disabled entirely with
|
|
|
|
``-Wno-implicit-function-declaration``. As of C2x, support for implicit
|
|
|
|
function declarations has been removed, and the warning options will have no
|
|
|
|
effect.
|
2022-05-04 20:34:26 +08:00
|
|
|
- The ``-Wimplicit-int`` warning diagnostic now defaults to an error in C99 and
|
|
|
|
later. Prior to C2x, it may be downgraded to a warning with
|
|
|
|
``-Wno-error=implicit-int``, or disabled entirely with ``-Wno-implicit-int``.
|
|
|
|
As of C2x, support for implicit int has been removed, and the warning options
|
|
|
|
will have no effect. Specifying ``-Wimplicit-int`` in C89 mode will now issue
|
|
|
|
warnings instead of being a noop.
|
|
|
|
- No longer issue a "declaration specifiers missing, defaulting to int"
|
|
|
|
diagnostic in C89 mode because it is not an extension in C89, it was valid
|
|
|
|
code. The diagnostic has been removed entirely as it did not have a
|
|
|
|
diagnostic group to disable it, but it can be covered wholly by
|
|
|
|
``-Wimplicit-int``.
|
2022-04-02 06:03:48 +08:00
|
|
|
- ``-Wmisexpect`` warns when the branch weights collected during profiling
|
|
|
|
conflict with those added by ``llvm.expect``.
|
2022-05-09 21:34:09 +08:00
|
|
|
- ``-Wthread-safety-analysis`` now considers overloaded compound assignment and
|
|
|
|
increment/decrement operators as writing to their first argument, thus
|
|
|
|
requiring an exclusive lock if the argument is guarded.
|
2022-05-09 22:15:10 +08:00
|
|
|
- ``-Wenum-conversion`` now warns on converting a signed enum of one type to an
|
|
|
|
unsigned enum of a different type (or vice versa) rather than
|
|
|
|
``-Wsign-conversion``.
|
2022-05-10 23:14:24 +08:00
|
|
|
- Added the ``-Wunreachable-code-generic-assoc`` diagnostic flag (grouped under
|
|
|
|
the ``-Wunreachable-code`` flag) which is enabled by default and warns the
|
|
|
|
user about ``_Generic`` selection associations which are unreachable because
|
|
|
|
the type specified is an array type or a qualified type.
|
2022-05-11 18:38:35 +08:00
|
|
|
- Added the ``-Wgnu-line-marker`` diagnostic flag (grouped under the ``-Wgnu``
|
|
|
|
flag) which is a portability warning about use of GNU linemarker preprocessor
|
|
|
|
directives. Fixes `Issue 55067 <https://github.com/llvm/llvm-project/issues/55067>`_.
|
2022-05-12 21:25:05 +08:00
|
|
|
- Using ``#elifdef`` and ``#elifndef`` that are incompatible with C/C++
|
|
|
|
standards before C2x/C++2b are now warned via ``-pedantic``. Additionally,
|
|
|
|
on such language mode, ``-Wpre-c2x-compat`` and ``-Wpre-c++2b-compat``
|
|
|
|
diagnostic flags report a compatibility issue.
|
|
|
|
Fixes `Issue 55306 <https://github.com/llvm/llvm-project/issues/55306>`_.
|
2022-05-13 01:19:26 +08:00
|
|
|
- Clang now checks for stack resource exhaustion when recursively parsing
|
|
|
|
declarators in order to give a diagnostic before we run out of stack space.
|
|
|
|
This fixes `Issue 51642 <https://github.com/llvm/llvm-project/issues/51642>`_.
|
2022-05-13 21:09:32 +08:00
|
|
|
- Unknown preprocessor directives in a skipped conditional block are now given
|
|
|
|
a typo correction suggestion if the given directive is sufficiently similar
|
|
|
|
to another preprocessor conditional directive. For example, if ``#esle``
|
|
|
|
appears in a skipped block, we will warn about the unknown directive and
|
|
|
|
suggest ``#else`` as an alternative. ``#elifdef`` and ``#elifndef`` are only
|
|
|
|
suggested when in C2x or C++2b mode. Fixes
|
|
|
|
`Issue 51598 <https://github.com/llvm/llvm-project/issues/51598>`_.
|
2022-04-02 06:03:48 +08:00
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
Non-comprehensive list of changes in this release
|
2022-03-25 19:13:26 +08:00
|
|
|
-------------------------------------------------
|
2022-05-06 06:57:17 +08:00
|
|
|
|
2022-03-30 01:30:34 +08:00
|
|
|
- Improve __builtin_dump_struct:
|
2022-05-06 06:57:17 +08:00
|
|
|
|
2022-03-30 01:30:34 +08:00
|
|
|
- Support bitfields in struct and union.
|
2022-05-06 06:57:17 +08:00
|
|
|
- Improve the dump format, dump both bitwidth(if its a bitfield) and field
|
|
|
|
value.
|
2022-05-06 05:52:57 +08:00
|
|
|
- Remove anonymous tag locations and flatten anonymous struct members.
|
|
|
|
- Beautify dump format, add indent for struct members.
|
|
|
|
- Support passing additional arguments to the formatting function, allowing
|
|
|
|
use with ``fprintf`` and similar formatting functions.
|
|
|
|
- Support use within constant evaluation in C++, if a ``constexpr``
|
|
|
|
formatting function is provided.
|
|
|
|
- Support formatting of base classes in C++.
|
|
|
|
- Support calling a formatting function template in C++, which can provide
|
|
|
|
custom formatting for non-aggregate types.
|
2022-05-06 06:57:17 +08:00
|
|
|
|
2022-04-29 10:14:52 +08:00
|
|
|
- Previously disabled sanitizer options now enabled by default:
|
|
|
|
- ASAN_OPTIONS=detect_stack_use_after_return=1 (only on Linux).
|
|
|
|
- MSAN_OPTIONS=poison_in_dtor=1.
|
2020-02-14 05:46:33 +08:00
|
|
|
|
|
|
|
New Compiler Flags
|
|
|
|
------------------
|
2022-04-21 01:26:38 +08:00
|
|
|
- Added the ``-fno-knr-functions`` flag to allow users to opt into the C2x
|
|
|
|
behavior where a function with an empty parameter list is treated as though
|
|
|
|
the parameter list were ``void``. There is no ``-fknr-functions`` or
|
|
|
|
``-fno-no-knr-functions`` flag; this feature cannot be disabled in language
|
|
|
|
modes where it is required, such as C++ or C2x.
|
2020-02-14 05:46:33 +08:00
|
|
|
|
|
|
|
Deprecated Compiler Flags
|
|
|
|
-------------------------
|
|
|
|
|
|
|
|
Modified Compiler Flags
|
|
|
|
-----------------------
|
|
|
|
|
2020-12-17 22:23:02 +08:00
|
|
|
Removed Compiler Flags
|
|
|
|
-------------------------
|
2022-05-05 23:52:04 +08:00
|
|
|
- Removed the ``-fno-concept-satisfaction-caching`` flag. The flag was added
|
|
|
|
at the time when the draft of C++20 standard did not permit caching of
|
|
|
|
atomic constraints. The final standard permits such caching, see
|
2022-05-06 00:09:23 +08:00
|
|
|
`WG21 P2104R0 <http://wg21.link/p2104r0>`_.
|
2020-12-17 22:23:02 +08:00
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
New Pragmas in Clang
|
|
|
|
--------------------
|
2022-05-13 21:39:19 +08:00
|
|
|
- Added support for MSVC's ``#pragma function``, which tells the compiler to
|
|
|
|
generate calls to functions listed in the pragma instead of using the
|
|
|
|
builtins.
|
2022-05-16 21:59:40 +08:00
|
|
|
- Added support for MSVC's ``#pragma alloc_text``. The pragma names the code
|
|
|
|
section functions are placed in. The pragma only applies to functions with
|
|
|
|
C linkage.
|
2020-02-14 05:46:33 +08:00
|
|
|
|
|
|
|
- ...
|
|
|
|
|
|
|
|
Attribute Changes in Clang
|
|
|
|
--------------------------
|
|
|
|
|
2022-05-06 07:04:19 +08:00
|
|
|
- Added support for parameter pack expansion in ``clang::annotate``.
|
2022-02-09 02:27:52 +08:00
|
|
|
|
2022-02-14 21:53:36 +08:00
|
|
|
- The ``overloadable`` attribute can now be written in all of the syntactic
|
2022-02-11 15:27:33 +08:00
|
|
|
locations a declaration attribute may appear.
|
2022-02-23 01:50:39 +08:00
|
|
|
This fixes `Issue 53805 <https://github.com/llvm/llvm-project/issues/53805>`_.
|
2022-02-14 21:53:36 +08:00
|
|
|
|
2022-03-16 02:46:54 +08:00
|
|
|
- Improved namespace attributes handling:
|
2022-03-16 05:08:54 +08:00
|
|
|
|
2022-03-16 02:46:54 +08:00
|
|
|
- Handle GNU attributes before a namespace identifier and subsequent
|
|
|
|
attributes of different kinds.
|
|
|
|
- Emit error on GNU attributes for a nested namespace definition.
|
|
|
|
|
2022-03-17 23:28:37 +08:00
|
|
|
- Statement attributes ``[[clang::noinline]]`` and ``[[clang::always_inline]]``
|
|
|
|
can be used to control inlining decisions at callsites.
|
|
|
|
|
2022-03-09 06:45:28 +08:00
|
|
|
- ``#pragma clang attribute push`` now supports multiple attributes within a single directive.
|
|
|
|
|
2022-03-24 23:51:31 +08:00
|
|
|
- The ``__declspec(naked)`` attribute can no longer be written on a member
|
|
|
|
function in Microsoft compatibility mode, matching the behavior of cl.exe.
|
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
Windows Support
|
|
|
|
---------------
|
|
|
|
|
2022-02-11 07:10:48 +08:00
|
|
|
- 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``.
|
|
|
|
|
2022-05-03 05:06:04 +08:00
|
|
|
AIX Support
|
|
|
|
-----------
|
|
|
|
|
|
|
|
- The driver no longer adds ``-mignore-xcoff-visibility`` by default for AIX
|
|
|
|
targets when no other visibility command-line options are in effect, as
|
|
|
|
ignoring hidden visibility can silently have undesirable side effects (e.g
|
|
|
|
when libraries depend on visibility to hide non-ABI facing entities). The
|
|
|
|
``-mignore-xcoff-visibility`` option can be manually specified on the
|
|
|
|
command-line to recover the previous behavior if desired.
|
|
|
|
|
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
C Language Changes in Clang
|
|
|
|
---------------------------
|
|
|
|
|
2022-02-14 22:33:48 +08:00
|
|
|
C2x Feature Support
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
- Implemented `WG14 N2674 The noreturn attribute <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2764.pdf>`_.
|
2022-02-21 20:25:04 +08:00
|
|
|
- Implemented `WG14 N2935 Make false and true first-class language features <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2935.pdf>`_.
|
2022-03-14 21:22:37 +08:00
|
|
|
- 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>`_.
|
2022-05-06 07:04:19 +08:00
|
|
|
- Implemented the ``*_WIDTH`` macros to complete support for
|
2022-03-23 19:39:53 +08:00
|
|
|
`WG14 N2412 Two's complement sign representation for C2x <https://www9.open-std.org/jtc1/sc22/wg14/www/docs/n2412.pdf>`_.
|
2022-02-08 17:13:11 +08:00
|
|
|
- Implemented `WG14 N2418 Adding the u8 character prefix <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2418.pdf>`_.
|
[C11/C2x] Change the behavior of the implicit function declaration warning
C89 had a questionable feature where the compiler would implicitly
declare a function that the user called but was never previously
declared. The resulting function would be globally declared as
extern int func(); -- a function without a prototype which accepts zero
or more arguments.
C99 removed support for this questionable feature due to severe
security concerns. However, there was no deprecation period; C89 had
the feature, C99 didn't. So Clang (and GCC) both supported the
functionality as an extension in C99 and later modes.
C2x no longer supports that function signature as it now requires all
functions to have a prototype, and given the known security issues with
the feature, continuing to support it as an extension is not tenable.
This patch changes the diagnostic behavior for the
-Wimplicit-function-declaration warning group depending on the language
mode in effect. We continue to warn by default in C89 mode (due to the
feature being dangerous to use). However, because this feature will not
be supported in C2x mode, we've diagnosed it as being invalid for so
long, the security concerns with the feature, and the trivial
workaround for users (declare the function), we now default the
extension warning to an error in C99-C17 mode. This still gives users
an easy workaround if they are extensively using the extension in those
modes (they can disable the warning or use -Wno-error to downgrade the
error), but the new diagnostic makes it more clear that this feature is
not supported and should be avoided. In C2x mode, we no longer allow an
implicit function to be defined and treat the situation the same as any
other lookup failure.
Differential Revision: https://reviews.llvm.org/D122983
2022-04-20 23:25:35 +08:00
|
|
|
- Removed support for implicit function declarations. This was a C89 feature
|
|
|
|
that was removed in C99, but cannot be supported in C2x because it requires
|
|
|
|
support for functions without prototypes, which no longer exist in C2x.
|
2022-04-21 01:26:38 +08:00
|
|
|
- Implemented `WG14 N2841 No function declarators without prototypes <https://www9.open-std.org/jtc1/sc22/wg14/www/docs/n2841.htm>`_
|
|
|
|
and `WG14 N2432 Remove support for function definitions with identifier lists <https://www9.open-std.org/jtc1/sc22/wg14/www/docs/n2432.pdf>`_.
|
2022-02-14 22:33:48 +08:00
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
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,
64c045e25b8471bbb572bd29159c294a82a86a2, and
de6ddaeef3aaa8a9ae3663c12cdb57d9afc0f906,
and reverts aa643f455a5362de7189eac630050d2c8aefe8f2.
This change also includes a workaround for users using libc++ 3.1 and
earlier (!!), as apparently happens on AIX, where std::move sometimes
returns by value.
Reviewed By: aaron.ballman
Differential Revision: https://reviews.llvm.org/D123345
Revert "Fixup D123950 to address revert of D123345"
This reverts commit aa643f455a5362de7189eac630050d2c8aefe8f2.
2022-04-21 08:13:56 +08: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.
|
2022-05-03 01:07:47 +08:00
|
|
|
- Fixed mangling of nested dependent names such as ``T::a::b``, where ``T`` is a
|
|
|
|
template parameter, to conform to the Itanium C++ ABI and be compatible with
|
|
|
|
GCC. This breaks binary compatibility with code compiled with earlier versions
|
|
|
|
of clang; use the ``-fclang-abi-compat=14`` option to get the old mangling.
|
2022-05-05 18:09:52 +08:00
|
|
|
- Preprocessor character literals with a ``u8`` prefix are now correctly treated as
|
|
|
|
unsigned character literals. This fixes `Issue 54886 <https://github.com/llvm/llvm-project/issues/54886>`_.
|
2022-05-17 21:35:06 +08:00
|
|
|
- Stopped allowing constraints on non-template functions to be compliant with
|
2022-05-16 22:55:35 +08:00
|
|
|
dcl.decl.general p4.
|
2020-02-14 05:46:33 +08:00
|
|
|
|
2021-04-14 19:18:23 +08:00
|
|
|
C++20 Feature Support
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^
|
2022-03-08 23:09:16 +08:00
|
|
|
- Diagnose consteval and constexpr issues that happen at namespace scope. This
|
|
|
|
partially addresses `Issue 51593 <https://github.com/llvm/llvm-project/issues/51593>`_.
|
2022-03-29 02:46:14 +08:00
|
|
|
- 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>`_.
|
2022-05-10 00:04:17 +08:00
|
|
|
|
|
|
|
- Implemented ``__builtin_source_location()``, which enables library support
|
|
|
|
for ``std::source_location``.
|
|
|
|
|
2022-02-17 23:36:08 +08:00
|
|
|
- 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.
|
|
|
|
|
2021-04-14 19:18:23 +08:00
|
|
|
C++2b Feature Support
|
2020-02-14 05:46:33 +08:00
|
|
|
^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
2022-02-09 01:09:03 +08:00
|
|
|
- Implemented `P2128R6: Multidimensional subscript operator <https://wg21.link/P2128R6>`_.
|
2022-03-01 09:17:49 +08:00
|
|
|
- Implemented `P0849R8: auto(x): decay-copy in the language <https://wg21.link/P0849R8>`_.
|
2021-10-06 05:33:31 +08:00
|
|
|
- Implemented `P2242R3: Non-literal variables (and labels and gotos) in constexpr functions <https://wg21.link/P2242R3>`_.
|
2022-02-09 01:09:03 +08:00
|
|
|
|
2022-05-04 02:13:56 +08:00
|
|
|
CUDA/HIP Language Changes in Clang
|
|
|
|
----------------------------------
|
|
|
|
|
|
|
|
- Added `__noinline__` as a keyword to avoid diagnostics due to usage of
|
2022-05-11 02:55:59 +08:00
|
|
|
`__attribute__((__noinline__))` in CUDA/HIP programs.
|
2021-08-18 05:39:58 +08:00
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
Objective-C Language Changes in Clang
|
|
|
|
-------------------------------------
|
|
|
|
|
|
|
|
OpenCL C Language Changes in Clang
|
|
|
|
----------------------------------
|
|
|
|
|
|
|
|
...
|
|
|
|
|
|
|
|
ABI Changes in Clang
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
OpenMP Support in Clang
|
|
|
|
-----------------------
|
|
|
|
|
2022-04-19 20:45:51 +08:00
|
|
|
...
|
2022-02-03 02:06:55 +08:00
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
CUDA Support in Clang
|
|
|
|
---------------------
|
|
|
|
|
|
|
|
- ...
|
|
|
|
|
2020-08-21 04:37:51 +08:00
|
|
|
X86 Support in Clang
|
|
|
|
--------------------
|
|
|
|
|
2022-01-24 12:45:25 +08:00
|
|
|
DWARF Support in Clang
|
|
|
|
----------------------
|
|
|
|
|
2021-10-15 21:29:57 +08:00
|
|
|
Arm and AArch64 Support in Clang
|
|
|
|
--------------------------------
|
|
|
|
|
2021-11-09 22:35:25 +08:00
|
|
|
Floating Point Support in Clang
|
|
|
|
-------------------------------
|
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
Internal API Changes
|
|
|
|
--------------------
|
|
|
|
|
2022-05-06 07:04:19 +08:00
|
|
|
- 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.
|
2022-02-09 02:27:52 +08:00
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
Build System Changes
|
|
|
|
--------------------
|
|
|
|
|
2022-04-09 14:40:18 +08:00
|
|
|
* 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.
|
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
AST Matchers
|
|
|
|
------------
|
|
|
|
|
2022-05-11 21:33:27 +08:00
|
|
|
- Expanded ``isInline`` narrowing matcher to support C++17 inline variables.
|
|
|
|
|
|
|
|
- Added ``forEachTemplateArgument`` matcher which creates a match every
|
|
|
|
time a ``templateArgument`` matches the matcher supplied to it.
|
2022-02-23 16:33:58 +08:00
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
clang-format
|
|
|
|
------------
|
|
|
|
|
2021-11-06 04:10:09 +08:00
|
|
|
- **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.
|
|
|
|
|
2022-02-08 14:58:50 +08:00
|
|
|
- Option ``InsertBraces`` has been added to insert optional braces after control
|
|
|
|
statements.
|
|
|
|
|
2020-02-14 05:46:33 +08:00
|
|
|
libclang
|
|
|
|
--------
|
|
|
|
|
|
|
|
- ...
|
|
|
|
|
|
|
|
Static Analyzer
|
|
|
|
---------------
|
2022-04-14 17:03:44 +08:00
|
|
|
- `New CTU implementation
|
|
|
|
<https://discourse.llvm.org/t/rfc-much-faster-cross-translation-unit-ctu-analysis-implementation/61728>`_
|
|
|
|
that keeps the slow-down around 2x compared to the single-TU analysis, even
|
|
|
|
in case of complex C++ projects. Still, it finds the majority of the "old"
|
|
|
|
CTU findings. Besides, not more than ~3% of the bug reports are lost compared
|
|
|
|
to single-TU analysis, the lost reports are highly likely to be false
|
|
|
|
positives.
|
2020-02-14 05:46:33 +08:00
|
|
|
|
2022-05-07 03:50:45 +08:00
|
|
|
- Added a new checker ``alpha.unix.cstring.UninitializedRead`` this will check for uninitialized reads
|
2022-05-07 03:49:46 +08:00
|
|
|
from common memory copy/manipulation functions such as ``memcpy``, ``mempcpy``, ``memmove``, ``memcmp``, `
|
|
|
|
`strcmp``, ``strncmp``, ``strcpy``, ``strlen``, ``strsep`` and many more. Although
|
2022-05-07 03:46:22 +08:00
|
|
|
this checker currently is in list of alpha checkers due to a false positive.
|
2020-02-14 05:46:33 +08:00
|
|
|
|
|
|
|
.. _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-23 05:18:40 +08:00
|
|
|
API documentation which are up-to-date with the Git version of
|
2020-02-14 05:46:33 +08:00
|
|
|
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>`_.
|