暗黙的に含意される境界
現在、明示的なアノテーションを避けるために、暗黙的に含意されるリージョン境界を追加しています。たとえば、
fn foo<'a, T>(x: &'a T) では、それを指定しなくても T: 'a が成り立つと自由に仮定できます。
暗黙的に含意される境界には、明示的なものと暗黙的なものの 2 種類があります。明示的に含意される境界は、関連するアイテムの fn predicates_of に追加されますが、暗黙的なものは……まあ……暗黙的に扱われます。
明示的に含意される境界
明示的に含意される境界は、fn inferred_outlives_of で計算されます。ADT と遅延型エイリアスだけが、fn inferred_outlives_crate クエリの不動点アルゴリズムによって計算される、明示的に含意される境界を持ちます。
クレート内のすべての ADT のすべてのフィールドに対して、fn insert_required_predicates_to_be_wf を使用します。この関数は、別個の実装を使用して、フィールドの各構成要素に対する outlives 境界を計算します。
ADT、トレイトオブジェクト、および関連型については、最初に必要となる述語が fn check_explicit_predicates で計算されます。これは単に fn explicit_predicates_of を使用し、それらを詳細化しません。
リージョン述語は fn insert_outlives_predicate によって追加されます。この関数は outlives 述語を受け取り、それを分解し、存続される側のリージョンがリージョンパラメーターである場合にのみ、その構成要素を明示的な述語として追加します。'static 要件は追加しません。
暗黙的に含意される境界
まだバインダー内の含意を扱えないため、impl や関数の outlives 要件を単純に明示的な述語として追加することはできません。
暗黙的に含意される境界を仮定として使用する
これらの境界は、影響を受けるアイテム自身の ParamEnv には追加されません。レキシカルリージョン解決では、fn OutlivesEnvironment::from_normalized_bounds を使用して追加されます。同様に、MIR borrowck 中には
fn UniversalRegionRelationsBuilder::add_implied_bounds を使用して追加します。
MIR borrowck では、関数シグネチャと impl ヘッダーに対して暗黙的に含意される境界を追加します。MIR borrowck の外部では、fn assumed_wf_types クエリによって返される型の outlives 要件を追加します。
暗黙的な境界に対して仮定される outlives 制約は、
fn implied_outlives_bounds クエリを使用して計算されます。これは、
fn wf::obligations から必要な outlives 境界を直接抽出します。
MIR borrowck は、正規化済みの型と未正規化の型の両方について outlives 制約を追加しますが、レキシカルリージョン解決は未正規化の型だけを使用します。
暗黙的に含意される境界を証明する
暗黙的に含意される境界は fn predicates_of に含まれないため、それらが実際に成り立つことを別途確認する必要があります。一般には、WellFormed 述語を発行して、使用されるすべての型が well-formed であることをチェックすることでこれを扱います。
impl をインスタンス化するときには WellFormed 述語を発行できません。そうすると、現在はしばしば帰納的になるトレイトソルバーのサイクルが発生するためです。また、高階ランクのリージョンを含む制約も発行しません。これは、それらのバインダーから得られる暗黙的に含意される境界が不足しているためです。
これにより、複数の不健全性が生じます。