Add a IsIdentity extension trait for CanonicalUserType
This commit is contained in:
parent
024ca99de5
commit
8f3b4f94ef
3 changed files with 11 additions and 7 deletions
|
@ -26,7 +26,7 @@ use rustc_middle::ty::error::TypeError;
|
||||||
use rustc_middle::ty::fold::TypeFoldable;
|
use rustc_middle::ty::fold::TypeFoldable;
|
||||||
use rustc_middle::ty::visit::{TypeVisitable, TypeVisitableExt};
|
use rustc_middle::ty::visit::{TypeVisitable, TypeVisitableExt};
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, AdtKind, CanonicalUserType, GenericParamDefKind, Ty, TyCtxt, UserType,
|
self, AdtKind, CanonicalUserType, GenericParamDefKind, IsIdentity, Ty, TyCtxt, UserType,
|
||||||
};
|
};
|
||||||
use rustc_middle::ty::{GenericArgKind, GenericArgsRef, UserArgs, UserSelfTy};
|
use rustc_middle::ty::{GenericArgKind, GenericArgsRef, UserArgs, UserSelfTy};
|
||||||
use rustc_session::lint;
|
use rustc_session::lint;
|
||||||
|
@ -208,7 +208,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
debug!("fcx {}", self.tag());
|
debug!("fcx {}", self.tag());
|
||||||
|
|
||||||
// FIXME: is_identity being on `UserType` and not `Canonical<UserType>` is awkward
|
// FIXME: is_identity being on `UserType` and not `Canonical<UserType>` is awkward
|
||||||
if !canonical_user_type_annotation.value.is_identity() {
|
if !canonical_user_type_annotation.is_identity() {
|
||||||
self.typeck_results
|
self.typeck_results
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.user_provided_types_mut()
|
.user_provided_types_mut()
|
||||||
|
|
|
@ -106,8 +106,8 @@ pub use self::sty::{
|
||||||
};
|
};
|
||||||
pub use self::trait_def::TraitDef;
|
pub use self::trait_def::TraitDef;
|
||||||
pub use self::typeck_results::{
|
pub use self::typeck_results::{
|
||||||
CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, TypeckResults,
|
CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
|
||||||
UserType, UserTypeAnnotationIndex,
|
TypeckResults, UserType, UserTypeAnnotationIndex,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub mod _match;
|
pub mod _match;
|
||||||
|
|
|
@ -607,11 +607,15 @@ pub enum UserType<'tcx> {
|
||||||
TypeOf(DefId, UserArgs<'tcx>),
|
TypeOf(DefId, UserArgs<'tcx>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> UserType<'tcx> {
|
pub trait IsIdentity {
|
||||||
|
fn is_identity(&self) -> bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> IsIdentity for CanonicalUserType<'tcx> {
|
||||||
/// Returns `true` if this represents a substitution of the form `[?0, ?1, ?2]`,
|
/// Returns `true` if this represents a substitution of the form `[?0, ?1, ?2]`,
|
||||||
/// i.e., each thing is mapped to a canonical variable with the same index.
|
/// i.e., each thing is mapped to a canonical variable with the same index.
|
||||||
pub fn is_identity(&self) -> bool {
|
fn is_identity(&self) -> bool {
|
||||||
match self {
|
match self.value {
|
||||||
UserType::Ty(_) => false,
|
UserType::Ty(_) => false,
|
||||||
UserType::TypeOf(_, user_args) => {
|
UserType::TypeOf(_, user_args) => {
|
||||||
if user_args.user_self_ty.is_some() {
|
if user_args.user_self_ty.is_some() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue