This file contains information about GCC releases which has been generated
automatically from the online release notes.  It covers releases of GCC
(and the former EGCS project) since EGCS 1.0, on the line of development
that led to GCC 3. For information on GCC 2.8.1 and older releases of GCC 2,
see ONEWS.

======================================================================
http://gcc.gnu.org/gcc-10/index.html
                             GCC 10 Release Series

   May 7, 2020

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 10.1.

   This release is a major release, containing new features (as well as
   many other improvements) relative to GCC 9.x.

Release History

   GCC 10.1
          May 7, 2020 ([2]changes, [3]documentation)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [4]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [5]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [6]GCC project
   web site or contact the [7]GCC development mailing list.

   To obtain GCC please use [8]our mirror sites or [9]our version control
   system.


    For questions related to the use of GCC, please consult these web
    pages and the [10]GCC manuals. If that fails, the
    [11]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [12]gcc@gcc.gnu.org. All of [13]our lists have public
    archives.

   Copyright (C) [14]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [15]maintained by the GCC team. Last modified
   2020-05-07[16].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-10/changes.html
   3. http://gcc.gnu.org/onlinedocs/10.1.0/
   4. http://gcc.gnu.org/gcc-10/buildstat.html
   5. http://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Contributors.html
   6. http://gcc.gnu.org/index.html
   7. mailto:gcc@gcc.gnu.org
   8. http://gcc.gnu.org/mirrors.html
   9. http://gcc.gnu.org/git.html
  10. https://gcc.gnu.org/onlinedocs/
  11. mailto:gcc-help@gcc.gnu.org
  12. mailto:gcc@gcc.gnu.org
  13. https://gcc.gnu.org/lists.html
  14. https://www.fsf.org/
  15. https://gcc.gnu.org/about.html
  16. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-10/changes.html
                             GCC 10 Release Series
                        Changes, New Features, and Fixes

   This page is a "brief" summary of some of the huge number of
   improvements in GCC 10. You may also want to check out our [1]Porting
   to GCC 10 page and the [2]full GCC documentation.

Caveats

     * An ABI incompatibility between C++14 and C++17 has been fixed. On
       some targets a class with a zero-sized subobject would be passed
       incorrectly when compiled as C++17 or C++20. See the [3]C++ notes
       below for more details.
     * The deprecated Profile Mode and array_allocator extensions have
       been removed from libstdc++.
     * The non-standard std::__is_nullptr_t type trait is deprecated and
       will be removed from libstdc++ in a future release. The standard
       trait std::is_null_pointer should be instead.
     * The minimum version of the [4]MPFR library required for building
       GCC has been increased to version 3.1.0 (released 2011-10-03).
     * The automatic template instantiation at link time (-frepo) has been
       removed.
     * The --param allow-store-data-races internal parameter has been
       removed in favor of a new official option -fallow-store-data-races.
       While default behavior is unchanged and the new option allows to
       correctly maintain a per compilation unit setting across link-time
       optimization, alteration of the default via --param
       allow-store-data-races will now be diagnosed and build systems have
       to be adjusted accordingly.
     * Offloading to Heterogeneous System Architecture Intermediate
       Language (HSAIL) has been deprecated and will likely be removed in
       a future release.

General Improvements

     * New built-in functions:
          + The [5]__has_builtin built-in preprocessor operator can be
            used to query support for built-in functions provided by GCC
            and other compilers that support it.
          + __builtin_roundeven for the corresponding function from
            ISO/IEC TS 18661.
     * New command-line options:
          + [6]-fallocation-dce removes unneeded pairs of new and delete
            operators.
          + [7]-fprofile-partial-training can now be used to inform the
            compiler that code paths not covered by the training run
            should not be optimized for size.
          + [8]-fprofile-reproducible controls level of reproducibility of
            profile gathered by [9]-fprofile-generate. This makes it
            possible to rebuild program with same outcome which is useful,
            for example, for distribution packages.
          + [10]-fprofile-prefix-path can be used in combination with
            -fprofile-generate=profile_dir and -fprofile-use=profile_dir
            to inform GCC where the base directory of build source tree is
            in case it differs between instrumentation and optimized
            builds.
          + [11]-fanalyzer enables a new static analysis pass and
            associated warnings. This pass performs a time-consuming
            exploration of paths through the code in the hope of detecting
            various common errors, such as double-free bugs. This option
            should be regarded as experimental in this release. In
            particular, analysis of non-C code is unlikely to work.
     * Inter-procedural optimization improvements:
          + The inter-procedural scalar replacement of aggregates
            (IPA-SRA) pass was re-implemented to work at link-time and can
            now also remove computing and returning unused return values.
          + [12]-finline-functions is now enabled at -O2 and was retuned
            for better code size versus runtime performance trade-offs.
            Inliner heuristics was also significantly sped up to avoid
            negative impact to -flto -O2 compile times.
          + Inliner heuristics and function cloning can now use
            value-range information to predict effectivity of individual
            transformations.
          + During link-time optimization the C++ One Definition Rule is
            used to increase precision of type based alias analysis.
     * Link-time optimization improvements:
          + A new binary [13]lto-dump has been added. The program can dump
            various information about a LTO bytecode object file.
          + Parallel phase of the LTO can automatically detect a running
            make's jobserver or can fall back to number of available
            cores.
          + The LTO bytecode can be compressed with [14]zstd algorithm.
            Configure script can automatically detect the zstd support.
          + Most --param values can now be specified at translation unit
            granularity. This includes all parameters controlling the
            inliner and other inter-procedural optimizations. Unlike
            earlier releases, GCC 10 will ignore parameters controlling
            optimizations specified at link-time and apply parameters
            specified at compile-time in the same manner as done for
            optimization flags.
     * Profile driven optimization improvements:
          + Profile maintenance during compilation and hot/cold code
            partitioning have been improved.
          + Using [15]-fprofile-values, an instrumented binary can track
            multiple values (up to 4) for e.g. indirect calls and provide
            more precise profile information.

New Languages and Language-Specific Improvements

     * Version 2.6 of the [16]OpenACC specification is now supported in
       the C, C++ and Fortran compilers. See the [17]implementation status
       section on the OpenACC wiki page and the [18]run-time library
       documentation for further information.
     * GCC 10 adds a number of newly implemented [19]OpenMP 5.0 features
       on top of the GCC 9 release such as conditional lastprivate clause,
       scan and loop directives, order(concurrent) and use_device_addr
       clauses support, if clause on simd construct or partial support for
       the declare variant directive, getting closer to full support of
       the OpenMP 5.0 standard.
     * OpenMP and OpenACC now support [20]offloading to AMD Radeon (GCN)
       GPUs; supported are the third-generation Fiji (fiji) and the
       fifth-generation VEGA 10/VEGA 20 (gfx900 or gfx906).

  C family

     * New attributes:
          + The access function and type attribute has been added to
            describe how a function accesses objects passed to it by
            pointer or reference, and to associate such arguments with
            integer arguments denoting the objects' sizes. The attribute
            is used to enable the detection of invalid accesses by
            user-defined functions, such as those diagnosed by
            -Wstringop-overflow.
          + The symver attribute can be used to bind symbols to specific
            version nodes on ELF platforms. This is preferred to using
            inline assembly with GNU as symver directive because the
            latter is not compatible with link-time optimizations.
     * New warnings:
          + [21]-Wstring-compare, enabled by -Wextra, warns about equality
            and inequality expressions between zero and the result of a
            call to either strcmp and strncmp that evaluate to a constant
            as a result of the length of one argument being greater than
            the size of the array pointed to by the other.
          + [22]-Wzero-length-bounds, enabled by -Warray-bounds, warns
            about accesses to elements of zero-length arrays that might
            overlap other members of the same object.
     * Enhancements to existing warnings:
          + [23]-Warray-bounds detects more out-of-bounds accesses to
            member arrays as well as accesses to elements of zero-length
            arrays.
          + [24]-Wformat-overflow makes full use of string length
            information computed by the strlen optimization pass.
          + [25]-Wrestrict detects overlapping accesses to dynamically
            allocated objects.
          + [26]-Wreturn-local-addr diagnoses more instances of return
            statements returning addresses of automatic variables.
          + [27]-Wstringop-overflow detects more out-of-bounds stores to
            member arrays including zero-length arrays, dynamically
            allocated objects and variable length arrays, as well as more
            instances of reads of unterminated character arrays by string
            built-in functions. The warning also detects out-of-bounds
            accesses by calls to user-defined functions declared with the
            new attribute access.
     * Extended characters in identifiers may now be specified directly in
       the input encoding (UTF-8, by default), in addition to the UCN
       syntax (\uNNNN or \UNNNNNNNN) that is already supported:

static const int π = 3;
int get_naïve_pi() {
  return π;
}

  C

     * Several new features from the upcoming C2X revision of the ISO C
       standard are supported with -std=c2x and -std=gnu2x. Some of these
       features are also supported as extensions when compiling for older
       language versions. In addition to the features listed, some
       features previously supported as extensions and now added to the C
       standard are enabled by default in C2X mode and not diagnosed with
       -std=c2x -Wpedantic.
          + The [[]] attribute syntax is supported, as in C++. Existing
            attributes can be used with this syntax in forms such as
            [[gnu::const]]. The standard attributes [[deprecated]],
            [[fallthrough]] and [[maybe_unused]] are supported.
          + UTF-8 character constants using the u8'' syntax are supported.
          + <float.h> defines macros FLT_NORM_MAX, DBL_NORM_MAX and
            LDBL_NORM_MAX.
          + When decimal floating-point arithmetic is supported, <float.h>
            defines macros DEC32_TRUE_MIN, DEC64_TRUE_MIN and
            DEC128_TRUE_MIN, in addition to the macros that were
            previously only defined if __STDC_WANT_DEC_FP__ was defined
            before including <float.h>.
          + In C2X mode, empty parentheses in a function definition give
            that function a type with a prototype for subsequent calls;
            other old-style function definitions are diagnosed by default
            in C2X mode.
          + The strftime format checking supports the %OB and %Ob formats.
          + In C2X mode, -fno-fp-int-builtin-inexact is enabled by
            default.
     * GCC now defaults to -fno-common. As a result, global variable
       accesses are more efficient on various targets. In C, global
       variables with multiple tentative definitions now result in linker
       errors. With -fcommon such definitions are silently merged during
       linking.

  C++

     * Several C++20 features have been implemented:
          + P1668R1, Permitting Unevaluated inline-assembly in constexpr
            Functions
          + P1161R3, Deprecate a[b,c]
          + P0848R3, Conditionally Trivial Special Member Functions
          + P1091R3, Extending structured bindings
          + P1143R2, Adding the constinit keyword
          + P1152R4, Deprecating volatile
          + P0388R4, Permit conversions to arrays of unknown bound
          + P0784R7, constexpr new
          + Concepts, including P0734R0, P0857R0, P1084R2, P1141R2,
            P0848R3, P1616R1, P1452R2
          + P1301R4, [[nodiscard("with reason")]]
          + P1814R0, class template argument deduction for alias templates
          + P1816R0, class template argument deduction for aggregates
          + P0960R3, Parenthesized initialization of aggregates
          + P1331R2, Allow trivial default initialization in constexpr
            contexts
          + P1327R1, Allowing dynamic_cast and polymorphic typeid in
            constexpr contexts
          + P0912R5, Coroutines (requires -fcoroutines)
     * Several C++ Defect Reports have been resolved, e.g.:
          + DR 1560, lvalue-to-rvalue conversion in ?:
          + DR 1813, __is_standard_layout for a class with repeated bases
          + DR 2094, volatile scalars are trivially copyable,
          + DR 2096, constraints on literal unions
          + DR 2413, typename in conversion-function-ids
          + DR 2352, Similar types and reference binding
          + DR 1601, Promotion of enumeration with fixed underlying type
          + DR 330, Qualification conversions and pointers to arrays of
            pointers
          + DR 1307, Overload resolution based on size of array
            initializer-list
          + DR 1710, Missing template keyword in class-or-decltype
     * New warnings:
          + [28]-Wmismatched-tags, disabled by default, warns about
            declarations of structs, classes, and class templates and
            their specializations with a class-key that does not match
            either the definition or the first declaration if no
            definition is provided. The option is provided to ease
            portability to Windows-based compilers.
          + [29]-Wredundant-tags, disabled by default, warns about
            redundant class-key and enum-key in contexts where the key can
            be eliminated without causing an syntactic ambiguity.
     * G++ can now detect modifying constant objects in constexpr
       evaluation (which is undefined behavior).
     * G++ no longer emits bogus -Wsign-conversion warnings with explicit
       casts.
     * Narrowing is now detected in more contexts (e.g., case values).
     * Memory consumption of the compiler has been reduced in constexpr
       evaluation.
     * The noexcept-specifier is now properly treated as a complete-class
       context as per [30][class.mem].
     * The attribute deprecated can now be used on namespaces too.
     * The ABI of passing and returning certain C++ classes by value
       changed on several targets in GCC 10, including [31]AArch64,
       [32]ARM, [33]PowerPC ELFv2, [34]S/390 and [35]Itanium. These
       changes affect classes with a zero-sized subobject (an empty base
       class, or data member with the [[no_unique_address]] attribute)
       where all other non-static data members have the same type (this is
       called a "homogeneous aggregate" in some ABI specifications, or if
       there is only one such member, a "single element"). In -std=c++17
       and -std=c++20 modes, classes with an empty base class were not
       considered to have a single element or to be a homogeneous
       aggregate, and so could be passed differently (in the wrong
       registers or at the wrong stack address). This could make code
       compiled with -std=c++17 and -std=c++14 ABI incompatible. This has
       been corrected and the empty bases are ignored in those ABI
       decisions, so functions compiled with -std=c++14 and -std=c++17 are
       now ABI compatible again. Example: struct empty {}; struct S :
       empty { float f; }; void f(S);. Similarly, in classes containing
       non-static data members with empty class types using the C++20
       [[no_unique_address]] attribute, those members weren't ignored in
       the ABI argument passing decisions as they should be. Both of these
       ABI changes are now diagnosed with -Wpsabi.

    Runtime Library (libstdc++)

     * Improved experimental C++2a support, including:
          + Library concepts in <concepts> and <iterator>.
          + Constrained algorithms in <ranges>, <algorithm>, and <memory>
            (thanks to Patrick Palka).
          + New algorithms shift_left and shift_right (thanks to Patrick
            Palka).
          + std::span (thanks to JeanHeyd Meneide).
          + Three-way comparisons in <compare> and throughout the library.
          + Constexpr support in <algorithm> and elsewhere (thanks to
            Edward Smith-Rowland).
          + <stop_token> and std::jthread (thanks to Thomas Rodgers).
          + std::atomic_ref and std::atomic<floating point>.
          + Integer comparison functions (cmp_equal, cmp_less etc.).
          + std::ssize, std::to_array.
          + std::construct_at, std::destroy, constexpr std::allocator.
          + Mathematical constants in <numbers>.
     * Support for RDSEED in std::random_device.
     * Reduced header dependencies, leading to faster compilation for some
       code.

  Fortran

     * use_device_addr of version 5.0 of the [36]OpenMP specification is
       now supported. Note that otherwise OpenMP 4.5 is partially
       supported in the Fortran compiler; the largest missing item is
       structure element mapping.
     * The default buffer size for I/O using unformatted files has been
       increased to 1048576. The buffer size for can now be set at runtime
       via the environment variables GFORTRAN_FORMATTED_BUFFER_SIZE and
       GFORTRAN_UNFORMATTED_BUFFER_SIZE for formatted and unformatted
       files, respectively.
     * Mismatches between actual and dummy argument lists in a single file
       are now rejected with an error. Use the new option
       -fallow-argument-mismatch to turn these errors into warnings; this
       option is implied with -std=legacy. -Wargument-mismatch has been
       removed.
     * The handling of a BOZ literal constant has been reworked to provide
       better conformance to the Fortran 2008 and 2018 standards. In these
       Fortran standards, a BOZ literal constant is a typeless and
       kindless entity. As a part of the rework, documented and
       undocumented extensions to the Fortran standard now emit errors
       during compilation. Some of these extensions are permitted with the
       -fallow-invalid-boz, where the error is degraded to a warning and
       the code is compiled as with older gfortran.
     * At any optimization level except-Os, gfortran now uses inline
       packing for arguments instead of calling a library routine. If the
       source contains a large number of arguments that need to be
       repacked, code size or time for compilation can become excessive.
       If that is the case, -fno-inline-arg-packing can be used to disable
       inline argument packing.
     * Legacy extensions:
          + For formatted input/output, if the explicit widths after the
            data-edit descriptors I, F and G have been omitted, default
            widths are used.
          + A blank format item at the end of a format specification, i.e.
            nothing following the final comma, is allowed. Use the option
            -fdec-blank-format-item; this option is implied with -fdec.
          + The existing support for AUTOMATIC and STATIC attributes has
            been extended to allow variables with the AUTOMATIC attribute
            to be used in EQUIVALENCE statements. Use -fdec-static; this
            option is implied by -fdec.
          + Allow character literals in assignments and DATA statements
            for numeric (INTEGER, REAL, or COMPLEX) or LOGICAL variables.
            Use the option -fdec-char-conversions; this option is implied
            with -fdec.
          + DEC comparisons, i.e. allow Hollerith constants to be used in
            comparisons with INTEGER, REAL, COMPLEX and CHARACTER
            expressions. Use the option -fdec.
     * Character type names in errors and warnings now include len in
       addition to kind; * is used for assumed length. The kind is omitted
       if it is the default kind. Examples: CHARACTER(12), CHARACTER(6,4).
     * CO_BROADCAST now supports derived type variables including objects
       with allocatable components. In this case, the optional arguments
       STAT= and ERRMSG= are currently ignored.
     * The handling of module and submodule names has been reworked to
       allow the full 63-character length mandated by the standard.
       Previously symbol names were truncated if the combined length of
       module, submodule, and function name exceeded 126 characters. This
       change therefore breaks the ABI, but only for cases where this 126
       character limit was exceeded.

New Targets and Target Specific Improvements

  AArch64 & arm

     * The AArch64 and arm ports now support condition flag output
       constraints in inline assembly, as indicated by the
       __GCC_ASM_FLAG_OUTPUTS__. On arm this feature is only available for
       A32 and T32 targets. Please refer to the documentation for more
       details.

  AArch64

     * There have been several improvements related to the Scalable Vector
       Extension (SVE):
          + The SVE ACLE types and intrinsics are now supported. They can
            be accessed using the header file arm_sve.h.
          + It is now possible to create fixed-length SVE types using the
            arm_sve_vector_bits attribute. For example:
#if __ARM_FEATURE_SVE_BITS==512
typedef svint32_t vec512 __attribute__((arm_sve_vector_bits(512)));
typedef svbool_t pred512 __attribute__((arm_sve_vector_bits(512)));
#endif
          + -mlow-precision-div, -mlow-precision-sqrt and
            -mlow-precision-recip-sqrt now work for SVE.
          + -msve-vector-bits=128 now generates vector-length-specific
            code for little-endian targets. It continues to generate
            vector-length-agnostic code for big-endian targets, just as
            previous releases did for all targets.
          + The vectorizer is now able to use extending loads and
            truncating stores, including gather loads and scatter stores.
          + The vectorizer now compares the cost of vectorizing with SVE
            and vectorizing with Advanced SIMD and tries to pick the best
            one. Previously it would always use SVE if possible.
          + If a vector loop uses Advanced SIMD rather than SVE, the
            vectorizer now considers using SVE to vectorize the left-over
            elements (the “scalar tail” or “epilog”).
          + Besides these specific points, there have been many general
            improvements to the way that the vectorizer uses SVE.
     * The -mbranch-protection=pac-ret option now accepts the optional
       argument +b-key extension to perform return address signing with
       the B-key instead of the A-key.
     * The option -moutline-atomics has been added to aid deployment of
       the Large System Extensions (LSE) on GNU/Linux systems built with a
       baseline architecture targeting Armv8-A. When the option is
       specified code is emitted to detect the presence of LSE
       instructions at runtime and use them for standard atomic
       operations. For more information please refer to the documentation.
     * The Transactional Memory Extension is now supported through ACLE
       intrinsics. It can be enabled through the +tme option extension
       (for example, -march=armv8.5-a+tme).
     * A number of features from Armv8.5-A are now supported through ACLE
       intrinsics. These include:
          + The random number instructions that can be enabled through the
            (already present in GCC 9.1) +rng option extension.
          + Floating-point intrinsics to round to integer instructions
            from Armv8.5-A when targeting -march=armv8.5-a or later.
          + Memory Tagging Extension intrinsics enabled through the
            +memtag option extension.
     * Similarly, the following Armv8.6-A features are now supported
       through ACLE intrinsics:
          + The bfloat16 extension. This extension is enabled
            automatically when Armv8.6-A is selected (such as by
            -march=armv8.6-a). It can also be enabled for Armv8.2-A and
            later using the +bf16 option extension.
          + The Matrix Multiply extension. This extension is split into
            three parts, one for each supported data type:
               o Support for 8-bit integer matrix multiply instructions.
                 This extension is enabled automatically when Armv8.6-A is
                 selected. It can also be enabled for Armv8.2-A and later
                 using the +i8mm option extension.
               o Support for 32-bit floating-point matrix multiply
                 instructions. This extension can be enabled using the
                 +f32mm option extension, which also has the effect of
                 enabling SVE.
               o Support for 64-bit floating-point matrix multiply
                 instructions. This extension can be enabled using the
                 +f64mm option extension, which likewise has the effect of
                 enabling SVE.
     * SVE2 is now supported through ACLE intrinsics and (to a limited
       extent) through autovectorization. It can be enabled through the
       +sve2 option extension (for example, -march=armv8.5-a+sve2).
       Additional extensions can be enabled through +sve2-sm4, +sve2-aes,
       +sve2-sha3 and +sve2-bitperm.
     * Support has been added for the following processors (GCC
       identifiers in parentheses):
          + Arm Cortex-A77 (cortex-a77).
          + Arm Cortex-A76AE (cortex-a76ae).
          + Arm Cortex-A65 (cortex-a65).
          + Arm Cortex-A65AE (cortex-a65ae).
          + Arm Cortex-A34 (cortex-a34).
          + Marvell ThunderX3 (thunderx3t110).
       The GCC identifiers can be used as arguments to the -mcpu or -mtune
       options, for example: -mcpu=cortex-a77 or -mtune=cortex-a65ae or as
       arguments to the equivalent target attributes and pragmas.

  arm

     * Support for the FDPIC ABI has been added. It uses 64-bit function
       descriptors to represent pointers to functions, and enables code
       sharing on MMU-less systems. The corresponding target triple is
       arm-uclinuxfdpiceabi, and the C library is uclibc-ng.
     * Support has been added for the Arm EABI on NetBSD through the
       arm*-*-netbsdelf-*eabi* triplet.
     * The handling of 64-bit integer operations has been significantly
       reworked and improved leading to improved performance and reduced
       stack usage when using 64-bit integral data types. The option
       -mneon-for-64bits is now deprecated and will be removed in a future
       release.
     * Support has been added for the following processors (GCC
       identifiers in parentheses):
          + Arm Cortex-A77 (cortex-a77).
          + Arm Cortex-A76AE (cortex-a76ae).
          + Arm Cortex-M35P (cortex-m35p).
       The GCC identifiers can be used as arguments to the -mcpu or -mtune
       options, for example: -mcpu=cortex-a77 or -mtune=cortex-m35p.
     * Support has been extended for the ACLE [37]data-processing
       intrinsics to include 32-bit SIMD, saturating arithmetic, 16-bit
       multiplication and other related intrinsics aimed at DSP algorithm
       optimization.
     * Support for -mpure-code in Thumb-1 (v6m) has been added: this
       M-profile feature is no longer restricted to targets with MOVT. For
       example, -mcpu=cortex-m0 now supports this option.
     * Support for the Custom Datapath Extension beta ACLE [38]intrinsics
       has been added.

  AMD Radeon (GCN)

     * The code generation and in particular the vectorization support has
       been much improved.

  ARC

     * The interrupt service routine functions save all used registers,
       including extension registers and auxiliary registers used by Zero
       Overhead Loops.
     * Improve code size by using multiple short instructions instead of a
       single long mov or ior instruction when its long immediate constant
       is known.
     * Fix usage of the accumulator register for ARC600.
     * Fix issues with uncached attribute.
     * Remove -mq-class option.
     * Improve 64-bit integer addition and subtraction operations.

  AVR

     * Support for the XMEGA-like devices

     ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804,
     ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808,
     ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209,
     ATmega4808, ATmega4809
       has been added.
     * A new command-line option -nodevicespecs has been added. It allows
       to provide a custom device-specs file by means of

     avr-gcc -nodevicespecs -specs=my-spec-file <options>
       and without the need to provide options -B and -mmcu=. See [39]AVR
       command-line options for details. This feature is also available in
       GCC 9.3+ and GCC 8.4+.
     * New command-line options -mdouble=[32,64] and -mlong-double=[32,64]
       have been added. They allow to choose the size (in bits) of the
       double and long double types, respectively. Whether or not the
       mentioned layouts are available, whether the options act as a
       multilib option, and the default for either option are controlled
       by the new [40]AVR configure options --with-double= and
       --with-long-double=.
     * A new configure option --with-libf7= has been added. It controls to
       which level avr-libgcc provides 64-bit floating point support by
       means of [41]Libf7.
     * A new configure option --with-double-comparison= has been added.
       It's unlikely you need to set this option by hand.

  IA-32/x86-64

     * Support to expand __builtin_roundeven into the appropriate SSE 4.1
       instruction has been added.
     * New ISA extension support for Intel ENQCMD was added to GCC. ENQCMD
       intrinsics are available via the -menqcmd compiler switch.
     * GCC now supports the Intel CPU named Cooperlake through
       -march=cooperlake. The switch enables the AVX512BF16 ISA
       extensions.
     * GCC now supports the Intel CPU named Tigerlake through
       -march=tigerlake. The switch enables the MOVDIRI MOVDIR64B
       AVX512VP2INTERSECT ISA extensions.

  MIPS

     * The mips*-*-linux* targets now mark object files with appropriate
       GNU-stack note, facilitating use of non-executable stack hardening
       on GNU/Linux. The soft-float targets have this feature enabled by
       default, while for hard-float targets it is required for GCC to be
       configured with --with-glibc-version=2.31 against glibc 2.31 or
       later.

  PowerPC / PowerPC64 / RS6000

     * Many vector builtins have been listed as deprecated in the
       [42]64-Bit ELF V2 ABI Specification for quite a number of years.
       The vector builtins listed in Tables A.8 through A.10 are now
       deprecated for GCC 10, and will likely be removed from support in
       GCC 11.

  PRU

     * A new back end targeting TI PRU I/O processors has been contributed
       to GCC.

  RISC-V

     * The riscv*-*-* targets now require GNU binutils version 2.30 or
       later, to support new assembly instructions produced by GCC.

  V850

     * The ABI for V850 nested functions has been changed. Previously the
       V850 port used %r20 for the static chain pointer, now the port uses
       %r19. This corrects a long standing latent bug in the v850 port
       where a call to a nested function would unexpectedly change the
       value in %r20.

Operating Systems

Improvements for plugin authors

     * GCC diagnostics can now have a chain of events associated with
       them, describing a path through the code that triggers the problem.
       These can be printed by the diagnostics subsystem in various ways,
       controlled by the [43]-fdiagnostics-path-format option, or captured
       in JSON form via [44]-fdiagnostics-format=json.
     * GCC diagnostics can now be associated with [45]CWE weakness
       identifiers, which will appear on the standard error stream, and in
       the JSON output from [46]-fdiagnostics-format=json.

Other significant improvements

     * To allow inline expansion of both memcpy and memmove, the existing
       movmem instruction patterns used for non-overlapping memory copies
       have been renamed to cpymem. The movmem name is now used for
       overlapping memory moves, consistent with the library functions
       memcpy and memmove.
     * For many releases, when GCC emits a warning it prints the option
       controlling that warning. As of GCC 10, that option text is now a
       clickable hyperlink for the documentation of that option (assuming
       a [47]sufficiently capable terminal). This behavior can be
       controlled via a new [48]-fdiagnostics-urls option (along with
       various environment variables and heuristics documented with that
       option).

GCC 10.1

   This is the [49]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 10.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).


    For questions related to the use of GCC, please consult these web
    pages and the [50]GCC manuals. If that fails, the
    [51]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [52]gcc@gcc.gnu.org. All of [53]our lists have public
    archives.

   Copyright (C) [54]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [55]maintained by the GCC team. Last modified
   2020-05-07[56].

References

   1. http://gcc.gnu.org/gcc-10/porting_to.html
   2. http://gcc.gnu.org/onlinedocs/index.html#current
   3. http://gcc.gnu.org/gcc-10/changes.html#empty_base
   4. https://www.mpfr.org/
   5. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/cpp/_005f_005fhas_005fbuiltin.html#g_t_005f_005fhas_005fbuiltin
   6. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Optimize-Options.html#index-fno-allocation-dce
   7. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Optimize-Options.html#index-fprofile-partial-training
   8. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Optimize-Options.html#index-fprofile-reproducible
   9. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Optimize-Options.html#index-fprofile-generate
  10. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Optimize-Options.html#index-fprofile-prefix-path
  11. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Static-Analyzer-Options.html
  12. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Optimize-Options.html#index-finline-functions
  13. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/lto-dump.html
  14. https://facebook.github.io/zstd/
  15. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Optimize-Options.html#index-fprofile-values
  16. https://www.openacc.org/
  17. https://gcc.gnu.org/wiki/OpenACC#status-10
  18. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/libgomp/#toc-Enabling-OpenACC-1
  19. https://www.openmp.org/specifications/
  20. https://gcc.gnu.org/wiki/Offloading
  21. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Warning-Options.html#index-Wstring-compare
  22. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Warning-Options.html#index-Wzero-length-bounds
  23. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Warning-Options.html#index-Warray-bounds
  24. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Warning-Options.html#index-Wformat-overflow
  25. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Warning-Options.html#index-Wrestrict
  26. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Warning-Options.html#index-Wreturn-local-addr
  27. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Warning-Options.html#index-Wstringop-overflow
  28. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/C_002b_002b-Dialect-Options.html#index-Wmismatched-tags
  29. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/C_002b_002b-Dialect-Options.html#index-Wredundant-tags
  30. http://eel.is/c++draft/class.mem#def:complete-class_context
  31. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94383
  32. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94711
  33. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94707
  34. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94704
  35. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94706
  36. https://www.openmp.org/specifications/
  37. https://developer.arm.com/docs/101028/0009/data-processing-intrinsics
  38. https://developer.arm.com/docs/101028/0010/custom-datapath-extension
  39. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/AVR-Options.html#index-nodevicespecs
  40. https://gcc.gnu.org/install/configure.html#avr
  41. https://gcc.gnu.org/wiki/avr-gcc#Libf7
  42. https://openpowerfoundation.org/?resource_lib=64-bit-elf-v2-abi-specification-power-architecture
  43. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-path-format
  44. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-format
  45. https://cwe.mitre.org/
  46. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-format
  47. https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
  48. https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-urls
  49. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=10.0
  50. https://gcc.gnu.org/onlinedocs/
  51. mailto:gcc-help@gcc.gnu.org
  52. mailto:gcc@gcc.gnu.org
  53. https://gcc.gnu.org/lists.html
  54. https://www.fsf.org/
  55. https://gcc.gnu.org/about.html
  56. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-9/index.html
                              GCC 9 Release Series

   Mar 12, 2020

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 9.3.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 9.2 relative to previous releases of GCC.

Release History

   GCC 9.3
          Mar 12, 2020 ([2]changes, [3]documentation)

   GCC 9.2
          Aug 12, 2019 ([4]changes, [5]documentation)

   GCC 9.1
          May 3, 2019 ([6]changes, [7]documentation)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [8]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [9]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [10]GCC
   project web site or contact the [11]GCC development mailing list.

   To obtain GCC please use [12]our mirror sites or [13]our version
   control system.


    For questions related to the use of GCC, please consult these web
    pages and the [14]GCC manuals. If that fails, the
    [15]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [16]gcc@gcc.gnu.org. All of [17]our lists have public
    archives.

   Copyright (C) [18]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [19]maintained by the GCC team. Last modified
   2020-03-12[20].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-9/changes.html
   3. http://gcc.gnu.org/onlinedocs/9.3.0/
   4. http://gcc.gnu.org/gcc-9/changes.html
   5. http://gcc.gnu.org/onlinedocs/9.2.0/
   6. http://gcc.gnu.org/gcc-9/changes.html
   7. http://gcc.gnu.org/onlinedocs/9.1.0/
   8. http://gcc.gnu.org/gcc-9/buildstat.html
   9. http://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Contributors.html
  10. http://gcc.gnu.org/index.html
  11. mailto:gcc@gcc.gnu.org
  12. http://gcc.gnu.org/mirrors.html
  13. http://gcc.gnu.org/git.html
  14. https://gcc.gnu.org/onlinedocs/
  15. mailto:gcc-help@gcc.gnu.org
  16. mailto:gcc@gcc.gnu.org
  17. https://gcc.gnu.org/lists.html
  18. https://www.fsf.org/
  19. https://gcc.gnu.org/about.html
  20. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-9/changes.html
                              GCC 9 Release Series
                        Changes, New Features, and Fixes

   This page is a "brief" summary of some of the huge number of
   improvements in GCC 9. You may also want to check out our [1]Porting to
   GCC 9 page and the [2]full GCC documentation.

Caveats

     * On Arm targets (arm*-*-*), [3]a bug in the implementation of the
       procedure call standard (AAPCS) in the GCC 6, 7 and 8 releases has
       been fixed: a structure containing a bit-field based on a 64-bit
       integral type and where no other element in a structure required
       64-bit alignment could be passed incorrectly to functions. This is
       an ABI change. If the option -Wpsabi is enabled (on by default) the
       compiler will emit a diagnostic note for code that might be
       affected.
     * Support for a number of older systems and recently unmaintained or
       untested target ports of GCC has been declared obsolete in GCC 9.
       Unless there is activity to revive them, the next release of GCC
       will have their sources permanently removed.
       The following ports for individual systems on particular
       architectures have been obsoleted:
          + Solaris 10 (*-*-solaris2.10). Details can be found in the
            [4]announcement.
          + Cell Broadband Engine SPU (spu*-*-*). Details can be found in
            the [5]announcement.
     * A change to the C++ std::rotate algorithm in GCC 9.1.0 can cause
       ABI incompatibilities with object files compiled with other
       versions of GCC. If the std::rotate algorithm is called with an
       empty range then it might cause a divide-by-zero error (as a SIGFPE
       signal) and crash. The change has been reverted for GCC 9.2.0 and
       future releases. For more details see [6]Bug 90920. The problem can
       be avoided by recompiling any objects that might call std::rotate
       with an empty range, so that the GCC 9.1.0 definition of
       std::rotate is not used.
     * The automatic template instantiation at link time ([7]-frepo) has
       been deprecated and will be removed in a future release.
     * The --with-default-libstdcxx-abi=gcc4-compatible configure option
       is broken in the 9.1 and 9.2 releases, producing a shared library
       with missing symbols (see [8]Bug 90361). As a workaround, configure
       without that option and build GCC as normal, then edit the
       installed <bits/c++config.h> headers to define the
       _GLIBCXX_USE_CXX11_ABI macro to 0.

General Improvements

   The following GCC command line options have been introduced or
   improved.
     * All command line options that take a byte-size argument accept
       64-bit integers as well as standard SI and IEC suffixes such as kb
       and KiB, MB and MiB, or GB and GiB denoting the corresponding
       multiples of bytes. See [9]Invoking GCC for more.
     * A new option,
       [10]-flive-patching=[inline-only-static|inline-clone], has been
       introduced to provide a safe compilation for live-patching. At the
       same time, provides multiple-level control on the enabled IPA
       optimizations. See the user guide for more details about the
       option.
     * A new option, --completion, has been added to provide more fine
       option completion in a shell. It is intended to be used by
       Bash-completion.
     * GCC's diagnostics now print source code with a left margin showing
       line numbers, configurable with
       [11]-fno-diagnostics-show-line-numbers.
       GCC's diagnostics can also now label regions of the source code to
       show pertinent information, such as the types within an expression.
$ g++ t.cc
t.cc: In function 'int test(const shape&, const shape&)':
t.cc:15:4: error: no match for 'operator+' (operand types are 'boxed_value<doubl
e>' and 'boxed_value<double>')
   14 |   return (width(s1) * height(s1)
      |           ~~~~~~~~~~~~~~~~~~~~~~
      |                     |
      |                     boxed_value<[...]>
   15 |    + width(s2) * height(s2));
      |    ^ ~~~~~~~~~~~~~~~~~~~~~~
      |                |
      |                boxed_value<[...]>

       These labels can be disabled via [12]-fno-diagnostics-show-labels.
     * A new option [13]-fdiagnostics-format=json has been introduced for
       emitting diagnostics in a machine-readable format.
     * The alignment-related options [14]-falign-functions,
       [15]-falign-labels, [16]-falign-loops, and [17]-falign-jumps
       received support for a secondary alignment (e.g.
       -falign-loops=n:m:n2:m2).
     * New pair of profiling options ([18]-fprofile-filter-files and
       [19]-fprofile-exclude-files) has been added. The options help to
       filter which source files are instrumented.
     * AddressSanitizer generates more compact redzones for automatic
       variables. That helps to reduce memory footprint of a sanitized
       binary.
     * Numerous improvements have been made to the output of
       [20]-fopt-info.
       Messages are now prefixed with optimized, missed, or note, rather
       than the old behavior of all being prefixed with note.
       The output from -fopt-info can now contain information on inlining
       decisions:
$ g++ -c inline.cc -O2 -fopt-info-inline-all
inline.cc:24:11: note: Considering inline candidate void foreach(T, T, void (*)(
E)) [with T = char**; E = char*]/2.
inline.cc:24:11: optimized:  Inlining void foreach(T, T, void (*)(E)) [with T =
char**; E = char*]/2 into int main(int, char**)/1.
inline.cc:19:12: missed:   not inlinable: void inline_me(char*)/0 -> int std::pu
ts(const char*)/3, function body not available
inline.cc:13:8: optimized:  Inlined void inline_me(char*)/4 into int main(int, c
har**)/1 which now has time 127.363637 and size 11, net change of +0.
Unit growth for small function inlining: 16->16 (0%)

Inlined 2 calls, eliminated 1 functions


       The output from the vectorizer has been rationalized so that failed
       attempts to vectorize a loop are displayed in the form
    [LOOP-LOCATION]: couldn't vectorize this loop
    [PROBLEM-LOCATION]: because of [REASON]

       rather than an exhaustive log of all decisions made by the
       vectorizer. For example:
$ gcc -c v.c -O3 -fopt-info-all-vec
v.c:7:3: missed: couldn't vectorize loop
v.c:10:7: missed: statement clobbers memory: __asm__ __volatile__("" :  :  : "me
mory");
v.c:3:6: note: vectorized 0 loops in function.
v.c:10:7: missed: statement clobbers memory: __asm__ __volatile__("" :  :  : "me
mory");

       The old behavior can be obtained via a new -internals suboption of
       -fopt-info.
     * A new option, [21]-fsave-optimization-record has been added, which
       writes a SRCFILE.opt-record.json.gz file describing the
       optimization decisions made by GCC. This is similar to the output
       of -fopt-info, but with additional metadata such as the inlining
       chain, and profile information (if available).
     * Inter-procedural propagation of stack alignment can now be
       controlled by [22]-fipa-stack-alignment.
     * Propagation of addressability, readonly and writeonly flags on
       static variables can now be controlled by
       [23]-fipa-reference-addressable.

   The following built-in functions have been introduced.
     * [24]__builtin_expect_with_probability to provide branch prediction
       probability hints to the optimizer.
     * [25]__builtin_has_attribute determines whether a function, type, or
       variable has been declared with some attribute.
     * [26]__builtin_speculation_safe_value can be used to help mitigate
       against unsafe speculative execution.

   The following attributes have been introduced.
     * The [27]copy function attribute has been added. The attribute can
       also be applied to type definitions and to variable declarations.

   A large number of improvements to code generation have been made,
   including but not limited to the following.
     * Switch expansion has been improved by using a different strategy
       (jump table, bit test, decision tree) for a subset of switch cases.
     * A linear function expression defined as a switch statement can be
       transformed by [28]-ftree-switch-conversion. For example:

int
foo (int how)
{
  switch (how) {
    case 2: how = 205; break;
    case 3: how = 305; break;
    case 4: how = 405; break;
    case 5: how = 505; break;
    case 6: how = 605; break;
  }
  return how;
}

       can be transformed into 100 * how + 5 (for values defined in the
       switch statement).
     * Inter-procedural optimization improvements:
          + Inliner defaults was tuned to better suits modern C++
            codebases especially when built with link time optimizations.
            New parameters max-inline-insns-small, max-inline-insns-size,
            uninlined-function-insns, uninlined-function-time,
            uninlined-thunk-insns, and uninlined-thunk-time were added.
          + Hot/cold partitioning is now more precise and aggressive.
          + Improved scalability for very large translation units
            (especially when link-time optimizing large programs).
     * Profile driven optimization improvements:
          + [29]-fprofile-use now enables [30]-fversion-loops-for-strides,
            [31]-floop-interchange, [32]-floop-unroll-and-jam,
            [33]-ftree-loop-distribution.
          + Streaming of counter histograms was removed. This reduces the
            size of profile files. Histogram is computed on the fly with
            link-time optimization. Parameter hot-bb-count-ws-permille was
            reduced from 999 to 990 to account for more precise
            histograms.
     * Link-time optimization improvements:
          + Types are now simplified prior streaming resulting in
            significant reductions of the LTO object files, link-time
            memory use, and improvements of link-time parallelism.
          + Default number of partitions (--param lto-partitions) was
            increased from 32 to 128 enabling effective use of CPUs with
            more than 32 hyperthreads. --param
            lto-max-streaming-parallelism can now be used to control
            number of streaming processes.
          + Warnings on C++ One Decl Rule violations (-Wodr) are now more
            informative and produce fewer redundant results.
       Overall compile time of Firefox 66 and LibreOffice 6.2.3 on an
       8-core machine was reduced by about 5% compared to GCC 8.3, and the
       size of LTO object files by 7%. LTO link-time improves by 11% on an
       8-core machine and scales significantly better for more parallel
       build environments. The serial stage of the link-time optimization
       is 28% faster consuming 20% less memory. The parallel stage now
       scales to up to 128 partitions rather than 32 and reduces memory
       use for every worker by 30%.

   The following improvements to the gcov command-line utility have been
   made.
     * The gcov tool received a new option [34]--use-hotness-colors (-q)
       that can provide perf-like coloring of hot functions.
     * The gcov tool has changed its intermediate format to a new JSON
       format.

New Languages and Language specific improvements

   [35]OpenACC support in C, C++, and Fortran continues to be maintained
   and improved. Most of the OpenACC 2.5 specification is implemented. See
   the [36]implementation status section on the OpenACC wiki page for
   further information.

  C family

     * Version 5.0 of the [37]OpenMP specification is now partially
       supported in the C and C++ compilers. For details which features of
       OpenMP 5.0 are and which are not supported in the GCC 9 release see
       [38]this mail.
     * New extensions:
          + [39]__builtin_convertvector built-in for vector conversions
            has been added.
     * New warnings:
          + [40]-Waddress-of-packed-member, enabled by default, warns
            about an unaligned pointer value from the address of a packed
            member of a struct or union.
     * Enhancements to existing warnings:
          + [41]-Warray-bounds detects more instances of out-of-bounds
            indices.
          + [42]-Wattribute-alias also detects attribute mismatches
            between alias declarations and their targets, in addition to
            mismatches between their types.
          + [43]-Wformat-overflow and [44]-Wformat-truncation have been
            extended to all formatted input/output functions (where
            applicable) and enhanced to detect a subset of instances of
            reading past the end of unterminated constant character arrays
            in %s directives.
          + [45]-Wmissing-attributes detects instances of missing function
            attributes on declarations of aliases and weak references.
          + [46]-Wstringop-truncation also detects a subset of instances
            of reading past the end of unterminated constant character
            arrays,
     * If a macro is used with the wrong argument count, the C and C++
       front ends now show the definition of that macro via a note.
     * The spelling corrector now considers transposed letters, and the
       threshold for similarity has been tightened, to avoid nonsensical
       suggestions.

  C

     * There is now experimental support for -std=c2x, to select support
       for the upcoming C2X revision of the ISO C standard. This standard
       is in the early stages of development and the only feature
       supported in GCC 9 is _Static_assert with a single argument
       (support for _Static_assert with two arguments was added in C11 and
       GCC 4.6). There are also new options -std=gnu2x, for C2X with GNU
       extensions, and -Wc11-c2x-compat, to warn for uses of features
       added in C2X (such warnings are also enabled by use of -Wpedantic
       if not using -std=c2x or -std=gnu2x).
     * New warnings:
          + [47]-Wabsolute-value warns for calls to standard functions
            that compute the absolute value of an argument when a more
            appropriate standard function is available. For example,
            calling abs(3.14) triggers the warning because the appropriate
            function to call to compute the absolute value of a double
            argument is fabs. The option also triggers warnings when the
            argument in a call to such a function has an unsigned type.
            This warning can be suppressed with an explicit type cast and
            it is also enabled by -Wextra.

  C++

     * New warnings:
          + [48]-Wdeprecated-copy, implied by -Wextra, warns about the
            C++11 deprecation of implicitly declared copy constructor and
            assignment operator if one of them is user-provided.
            -Wdeprecated-copy-dtor also warns if the destructor is
            user-provided, as specified in C++11.
          + [49]-Winit-list-lifetime, on by default, warns about uses of
            std::initializer_list that are likely to result in a dangling
            pointer, such as returning or assigning from a temporary list.
          + [50]-Wredundant-move, implied by -Wextra, warns about
            redundant calls to std::move.
          + [51]-Wpessimizing-move, implied by -Wall, warns when a call to
            std::move prevents copy elision.
          + [52]-Wclass-conversion, on by default, warns when a conversion
            function will never be called due to the type it converts to.
     * The C++ front end has experimental support for some of the upcoming
       C++2a draft features with the -std=c++2a or -std=gnu++2a flags,
       including range-based for statements with initializer, default
       constructible and assignable stateless lambdas, lambdas in
       unevaluated contexts, language support for empty data members,
       allowing pack expansion in lambda init-capture, likely and unlikely
       attributes, class types in non-type template parameters, allowing
       virtual function calls in constant expressions, explicit(bool),
       std::is_constant_evaluated, nested inline namespaces, etc. For a
       full list of new features, see [53]the C++ status page.
     * The C++ front end now preserves source locations for literals,
       id-expression, and mem-initializer for longer. For example it is
       now able to pin-point the pertinent locations for bad
       initializations such as these
$ g++ -c bad-inits.cc
bad-inits.cc:10:14: error: cannot convert 'json' to 'int' in initialization
   10 |   { 3, json::object },
      |        ~~~~~~^~~~~~
      |              |
      |              json
bad-inits.cc:14:31: error: initializer-string for array of chars is too long [-f
permissive]
   14 | char buffers[3][5] = { "red", "green", "blue" };
      |                               ^~~~~~~
bad-inits.cc: In constructor 'X::X()':
bad-inits.cc:17:13: error: invalid conversion from 'int' to 'void*' [-fpermissiv
e]
   17 |   X() : one(42), two(42), three(42)
      |             ^~
      |             |
      |             int

       rather than emitting the error at the final closing parenthesis or
       brace.
     * Error-reporting of overload resolution has been special-cased to
       make the case of a single failed candidate easier to read. For
       example:
$ g++ param-type-mismatch.cc
param-type-mismatch.cc: In function 'int test(int, const char*, float)':
param-type-mismatch.cc:8:32: error: cannot convert 'const char*' to 'const char*
*'
    8 |   return foo::member_1 (first, second, third);
      |                                ^~~~~~
      |                                |
      |                                const char*
param-type-mismatch.cc:3:46: note:   initializing argument 2 of 'static int foo:
:member_1(int, const char**, float)'
    3 |   static int member_1 (int one, const char **two, float three);
      |                                 ~~~~~~~~~~~~~^~~

       highlights both the problematic argument, and the parameter that it
       can't be converted to.
     * Diagnostics involving binary operators now use color to distinguish
       the two operands, and label them separately (as per the example of
       source labelling above).
     * Diagnostics involving function calls now highlight the pertinent
       parameter of the declaration in more places.
$ g++ bad-conversion.cc
bad-conversion.cc: In function 'void caller()':
bad-conversion.cc:9:14: error: cannot convert 'bool' to 'void*'
    9 |   callee (0, false, 2);
      |              ^~~~~
      |              |
      |              bool
bad-conversion.cc:3:19: note:   initializing argument 2 of 'void callee(int, voi
d*, int)'
    3 | void callee (int, void *, int)
      |                   ^~~~~~

     * The C++ front end's implementation of [54]-Wformat now shows
       precise locations within string literals, and underlines the
       pertinent arguments at bogus call sites (the C front end has been
       doing this since GCC 7). For example:
$ g++ -c bad-printf.cc -Wall
bad-printf.cc: In function 'void print_field(const char*, float, long int, long
int)':
bad-printf.cc:6:17: warning: field width specifier '*' expects argument of type
'int', but argument 3 has type 'long int' [-Wformat=]
    6 |   printf ("%s: %*ld ", fieldname, column - width, value);
      |                ~^~~               ~~~~~~~~~~~~~~
      |                 |                        |
      |                 int                      long int
bad-printf.cc:6:19: warning: format '%ld' expects argument of type 'long int', b
ut argument 4 has type 'double' [-Wformat=]
    6 |   printf ("%s: %*ld ", fieldname, column - width, value);
      |                ~~~^                               ~~~~~
      |                   |                               |
      |                   long int                        double
      |                %*f

     * The C++ front end has gained new fix-it hints for forgetting the
       return *this; needed by various C++ operators:
$ g++ -c operator.cc
operator.cc: In member function 'boxed_ptr& boxed_ptr::operator=(const boxed_ptr
&)':
operator.cc:7:3: warning: no return statement in function returning non-void [-W
return-type]
    6 |     m_ptr = other.m_ptr;
  +++ |+    return *this;
    7 |   }
      |   ^

       for when the compiler needs a typename:
$ g++ -c template.cc
template.cc:3:3: error: need 'typename' before 'Traits::type' because 'Traits' i
s a dependent scope
    3 |   Traits::type type;
      |   ^~~~~~
      |   typename

       when trying to use an accessor member as if it were a data member:
$ g++ -c fncall.cc
fncall.cc: In function 'void hangman(const mystring&)':
fncall.cc:12:11: error: invalid use of member function 'int mystring::get_length
() const' (did you forget the '()' ?)
   12 |   if (str.get_length > 0)
      |       ~~~~^~~~~~~~~~
      |                     ()

       for C++11's scoped enums:
$ g++ -c enums.cc
enums.cc: In function 'void json::test(const json::value&)':
enums.cc:12:26: error: 'STRING' was not declared in this scope; did you mean 'js
on::kind::STRING'?
   12 |     if (v.get_kind () == STRING)
      |                          ^~~~~~
      |                          json::kind::STRING
enums.cc:3:44: note: 'json::kind::STRING' declared here
    3 |   enum class kind { OBJECT, ARRAY, NUMBER, STRING, TRUE, FALSE, NULL_ };
      |                                            ^~~~~~

       and a tweak to integrate the suggestions about misspelled members
       with that for accessors:
$ g++ -c accessor-fixit.cc
accessor-fixit.cc: In function 'int test(t*)':
accessor-fixit.cc:17:15: error: 'class t' has no member named 'ratio'; did you m
ean 'int t::m_ratio'? (accessible via 'int t::get_ratio() const')
   17 |   return ptr->ratio;
      |               ^~~~~
      |               get_ratio()

       In addition, various diagnostics in the C++ front-end have been
       streamlined by consolidating the suggestion into the initial error,
       rather than emitting a follow-up note:
$ g++ typo.cc
typo.cc:5:13: error: 'BUFSIZE' was not declared in this scope; did you mean 'BUF
_SIZE'?
    5 | uint8_t buf[BUFSIZE];
      |             ^~~~~~~
      |             BUF_SIZE

    Runtime Library (libstdc++)

     * Improved support for C++17, including:
          + The C++17 implementation is no longer experimental.
          + Parallel algorithms and <execution> (requires [55]Thread
            Building Blocks 2018 or newer).
          + <memory_resource>.
          + Using the types and functions in <filesystem> does not require
            linking with -lstdc++fs now.
     * Improved experimental support for C++2a, including:
          + Type traits std::remove_cvref, std::unwrap_reference,
            std::unwrap_decay_ref, std::is_nothrow_convertible, and
            std::type_identity.
          + Headers <bit> and <version>.
          + Uniform container erasure (std::erase_if).
          + contains member of maps and sets.
          + String prefix and suffix checking (starts_with, ends_with).
          + Functions std::midpoint and std::lerp for interpolation.
          + std::bind_front.
          + std::visit<R>.
          + std::assume_aligned.
          + Uses-allocator construction utilities.
          + std::pmr::polymorphic_allocator<std::byte>.
          + Library support for char8_t type.
          + Destroying delete.
          + std::is_constant_evaluated() function.
     * Support for opening file streams with wide character paths on
       Windows
     * Incomplete support for the C++17 Filesystem library and the
       Filesystem TS on Windows.
     * Incomplete, experimental support for the Networking TS.

  D

     * Support for the D programming language has been added to GCC,
       implementing version 2.076 of the language and run-time library.

  Fortran

     * Asynchronous I/O is now fully supported. The program needs to be
       linked against the pthreads library to use it, otherwise the I/O is
       done synchronously. For systems which do not support POSIX
       condition variables, such as AIX, all I/O is still done
       synchronously.
     * The BACK argument for MINLOC and MAXLOC has been implemented.
     * The FINDLOC intrinsic function has been implemented.
     * The IS_CONTIGUOUS intrinsic function has been implemented.
     * Direct access to the real and imaginary parts of a complex variable
       via c%re and c%im has been implemented.
     * Type parameter inquiry via str%len and a%kind has been implemented.
     * C descriptors and the ISO_Fortran_binding.h source file have been
       implemented.
     * The MAX and MIN intrinsics are no longer guaranteed to return any
       particular value in case one of the arguments is a NaN. Note that
       this conforms to the Fortran standard and to what other Fortran
       compilers do. If there is a need to handle that case in some
       specific way, one needs to explicitly check for NaN's before
       calling MAX or MIN, e.g. by using the IEEE_IS_NAN function from the
       intrinsic module IEEE_ARITHMETIC.
     * A new command-line option [56]-fdec-include, set also by the
       [57]-fdec option, has been added to increase compatibility with
       legacy code. With this option, an INCLUDE directive is also parsed
       as a statement, which allows the directive to be spread across
       multiple source lines with line continuations.
     * A new [58]BUILTIN directive, has been added. The purpose of the
       directive is to provide an API between the GCC compiler and the GNU
       C Library which would define vector implementations of math
       routines.

  Go

     * GCC 9 provides a complete implementation of the Go 1.12.2 user
       packages.

libgccjit

     * The libgccjit API gained a new entry point:
       [59]gcc_jit_context_add_driver_option.

New Targets and Target Specific Improvements

  AArch64 & Arm

     * Support has been added for the following processors (GCC
       identifiers in parentheses):
          + Arm Cortex-A76 (cortex-a76).
          + Arm Cortex-A55/Cortex-A76 DynamIQ big.LITTLE
            (cortex-a76.cortex-a55).
          + Arm Neoverse N1 (neoverse-n1).
       The GCC identifiers can be used as arguments to the -mcpu or -mtune
       options, for example: -mcpu=cortex-a76 or
       -mtune=cortex-a76.cortex-a55 or as arguments to the equivalent
       target attributes and pragmas.
     * The Armv8.3-A complex number instructions are now supported via
       intrinsics when the option -march=armv8.3-a or equivalent is
       specified. For the half-precision floating-point variants of these
       instructions use the architecture extension flag +fp16, e.g.
       -march=armv8.3-a+fp16.
       The intrinsics are defined by the ACLE specification.
     * The Armv8.5-A architecture is now supported through the
       -march=armv8.5-a option.
     * The Armv8.5-A architecture also adds some security features that
       are optional to all older architecture versions. These are now
       supported and only affect the assembler.
          + Speculation Barrier instruction through the -march=armv8-a+sb
            option.
          + Execution and Data Prediction Restriction instructions through
            the -march=armv8-a+predres option.
          + Speculative Store Bypass Safe instruction through the
            -march=armv8-a+ssbs option. This does not require a compiler
            option for Arm and thus -march=armv8-a+ssbs is an
            AArch64-specific option.

      AArch64 specific

     * Support has been added for the Arm Neoverse E1 processor
       (-mcpu=neoverse-e1).
     * The AArch64 port now has support for stack clash protection using
       the [60]-fstack-clash-protection option. The probing interval/guard
       size can be set by using --param
       stack-clash-protection-guard-size=12|16. The value of this
       parameter must be in bytes represented as a power of two. The two
       supported values for this parameter are 12 (for a 4KiB size, 2^12)
       and 16 (for a 64KiB size, 2^16). The default value is 16 (64Kb) and
       can be changed at configure time using the flag
       --with-stack-clash-protection-guard-size=12|16.
     * The option -msign-return-address= has been deprecated. This has
       been replaced by the new -mbranch-protection= option. This new
       option can now be used to enable the return address signing as well
       as the new Branch Target Identification feature of Armv8.5-A
       architecture. For more information on the arguments accepted by
       this option, please refer to [61]AArch64-Options.
     * The following optional extensions to Armv8.5-A architecture are now
       supported and only affect the assembler.
          + Random Number Generation instructions through the
            -march=armv8.5-a+rng option.
          + Memory Tagging Extension through the -march=armv8.5-a+memtag
            option.

      Arm specific

     * Support for the deprecated Armv2 and Armv3 architectures and their
       variants has been removed. Their corresponding -march values and
       the -mcpu options that used these architectures have been removed.
     * Support for the Armv5 and Armv5E architectures (which have no known
       implementations) has been removed. Note that Armv5T, Armv5TE and
       Armv5TEJ architectures remain supported.
     * Corrected FPU configurations for Cortex-R7 and Cortex-R8 when using
       their respective -mcpu options.

  AMD GCN

     * A new back end targeting AMD GCN GPUs has been contributed to GCC.
       The implementation is currently limited to compiling
       single-threaded, stand-alone programs. Future versions will add
       support for offloading multi-threaded kernels via OpenMP and
       OpenACC. The following devices are supported (GCC identifiers in
       parentheses):
          + Fiji (fiji).
          + Vega 10 (gfx900).

  ARC

     * LRA is now on by default for the ARC target. This can be controlled
       by -mlra.
     * Add support for frame code-density and branch-and-index
       instructions.

  C-SKY

     * A new back end targeting C-SKY V2 processors has been contributed
       to GCC.

  IA-32/x86-64

     * Support of Intel MPX (Memory Protection Extensions) has been
       removed.
     * New ISA extension support for Intel PTWRITE was added to GCC.
       PTWRITE intrinsics are available via the -mptwrite compiler switch.
     * GCC now supports the Intel CPU named Cascade Lake with AVX512
       extensions through -march=cascadelake. The switch enables the
       following ISA extensions: AVX512F, AVX512VL, AVX512CD, AVX512BW,
       AVX512DQ, AVX512VNNI.

  OpenRISC

     * A new back end targeting OpenRISC processors has been contributed
       to GCC.

  S/390, System z, IBM z Systems

     * Support for the arch13 architecture has been added. When using the
       -march=arch13 option, the compiler will generate code making use of
       the new instructions introduced with the vector enhancement
       facility 2 and the miscellaneous instruction extension facility 2.
       The -mtune=arch13 option enables arch13 specific instruction
       scheduling without making use of new instructions.
     * Builtins for the new vector instructions have been added and can be
       enabled using the -mzvector option.
     * Support for ESA architecture machines g5 and g6 is deprecated since
       GCC 6.1.0 and has been removed now.
     * When compiling with -march=z14 or higher GCC emits alignments hints
       on the vector load/store instructions (8 or 16 byte).
