diff options
| author | Bastian Kauschke <bastian_kauschke@hotmail.de> | 2020-07-20 23:18:06 +0200 |
|---|---|---|
| committer | Bastian Kauschke <bastian_kauschke@hotmail.de> | 2020-07-20 23:18:06 +0200 |
| commit | cfcbca6c697895e86a70127b317c24c1750c8f89 (patch) | |
| tree | 630f45649ca9782109cecc2c681f2c37e71a6020 | |
| parent | c71b196f66d110291a67c3bbc0f8fdb11a261f1f (diff) | |
| download | rust-cfcbca6c697895e86a70127b317c24c1750c8f89.tar.gz rust-cfcbca6c697895e86a70127b317c24c1750c8f89.zip | |
update coherence docs
| -rw-r--r-- | src/librustc_trait_selection/traits/coherence.rs | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/librustc_trait_selection/traits/coherence.rs b/src/librustc_trait_selection/traits/coherence.rs index 047552b6aeb..b06cf4411d0 100644 --- a/src/librustc_trait_selection/traits/coherence.rs +++ b/src/librustc_trait_selection/traits/coherence.rs @@ -289,11 +289,11 @@ pub fn orphan_check(tcx: TyCtxt<'_>, impl_def_id: DefId) -> Result<(), OrphanChe /// - but (knowing that `Vec<T>` is non-fundamental, and assuming it's /// not local), `Vec<LocalType>` is bad, because `Vec<->` is between /// the local type and the type parameter. -/// 3. Every type parameter before the local key parameter is fully known in C. -/// - e.g., `impl<T> T: Trait<LocalType>` is bad, because `T` might be -/// an unknown type. -/// - but `impl<T> LocalType: Trait<T>` is OK, because `LocalType` -/// occurs before `T`. +/// 3. Before this local type, no generic type parameter of the impl must +/// be reachable through fundamental types. +/// - e.g. `impl<T> Trait<LocalType> for Vec<T>` is fine, as `Vec` is not fundamental. +/// - while `impl<T> Trait<LocalType for Box<T>` results in an error, as `T` is +/// reachable through the fundamental type `Box`. /// 4. Every type in the local key parameter not known in C, going /// through the parameter's type tree, must appear only as a subtree of /// a type local to C, with only fundamental types between the type @@ -387,8 +387,8 @@ fn orphan_check_trait_ref<'tcx>( ty: Ty<'tcx>, in_crate: InCrate, ) -> Vec<Ty<'tcx>> { - // FIXME(eddyb) figure out if this is redundant with `ty_is_non_local`, - // or maybe if this should be calling `ty_is_non_local_constructor`. + // FIXME: this is currently somewhat overly complicated, + // but fixing this requires a more complicated refactor. if !contained_non_local_types(tcx, ty, in_crate).is_empty() { if let Some(inner_tys) = fundamental_ty_inner_tys(tcx, ty) { return inner_tys |
