デフォルトでは、C/C++test は constexpr 関数にコード インストゥルメンテーションを適用しません。結果として、以下の制限があります。
- デフォルトでは、constexpr 関数に対してコード カバレッジ解析は実行されません。一部のコンパイラ向けに constexpr 関数のカバレッジ収集を有効化する方法については、「constexpr 関数のコード カバレッジを収集する」を参照してください。
- constexpr 関数または constexpr から呼び出されている関数のスタブは利用できません。
- 実行パスに constexpr 関数がある場合、レポートされたスタック トレースが不完全な可能性があります。
- 実行パスに constexpr 関数がある場合、レポートされた実行時エラー検出の違反が不正確な可能性があります。
この制約は、以下のケースにも適用されます。
- 非 constexpr 関数で使用されている constexpr 関数
- 暗黙的に constexpr として扱われる関数。例: C++17 のラムダ関数
- C++20 の consteval 指定子を付けて宣言された関数
C++ constexpr 関数のコード カバレッジを収集する
C/C++test はランタイムに実行された constexpr 関数のコード カバレッジを収集できます。コンパイル時にだけ使用される 'constexpr' 関数に対しては、カバレッジはレポートされません。
注意: 単体テスト ケースから呼び出される constexpr 関数はランタイムに実行されるため、コード カバレッジが収集されます。
constexpr 関数のコード カバレッジを有効化する
constexpr 関数のカバレッジ収集を有効にするには、次の操作を行います。
- テスト コンフィギュレーションを開き、[実行] > [全般] タブに移動します。
- [実行の詳細] で、[インストゥルメント モード] の [編集] ボタンをクリックします。
- [インストゥルメント機能] パネルで [詳細オプション] セクションの [constexpr 関数のカバレッジを有効化] オプションをオンにします。
サポート対象コンパイラ
C++ の 'constexpr' 関数のコード カバレッジ収集は、以下のコンパイラだけでサポートされています。
- C++14 (またはそれ以降) モードの GCC 9.x 以降
- Clang 9.0.x 以降
- Visual C++ 2019 以降
この機能を利用するには、コンパイラが '__builtin_is_constant_evaluated()' ビルトイン関数を提供している必要があります。
コンパイラの使用に関して、次の既知の制限事項があります。
- バージョン 11.x までの GCC では、'operator alignas()' から呼び出された constexpr 関数のサブツリーのカバレッジは利用できません。
- カバレッジ機能を有効化すると constexpr 関数のサイズが大きくなり、 constexpr 関数に関するコンパイラの内部的なサイズ制限に到達する可能性があります。通常、コンパイラ オプションによって制限を調整できます。
- GCC: -fconstexpr-depth, -fconstexpr-ops-limit, -fconstexpr-loop-limit
- Clang: -fconstexpr-depth, -fconstexpr-steps
- Visual C++: /constexpr:depth, /constexpr:steps