付録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 の実行を自動的に検出できるようになりました。
  • プロファイル駆動型の最適化の改善:

    • コンパイル時およびホットコードまたはコールドコードのパーティション設定時のプロファイルのメンテナンスが改善されました。
  • 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 はゼロと strcmpstrncmp への呼び出しの結果と等価性と不等号の式が定数に評価される場合に警告します。これは、ある引数の長さが他の引数によって指定される配列のサイズよりも大きいためです。
    • -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 属性を使用できるようになりました。

ランタイムライブラリー libstdc++

  • 以下の実験的な C++2a サポート機能が改善されました。

    • <concepts> および <iterator> におけるライブラリーの概念
    • <ranges><algorithm><memory> における制約アルゴリズム
    • New algorithms shift_left and shift_right
    • std::span クラステンプレート
    • <compare> とライブラリー全体での 3 方向比較
    • <algorithm> およびその他の場所での constexpr サポート
    • <stop_token> and std::jthread
    • std::atomic_ref and std::atomic<floating point>
    • 整数比較関数 (cmp_equal、cmp _less、その他の関数など)
    • std::ssize and std::to_array
    • std::construct_at, std::destroy, and constexpr 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 オプションを使用します。