File: ReleaseNotes.rst

package info (click to toggle)
llvm-toolchain-11 1%3A11.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 995,808 kB
  • sloc: cpp: 4,767,656; ansic: 760,916; asm: 477,436; python: 170,940; objc: 69,804; lisp: 29,914; sh: 23,855; f90: 18,173; pascal: 7,551; perl: 7,471; ml: 5,603; awk: 3,489; makefile: 2,573; xml: 915; cs: 573; fortran: 503; javascript: 452
file content (695 lines) | stat: -rw-r--r-- 27,936 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
==========================
Clang 11.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 11.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 11.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.


Recovery AST
------------

clang's AST now improves support for representing broken C++ code. This improves
the quality of subsequent diagnostics after an error is encountered. It also
exposes more information to tools like clang-tidy and clangd that consume
clang’s AST, allowing them to be more accurate on broken code.

A RecoveryExpr is introduced in clang's AST, marking an expression containing
semantic errors. This preserves the source range and subexpressions of the
broken expression in the AST (rather than discarding the whole expression).

For the following invalid code:

  .. code-block:: c++

     int NoArg(); // Line 1
     int x = NoArg(42); // oops!

clang-10 produces the minimal placeholder:

  .. code-block:: c++

     // VarDecl <line:2:1, col:5> col:5 x 'int'

clang-11 produces a richer AST:

  .. code-block:: c++

     // VarDecl <line:2:1, col:16> col:5 x 'int' cinit
     // `-RecoveryExpr <col:9, col:16> '<dependent type>' contains-errors lvalue
     //    `-UnresolvedLookupExpr <col:9> '<overloaded function>' lvalue (ADL) = 'NoArg'
     //    `-IntegerLiteral <col:15> 'int' 42

Note that error-dependent types and values may now occur outside a template
context. Tools may need to adjust assumptions about dependent code.

This feature is on by default for C++ code, and can be explicitly controlled
with `-Xclang -f[no-]recovery-ast`.

Improvements to Clang's diagnostics
-----------------------------------

- -Wpointer-to-int-cast is a new warning group. This group warns about C-style
  casts of pointers to a integer type too small to hold all possible values.

- -Wuninitialized-const-reference is a new warning controlled by 
  -Wuninitialized. It warns on cases where uninitialized variables are passed
  as const reference arguments to a function.

- ``-Wimplicit-const-int-float-conversion`` (enabled by default) is a new
  option controlled by ``-Wimplicit-int-float-conversion``.  It warns on
  implicit conversion from a floating constant to an integer type.

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

- For the ARM target, C-language intrinsics are now provided for the full Arm
  v8.1-M MVE instruction set. ``<arm_mve.h>`` supports the complete API defined
  in the Arm C Language Extensions.

- For the ARM target, C-language intrinsics ``<arm_cde.h>`` for the CDE
  instruction set are now provided.

- clang adds support for a set of  extended integer types (``_ExtInt(N)``) that
  permit non-power of 2 integers, exposing the LLVM integer types. Since a major
  motivating use case for these types is to limit 'bit' usage, these types don't
  automatically promote to 'int' when operations are done between two
  ``ExtInt(N)`` types, instead math occurs at the size of the largest
  ``ExtInt(N)`` type.

- Users of UBSan, PGO, and coverage on Windows will now need to add clang's
  library resource directory to their library search path. These features all
  use runtime libraries, and Clang provides these libraries in its resource
  directory. For example, if LLVM is installed in ``C:\Program Files\LLVM``,
  then the profile runtime library will appear at
  ``C:\Program Files\LLVM\lib\clang\11.0.0\lib\windows\clang_rt.profile-x86_64.lib``.
  To ensure that the linker can find the appropriate library, users should pass
  ``/LIBPATH:C:\Program Files\LLVM\lib\clang\11.0.0\lib\windows`` to the
  linker. If the user links the program with the ``clang`` or ``clang-cl``
  drivers, the driver will pass this flag for them.

- Clang's profile files generated through ``-fprofile-instr-generate`` are using
  a fixed hashing algorithm that prevents some collision when loading
  out-of-date profile informations. Clang can still read old profile files.

- Clang adds support for the following macros that enable the
  C-intrinsics from the `Arm C language extensions for SVE
  <https://developer.arm.com/documentation/100987/>`_ (version
  ``00bet5``, see section 2.1 for the list of intrinsics associated to
  each macro):


      =================================  =================
      Preprocessor macro                 Target feature
      =================================  =================
      ``__ARM_FEATURE_SVE``              ``+sve``
      ``__ARM_FEATURE_SVE_BF16``         ``+sve+bf16``
      ``__ARM_FEATURE_SVE_MATMUL_FP32``  ``+sve+f32mm``
      ``__ARM_FEATURE_SVE_MATMUL_FP64``  ``+sve+f64mm``
      ``__ARM_FEATURE_SVE_MATMUL_INT8``  ``+sve+i8mm``
      ``__ARM_FEATURE_SVE2``             ``+sve2``
      ``__ARM_FEATURE_SVE2_AES``         ``+sve2-aes``
      ``__ARM_FEATURE_SVE2_BITPERM``     ``+sve2-bitperm``
      ``__ARM_FEATURE_SVE2_SHA3``        ``+sve2-sha3``
      ``__ARM_FEATURE_SVE2_SM4``         ``+sve2-sm4``
      =================================  =================

  The macros enable users to write C/C++ `Vector Length Agnostic
  (VLA)` loops, that can be executed on any CPU that implements the
  underlying instructions supported by the C intrinsics, independently
  of the hardware vector register size.

  For example, the ``__ARM_FEATURE_SVE`` macro is enabled when
  targeting AArch64 code generation by setting ``-march=armv8-a+sve``
  on the command line.

  .. code-block:: c
     :caption: Example of VLA addition of two arrays with SVE ACLE.

     // Compile with:
     // `clang++ -march=armv8a+sve ...` (for c++)
     // `clang -stc=c11 -march=armv8a+sve ...` (for c)
     #include <arm_sve.h>

     void VLA_add_arrays(double *x, double *y, double *out, unsigned N) {
       for (unsigned i = 0; i < N; i += svcntd()) {
         svbool_t Pg = svwhilelt_b64(i, N);
         svfloat64_t vx = svld1(Pg, &x[i]);
         svfloat64_t vy = svld1(Pg, &y[i]);
         svfloat64_t vout = svadd_x(Pg, vx, vy);
         svst1(Pg, &out[i], vout);
       }
     }

  Please note that support for lazy binding of SVE function calls is
  incomplete. When you interface user code with SVE functions that are
  provided through shared libraries, avoid using lazy binding. If you
  use lazy binding, the results could be corrupted.

- ``-O`` maps to ``-O1`` instead of ``-O2``.
  (`D79916 <https://reviews.llvm.org/D79916>`_)

- In a ``-flto={full,thin}`` link, ``-Os``, ``-Oz`` and ``-Og`` can be used
  now. ``-Os`` and ``-Oz`` map to the -O2 pipe line while ``-Og`` maps to the
  -O1 pipeline.
  (`D79919 <https://reviews.llvm.org/D79919>`_)

- ``--coverage`` (gcov) defaults to gcov [4.8,8) compatible format now.

- On x86, ``-fpic/-fPIC -fno-semantic-interposition`` assumes a global
  definition of default visibility non-interposable and allows interprocedural
  optimizations. In produced assembly ``-Lfunc$local`` local aliases are created
  for global symbols of default visibility.

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

- -fstack-clash-protection will provide a protection against the stack clash
  attack for x86, s390x and ppc64 architectures through automatic probing of
  each page of allocated stack.

- -ffp-exception-behavior={ignore,maytrap,strict} allows the user to specify
  the floating-point exception behavior. The default setting is ``ignore``.

- -ffp-model={precise,strict,fast} provides the user an umbrella option to
  simplify access to the many single purpose floating point options. The default
  setting is ``precise``.

- The default module cache has moved from /tmp to a per-user cache directory.
  By default, this is ~/.cache but on some platforms or installations, this
  might be elsewhere. The -fmodules-cache-path=... flag continues to work.

- -fpch-instantiate-templates tries to instantiate templates already while
  generating a precompiled header. Such templates do not need to be
  instantiated every time the precompiled header is used, which saves compile
  time. This may result in an error during the precompiled header generation
  if the source header file is not self-contained. This option is enabled
  by default for clang-cl.

- -fpch-codegen and -fpch-debuginfo generate shared code and/or debuginfo
  for contents of a precompiled header in a separate object file. This object
  file needs to be linked in, but its contents do not need to be generated
  for other objects using the precompiled header. This should usually save
  compile time. If not using clang-cl, the separate object file needs to
  be created explicitly from the precompiled header.
  Example of use:

  .. code-block:: console

    $ clang++ -x c++-header header.h -o header.pch -fpch-codegen -fpch-debuginfo
    $ clang++ -c header.pch -o shared.o
    $ clang++ -c source.cpp -o source.o -include-pch header.pch
    $ clang++ -o binary source.o shared.o

  - Using -fpch-instantiate-templates when generating the precompiled header
    usually increases the amount of code/debuginfo that can be shared.
  - In some cases, especially when building with optimizations enabled, using
    -fpch-codegen may generate so much code in the shared object that compiling
    it may be a net loss in build time.
  - Since headers may bring in private symbols of other libraries, it may be
    sometimes necessary to discard unused symbols (such as by adding
    -Wl,--gc-sections on ELF platforms to the linking command, and possibly
    adding -fdata-sections -ffunction-sections to the command generating
    the shared object).

- ``-fsanitize-coverage-allowlist`` and ``-fsanitize-coverage-blocklist`` are added.

- -mtls-size={12,24,32,48} allows selecting the size of the TLS (thread-local
  storage) in the local exec TLS model of AArch64, which is the default TLS
  model for non-PIC objects. Each value represents 4KB, 16MB (default), 4GB,
  and 256TB (needs -mcmodel=large). This allows large/many thread local
  variables or a compact/fast code in an executable.

- -menable-experimental-extension` can be used to enable experimental or
  unratified RISC-V extensions, allowing them to be targeted by specifying the
  extension name and precise version number in the `-march` string. For these
  experimental extensions, there is no expectation of ongoing support - the
  compiler support will continue to change until the specification is
  finalised.


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

- -fno-common has been enabled as the default for all targets.  Therefore, C
  code that uses tentative definitions as definitions of a variable in multiple
  translation units will trigger multiple-definition linker errors. Generally,
  this occurs when the use of the ``extern`` keyword is neglected in the
  declaration of a variable in a header file. In some cases, no specific
  translation unit provides a definition of the variable. The previous
  behavior can be restored by specifying ``-fcommon``.
- -Wasm-ignored-qualifier (ex. `asm const ("")`) has been removed and replaced
  with an error (this matches a recent change in GCC-9).
- -Wasm-file-asm-volatile (ex. `asm volatile ("")` at global scope) has been
  removed and replaced with an error (this matches GCC's behavior).
- Duplicate qualifiers on asm statements (ex. `asm volatile volatile ("")`) no
  longer produces a warning via -Wduplicate-decl-specifier, but now an error
  (this matches GCC's behavior).
- The deprecated argument ``-f[no-]sanitize-recover`` has changed to mean
  ``-f[no-]sanitize-recover=all`` instead of
  ``-f[no-]sanitize-recover=undefined,integer`` and is no longer deprecated.
- The argument to ``-f[no-]sanitize-trap=...`` is now optional and defaults to
  ``all``.
- ``-fno-char8_t`` now disables the ``char8_t`` keyword, not just the use of
  ``char8_t`` as the character type of ``u8`` literals. This restores the
  Clang 8 behavior that regressed in Clang 9 and 10.
- -print-targets has been added to print the registered targets.
- -mcpu is now supported for RISC-V, and recognises the generic-rv32,
  rocket-rv32, sifive-e31, generic-rv64, rocket-rv64, and sifive-u54 target
  CPUs.
- ``-fwhole-program-vtables`` (along with ``-flto*``) now prepares all classes for possible whole program visibility if specified during the LTO link.
  (`D71913 <https://reviews.llvm.org/D71913>`_)

New Pragmas in Clang
--------------------

- The ``clang max_tokens_here`` pragma can be used together with
  `-Wmax-tokens <DiagnosticsReference.html#wmax-tokens>`_ to emit a warning when
  the number of preprocessor tokens exceeds a limit. Such limits can be helpful
  in limiting code growth and slow compiles due to large header files.

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

- Attributes can now be specified by clang plugins. See the
  `Clang Plugins <ClangPlugins.html#defining-attributes>`_ documentation for
  details.

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

- Don't warn about `ms_struct may not produce Microsoft-compatible layouts
  for classes with base classes or virtual functions` if the option is
  enabled globally, as opposed to enabled on a specific class/struct or
  on a specific section in the source files. This avoids needing to
  couple `-mms-bitfields` with `-Wno-incompatible-ms-struct` if building
  C++ code.

- Enable `-mms-bitfields` by default for MinGW targets, matching a similar
  change in GCC 4.7.

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

- The default C language standard used when `-std=` is not specified has been
  upgraded from gnu11 to gnu17.

- Clang now supports the GNU C extension `asm inline`; it won't do anything
  *yet*, but it will be parsed.

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

- Clang now implements a restriction on giving non-C-compatible anonymous
  structs a typedef name for linkage purposes, as described in C++ committee
  paper `P1766R1 <http://wg21.link/p1766r1>`. This paper was adopted by the
  C++ committee as a Defect Report resolution, so it is applied retroactively
  to all C++ standard versions. This affects code such as:

  .. code-block:: c++

    typedef struct {
      int f() { return 0; }
    } S;

  Previous versions of Clang rejected some constructs of this form
  (specifically, where the linkage of the type happened to be computed
  before the parser reached the typedef name); those cases are still rejected
  in Clang 11. In addition, cases that previous versions of Clang did not
  reject now produce an extension warning. This warning can be disabled with
  the warning flag ``-Wno-non-c-typedef-for-linkage``.

  Affected code should be updated to provide a tag name for the anonymous
  struct:

  .. code-block:: c++

    struct S {
      int f() { return 0; }
    };

  If the code is shared with a C compilation (for example, if the parts that
  are not C-compatible are guarded with ``#ifdef __cplusplus``), the typedef
  declaration should be retained, but a tag name should still be provided:

  .. code-block:: c++

    typedef struct S {
      int f() { return 0; }
    } S;


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

- Added extensions from `cl_khr_subgroup_extensions` to clang and the internal
  header.

- Added rocm device libs linking for AMDGPU.

- Added diagnostic for OpenCL 2.0 blocks used in function arguments.

- Fixed MS mangling for OpenCL 2.0 pipe type specifier.

- Improved command line options for fast relaxed math.

- Improved `atomic_fetch_min/max` functions in the internal header
  (`opencl-c.h`).

- Improved size of builtin function table for `TableGen`-based internal header
  (enabled by `-fdeclare-opencl-builtins`) and added new functionality for
  OpenCL 2.0 atomics, pipes, enqueue kernel, `cl_khr_subgroups`,
  `cl_arm_integer_dot_product`.

Changes related to C++ for OpenCL
---------------------------------

- Added `addrspace_cast` operator.

- Improved address space deduction in templates.

- Improved diagnostics of address spaces in nested pointer conversions.

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

- For RISC-V, an ABI bug was fixed when passing complex single-precision
  floats in RV64 with the hard float ABI. The bug could only be triggered for
  function calls that exhaust the available FPRs.


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

New features for OpenMP 5.0 were implemented.

- OpenMP 5.0 is the default version supported by the compiler. User can switch
  to OpenMP 4.5 using ``-fopenmp-version=45`` option.

- Added support for declare variant directive.

- Improved support of math functions and complex types for NVPTX target.

- Added support for parallel execution of target regions for NVPTX target.

- Added support for ``scan`` directives and ``inscan`` modifier in ``reduction``
  clauses.

- Added support for ``iterator`` construct.

- Added support for ``depobj`` construct.

- Added support for ``detach`` clauses in task-based directives.

- Added support for array shaping operations.

- Added support for cancellation constructs in ``taskloop`` directives.

- Nonmonotonic modifier is allowed with all schedule kinds.

- Added support for ``task`` and ``default`` modifiers in ``reduction`` clauses.

- Added support for strides in array sections.

- Added support for ``use_device_addr`` clause.

- Added support for ``uses_allocators`` clause.

- Added support for ``defaultmap`` clause.

- Added basic support for ``hint`` clause in ``atomic`` directives.

- Added basic support for ``affinity`` clause.

- Added basic support for ``ancestor`` modifier in ``device`` clause.

- Added support for ``default(firstprivate)`` clause. This clause is the part of
  upcoming OpenMP 5.1 and can be enabled using ``-fopenmp-version=51`` option.

- Bug fixes and optimizations.


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

These are major API changes that have happened since the 10.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.

- ``RecursiveASTVisitor`` no longer calls separate methods to visit specific
  operator kinds. Previously, ``RecursiveASTVisitor`` treated unary, binary,
  and compound assignment operators as if they were subclasses of the
  corresponding AST node. For example, the binary operator plus was treated as
  if it was a ``BinAdd`` subclass of the ``BinaryOperator`` class: during AST
  traversal of a ``BinaryOperator`` AST node that had a ``BO_Add`` opcode,
  ``RecursiveASTVisitor`` was calling the ``TraverseBinAdd`` method instead of
  ``TraverseBinaryOperator``. This feature was contributing a non-trivial
  amount of complexity to the implementation of ``RecursiveASTVisitor``, it was
  used only in a minor way in Clang, was not tested, and as a result it was
  buggy. Furthermore, this feature was creating a non-uniformity in the API.
  Since this feature was not documented, it was quite difficult to figure out
  how to use ``RecursiveASTVisitor`` to visit operators.

  To update your code to the new uniform API, move the code from separate
  visitation methods into methods that correspond to the actual AST node and
  perform case analysis based on the operator opcode as needed:

  * ``TraverseUnary*() => TraverseUnaryOperator()``
  * ``WalkUpFromUnary*() => WalkUpFromUnaryOperator()``
  * ``VisitUnary*() => VisiUnaryOperator()``
  * ``TraverseBin*() => TraverseBinaryOperator()``
  * ``WalkUpFromBin*() => WalkUpFromBinaryOperator()``
  * ``VisitBin*() => VisiBinaryOperator()``
  * ``TraverseBin*Assign() => TraverseCompoundAssignOperator()``
  * ``WalkUpFromBin*Assign() => WalkUpFromCompoundAssignOperator()``
  * ``VisitBin*Assign() => VisiCompoundAssignOperator()``

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

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

- clang-tidy and clang-include-fixer are no longer compiled into libclang by
  default. You can set ``LIBCLANG_INCLUDE_CLANG_TOOLS_EXTRA=ON`` to undo that,
  but it's expected that that setting will go away eventually. If this is
  something you need, please reach out to the mailing list to discuss possible
  ways forward.

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

- Option ``IndentExternBlock`` has been added to optionally apply indenting inside ``extern "C"`` and ``extern "C++"`` blocks.

- ``IndentExternBlock`` option accepts ``AfterExternBlock`` to use the old behavior, as well as Indent and NoIndent options, which map to true and false, respectively.

  .. code-block:: c++

    Indent:                       NoIndent:
     #ifdef __cplusplus          #ifdef __cplusplus
     extern "C" {                extern "C++" {
     #endif                      #endif

          void f(void);          void f(void);

     #ifdef __cplusplus          #ifdef __cplusplus
     }                           }
     #endif                      #endif

- Option ``IndentCaseBlocks`` has been added to support treating the block
  following a switch case label as a scope block which gets indented itself.
  It helps avoid having the closing bracket align with the switch statement's
  closing bracket (when ``IndentCaseLabels`` is ``false``).

  .. code-block:: c++

    switch (fool) {                vs.     switch (fool) {
    case 1:                                case 1: {
      {                                      bar();
         bar();                            } break;
      }                                    default: {
      break;                                 plop();
    default:                               }
      {                                    }
        plop();
      }
    }

- Option ``ObjCBreakBeforeNestedBlockParam`` has been added to optionally apply
  linebreaks for function arguments declarations before nested blocks.

- Option ``InsertTrailingCommas`` can be set to ``TCS_Wrapped`` to insert
  trailing commas in container literals (arrays and objects) that wrap across
  multiple lines. It is currently only available for JavaScript and disabled by
  default (``TCS_None``).

- Option ``BraceWrapping.BeforeLambdaBody`` has been added to manage lambda
  line break inside function parameter call in Allman style.

  .. code-block:: c++

      true:
      connect(
        []()
        {
          foo();
          bar();
        });

      false:
      connect([]() {
          foo();
          bar();
        });

- Option ``AlignConsecutiveBitFields`` has been added to align bit field
  declarations across multiple adjacent lines

  .. code-block:: c++

      true:
        bool aaa  : 1;
        bool a    : 1;
        bool bb   : 1;

      false:
        bool aaa : 1;
        bool a : 1;
        bool bb : 1;

- Option ``BraceWrapping.BeforeWhile`` has been added to allow wrapping
  before the ```while`` in a do..while loop. By default the value is (``false``)

  In previous releases ``IndentBraces`` implied ``BraceWrapping.BeforeWhile``.
  If using a Custom BraceWrapping style you may need to now set
  ``BraceWrapping.BeforeWhile`` to (``true``) to be explicit.

  .. code-block:: c++

      true:
      do {
        foo();
      }
      while(1);

      false:
      do {
        foo();
      } while(1);


.. _release-notes-clang-static-analyzer:

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

- Improved the analyzer's understanding of inherited C++ constructors.

- Improved the analyzer's understanding of dynamic class method dispatching in
  Objective-C.

- Greatly improved the analyzer's constraint solver by better understanding
  when constraints are imposed on multiple symbolic values that are known to be
  equal or known to be non-equal. It will now also efficiently reject impossible
  if-branches between known comparison expressions.

- Added :ref:`on-demand parsing <ctu-on-demand>` capability to Cross Translation
  Unit (CTU) analysis.

- Numerous fixes and improvements for the HTML output.

- New checker: :ref:`alpha.core.C11Lock <alpha-core-C11Lock>` and
  :ref:`alpha.fuchsia.Lock <alpha-fuchsia-lock>` checks for their respective
  locking APIs.

- New checker: :ref:`alpha.security.cert.pos.34c <alpha-security-cert-pos-34c>`
  finds calls to ``putenv`` where a pointer to an autmoatic variable is passed
  as an argument.

- New checker: :ref:`webkit.NoUncountedMemberChecker
  <webkit-NoUncountedMemberChecker>` to enforce the existence of virtual
  destructors for all uncounted types used as base classes.

- New checker: :ref:`webkit.RefCntblBaseVirtualDtor
  <webkit-RefCntblBaseVirtualDtor>` checks that only ref-counted types
  are used as class members, not raw pointers and references to uncounted
  types.

- New checker: :ref:`alpha.cplusplus.SmartPtr <alpha-cplusplus-SmartPtr>` check
  for dereference of null smart pointers.

- Moved ``PlacementNewChecker`` out of alpha, making it enabled by default.

- Added support for multi-dimensional variadic arrays in ``core.VLASize``.

- Added a check for insufficient storage in array placement new calls, as well
  as support for alignment variants to ``cplusplus.PlacementNew``.

- While still in alpha, ``alpha.unix.PthreadLock``, the iterator and container
  modeling infrastructure, ``alpha.unix.Stream``, and taint analysis were
  improved greatly. An ongoing, currently off-by-default improvement was made on
  the pre-condition modeling of several functions defined in the POSIX standard.

- Improved the warning messages of several checkers.

- Fixed a few remaining cases of checkers emitting reports under incorrect
  checker names, and employed a few restrictions to more easily identify and
  avoid such errors.

- Moved several non-reporting checkers (those that model, among other things,
  standard functions, but emit no diagnostics) to be listed under
  ``-analyzer-checker-help-developer`` instead of ``-analyzer-checker-help``.
  Manually enabling or disabling checkers found on this list is not supported
  in production.

- Numerous fixes for crashes, false positives and false negatives in
  ``unix.Malloc``, ``osx.cocoa.NSError``, and several other checkers.

- Implemented a dockerized testing system to more easily determine the
  correctness and performance impact of a change to the static analyzer itself.
  The currently beta-version tool is found in
  ``(llvm-project repository)/clang/utils/analyzer/SATest.py``.

.. _release-notes-ubsan:


Additional Information
======================

A wide variety of additional information is available on the `Clang web
page <https://clang.llvm.org/>`_. The web page contains versions of the
API documentation which are up-to-date with the Git version of
the source code. You can access versions of these documents specific to
this release by going into the "``clang/docs/``" directory in the Clang
tree.

If you have any questions or comments about Clang, please feel free to
contact us via the `mailing
list <https://lists.llvm.org/mailman/listinfo/cfe-dev>`_.