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