GCC 16 has been released

GCC 16 introduces significant upgrades for C++, including experimental C++26 features, alongside performance optimizations for the latest AMD and Intel processor architectures.
This page is a "brief" summary of some of the huge number of improvements in GCC 16. You may also want to check out our Porting to GCC 16 page and the full GCC documentation.
int8_t etc. are now signed char on Solaris for conformance with the C99 standard. However, this is an incompatible change. See the porting notes for more information. -pthread option no longer predefines _REENTRANT on Solaris. See the porting notes for more information. json format for -fdiagnostics-format= has been removed in this release. Users seeking machine-readable diagnostics from GCC should use SARIF. -flto-toplevel-asm-heuristics.
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 -gnatd_V (or -gnatd_W for verbose mode), can be used to debug the compiler. It checks various properties of the produced Ada Semantic Tree and reports detected violations. -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) -fno-diagnostics-show-nesting or -fdiagnostics-plain-output. --compile-std-module that conveniently builds the <bits/stdc++.h> header unit and the std and std.compat modules before compiling any source files explicitly specified on the command line. <bits/stdc++.h> header unit has been built, GCC now transparently translates an #include of any importable standard library header into an import of <bits/stdc++.h>. is_constructible_v and is_invocable_v are improved to further elaborate why the trait is false instead of just reporting expression is_foo_v<...> evaluated to false, thanks to Nathaniel Shead. 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; }; The previous behavior can be restored by defining _GLIBCXX_USE_VARIANT_CXX17_OLD_ABI. This impacts only C++17 mode. std::regex execution has been rewritten to use a heap-based stack instead of the system stack, avoiding stack overflows when matching larger strings. 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. ranges::shift_left and ranges::shift_right. std::allocator_traits::allocate_at_least. std::simd. std::inplace_vector. std::optional<T&>. 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. std::philox_engine, thanks to 1nfocalypse. std::atomic_ref::address(), thanks to Yuao Ma. TEAM feature. IMPORT statement, the REDUCE intrinsic 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. M2WIDESET. This has changed the ABI and may lead to link-time errors with object files generated with a previous GCC version. BinDict has been added to the base libraries. Write and WriteLn are available in the modules: ARRAYOFCHAR, CFileSysOp, CHAR, FileSysOp, String and StringFileSysOp. -fm2-pathname-root= option has been added to improve access to external library modules. 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=znver6. This switch enables the AVX512_BMM, AVX_NE_CONVERT, AVX_IFMA, AVX_VNNI_INT8 and AVX512_FP16 ISA extensions on top of ISA extensions enabled for Zen5. znver4, znver5 or znver6, saving code size and improving performance. -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
Source: Hacker News

















