diff options
| author | bors <bors@rust-lang.org> | 2021-09-05 16:14:41 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-09-05 16:14:41 +0000 |
| commit | e2750baf53aaa60db95f10759f6cf9463dc5a6bd (patch) | |
| tree | acc74b141eefeab4f77d1ff6e863f752281d823c /compiler/rustc_target/src | |
| parent | f7c00dc4099961e4b0f04c3278d21316c96172fe (diff) | |
| parent | f53c93cf65c351ca0ef0cfe257a6139d77032ea8 (diff) | |
| download | rust-e2750baf53aaa60db95f10759f6cf9463dc5a6bd.tar.gz rust-e2750baf53aaa60db95f10759f6cf9463dc5a6bd.zip | |
Auto merge of #88499 - eddyb:layout-off, r=nagisa
Provide `layout_of` automatically (given tcx + param_env + error handling). After #88337, there's no longer any uses of `LayoutOf` within `rustc_target` itself, so I realized I could move the trait to `rustc_middle::ty::layout` and redesign it a bit. This is similar to #88338 (and supersedes it), but at no ergonomic loss, since there's no funky `C: LayoutOf<Ty = Ty>` -> `Ty: TyAbiInterface<C>` generic `impl` chain, and each `LayoutOf` still corresponds to one `impl` (of `LayoutOfHelpers`) for the specific context. After this PR, this is what's needed to get `trait LayoutOf` (with the `layout_of` method) implemented on some context type: * `TyCtxt`, via `HasTyCtxt` * `ParamEnv`, via `HasParamEnv` * a way to transform `LayoutError`s into the desired error type * an error type of `!` can be paired with having `cx.layout_of(...)` return `TyAndLayout` *without* `Result<...>` around it, such as used by codegen * this is done through a new `LayoutOfHelpers` trait (and so is specifying the type of `cx.layout_of(...)`) When going through this path (and not bypassing it with a manual `impl` of `LayoutOf`), the end result is that only the error case can be customized, the query itself and the success paths are guaranteed to be uniform. (**EDIT**: just noticed that because of the supertrait relationship, you cannot actually implement `LayoutOf` yourself, the blanket `impl` fully covers all possible context types that could ever implement it) Part of the motivation for this shape of API is that I've been working on querifying `FnAbi::of_*`, and what I want/need to introduce for that looks a lot like the setup in this PR - in particular, it's harder to express the `FnAbi` methods in `rustc_target`, since they're much more tied to `rustc` concepts. r? `@nagisa` cc `@oli-obk` `@bjorn3`
Diffstat (limited to 'compiler/rustc_target/src')
| -rw-r--r-- | compiler/rustc_target/src/abi/mod.rs | 41 |
1 files changed, 0 insertions, 41 deletions
diff --git a/compiler/rustc_target/src/abi/mod.rs b/compiler/rustc_target/src/abi/mod.rs index 820399943f0..b0ecd117dd2 100644 --- a/compiler/rustc_target/src/abi/mod.rs +++ b/compiler/rustc_target/src/abi/mod.rs @@ -13,7 +13,6 @@ use std::str::FromStr; use rustc_index::vec::{Idx, IndexVec}; use rustc_macros::HashStable_Generic; use rustc_serialize::json::{Json, ToJson}; -use rustc_span::Span; pub mod call; @@ -1173,46 +1172,6 @@ impl<'a, Ty> Deref for TyAndLayout<'a, Ty> { } } -/// Trait for context types that can compute layouts of things. -pub trait LayoutOf<'a>: Sized { - type Ty: TyAbiInterface<'a, Self>; - type TyAndLayout: MaybeResult<TyAndLayout<'a, Self::Ty>>; - - fn layout_of(&self, ty: Self::Ty) -> Self::TyAndLayout; - fn spanned_layout_of(&self, ty: Self::Ty, _span: Span) -> Self::TyAndLayout { - self.layout_of(ty) - } -} - -pub trait MaybeResult<T> { - type Error; - - fn from(x: Result<T, Self::Error>) -> Self; - fn to_result(self) -> Result<T, Self::Error>; -} - -impl<T> MaybeResult<T> for T { - type Error = !; - - fn from(Ok(x): Result<T, Self::Error>) -> Self { - x - } - fn to_result(self) -> Result<T, Self::Error> { - Ok(self) - } -} - -impl<T, E> MaybeResult<T> for Result<T, E> { - type Error = E; - - fn from(x: Result<T, Self::Error>) -> Self { - x - } - fn to_result(self) -> Result<T, Self::Error> { - self - } -} - #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum PointerKind { /// Most general case, we know no restrictions to tell LLVM. |
