minicore テスト補助: core スタブの使用
tests/auxiliary/minicore.rs は、ui/codegen/assembly/mir-opt テストスイート用のテスト補助です。
これは、クロスコンパイルされたターゲット向けにビルドする必要があるものの、
実行する必要がない、または実行したくないテストのために core スタブを提供します。
minicore は core 項目のみを対象としており、明示的に
std や alloc 項目は対象外であることに注意してください。これは、core 項目のほうがより幅広いテストに適用できるためです。
テストでは、//@ add-minicore ディレクティブを指定することで minicore を使用できます。
次に、そのテストに #![feature(no_core)] + #![no_std] + #![no_core] を付け、
extern crate minicore(edition 2015)
または use minicore(edition 2018+)でそのクレートをテストにインポートします。
暗黙的に指定されるコンパイラフラグ
これらのテストは no_std + no_core であるため、//@ add-minicore は
そのテストが -C panic=abort でビルドされることを暗黙的に指定し、かつ必須とします。
アンワインドするパニックはサポートされていません。
アセンブリテストで CFI ディレクティブを保持するため、テストは
-C force-unwind-tables=yes でもビルドされます。
TL;DR: //@ add-minicore は 2 つのコンパイラフラグを暗黙的に指定します。
-C panic=abort-C force-unwind-tables=yes
core スタブをさらに追加する
minicore スタブに core 項目が不足していることに気付いた場合、
それが使用される可能性が高い、または既に複数のテストで必要とされているなら、
テスト補助に追加することを検討してください。
core との同期を保つ
minicore の項目は core に追随して最新の状態に保つ必要があります。
core と minicore の使用時で診断出力の一貫性を保つため、あらゆる diagnostic
属性(例: on_unimplemented)は minicore に正確に複製するべきです。
minicore を使用する codegen テストの例
#![allow(unused)]
fn main() {
//@ add-minicore
//@ revisions: meow bark
//@[meow] compile-flags: --target=x86_64-unknown-linux-gnu
//@[meow] needs-llvm-components: x86
//@[bark] compile-flags: --target=wasm32-unknown-unknown
//@[bark] needs-llvm-components: webassembly
#![crate_type = "lib"]
#![feature(no_core)]
#![no_std]
#![no_core]
extern crate minicore;
use minicore::*;
struct Meow;
impl Copy for Meow {} // ここでの `Copy` は `minicore` によって提供されます
// CHECK-LABEL: meow
#[unsafe(no_mangle)]
fn meow() {}
}