Skip to content

Commit 9d97e80

Browse files
Add Identity trait
1 parent 5919f62 commit 9d97e80

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

compiler/rustc_hir/src/lang_items.rs

+1
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ language_item_table! {
165165
DynMetadata, sym::dyn_metadata, dyn_metadata, Target::Struct, GenericRequirement::None;
166166

167167
Freeze, sym::freeze, freeze_trait, Target::Trait, GenericRequirement::Exact(0);
168+
Identity, sym::identity, identity_trait, Target::Trait, GenericRequirement::Exact(0);
168169

169170
Drop, sym::drop, drop_trait, Target::Trait, GenericRequirement::None;
170171
Destruct, sym::destruct, destruct_trait, Target::Trait, GenericRequirement::None;

compiler/rustc_span/src/symbol.rs

+1
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,7 @@ symbols! {
790790
i64,
791791
i8,
792792
ident,
793+
identity,
793794
identity_future,
794795
if_let,
795796
if_let_guard,

library/core/src/marker.rs

+16
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,22 @@ unsafe impl<T: ?Sized> Freeze for *mut T {}
779779
unsafe impl<T: ?Sized> Freeze for &T {}
780780
unsafe impl<T: ?Sized> Freeze for &mut T {}
781781

782+
/// Compiler-internal trait used to handle more easily trait aliases.
783+
/// They get generated like projections. For example:
784+
/// ```ignore (pseudo-code)
785+
/// type Foo = Bar;
786+
/// // becomes:
787+
/// type Foo = <Bar as Identity>::Identity;
788+
/// ```
789+
pub(crate) trait Identity: Sized {
790+
#[cfg_attr(not(bootstrap), lang = "identity")]
791+
type Identity;
792+
}
793+
794+
impl<T> Identity for T {
795+
type Identity = T;
796+
}
797+
782798
/// Types that can be safely moved after being pinned.
783799
///
784800
/// Rust itself has no notion of immovable types, and considers moves (e.g.,

0 commit comments

Comments
 (0)