Make Clone::clone a lang item

This commit is contained in:
Ben Kimock 2024-07-24 22:43:12 -04:00
parent 92c6c03805
commit f4f57bfccb
4 changed files with 7 additions and 2 deletions

View File

@ -162,6 +162,7 @@ language_item_table! {
StructuralPeq, sym::structural_peq, structural_peq_trait, Target::Trait, GenericRequirement::None; StructuralPeq, sym::structural_peq, structural_peq_trait, Target::Trait, GenericRequirement::None;
Copy, sym::copy, copy_trait, Target::Trait, GenericRequirement::Exact(0); Copy, sym::copy, copy_trait, Target::Trait, GenericRequirement::Exact(0);
Clone, sym::clone, clone_trait, Target::Trait, GenericRequirement::None; Clone, sym::clone, clone_trait, Target::Trait, GenericRequirement::None;
CloneFn, sym::clone_fn, clone_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
Sync, sym::sync, sync_trait, Target::Trait, GenericRequirement::Exact(0); Sync, sym::sync, sync_trait, Target::Trait, GenericRequirement::Exact(0);
DiscriminantKind, sym::discriminant_kind, discriminant_kind_trait, Target::Trait, GenericRequirement::None; DiscriminantKind, sym::discriminant_kind, discriminant_kind_trait, Target::Trait, GenericRequirement::None;
/// The associated item of the `DiscriminantKind` trait. /// The associated item of the `DiscriminantKind` trait.

View File

@ -3,6 +3,7 @@
use crate::simplify::simplify_duplicate_switch_targets; use crate::simplify::simplify_duplicate_switch_targets;
use crate::take_array; use crate::take_array;
use rustc_ast::attr; use rustc_ast::attr;
use rustc_hir::LangItem;
use rustc_middle::bug; use rustc_middle::bug;
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::ty::layout; use rustc_middle::ty::layout;
@ -271,8 +272,7 @@ impl<'tcx> InstSimplifyContext<'tcx, '_> {
return; return;
} }
let trait_def_id = self.tcx.trait_of_item(fn_def_id); if !self.tcx.is_lang_item(fn_def_id, LangItem::CloneFn) {
if trait_def_id.is_none() || trait_def_id != self.tcx.lang_items().clone_trait() {
return; return;
} }

View File

@ -557,6 +557,7 @@ symbols! {
clobber_abi, clobber_abi,
clone, clone,
clone_closures, clone_closures,
clone_fn,
clone_from, clone_from,
closure, closure,
closure_lifetime_binder, closure_lifetime_binder,

View File

@ -160,6 +160,9 @@ pub trait Clone: Sized {
/// ``` /// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[must_use = "cloning is often expensive and is not expected to have side effects"] #[must_use = "cloning is often expensive and is not expected to have side effects"]
// Clone::clone is special because the compiler generates MIR to implement it for some types.
// See InstanceKind::CloneShim.
#[cfg_attr(not(bootstrap), lang = "clone_fn")]
fn clone(&self) -> Self; fn clone(&self) -> Self;
/// Performs copy-assignment from `source`. /// Performs copy-assignment from `source`.