This page is a "brief" summary of some of the huge number of improvements in GCC 16.
Note: GCC 16 has not been released yet, so this document is a work-in-progress.
See the GNU Offloading and Multi-Processing Project (GOMP) page for general information.
pinned trait, including ompx_gnu_pinned_mem_alloc,
the CUDA
API (if available) is used; this improves the performance when accessing
this memory on Nvidia GPUs. The newly added ompx_gnu_managed_mem_alloc
allocator and the ompx_gnu_managed_mem_space (both GNU
extensions) allocate device-accessible memory on the host. Such memory is
device accessible even when unified-shared memory is not supported and
might have different page-migration behavior than other memory on systems
even if all host memory is device accessible.declare mapper has been added
for C and C++, only. The uses_allocators clause is now
supported, including the OpenMP 5.2 syntax changes and supporting
semicolons (OpenMP 6.0); for now, only predefined allocators are supported.
iterator modifier in map
clauses and the target update construct has been added for C
and C++.begin declare variant directive for C
and C++ is now supported.omp_target_memset and
omp_target_memset_async API routines have been
added. The no_openmp_constructs assumptions clause can now
be used.omp_default_device
constant has been added to denote the default-device number.-Wno-deprecated-openmp. Additionally, a deprecation warning is
shown when using a deprecated named constant or API routine; this warning
can be silenced using -Wno-deprecated-declarations.
See the GCC OpenACC wiki page for general information.
acc_memcpy_device and acc_memcpy_device_async
API routines have been added for C, C++ and Fortran.wait directive now accepts the
if clause.
acc_attach and
acc_detach now augment their OpenACC 2.6 C/C++ counterparts.
PARAMETER) used as
var in data clauses are now permitted by the specification and
GCC for better compatibility with existing code; however, with GCC,
specifying them in data clauses affects neither compile-time nor runtime
behavior.-std=c++26 -freflection)define_static_{string,object,array}
(PR120783)constexpr
exceptions (PR117785)constexpr
virtual inheritance (PR120777)constexpr
structured bindings and references to constexpr variables (PR117784, only partially,
structured bindings can be constexpr but references to
constexpr automatic variables still not allowed)std::is_integral<__int128> and similar
traits are always true. Previously this was only the case when compiling
with GNU dialects (-std=gnu++17, -std=gnu++14,
etc.) and not with strict dialects (-std=c++17, etc.)
std::generate_canonical
was implemented in all affected modes (since C++11), impacting the observed
output. The previous behavior can be restored by defining
_GLIBCXX_USE_OLD_GENERATE_CANONICAL.
std::variant ABI was updated to make it conforming
and consistent with C++20 and later modes. This impacts the layout
of classes which have a std::variant as the first member
and a base class of the same type as one of the variant's
alternatives, if that type is an empty class and has a non-trivial
destructor:
struct E { ~E(); };
struct Affected : E
{
std::variant<E, int> mem; // previously stored at offset zero,
// uses non-zero offset now
};
The previous behavior can be restored by defining
_GLIBCXX_USE_VARIANT_CXX17_OLD_ABI. This impacts only
C++17 mode.
std::chrono::current_zone() on Windows
(thanks to Björn Schäpers).
<atomic> and
semaphore types in <semaphore>.
Synchronization for <syncstream>.
std::format args and
std::formatter specializations.
std::partial_ordering type in
<compare>.
std::variant with std::jthread,
std::stop_token, and std::stop_source
alternatives.
<ranges>.
std::mdspan, thanks to Luc Grosheintz.ranges::starts_with and ranges::ends_with.
std::inplace_vector.std::copyable_function and std::function_ref.
std::indirect and std::polymorphic.std::owner_equal for shared pointers, thanks to Paul Keir.
<debugging> header and contents.std::stringstream and std::bitset
member functions accepting std::string_view arguments,
thanks to Nathan Myers.
std::dims,
std::constant_wrapper, and std::submdspan
thanks to Luc Grosheintz.
TEAM feature.IMPORT
statement and the new GENERIC statement.sinpi intrinsic).split intrinsic subroutine is now
supported and c_f_pointer now accepts an optional
lower bound as a argument.-fexternal-blas64 option has been added to call
external BLAS routines with 64-bit integer arguments for
MATMUL. This option is only valid for
64-bit systems and when -ffrontend-optimize is
in effect.More information about the language can be found on the Algol 68 website.
More information about the front end can be found on the wiki.
-march=wildcatlake.
Wildcat Lake is based on Panther Lake.
-march=novalake.
Based on ISA extensions enabled on Panther Lake, the switch in addition
enables the APX_F, AVX10.1, AVX10.2 and PREFETCHI ISA extensions.
-march=diamondrapids any longer. CLDEMOTE
is not enabled through the compiler switches -march=alderlake,
-march=arrowlake, -march=arrowlake-s,
-march=gracemont, -march=lunarlake,
-march=meteorlake, -march=pantherlake and
-march=raptorlake any longer. KL and WIDEKL are not enabled
through the compiler switches -march=clearwaterforest and
-march=pantherlake any longer. PREFETCHI is not enabled
through the compiler switch -march=pantherlake any longer.
-mavx10.1-256, -mavx10.1-512, and
-mevex512 were removed together with the warning for the
behavior change on -mavx10.1. -mavx10.1 has
enabled AVX10.1 intrinsics with 512-bit vector support since GCC 15.
-mamx-transpose,
--enable-x86-64-mfentry configure option
enables -mfentry which uses __fentry__,
instead of mcount for profiling on x86-64. This
option is enabled by default for glibc targets.
--enable-tls=DIALECT is now supported to control the
default TLS dialect. The default remains gnu.
The accepted values are gnu and gnu2 (for
TLS descriptors).
gfx942) devices
has been added, including the generic gfx9-4-generic and
mostly compatible gfx950.gfx908,
gfx90a, gfx9-generic,
gfx9-4-generic, gfx10-3-generic, and
gfx11-generic. Multilibs for specific devices are no longer
built by default if a generic arch exists. Note:
_BitInt (N) and
unsigned _BitInt (N)) are supported, now.
_Float16 is supported. All operations
are carried out in software or by float instructions.
-mstack-protector-guard=global. Option
-mstack-protector-guard-record was added, too. The primary
use is for the Linux kernel in order to support run-time patching of the
address loading of the canary.
-m31 is deprecated and will be removed in a
future release.
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 2026-01-28.