Rollup merge of #86726 - sexxi-goose:use-diagnostic-item-for-rfc2229-migration, r=nikomatsakis
Use diagnostic items instead of lang items for rfc2229 migrations This PR removes the `Send`, `UnwindSafe` and `RefUnwindSafe` lang items introduced in https://github.com/rust-lang/rust/pull/84730, and uses diagnostic items instead to check for `Send`, `UnwindSafe` and `RefUnwindSafe` traits for RFC2229 migrations. r? ```@nikomatsakis```
This commit is contained in:
commit
d12b16887b
7 changed files with 14 additions and 20 deletions
|
@ -348,7 +348,4 @@ language_item_table! {
|
||||||
Range, sym::Range, range_struct, Target::Struct;
|
Range, sym::Range, range_struct, Target::Struct;
|
||||||
RangeToInclusive, sym::RangeToInclusive, range_to_inclusive_struct, Target::Struct;
|
RangeToInclusive, sym::RangeToInclusive, range_to_inclusive_struct, Target::Struct;
|
||||||
RangeTo, sym::RangeTo, range_to_struct, Target::Struct;
|
RangeTo, sym::RangeTo, range_to_struct, Target::Struct;
|
||||||
Send, sym::send, send_trait, Target::Trait;
|
|
||||||
UnwindSafe, sym::unwind_safe, unwind_safe_trait, Target::Trait;
|
|
||||||
RefUnwindSafe, sym::ref_unwind_safe, ref_unwind_safe_trait, Target::Trait;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,9 +257,6 @@ impl LanguageItemCollector<'tcx> {
|
||||||
| LangItem::Unpin
|
| LangItem::Unpin
|
||||||
| LangItem::Termination
|
| LangItem::Termination
|
||||||
| LangItem::Try
|
| LangItem::Try
|
||||||
| LangItem::Send
|
|
||||||
| LangItem::UnwindSafe
|
|
||||||
| LangItem::RefUnwindSafe
|
|
||||||
=> Some(0),
|
=> Some(0),
|
||||||
|
|
||||||
// Not a trait
|
// Not a trait
|
||||||
|
|
|
@ -947,7 +947,7 @@ symbols! {
|
||||||
receiver,
|
receiver,
|
||||||
recursion_limit,
|
recursion_limit,
|
||||||
reexport_test_harness_main,
|
reexport_test_harness_main,
|
||||||
ref_unwind_safe,
|
ref_unwind_safe_trait,
|
||||||
reference,
|
reference,
|
||||||
reflect,
|
reflect,
|
||||||
reg,
|
reg,
|
||||||
|
@ -1073,7 +1073,6 @@ symbols! {
|
||||||
self_in_typedefs,
|
self_in_typedefs,
|
||||||
self_struct_ctor,
|
self_struct_ctor,
|
||||||
semitransparent,
|
semitransparent,
|
||||||
send,
|
|
||||||
send_trait,
|
send_trait,
|
||||||
shl,
|
shl,
|
||||||
shl_assign,
|
shl_assign,
|
||||||
|
@ -1299,7 +1298,7 @@ symbols! {
|
||||||
unused_qualifications,
|
unused_qualifications,
|
||||||
unwind,
|
unwind,
|
||||||
unwind_attributes,
|
unwind_attributes,
|
||||||
unwind_safe,
|
unwind_safe_trait,
|
||||||
unwrap,
|
unwrap,
|
||||||
unwrap_or,
|
unwrap_or,
|
||||||
use_extern_macros,
|
use_extern_macros,
|
||||||
|
|
|
@ -688,15 +688,17 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Blacklist traits for which it would be nonsensical to suggest borrowing.
|
// List of traits for which it would be nonsensical to suggest borrowing.
|
||||||
// For instance, immutable references are always Copy, so suggesting to
|
// For instance, immutable references are always Copy, so suggesting to
|
||||||
// borrow would always succeed, but it's probably not what the user wanted.
|
// borrow would always succeed, but it's probably not what the user wanted.
|
||||||
let blacklist: Vec<_> =
|
let mut never_suggest_borrow: Vec<_> =
|
||||||
[LangItem::Copy, LangItem::Clone, LangItem::Unpin, LangItem::Sized, LangItem::Send]
|
[LangItem::Copy, LangItem::Clone, LangItem::Unpin, LangItem::Sized]
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|lang_item| self.tcx.lang_items().require(*lang_item).ok())
|
.filter_map(|lang_item| self.tcx.lang_items().require(*lang_item).ok())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
never_suggest_borrow.push(self.tcx.get_diagnostic_item(sym::send_trait).unwrap());
|
||||||
|
|
||||||
let span = obligation.cause.span;
|
let span = obligation.cause.span;
|
||||||
let param_env = obligation.param_env;
|
let param_env = obligation.param_env;
|
||||||
let trait_ref = trait_ref.skip_binder();
|
let trait_ref = trait_ref.skip_binder();
|
||||||
|
@ -798,7 +800,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||||
ty::TraitRef::new(trait_ref.def_id, imm_substs),
|
ty::TraitRef::new(trait_ref.def_id, imm_substs),
|
||||||
trait_ref,
|
trait_ref,
|
||||||
false,
|
false,
|
||||||
&blacklist[..],
|
&never_suggest_borrow[..],
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -806,7 +808,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||||
ty::TraitRef::new(trait_ref.def_id, mut_substs),
|
ty::TraitRef::new(trait_ref.def_id, mut_substs),
|
||||||
trait_ref,
|
trait_ref,
|
||||||
true,
|
true,
|
||||||
&blacklist[..],
|
&never_suggest_borrow[..],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -670,7 +670,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
if self.need_2229_migrations_for_trait(
|
if self.need_2229_migrations_for_trait(
|
||||||
min_captures,
|
min_captures,
|
||||||
var_hir_id,
|
var_hir_id,
|
||||||
tcx.lang_items().send_trait(),
|
tcx.get_diagnostic_item(sym::send_trait),
|
||||||
) {
|
) {
|
||||||
auto_trait_reasons.insert("`Send`");
|
auto_trait_reasons.insert("`Send`");
|
||||||
}
|
}
|
||||||
|
@ -686,7 +686,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
if self.need_2229_migrations_for_trait(
|
if self.need_2229_migrations_for_trait(
|
||||||
min_captures,
|
min_captures,
|
||||||
var_hir_id,
|
var_hir_id,
|
||||||
tcx.lang_items().unwind_safe_trait(),
|
tcx.get_diagnostic_item(sym::unwind_safe_trait),
|
||||||
) {
|
) {
|
||||||
auto_trait_reasons.insert("`UnwindSafe`");
|
auto_trait_reasons.insert("`UnwindSafe`");
|
||||||
}
|
}
|
||||||
|
@ -694,7 +694,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
if self.need_2229_migrations_for_trait(
|
if self.need_2229_migrations_for_trait(
|
||||||
min_captures,
|
min_captures,
|
||||||
var_hir_id,
|
var_hir_id,
|
||||||
tcx.lang_items().ref_unwind_safe_trait(),
|
tcx.get_diagnostic_item(sym::ref_unwind_safe_trait),
|
||||||
) {
|
) {
|
||||||
auto_trait_reasons.insert("`RefUnwindSafe`");
|
auto_trait_reasons.insert("`RefUnwindSafe`");
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,6 @@ use crate::hash::Hasher;
|
||||||
/// [ub]: ../../reference/behavior-considered-undefined.html
|
/// [ub]: ../../reference/behavior-considered-undefined.html
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[cfg_attr(not(test), rustc_diagnostic_item = "send_trait")]
|
#[cfg_attr(not(test), rustc_diagnostic_item = "send_trait")]
|
||||||
#[lang = "send"]
|
|
||||||
#[rustc_on_unimplemented(
|
#[rustc_on_unimplemented(
|
||||||
message = "`{Self}` cannot be sent between threads safely",
|
message = "`{Self}` cannot be sent between threads safely",
|
||||||
label = "`{Self}` cannot be sent between threads safely"
|
label = "`{Self}` cannot be sent between threads safely"
|
||||||
|
|
|
@ -133,7 +133,7 @@ pub fn panic_any<M: 'static + Any + Send>(msg: M) -> ! {
|
||||||
/// [`AssertUnwindSafe`] wrapper struct can be used to force this trait to be
|
/// [`AssertUnwindSafe`] wrapper struct can be used to force this trait to be
|
||||||
/// implemented for any closed over variables passed to `catch_unwind`.
|
/// implemented for any closed over variables passed to `catch_unwind`.
|
||||||
#[stable(feature = "catch_unwind", since = "1.9.0")]
|
#[stable(feature = "catch_unwind", since = "1.9.0")]
|
||||||
#[cfg_attr(not(test), lang = "unwind_safe")]
|
#[cfg_attr(not(test), rustc_diagnostic_item = "unwind_safe_trait")]
|
||||||
#[rustc_on_unimplemented(
|
#[rustc_on_unimplemented(
|
||||||
message = "the type `{Self}` may not be safely transferred across an unwind boundary",
|
message = "the type `{Self}` may not be safely transferred across an unwind boundary",
|
||||||
label = "`{Self}` may not be safely transferred across an unwind boundary"
|
label = "`{Self}` may not be safely transferred across an unwind boundary"
|
||||||
|
@ -149,7 +149,7 @@ pub auto trait UnwindSafe {}
|
||||||
/// This is a "helper marker trait" used to provide impl blocks for the
|
/// This is a "helper marker trait" used to provide impl blocks for the
|
||||||
/// [`UnwindSafe`] trait, for more information see that documentation.
|
/// [`UnwindSafe`] trait, for more information see that documentation.
|
||||||
#[stable(feature = "catch_unwind", since = "1.9.0")]
|
#[stable(feature = "catch_unwind", since = "1.9.0")]
|
||||||
#[cfg_attr(not(test), lang = "ref_unwind_safe")]
|
#[cfg_attr(not(test), rustc_diagnostic_item = "ref_unwind_safe_trait")]
|
||||||
#[rustc_on_unimplemented(
|
#[rustc_on_unimplemented(
|
||||||
message = "the type `{Self}` may contain interior mutability and a reference may not be safely \
|
message = "the type `{Self}` may contain interior mutability and a reference may not be safely \
|
||||||
transferrable across a catch_unwind boundary",
|
transferrable across a catch_unwind boundary",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue