mirror of https://github.com/rust-lang/rust.git
Move traits::Reveal to traits::types.
This commit is contained in:
parent
369f360159
commit
a2cd0715fd
|
@ -51,7 +51,7 @@ pub use self::object_safety::ObjectSafetyViolation;
|
|||
pub use self::on_unimplemented::{OnUnimplementedDirective, OnUnimplementedNote};
|
||||
pub use self::project::MismatchedProjectionTypes;
|
||||
pub use self::project::{normalize, normalize_projection_type, poly_project_and_unify_type};
|
||||
pub use self::project::{Normalized, ProjectionCache, ProjectionCacheSnapshot, Reveal};
|
||||
pub use self::project::{Normalized, ProjectionCache, ProjectionCacheSnapshot};
|
||||
pub use self::select::{EvaluationCache, SelectionCache, SelectionContext};
|
||||
pub use self::select::{EvaluationResult, IntercrateAmbiguityCause, OverflowError};
|
||||
pub use self::specialize::find_associated_item;
|
||||
|
|
|
@ -19,52 +19,11 @@ use crate::ty::subst::{InternalSubsts, Subst};
|
|||
use crate::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, WithConstness};
|
||||
use rustc_data_structures::snapshot_map::{Snapshot, SnapshotMap};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_macros::HashStable;
|
||||
use rustc_span::symbol::sym;
|
||||
use rustc_span::DUMMY_SP;
|
||||
use syntax::ast::Ident;
|
||||
|
||||
/// Depending on the stage of compilation, we want projection to be
|
||||
/// more or less conservative.
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, HashStable)]
|
||||
pub enum Reveal {
|
||||
/// At type-checking time, we refuse to project any associated
|
||||
/// type that is marked `default`. Non-`default` ("final") types
|
||||
/// are always projected. This is necessary in general for
|
||||
/// soundness of specialization. However, we *could* allow
|
||||
/// projections in fully-monomorphic cases. We choose not to,
|
||||
/// because we prefer for `default type` to force the type
|
||||
/// definition to be treated abstractly by any consumers of the
|
||||
/// impl. Concretely, that means that the following example will
|
||||
/// fail to compile:
|
||||
///
|
||||
/// ```
|
||||
/// trait Assoc {
|
||||
/// type Output;
|
||||
/// }
|
||||
///
|
||||
/// impl<T> Assoc for T {
|
||||
/// default type Output = bool;
|
||||
/// }
|
||||
///
|
||||
/// fn main() {
|
||||
/// let <() as Assoc>::Output = true;
|
||||
/// }
|
||||
UserFacing,
|
||||
|
||||
/// At codegen time, all monomorphic projections will succeed.
|
||||
/// Also, `impl Trait` is normalized to the concrete type,
|
||||
/// which has to be already collected by type-checking.
|
||||
///
|
||||
/// NOTE: as `impl Trait`'s concrete type should *never*
|
||||
/// be observable directly by the user, `Reveal::All`
|
||||
/// should not be used by checks which may expose
|
||||
/// type equality or type contents to the user.
|
||||
/// There are some exceptions, e.g., around OIBITS and
|
||||
/// transmute-checking, which expose some details, but
|
||||
/// not the whole concrete type of the `impl Trait`.
|
||||
All,
|
||||
}
|
||||
pub use rustc::traits::Reveal;
|
||||
|
||||
pub type PolyProjectionObligation<'tcx> = Obligation<'tcx, ty::PolyProjectionPredicate<'tcx>>;
|
||||
|
||||
|
|
|
@ -19,6 +19,49 @@ pub use self::ObligationCauseCode::*;
|
|||
pub use self::SelectionError::*;
|
||||
pub use self::Vtable::*;
|
||||
|
||||
/// Depending on the stage of compilation, we want projection to be
|
||||
/// more or less conservative.
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, HashStable)]
|
||||
pub enum Reveal {
|
||||
/// At type-checking time, we refuse to project any associated
|
||||
/// type that is marked `default`. Non-`default` ("final") types
|
||||
/// are always projected. This is necessary in general for
|
||||
/// soundness of specialization. However, we *could* allow
|
||||
/// projections in fully-monomorphic cases. We choose not to,
|
||||
/// because we prefer for `default type` to force the type
|
||||
/// definition to be treated abstractly by any consumers of the
|
||||
/// impl. Concretely, that means that the following example will
|
||||
/// fail to compile:
|
||||
///
|
||||
/// ```
|
||||
/// trait Assoc {
|
||||
/// type Output;
|
||||
/// }
|
||||
///
|
||||
/// impl<T> Assoc for T {
|
||||
/// default type Output = bool;
|
||||
/// }
|
||||
///
|
||||
/// fn main() {
|
||||
/// let <() as Assoc>::Output = true;
|
||||
/// }
|
||||
/// ```
|
||||
UserFacing,
|
||||
|
||||
/// At codegen time, all monomorphic projections will succeed.
|
||||
/// Also, `impl Trait` is normalized to the concrete type,
|
||||
/// which has to be already collected by type-checking.
|
||||
///
|
||||
/// NOTE: as `impl Trait`'s concrete type should *never*
|
||||
/// be observable directly by the user, `Reveal::All`
|
||||
/// should not be used by checks which may expose
|
||||
/// type equality or type contents to the user.
|
||||
/// There are some exceptions, e.g., around OIBITS and
|
||||
/// transmute-checking, which expose some details, but
|
||||
/// not the whole concrete type of the `impl Trait`.
|
||||
All,
|
||||
}
|
||||
|
||||
/// The reason why we incurred this obligation; used for error reporting.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
||||
pub struct ObligationCause<'tcx> {
|
||||
|
|
Loading…
Reference in New Issue