==========================
Clang 10.0.0 Release Notes
==========================

.. contents::
   :local:
   :depth: 2

Written by the `LLVM Team <https://llvm.org/>`_


Introduction
============

This document contains the release notes for the Clang C/C++/Objective-C
frontend, part of the LLVM Compiler Infrastructure, release 10.0.0. 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>`_.


What's New in Clang 10.0.0?
===========================

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 used to run the actual compilation in a subprocess ("clang -cc1").
  Now compilations are done in-process by default. ``-fno-integrated-cc1``
  restores the former behavior. The ``-v`` and ``-###`` flags will print
  "(in-process)" when compilations are done in-process.

- Concepts support. Clang now supports C++2a Concepts under the -std=c++2a flag.

Improvements to Clang's diagnostics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- ``-Wtautological-overlap-compare`` will warn on negative numbers and non-int
  types.

- ``-Wtautological-compare`` for self comparisons and
  ``-Wtautological-overlap-compare`` will now look through member and array
  access to determine if two operand expressions are the same.

- ``-Wtautological-bitwise-compare`` is a new warning group.  This group has the
  current warning which diagnoses the tautological comparison of a bitwise
  operation and a constant. The group also has the new warning which diagnoses
  when a bitwise-or with a non-negative value is converted to a bool, since
  that bool will always be true.

- ``-Wbitwise-conditional-parentheses`` will warn on operator precedence issues
  when mixing bitwise-and (&) and bitwise-or (|) operator with the
  conditional operator (?:).

- ``-Wrange-loop-analysis`` got several improvements. It no longer warns about a
  copy being made when the result is bound to an rvalue reference. It no longer
  warns when an object of a small, trivially copyable type is copied. The
  warning now offers fix-its. Excluding ``-Wrange-loop-bind-reference`` it is now
  part of ``-Wall``. To reduce the number of false positives the diagnostic is
  disabled in macros and template instantiations.

- ``-Wmisleading-indentation`` has been added. This warning is similar to the GCC
  warning of the same name. It warns about statements that are indented as if
  they were part of a if/else/for/while statement but are not semantically
  part of that if/else/for/while.

- ``-Wbitwise-op-parentheses`` and ``-Wlogical-op-parentheses`` are disabled by default.

- The new warnings ``-Wc99-designator`` and ``-Wreorder-init-list`` warn about
  uses of C99 initializers in C++ mode for cases that are valid in C99 but not
  in C++20.

- The new warning ``-Wsizeof-array-div`` catches cases like
  ``int arr[10]; ...sizeof(arr) / sizeof(short)...``
  (should be ``sizeof(arr) / sizeof(int)``), and the existing warning
  ``-Wsizeof-pointer-div`` catches more cases.

- The new warning ``-Wxor-used-as-pow`` warns on cases where it looks like
  the xor operator ``^`` is used to be mean exponentiation, e.g. ``2 ^ 16``.

- The new warning ``-Wfinal-dtor-non-final-class`` warns on classes that
  have a final destructor but aren't themselves marked final.

- ``-Wextra`` now enables ``-Wdeprecated-copy``. The warning deprecates
  move and copy constructors in classes where an explicit destructor is
  declared. This is for compatibility with GCC 9, and forward looking
  for a change that's being considered for C++23. You can disable it with
  ``-Wno-deprecated-copy``.


Non-comprehensive list of changes in this release
-------------------------------------------------

* In both C and C++ (C17 ``6.5.6p8``, C++ ``[expr.add]``), pointer arithmetic is
  only permitted within arrays. In particular, the behavior of a program is not
  defined if it adds a non-zero offset (or in C, any offset) to a null pointer,
  or if it forms a null pointer by subtracting an integer from a non-null
  pointer, and the LLVM optimizer now uses those guarantees for transformations.
  This may lead to unintended behavior in code that performs these operations.
  The Undefined Behavior Sanitizer ``-fsanitize=pointer-overflow`` check has
  been extended to detect these cases, so that code relying on them can be
  detected and fixed.

* The Implicit Conversion Sanitizer (``-fsanitize=implicit-conversion``) has
  learned to sanitize pre/post increment/decrement of types with bit width
  smaller than ``int``.

* For X86 target, ``-march=skylake-avx512``, ``-march=icelake-client``,
  ``-march=icelake-server``, ``-march=cascadelake``, ``-march=cooperlake`` will default to
  not using 512-bit zmm registers in vectorized code unless 512-bit intrinsics
  are used in the source code. 512-bit operations are known to cause the CPUs
  to run at a lower frequency which can impact performance. This behavior can be
  changed by passing ``-mprefer-vector-width=512`` on the command line.

* Clang now defaults to ``.init_array`` on Linux. It used to use ``.ctors`` if
  the found GCC installation is older than 4.7.0. Add ``-fno-use-init-array`` to
  get the old behavior (``.ctors``).

* The behavior of the flag ``-flax-vector-conversions`` has been modified to
  more closely match GCC, as described below. In Clang 10 onwards, command lines
  specifying this flag do not permit implicit vector bitcasts between integer
  vectors and floating-point vectors. Such conversions are still permitted by
  default, however, and the default can be explicitly requested with the
  Clang-specific flag ``-flax-vector-conversions=all``. In a future release of
  Clang, we intend to change the default to ``-fno-lax-vector-conversions``.

* Improved support for ``octeon`` MIPS-family CPU. Added ``octeon+`` to
  the list of of CPUs accepted by the driver.

* For the WebAssembly target, the ``wasm-opt`` tool will now be run if it is
  found in the PATH, which can reduce code size.

* For the RISC-V target, floating point registers can now be used in inline
  assembly constraints.

New Compiler Flags
------------------

- The ``-fgnuc-version=`` flag now controls the value of ``__GNUC__`` and related
  macros. This flag does not enable or disable any GCC extensions implemented in
  Clang. Setting the version to zero causes Clang to leave ``__GNUC__`` and
  other GNU-namespaced macros, such as ``__GXX_WEAK__``, undefined.

- vzeroupper insertion on X86 targets can now be disabled with ``-mno-vzeroupper``.
  You can also force vzeroupper insertion to be used on CPUs that normally
  wouldn't with ``-mvzeroupper``.

- The ``-fno-concept-satisfaction-caching`` can be used to disable caching for
  satisfactions of Concepts. The C++2a draft standard does not currently permit
  this caching, but disabling it may incur significant compile-time costs. This
  flag is intended for experimentation purposes and may be removed at any time;
  please let us know if you encounter a situation where you need to specify this
  flag for correct program behavior.

- The ``-ffixed-xX`` flags now work on RISC-V. These reserve the corresponding
  general-purpose registers.

- RISC-V has added ``-mcmodel=medany`` and ``-mcmodel=medlow`` as aliases for
  ``-mcmodel=small`` and ``-mcmodel=medium`` respectively. Preprocessor definitions
  for ``__riscv_cmodel_medlow`` and ``__riscv_cmodel_medany`` have been corrected.

- ``-fmacro-prefix-map=OLD=NEW`` substitutes directory prefix ``OLD`` for
  ``NEW`` in predefined preprocessor macros such as ``__FILE__``. This helps
  with reproducible builds that are location independent. The new
  ``-ffile-prefix-map`` option is equivalent to specifying both
  ``-fdebug-prefix-map`` and ``-fmacro-prefix-map``.

- ``-fpatchable-function-entry=N[,M]`` is added to generate M NOPs before the
  function entry and N-M NOPs after the function entry. This is used by AArch64
  ftrace in the Linux kernel.

- ``-mbranches-within-32B-boundaries`` is added as an x86 assembler mitigation
  for Intel's Jump Condition Code Erratum.

Deprecated Compiler Flags
-------------------------

The following options are deprecated and ignored. They will be removed in
future versions of Clang.

- ``-mmpx`` used to enable the ``__MPX__`` preprocessor define for the Intel MPX
  instructions. There were no MPX intrinsics.

- ``-mno-mpx`` used to disable ``-mmpx`` and is the default behavior.

- ``-fconcepts-ts`` previously used to enable experimental concepts support. Use
  -std=c++2a instead to enable Concepts support.

Modified Compiler Flags
-----------------------

- RISC-V now sets the architecture (riscv32/riscv64) based on the value provided
  to the ``-march`` flag, overriding the target provided by ``-triple``.

- ``-flax-vector-conversions`` has been split into three different levels of
  laxness, and has been updated to match the GCC semantics:

  - ``-flax-vector-conversions=all``: This is Clang's current default, and
    permits implicit vector conversions (performed as bitcasts) between any
    two vector types of the same overall bit-width.
    Former synonym: ``-flax-vector-conversions`` (Clang <= 9).

  - ``-flax-vector-conversions=integer``: This permits implicit vector
    conversions (performed as bitcasts) between any two integer vector types of
    the same overall bit-width.
    Synonym: ``-flax-vector-conversions`` (Clang >= 10).

  - ``-flax-vector-conversions=none``: Do not perform any implicit bitcasts
    between vector types.
    Synonym: ``-fno-lax-vector-conversions``.

- ``-debug-info-kind`` now has an option ``-debug-info-kind=constructor``,
  which is one level below ``-debug-info-kind=limited``. This option causes
  debug info for classes to be emitted only when a constructor is emitted.

- RISC-V now chooses a slightly different sysroot path and defaults to using
  compiler-rt if no GCC installation is detected.

- RISC-V now supports multilibs in baremetal environments. This support does not
  extend to supporting multilib aliases.

Attribute Changes in Clang
--------------------------

- Support was added for function ``__attribute__((target("branch-protection=...")))``

Windows Support
---------------

- Previous Clang versions contained a work-around to avoid an issue with the
  standard library headers in Visual Studio 2019 versions prior to 16.3. This
  work-around has now been removed, and users of Visual Studio 2019 are
  encouraged to upgrade to 16.3 or later, otherwise they may see link errors as
  below:

  .. code-block:: console

    error LNK2005: "bool const std::_Is_integral<int>" (??$_Is_integral@H@std@@3_NB) already defined

- The ``.exe`` output suffix is now added implicitly in MinGW mode, when
  Clang is running on Windows (matching GCC's behaviour)

- Fixed handling of TLS variables that are shared between object files
  in MinGW environments

- The ``-cfguard`` flag now emits Windows Control Flow Guard checks on indirect
  function calls. The previous behavior is still available with the
  ``-cfguard-nochecks`` flag. These checks can be disabled for specific
  functions using the new ``__declspec(guard(nocf))`` modifier.


C++ Language Changes in Clang
-----------------------------

- The behaviour of the `gnu_inline` attribute now matches GCC, for cases
  where used without the `extern` keyword. As this is a change compared to
  how it behaved in previous Clang versions, a warning is emitted for this
  combination.

Objective-C Language Changes in Clang
-------------------------------------

- In both Objective-C and
  Objective-C++, ``-Wcompare-distinct-pointer-types`` will now warn when
  comparing ObjC ``Class`` with an ObjC instance type pointer.

  .. code-block:: objc

    Class clz = ...;
    MyType *instance = ...;
    bool eq = (clz == instance); // Previously undiagnosed, now warns.

- Objective-C++ now diagnoses conversions between ``Class`` and ObjC
  instance type pointers. Such conversions already emitted an
  on-by-default ``-Wincompatible-pointer-types`` warning in Objective-C
  mode, but had inadvertently been missed entirely in
  Objective-C++. This has been fixed, and they are now diagnosed as
  errors, consistent with the usual C++ treatment for conversions
  between unrelated pointer types.

  .. code-block:: objc

    Class clz = ...;
    MyType *instance = ...;
    clz = instance; // Previously undiagnosed, now an error.
    instance = clz; // Previously undiagnosed, now an error.

  One particular issue you may run into is attempting to use a class
  as a key in a dictionary literal. This will now result in an error,
  because ``Class`` is not convertible to ``id<NSCopying>``. (Note that
  this was already a warning in Objective-C mode.) While an arbitrary
  ``Class`` object is not guaranteed to implement ``NSCopying``, the
  default metaclass implementation does. Therefore, the recommended
  solution is to insert an explicit cast to ``id``, which disables the
  type-checking here.

 .. code-block:: objc

    Class cls = ...;

    // Error: cannot convert from Class to id<NSCoding>.
    NSDictionary* d = @{cls : @"Hello"};

    // Fix: add an explicit cast to 'id'.
    NSDictionary* d = @{(id)cls : @"Hello"};

OpenCL Kernel Language Changes in Clang
---------------------------------------

Generic changes:

- Made ``__private`` to be appear explicitly in diagnostics, AST, etc.
- Fixed diagnostics of ``enqueue_kernel``.

OpenCL builtin functions:

- The majority of the OpenCL builtin functions are now available through
  the experimental `TableGen` driven ``-fdeclare-opencl-builtins`` option.
- Align the ``enqueue_marker`` declaration in standard ``opencl-c.h`` to the
  OpenCL spec.
- Avoid a void pointer cast in the ``CLK_NULL_EVENT`` definition.
- Aligned OpenCL with c11 atomic fetch max/min.

Changes in C++ for OpenCL:

- Fixed language mode predefined macros for C++ mode.
- Allow OpenCL C style compound vector initialization.
- Improved destructor support.
- Implemented address space deduction for pointers/references
  to arrays and auto variables.
- Added address spaces support for lambdas and ``constexpr``.
- Fixed misc address spaces usages in classes.


ABI Changes in Clang
--------------------

- GCC passes vectors of __int128 in memory on X86-64. Clang historically
  broke the vectors into multiple scalars using two 64-bit values for each
  element. Clang now matches the GCC behavior on Linux and NetBSD. You can
  switch back to old API behavior with flag: ``-fclang-abi-compat=9.0``.

- RISC-V now chooses a default ``-march=`` and ``-mabi=`` to match (in almost
  all cases) the GCC defaults. On baremetal targets, where neither ``-march=``
  nor ``-mabi=`` are specified, Clang now differs from GCC by defaulting to
  ``-march=rv32imac`` ``-mabi=ilp32`` or ``-march=rv64imac`` ``-mabi=lp64``
  depending on the architecture in the target triple. These do not always match
  the defaults in Clang 9. We strongly suggest that you explicitly pass
  ``-march=`` and ``-mabi=`` when compiling for RISC-V, due to how extensible
  this architecture is.

- RISC-V now uses `target-abi` module metadata to encode the chosen psABI. This
  ensures that the correct lowering will be done by LLVM when LTO is enabled.

- An issue with lowering return types in the RISC-V ILP32D psABI has been fixed.

OpenMP Support in Clang
-----------------------

New features for OpenMP 5.0 were implemented. Use ``-fopenmp-version=50`` option to activate support for OpenMP 5.0.

- Added support for ``device_type`` clause in declare target directive.
- Non-static and non-ordered loops are nonmonotonic by default.
- Teams-based directives can be used as a standalone directive.
- Added support for collapsing of non-rectangular loops.
- Added support for range-based loops.
- Added support for collapsing of imperfectly nested loops.
- Added support for ``master taskloop``, ``parallel master taskloop``, ``master taskloop simd`` and ``parallel master taskloop simd`` directives.
- Added support for ``if`` clauses in simd-based directives.
- Added support for unified shared memory for NVPTX target.
- Added support for nested atomic and simd directives are allowed in sims-based directives.
- Added support for non temporal clauses in sims-based directives.
- Added basic support for conditional lastprivate variables

Other improvements:

- Added basic analysis for use of the uninitialized variables in clauses.
- Bug fixes.


Internal API Changes
--------------------

These are major API changes that have happened since the 9.0.0 release of
Clang. If upgrading an external codebase that uses Clang as a library,
this section should help get you past the largest hurdles of upgrading.

- libTooling APIs that transfer ownership of `FrontendAction` objects now pass
  them by `unique_ptr`, making the ownership transfer obvious in the type
  system. `FrontendActionFactory::create()` now returns a
  `unique_ptr<FrontendAction>`. `runToolOnCode`, `runToolOnCodeWithArgs`,
  `ToolInvocation::ToolInvocation()` now take a `unique_ptr<FrontendAction>`.

Build System Changes
--------------------

These are major changes to the build system that have happened since the 9.0.0
release of Clang. Users of the build system should adjust accordingly.

- In 8.0.0 and below, the install-clang-headers target would install clang's
  resource directory headers. This installation is now performed by the
  install-clang-resource-headers target. Users of the old install-clang-headers
  target should switch to the new install-clang-resource-headers target. The
  install-clang-headers target now installs clang's API headers (corresponding
  to its libraries), which is consistent with the install-llvm-headers target.

- In 9.0.0 and later Clang added a new target, clang-cpp, which generates a
  shared library comprised of all the clang component libraries and exporting
  the clang C++ APIs. Additionally the build system gained the new
  "CLANG_LINK_CLANG_DYLIB" option, which defaults Off, and when set to On, will
  force clang (and clang-based tools) to link the clang-cpp library instead of
  statically linking clang's components. This option will reduce the size of
  binary distributions at the expense of compiler performance.


clang-format
------------

- The ``Standard`` style option specifies which version of C++ should be used
  when parsing and formatting C++ code. The set of allowed values has changed:

  - ``Latest`` will always enable new C++ language features.
  - ``c++03``, ``c++11``, ``c++14``, ``c++17``, ``c++20`` will pin to exactly
    that language version.
  - ``Auto`` is the default and detects style from the code (this is unchanged).

  The previous values of ``Cpp03`` and ``Cpp11`` are deprecated. Note that
  ``Cpp11`` is treated as ``Latest``, as this was always clang-format's
  behavior. (One motivation for this change is the new name describes the
  behavior better).

- Clang-format has a new option called ``--dry-run`` or ``-n`` to emit a
  warning for clang-format violations. This can be used together
  with ``--ferror-limit=N`` to limit the number of warnings per file and ``--Werror``
  to make warnings into errors.

- Option *IncludeIsMainSourceRegex* has been added to allow for additional
  suffixes and file extensions to be considered as a source file
  for execution of logic that looks for "main *include* file" to put
  it on top.

  By default, clang-format considers *source* files as "main" only when
  they end with: ``.c``, ``.cc``, ``.cpp``, ``.c++``, ``.cxx``,
  ``.m`` or ``.mm`` extensions. This config option allows to
  extend this set of source files considered as "main".

  For example, if this option is configured to ``(Impl\.hpp)$``,
  then a file ``ClassImpl.hpp`` is considered "main" (in addition to
  ``Class.c``, ``Class.cc``, ``Class.cpp`` and so on) and "main
  include file" logic will be executed (with *IncludeIsMainRegex* setting
  also being respected in later phase). Without this option set,
  ``ClassImpl.hpp`` would not have the main include file put on top
  before any other include.

- Options ``DeriveLineEnding`` and  ``UseCRLF`` have been added to allow
  clang-format to control the newlines. ``DeriveLineEnding`` is by default
  ``true`` and reflects is the existing mechanism, which based is on majority
  rule. The new options allows this to be turned off and ``UseCRLF`` to control
  the decision as to which sort of line ending to use.

- Option ``SpaceBeforeSquareBrackets`` has been added to insert a space before
  array declarations.

  .. code-block:: c++

    int a [5];    vs    int a[5];

- Clang-format now supports JavaScript null operators.

  .. code-block:: c++

    const x = foo ?? default;
    const z = foo?.bar?.baz;

- Option ``AlwaysBreakAfterReturnType`` now manages all operator functions.

libclang
--------

- Various changes to reduce discrepancies in destructor calls between the
  generated ``CFG`` and the actual ``codegen``.

  In particular:

  - Respect C++17 copy elision; previously it would generate destructor calls
    for elided temporaries, including in initialization and return statements.

  - Don't generate duplicate destructor calls for statement expressions.

  - Fix initialization lists.

  - Fix comma operator.

  - Change printing of implicit destructors to print the type instead of the
    class name directly, matching the code for temporary object destructors.
    The class name was blank for lambdas.


Static Analyzer
---------------

- New checker: ``alpha.cplusplus.PlacementNew`` to detect whether the storage
  provided for default placement new is sufficiently large.

- New checker: ``fuchsia.HandleChecker`` to detect leaks related to Fuchsia
  handles.

- New checker: ``security.insecureAPI.decodeValueOfObjCType`` warns about
  potential buffer overflows when using ``[NSCoder decodeValueOfObjCType:at:]``

- ``deadcode.DeadStores`` now warns about nested dead stores.

- Condition values that are relevant to the occurrence of a bug are far better
  explained in bug reports.

- Despite still being at an alpha stage, checkers implementing taint analyses
  and C++ iterator rules were improved greatly.

- Numerous smaller fixes.

.. _release-notes-ubsan:

Undefined Behavior Sanitizer (UBSan)
------------------------------------

* The ``pointer-overflow`` check was extended added to catch the cases where
  a non-zero offset is applied to a null pointer, or the result of
  applying the offset is a null pointer.

  .. code-block:: c++

    #include <cstdint> // for intptr_t

    static char *getelementpointer_inbounds(char *base, unsigned long offset) {
      // Potentially UB.
      return base + offset;
    }

    char *getelementpointer_unsafe(char *base, unsigned long offset) {
      // Always apply offset. UB if base is ``nullptr`` and ``offset`` is not
      // zero, or if ``base`` is non-``nullptr`` and ``offset`` is
      // ``-reinterpret_cast<intptr_t>(base)``.
      return getelementpointer_inbounds(base, offset);
    }

    char *getelementpointer_safe(char *base, unsigned long offset) {
      // Cast pointer to integer, perform usual arithmetic addition,
      // and cast to pointer. This is legal.
      char *computed =
          reinterpret_cast<char *>(reinterpret_cast<intptr_t>(base) + offset);
      // If either the pointer becomes non-``nullptr``, or becomes
      // ``nullptr``, we must use ``computed`` result.
      if (((base == nullptr) && (computed != nullptr)) ||
          ((base != nullptr) && (computed == nullptr)))
        return computed;
      // Else we can use ``getelementpointer_inbounds()``.
      return getelementpointer_inbounds(base, offset);
    }

Changes deferred to Clang-11 release
------------------------------------

- The next release of clang (clang-11) will upgrade the default C language
  standard used if not specified via command line from gnu11 to gnu17.


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 Subversion 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>`_.
