GCC 16 Release Series — Changes, New Features, and Fixes - GNU Project

# GCC 16 Release Series
Changes, New Features, and Fixes

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.

## Caveats

- ...

## General Improvements

## New Languages and Language specific improvements

### OpenMP

See the GNU Offloading and Multi-Processing Project (GOMP) page for general information.

- OpenMP 5.2: The `begin declare variant` directive for C and C++ is now supported.
- OpenMP 6.0: The `omp_target_memset` and `omp_target_memset_async` API routines have been added.

### OpenACC

See the GCC OpenACC wiki page for general information.

- The `acc_memcpy_device` and `acc_memcpy_device_async` API routines have been added for C, C++ and Fortran.
- OpenACC 3.0: The `wait` directive now accepts the `if` clause.
- OpenACC 3.3: The Fortran API routines `acc_attach` and `acc_detach` now augment their OpenACC 2.6 C/C++ counterparts.
- OpenACC 3.4: In Fortran, named constants (`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.

### C++

#### Runtime Library (libstdc++)

- For targets that support 128-bit integers, `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.)
- Improved experimental support for C++20, including:
  - Working `std::chrono::current_zone()` on Windows (thanks to Björn Schäpers).
- There are several changes to C++20 components which are incompatible with the experimental C++20 support in previous releases. The following C++20 components have ABI changes in GCC 16:
  - Atomic waiting/notifying functions in `<atomic>` and semaphore types in `<semaphore>`. Synchronization for `<syncstream>`.
  - The representation of `std::format` args and `std::formatter` specializations.
  - The representation of the `std::partial_ordering` type in `<compare>`.
  - Semantics of `std::variant` with `std::jthread`, `std::stop_token`, and `std::stop_source` alternatives.
  - Representation of some range adaptors in `<ranges>`.
  . This list is not necessarily complete. As with all experimental support, programs using C++20 components should assume that those components are not compatible between different major releases.
- Improved experimental support for C++23, including:
  - `std::mdspan`, thanks to Luc Grosheintz.
  - `ranges::starts_with` and `ranges::ends_with`.
- Improved experimental support for C++26, including:
  - `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.
  - New `std::stringstream` and `std::bitset` member functions accepting `std::string_view` arguments, thanks to Nathan Myers.
  - Padded mdspan layouts, aligned accessor, and `std::dims`, thanks to Luc Grosheintz.

### Fortran

- Coarray improvements, especially for handling Fortran 2018's `TEAM` feature.
- Fortran 2018: Support the extensions to the `IMPORT` statement and the new `GENERIC` statement.
- The Fortran 2023 additions to the trigonometric functions are now supported (such as the `sinpi` intrinsic).
- Fortran 2023: The `split` intrinsic subroutine is now supported and `c_f_pointer` now accepts an optional lower bound as a argument.
- The `-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.

## New Targets and Target Specific Improvements

### IA-32/x86-64

- The new `--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).

### AMD GPU (GCN)

- Experimental support for AMD Instinct MI300 (`gfx942`) devices has been added, including the generic `gfx9-4-generic` and mostly compatible `gfx950`.
- By default, the following multilibs are now built: `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:
  - When compiling for a specific arch and the multilib only exists for the associated generic arch, GCC's error message suggests the command-line option to do so.
  - Generic architectures require ROCm 6.4.0 or newer.
  - The new default-built set of multilibs now requires the assembler and linker of LLVM 19 or newer.
  - Consult GCC's AMD installation notes and configuration notes for setting the multilibs to be build.

### S/390, System z, IBM z Systems

- Bit-precise integer types (`_BitInt (N)` and `unsigned _BitInt (N)`) are supported, now.
- Global stack protector support has been added and exported via `-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.

## Operating Systems

## Other significant improvements

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-11-28.