암시적 바운드
현재는 명시적인 어노테이션을 피하기 위해 함의된 영역 바운드를 추가합니다. 예를 들어 fn foo<'a, T>(x: &'a T)는 T: 'a를 명시하지 않아도 이것이 성립한다고 자유롭게 가정할 수 있습니다.
암시적 바운드에는 명시적 암시적 바운드와 묵시적 암시적 바운드의 두 가지 종류가 있습니다. 명시적 암시적 바운드는 관련 항목의 fn clauses_of에 추가되는 반면, 암시적 바운드는, 음… 암묵적으로 처리됩니다.
명시적 암시적 바운드
명시적 암시적 바운드는 fn inferred_outlives_of에서 계산됩니다. ADT와 CTA만 명시적 암시적 바운드를 가지며, 이는 fn inferred_outlives_crate 쿼리에서 고정점 알고리즘을 통해 계산됩니다.
크레이트에 있는 모든 ADT의 모든 필드에 대해 fn insert_required_clauses_to_be_wf를 사용합니다. 이 함수는 별도의 구현을 사용하여 필드의 각 구성 요소에 대한 outlives 바운드를 계산합니다.
ADT, 트레이트 객체, 연관 타입의 경우 처음에 요구되는 절은 fn check_explicit_clauses에서 계산됩니다. 이 함수는 fn explicit_clauses_of를 정교화(elaborate)하지 않고 그대로 사용합니다.
영역 절은 fn insert_outlives_clause를 통해 추가됩니다. 이 함수는 outlives 절을 받아 분해한 다음, outlive되는 영역이 영역 매개변수인 경우에만 그 구성 요소를 명시적 절로 추가합니다. 'static 요구 사항은 추가하지 않습니다.
묵시적 암시적 바운드
아직 바인더 안의 함의를 처리할 수 없으므로, impl과 함수의 outlives 요구 사항을 단순히 명시적 술어로 추가할 수는 없습니다.
묵시적 암시적 바운드를 가정으로 사용하기
이 바운드는 영향을 받는 항목 자체의 ParamEnv에는 추가되지 않습니다. 어휘적 영역 해석(lexical region resolution)에서는 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 clauses_of에 포함되지 않으므로, 이들이 실제로 성립하는지 별도로 확인해야 합니다. 일반적으로는 WellFormed 술어를 생성하여 사용된 모든 타입이 적격(well-formed)인지 검사하는 방식으로 이를 처리합니다.
impl을 인스턴스화할 때는 WellFormed 술어를 생성할 수 없습니다. 그렇게 하면 트레이트 솔버 순환(현재는 대개 귀납적인 순환)이 발생하기 때문입니다. 또한 고차 영역의 바인더로부터 얻는 암시적 바운드가 없으므로, 고차 영역이 관련된 제약은 생성하지 않습니다.
이로 인해 여러 건전성 문제가 발생합니다: