This page is a "brief" summary of some of the huge number of improvements in GCC 12. You may also want to check out our Porting to GCC 12 page and the full GCC documentation.
struct S { float a; int : 0; float b; }
or struct T { float c; int : 0; }
by value could differ between C and C++. Starting with GCC 12 the C++ front-end no longer removes those bit-fields from the internal representation and per clarified psABI some targets have been changed, so that they either ignore those bit-fields in the argument passing by value decisions in both C and C++, or they always take them into account. x86-64, ARM and AArch64 will always ignore them (so there is a C ABI incompatibility between GCC 11 and earlier with GCC 12 or later), PowerPC64 ELFv2 and S/390 always take them into account (so there is a C++ ABI incompatibility, GCC 4.4 and earlier compatible with GCC 12 or later, incompatible with GCC 4.5 through GCC 11). RISC-V has changed the handling of these already starting with GCC 10. As the ABI requires, MIPS takes them into account handling function return values so there is a C++ ABI incompatibility with GCC 4.5 through 11. For function arguments on MIPS, refer to the MIPS specific entry. GCC 12 on the above targets will report such incompatibilities as warnings or other diagnostics unless -Wno-psabi
is used. std::pair
constructors have been deprecated. These allowed the use of an rvalue and a literal 0
to construct a pair containing a move-only type and a pointer. The nullptr
keyword should be used to initialize the pointer member instead of a literal 0
, as this is portable to other C++ implementations. --enable-libstdcxx-allocator
no longer supports the bitmap
, mt
, and pool
arguments. Those configurations had been broken for some time. --enable-libphobos
is used. Other targets may require a more recent version of GCC to bootstrap. Specifics are documented for affected targets in the Installing GCC manual. omp_lib.h
include file can no longer be compiled with -std=f95
but now requires at least -std=f2003
. Alternatively, use the omp_lib
module, which still supports -std=f95
and is recommended to be used instead in general. cr16
target with the cr16-*-*
configuration has been obsoleted and will be removed in a future release. hppa[12]*-*-hpux10*
and hppa[12]*-*-hpux11*
configurations targeting 32-bit PA-RISC with HP-UX have been obsoleted and will be removed in a future release. m32c*-*-rtems*
configuration has been obsoleted and will be removed in a future release. m32r-*-linux*
, m32rle-*-linux*
, m68k*-*-openbsd*
and vax-*-openbsd*
configurations has been removed. -Ofast
now implies -fno-semantic-interposition
. -O2
which is now equivalent to what would have been -O2 -ftree-vectorize -fvect-cost-model=very-cheap
in the past. Note that the default vectorizer cost model has been changed; it used to behave as if -fvect-cost-model=cheap
had been specified. -fsanitize=shadow-call-stack
. This sanitizer currently only works on AArch64 targets and it requires an environment in which all code has been compiled with -ffixed-r18
. Its primary initial user is the Linux kernel. close
map modifier and the affinity
clause are now supported. In addition, Fortran gained the following features which were available in C and C++ before: declare variant
is now available, depobj
, mutexinoutset
and iterator
can now also be used with the depend
clause, defaultmap
has been updated for OpenMP 5.0, and the loop
directive and combined directives involving the master
directive have been added.masked
and scope
constructs, the nothing
and error
directives, and using primary
with the proc_bind
clause and OMP_PROC_BIND
environment variable, the reproducible
and unconstrained
modifiers to the order
clause, and, for C/C++ only, the align
and allocator
modifiers to the allocate
clause and the atomic
extensions are now available. The OMP_PLACE
environment variable supports the OpenMP 5.1 features. In addition, the OMP_NUM_TEAMS
and OMP_TEAMS_THREAD_LIMIT
environment variables and their associated API routines are now supported as well as the memory-allocation routines added for Fortran and extended for C/C++ in OpenMP 5.1. In Fortran code, strictly structured blocks can be used.--param openacc-kernels=decompose
). -Wopenacc-parallelism
to warn about potentially suboptimal choices related to OpenACC parallelism. -foffload-options=
flag and the pre-existing but now documented -foffload=
flag. -gnat2022
flag to indicate strict Ada 2022 compliance. The old -gnat2020
flag is now deprecated.with Static
aspect and can be used in more contexts.-gnatX
flag is necessary to access these features as they are not considered stable or standard. type Matrix is array (Natural range 0 .. <>, Natural range 0 .. <>) of Integer;
is now valid.subtype String_1 is String (1 .. <>);
. Boundaries from slices will "slide" to the correct lower bound of the subtype.Object.Operand
notation. The following code is now valid V.Add_Element(42);
, with V
being a vector, for example.when
constructs. Keywords return
, goto
and raise
can now use when
in addition to the existing exit when
. The following expression is therefore now valid raise Constraint_Error with "Element is null" when Element = null;
case
statement has been extended to cover records and arrays as well as finer grained casing on scalar types. In the future it is expected to provide more compile time guarantees when accessing discriminated fields. Case exhaustion is supported for pattern matching. An example would be type Sign is (Neg, Zero, Pos); function Multiply (S1, S2 : Sign) return Sign is (case (S1, S2) is when (Neg, Neg) | (Pos, Pos) => Pos, when (Zero, <>) | (<>, Zero) => Zero, when (Neg, Pos) | (Pos, Neg) => Neg);
gnatfind
and gnatxref
, which were already deprecated, have been removed.Pure
functions.__builtin_shufflevector
compatible with the clang language extension was added.unavailable
was added.__builtin_assoc_barrier
, was added. It can be used to inhibit re-association of floating-point expressions.__builtin_dynamic_object_size
compatible with the clang language extension was added.-Wbidi-chars
warns about potentially misleading UTF-8 bidirectional control characters. The default is -Wbidi-chars=unpaired
(PR103026)-Warray-compare
warns about comparisons between two operands of array type (PR97573)-Wattributes
has been extended so that it's possible to use -Wno-attributes=ns::attr
or -Wno-attributes=ns::
to suppress warnings about unknown scoped attributes (in C++11 and C2X). Similarly, #pragma GCC diagnostic ignored_attributes "vendor::attr"
can be used to achieve the same effect (PR101940)-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
. #elifdef
and #elifndef
preprocessing directives are now supported.printf
and scanf
format checking with -Wformat
now supports the %b
format specified by C2X for binary integers, and the %B
format recommended by C2X for printf
. if consteval
(PR100974)auto(x)
: decay-copy in the language (PR103049)elifdef
and elifndef
(PR102616)auto
specifier for pointers and references to arrays (PR100975)void{}
enum
direct-list-initializationauto
specifier for pointers and references to arrays-fimplicit-constexpr
can be used to make inline functions implicitly constexpr (git)-ffold-simple-inlines
can be used to fold calls to certain trivial inline functions (currently std::move
, std::forward
, std::addressof
and std::as_const
). In contrast to inlining such calls, folding means that no intermediate code or debug information will be generated for them; this minimizes the abstraction penalty incurred for using these functions versus using the fundamental operations from which they're defined (e.g. std::move
versus static_cast
). This flag is enabled by default when -fno-inline
is not active.-Wuninitialized
warns about using uninitialized variables in member initializer lists (PR19808) -Wint-in-bool-context
is now disabled when instantiating a template (git)-Wc++11-extensions
, -Wc++14-extensions
, -Wc++17-extensions
, -Wc++20-extensions
, and -Wc++23-extensions
. They are enabled by default and can be used to control existing pedwarns about occurrences of new C++ constructs in code using an old C++ standard dialect.-Wmissing-requires
warns about missing requires
(git)std::is_constant_evaluated
in if
warning was extended to warn in more cases (PR100995)-Waddress
has been enhanced so that it now warns about, for instance, comparing the address of a nonstatic member function to null (PR102103)__cpp_lib_is_pointer_interconvertible
and __cpp_lib_is_layout_compatible
to help the C++ library implement P0466, Layout-compatibility and Pointer-interconvertibility Traits (PR101539)constinit thread_local
variables are optimized better (PR101786)std::hardware_destructive_interference_size
was added, along with the -Winterference-size
warning (git)-fconstexpr-fp-except
flag allows IEC559 floating point exceptions in constant-expressions.std::vector
, std::basic_string
, std::optional
, and std::variant
can be used in constexpr
functions.std::make_shared
for arrays with default initialization, and std::atomic<std::shared_ptr<T>>
.std::optional
.std::expected
std::move_only_function
<spanstream>
std::basic_string::resize_and_overwrite
std::unique_ptr
can be used in constexpr
functions.<stacktrace>
(not built by default, requires linking to an extra library).<stdatomic.h>
std::invoke_r
constexpr std::type_info::operator==
__traits(compiles)
expression can now be used to determine whether a target-specific built-in is available without error during CTFE (PR101127). pragma(inline, true)
are now compiled into every module where they are used from (PR106563). -fcheck=
, enables or disables the code generation of specific run-time contract checks. -fcheckaction=
, controls the run-time behavior on an assert, array bounds check, or final switch contract failure. The default is -fcheckaction=throw
. -fdump-c++-spec=
, dumps all compiled extern(C++)
declarations as C++ code to the given file. The supplementary option -fdump-c++-spec-verbose
turns on emission of comments for ignored declarations in the generated spec. -fextern-std=
, controls which C++ standard extern(C++)
declarations are compiled to be compatible with. The default is -fextern-std=c++17
. -fpreview=
, added to enable upcoming D language features in the compiler. -frevert=
, added to revert D language changes to support older D codebases that need more time to transition. -fsave-mixins=
, saves mixins expanded at compile-time to a file. -Wtemplates
compiler switch has been removed, as it had been superceded by -ftransition=templates
, which more accurately reports on which templates have been instantiated. -ftransition=dip25
and -ftransition=dip1000
compiler switches have been renamed to -fpreview=dip25
and -fpreview=dip1000
. bind(c)
and gaps in the handling for assumed-rank arrays, numerous other bugs have been fixed, and an extensive set of new conformance test cases has been added. OPERATION
as the name of the function to the CO_REDUCE
intrinsic for the pairwise reduction, thus conforming to the Fortran 2018 standard. Previous versions used OPERATOR
which conforms to TS 18508. -mabi=ieeelongdouble
option now selects the IEEE 128-bit floating point format for REAL(KIND=16)
. R16_IBM
and R16_IEEE
have been added to the -fconvert
option, the CONVERT
specifier of the OPEN
statement and the GFORTRAN_CONVERT_UNIT
environment variable. LIBGCCJIT_ABI_16
) gcc_jit_lvalue_set_tls_model
for supporting thread-local variables (LIBGCCJIT_ABI_17
) gcc_jit_lvalue_set_link_section
for setting the link section of global variables, analogous to __attribute__((section(".section")))
(LIBGCCJIT_ABI_18
) LIBGCCJIT_ABI_19
) LIBGCCJIT_ABI_20
) gcc_jit_context_new_bitcast
for reinterpreting the bits of an rvalue as a different type (LIBGCCJIT_ABI_21
) gcc_jit_lvalue_set_register_name
for setting a specific register for a variable (LIBGCCJIT_ABI_22
) gcc_jit_context_set_bool_print_errors_to_stderr
(LIBGCCJIT_ABI_23
) LIBGCCJIT_ABI_24
) -march
option: armv8.7-a
, armv8.8-a
, armv9-a
.cortex-a510
argument to the -mcpu
and -mtune
options. -mcpu
and -mtune
options (GCC identifiers in parentheses). ampere1
).cortex-a710
).cortex-x2
).+ls64
option extension.memcpy
,memmove
and memset
standard functions. These instructions can be generated when compiling with the +mops
option extension.arm_neon.h
header have been significantly reimplemented and generate higher-performing code than previous GCC versions.-mtune=neoverse-512tvb
is added to tune for Arm Neoverse cores that have a total vector bandwidth of 512 bits. Please refer to the documentation for more details.__int128_t
/integer(kind=16)
was added.-fstack-protector-guard=tls
and -mstack-protector-guard-offset=
options. This intended for use in Linux kernel development. Please refer to the documentation for more details.-mavx512fp16
compiler switch. _Float16
type is supported on x86 systems with SSE2 enabled. Without {-mavx512fp16}
, all operations will be emulated in software and float
instructions. -mharden-sls=[none|all|return|indirect-jmp]
. -mindirect-branch-cs-prefix
. -mno-direct-extern-access
command-line option is specified. -march=
and -mtune=
options (GCC identifiers in parentheses). la464
).loongarch64
).-Wno-psabi
is used. -Wno-psabi
is used. -march
flag has been added. The -misa
flag is now considered an alias of the -march
flag.sm_53
, sm_70
, sm_75
and sm_80
has been added. These can be specified using the -march
flag.sm_30
, to fix support for sm_30
boards.-march-map
flag has been added. The -march-map
value will be mapped to an valid -march
flag value. For instance, -march-map=sm_50
maps to -march=sm_35
. This can be used to specify that generated code is to be executed on a board with at least some specific compute capability, without having to know the valid values for the -march
flag.-mptx
flag has been added to specify the PTX ISA version for the generated code; permitted values are 3.1
(matches previous GCC versions), 6.0
, 6.3
, and 7.0
. If not specified, the used version is the minimal version required for -march
but at least 6.0
. mptx-3.1
multilib was added. This allows using older drivers which do not support PTX ISA version 6.0.__PTX_SM__
predefined macro allows code to check the PTX ISA target architecture being targeted by the compiler.__PTX_ISA_VERSION_MAJOR__
and __PTX_ISA_VERSION_MINOR__
predefined macros allows code to check the PTX ISA version being targeted by the compiler.__builtin_get_texasr
, __builtin_get_texasru
, __builtin_get_tfhar
, __builtin_get_tfiar
, __builtin_set_texasr
, __builtin_set_texasru
, __builtin_set_tfhar
, and __builtin_set_tfiar
now behave as documented in all supported configurations. On prior releases, the arguments and return values of these functions were treated as unsigned long long
instead of as unsigned long
, when the options -m32 -mpowerpc64
were in effect. vec_cntlz_lsbb
and vec_cnttz_lsbb
now behave as documented. On prior releases, these built-in functions had incorrect semantics on little-endian targets. __regio_symbol
variable qualifier has been added. It allows easier access in C programs to the __R30
and __R31
CPU I/O registers. -march=
parsing.-mtune=thead-c906
is added to tune for T-HEAD c906 cores.-latomic
should check their ABIs again.-Wanalyzer-use-of-uninitialized-value
warning, similar to -Wuninitialized
and -Wmaybe-uninitialized
, but based on an interprocedural path-sensitive analysis (PR95006). Such warnings are not disabled by the new -ftrivial-auto-var-init
(see below), as the latter is considered a mitigation option.
-Wanalyzer-write-to-const
and -Wanalyzer-write-to-string-literal
will now check for __attribute__ ((access, ....))
on calls to externally-defined functions, and complain about read-only regions pointed to by arguments marked with a write_only
or read_write
attribute (PR104793). -fanalyzer-checker=taint
(in addition to -fanalyzer
), has gained four new taint-based warnings: -Wanalyzer-tainted-allocation-size
for e.g. attacker-controlled malloc
and alloca
, -Wanalyzer-tainted-divisor
for detecting where an attacker can inject a divide-by-zero, -Wanalyzer-tainted-offset
for attacker-controlled pointer offsets, -Wanalyzer-tainted-size
for attacker-controlled values being used as a size parameter to calls to memset
or to functions marked with __attribute__ ((access, ....))
. The existing -Wanalyzer-tainted-array-index
has been reworded to talk about "attacker-controlled" rather than "tainted" values, for consistency with the new warnings.
A new __attribute__ ((tainted_args))
has been added to the C and C++ front ends, usable on functions, and on function pointer callback fields in structs. The analyzer's taint mode will treat all parameters and buffers pointed to by parameters of such functions as being attacker-controlled, such as for annotating system calls in an operating system kernel as being an "attack surface".
__attribute__((const))
: it will treat such functions as returning the same value when given the same inputs (PR104434), and as having no side effects (PR104576). realloc
calls by splitting the execution path into three possible outcomes for the call: NULL
malloc
etc) and stack (via alloca
), though none of the analyzer warnings make use of this yet in GCC 12.-Wuninitialized
is active. For best debugging, use of the new command-line option -ftrivial-auto-var-init=pattern
can be used to fill variables with a repeated 0xFE
pattern, which tends to illuminate many bugs (e.g. pointers receive invalid addresses, sizes and indices are very large). For best production results, the new command-line option -ftrivial-auto-var-init=zero
can be used to fill variables with 0x00
, which tends to provide a safer state for bugs (e.g. pointers are NULL
, strings are NUL
filled, and sizes and indices are 0
). -gctf
enables the generation of CTF. -gbtf
This is the list of problem reports (PRs) from GCC's bug tracking system that are known to be fixed in the 12.1 release. This list might not be complete (that is, it is possible that some PRs that have been fixed are not listed here).
This is the list of problem reports (PRs) from GCC's bug tracking system that are known to be fixed in the 12.2 release. This list might not be complete (that is, it is possible that some PRs that have been fixed are not listed here).
-m[check|no-check]-zero-division
is changed for optimized code. Now -mno-check-zero-division
is the default for all optimization levels but -O0
and -Og
. The old behavior can be obtained by explicitly passing -mcheck-zero-division
to GCC. znver4
core via -march=znver4
. The switch makes GCC consider using 512-bit vectors when auto-vectorizing. This is the list of problem reports (PRs) from GCC's bug tracking system that are known to be fixed in the 12.3 release. This list might not be complete (that is, it is possible that some PRs that have been fixed are not listed here).
This is the list of problem reports (PRs) from GCC's bug tracking system that are known to be fixed in the 12.4 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 2025-01-31.