Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

暗黙的に含意される境界

現在、明示的なアノテーションを避けるために、暗黙的に含意されるリージョン境界を追加しています。たとえば、 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 述語を発行できません。そうすると、現在はしばしば帰納的になるトレイトソルバーのサイクルが発生するためです。また、高階ランクのリージョンを含む制約も発行しません。これは、それらのバインダーから得られる暗黙的に含意される境界が不足しているためです。

これにより、複数の不健全性が生じます。

  • サブタイピングを使用することによるもの: #25860
  • 高階トレイト境界に対するスーパートレイトのアップキャストを使用することによるもの: #84591
  • impl を使用するときには射影を正規化できる一方で、その impl をチェックするときには正規化できないことによるもの: #100051