付録A バージョン 10.0 の変更点
以下のセクションでは、Red Hat Developer Toolset 10.0 で導入された互換性の変更点について説明します。
A.1. GCC の変更点
Red Hat Developer Toolset 10.0 には GCC 10.2.1 が同梱されています。
以下の機能は、Red Hat Developer Toolset の以前のリリース以降に追加または変更されています。
一般的な改善
新しい組み込み関数:
-
__has_builtin
ビルトインのプリプロセッサー演算子を使用して、ビルトイン GCC 関数のサポートをクエリーできるようになりました。 -
__builtin_roundeven
関数が、ISO/IEC TS 18661 から対応する関数に追加されました。
-
新しいコマンドラインオプション
-
-fallocation-dce
は、new
およびdelete
オペレーターの不要なペアを削除します。 -
-fprofile-partial-training
はトレーニング実行で対応しているコードパスのサイズのみを最適化するようにコンパイラーに通知します。 -
-fprofile-reproducible
は、-fprofile-generate
によって収集されるプロファイルの再現性レベルを制御します。このオプションを使用すると、同じ結果でプログラムを再ビルドできます。たとえば、ディストリビューションパッケージに便利です。 -
実験的: 新しい
-fanalyzer
オプションでは、新しい静的分析パスおよび関連する警告を有効にします。このパスはコード内のパスを検査し、様々な一般的なエラー (二重解放のバグなど) を検出します。このオプションは、C で記述されたコードにのみ使用できることに注意してください。
-
プロシージャー間の最適化の改善:
- アグリゲート (IPA-SRA) パスのプロシージャー間のスカラー置換は、リンク時に機能するように再実装されました。また、コンピューティングを削除し、未使用の戻り値を返すことができるようになりました。
-
最適化レベル
-O2
で-finline-functions
オプションが有効になりました。このオプションにより、コードサイズが小さくなりました。インライナーヒューリスティックは、-flto
-O2
コンパイル時間に悪影響を与えないようにより迅速に機能するようになりました。 - インライナーヒューリスティックと関数のクローン作成では、値の範囲情報を使用して個別の変換の有効性を予測できるようになりました。
- リンクタイムの最適化中に、C++ 1 定義ルールを使用してタイプベースのエイリアス分析の精度を高めるられるようになりました。
リンクタイム最適化の改善:
-
LTO (Link Time Optimization) の並列フェーズで、
make
ツールのjobserver
の実行を自動的に検出できるようになりました。
-
LTO (Link Time Optimization) の並列フェーズで、
プロファイル駆動型の最適化の改善:
- コンパイル時およびホットコードまたはコールドコードのパーティション設定時のプロファイルのメンテナンスが改善されました。
-
GCC が警告を出力すると、警告を制御するオプションが通知として表示され、特定の警告のドキュメントを確認することができます。この動作を制御するには、
-fdiagnostics-urls
オプションを使用します。
言語固有の改善
-
新規実装された OpenMP 5.0 機能が追加されました。たとえば、
conditional lastprivate
句、scan
およびloop
ディレクティブ、order(concurrent)
およびuse_device_addr
句サポート、simd
でのif
句、declare variant
ディレクティブの部分的なサポート。
以下は、言語に関連する主な変更点です。
C ファミリー
新しい属性:
-
access
関数およびタイプ属性が追加されました。これは、関数がポインターまたは参照によって渡されるオブジェクトにアクセスする方法を説明し、このような引数をオブジェクトのサイズを示す整数引数に関連付ける方法について説明します。また、この属性を使用して、-Wstringop-overflow
オプションで診断されるなど、ユーザー定義による、無効なアクセスの検出を有効にすることも可能です。
-
新しい警告:
-
-Wextra
オプションで有効になっていると、-Wstring-compare
はゼロとstrcmp
やstrncmp
への呼び出しの結果と等価性と不等号の式が定数に評価される場合に警告します。これは、ある引数の長さが他の引数によって指定される配列のサイズよりも大きいためです。 -
-Warray-bounds
オプションで有効にすると、-Wzero-length-bounds
は同じオブジェクトの他のメンバーと重複する可能性があるゼロ長配列の要素へのアクセスについて警告します。
-
既存の警告の機能強化:
-
-Warray-bounds
は、メンバーアレイおよびゼロ長配列の要素への境界外アクセスを検出するようになりました。 -
-Wformat-overflow
は、strlen
最適化パスによって計算された文字列の長さ情報を完全に使用できるようになりました。 -
-Wrestrict
は、動的に割り当てられたオブジェクトへの重複アクセスを検出します。 -
-Wreturn-local-addr
は、自動変数のアドレスを返す戻りステートメントのインスタンスをさらに診断します。 -
-Wstringop-overflow
は、ゼロ長配列、動的に割り当てられたオブジェクト、変数長配列など、メンバーアレイへの範囲外のストアを検出します。また、組み込みの文字列関数により、終了していない文字アレイの読み取りのインスタンスも検出するようになりました。さらに、警告は、新しい属性のアクセスで宣言されたユーザー定義関数への呼び出しによる境界外のアクセスを検出するようになりました。 -
-Warith-conversion
は、-Wconversion
、-Wfloat-conversion
、-Wsign-conversion
の警告を再度有効にします。これらの警告は、プロモーションが原因で算数演算の結果がターゲットタイプに収まらない式に対してデフォルトで無効になっています。ただし、式のオペランドがターゲットタイプに適合するようになりました。
-
C
ISO C 標準の今後の C2X リビジョンの新機能がいくつかサポートされるようになりました。有効にするには、
-std=c2x
および-std=gnu2x
を使用します。以前の C バージョンでコンパイルする場合、これらの機能の一部は拡張としてサポートされます。一部の機能は拡張として以前サポートされていましたが、現在では C 標準に追加されています。これは、C2X モードでデフォルトで有効になっており、-std=c2x
-Wpedantic
で診断されません。-
[[]]
属性構文に対応するようになりました。 - C2X モードでは、関数定義の空の括弧により、後続の呼び出しのプロトタイプでその関数にタイプを指定します。C2X モードでは、デフォルトで他の旧式の関数定義が診断されます。
-
-
GCC はデフォルトで
-fno-common
に設定されます。その結果、グローバル変数へのアクセスはさまざまなターゲットでより効率的になります。ただし、C 言語では、複数の一時的な定義を持つグローバル変数により、リンカーエラーが発生するようになりました。-fcommon
オプションでは、このような定義は、リンク時に警告せずにマージされます。
C++
以下の C++20 機能を実装しています。
- P0734R0、P0857R0、P1084R2、P1141R2、P0848R3、P1616R1、P1452R2 のプロポーザルを含む概念
-
p1668R1:
constexpr
関数で評価されていないインラインアセンブリーを許可します。 -
p1161R3:
a[b,c]
の廃止 - P0848R3: 条件的に簡単な特殊なメンバー関数
- P1091R3: バインド拡張の構造化
-
P1143R2:
constinit
キーワードの追加 -
p1152R4:
volatile
の廃止 - P0388R4: 未知のバインドの配列への変換を許可
-
p0784R7: より多くの
constexpr
コンテナー(constexpr new
) -
p1301R4:
[[nodiscard("with reason")]]
- P1814R0: エイリアステンプレートのクラステンプレート引数のデダクション
- P1816R0: アグリゲートのクラステンプレート引数のデダクション
- P0960R3: アグリゲートの括弧で囲まれた初期化子
-
P1331R2:
constexpr
コンテキストでの簡単なデフォルト初期化の許可 -
P1327R1: 定数式での
dynamic_cast
およびポリモーフィックtypeid
の許可 P0912R5: コルーチン。
-fcoroutines
オプションは、コルーチンのサポートを有効にします。上記のプロポーザルの詳細は、「C++ Standards Support in GCC」を参照してください。
- 複数の C++ 不具合レポートが解決されています。「C++ Defect Report Support in GCC」ページの全体的な不具合レポートのステータスを確認できます。
新しい警告:
-
G++ は、
constexpr
評価内の定数オブジェクトの変更を検出できるようになりました。これは、未定義の動作です。 -
コンパイラーのメモリー消費量 (
constexpr
評価の実行時) が減少しました。 -
noexcept
指定子は完全クラスのコンテキストとして適切に扱われるようになりました。 -
名前空間で
deprecated
属性を使用できるようになりました。
-
G++ は、
ランタイムライブラリー libstdc++
以下の実験的な C++2a サポート機能が改善されました。
-
<concepts>
および<iterator>
におけるライブラリーの概念 -
<ranges>
、<algorithm>
、<memory>
における制約アルゴリズム -
New algorithms
shift_left
andshift_right
-
std::span
クラステンプレート -
<compare>
とライブラリー全体での 3 方向比較 -
<algorithm>
およびその他の場所でのconstexpr
サポート -
<stop_token>
andstd::jthread
-
std::atomic_ref
andstd::atomic<floating point>
-
整数比較関数 (
cmp_equal、cmp
_less
、その他の関数など) -
std::ssize
andstd::to_array
-
std::construct_at
,std::destroy
, andconstexpr
std::allocator
-
<numbers>
での数学定数
-
-
乱数ジェネレーター
std::random_device
が RDSEED に対応するようになりました。
Fortran
-
このコンパイラーは、1 つのファイルの実際の引数リストとダミー引数リスト間の不一致を拒否し、エラーを出力するようになりました。これらのエラーを警告に変換するには、新しい
-fallow-argument-mismatch
オプションを使用します。このオプションはstd=legacy
を伴います。-Wargument-mismatch
オプションが削除されました。 -
バイナリー、8 進、および 16 進数 (BOZ) リテラル定数が改善され、Fortran 2008 および 2018 の規格により適するようになりました。これらの Fortran 規格では、BOZ リテラル定数にはタイプや種類がありません。今回の機能強化により、Fortran 規格に文書化されている拡張、文書化されていない拡張がコンパイル中にエラーを出力するようになりました。
-fallow-invalid-boz
オプションを使用して、これらの拡張機能の一部を有効にすることができます。これにより、エラーが警告になり、以前の GFortran としてコードがコンパイルされます。
ターゲット固有の改善点
アーキテクチャーおよびプロセッサーサポートの変更点は次のとおりです。
AMD64 および Intel 64
-
GCC が Cooper Lake Intel CPU に対応するようになりました。これを有効にするには、
-march=cooperlake
オプションを指定して、AVX512BF16 ISA 拡張を有効にします。 -
GCC が Tiger Lake Intel CPU に対応するようになりました。これを有効にするには、MOVDIRI MOVDIR64B AVX512VP2INTERSECT ISA 拡張機能を有効にする
-march=tigerlake
オプションを使用します。