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 Porting to GCC 10 page and the full GCC documentation.
array_allocator
extensions
have been removed from libstdc++.
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.
-frepo
)
has been removed.
--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.
__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.
-fallocation-dce
removes unneeded pairs of new
and delete
operators.
-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.
-fprofile-reproducible
controls level of reproducibility of profile gathered by
-fprofile-generate
.
This makes it possible to rebuild program
with same outcome which is useful, for example, for distribution packages.
-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.
-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.
lto-dump
has been added. The program can dump various
information about a LTO bytecode object file.
zstd
algorithm. Configure script can automatically detect the zstd
support.
--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.
-fprofile-values
,
an instrumented binary can track multiple
values (up to 4) for e.g. indirect calls and provide more precise
profile information.
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.
fiji
)
and the fifth-generation VEGA 10/VEGA 20 (gfx900
or
gfx906
).
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
.
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.
-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.
-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.
-Warray-bounds
detects more out-of-bounds accesses to member arrays as well as
accesses to elements of zero-length arrays.
-Wformat-overflow
makes full use of string length information computed by
the strlen
optimization pass.
-Wrestrict
detects overlapping accesses to dynamically allocated objects.
-Wreturn-local-addr
diagnoses more instances of return
statements returning
addresses of automatic variables.
-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
.
\uNNNN
or \UNNNNNNNN
) that is already
supported:
static const int π = 3; int get_naïve_pi() { return π; }
-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
.
[[]]
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.u8''
syntax
are supported.<float.h>
defines
macros FLT_NORM_MAX
, DBL_NORM_MAX
and LDBL_NORM_MAX
.<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>
.strftime
format checking supports
the %OB
and %Ob
formats.-fno-fp-int-builtin-inexact
is
enabled by default.-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.
a[b,c]
constinit
keywordvolatile
constexpr new
[[nodiscard("with reason")]]
-fcoroutines
)?:
__is_standard_layout
for a class with repeated
basestypename
in conversion-function-id
sinitializer-list
-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.
-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.
-Wsign-conversion
warnings with explicit
casts.
case
values).
noexcept-specifier
is now properly treated as a
complete-class context as per
[class.mem].
deprecated
can now be used on
namespace
s too.
[[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
.
<concepts>
and
<iterator>
.
<ranges>
,
<algorithm>
, and
<memory>
(thanks to Patrick Palka).
shift_left
and shift_right
(thanks to Patrick Palka).
std::span
(thanks to JeanHeyd Meneide). <compare>
and throughout the library.
<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>
.
cmp_equal
, cmp_less
etc.).
std::ssize
, std::to_array
. std::construct_at
, std::destroy
,
constexpr std::allocator
.
<numbers>
. std::random_device
.use_device_addr
of version 5.0 of the
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.
GFORTRAN_FORMATTED_BUFFER_SIZE
and
GFORTRAN_UNFORMATTED_BUFFER_SIZE
for formatted
and unformatted files, respectively.
-fallow-argument-mismatch
to turn these
errors into warnings; this option is implied
with -std=legacy
. -Wargument-mismatch
has been removed.
-fallow-invalid-boz
, where the error is degraded to a
warning and the code is compiled as with older gfortran.
-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.
I
, F
and G
have been
omitted, default widths are used.
-fdec-blank-format-item
; this option is implied with
-fdec
.
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
.
DATA
statements
for numeric (INTEGER
, REAL
, or
COMPLEX
) or LOGICAL
variables. Use the option
-fdec-char-conversions
; this option is implied with
-fdec
.
INTEGER
, REAL
, COMPLEX
and
CHARACTER
expressions. Use the option -fdec
.
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.
__GCC_ASM_FLAG_OUTPUTS__
.
On arm this feature is only available for A32 and T32 targets.
Please refer to the documentation for more details. arm_sve.h
.
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.
-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.
-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.
+tme
option
extension (for example, -march=armv8.5-a+tme
).
+rng
option
extension.-march=armv8.5-a
or later.+memtag
option extension.-march=armv8.6-a
).
It can also be enabled for Armv8.2-A and later using the
+bf16
option extension.
+i8mm
option extension.
+f32mm
option extension, which also has the effect of enabling SVE.
+f64mm
option extension, which likewise has the effect of enabling SVE.
+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
.
cortex-a77
).cortex-a76ae
).cortex-a65
).cortex-a65ae
).cortex-a34
).thunderx3t110
).-mcpu
or -mtune
options,
for example: -mcpu=cortex-a77
or
-mtune=cortex-a65ae
or as arguments to the equivalent target
attributes and pragmas.
arm-uclinuxfdpiceabi
, and the C library is uclibc-ng.
arm*-*-netbsdelf-*eabi*
triplet.
-mneon-for-64bits
is now
deprecated and will be removed in a future release.cortex-a77
).cortex-a76ae
).cortex-m35p
).-mcpu
or -mtune
options,
for example: -mcpu=cortex-a77
or
-mtune=cortex-m35p
.
-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.mov
or ior
instruction when its
long immediate constant is known.uncached
attribute.-mq-class
option.ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209, ATmega4808, ATmega4809has been added.
-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
AVR
command-line options for details.
This feature is also available in GCC 9.3+ and GCC 8.4+.
-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
AVR configure
options
--with-double=
and --with-long-double=
.
--with-libf7=
has been added.
It controls to which level avr-libgcc provides 64-bit floating point
support by means of
Libf7.
--with-double-comparison=
has been
added. It's unlikely you need to set this option by hand.
__builtin_roundeven
into the appropriate
SSE 4.1 instruction has been added.
-menqcmd
compiler switch.
-march=cooperlake
.
The switch enables the AVX512BF16 ISA extensions.
-march=tigerlake
.
The switch enables the MOVDIRI MOVDIR64B AVX512VP2INTERSECT ISA extensions.
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.
riscv*-*-*
targets now require GNU binutils version 2.30
or later, to support new assembly instructions produced by GCC.
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
.
This is the 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).
Copyright (C) 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 maintained by the GCC team. Last modified 2020-05-07.